cups-2.3.1/000775 000765 000024 00000000000 13574721706 012575 5ustar00mikestaff000000 000000 cups-2.3.1/xcode/000775 000765 000024 00000000000 13574721672 013701 5ustar00mikestaff000000 000000 cups-2.3.1/man/000775 000765 000024 00000000000 13574721672 013352 5ustar00mikestaff000000 000000 cups-2.3.1/packaging/000775 000765 000024 00000000000 13574721706 014521 5ustar00mikestaff000000 000000 cups-2.3.1/berkeley/000775 000765 000024 00000000000 13574721672 014401 5ustar00mikestaff000000 000000 cups-2.3.1/install-sh000775 000765 000024 00000012704 13574721672 014607 0ustar00mikestaff000000 000000 #!/bin/sh # # Install a program, script, or datafile. # # Copyright 2008-2012 by Apple Inc. # # This script is not compatible with BSD (or any other) install program, as it # allows owner and group changes to fail with a warning and makes sure that the # destination directory permissions are as specified - BSD install and the # original X11 install script did not change permissions of existing # directories. It also does not support the transform options since CUPS does # not use them... # # Original script from X11R5 (mit/util/scripts/install.sh) # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # Force umask to 022... umask 022 # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" gzipprog="${GZIPPROG-gzip}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" gzipcp() { # gzipcp from to $gzipprog -9 <"$1" >"$2" } while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue ;; -d) dir_arg=true shift continue ;; -m) chmodcmd="$chmodprog $2" shift shift continue ;; -o) chowncmd="$chownprog $2" shift shift continue ;; -g) chgrpcmd="$chgrpprog $2" shift shift continue ;; -s) stripcmd="$stripprog" shift continue ;; -z) instcmd="gzipcp" shift continue ;; *) if [ x"$src" = x ]; then src="$1" else dst="$1" fi shift continue ;; esac done if [ x"$src" = x ]; then echo "install-sh: No input file specified" exit 1 fi if [ x"$dir_arg" != x ]; then dst="$src" src="" if [ -d "$dst" ]; then instcmd=: else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ ! -f "$src" -a ! -d "$src" ]; then echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ]; then echo "install: No destination specified" exit 1 fi # If destination is a directory, append the input filename. if [ -d "$dst" ]; then dst="$dst/`basename $src`" fi fi ## this sed command emulates the dirname command dstdir="`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`" # Make sure that the destination directory exists. # This part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ]; then $doit $mkdirprog "${pathcomp}"; fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ]; then # Make a directory... $doit $instcmd $dst || exit 1 # Allow chown/chgrp to fail, but log a warning if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst || echo "warning: Unable to change owner of $dst!"; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst || echo "warning: Unable to change group of $dst!"; fi if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst || exit 1; fi else # Install a file... dstfile="`basename $dst`" # Check the destination file - for libraries just use the "-x" option # to strip... case "$dstfile" in *.a | *.dylib | *.sl | *.sl.* | *.so | *.so.*) stripopt="-x" ;; *) stripopt="" ;; esac # Make a temp file name in the proper directory. dsttmp="$dstdir/#inst.$$#" # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp || exit 1 # Update permissions and strip as needed, then move to the final name. # If the chmod, strip, rm, or mv commands fail, remove the installed # file... if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt "$dsttmp" || echo "warning: Unable to strip $dst!"; fi if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp" || echo "warning: Unable to change owner of $dst!"; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp" || echo "warning: Unable to change group of $dst!"; fi trap "rm -f ${dsttmp}" 0 && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; fi && $doit $rmcmd -f "$dstdir/$dstfile" && $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi exit 0 cups-2.3.1/configure.ac000664 000765 000024 00000004322 13574721672 015066 0ustar00mikestaff000000 000000 dnl dnl Configuration script for CUPS. dnl dnl Copyright © 2007-2019 by Apple Inc. dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more dnl information. dnl dnl We need at least autoconf 2.60... AC_PREREQ(2.60) dnl Package name and version... 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) sinclude(config-scripts/cups-directories.m4) sinclude(config-scripts/cups-manpages.m4) sinclude(config-scripts/cups-sharedlibs.m4) sinclude(config-scripts/cups-libtool.m4) sinclude(config-scripts/cups-compiler.m4) sinclude(config-scripts/cups-network.m4) sinclude(config-scripts/cups-poll.m4) sinclude(config-scripts/cups-gssapi.m4) sinclude(config-scripts/cups-threads.m4) sinclude(config-scripts/cups-ssl.m4) sinclude(config-scripts/cups-pam.m4) sinclude(config-scripts/cups-largefile.m4) sinclude(config-scripts/cups-dnssd.m4) sinclude(config-scripts/cups-startup.m4) sinclude(config-scripts/cups-defaults.m4) INSTALL_LANGUAGES="" UNINSTALL_LANGUAGES="" LANGFILES="" if test "x$LANGUAGES" != x; then INSTALL_LANGUAGES="install-languages" UNINSTALL_LANGUAGES="uninstall-languages" for lang in $LANGUAGES; do if test -f doc/$lang/index.html.in; then LANGFILES="$LANGFILES doc/$lang/index.html" fi if test -f templates/$lang/header.tmpl.in; then LANGFILES="$LANGFILES templates/$lang/header.tmpl" fi done elif test "x$CUPS_BUNDLEDIR" != x; then INSTALL_LANGUAGES="install-langbundle" UNINSTALL_LANGUAGES="uninstall-langbundle" fi AC_SUBST(INSTALL_LANGUAGES) AC_SUBST(UNINSTALL_LANGUAGES) AC_OUTPUT(Makedefs conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf cups-config desktop/cups.desktop doc/index.html scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/org.cups.cups-lpdAT.service scheduler/org.cups.cupsd.path scheduler/org.cups.cupsd.service scheduler/org.cups.cupsd.socket templates/header.tmpl packaging/cups.list $LANGFILES) chmod +x cups-config cups-2.3.1/tools/000775 000765 000024 00000000000 13574721672 013737 5ustar00mikestaff000000 000000 cups-2.3.1/monitor/000775 000765 000024 00000000000 13574721672 014266 5ustar00mikestaff000000 000000 cups-2.3.1/locale/000775 000765 000024 00000000000 13574721672 014036 5ustar00mikestaff000000 000000 cups-2.3.1/LICENSE000664 000765 000024 00000026136 13574721672 013614 0ustar00mikestaff000000 000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 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 CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. cups-2.3.1/test/000775 000765 000024 00000000000 13574721672 013556 5ustar00mikestaff000000 000000 cups-2.3.1/DEVELOPING.md000664 000765 000024 00000053670 13574721672 014570 0ustar00mikestaff000000 000000 Developing for CUPS =================== Please see the [Contributing to CUPS](CONTRIBUTING.md) file for information on contributing to the CUPS project. How To Contact The Developers ----------------------------- The CUPS mailing lists are the primary means of asking questions and informally discussing issues and feature requests with the CUPS developers and other experienced CUPS users and developers. The "cups" mailing list is intended for CUPS usage questions and new software announcements while the "cups-devel" mailing list provides a forum for CUPS developers and monitoring new bugs. Interfaces ---------- CUPS interfaces, including the C APIs and command-line arguments, environment variables, configuration files, and output format, are stable across patch versions and are generally backwards-compatible with interfaces used in prior major and minor versions. However, program interfaces such as those used by the scheduler to run filter, port monitor, and backend processes for job processing should only be considered stable from the point of view of a filter, port monitor, or backend. Software that simulates the scheduler in order to run those programs outside of CUPS must necessarily be updated when the corresponding interface is changed in a subsequent CUPS release, otherwise undefined behavior can occur. CUPS C APIs starting with an underscore (`_`) are considered to be private to CUPS and are not subject to the normal guarantees of stability between CUPS releases and must never be used in non-CUPS source code. Similarly, configuration and state files written by CUPS are considered private if a corresponding man page is not provided with the CUPS release. Never rely on undocumented files or formats when developing software for CUPS. Always use a published C API to access data stored in a file to avoid compatibility problems in the future. Build System ------------ The CUPS build system uses GNU autoconf to tailor the library to the local operating system. Project files for the current release of Microsoft Visual Studio are also provided for Microsoft Windows®. To improve portability, makefiles must not make use of features unique to GNU make. See the MAKEFILE GUIDELINES section for a description of the allowed make features and makefile guidelines. Additional GNU build programs such as GNU automake and GNU libtool must not be used. GNU automake produces non-portable makefiles which depend on GNU- specific extensions, and GNU libtool is not portable or reliable enough for CUPS. Version Numbering ----------------- CUPS uses a three-part version number separated by periods to represent the 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. This version numbering scheme is consistent with the [Semantic Versioning](http://semver.org) specification. > Note: > > When we talk about compatibility, we are talking about binary compatibility > for public APIs and output format compatibility for program interfaces. > Changes to configuration file formats or the default behavior of programs > are not generally considered incompatible as the upgrade process can > normally address such changes gracefully. Production releases use the plain version numbers: MAJOR.MINOR.PATCH 1.0.0 ... 1.1.0 ... 1.1.23 ... 2.0.0 ... 2.1.0 2.1.1 2.1.2 2.1.3 The first production release in a MAJOR.MINOR series (MAJOR.MINOR.0) is called a feature release. Feature releases are the only releases that may contain new features. Subsequent production releases in a MAJOR.MINOR series may only contain bug fixes. Beta-test releases are identified by appending the letter B to the major and minor version numbers followed by the beta release number: MAJOR.MINORbNUMBER 2.2b1 Release candidates are identified by appending the letters RC to the major and minor version numbers followed by the release candidate number: MAJOR.MINORrcNUMBER 2.2rc1 Coding Guidelines ----------------- 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 All source files names must be 16 characters or less in length to ensure compatibility with older UNIX filesystems. Source files containing functions have an extension of ".c" for C and ".cxx" for C++ source files. All other "include" files have an extension of ".h". Tabs are set to 8 characters or columns. > Note: > > The ".cxx" extension is used because it is the only common C++ extension > between Linux, macOS, UNIX, and Windows. The top of each source file contains a header giving the purpose or nature of the source file and the copyright and licensing notice: /* * Description of file contents. * * Copyright 2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ ### Header Files All public header files must include the "versioning.h" header file, or a header that does so. Function declarations are then "decorated" with the correct `_CUPS_API_major_minor` macro to define its availability based on the build environment, for example: extern int cupsDoThis(int foo, int bar) _CUPS_API_2_2; Private API header files must be named with the suffix "-private", for example the "cups.h" header file defines all of the public CUPS APIs while the "cups-private.h" header file defines all of the private CUPS APIs as well. Typically a private API header file will include the corresponding public API header file. ### Comments All source code utilizes block comments within functions to describe the operations being performed by a group of statements; avoid putting a comment per line unless absolutely necessary, and then consider refactoring the code so that it is not necessary. C source files use the block comment format ("/* comment */") since many vendor C compilers still do not support C99/C++ comments ("// comment"): /* * Clear the state array before we begin... */ for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++) array[i] = CUPS_STATE_IDLE; /* * Wait for state changes on another thread... */ do { for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++) if (array[i] != CUPS_STATE_IDLE) break; if (i == (sizeof(array) / sizeof(array[0]))) sleep(1); } while (i == (sizeof(array) / sizeof(array[0]))); ### Indentation All code blocks enclosed by brackets begin with the opening brace on a new line. The code then follows starting on a new line after the brace and is indented 2 spaces. The closing brace is then placed on a new line following the code at the original indentation: { int i; /* Looping var */ /* * Process foobar values from 0 to 999... */ for (i = 0; i < 1000; i ++) { do_this(i); do_that(i); } } Single-line statements following "do", "else", "for", "if", and "while" are indented 2 spaces as well. Blocks of code in a "switch" block are indented 4 spaces after each "case" and "default" case: switch (array[i]) { case CUPS_STATE_IDLE : do_this(i); do_that(i); break; default : do_nothing(i); break; } ### Spacing A space follows each reserved word such as `if`, `while`, etc. Spaces are not inserted between a function name and the arguments in parenthesis. ### Return Values Parenthesis surround values returned from a function: return (CUPS_STATE_IDLE); ### Functions Functions with a global scope have a lowercase prefix followed by capitalized words, e.g., `cupsDoThis`, `cupsDoThat`, `cupsDoSomethingElse`, etc. Private global functions begin with a leading underscore, e.g., `_cupsDoThis`, `_cupsDoThat`, etc. Functions with a local scope are declared static with lowercase names and underscores between words, e.g., `do_this`, `do_that`, `do_something_else`, etc. Each function begins with a comment header describing what the function does, the possible input limits (if any), the possible output values (if any), and any special information needed: /* * 'do_this()' - Compute y = this(x). * * Notes: none. */ static float /* O - Inverse power value, 0.0 <= y <= 1.1 */ do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */ { ... return (y); } 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 [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. @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 so it will not be included in the documentation. ### Variables Variables with a global scope are capitalized, e.g., `ThisVariable`, `ThatVariable`, `ThisStateVariable`, etc. Globals in CUPS libraries are either part of the per-thread global values managed by the `_cupsGlobals` function or are suitably protected for concurrent access. Global variables should be replaced by function arguments whenever possible. Variables with a local scope are lowercase with underscores between words, e.g., `this_variable`, `that_variable`, etc. Any "local global" variables shared by functions within a source file are declared static. As for global variables, local static variables are suitably protected for concurrent access. Each variable is declared on a separate line and is immediately followed by a comment block describing the variable: int ThisVariable; /* The current state of this */ static int that_variable; /* The current state of that */ ### Types All type names are lowercase with underscores between words and `_t` appended to the end of the name, e.g., `cups_this_type_t`, `cups_that_type_t`, etc. Type names start with a prefix, typically `cups` or the name of the program, to avoid conflicts with system types. Private type names start with an underscore, e.g., `_cups_this_t`, `_cups_that_t`, etc. Each type has a comment block immediately after the typedef: typedef int cups_this_type_t; /* This type is for CUPS foobar options. */ ### Structures All structure names are lowercase with underscores between words and `_s` appended to the end of the name, e.g., `cups_this_s`, `cups_that_s`, etc. Structure names start with a prefix, typically `cups` or the name of the program, to avoid conflicts with system types. Private structure names start with an underscore, e.g., `_cups_this_s`, `_cups_that_s`, etc. Each structure has a comment block immediately after the struct and each member is documented similar to the variable naming policy above: struct cups_this_struct_s /* This structure is for CUPS foobar options. */ { int this_member; /* Current state for this */ int that_member; /* Current state for that */ }; ### Constants All constant names are uppercase with underscores between words, e.g., `CUPS_THIS_CONSTANT`, `CUPS_THAT_CONSTANT`, etc. Constants begin with an uppercase prefix, typically `CUPS_` or the program or type name. Private constants start with an underscore, e.g., `_CUPS_THIS_CONSTANT`, `_CUPS_THAT_CONSTANT`, etc. Typed enumerations should be used whenever possible to allow for type checking by the compiler. Comment blocks immediately follow each constant: typedef enum cups_tray_e /* Tray enumerations */ { CUPS_TRAY_THIS, /* This tray */ CUPS_TRAY_THAT /* That tray */ } cups_tray_t; ## Makefile Guidelines The following is a guide to the makefile-based build system used by CUPS. These standards have been developed over the years to allow CUPS to be built on as many systems and environments as possible. ### General Organization The CUPS source code is organized functionally into a top-level makefile, include file, and subdirectories each with their own makefile and dependencies files. The ".in" files are template files for the autoconf software and are used to generate a static version of the corresponding file. ### Makefile Documentation Each makefile starts with the standard CUPS header containing the description of the file, and CUPS copyright and license notice: # # Makefile for ... # # Copyright 2017 by Apple Inc. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # ### Portable Makefile Construction CUPS uses a common subset of make program syntax to ensure that the software can be compiled "out of the box" on as many systems as possible. The following is a list of assumptions we follow when constructing makefiles: - Targets; we assume that the make program supports the notion of simple targets of the form "name:" that perform tab-indented commands that follow the target, e.g.: target: TAB target commands - Dependencies; we assume that the make program supports recursive dependencies on targets, e.g.: target: foo bar TAB target commands foo: bla TAB foo commands bar: TAB bar commands bla: TAB bla commands - Variable Definition; we assume that the make program supports variable definition on the command-line or in the makefile using the following form: name=value - Variable Substitution; we assume that the make program supports variable substitution using the following forms: - `$(name)`; substitutes the value of "name", - `$(name:.old=.new)`; substitutes the value of "name" with the filename extension ".old" changed to ".new", - `$(MAKEFLAGS)`; substitutes the command-line options passed to the program without the leading hyphen (-), - `$$`; substitutes a single $ character, - `$<`; substitutes the current source file or dependency, and - `$@`; substitutes the current target name. - Suffixes; we assume that the make program supports filename suffixes with assumed dependencies, e.g.: .SUFFIXES: .c .o .c.o: TAB $(CC) $(CFLAGS) -o $@ -c $< - Include Files; we assume that the make program supports the include directive, e.g.: include ../Makedefs include Dependencies - Comments; we assume that comments begin with a # character and proceed to the end of the current line. - Line Length; we assume that there is no practical limit to the length of lines. - Continuation of long lines; we assume that the `\` character may be placed at the end of a line to concatenate two or more lines in a makefile to form a single long line. - Shell; we assume a POSIX-compatible shell is present on the build system. ### Standard Variables The following variables are defined in the "Makedefs" file generated by the autoconf software: - `ALL_CFLAGS`; the combined C compiler options, - `ALL_CXXFLAGS`; the combined C++ compiler options, - `AMANDIR`; the administrative man page installation directory (section 8/1m depending on the platform), - `AR`; the library archiver command, - `ARFLAGS`; options for the library archiver command, - `AWK`; the local awk command, - `BINDIR`; the binary installation directory, - `BUILDROOT`; optional installation prefix (defaults to DSTROOT), - `CC`; the C compiler command, - `CFLAGS`; options for the C compiler command, - `CHMOD`; the chmod command, - `CXX`; the C++ compiler command, - `CXXFLAGS`; options for the C++ compiler command, - `DATADIR`; the data file installation directory, - `DSO`; the C shared library building command, - `DSOXX`; the C++ shared library building command, - `DSOFLAGS`; options for the shared library building command, - `INCLUDEDIR`; the public header file installation directory, - `INSTALL`; the install command, - `INSTALL_BIN`; the program installation command, - `INSTALL_COMPDATA`; the compressed data file installation command, - `INSTALL_CONFIG`; the configuration file installation command, - `INSTALL_DATA`; the data file installation command, - `INSTALL_DIR`; the directory installation command, - `INSTALL_LIB`; the library installation command, - `INSTALL_MAN`; the documentation installation command, - `INSTALL_SCRIPT`; the shell script installation command, - `LD`; the linker command, - `LDFLAGS`; options for the linker, - `LIBDIR`; the library installation directory, - `LIBS`; libraries for all programs, - `LN`; the ln command, - `MAN1EXT`; extension for man pages in section 1, - `MAN3EXT`; extension for man pages in section 3, - `MAN5EXT`; extension for man pages in section 5, - `MAN7EXT`; extension for man pages in section 7, - `MAN8DIR`; subdirectory for man pages in section 8, - `MAN8EXT`; extension for man pages in section 8, - `MANDIR`; the man page installation directory, - `OPTIM`; common compiler optimization options, - `PRIVATEINCLUDE`; the private header file installation directory, - `RM`; the rm command, - `SHELL`; the sh (POSIX shell) command, - `STRIP`; the strip command, - `srcdir`; the source directory. ### Standard Targets The following standard targets are defined in each makefile: - `all`; creates all target programs, libraries, and documentation files, - `clean`; removes all target programs libraries, documentation files, and object files, - `depend`; generates automatic dependencies for any C or C++ source files (also see "DEPENDENCIES"), - `distclean`; removes autoconf-generated files in addition to those removed by the "clean" target, - `install`; installs all distribution files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), - `install-data`; installs all data files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), - `install-exec`; installs all executable files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), - `install-headers`; installs all include files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), - `install-libs`; installs all library files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), and - `uninstall`; removes all distribution files from their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"). ### Object Files Object files (the result of compiling a C or C++ source file) have the extension ".o". ### Programs Program files are the result of linking object files and libraries together to form an executable file. A typical program target looks like: program: $(OBJS) TAB echo Linking $@... TAB $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) ### Static Libraries Static libraries have a prefix of "lib" and the extension ".a". A typical static library target looks like: libname.a: $(OBJECTS) TAB echo Creating $@... TAB $(RM) $@ TAB $(AR) $(ARFLAGS) $@ $(OBJECTS) TAB $(RANLIB) $@ ### Shared Libraries Shared libraries have a prefix of "lib" and the extension ".dylib" or ".so" depending on the operating system. A typical shared library is composed of several targets that look like: libname.so: $(OBJECTS) TAB echo $(DSOCOMMAND) libname.so.$(DSOVERSION) ... TAB $(DSOCOMMAND) libname.so.$(DSOVERSION) $(OBJECTS) TAB $(RM) libname.so libname.so.$(DSOMAJOR) TAB $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR) TAB $(LN) libname.so.$(DSOVERSION) libname.so libname.dylib: $(OBJECTS) TAB echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ... TAB $(DSOCOMMAND) libname.$(DSOVERSION).dylib \ TAB TAB -install_name $(libdir)/libname.$(DSOMAJOR).dylib \ TAB TAB -current_version libname.$(DSOVERSION).dylib \ TAB TAB -compatibility_version $(DSOMAJOR).0 \ TAB TAB $(OBJECTS) $(LIBS) TAB $(RM) libname.dylib TAB $(RM) libname.$(DSOMAJOR).dylib TAB $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib TAB $(LN) libname.$(DSOVERSION).dylib libname.dylib ### Dependencies Static dependencies are expressed in each makefile following the target, for example: foo: bar Static dependencies are only used when it is not possible to automatically generate them. Automatic dependencies are stored in a file named "Dependencies" and included at the end of the makefile. The following "depend" target rule is used to create the automatic dependencies: depend: TAB $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies We regenerate the automatic dependencies on an macOS system and express any non-macOS dependencies statically in the makefile. ### Install/Uninstall Support All makefiles contains install and uninstall rules which install or remove the corresponding software. These rules must use the $(BUILDROOT) variable as a prefix to any installation directory so that CUPS can be installed in a temporary location for packaging by programs like rpmbuild. The `INSTALL_BIN`, `INSTALL_COMPDATA`, `INSTALL_CONFIG`, `INSTALL_DATA`, `INSTALL_DIR`, `INSTALL_LIB`, `INSTALL_MAN`, and `INSTALL_SCRIPT` variables must be used when installing files so that the proper ownership and permissions are set on the installed files. The `$(RANLIB)` command must be run on any static libraries after installation since the symbol table is invalidated when the library is copied on some platforms. cups-2.3.1/configure000775 000765 000024 00001110264 13574721672 014513 0ustar00mikestaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for CUPS 2.3.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: https://github.com/apple/cups/issues about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='CUPS' PACKAGE_TARNAME='cups' 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/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS UNINSTALL_LANGUAGES INSTALL_LANGUAGES CUPS_WEBIF DEFAULT_IPP_PORT CUPS_SNMP_COMMUNITY CUPS_SNMP_ADDRESS DEFAULT_RAW_PRINTING CUPS_MAX_COPIES CUPS_DEFAULT_SMB_CONFIG_FILE CUPS_DEFAULT_LPD_CONFIG_FILE CUPS_DEFAULT_PRINTCAP CUPS_PRIMARY_SYSTEM_GROUP CUPS_SYSTEM_GROUPS CUPS_GROUP CUPS_USER CUPS_DEFAULT_SHARED CUPS_BROWSE_LOCAL_PROTOCOLS CUPS_BROWSING CUPS_PAGE_LOG_FORMAT CUPS_ACCESS_LOG_LEVEL CUPS_LOG_LEVEL CUPS_FATAL_ERRORS CUPS_LOG_FILE_PERM CUPS_CUPSD_FILE_PERM CUPS_CONFIG_FILE_PERM CUPS_EXE_FILE_PERM CUPS_RESOURCEDIR CUPS_BUNDLEDIR LANGUAGES XINETD RCSTOP RCSTART RCLEVELS INITDDIR INITDIR SMFMANIFESTDIR SYSTEMD_DIR LAUNCHD_DIR ONDEMANDLIBS ONDEMANDFLAGS IPPFIND_MAN IPPFIND_BIN DNSSD_BACKEND DNSSDLIBS LARGEFILE PAMMODAUTH PAMMOD PAMLIBS PAMFILE PAMDIR EXPORT_SSLLIBS SSLLIBS SSLFLAGS IPPALIASES CUPS_SERVERKEYCHAIN LIBGNUTLSCONFIG PTHREAD_FLAGS CUPS_DEFAULT_GSSSERVICENAME KRB5CONFIG LIBGSSAPI CUPS_LISTEN_DOMAINSOCKET CUPS_DEFAULT_DOMAINSOCKET WARNING_OPTIONS RELROFLAGS PIEFLAGS CXXLIBS LDARCHFLAGS ARCHFLAGS UNITTESTS OPTIM INSTALL_STRIP LIBTOOL_INSTALL LIBTOOL_CXX LIBTOOL_CC LIBTOOL LD_CXX LD_CC EXPORT_LDFLAGS LINKCUPS EXTLINKCUPS LIBCUPSSTATIC LIBCUPSIMAGE LIBCUPSBASE LIBCUPS DSOFLAGS DSOXX DSO CUPS_STATEDIR CUPS_SERVERROOT INSTALL_SYSV CUPS_SERVERBIN CUPS_REQUESTS CUPS_LOGDIR CUPS_LOCALEDIR CUPS_FONTPATH CUPS_DOCROOT MENUDIR ICONDIR CUPS_DATADIR CUPS_CACHEDIR PRIVATEINCLUDE privateinclude LIBHEADERSPRIV LIBHEADERS LIBCUPSOBJS IPPEVECOMMANDS BUILDDIRS INSTALLXPC CUPS_SYSTEM_AUTHKEY CUPS_DEFAULT_PRINTOPERATOR_AUTH DBUS_NOTIFIERLIBS DBUS_NOTIFIER DBUSDIR SERVERLIBS BACKLIBS ARFLAGS LIBZ INSTALL_GZIP LIBWRAP USBQUIRKS LIBUSB EGREP GREP LIBPAPER LIBMALLOC PKGCONFIG INSTALLSTATIC CUPS_HTMLVIEW XDGOPEN SED RMDIR RM MV MKDIR LN LD INSTALL GZIPPROG CHMOD AR RANLIB ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AWK CUPS_BUILD CUPS_REVISION CUPS_VERSION CODE_SIGN LOCALTARGET host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_cups_build enable_static enable_mallinfo enable_libpaper enable_libusb enable_tcp_wrappers enable_acl enable_dbus with_dbusdir with_adminkey with_operkey with_components with_privateinclude with_lpdconfig with_smbconfig with_cachedir with_icondir with_menudir with_docdir with_fontpath with_logdir with_rundir enable_shared enable_libtool_unsupported with_optim enable_debug enable_debug_guards enable_debug_printfs enable_unit_tests with_archflags with_ldarchflags enable_relro enable_sanitizer with_domainsocket enable_gssapi with_gssservicename enable_threads enable_ssl enable_cdsassl enable_gnutls enable_pam with_pam_module enable_largefile enable_avahi enable_dnssd with_dnssd_libs with_dnssd_includes enable_launchd enable_systemd with_systemd enable_upstart with_smfmanifestdir with_rcdir with_rclevels with_rcstart with_rcstop with_xinetd with_languages with_bundledir with_bundlelang with_exe_file_perm with_config_file_perm with_cupsd_file_perm with_log_file_perm with_fatal_errors with_log_level with_access_log_level enable_page_logging enable_browsing with_local_protocols enable_default_shared with_cups_user with_cups_group with_system_groups with_printcap with_lpdconfigfile with_smbconfigfile with_max_copies enable_raw_printing with_snmp_address with_snmp_community with_ipp_port enable_webif ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/cups] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of CUPS 2.3.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-static install static libraries --enable-mallinfo build with malloc debug logging --enable-libpaper build with libpaper support --enable-libusb use libusb for USB printing --enable-tcp-wrappers use libwrap for TCP wrappers support --enable-acl build with POSIX ACL support --disable-dbus build without DBUS support --disable-shared do not create shared libraries --enable-libtool-unsupported=/path/to/libtool build with libtool (UNSUPPORTED!) --enable-debug build with debugging symbols --enable-debug-guards build with memory allocation guards --enable-debug-printfs build with CUPS_DEBUG_LOG support --enable-unit-tests build and run unit tests --enable-relro build with the GCC relro option --enable-sanitizer build with AddressSanitizer --disable-gssapi disable GSSAPI support --disable-threads disable multi-threading support --disable-ssl disable SSL/TLS support --enable-cdsassl use CDSA for SSL/TLS support, default=first --enable-gnutls use GNU TLS for SSL/TLS support, default=second --disable-pam disable PAM support --disable-largefile omit support for large files --disable-avahi disable DNS Service Discovery support using Avahi --disable-dnssd disable DNS Service Discovery support using mDNSResponder --disable-launchd disable launchd support --disable-systemd disable systemd support --enable-upstart enable upstart support --enable-page-logging enable page_log by default --disable-browsing disable Browsing by default --disable-default-shared disable DefaultShared by default --disable-raw-printing do not allow raw printing by default --enable-webif enable the web interface by default, default=no for macOS Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-cups-build set "cups-config --build" string --with-dbusdir set DBUS configuration directory --with-adminkey set the default SystemAuthKey value --with-operkey set the default operator @AUTHKEY value --with-components set components to build: - "all" (default) builds everything - "core" builds libcups and ipptool - "libcups" builds just libcups - "libcupslite" builds just libcups without driver support --with-privateinclude set path for private include files, default=none --with-lpdconfig set URI for LPD config file --with-smbconfig set URI for Samba config file --with-cachedir set path for cache files --with-icondir set path for application icons --with-menudir set path for application menus --with-docdir set path for documentation --with-fontpath set font path for pstoraster --with-logdir set path for log files --with-rundir set transient run-time state directory --with-optim set optimization flags --with-archflags set default architecture flags --with-ldarchflags set program architecture flags --with-domainsocket set unix domain socket name --with-gssservicename set default gss service name --with-pam-module set the PAM module to use --with-dnssd-libs set directory for DNS Service Discovery library --with-dnssd-includes set directory for DNS Service Discovery includes --with-systemd set directory for systemd service files --with-smfmanifestdir set path for Solaris SMF manifest --with-rcdir set path for rc scripts --with-rclevels set run levels for rc scripts --with-rcstart set start number for rc scripts --with-rcstop set stop number for rc scripts --with-xinetd set path for xinetd config files --with-languages set installed languages, default=all --with-bundledir set localization bundle directory --with-bundlelang set localization bundle base language (English or en) --with-exe-file-perm set default executable permissions value, default=0555 --with-config-file-perm set default ConfigFilePerm value, default=0640 --with-cupsd-file-perm set default cupsd permissions, default=0500 --with-log-file-perm set default LogFilePerm value, default=0644 --with-fatal-errors set default FatalErrors value, default=config --with-log-level set default LogLevel value, default=warn --with-access-log-level set default AccessLogLevel value, default=none --with-local-protocols set default BrowseLocalProtocols, default="" --with-cups-user set default user for CUPS --with-cups-group set default group for CUPS --with-system-groups set default system groups for CUPS --with-printcap set default printcap file --with-lpdconfigfile set default LPDConfigFile URI --with-smbconfigfile set default SMBConfigFile URI --with-max-copies set default max copies value, default=9999 --with-snmp-address set SNMP query address, default=auto --with-snmp-community set SNMP community, default=public --with-ipp-port set port number for IPP, default=631 Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . CUPS home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF CUPS configure 2.3.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------------------------- ## ## Report this to https://github.com/apple/cups/issues ## ## --------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member 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.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac host_os_name=`echo $host_os | sed -e '1,$s/[0-9.]*$//g'` host_os_version=`echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}'` # Linux often does not yield an OS version we can use... if test "x$host_os_version" = x; then host_os_version="0" fi if test "$build" = "$host"; then # No, build local targets LOCALTARGET="local" else # Yes, don't build local targets LOCALTARGET="" fi for ac_prog in codesign true do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CODE_SIGN+:} false; then : $as_echo_n "(cached) " >&6 else case $CODE_SIGN in [\\/]* | ?:[\\/]*) ac_cv_path_CODE_SIGN="$CODE_SIGN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CODE_SIGN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CODE_SIGN=$ac_cv_path_CODE_SIGN if test -n "$CODE_SIGN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CODE_SIGN" >&5 $as_echo "$CODE_SIGN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CODE_SIGN" && break done ac_config_headers="$ac_config_headers config.h" CUPS_VERSION="2.3.1" CUPS_REVISION="" CUPS_BUILD="cups-$CUPS_VERSION" # Check whether --with-cups_build was given. if test "${with_cups_build+set}" = set; then : withval=$with_cups_build; CUPS_BUILD="$withval" fi cat >>confdefs.h <<_ACEOF #define CUPS_SVERSION "CUPS v$CUPS_VERSION$CUPS_REVISION" _ACEOF cat >>confdefs.h <<_ACEOF #define CUPS_MINIMAL "CUPS/$CUPS_VERSION$CUPS_REVISION" _ACEOF CFLAGS="${CFLAGS:=}" CPPFLAGS="${CPPFLAGS:=}" CXXFLAGS="${CXXFLAGS:=}" LDFLAGS="${LDFLAGS:=}" for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in clang cc gcc do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in clang cc gcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in clang++ c++ g++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in clang++ c++ g++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AR+:} false; then : $as_echo_n "(cached) " >&6 else case $AR in [\\/]* | ?:[\\/]*) ac_cv_path_AR="$AR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi AR=$ac_cv_path_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "chmod", so it can be a program name with args. set dummy chmod; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CHMOD+:} false; then : $as_echo_n "(cached) " >&6 else case $CHMOD in [\\/]* | ?:[\\/]*) ac_cv_path_CHMOD="$CHMOD" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CHMOD="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CHMOD=$ac_cv_path_CHMOD if test -n "$CHMOD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHMOD" >&5 $as_echo "$CHMOD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gzip", so it can be a program name with args. set dummy gzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GZIPPROG+:} false; then : $as_echo_n "(cached) " >&6 else case $GZIPPROG in [\\/]* | ?:[\\/]*) ac_cv_path_GZIPPROG="$GZIPPROG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GZIPPROG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GZIPPROG=$ac_cv_path_GZIPPROG if test -n "$GZIPPROG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GZIPPROG" >&5 $as_echo "$GZIPPROG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for install-sh script" >&5 $as_echo_n "checking for install-sh script... " >&6; } INSTALL="`pwd`/install-sh" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using $INSTALL" >&5 $as_echo "using $INSTALL" >&6; } # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else case $LD in [\\/]* | ?:[\\/]*) ac_cv_path_LD="$LD" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LD="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LD=$ac_cv_path_LD if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "ln", so it can be a program name with args. set dummy ln; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LN+:} false; then : $as_echo_n "(cached) " >&6 else case $LN in [\\/]* | ?:[\\/]*) ac_cv_path_LN="$LN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LN=$ac_cv_path_LN if test -n "$LN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LN" >&5 $as_echo "$LN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mkdir", so it can be a program name with args. set dummy mkdir; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MKDIR+:} false; then : $as_echo_n "(cached) " >&6 else case $MKDIR in [\\/]* | ?:[\\/]*) ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MKDIR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MKDIR=$ac_cv_path_MKDIR if test -n "$MKDIR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR" >&5 $as_echo "$MKDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mv", so it can be a program name with args. set dummy mv; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MV+:} false; then : $as_echo_n "(cached) " >&6 else case $MV in [\\/]* | ?:[\\/]*) ac_cv_path_MV="$MV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MV=$ac_cv_path_MV if test -n "$MV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 $as_echo "$MV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "rmdir", so it can be a program name with args. set dummy rmdir; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RMDIR+:} false; then : $as_echo_n "(cached) " >&6 else case $RMDIR in [\\/]* | ?:[\\/]*) ac_cv_path_RMDIR="$RMDIR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RMDIR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RMDIR=$ac_cv_path_RMDIR if test -n "$RMDIR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDIR" >&5 $as_echo "$RMDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else case $SED in [\\/]* | ?:[\\/]*) ac_cv_path_SED="$SED" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi SED=$ac_cv_path_SED if test -n "$SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 $as_echo "$SED" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xdg-open", so it can be a program name with args. set dummy xdg-open; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XDGOPEN+:} false; then : $as_echo_n "(cached) " >&6 else case $XDGOPEN in [\\/]* | ?:[\\/]*) ac_cv_path_XDGOPEN="$XDGOPEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XDGOPEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XDGOPEN=$ac_cv_path_XDGOPEN if test -n "$XDGOPEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDGOPEN" >&5 $as_echo "$XDGOPEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XDGOPEN" = x; then CUPS_HTMLVIEW="htmlview" else CUPS_HTMLVIEW="$XDGOPEN" fi if test "x$AR" = x; then as_fn_error $? "Unable to find required library archive command." "$LINENO" 5 fi if test "x$CC" = x; then as_fn_error $? "Unable to find required C compiler command." "$LINENO" 5 fi INSTALLSTATIC="" # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; fi if test x$enable_static = xyes; then echo Installing static libraries... INSTALLSTATIC="installstatic" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKGCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKGCONFIG=$ac_cv_path_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKGCONFIG"; then ac_pt_PKGCONFIG=$PKGCONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKGCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG if test -n "$ac_pt_PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5 $as_echo "$ac_pt_PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKGCONFIG" = x; then PKGCONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKGCONFIG=$ac_pt_PKGCONFIG fi else PKGCONFIG="$ac_cv_path_PKGCONFIG" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing abs" >&5 $as_echo_n "checking for library containing abs... " >&6; } if ${ac_cv_search_abs+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char abs (); int main () { return abs (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_abs=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_abs+:} false; then : break fi done if ${ac_cv_search_abs+:} false; then : else ac_cv_search_abs=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_abs" >&5 $as_echo "$ac_cv_search_abs" >&6; } ac_res=$ac_cv_search_abs if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_ABS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 $as_echo_n "checking for library containing crypt... " >&6; } if ${ac_cv_search_crypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char crypt (); int main () { return crypt (); ; return 0; } _ACEOF for ac_lib in '' crypt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_crypt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_crypt+:} false; then : break fi done if ${ac_cv_search_crypt+:} false; then : else ac_cv_search_crypt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 $as_echo "$ac_cv_search_crypt" >&6; } ac_res=$ac_cv_search_crypt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fmod" >&5 $as_echo_n "checking for library containing fmod... " >&6; } if ${ac_cv_search_fmod+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fmod (); int main () { return fmod (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_fmod=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_fmod+:} false; then : break fi done if ${ac_cv_search_fmod+:} false; then : else ac_cv_search_fmod=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fmod" >&5 $as_echo "$ac_cv_search_fmod" >&6; } ac_res=$ac_cv_search_fmod if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getspent" >&5 $as_echo_n "checking for library containing getspent... " >&6; } if ${ac_cv_search_getspent+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getspent (); int main () { return getspent (); ; return 0; } _ACEOF for ac_lib in '' sec gen; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getspent=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getspent+:} false; then : break fi done if ${ac_cv_search_getspent+:} false; then : else ac_cv_search_getspent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getspent" >&5 $as_echo "$ac_cv_search_getspent" >&6; } ac_res=$ac_cv_search_getspent if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBMALLOC="" # Check whether --enable-mallinfo was given. if test "${enable_mallinfo+set}" = set; then : enableval=$enable_mallinfo; fi if test x$enable_mallinfo = xyes; then SAVELIBS="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing mallinfo" >&5 $as_echo_n "checking for library containing mallinfo... " >&6; } if ${ac_cv_search_mallinfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mallinfo (); int main () { return mallinfo (); ; return 0; } _ACEOF for ac_lib in '' malloc; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_mallinfo=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_mallinfo+:} false; then : break fi done if ${ac_cv_search_mallinfo+:} false; then : else ac_cv_search_mallinfo=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_mallinfo" >&5 $as_echo "$ac_cv_search_mallinfo" >&6; } ac_res=$ac_cv_search_mallinfo if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_MALLINFO 1" >>confdefs.h fi LIBMALLOC="$LIBS" LIBS="$SAVELIBS" fi # Check whether --enable-libpaper was given. if test "${enable_libpaper+set}" = set; then : enableval=$enable_libpaper; fi if test x$enable_libpaper = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systempapername in -lpaper" >&5 $as_echo_n "checking for systempapername in -lpaper... " >&6; } if ${ac_cv_lib_paper_systempapername+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpaper $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char systempapername (); int main () { return systempapername (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_paper_systempapername=yes else ac_cv_lib_paper_systempapername=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_paper_systempapername" >&5 $as_echo "$ac_cv_lib_paper_systempapername" >&6; } if test "x$ac_cv_lib_paper_systempapername" = xyes; then : $as_echo "#define HAVE_LIBPAPER 1" >>confdefs.h LIBPAPER="-lpaper" else LIBPAPER="" fi else LIBPAPER="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : $as_echo "#define HAVE_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default" if test "x$ac_cv_header_crypt_h" = xyes; then : $as_echo "#define HAVE_CRYPT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes; then : $as_echo "#define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : $as_echo "#define HAVE_MALLOC_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default" if test "x$ac_cv_header_shadow_h" = xyes; then : $as_echo "#define HAVE_SHADOW_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : $as_echo "#define HAVE_STDINT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : $as_echo "#define HAVE_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes; then : $as_echo "#define HAVE_STRINGS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" if test "x$ac_cv_header_bstring_h" = xyes; then : $as_echo "#define HAVE_BSTRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ioctl_h" = xyes; then : $as_echo "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : $as_echo "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/ucred.h" "ac_cv_header_sys_ucred_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ucred_h" = xyes; then : $as_echo "#define HAVE_SYS_UCRED_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes; then : SAVELIBS="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing iconv_open" >&5 $as_echo_n "checking for library containing iconv_open... " >&6; } if ${ac_cv_search_iconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); int main () { return iconv_open (); ; return 0; } _ACEOF for ac_lib in '' iconv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_iconv_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_iconv_open+:} false; then : break fi done if ${ac_cv_search_iconv_open+:} false; then : else ac_cv_search_iconv_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_iconv_open" >&5 $as_echo "$ac_cv_search_iconv_open" >&6; } ac_res=$ac_cv_search_iconv_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_ICONV_H 1" >>confdefs.h SAVELIBS="$SAVELIBS $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing libiconv_open" >&5 $as_echo_n "checking for library containing libiconv_open... " >&6; } if ${ac_cv_search_libiconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv_open (); int main () { return libiconv_open (); ; return 0; } _ACEOF for ac_lib in '' iconv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_libiconv_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_libiconv_open+:} false; then : break fi done if ${ac_cv_search_libiconv_open+:} false; then : else ac_cv_search_libiconv_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_libiconv_open" >&5 $as_echo "$ac_cv_search_libiconv_open" >&6; } ac_res=$ac_cv_search_libiconv_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_ICONV_H 1" >>confdefs.h SAVELIBS="$SAVELIBS $LIBS" fi LIBS="$SAVELIBS" fi ac_fn_c_check_header_mongrel "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mount_h" = xyes; then : $as_echo "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/statfs.h" "ac_cv_header_sys_statfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statfs_h" = xyes; then : $as_echo "#define HAVE_SYS_STATFS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statvfs_h" = xyes; then : $as_echo "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_vfs_h" = xyes; then : $as_echo "#define HAVE_SYS_VFS_H 1" >>confdefs.h fi for ac_func in statfs statvfs do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strdup strlcat strlcpy do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$host_os_name" = "hp-ux" -a "$host_os_version" = "1020"; then echo Forcing snprintf emulation for HP-UX. else for ac_func in snprintf vsnprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done fi for ac_func in random lrand48 arc4random do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in geteuid do : ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" if test "x$ac_cv_func_geteuid" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETEUID 1 _ACEOF fi done for ac_func in setpgid do : ac_fn_c_check_func "$LINENO" "setpgid" "ac_cv_func_setpgid" if test "x$ac_cv_func_setpgid" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETPGID 1 _ACEOF fi done for ac_func in vsyslog do : ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" if test "x$ac_cv_func_vsyslog" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VSYSLOG 1 _ACEOF fi done case "$host_os_name" in linux* | gnu*) # Do not use sigset on Linux or GNU HURD ;; *) # Use sigset on other platforms, if available for ac_func in sigset do : ac_fn_c_check_func "$LINENO" "sigset" "ac_cv_func_sigset" if test "x$ac_cv_func_sigset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGSET 1 _ACEOF fi done ;; esac for ac_func in sigaction do : ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" if test "x$ac_cv_func_sigaction" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGACTION 1 _ACEOF fi done for ac_func in waitpid wait3 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in posix_spawn do : ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn" if test "x$ac_cv_func_posix_spawn" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POSIX_SPAWN 1 _ACEOF fi done for ac_func in getgrouplist do : ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist" if test "x$ac_cv_func_getgrouplist" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETGROUPLIST 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff member in tm structure" >&5 $as_echo_n "checking for tm_gmtoff member in tm structure... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct tm t; int o = t.tm_gmtoff; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for st_gen member in stat structure" >&5 $as_echo_n "checking for st_gen member in stat structure... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat t; int o = t.st_gen; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_ST_GEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext for ac_func in removefile do : ac_fn_c_check_func "$LINENO" "removefile" "ac_cv_func_removefile" if test "x$ac_cv_func_removefile" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_REMOVEFILE 1 _ACEOF fi done # Check whether --enable-libusb was given. if test "${enable_libusb+set}" = set; then : enableval=$enable_libusb; fi LIBUSB="" USBQUIRKS="" if test "x$PKGCONFIG" != x; then if test x$enable_libusb != xno -a $host_os_name != darwin; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libusb-1.0" >&5 $as_echo_n "checking for libusb-1.0... " >&6; } if $PKGCONFIG --exists libusb-1.0; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_LIBUSB 1" >>confdefs.h CFLAGS="$CFLAGS `$PKGCONFIG --cflags libusb-1.0`" LIBUSB="`$PKGCONFIG --libs libusb-1.0`" USBQUIRKS="\$(DATADIR)/usb" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test x$enable_libusb = xyes; then as_fn_error $? "libusb required for --enable-libusb." "$LINENO" 5 fi fi fi elif test x$enable_libusb = xyes; then as_fn_error $? "Need pkg-config to enable libusb support." "$LINENO" 5 fi # Check whether --enable-tcp_wrappers was given. if test "${enable_tcp_wrappers+set}" = set; then : enableval=$enable_tcp_wrappers; fi LIBWRAP="" if test x$enable_tcp_wrappers = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hosts_access in -lwrap" >&5 $as_echo_n "checking for hosts_access in -lwrap... " >&6; } if ${ac_cv_lib_wrap_hosts_access+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lwrap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char hosts_access (); int main () { return hosts_access (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_wrap_hosts_access=yes else ac_cv_lib_wrap_hosts_access=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wrap_hosts_access" >&5 $as_echo "$ac_cv_lib_wrap_hosts_access" >&6; } if test "x$ac_cv_lib_wrap_hosts_access" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "tcpd.h" "ac_cv_header_tcpd_h" "$ac_includes_default" if test "x$ac_cv_header_tcpd_h" = xyes; then : $as_echo "#define HAVE_TCPD_H 1" >>confdefs.h LIBWRAP="-lwrap" fi fi fi INSTALL_GZIP="" LIBZ="" ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 $as_echo_n "checking for gzgets in -lz... " >&6; } if ${ac_cv_lib_z_gzgets+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzgets (); int main () { return gzgets (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzgets=yes else ac_cv_lib_z_gzgets=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5 $as_echo "$ac_cv_lib_z_gzgets" >&6; } if test "x$ac_cv_lib_z_gzgets" = xyes; then : $as_echo "#define HAVE_LIBZ 1" >>confdefs.h LIBZ="-lz" LIBS="$LIBS -lz" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz" >&5 $as_echo_n "checking for inflateCopy in -lz... " >&6; } if ${ac_cv_lib_z_inflateCopy+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inflateCopy (); int main () { return inflateCopy (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_inflateCopy=yes else ac_cv_lib_z_inflateCopy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy" >&5 $as_echo "$ac_cv_lib_z_inflateCopy" >&6; } if test "x$ac_cv_lib_z_inflateCopy" = xyes; then : $as_echo "#define HAVE_INFLATECOPY 1" >>confdefs.h fi if test "x$GZIPPROG" != x; then INSTALL_GZIP="-z" fi fi fi case $host_os_name in darwin* | *bsd*) ARFLAGS="-rcv" ;; *) ARFLAGS="crvs" ;; esac BACKLIBS="" SERVERLIBS="" SAVELIBS="$LIBS" LIBS="" # Check whether --enable-acl was given. if test "${enable_acl+set}" = set; then : enableval=$enable_acl; fi if test "x$enable_acl" != xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing acl_init" >&5 $as_echo_n "checking for library containing acl_init... " >&6; } if ${ac_cv_search_acl_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char acl_init (); int main () { return acl_init (); ; return 0; } _ACEOF for ac_lib in '' acl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_acl_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_acl_init+:} false; then : break fi done if ${ac_cv_search_acl_init+:} false; then : else ac_cv_search_acl_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_acl_init" >&5 $as_echo "$ac_cv_search_acl_init" >&6; } ac_res=$ac_cv_search_acl_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_ACL_INIT 1" >>confdefs.h fi SERVERLIBS="$SERVERLIBS $LIBS" fi LIBS="$SAVELIBS" DBUSDIR="" DBUS_NOTIFIER="" DBUS_NOTIFIERLIBS="" # Check whether --enable-dbus was given. if test "${enable_dbus+set}" = set; then : enableval=$enable_dbus; fi # Check whether --with-dbusdir was given. if test "${with_dbusdir+set}" = set; then : withval=$with_dbusdir; DBUSDIR="$withval" fi if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$host_os_name" != xdarwin; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 $as_echo_n "checking for DBUS... " >&6; } if $PKGCONFIG --exists dbus-1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_DBUS 1" >>confdefs.h CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE" SERVERLIBS="$SERVERLIBS `$PKGCONFIG --libs dbus-1`" DBUS_NOTIFIER="dbus" DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`" SAVELIBS="$LIBS" LIBS="$LIBS $DBUS_NOTIFIERLIBS" ac_fn_c_check_func "$LINENO" "dbus_message_iter_init_append" "ac_cv_func_dbus_message_iter_init_append" if test "x$ac_cv_func_dbus_message_iter_init_append" = xyes; then : $as_echo "#define HAVE_DBUS_MESSAGE_ITER_INIT_APPEND 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "dbus_threads_init" "ac_cv_func_dbus_threads_init" if test "x$ac_cv_func_dbus_threads_init" = xyes; then : $as_echo "#define HAVE_DBUS_THREADS_INIT 1" >>confdefs.h fi LIBS="$SAVELIBS" if test -d /etc/dbus-1 -a "x$DBUSDIR" = x; then DBUSDIR="/etc/dbus-1" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" CUPS_DEFAULT_SYSTEM_AUTHKEY="" CUPS_SYSTEM_AUTHKEY="" INSTALLXPC="" case $host_os_name in darwin*) BACKLIBS="$BACKLIBS -framework IOKit" SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" LIBS="-framework CoreFoundation -framework Security $LIBS" ac_fn_c_check_header_mongrel "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" if test "x$ac_cv_header_ApplicationServices_ApplicationServices_h" = xyes; then : $as_echo "#define HAVE_APPLICATIONSERVICES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "CoreFoundation/CoreFoundation.h" "ac_cv_header_CoreFoundation_CoreFoundation_h" "$ac_includes_default" if test "x$ac_cv_header_CoreFoundation_CoreFoundation_h" = xyes; then : $as_echo "#define HAVE_COREFOUNDATION_H 1" >>confdefs.h fi SAVELIBS="$LIBS" LIBS="-framework SystemConfiguration $LIBS" for ac_func in SCDynamicStoreCopyComputerName do : ac_fn_c_check_func "$LINENO" "SCDynamicStoreCopyComputerName" "ac_cv_func_SCDynamicStoreCopyComputerName" if test "x$ac_cv_func_SCDynamicStoreCopyComputerName" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1 _ACEOF $as_echo "#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1" >>confdefs.h else LIBS="$SAVELIBS" fi done ac_fn_c_check_header_mongrel "$LINENO" "membership.h" "ac_cv_header_membership_h" "$ac_includes_default" if test "x$ac_cv_header_membership_h" = xyes; then : $as_echo "#define HAVE_MEMBERSHIP_H 1" >>confdefs.h fi for ac_func in mbr_uid_to_uuid do : ac_fn_c_check_func "$LINENO" "mbr_uid_to_uuid" "ac_cv_func_mbr_uid_to_uuid" if test "x$ac_cv_func_mbr_uid_to_uuid" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MBR_UID_TO_UUID 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : $as_echo "#define HAVE_DLFCN_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "notify.h" "ac_cv_header_notify_h" "$ac_includes_default" if test "x$ac_cv_header_notify_h" = xyes; then : $as_echo "#define HAVE_NOTIFY_H 1" >>confdefs.h fi for ac_func in notify_post do : ac_fn_c_check_func "$LINENO" "notify_post" "ac_cv_func_notify_post" if test "x$ac_cv_func_notify_post" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NOTIFY_POST 1 _ACEOF fi done # Check whether --with-adminkey was given. if test "${with_adminkey+set}" = set; then : withval=$with_adminkey; default_adminkey="$withval" else default_adminkey="default" fi # Check whether --with-operkey was given. if test "${with_operkey+set}" = set; then : withval=$with_operkey; default_operkey="$withval" else default_operkey="default" fi ac_fn_c_check_header_mongrel "$LINENO" "Security/Authorization.h" "ac_cv_header_Security_Authorization_h" "$ac_includes_default" if test "x$ac_cv_header_Security_Authorization_h" = xyes; then : $as_echo "#define HAVE_AUTHORIZATION_H 1" >>confdefs.h if test "x$default_adminkey" != xdefault; then CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey" else CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin" fi if test "x$default_operkey" != xdefault; then CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" else CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" fi fi if test $host_os_version -ge 100; then ac_fn_c_check_header_mongrel "$LINENO" "sandbox.h" "ac_cv_header_sandbox_h" "$ac_includes_default" if test "x$ac_cv_header_sandbox_h" = xyes; then : $as_echo "#define HAVE_SANDBOX_H 1" >>confdefs.h fi fi if test $host_os_version -ge 110 -a $host_os_version -lt 120; then # Broken public headers in 10.7.x... { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sandbox/private.h presence" >&5 $as_echo_n "checking for sandbox/private.h presence... " >&6; } if test -f /usr/local/include/sandbox/private.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "Run 'sudo mkdir -p /usr/local/include/sandbox' and 'sudo touch /usr/local/include/sandbox/private.h' to build CUPS." "$LINENO" 5 fi fi ac_fn_c_check_header_mongrel "$LINENO" "xpc/xpc.h" "ac_cv_header_xpc_xpc_h" "$ac_includes_default" if test "x$ac_cv_header_xpc_xpc_h" = xyes; then : $as_echo "#define HAVE_XPC 1" >>confdefs.h INSTALLXPC="install-xpc" fi ;; esac cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_PRINTOPERATOR_AUTH "$CUPS_DEFAULT_PRINTOPERATOR_AUTH" _ACEOF cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_SYSTEM_AUTHKEY "$CUPS_DEFAULT_SYSTEM_AUTHKEY" _ACEOF COMPONENTS="all" # Check whether --with-components was given. if test "${with_components+set}" = set; then : withval=$with_components; COMPONENTS="$withval" fi cupsimagebase="cupsimage" IPPEVECOMMANDS="ippevepcl ippeveps" LIBCUPSOBJS="\$(COREOBJS) \$(DRIVEROBJS)" LIBHEADERS="\$(COREHEADERS) \$(DRIVERHEADERS)" LIBHEADERSPRIV="\$(COREHEADERSPRIV) \$(DRIVERHEADERSPRIV)" case "$COMPONENTS" in all) BUILDDIRS="tools filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" ;; core) BUILDDIRS="tools examples locale" ;; corelite) $as_echo "#define CUPS_LITE 1" >>confdefs.h BUILDDIRS="tools examples locale" cupsimagebase="" LIBCUPSOBJS="\$(COREOBJS)" LIBHEADERS="\$(COREHEADERS)" LIBHEADERSPRIV="\$(COREHEADERSPRIV)" ;; libcups) BUILDDIRS="locale" cupsimagebase="" ;; libcupslite) $as_echo "#define CUPS_LITE 1" >>confdefs.h BUILDDIRS="locale" cupsimagebase="" LIBCUPSOBJS="\$(COREOBJS)" LIBHEADERS="\$(COREHEADERS)" LIBHEADERSPRIV="\$(COREHEADERSPRIV)" ;; *) as_fn_error $? "Bad build component \"$COMPONENT\" specified!" "$LINENO" 5 ;; esac if test "$prefix" = "NONE"; then prefix="/" fi if test "$exec_prefix" = "NONE"; then if test "$prefix" = "/"; then exec_prefix="/usr" else exec_prefix="$prefix" fi fi if test "$bindir" = "\${exec_prefix}/bin"; then bindir="$exec_prefix/bin" fi cat >>confdefs.h <<_ACEOF #define CUPS_BINDIR "$bindir" _ACEOF if test "$sbindir" = "\${exec_prefix}/sbin"; then sbindir="$exec_prefix/sbin" fi cat >>confdefs.h <<_ACEOF #define CUPS_SBINDIR "$sbindir" _ACEOF if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then sharedstatedir="/usr/com" fi if test "$datarootdir" = "\${prefix}/share"; then if test "$prefix" = "/"; then datarootdir="/usr/share" else datarootdir="$prefix/share" fi fi if test "$datadir" = "\${prefix}/share"; then if test "$prefix" = "/"; then datadir="/usr/share" else datadir="$prefix/share" fi elif test "$datadir" = "\${datarootdir}"; then datadir="$datarootdir" fi if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then includedir="/usr/include" fi if test "$localstatedir" = "\${prefix}/var"; then if test "$prefix" = "/"; then if test "$host_os_name" = darwin; then localstatedir="/private/var" else localstatedir="/var" fi else localstatedir="$prefix/var" fi fi if test "$sysconfdir" = "\${prefix}/etc"; then if test "$prefix" = "/"; then if test "$host_os_name" = darwin; then sysconfdir="/private/etc" else sysconfdir="/etc" fi else sysconfdir="$prefix/etc" fi fi if test "$libdir" = "\${exec_prefix}/lib"; then case "$host_os_name" in linux*) if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then libdir="$exec_prefix/lib64" fi ;; esac fi # Check whether --with-privateinclude was given. if test "${with_privateinclude+set}" = set; then : withval=$with_privateinclude; privateinclude="$withval" else privateinclude="" fi if test "x$privateinclude" != x -a "x$privateinclude" != xnone; then PRIVATEINCLUDE="$privateinclude/cups" else privateinclude="" PRIVATEINCLUDE="" fi # Check whether --with-lpdconfig was given. if test "${with_lpdconfig+set}" = set; then : withval=$with_lpdconfig; LPDCONFIG="$withval" else LPDCONFIG="" fi if test "x$LPDCONFIG" = x; then if test -f /System/Library/LaunchDaemons/org.cups.cups-lpd.plist; then LPDCONFIG="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" elif test "x$XINETD" != x; then LPDCONFIG="xinetd://$XINETD/cups-lpd" fi fi if test "x$LPDCONFIG" = xoff; then cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_LPD_CONFIG "" _ACEOF else cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_LPD_CONFIG "$LPDCONFIG" _ACEOF fi # Check whether --with-smbconfig was given. if test "${with_smbconfig+set}" = set; then : withval=$with_smbconfig; SMBCONFIG="$withval" else SMBCONFIG="" fi if test "x$SMBCONFIG" = x; then if test -f /System/Library/LaunchDaemons/smbd.plist; then SMBCONFIG="launchd:///System/Library/LaunchDaemons/smbd.plist" else for dir in /etc /etc/samba /usr/local/etc; do if test -f $dir/smb.conf; then SMBCONFIG="samba://$dir/smb.conf" break fi done fi fi if test "x$SMBCONFIG" = xoff; then cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_SMB_CONFIG "" _ACEOF else cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_SMB_CONFIG "$SMBCONFIG" _ACEOF fi # Cache data... # Check whether --with-cachedir was given. if test "${with_cachedir+set}" = set; then : withval=$with_cachedir; cachedir="$withval" else cachedir="" fi if test x$cachedir = x; then if test "x$host_os_name" = xdarwin; then CUPS_CACHEDIR="$localstatedir/spool/cups/cache" else CUPS_CACHEDIR="$localstatedir/cache/cups" fi else CUPS_CACHEDIR="$cachedir" fi cat >>confdefs.h <<_ACEOF #define CUPS_CACHEDIR "$CUPS_CACHEDIR" _ACEOF # Data files CUPS_DATADIR="$datadir/cups" cat >>confdefs.h <<_ACEOF #define CUPS_DATADIR "$datadir/cups" _ACEOF # Icon directory # Check whether --with-icondir was given. if test "${with_icondir+set}" = set; then : withval=$with_icondir; icondir="$withval" else icondir="" fi if test "x$icondir" = x -a -d /usr/share/icons; then ICONDIR="/usr/share/icons" else ICONDIR="$icondir" fi # Menu directory # Check whether --with-menudir was given. if test "${with_menudir+set}" = set; then : withval=$with_menudir; menudir="$withval" else menudir="" fi if test "x$menudir" = x -a -d /usr/share/applications; then MENUDIR="/usr/share/applications" else MENUDIR="$menudir" fi # Documentation files # Check whether --with-docdir was given. if test "${with_docdir+set}" = set; then : withval=$with_docdir; docdir="$withval" else docdir="" fi if test x$docdir = x; then CUPS_DOCROOT="$datadir/doc/cups" docdir="$datadir/doc/cups" else CUPS_DOCROOT="$docdir" fi cat >>confdefs.h <<_ACEOF #define CUPS_DOCROOT "$docdir" _ACEOF # Fonts # Check whether --with-fontpath was given. if test "${with_fontpath+set}" = set; then : withval=$with_fontpath; fontpath="$withval" else fontpath="" fi if test "x$fontpath" = "x"; then CUPS_FONTPATH="$datadir/cups/fonts" else CUPS_FONTPATH="$fontpath" fi cat >>confdefs.h <<_ACEOF #define CUPS_FONTPATH "$CUPS_FONTPATH" _ACEOF # Locale data if test "$localedir" = "\${datarootdir}/locale"; then case "$host_os_name" in linux* | gnu* | *bsd* | darwin*) CUPS_LOCALEDIR="$datarootdir/locale" ;; *) # This is the standard System V location... CUPS_LOCALEDIR="$exec_prefix/lib/locale" ;; esac else CUPS_LOCALEDIR="$localedir" fi cat >>confdefs.h <<_ACEOF #define CUPS_LOCALEDIR "$CUPS_LOCALEDIR" _ACEOF # Log files... # Check whether --with-logdir was given. if test "${with_logdir+set}" = set; then : withval=$with_logdir; logdir="$withval" else logdir="" fi if test x$logdir = x; then CUPS_LOGDIR="$localstatedir/log/cups" cat >>confdefs.h <<_ACEOF #define CUPS_LOGDIR "$localstatedir/log/cups" _ACEOF else CUPS_LOGDIR="$logdir" fi cat >>confdefs.h <<_ACEOF #define CUPS_LOGDIR "$CUPS_LOGDIR" _ACEOF # Longer-term spool data CUPS_REQUESTS="$localstatedir/spool/cups" cat >>confdefs.h <<_ACEOF #define CUPS_REQUESTS "$localstatedir/spool/cups" _ACEOF # Server executables... case "$host_os_name" in *bsd* | darwin*) # *BSD and Darwin (macOS) INSTALL_SYSV="" CUPS_SERVERBIN="$exec_prefix/libexec/cups" ;; *) # All others INSTALL_SYSV="install-sysv" CUPS_SERVERBIN="$exec_prefix/lib/cups" ;; esac cat >>confdefs.h <<_ACEOF #define CUPS_SERVERBIN "$CUPS_SERVERBIN" _ACEOF # Configuration files CUPS_SERVERROOT="$sysconfdir/cups" cat >>confdefs.h <<_ACEOF #define CUPS_SERVERROOT "$sysconfdir/cups" _ACEOF # Transient run-time state # Check whether --with-rundir was given. if test "${with_rundir+set}" = set; then : withval=$with_rundir; CUPS_STATEDIR="$withval" else case "$host_os_name" in darwin*) # Darwin (macOS) CUPS_STATEDIR="$CUPS_SERVERROOT" ;; *) # All others CUPS_STATEDIR="$localstatedir/run/cups" ;; esac fi cat >>confdefs.h <<_ACEOF #define CUPS_STATEDIR "$CUPS_STATEDIR" _ACEOF if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then # New GNU "standards" break previous ones, so make sure we use # the right default location for the operating system... mandir="\${prefix}/man" fi if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then case "$host_os_name" in darwin* | linux* | gnu* | *bsd*) # Darwin, macOS, Linux, GNU HURD, and *BSD mandir="/usr/share/man" ;; *) # All others mandir="/usr/man" ;; esac fi PICFLAG=1 DSOFLAGS="${DSOFLAGS:=}" # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; fi cupsbase="cups" LIBCUPSBASE="lib$cupsbase" LIBCUPSIMAGE="" LIBCUPSSTATIC="lib$cupsbase.a" if test x$enable_shared != xno; then case "$host_os_name" in sunos*) LIBCUPS="lib$cupsbase.so.2" if test "x$cupsimagebase" != x; then LIBCUPSIMAGE="lib$cupsimagebase.so.2" fi DSO="\$(CC)" DSOXX="\$(CXX)" DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G" ;; linux* | gnu* | *bsd*) LIBCUPS="lib$cupsbase.so.2" if test "x$cupsimagebase" != x; then LIBCUPSIMAGE="lib$cupsimagebase.so.2" fi DSO="\$(CC)" DSOXX="\$(CXX)" DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" ;; darwin*) LIBCUPS="lib$cupsbase.2.dylib" if test "x$cupsimagebase" != x; then LIBCUPSIMAGE="lib$cupsimagebase.2.dylib" fi DSO="\$(CC)" DSOXX="\$(CXX)" DSOFLAGS="$DSOFLAGS -Wl,-no_warn_inits -dynamiclib -single_module -lc" ;; *) echo "Warning: shared libraries may not be supported. Trying -shared" echo " option with compiler." LIBCUPS="lib$cupsbase.so.2" if test "x$cupsimagebase" != x; then LIBCUPSIMAGE="lib$cupsimagebase.so.2" fi DSO="\$(CC)" DSOXX="\$(CXX)" DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" ;; esac else PICFLAG=0 LIBCUPS="lib$cupsbase.a" if test "x$cupsimagebase" != x; then LIBCUPSIMAGE="lib$cupsimagebase.a" fi DSO=":" DSOXX=":" fi if test x$enable_shared = xno; then LINKCUPS="../cups/lib$cupsbase.a \$(LIBS)" EXTLINKCUPS="-lcups \$LIBS" else LINKCUPS="-L../cups -l${cupsbase}" EXTLINKCUPS="-lcups" fi EXPORT_LDFLAGS="" if test "$DSO" != ":"; then # Tell the run-time linkers where to find a DSO. Some platforms # need this option, even when the library is installed in a # standard location... case $host_os_name in sunos*) # Solaris... if test $exec_prefix != /usr; then DSOFLAGS="-R$libdir $DSOFLAGS" LDFLAGS="$LDFLAGS -R$libdir" EXPORT_LDFLAGS="-R$libdir" fi ;; *bsd*) # *BSD... if test $exec_prefix != /usr; then DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" LDFLAGS="$LDFLAGS -Wl,-R$libdir" EXPORT_LDFLAGS="-Wl,-R$libdir" fi ;; linux* | gnu*) # Linux, and HURD... if test $exec_prefix != /usr; then DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" EXPORT_LDFLAGS="-Wl,-rpath,$libdir" fi ;; esac fi # Check whether --enable-libtool_unsupported was given. if test "${enable_libtool_unsupported+set}" = set; then : enableval=$enable_libtool_unsupported; if test x$enable_libtool_unsupported != xno; then if test x$enable_libtool_unsupported == xyes; then as_fn_error $? "Use --enable-libtool-unsupported=/path/to/libtool." "$LINENO" 5 fi LIBTOOL="$enable_libtool_unsupported" enable_shared=no echo "WARNING: libtool is not supported or endorsed by Apple Inc." echo " WE DO NOT PROVIDE SUPPORT FOR LIBTOOL PROBLEMS." else LIBTOOL="" fi fi if test x$LIBTOOL != x; then DSO="\$(LIBTOOL) --mode=link --tag=CC ${CC}" DSOXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" LD_CC="\$(LIBTOOL) --mode=link --tag=CC ${CC}" LD_CXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" LIBCUPS="libcups.la" LIBCUPSSTATIC="libcups.la" LIBCUPSCGI="libcupscgi.la" LIBCUPSIMAGE="libcupsimage.la" LIBCUPSMIME="libcupsmime.la" LIBCUPSPPDC="libcupsppdc.la" LIBTOOL_CC="\$(LIBTOOL) --mode=compile --tag=CC" LIBTOOL_CXX="\$(LIBTOOL) --mode=compile --tag=CXX" LIBTOOL_INSTALL="\$(LIBTOOL) --mode=install" LINKCUPS="../cups/\$(LIBCUPS)" LINKCUPSIMAGE="../cups/\$(LIBCUPSIMAGE)" else LD_CC="\$(CC)" LD_CXX="\$(CXX)" LIBTOOL_CC="" LIBTOOL_CXX="" LIBTOOL_INSTALL="" fi INSTALL_STRIP="" # Check whether --with-optim was given. if test "${with_optim+set}" = set; then : withval=$with_optim; OPTIM="$withval" else OPTIM="" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi # Check whether --enable-debug_guards was given. if test "${enable_debug_guards+set}" = set; then : enableval=$enable_debug_guards; fi # Check whether --enable-debug_printfs was given. if test "${enable_debug_printfs+set}" = set; then : enableval=$enable_debug_printfs; fi # Check whether --enable-unit_tests was given. if test "${enable_unit_tests+set}" = set; then : enableval=$enable_unit_tests; fi if test x$enable_debug = xyes -a "x$OPTIM" = x; then OPTIM="-g" else INSTALL_STRIP="-s" fi if test x$enable_debug_printfs = xyes; then CFLAGS="$CFLAGS -DDEBUG" CXXFLAGS="$CXXFLAGS -DDEBUG" fi if test x$enable_debug_guards = xyes; then CFLAGS="$CFLAGS -DDEBUG_GUARDS" CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" fi if test x$enable_unit_tests = xyes; then if test "$build" != "$host"; then as_fn_error $? "Sorry, cannot build unit tests when cross-compiling." "$LINENO" 5 fi UNITTESTS="unittests" else UNITTESTS="" fi # Check whether --with-archflags was given. if test "${with_archflags+set}" = set; then : withval=$with_archflags; fi # Check whether --with-ldarchflags was given. if test "${with_ldarchflags+set}" = set; then : withval=$with_ldarchflags; fi if test -z "$with_archflags"; then ARCHFLAGS="" else ARCHFLAGS="$with_archflags" fi if test -z "$with_ldarchflags"; then if test "$host_os_name" = darwin; then # Only create Intel programs by default LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch ppc64//'`" else LDARCHFLAGS="$ARCHFLAGS" fi else LDARCHFLAGS="$with_ldarchflags" fi # Check whether --enable-relro was given. if test "${enable_relro+set}" = set; then : enableval=$enable_relro; fi # Check whether --enable-sanitizer was given. if test "${enable_sanitizer+set}" = set; then : enableval=$enable_sanitizer; fi CXXLIBS="${CXXLIBS:=}" PIEFLAGS="" RELROFLAGS="" WARNING_OPTIONS="" if test -n "$GCC"; then # Add GCC-specific compiler options... # Address sanitizer is a useful tool to use when developing/debugging # code but adds about 2x overhead... if test x$enable_sanitizer = xyes; then # Use -fsanitize=address with debugging... OPTIM="$OPTIM -g -fsanitize=address" else # Otherwise use the Fortify enhancements to catch any unbounded # string operations... CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" fi # Default optimization options... if test -z "$OPTIM"; then # Default to optimize-for-size and debug OPTIM="-Os -g" fi # Generate position-independent code as needed... if test $PICFLAG = 1; then OPTIM="-fPIC $OPTIM" fi # The -fstack-protector option is available with some versions of # GCC and adds "stack canaries" which detect when the return address # has been overwritten, preventing many types of exploit attacks. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fstack-protector" >&5 $as_echo_n "checking whether compiler supports -fstack-protector... " >&6; } OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fstack-protector" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if test "x$LSB_BUILD" = xy; then # Can't use stack-protector with LSB binaries... OPTIM="$OPTIM -fno-stack-protector" else OPTIM="$OPTIM -fstack-protector" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$OLDCFLAGS" if test "x$LSB_BUILD" != xy; then # The -fPIE option is available with some versions of GCC and # adds randomization of addresses, which avoids another class of # exploits that depend on a fixed address for common functions. # # Not available to LSB binaries... { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5 $as_echo_n "checking whether compiler supports -fPIE... " >&6; } OLDCFLAGS="$CFLAGS" case "$host_os_name" in darwin*) CFLAGS="$CFLAGS -fPIE -Wl,-pie" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : PIEFLAGS="-fPIE -Wl,-pie" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; *) CFLAGS="$CFLAGS -fPIE -pie" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : PIEFLAGS="-fPIE -pie" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac CFLAGS="$OLDCFLAGS" fi # Add useful warning options for tracking down problems... WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion" # Test GCC version for certain warning flags since -Werror # doesn't trigger... gccversion=`$CC --version | head -1 | awk '{print $NF}'` case "$gccversion" in 1.* | 2.* | 3.* | 4.* | 5.* | 6.* | \(clang-*) ;; *) WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-format-overflow -Wno-tautological-compare" ;; esac # Additional warning options for development testing... if test -d .git; then WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS" fi else # Add vendor-specific compiler options... case $host_os_name in sunos*) # Solaris if test -z "$OPTIM"; then OPTIM="-xO2" fi if test $PICFLAG = 1; then OPTIM="-KPIC $OPTIM" fi ;; *) # Running some other operating system; inform the user # they should contribute the necessary options via # Github... echo "Building CUPS with default compiler optimizations; contact the CUPS developers on Github" echo "(https://github.com/apple/cups/issues) with the uname and compiler options needed for" echo "your platform, or set the CFLAGS and LDFLAGS environment variables before running" echo "configure." ;; esac fi # Add general compiler options per platform... case $host_os_name in linux*) # glibc 2.8 and higher breaks peer credentials unless you # define _GNU_SOURCE... OPTIM="$OPTIM -D_GNU_SOURCE" # The -z relro option is provided by the Linux linker command to # make relocatable data read-only. if test x$enable_relro = xyes; then RELROFLAGS="-Wl,-z,relro,-z,now" fi ;; esac ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" " #include #include #include #include #include " if test "x$ac_cv_header_resolv_h" = xyes; then : $as_echo "#define HAVE_RESOLV_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyaddr" >&5 $as_echo_n "checking for library containing gethostbyaddr... " >&6; } if ${ac_cv_search_gethostbyaddr+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyaddr (); int main () { return gethostbyaddr (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyaddr=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyaddr+:} false; then : break fi done if ${ac_cv_search_gethostbyaddr+:} false; then : else ac_cv_search_gethostbyaddr=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyaddr" >&5 $as_echo "$ac_cv_search_gethostbyaddr" >&6; } ac_res=$ac_cv_search_gethostbyaddr if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getifaddrs" >&5 $as_echo_n "checking for library containing getifaddrs... " >&6; } if ${ac_cv_search_getifaddrs+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getifaddrs (); int main () { return getifaddrs (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getifaddrs=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getifaddrs+:} false; then : break fi done if ${ac_cv_search_getifaddrs+:} false; then : else ac_cv_search_getifaddrs=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getifaddrs" >&5 $as_echo "$ac_cv_search_getifaddrs" >&6; } ac_res=$ac_cv_search_getifaddrs if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing hstrerror" >&5 $as_echo_n "checking for library containing hstrerror... " >&6; } if ${ac_cv_search_hstrerror+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char hstrerror (); int main () { return hstrerror (); ; return 0; } _ACEOF for ac_lib in '' nsl socket resolv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_hstrerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_hstrerror+:} false; then : break fi done if ${ac_cv_search_hstrerror+:} false; then : else ac_cv_search_hstrerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_hstrerror" >&5 $as_echo "$ac_cv_search_hstrerror" >&6; } ac_res=$ac_cv_search_hstrerror if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_HSTRERROR 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing rresvport_af" >&5 $as_echo_n "checking for library containing rresvport_af... " >&6; } if ${ac_cv_search_rresvport_af+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rresvport_af (); int main () { return rresvport_af (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_rresvport_af=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_rresvport_af+:} false; then : break fi done if ${ac_cv_search_rresvport_af+:} false; then : else ac_cv_search_rresvport_af=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_rresvport_af" >&5 $as_echo "$ac_cv_search_rresvport_af" >&6; } ac_res=$ac_cv_search_rresvport_af if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RRESVPORT_AF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __res_init" >&5 $as_echo_n "checking for library containing __res_init... " >&6; } if ${ac_cv_search___res_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __res_init (); int main () { return __res_init (); ; return 0; } _ACEOF for ac_lib in '' resolv bind; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search___res_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search___res_init+:} false; then : break fi done if ${ac_cv_search___res_init+:} false; then : else ac_cv_search___res_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search___res_init" >&5 $as_echo "$ac_cv_search___res_init" >&6; } ac_res=$ac_cv_search___res_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_9_init" >&5 $as_echo_n "checking for library containing res_9_init... " >&6; } if ${ac_cv_search_res_9_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char res_9_init (); int main () { return res_9_init (); ; return 0; } _ACEOF for ac_lib in '' resolv bind; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_res_9_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_res_9_init+:} false; then : break fi done if ${ac_cv_search_res_9_init+:} false; then : else ac_cv_search_res_9_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_9_init" >&5 $as_echo "$ac_cv_search_res_9_init" >&6; } ac_res=$ac_cv_search_res_9_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 $as_echo_n "checking for library containing res_init... " >&6; } if ${ac_cv_search_res_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char res_init (); int main () { return res_init (); ; return 0; } _ACEOF for ac_lib in '' resolv bind; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_res_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_res_init+:} false; then : break fi done if ${ac_cv_search_res_init+:} false; then : else ac_cv_search_res_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_init" >&5 $as_echo "$ac_cv_search_res_init" >&6; } ac_res=$ac_cv_search_res_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h fi fi fi # Tru64 5.1b leaks file descriptors with these functions; disable until # we can come up with a test for this... if test "$host_os_name" != "osf1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5 $as_echo_n "checking for library containing getaddrinfo... " >&6; } if ${ac_cv_search_getaddrinfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getaddrinfo (); int main () { return getaddrinfo (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getaddrinfo=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getaddrinfo+:} false; then : break fi done if ${ac_cv_search_getaddrinfo+:} false; then : else ac_cv_search_getaddrinfo=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getaddrinfo" >&5 $as_echo "$ac_cv_search_getaddrinfo" >&6; } ac_res=$ac_cv_search_getaddrinfo if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getnameinfo" >&5 $as_echo_n "checking for library containing getnameinfo... " >&6; } if ${ac_cv_search_getnameinfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getnameinfo (); int main () { return getnameinfo (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getnameinfo=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getnameinfo+:} false; then : break fi done if ${ac_cv_search_getnameinfo+:} false; then : else ac_cv_search_getnameinfo=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getnameinfo" >&5 $as_echo "$ac_cv_search_getnameinfo" >&6; } ac_res=$ac_cv_search_getnameinfo if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_GETNAMEINFO 1" >>confdefs.h fi fi ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include " if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then : fi ac_fn_c_check_header_mongrel "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sockio_h" = xyes; then : $as_echo "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h fi CUPS_DEFAULT_DOMAINSOCKET="" # Check whether --with-domainsocket was given. if test "${with_domainsocket+set}" = set; then : withval=$with_domainsocket; default_domainsocket="$withval" else default_domainsocket="" fi if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then if test "x$default_domainsocket" = x; then case "$host_os_name" in darwin*) # Darwin and macOS do their own thing... CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" ;; *) # All others use FHS standard... CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" ;; esac else CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" fi CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_DOMAINSOCKET "$CUPS_DEFAULT_DOMAINSOCKET" _ACEOF else CUPS_LISTEN_DOMAINSOCKET="" fi ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" if test "x$ac_cv_func_poll" = xyes; then : $as_echo "#define HAVE_POLL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "epoll_create" "ac_cv_func_epoll_create" if test "x$ac_cv_func_epoll_create" = xyes; then : $as_echo "#define HAVE_EPOLL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue" if test "x$ac_cv_func_kqueue" = xyes; then : $as_echo "#define HAVE_KQUEUE 1" >>confdefs.h fi # Check whether --enable-gssapi was given. if test "${enable_gssapi+set}" = set; then : enableval=$enable_gssapi; fi LIBGSSAPI="" if test x$enable_gssapi != xno; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}krb5-config", so it can be a program name with args. set dummy ${ac_tool_prefix}krb5-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_KRB5CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $KRB5CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_KRB5CONFIG="$KRB5CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_KRB5CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi KRB5CONFIG=$ac_cv_path_KRB5CONFIG if test -n "$KRB5CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KRB5CONFIG" >&5 $as_echo "$KRB5CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_KRB5CONFIG"; then ac_pt_KRB5CONFIG=$KRB5CONFIG # Extract the first word of "krb5-config", so it can be a program name with args. set dummy krb5-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_KRB5CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_KRB5CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_KRB5CONFIG="$ac_pt_KRB5CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_KRB5CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_KRB5CONFIG=$ac_cv_path_ac_pt_KRB5CONFIG if test -n "$ac_pt_KRB5CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_KRB5CONFIG" >&5 $as_echo "$ac_pt_KRB5CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_KRB5CONFIG" = x; then KRB5CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac KRB5CONFIG=$ac_pt_KRB5CONFIG fi else KRB5CONFIG="$ac_cv_path_KRB5CONFIG" fi if test "x$KRB5CONFIG" != x; then case "$host_os_name" in darwin) # macOS weak-links to the Kerberos framework... LIBGSSAPI="-weak_framework Kerberos" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS framework" >&5 $as_echo_n "checking for GSS framework... " >&6; } if test -d /System/Library/Frameworks/GSS.framework; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; sunos*) # Solaris has a non-standard krb5-config, don't use it! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 $as_echo_n "checking for gss_display_status in -lgss... " >&6; } if ${ac_cv_lib_gss_gss_display_status+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgss $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gss_display_status (); int main () { return gss_display_status (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gss_gss_display_status=yes else ac_cv_lib_gss_gss_display_status=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 $as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } if test "x$ac_cv_lib_gss_gss_display_status" = xyes; then : $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS" CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS" LIBGSSAPI="-lgss `$KRB5CONFIG --libs`" fi ;; *) # Other platforms just ask for GSSAPI CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS" CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS" LIBGSSAPI="`$KRB5CONFIG --libs gssapi`" ;; esac $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h else # Check for vendor-specific implementations... case "$host_os_name" in hp-ux*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 $as_echo_n "checking for gss_display_status in -lgss... " >&6; } if ${ac_cv_lib_gss_gss_display_status+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgss $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gss_display_status (); int main () { return gss_display_status (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gss_gss_display_status=yes else ac_cv_lib_gss_gss_display_status=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 $as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } if test "x$ac_cv_lib_gss_gss_display_status" = xyes; then : $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h LIBGSSAPI="-lgss -lgssapi_krb5" fi ;; sunos*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 $as_echo_n "checking for gss_display_status in -lgss... " >&6; } if ${ac_cv_lib_gss_gss_display_status+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgss $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gss_display_status (); int main () { return gss_display_status (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gss_gss_display_status=yes else ac_cv_lib_gss_gss_display_status=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 $as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } if test "x$ac_cv_lib_gss_gss_display_status" = xyes; then : $as_echo "#define HAVE_GSSAPI 1" >>confdefs.h LIBGSSAPI="-lgss" fi ;; esac fi if test "x$LIBGSSAPI" != x; then ac_fn_c_check_header_mongrel "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" if test "x$ac_cv_header_krb5_h" = xyes; then : $as_echo "#define HAVE_KRB5_H 1" >>confdefs.h fi if test -d /System/Library/Frameworks/GSS.framework; then ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi.h" "ac_cv_header_GSS_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_GSS_gssapi_h" = xyes; then : $as_echo "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi_generic.h" "ac_cv_header_GSS_gssapi_generic_h" "$ac_includes_default" if test "x$ac_cv_header_GSS_gssapi_generic_h" = xyes; then : $as_echo "#define HAVE_GSS_GSSAPI_GENERIC_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "GSS/gssapi_spi.h" "ac_cv_header_GSS_gssapi_spi_h" "$ac_includes_default" if test "x$ac_cv_header_GSS_gssapi_spi_h" = xyes; then : $as_echo "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h fi else ac_fn_c_check_header_mongrel "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_gssapi_h" = xyes; then : $as_echo "#define HAVE_GSSAPI_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "gssapi/gssapi.h" "ac_cv_header_gssapi_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_gssapi_gssapi_h" = xyes; then : $as_echo "#define HAVE_GSSAPI_GSSAPI_H 1" >>confdefs.h fi fi SAVELIBS="$LIBS" LIBS="$LIBS $LIBGSSAPI" ac_fn_c_check_func "$LINENO" "__ApplePrivate_gss_acquire_cred_ex_f" "ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" if test "x$ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" = xyes; then : $as_echo "#define HAVE_GSS_ACQUIRE_CRED_EX_F 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS_C_NT_HOSTBASED_SERVICE" >&5 $as_echo_n "checking for GSS_C_NT_HOSTBASED_SERVICE... " >&6; } if test x$ac_cv_header_gssapi_gssapi_h = xyes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext elif test x$ac_cv_header_gss_gssapi_h = xyes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi LIBS="$SAVELIBS" fi fi # Check whether --with-gssservicename was given. if test "${with_gssservicename+set}" = set; then : withval=$with_gssservicename; default_gssservicename="$withval" else default_gssservicename="default" fi if test x$default_gssservicename != xno; then if test "x$default_gssservicename" = "xdefault"; then CUPS_DEFAULT_GSSSERVICENAME="host" else CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" fi else CUPS_DEFAULT_GSSSERVICENAME="" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_GSSSERVICENAME "$CUPS_DEFAULT_GSSSERVICENAME" _ACEOF # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; fi have_pthread=no PTHREAD_FLAGS="" if test "x$enable_threads" != xno; then ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h fi if test x$ac_cv_header_pthread_h = xyes; then for flag in -lpthreads -lpthread -pthread; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 $as_echo_n "checking for pthread_create using $flag... " >&6; } SAVELIBS="$LIBS" LIBS="$flag $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_create(0, 0, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_pthread=yes else LIBS="$SAVELIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 $as_echo "$have_pthread" >&6; } if test $have_pthread = yes; then PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to # be POSIX-compliant... :( if test $host_os_name = sunos; then PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" fi break fi done fi fi # Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; fi # Check whether --enable-cdsassl was given. if test "${enable_cdsassl+set}" = set; then : enableval=$enable_cdsassl; fi # Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; fi SSLFLAGS="" SSLLIBS="" have_ssl=0 CUPS_SERVERKEYCHAIN="" if test x$enable_ssl != xno; then if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then if test $host_os_name = darwin; then ac_fn_c_check_header_mongrel "$LINENO" "Security/SecureTransport.h" "ac_cv_header_Security_SecureTransport_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecureTransport_h" = xyes; then : have_ssl=1 $as_echo "#define HAVE_SSL 1" >>confdefs.h $as_echo "#define HAVE_CDSASSL 1" >>confdefs.h CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain" ac_fn_c_check_header_mongrel "$LINENO" "Security/SecCertificate.h" "ac_cv_header_Security_SecCertificate_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecCertificate_h" = xyes; then : $as_echo "#define HAVE_SECCERTIFICATE_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "Security/SecItem.h" "ac_cv_header_Security_SecItem_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecItem_h" = xyes; then : $as_echo "#define HAVE_SECITEM_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "Security/SecPolicy.h" "ac_cv_header_Security_SecPolicy_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecPolicy_h" = xyes; then : $as_echo "#define HAVE_SECPOLICY_H 1" >>confdefs.h fi fi fi fi if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}libgnutls-config", so it can be a program name with args. set dummy ${ac_tool_prefix}libgnutls-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LIBGNUTLSCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $LIBGNUTLSCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_LIBGNUTLSCONFIG="$LIBGNUTLSCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LIBGNUTLSCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LIBGNUTLSCONFIG=$ac_cv_path_LIBGNUTLSCONFIG if test -n "$LIBGNUTLSCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGNUTLSCONFIG" >&5 $as_echo "$LIBGNUTLSCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_LIBGNUTLSCONFIG"; then ac_pt_LIBGNUTLSCONFIG=$LIBGNUTLSCONFIG # Extract the first word of "libgnutls-config", so it can be a program name with args. set dummy libgnutls-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_LIBGNUTLSCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_LIBGNUTLSCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_LIBGNUTLSCONFIG="$ac_pt_LIBGNUTLSCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_LIBGNUTLSCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_LIBGNUTLSCONFIG=$ac_cv_path_ac_pt_LIBGNUTLSCONFIG if test -n "$ac_pt_LIBGNUTLSCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGNUTLSCONFIG" >&5 $as_echo "$ac_pt_LIBGNUTLSCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_LIBGNUTLSCONFIG" = x; then LIBGNUTLSCONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIBGNUTLSCONFIG=$ac_pt_LIBGNUTLSCONFIG fi else LIBGNUTLSCONFIG="$ac_cv_path_LIBGNUTLSCONFIG" fi if $PKGCONFIG --exists gnutls; then have_ssl=1 SSLLIBS=`$PKGCONFIG --libs gnutls` SSLFLAGS=`$PKGCONFIG --cflags gnutls` $as_echo "#define HAVE_SSL 1" >>confdefs.h $as_echo "#define HAVE_GNUTLS 1" >>confdefs.h elif test "x$LIBGNUTLSCONFIG" != x; then have_ssl=1 SSLLIBS=`$LIBGNUTLSCONFIG --libs` SSLFLAGS=`$LIBGNUTLSCONFIG --cflags` $as_echo "#define HAVE_SSL 1" >>confdefs.h $as_echo "#define HAVE_GNUTLS 1" >>confdefs.h fi if test $have_ssl = 1; then CUPS_SERVERKEYCHAIN="ssl" SAVELIBS="$LIBS" LIBS="$LIBS $SSLLIBS" ac_fn_c_check_func "$LINENO" "gnutls_transport_set_pull_timeout_function" "ac_cv_func_gnutls_transport_set_pull_timeout_function" if test "x$ac_cv_func_gnutls_transport_set_pull_timeout_function" = xyes; then : $as_echo "#define HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "gnutls_priority_set_direct" "ac_cv_func_gnutls_priority_set_direct" if test "x$ac_cv_func_gnutls_priority_set_direct" = xyes; then : $as_echo "#define HAVE_GNUTLS_PRIORITY_SET_DIRECT 1" >>confdefs.h fi LIBS="$SAVELIBS" fi fi fi IPPALIASES="http" if test $have_ssl = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSLLIBS=\"$SSLLIBS\"" >&5 $as_echo " Using SSLLIBS=\"$SSLLIBS\"" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSLFLAGS=\"$SSLFLAGS\"" >&5 $as_echo " Using SSLFLAGS=\"$SSLFLAGS\"" >&6; } IPPALIASES="http https ipps" elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then as_fn_error $? "Unable to enable SSL support." "$LINENO" 5 fi EXPORT_SSLLIBS="$SSLLIBS" # Check whether --enable-pam was given. if test "${enable_pam+set}" = set; then : enableval=$enable_pam; fi # Check whether --with-pam_module was given. if test "${with_pam_module+set}" = set; then : withval=$with_pam_module; fi PAMDIR="" PAMFILE="pam.std" PAMLIBS="" PAMMOD="pam_unknown.so" PAMMODAUTH="pam_unknown.so" if test x$enable_pam != xno; then SAVELIBS="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 $as_echo_n "checking for pam_start in -lpam... " >&6; } if ${ac_cv_lib_pam_pam_start+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpam $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pam_start (); int main () { return pam_start (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pam_pam_start=yes else ac_cv_lib_pam_pam_start=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_start" >&5 $as_echo "$ac_cv_lib_pam_pam_start" >&6; } if test "x$ac_cv_lib_pam_pam_start" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPAM 1 _ACEOF LIBS="-lpam $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_set_item in -lpam" >&5 $as_echo_n "checking for pam_set_item in -lpam... " >&6; } if ${ac_cv_lib_pam_pam_set_item+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpam $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pam_set_item (); int main () { return pam_set_item (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pam_pam_set_item=yes else ac_cv_lib_pam_pam_set_item=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_set_item" >&5 $as_echo "$ac_cv_lib_pam_pam_set_item" >&6; } if test "x$ac_cv_lib_pam_pam_set_item" = xyes; then : $as_echo "#define HAVE_PAM_SET_ITEM 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_setcred in -lpam" >&5 $as_echo_n "checking for pam_setcred in -lpam... " >&6; } if ${ac_cv_lib_pam_pam_setcred+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpam $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pam_setcred (); int main () { return pam_setcred (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pam_pam_setcred=yes else ac_cv_lib_pam_pam_setcred=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_setcred" >&5 $as_echo "$ac_cv_lib_pam_pam_setcred" >&6; } if test "x$ac_cv_lib_pam_pam_setcred" = xyes; then : $as_echo "#define HAVE_PAM_SETCRED 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" if test "x$ac_cv_header_security_pam_appl_h" = xyes; then : fi if test x$ac_cv_header_security_pam_appl_h != xyes; then ac_fn_c_check_header_mongrel "$LINENO" "pam/pam_appl.h" "ac_cv_header_pam_pam_appl_h" "$ac_includes_default" if test "x$ac_cv_header_pam_pam_appl_h" = xyes; then : $as_echo "#define HAVE_PAM_PAM_APPL_H 1" >>confdefs.h fi fi if test x$ac_cv_lib_pam_pam_start != xno; then # Set the necessary libraries for PAM... if test x$ac_cv_lib_dl_dlopen != xno; then PAMLIBS="-lpam -ldl" else PAMLIBS="-lpam" fi # Find the PAM configuration directory, if any... for dir in /private/etc/pam.d /etc/pam.d; do if test -d $dir; then PAMDIR=$dir break; fi done fi LIBS="$SAVELIBS" case "$host_os_name" in darwin*) # Darwin/macOS if test "x$with_pam_module" != x; then PAMFILE="pam.$with_pam_module" elif test -f /usr/lib/pam/pam_opendirectory.so.2; then PAMFILE="pam.opendirectory" else PAMFILE="pam.securityserver" fi ;; *) # All others; this test might need to be updated # as Linux distributors move things around... if test "x$with_pam_module" != x; then PAMMOD="pam_${with_pam_module}.so" elif test -f /etc/pam.d/common-auth; then PAMFILE="pam.common" else moddir="" for dir in /lib/security /lib64/security /lib/x86_64-linux-gnu/security /var/lib/pam; do if test -d $dir; then moddir=$dir break; fi done if test -f $moddir/pam_unix2.so; then PAMMOD="pam_unix2.so" elif test -f $moddir/pam_unix.so; then PAMMOD="pam_unix.so" fi fi if test "x$PAMMOD" = xpam_unix.so; then PAMMODAUTH="$PAMMOD shadow nodelay" else PAMMODAUTH="$PAMMOD nodelay" fi ;; esac fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi LARGEFILE="" if test x$enable_largefile != xno; then LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" if test x$ac_cv_sys_large_files = x1; then LARGEFILE="$LARGEFILE -D_LARGE_FILES" fi if test x$ac_cv_sys_file_offset_bits = x64; then LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 $as_echo_n "checking for long long int... " >&6; } if ${ac_cv_c_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if test "$GCC" = yes; then ac_cv_c_long_long=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { long long int i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_long_long=yes else ac_cv_c_long_long=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_long_long" >&5 $as_echo "$ac_cv_c_long_long" >&6; } if test $ac_cv_c_long_long = yes; then $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" if test "x$ac_cv_func_strtoll" = xyes; then : $as_echo "#define HAVE_STRTOLL 1" >>confdefs.h fi # Check whether --enable-avahi was given. if test "${enable_avahi+set}" = set; then : enableval=$enable_avahi; fi # Check whether --enable-dnssd was given. if test "${enable_dnssd+set}" = set; then : enableval=$enable_dnssd; fi # Check whether --with-dnssd-libs was given. if test "${with_dnssd_libs+set}" = set; then : withval=$with_dnssd_libs; LDFLAGS="-L$withval $LDFLAGS" DSOFLAGS="-L$withval $DSOFLAGS" fi # Check whether --with-dnssd-includes was given. if test "${with_dnssd_includes+set}" = set; then : withval=$with_dnssd_includes; CFLAGS="-I$withval $CFLAGS" CPPFLAGS="-I$withval $CPPFLAGS" fi DNSSDLIBS="" DNSSD_BACKEND="" IPPFIND_BIN="" IPPFIND_MAN="" if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$host_os_name != xdarwin; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Avahi" >&5 $as_echo_n "checking for Avahi... " >&6; } if $PKGCONFIG --exists avahi-client; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" DNSSD_BACKEND="dnssd" IPPFIND_BIN="ippfind" IPPFIND_MAN="ippfind.1" $as_echo "#define HAVE_AVAHI 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then ac_fn_c_check_header_mongrel "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" if test "x$ac_cv_header_dns_sd_h" = xyes; then : case "$host_os_name" in darwin*) # Darwin and macOS... $as_echo "#define HAVE_DNSSD 1" >>confdefs.h DNSSD_BACKEND="dnssd" IPPFIND_BIN="ippfind" IPPFIND_MAN="ippfind.1" ;; *) # All others... { $as_echo "$as_me:${as_lineno-$LINENO}: checking for current version of dns_sd library" >&5 $as_echo_n "checking for current version of dns_sd library... " >&6; } SAVELIBS="$LIBS" LIBS="$LIBS -ldns_sd" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int constant = kDNSServiceFlagsShareConnection; unsigned char txtRecord[100]; uint8_t valueLen; TXTRecordGetValuePtr(sizeof(txtRecord), txtRecord, "value", &valueLen); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_DNSSD 1" >>confdefs.h DNSSDLIBS="-ldns_sd" DNSSD_BACKEND="dnssd" else IPPFIND_BIN="ippfind" IPPFIND_MAN="ippfind.1" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext LIBS="$SAVELIBS" ;; esac fi fi ONDEMANDFLAGS="" ONDEMANDLIBS="" # Check whether --enable-launchd was given. if test "${enable_launchd+set}" = set; then : enableval=$enable_launchd; fi LAUNCHD_DIR="" if test x$enable_launchd != xno; then ac_fn_c_check_func "$LINENO" "launch_activate_socket" "ac_cv_func_launch_activate_socket" if test "x$ac_cv_func_launch_activate_socket" = xyes; then : $as_echo "#define HAVE_LAUNCHD 1" >>confdefs.h $as_echo "#define HAVE_ONDEMAND 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "launch.h" "ac_cv_header_launch_h" "$ac_includes_default" if test "x$ac_cv_header_launch_h" = xyes; then : $as_echo "#define HAVE_LAUNCH_H 1" >>confdefs.h fi if test "$host_os_name" = darwin; then LAUNCHD_DIR="/System/Library/LaunchDaemons" # liblaunch is already part of libSystem fi fi # Check whether --enable-systemd was given. if test "${enable_systemd+set}" = set; then : enableval=$enable_systemd; fi # Check whether --with-systemd was given. if test "${with_systemd+set}" = set; then : withval=$with_systemd; SYSTEMD_DIR="$withval" else SYSTEMD_DIR="" fi if test x$enable_systemd != xno; then if test "x$PKGCONFIG" = x; then if test x$enable_systemd = xyes; then as_fn_error $? "Need pkg-config to enable systemd support." "$LINENO" 5 fi else have_systemd=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5 $as_echo_n "checking for libsystemd... " >&6; } if $PKGCONFIG --exists libsystemd; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_systemd=yes ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd` ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd` elif $PKGCONFIG --exists libsystemd-daemon; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - legacy" >&5 $as_echo "yes - legacy" >&6; } have_systemd=yes ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd-daemon` ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd-daemon` if $PKGCONFIG --exists libsystemd-journal; then ONDEMANDFLAGS="$ONDEMANDFLAGS `$PKGCONFIG --cflags libsystemd-journal`" ONDEMANDLIBS="$ONDEMANDLIBS `$PKGCONFIG --libs libsystemd-journal`" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test $have_systemd = yes; then $as_echo "#define HAVE_SYSTEMD 1" >>confdefs.h $as_echo "#define HAVE_ONDEMAND 1" >>confdefs.h ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-journal.h" "ac_cv_header_systemd_sd_journal_h" "$ac_includes_default" if test "x$ac_cv_header_systemd_sd_journal_h" = xyes; then : $as_echo "#define HAVE_SYSTEMD_SD_JOURNAL_H 1" >>confdefs.h fi if test "x$SYSTEMD_DIR" = x; then SYSTEMD_DIR="`$PKGCONFIG --variable=systemdsystemunitdir systemd`" fi fi fi fi # Check whether --enable-upstart was given. if test "${enable_upstart+set}" = set; then : enableval=$enable_upstart; fi if test "x$enable_upstart" = "xyes"; then if test "x$have_systemd" = "xyes"; then as_fn_error $? "Cannot support both systemd and upstart." "$LINENO" 5 fi $as_echo "#define HAVE_UPSTART 1" >>confdefs.h $as_echo "#define HAVE_ONDEMAND 1" >>confdefs.h fi SMFMANIFESTDIR="" # Check whether --with-smfmanifestdir was given. if test "${with_smfmanifestdir+set}" = set; then : withval=$with_smfmanifestdir; SMFMANIFESTDIR="$withval" fi # Check whether --with-rcdir was given. if test "${with_rcdir+set}" = set; then : withval=$with_rcdir; rcdir="$withval" else rcdir="" fi # Check whether --with-rclevels was given. if test "${with_rclevels+set}" = set; then : withval=$with_rclevels; rclevels="$withval" else rclevels="2 3 5" fi # Check whether --with-rcstart was given. if test "${with_rcstart+set}" = set; then : withval=$with_rcstart; rcstart="$withval" else rcstart="" fi # Check whether --with-rcstop was given. if test "${with_rcstop+set}" = set; then : withval=$with_rcstop; rcstop="$withval" else rcstop="" fi if test x$rcdir = x; then if test x$LAUNCHD_DIR = x -a x$SYSTEMD_DIR = x -a x$SMFMANIFESTDIR = x; then # Fall back on "init", the original service startup interface... if test -d /sbin/init.d; then # SuSE rcdir="/sbin/init.d" elif test -d /etc/init.d; then # Others rcdir="/etc" else # RedHat, NetBSD rcdir="/etc/rc.d" fi else rcdir="no" fi fi if test "x$rcstart" = x; then case "$host_os_name" in linux* | gnu*) # Linux rcstart="81" ;; sunos*) # Solaris rcstart="81" ;; *) # Others rcstart="99" ;; esac fi if test "x$rcstop" = x; then case "$host_os_name" in linux* | gnu*) # Linux rcstop="36" ;; *) # Others rcstop="00" ;; esac fi INITDIR="" INITDDIR="" RCLEVELS="$rclevels" RCSTART="$rcstart" RCSTOP="$rcstop" if test "x$rcdir" != xno; then if test "x$rclevels" = x; then INITDDIR="$rcdir" else INITDIR="$rcdir" fi fi # Check whether --with-xinetd was given. if test "${with_xinetd+set}" = set; then : withval=$with_xinetd; xinetd="$withval" else xinetd="" fi XINETD="" if test "x$xinetd" = x; then if test ! -x /sbin/launchd; then for dir in /etc/xinetd.d /usr/local/etc/xinetd.d; do if test -d $dir; then XINETD="$dir" break fi done fi elif test "x$xinetd" != xno; then XINETD="$xinetd" fi LANGUAGES="`ls -1 locale/cups_*.po 2>/dev/null | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' '`" # Check whether --with-languages was given. if test "${with_languages+set}" = set; then : withval=$with_languages; case "$withval" in none | no) LANGUAGES="" ;; all) ;; *) LANGUAGES="$withval" ;; esac fi # Check whether --with-bundledir was given. if test "${with_bundledir+set}" = set; then : withval=$with_bundledir; CUPS_BUNDLEDIR="$withval" else if test "x$host_os_name" = xdarwin -a $host_os_version -ge 100; then CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" LANGUAGES="" else CUPS_BUNDLEDIR="" fi fi if test "x$CUPS_BUNDLEDIR" != x; then cat >>confdefs.h <<_ACEOF #define CUPS_BUNDLEDIR "$CUPS_BUNDLEDIR" _ACEOF fi # Check whether --with-bundlelang was given. if test "${with_bundlelang+set}" = set; then : withval=$with_bundlelang; cups_bundlelang="$withval" else if test $host_os_version -ge 190; then cups_bundlelang="en" else cups_bundlelang="English" fi fi if test "x$cups_bundlelang" != x -a "x$CUPS_BUNDLEDIR" != x; then CUPS_RESOURCEDIR="$CUPS_BUNDLEDIR/Resources/$cups_bundlelang.lproj" else CUPS_RESOURCEDIR="" fi # Check whether --with-exe_file_perm was given. if test "${with_exe_file_perm+set}" = set; then : withval=$with_exe_file_perm; CUPS_EXE_FILE_PERM="$withval" else case "$host_os_name" in linux* | gnu*) CUPS_EXE_FILE_PERM="755" ;; *) CUPS_EXE_FILE_PERM="555" ;; esac fi # Check whether --with-config_file_perm was given. if test "${with_config_file_perm+set}" = set; then : withval=$with_config_file_perm; CUPS_CONFIG_FILE_PERM="$withval" else if test "x$host_os_name" = xdarwin; then CUPS_CONFIG_FILE_PERM="644" else CUPS_CONFIG_FILE_PERM="640" fi fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_CONFIG_FILE_PERM 0$CUPS_CONFIG_FILE_PERM _ACEOF # Check whether --with-cupsd_file_perm was given. if test "${with_cupsd_file_perm+set}" = set; then : withval=$with_cupsd_file_perm; CUPS_CUPSD_FILE_PERM="$withval" else case "$host_os_name" in linux* | gnu*) CUPS_CUPSD_FILE_PERM="700" ;; *) CUPS_CUPSD_FILE_PERM="500" ;; esac fi # Check whether --with-log_file_perm was given. if test "${with_log_file_perm+set}" = set; then : withval=$with_log_file_perm; CUPS_LOG_FILE_PERM="$withval" else CUPS_LOG_FILE_PERM="644" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_LOG_FILE_PERM 0$CUPS_LOG_FILE_PERM _ACEOF # Check whether --with-fatal_errors was given. if test "${with_fatal_errors+set}" = set; then : withval=$with_fatal_errors; CUPS_FATAL_ERRORS="$withval" else CUPS_FATAL_ERRORS="config" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_FATAL_ERRORS "$CUPS_FATAL_ERRORS" _ACEOF # Check whether --with-log_level was given. if test "${with_log_level+set}" = set; then : withval=$with_log_level; CUPS_LOG_LEVEL="$withval" else CUPS_LOG_LEVEL="warn" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_LOG_LEVEL "$CUPS_LOG_LEVEL" _ACEOF # Check whether --with-access_log_level was given. if test "${with_access_log_level+set}" = set; then : withval=$with_access_log_level; CUPS_ACCESS_LOG_LEVEL="$withval" else CUPS_ACCESS_LOG_LEVEL="none" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_ACCESS_LOG_LEVEL "$CUPS_ACCESS_LOG_LEVEL" _ACEOF # Check whether --enable-page_logging was given. if test "${enable_page_logging+set}" = set; then : enableval=$enable_page_logging; fi if test "x$enable_page_logging" = xyes; then CUPS_PAGE_LOG_FORMAT="" else CUPS_PAGE_LOG_FORMAT="PageLogFormat" fi # Check whether --enable-browsing was given. if test "${enable_browsing+set}" = set; then : enableval=$enable_browsing; fi if test "x$enable_browsing" = xno; then CUPS_BROWSING="No" cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_BROWSING 0 _ACEOF else CUPS_BROWSING="Yes" cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_BROWSING 1 _ACEOF fi # Check whether --with-local_protocols was given. if test "${with_local_protocols+set}" = set; then : withval=$with_local_protocols; default_local_protocols="$withval" else default_local_protocols="default" fi if test x$with_local_protocols != xno; then if test "x$default_local_protocols" = "xdefault"; then if test "x$DNSSD_BACKEND" != "x"; then CUPS_BROWSE_LOCAL_PROTOCOLS="dnssd" else CUPS_BROWSE_LOCAL_PROTOCOLS="" fi else CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" fi else CUPS_BROWSE_LOCAL_PROTOCOLS="" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "$CUPS_BROWSE_LOCAL_PROTOCOLS" _ACEOF # Check whether --enable-default_shared was given. if test "${enable_default_shared+set}" = set; then : enableval=$enable_default_shared; fi if test "x$enable_default_shared" = xno; then CUPS_DEFAULT_SHARED="No" cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_DEFAULT_SHARED 0 _ACEOF else CUPS_DEFAULT_SHARED="Yes" cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_DEFAULT_SHARED 1 _ACEOF fi # Check whether --with-cups_user was given. if test "${with_cups_user+set}" = set; then : withval=$with_cups_user; CUPS_USER="$withval" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default print user" >&5 $as_echo_n "checking for default print user... " >&6; } if test x$host_os_name = xdarwin; then if test x`id -u _lp 2>/dev/null` = x; then CUPS_USER="lp"; else CUPS_USER="_lp"; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_USER" >&5 $as_echo "$CUPS_USER" >&6; } elif test -f /etc/passwd; then CUPS_USER="" for user in lp lpd guest daemon nobody; do if test "`grep \^${user}: /etc/passwd`" != ""; then CUPS_USER="$user" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $user" >&5 $as_echo "$user" >&6; } break; fi done if test x$CUPS_USER = x; then CUPS_USER="nobody" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else CUPS_USER="nobody" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no password file" >&5 $as_echo "no password file" >&6; } fi fi if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then as_fn_error $? "The default user for CUPS cannot be root!" "$LINENO" 5 fi # Check whether --with-cups_group was given. if test "${with_cups_group+set}" = set; then : withval=$with_cups_group; CUPS_GROUP="$withval" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default print group" >&5 $as_echo_n "checking for default print group... " >&6; } if test x$host_os_name = xdarwin; then if test x`id -g _lp 2>/dev/null` = x; then CUPS_GROUP="lp"; else CUPS_GROUP="_lp"; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_GROUP" >&5 $as_echo "$CUPS_GROUP" >&6; } elif test -f /etc/group; then GROUP_LIST="_lp lp nobody" CUPS_GROUP="" for group in $GROUP_LIST; do if test "`grep \^${group}: /etc/group`" != ""; then CUPS_GROUP="$group" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $group" >&5 $as_echo "$group" >&6; } break; fi done if test x$CUPS_GROUP = x; then CUPS_GROUP="nobody" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else CUPS_GROUP="nobody" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 $as_echo "no group file" >&6; } fi fi if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then as_fn_error $? "The default group for CUPS cannot be root!" "$LINENO" 5 fi # Check whether --with-system_groups was given. if test "${with_system_groups+set}" = set; then : withval=$with_system_groups; CUPS_SYSTEM_GROUPS="$withval" else if test x$host_os_name = xdarwin; then CUPS_SYSTEM_GROUPS="admin" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default system groups" >&5 $as_echo_n "checking for default system groups... " >&6; } if test -f /etc/group; then CUPS_SYSTEM_GROUPS="" 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 CUPS_SYSTEM_GROUPS="$group" else CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" fi fi done if test "x$CUPS_SYSTEM_GROUPS" = x; then CUPS_SYSTEM_GROUPS="$GROUP_LIST" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no groups found" >&5 $as_echo "no groups found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$CUPS_SYSTEM_GROUPS\"" >&5 $as_echo "\"$CUPS_SYSTEM_GROUPS\"" >&6; } fi else CUPS_SYSTEM_GROUPS="$GROUP_LIST" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 $as_echo "no group file" >&6; } fi fi fi CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`" for group in $CUPS_SYSTEM_GROUPS; do if test "x$CUPS_GROUP" = "x$group"; then as_fn_error $? "The default system groups cannot contain the default CUPS group!" "$LINENO" 5 fi done cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_USER "$CUPS_USER" _ACEOF cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_GROUP "$CUPS_GROUP" _ACEOF cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_SYSTEM_GROUPS "$CUPS_SYSTEM_GROUPS" _ACEOF # Check whether --with-printcap was given. if test "${with_printcap+set}" = set; then : withval=$with_printcap; default_printcap="$withval" else default_printcap="default" fi if test x$default_printcap != xno; then if test "x$default_printcap" = "xdefault"; then case $host_os_name in darwin*) if test $host_os_version -ge 90; then CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" else CUPS_DEFAULT_PRINTCAP="/etc/printcap" fi ;; sunos*) CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" ;; *) CUPS_DEFAULT_PRINTCAP="/etc/printcap" ;; esac else CUPS_DEFAULT_PRINTCAP="$default_printcap" fi else CUPS_DEFAULT_PRINTCAP="" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_PRINTCAP "$CUPS_DEFAULT_PRINTCAP" _ACEOF # Check whether --with-lpdconfigfile was given. if test "${with_lpdconfigfile+set}" = set; then : withval=$with_lpdconfigfile; default_lpdconfigfile="$withval" else default_lpdconfigfile="default" fi if test x$default_lpdconfigfile != xno; then if test "x$default_lpdconfigfile" = "xdefault"; then case $host_os_name in darwin*) CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" ;; *) if test "x$XINETD" != x; then CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd" else CUPS_DEFAULT_LPD_CONFIG_FILE="" fi ;; esac else CUPS_DEFAULT_LPD_CONFIG_FILE="$default_lpdconfigfile" fi else CUPS_DEFAULT_LPD_CONFIG_FILE="" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_LPD_CONFIG_FILE "$CUPS_DEFAULT_LPD_CONFIG_FILE" _ACEOF # Check whether --with-smbconfigfile was given. if test "${with_smbconfigfile+set}" = set; then : withval=$with_smbconfigfile; default_smbconfigfile="$withval" else default_smbconfigfile="default" fi if test x$default_smbconfigfile != xno; then if test "x$default_smbconfigfile" = "xdefault"; then if test -f /etc/smb.conf; then CUPS_DEFAULT_SMB_CONFIG_FILE="samba:///etc/smb.conf" else CUPS_DEFAULT_SMB_CONFIG_FILE="" fi else CUPS_DEFAULT_SMB_CONFIG_FILE="$default_smbconfigfile" fi else CUPS_DEFAULT_SMB_CONFIG_FILE="" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_SMB_CONFIG_FILE "$CUPS_DEFAULT_SMB_CONFIG_FILE" _ACEOF # Check whether --with-max-copies was given. if test "${with_max_copies+set}" = set; then : withval=$with_max_copies; CUPS_MAX_COPIES="$withval" else CUPS_MAX_COPIES="9999" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_MAX_COPIES $CUPS_MAX_COPIES _ACEOF # Check whether --enable-raw_printing was given. if test "${enable_raw_printing+set}" = set; then : enableval=$enable_raw_printing; fi if test "x$enable_raw_printing" != xno; then DEFAULT_RAW_PRINTING="" else DEFAULT_RAW_PRINTING="#" fi # Check whether --with-snmp-address was given. if test "${with_snmp_address+set}" = set; then : withval=$with_snmp_address; if test "x$withval" = x; then CUPS_SNMP_ADDRESS="" else CUPS_SNMP_ADDRESS="Address $withval" fi else if test "x$host_os_name" = xdarwin; then CUPS_SNMP_ADDRESS="" else CUPS_SNMP_ADDRESS="Address @LOCAL" fi fi # Check whether --with-snmp-community was given. if test "${with_snmp_community+set}" = set; then : withval=$with_snmp_community; CUPS_SNMP_COMMUNITY="Community $withval" else CUPS_SNMP_COMMUNITY="Community public" fi # Check whether --with-ipp-port was given. if test "${with_ipp_port+set}" = set; then : withval=$with_ipp_port; DEFAULT_IPP_PORT="$withval" else DEFAULT_IPP_PORT="631" fi cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_IPP_PORT $DEFAULT_IPP_PORT _ACEOF # Check whether --enable-webif was given. if test "${enable_webif+set}" = set; then : enableval=$enable_webif; fi case "x$enable_webif" in xno) CUPS_WEBIF=No CUPS_DEFAULT_WEBIF=0 ;; xyes) CUPS_WEBIF=Yes CUPS_DEFAULT_WEBIF=1 ;; *) if test $host_os_name = darwin; then CUPS_WEBIF=No CUPS_DEFAULT_WEBIF=0 else CUPS_WEBIF=Yes CUPS_DEFAULT_WEBIF=1 fi ;; esac cat >>confdefs.h <<_ACEOF #define CUPS_DEFAULT_WEBIF $CUPS_DEFAULT_WEBIF _ACEOF INSTALL_LANGUAGES="" UNINSTALL_LANGUAGES="" LANGFILES="" if test "x$LANGUAGES" != x; then INSTALL_LANGUAGES="install-languages" UNINSTALL_LANGUAGES="uninstall-languages" for lang in $LANGUAGES; do if test -f doc/$lang/index.html.in; then LANGFILES="$LANGFILES doc/$lang/index.html" fi if test -f templates/$lang/header.tmpl.in; then LANGFILES="$LANGFILES templates/$lang/header.tmpl" fi done elif test "x$CUPS_BUNDLEDIR" != x; then INSTALL_LANGUAGES="install-langbundle" UNINSTALL_LANGUAGES="uninstall-langbundle" fi ac_config_files="$ac_config_files Makedefs conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf cups-config desktop/cups.desktop doc/index.html scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/org.cups.cups-lpdAT.service scheduler/org.cups.cupsd.path scheduler/org.cups.cupsd.service scheduler/org.cups.cupsd.socket templates/header.tmpl packaging/cups.list $LANGFILES" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # 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.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . CUPS home page: ." _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.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makedefs") CONFIG_FILES="$CONFIG_FILES Makedefs" ;; "conf/cups-files.conf") CONFIG_FILES="$CONFIG_FILES conf/cups-files.conf" ;; "conf/cupsd.conf") CONFIG_FILES="$CONFIG_FILES conf/cupsd.conf" ;; "conf/mime.convs") CONFIG_FILES="$CONFIG_FILES conf/mime.convs" ;; "conf/pam.std") CONFIG_FILES="$CONFIG_FILES conf/pam.std" ;; "conf/snmp.conf") CONFIG_FILES="$CONFIG_FILES conf/snmp.conf" ;; "cups-config") CONFIG_FILES="$CONFIG_FILES cups-config" ;; "desktop/cups.desktop") CONFIG_FILES="$CONFIG_FILES desktop/cups.desktop" ;; "doc/index.html") CONFIG_FILES="$CONFIG_FILES doc/index.html" ;; "scheduler/cups-lpd.xinetd") CONFIG_FILES="$CONFIG_FILES scheduler/cups-lpd.xinetd" ;; "scheduler/cups.sh") CONFIG_FILES="$CONFIG_FILES scheduler/cups.sh" ;; "scheduler/cups.xml") CONFIG_FILES="$CONFIG_FILES scheduler/cups.xml" ;; "scheduler/org.cups.cups-lpd.plist") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cups-lpd.plist" ;; "scheduler/org.cups.cups-lpdAT.service") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cups-lpdAT.service" ;; "scheduler/org.cups.cupsd.path") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.path" ;; "scheduler/org.cups.cupsd.service") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.service" ;; "scheduler/org.cups.cupsd.socket") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cupsd.socket" ;; "templates/header.tmpl") CONFIG_FILES="$CONFIG_FILES templates/header.tmpl" ;; "packaging/cups.list") CONFIG_FILES="$CONFIG_FILES packaging/cups.list" ;; "$LANGFILES") CONFIG_FILES="$CONFIG_FILES $LANGFILES" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chmod +x cups-config cups-2.3.1/notifier/000775 000765 000024 00000000000 13574721672 014416 5ustar00mikestaff000000 000000 cups-2.3.1/Makefile000664 000765 000024 00000013220 13574721672 014235 0ustar00mikestaff000000 000000 # # Top-level Makefile for CUPS. # # 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. # include Makedefs # # Directories to make... # DIRS = cups $(BUILDDIRS) # # Test suite options - normally blank, override with make command... # TESTOPTIONS = # # Make all targets... # all: chmod +x cups-config echo Using ARCHFLAGS="$(ARCHFLAGS)" echo Using ALL_CFLAGS="$(ALL_CFLAGS)" echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" echo Using CC="$(CC)" echo Using CXX="$(CC)" echo Using DSOFLAGS="$(DSOFLAGS)" echo Using LDFLAGS="$(LDFLAGS)" echo Using LIBS="$(LIBS)" for dir in $(DIRS); do\ echo Making all in $$dir... ;\ (cd $$dir ; $(MAKE) $(MFLAGS) all $(UNITTESTS)) || exit 1;\ done # # Make library targets... # libs: echo Using ARCHFLAGS="$(ARCHFLAGS)" echo Using ALL_CFLAGS="$(ALL_CFLAGS)" echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" echo Using CC="$(CC)" echo Using CXX="$(CC)" echo Using DSOFLAGS="$(DSOFLAGS)" echo Using LDFLAGS="$(LDFLAGS)" echo Using LIBS="$(LIBS)" for dir in $(DIRS); do\ echo Making libraries in $$dir... ;\ (cd $$dir ; $(MAKE) $(MFLAGS) libs) || exit 1;\ done # # Make unit test targets... # unittests: echo Using ARCHFLAGS="$(ARCHFLAGS)" echo Using ALL_CFLAGS="$(ALL_CFLAGS)" echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" echo Using CC="$(CC)" echo Using CXX="$(CC)" echo Using DSOFLAGS="$(DSOFLAGS)" echo Using LDFLAGS="$(LDFLAGS)" echo Using LIBS="$(LIBS)" for dir in $(DIRS); do\ echo Making all in $$dir... ;\ (cd $$dir ; $(MAKE) $(MFLAGS) unittests) || exit 1;\ done # # Remove object and target files... # clean: for dir in $(DIRS); do\ echo Cleaning in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\ done # # Remove all non-distribution files... # distclean: clean $(RM) Makedefs config.h config.log config.status $(RM) conf/cups-files.conf conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf $(RM) cups-config $(RM) desktop/cups.desktop $(RM) doc/index.html $(RM) packaging/cups.list $(RM) scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/org.cups.cups-lpdAT.service scheduler/org.cups.cupsd.path scheduler/org.cups.cupsd.service scheduler/org.cups.cupsd.socket $(RM) templates/header.tmpl -$(RM) doc/*/index.html -$(RM) templates/*/header.tmpl -$(RM) -r autom4te*.cache cups/charmaps cups/locale # # Make dependencies # depend: for dir in $(DIRS); do\ echo Making dependencies in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\ done # # Run the STACK tool on the sources, available here: # # http://css.csail.mit.edu/stack/ # # Do the following to pass options to configure: # # make CONFIGFLAGS="--foo --bar" stack # .PHONY: stack stack: stack-build ./configure $(CONFIGFLAGS) stack-build $(MAKE) $(MFLAGS) clean all poptck $(MAKE) $(MFLAGS) distclean $(RM) */*.ll $(RM) */*.ll.out # # Generate a ctags file... # ctags: ctags -R . # # Install everything... # install: install-data install-headers install-libs install-exec # # Install data files... # install-data: echo Making all in cups... (cd cups; $(MAKE) $(MFLAGS) all) for dir in $(DIRS); do\ echo Installing data files in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) install-data) || exit 1;\ done echo Installing cups-config script... $(INSTALL_DIR) -m 755 $(BINDIR) $(INSTALL_SCRIPT) cups-config $(BINDIR)/cups-config # # Install header files... # install-headers: for dir in $(DIRS); do\ echo Installing header files in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) install-headers) || exit 1;\ done if test "x$(privateinclude)" != x; then \ echo Installing config.h into $(PRIVATEINCLUDE)...; \ $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ $(INSTALL_DATA) config.h $(PRIVATEINCLUDE)/config.h; \ fi # # Install programs... # install-exec: all for dir in $(DIRS); do\ echo Installing programs in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) install-exec) || exit 1;\ done # # Install libraries... # install-libs: libs for dir in $(DIRS); do\ echo Installing libraries in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) install-libs) || exit 1;\ done # # Uninstall object and target files... # uninstall: for dir in $(DIRS); do\ echo Uninstalling in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) uninstall) || exit 1;\ done echo Uninstalling cups-config script... $(RM) $(BINDIR)/cups-config -$(RMDIR) $(BINDIR) # # Run the test suite... # test: all unittests echo Running CUPS test suite... cd test; ./run-stp-tests.sh $(TESTOPTIONS) check: all unittests echo Running CUPS test suite with defaults... cd test; ./run-stp-tests.sh 1 0 n n debugcheck: all unittests echo Running CUPS test suite with debug printfs... cd test; ./run-stp-tests.sh 1 0 n y # # Create HTML documentation using codedoc (http://www.msweet.org/codedoc)... # apihelp: for dir in cups filter; do\ echo Generating API help in $$dir... ;\ (cd $$dir; $(MAKE) $(MFLAGS) apihelp) || exit 1;\ done # # Lines of code computation... # sloc: for dir in cups scheduler; do \ (cd $$dir; $(MAKE) $(MFLAGS) sloc) || exit 1;\ done # # Make software distributions using EPM (http://www.msweet.org/)... # EPMFLAGS = -v --output-dir dist $(EPMARCH) bsd deb epm pkg rpm slackware: epm $(EPMFLAGS) -f $@ cups packaging/cups.list .PHONY: dist dist: all $(RM) -r dist $(MAKE) $(MFLAGS) epm case `uname` in \ *BSD*) $(MAKE) $(MFLAGS) bsd;; \ Linux*) test ! -x /usr/bin/rpm || $(MAKE) $(MFLAGS) rpm;; \ SunOS*) $(MAKE) $(MFLAGS) pkg;; \ esac # # Don't run top-level build targets in parallel... # .NOTPARALLEL: cups-2.3.1/systemv/000775 000765 000024 00000000000 13574721672 014311 5ustar00mikestaff000000 000000 cups-2.3.1/CREDITS.md000664 000765 000024 00000005731 13574721672 014224 0ustar00mikestaff000000 000000 CREDITS - 2019-08-21 ==================== Few projects are completed by one person, and CUPS is no exception. We'd like to thank the following individuals for their contributions: Niklas 'Nille' Åkerström - Swedish localization. Nathaniel Barbour - Lots of testing and feedback. N. Becker - setsid(). Philippe Combes - French localization and buttons script. Jean-Eric Cuendet - GhostScript filters for CUPS. Van Dang - HTTP and IPP policeman. L. Peter Deutsch - MD5 code. Dr. ZP Han - setgid()/setuid(). Guy Harris - *BSD shared libraries and lots of other fixes. Bjoern Jacke - I18N stuff. Wang Jian - CUPS RPM corrections. Roderick Johnstone - Beta tester of the millenium. Till Kamppeter - Bug fixes, beta testing, evangelism. Tomohiro Kato - Japanese localization. Kiko - Bug fixes. Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester. Marek Laane - Estonian translation. Iñaki Larrañaga - Basque localization. Mark Lawrence - Microsoft interoperability testing. Jeff Licquia - Bug fixes, beta testing, evangelism. Jason McMullan - Original CUPS RPM distributions. Àngel Mompó - Catalan localization. Wes Morgan - *BSD fixes. Kenshi Muto - Japanese localization, patches, and testing. Brian Norris - Upstart support. Daniel Nylander - Swedish localization. Naruiko Ogasawara - Japanese localization. Giulio Orsero - Bug fixes and testing. Michal Osowiecki - Polish localization. Citra Paska - Indonesian localization. Kurt Pfeifle - Bug fixes, beta testing, evangelism. Vincenzo Reale - Italian localization. Petter Reinholdtsen - HP-UX compiler stuff. Juan Pablo González Riopedre - Spanish localization. Giovanni Scafora - Italian localization. Joachim Schwender - German localization. Opher Shachar - Hebrew localization. Stuart Stevens - HP JetDirect IPP information. Andrea Suatoni - IRIX desktop integration and testing. Teppo Turliainen - Finnish localization. Tim Waugh - Lots of patches, testing, and Linux integration. Yugami - LDAP browsing support. If I've missed someone, please let me know by sending an email to "msweet@apple.com". cups-2.3.1/config-scripts/000775 000765 000024 00000000000 13574721672 015531 5ustar00mikestaff000000 000000 cups-2.3.1/vcnet/000775 000765 000024 00000000000 13574721672 013716 5ustar00mikestaff000000 000000 cups-2.3.1/Makedefs.in000664 000765 000024 00000014012 13574721672 014644 0ustar00mikestaff000000 000000 # # Common makefile definitions for CUPS. # # 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. # # # CUPS version... # CUPS_VERSION = @CUPS_VERSION@ # # Programs... # AR = @AR@ AWK = @AWK@ CC = @LIBTOOL_CC@ @CC@ CHMOD = @CHMOD@ CXX = @LIBTOOL_CXX@ @CXX@ DSO = @DSO@ DSOXX = @DSOXX@ GZIPPROG = @GZIPPROG@ INSTALL = @INSTALL@ LD = @LD@ LD_CC = @LD_CC@ LD_CXX = @LD_CXX@ LIBTOOL = @LIBTOOL@ LN = @LN@ -sf MKDIR = @MKDIR@ -p MV = @MV@ RANLIB = @RANLIB@ RM = @RM@ -f RMDIR = @RMDIR@ SED = @SED@ SHELL = /bin/sh # # Installation programs... # INSTALL_BIN = @LIBTOOL_INSTALL@ $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@ @INSTALL_STRIP@ INSTALL_COMPDATA = $(INSTALL) -c -m 444 @INSTALL_GZIP@ INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@ INSTALL_DATA = $(INSTALL) -c -m 444 INSTALL_DIR = $(INSTALL) -d INSTALL_LIB = @LIBTOOL_INSTALL@ $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@ @INSTALL_STRIP@ INSTALL_MAN = $(INSTALL) -c -m 444 INSTALL_SCRIPT = $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@ # # Default user, group, and system groups for the scheduler... # CUPS_USER = @CUPS_USER@ CUPS_GROUP = @CUPS_GROUP@ CUPS_SYSTEM_GROUPS = @CUPS_SYSTEM_GROUPS@ CUPS_PRIMARY_SYSTEM_GROUP = @CUPS_PRIMARY_SYSTEM_GROUP@ # # Default permissions... # CUPS_CONFIG_FILE_PERM = @CUPS_CONFIG_FILE_PERM@ CUPS_CUPSD_FILE_PERM = @CUPS_CUPSD_FILE_PERM@ CUPS_LOG_FILE_PERM = @CUPS_LOG_FILE_PERM@ # # Languages to install... # LANGUAGES = @LANGUAGES@ INSTALL_LANGUAGES = @INSTALL_LANGUAGES@ UNINSTALL_LANGUAGES = @UNINSTALL_LANGUAGES@ # # Cross-compilation support: "local" target is used for any tools that are # built and run locally. # LOCALTARGET = @LOCALTARGET@ # # Libraries... # LIBCUPS = @LIBCUPS@ LIBCUPSIMAGE = @LIBCUPSIMAGE@ LIBCUPSOBJS = @LIBCUPSOBJS@ LIBCUPSSTATIC = @LIBCUPSSTATIC@ LIBGSSAPI = @LIBGSSAPI@ LIBHEADERS = @LIBHEADERS@ LIBHEADERSPRIV = @LIBHEADERSPRIV@ LIBMALLOC = @LIBMALLOC@ LIBPAPER = @LIBPAPER@ LIBUSB = @LIBUSB@ LIBWRAP = @LIBWRAP@ LIBZ = @LIBZ@ # # Install static libraries? # INSTALLSTATIC = @INSTALLSTATIC@ # # IPP backend aliases... # IPPALIASES = @IPPALIASES@ # # ippeveprinter commands... # IPPEVECOMMANDS = @IPPEVECOMMANDS@ # # Install XPC backends? # INSTALLXPC = @INSTALLXPC@ # # Code signing... # CODE_SIGN = @CODE_SIGN@ CODE_SIGN_IDENTITY = - # # Program options... # # ARCHFLAGS Defines the default architecture build options. # OPTIM Defines the common compiler optimization/debugging options # for all architectures. # OPTIONS Defines other compile-time options (currently only -DDEBUG # for extra debug info) # ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) \ $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ $(ONDEMANDFLAGS) $(OPTIONS) ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) \ $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ $(ONDEMANDFLAGS) $(OPTIONS) ALL_DSOFLAGS = -L../cups @ARCHFLAGS@ @RELROFLAGS@ $(DSOFLAGS) $(OPTIM) ALL_LDFLAGS = -L../cups @LDARCHFLAGS@ @RELROFLAGS@ $(LDFLAGS) \ @PIEFLAGS@ $(OPTIM) ARCHFLAGS = @ARCHFLAGS@ ARFLAGS = @ARFLAGS@ BACKLIBS = @BACKLIBS@ BUILDDIRS = @BUILDDIRS@ CFLAGS = @CPPFLAGS@ @CFLAGS@ COMMONLIBS = @LIBS@ CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@ CXXLIBS = @CXXLIBS@ DBUS_NOTIFIER = @DBUS_NOTIFIER@ DBUS_NOTIFIERLIBS = @DBUS_NOTIFIERLIBS@ DNSSD_BACKEND = @DNSSD_BACKEND@ DSOFLAGS = @DSOFLAGS@ DNSSDLIBS = @DNSSDLIBS@ IPPFIND_BIN = @IPPFIND_BIN@ IPPFIND_MAN = @IPPFIND_MAN@ LDFLAGS = @LDFLAGS@ LINKCUPS = @LINKCUPS@ LINKCUPSSTATIC = ../cups/$(LIBCUPSSTATIC) $(LIBS) LIBS = $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ) $(COMMONLIBS) ONDEMANDFLAGS = @ONDEMANDFLAGS@ ONDEMANDLIBS = @ONDEMANDLIBS@ OPTIM = @OPTIM@ OPTIONS = @WARNING_OPTIONS@ PAMLIBS = @PAMLIBS@ SERVERLIBS = @SERVERLIBS@ SSLFLAGS = @SSLFLAGS@ SSLLIBS = @SSLLIBS@ UNITTESTS = @UNITTESTS@ # # Directories... # # The first section uses the GNU names (which are *extremely* # difficult to find in a makefile because they are lowercase...) # We have to define these first because autoconf uses ${prefix} # and ${exec_prefix} for most of the other directories... # # The "datarootdir" variable may not get defined if you are using # a version of autoconf prior to 2.60. # # This is immediately followed by definition in ALL CAPS for the # needed directories... # bindir = @bindir@ datadir = @datadir@ datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ includedir = @includedir@ infodir = @infodir@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ privateinclude = @privateinclude@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ top_srcdir = @top_srcdir@ BUILDROOT = $(DSTROOT)$(DESTDIR) BINDIR = $(BUILDROOT)@bindir@ BUNDLEDIR = @CUPS_BUNDLEDIR@ CACHEDIR = $(BUILDROOT)@CUPS_CACHEDIR@ DATADIR = $(BUILDROOT)@CUPS_DATADIR@ DOCDIR = $(BUILDROOT)@CUPS_DOCROOT@ ICONDIR = @ICONDIR@ INCLUDEDIR = $(BUILDROOT)$(includedir) LIBDIR = $(BUILDROOT)$(libdir) LOCALEDIR = $(BUILDROOT)@CUPS_LOCALEDIR@ LOGDIR = $(BUILDROOT)@CUPS_LOGDIR@ MANDIR = $(BUILDROOT)@mandir@ MENUDIR = @MENUDIR@ PRIVATEINCLUDE = $(BUILDROOT)@PRIVATEINCLUDE@ RCLEVELS = @RCLEVELS@ RCSTART = @RCSTART@ RCSTOP = @RCSTOP@ REQUESTS = $(BUILDROOT)@CUPS_REQUESTS@ RESOURCEDIR = @CUPS_RESOURCEDIR@ SBINDIR = $(BUILDROOT)@sbindir@ SERVERBIN = $(BUILDROOT)@CUPS_SERVERBIN@ SERVERROOT = $(BUILDROOT)@CUPS_SERVERROOT@ STATEDIR = $(BUILDROOT)@CUPS_STATEDIR@ PAMDIR = @PAMDIR@ PAMFILE = @PAMFILE@ DBUSDIR = @DBUSDIR@ INITDIR = @INITDIR@ INITDDIR = @INITDDIR@ LAUNCHD_DIR = @LAUNCHD_DIR@ SMFMANIFESTDIR = @SMFMANIFESTDIR@ SYSTEMD_DIR = @SYSTEMD_DIR@ XINETD = @XINETD@ USBQUIRKS = @USBQUIRKS@ # # Rules... # .SILENT: .SUFFIXES: .a .c .cxx .h .o .c.o: echo Compiling $<... $(CC) $(ARCHFLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< .cxx.o: echo Compiling $<... $(CXX) $(ARCHFLAGS) $(OPTIM) $(ALL_CXXFLAGS) -c -o $@ $< cups-2.3.1/scheduler/000775 000765 000024 00000000000 13574721672 014555 5ustar00mikestaff000000 000000 cups-2.3.1/config.h.in000664 000765 000024 00000022063 13574721672 014625 0ustar00mikestaff000000 000000 /* * Configuration file for CUPS. * * 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 * information. */ #ifndef _CUPS_CONFIG_H_ #define _CUPS_CONFIG_H_ /* * Version of software... */ #define CUPS_SVERSION "" #define CUPS_MINIMAL "" #define CUPS_LITE 0 /* * Default user and groups... */ #define CUPS_DEFAULT_USER "lp" #define CUPS_DEFAULT_GROUP "sys" #define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system" #define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@SYSTEM" #define CUPS_DEFAULT_SYSTEM_AUTHKEY "system.print.admin" /* * Default file permissions... */ #define CUPS_DEFAULT_CONFIG_FILE_PERM 0640 #define CUPS_DEFAULT_LOG_FILE_PERM 0644 /* * Default logging settings... */ #define CUPS_DEFAULT_LOG_LEVEL "warn" #define CUPS_DEFAULT_ACCESS_LOG_LEVEL "actions" /* * Default fatal error settings... */ #define CUPS_DEFAULT_FATAL_ERRORS "config" /* * Default browsing settings... */ #define CUPS_DEFAULT_BROWSING 1 #define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "" #define CUPS_DEFAULT_DEFAULT_SHARED 1 /* * Default IPP port... */ #define CUPS_DEFAULT_IPP_PORT 631 /* * Default printcap file... */ #define CUPS_DEFAULT_PRINTCAP "/etc/printcap" /* * Default Samba and LPD config files... */ #define CUPS_DEFAULT_SMB_CONFIG_FILE "" #define CUPS_DEFAULT_LPD_CONFIG_FILE "" /* * Default MaxCopies value... */ #define CUPS_DEFAULT_MAX_COPIES 9999 /* * Do we have domain socket support, and if so what is the default one? */ #undef CUPS_DEFAULT_DOMAINSOCKET /* * Default WebInterface value... */ #undef CUPS_DEFAULT_WEBIF /* * Where are files stored? * * Note: These are defaults, which can be overridden by environment * variables at run-time... */ #define CUPS_BINDIR "/usr/bin" #define CUPS_CACHEDIR "/var/cache/cups" #define CUPS_DATADIR "/usr/share/cups" #define CUPS_DOCROOT "/usr/share/doc/cups" #define CUPS_FONTPATH "/usr/share/cups/fonts" #define CUPS_LOCALEDIR "/usr/share/locale" #define CUPS_LOGDIR "/var/logs/cups" #define CUPS_REQUESTS "/var/spool/cups" #define CUPS_SBINDIR "/usr/sbin" #define CUPS_SERVERBIN "/usr/lib/cups" #define CUPS_SERVERROOT "/etc/cups" #define CUPS_STATEDIR "/var/run/cups" /* * Do we have posix_spawn? */ #undef HAVE_POSIX_SPAWN /* * Do we have ZLIB? */ #undef HAVE_LIBZ #undef HAVE_INFLATECOPY /* * Do we have PAM stuff? */ #define HAVE_LIBPAM 0 #undef HAVE_PAM_PAM_APPL_H #undef HAVE_PAM_SET_ITEM #undef HAVE_PAM_SETCRED /* * Do we have ? */ #undef HAVE_SHADOW_H /* * Do we have ? */ #undef HAVE_CRYPT_H /* * Use ? */ #undef HAVE_STDINT_H /* * Use , , and/or ? */ #undef HAVE_STRING_H #undef HAVE_STRINGS_H #undef HAVE_BSTRING_H /* * Do we have the long long type? */ #undef HAVE_LONG_LONG #ifdef HAVE_LONG_LONG # define CUPS_LLFMT "%lld" # define CUPS_LLCAST (long long) #else # define CUPS_LLFMT "%ld" # define CUPS_LLCAST (long) #endif /* HAVE_LONG_LONG */ /* * Do we have the strtoll() function? */ #undef HAVE_STRTOLL #ifndef HAVE_STRTOLL # define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) #endif /* !HAVE_STRTOLL */ /* * Do we have the strXXX() functions? */ #undef HAVE_STRDUP #undef HAVE_STRLCAT #undef HAVE_STRLCPY /* * Do we have the geteuid() function? */ #undef HAVE_GETEUID /* * Do we have the setpgid() function? */ #undef HAVE_SETPGID /* * Do we have the vsyslog() function? */ #undef HAVE_VSYSLOG /* * Do we have the systemd journal functions? */ #undef HAVE_SYSTEMD_SD_JOURNAL_H /* * Do we have the (v)snprintf() functions? */ #undef HAVE_SNPRINTF #undef HAVE_VSNPRINTF /* * What signal functions to use? */ #undef HAVE_SIGSET #undef HAVE_SIGACTION /* * What wait functions to use? */ #undef HAVE_WAITPID #undef HAVE_WAIT3 /* * Do we have the mallinfo function and malloc.h? */ #undef HAVE_MALLINFO #undef HAVE_MALLOC_H /* * Do we have the POSIX ACL functions? */ #undef HAVE_ACL_INIT /* * Do we have the langinfo.h header file? */ #undef HAVE_LANGINFO_H /* * Which encryption libraries do we have? */ #undef HAVE_CDSASSL #undef HAVE_GNUTLS #undef HAVE_SSPISSL #undef HAVE_SSL /* * Do we have the gnutls_transport_set_pull_timeout_function function? */ #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION /* * Do we have the gnutls_priority_set_direct function? */ #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT /* * What Security framework headers do we have? */ #undef HAVE_AUTHORIZATION_H #undef HAVE_SECCERTIFICATE_H #undef HAVE_SECITEM_H #undef HAVE_SECPOLICY_H /* * Do we have the SecGenerateSelfSignedCertificate function? */ #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE /* * Do we have libpaper? */ #undef HAVE_LIBPAPER /* * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)? */ #undef HAVE_DNSSD /* * Do we have Avahi for DNS Service Discovery (aka Bonjour)? */ #undef HAVE_AVAHI /* * Do we have ? */ #undef HAVE_SYS_IOCTL_H /* * Does the "stat" structure contain the "st_gen" member? */ #undef HAVE_ST_GEN /* * Does the "tm" structure contain the "tm_gmtoff" member? */ #undef HAVE_TM_GMTOFF /* * Do we have rresvport_af()? */ #undef HAVE_RRESVPORT_AF /* * Do we have getaddrinfo()? */ #undef HAVE_GETADDRINFO /* * Do we have getnameinfo()? */ #undef HAVE_GETNAMEINFO /* * Do we have getifaddrs()? */ #undef HAVE_GETIFADDRS /* * Do we have hstrerror()? */ #undef HAVE_HSTRERROR /* * Do we have res_init()? */ #undef HAVE_RES_INIT /* * Do we have */ #undef HAVE_RESOLV_H /* * Do we have the header file? */ #undef HAVE_SYS_SOCKIO_H /* * Does the sockaddr structure contain an sa_len parameter? */ #undef HAVE_STRUCT_SOCKADDR_SA_LEN /* * Do we have pthread support? */ #undef HAVE_PTHREAD_H /* * Do we have on-demand support (launchd/systemd/upstart)? */ #undef HAVE_ONDEMAND /* * Do we have launchd support? */ #undef HAVE_LAUNCH_H #undef HAVE_LAUNCHD /* * Do we have systemd support? */ #undef HAVE_SYSTEMD /* * Do we have upstart support? */ #undef HAVE_UPSTART /* * Do we have CoreFoundation public headers? */ #undef HAVE_COREFOUNDATION_H /* * Do we have ApplicationServices public headers? */ #undef HAVE_APPLICATIONSERVICES_H /* * Do we have the SCDynamicStoreCopyComputerName function? */ #undef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME /* * Do we have the getgrouplist() function? */ #undef HAVE_GETGROUPLIST /* * Do we have macOS 10.4's mbr_XXX functions? */ #undef HAVE_MEMBERSHIP_H #undef HAVE_MBR_UID_TO_UUID /* * Do we have Darwin's notify_post header and function? */ #undef HAVE_NOTIFY_H #undef HAVE_NOTIFY_POST /* * Do we have DBUS? */ #undef HAVE_DBUS #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND #undef HAVE_DBUS_THREADS_INIT /* * Do we have the GSSAPI support library (for Kerberos support)? */ #undef HAVE_GSS_ACQUIRE_CRED_EX_F #undef HAVE_GSS_C_NT_HOSTBASED_SERVICE #undef HAVE_GSS_GSSAPI_H #undef HAVE_GSS_GSSAPI_SPI_H #undef HAVE_GSSAPI #undef HAVE_GSSAPI_GSSAPI_H #undef HAVE_GSSAPI_H /* * Default GSS service name... */ #define CUPS_DEFAULT_GSSSERVICENAME "" /* * Select/poll interfaces... */ #undef HAVE_POLL #undef HAVE_EPOLL #undef HAVE_KQUEUE /* * Do we have the header? */ #undef HAVE_DLFCN_H /* * Do we have ? */ #undef HAVE_SYS_PARAM_H /* * Do we have ? */ #undef HAVE_SYS_UCRED_H /* * Do we have removefile()? */ #undef HAVE_REMOVEFILE /* * Do we have ? */ #undef HAVE_SANDBOX_H /* * Which random number generator function to use... */ #undef HAVE_ARC4RANDOM #undef HAVE_RANDOM #undef HAVE_LRAND48 #ifdef HAVE_ARC4RANDOM # define CUPS_RAND() arc4random() # define CUPS_SRAND(v) #elif defined(HAVE_RANDOM) # define CUPS_RAND() random() # define CUPS_SRAND(v) srandom(v) #elif defined(HAVE_LRAND48) # define CUPS_RAND() lrand48() # define CUPS_SRAND(v) srand48(v) #else # define CUPS_RAND() rand() # define CUPS_SRAND(v) srand(v) #endif /* HAVE_ARC4RANDOM */ /* * Do we have libusb? */ #undef HAVE_LIBUSB /* * Do we have libwrap and tcpd.h? */ #undef HAVE_TCPD_H /* * Do we have ? */ #undef HAVE_ICONV_H /* * Do we have statfs or statvfs and one of the corresponding headers? */ #undef HAVE_STATFS #undef HAVE_STATVFS #undef HAVE_SYS_MOUNT_H #undef HAVE_SYS_STATFS_H #undef HAVE_SYS_STATVFS_H #undef HAVE_SYS_VFS_H /* * Location of macOS localization bundle, if any. */ #undef CUPS_BUNDLEDIR /* * Do we have XPC? */ #undef HAVE_XPC /* * Do we have the C99 abs() function? */ #undef HAVE_ABS #if !defined(HAVE_ABS) && !defined(abs) # if defined(__GNUC__) || __STDC_VERSION__ >= 199901L # define abs(x) _cups_abs(x) static inline int _cups_abs(int i) { return (i < 0 ? -i : i); } # elif defined(_MSC_VER) # define abs(x) _cups_abs(x) static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } # else # define abs(x) ((x) < 0 ? -(x) : (x)) # endif /* __GNUC__ || __STDC_VERSION__ */ #endif /* !HAVE_ABS && !abs */ #endif /* !_CUPS_CONFIG_H_ */ cups-2.3.1/INSTALL.md000664 000765 000024 00000017236 13574721672 014240 0ustar00mikestaff000000 000000 INSTALL - CUPS v2.3.1 - 2019-12-13 ================================== This file describes how to compile and install CUPS from source code. For more information on CUPS see the file called "README.md". A complete change log can be found in "CHANGES.md". Using CUPS requires additional third-party support software and printer drivers. These are typically included with your operating system distribution. Apple does not endorse or support third-party support software for CUPS. > Note: Current versions of macOS DO NOT allow installation to /usr with the > default System Integrity Protection (SIP) settings. In addition, we do not > recommend replacing the CUPS supplied with macOS because: > > a. not all versions of CUPS are compatible with every macOS release, > > b. code signing prevents replacement of system libraries and access to the > system keychain (needed for encrypted printer sharing), and > > c. software updates will often replace parts of your local installation, > potentially rendering your system unusable. > > Apple only supports using the Clang supplied with Xcode to build CUPS on > macOS. BEFORE YOU BEGIN ---------------- You'll need ANSI-compliant C and C++ compilers, plus a make program and POSIX- compliant shell (/bin/sh). The GNU compiler tools and Bash work well and we have tested the current CUPS code against several versions of GCC with excellent results. The makefiles used by the project should work with most versions of make. We've tested them with GNU make as well as the make programs shipped by Compaq, HP, SGI, and Sun. BSD users should use GNU make (gmake) since BSD make does not support "include". Besides these tools you'll want ZLIB library for compression support, the GNU TLS library for encryption support on platforms other than iOS, macOS, or Windows, and either MIT (1.6.3 or higher) or Heimdal Kerberos for Kerberos support. CUPS will compile and run without these, however you'll miss out on many of the features provided by CUPS. On a stock Ubuntu install, the following command will install the required prerequisites: sudo apt-get install autoconf build-essential libavahi-client-dev \ libgnutls28-dev libkrb5-dev libnss-mdns libpam-dev \ libsystemd-dev libusb-1.0-0-dev zlib1g-dev Also, please note that CUPS does not include print filters to support PDF or raster printing. You *must* download GPL Ghostscript and/or the Open Printing CUPS filters package separately to print on operating systems other than macOS. CONFIGURATION ------------- CUPS uses GNU autoconf, so you should find the usual "configure" script in the main CUPS source directory. To configure CUPS for your system, type: ./configure The default installation will put the CUPS software in the "/etc", "/usr", and "/var" directories on your system, which will overwrite any existing printing commands on your system. Use the `--prefix` option to install the CUPS software in another location: ./configure --prefix=/some/directory > Note: Current versions of macOS DO NOT allow installation to /usr with the > default System Integrity Protection (SIP) settings. To see a complete list of configuration options, use the `--help` option: ./configure --help If any of the dependent libraries are not installed in a system default location (typically "/usr/include" and "/usr/lib") you'll need to set the CFLAGS, CPPFLAGS, CXXFLAGS, DSOFLAGS, and LDFLAGS environment variables prior to running configure: setenv CFLAGS "-I/some/directory" setenv CPPFLAGS "-I/some/directory" setenv CXXFLAGS "-I/some/directory" setenv DSOFLAGS "-L/some/directory" setenv LDFLAGS "-L/some/directory" ./configure ... or: CFLAGS="-I/some/directory" \ CPPFLAGS="-I/some/directory" \ CXXFLAGS="-I/some/directory" \ DSOFLAGS="-L/some/directory" \ LDFLAGS="-L/some/directory" \ ./configure ... The `--enable-debug` option compiles CUPS with debugging information enabled. Additional debug logging support can be enabled using the `--enable-debug-printfs` option - these debug messages are enabled using the `CUPS_DEBUG_xxx` environment variables at run-time. CUPS also includes an extensive set of unit tests that can be used to find and diagnose a variety of common problems - use the "--enable-unit-tests" configure option to run them at build time. On macOS, use the `--with-archflags` option to build with the correct set of architectures: ./configure --with-archflags="-arch i386 -arch x86_64" ... Once you have configured things, just type: make ENTER or if you have FreeBSD, NetBSD, or OpenBSD type: gmake ENTER to build the software. TESTING THE SOFTWARE -------------------- Aside from the built-in unit tests, CUPS includes an automated test framework for testing the entire printing system. To run the tests, just type: make check ENTER or if you have FreeBSD, NetBSD, or OpenBSD type: gmake check ENTER The test framework runs a copy of the CUPS scheduler (cupsd) on port 8631 in /tmp/cups-$USER and produces a nice HTML report of the results. INSTALLING THE SOFTWARE ----------------------- Once you have built the software you need to install it. The "install" target provides a quick way to install the software on your local system: make install ENTER or for FreeBSD, NetBSD, or OpenBSD: gmake install ENTER Use the BUILDROOT variable to install to an alternate root directory: make BUILDROOT=/some/other/root/directory install ENTER You can also build binary packages that can be installed on other machines using the RPM spec file ("packaging/cups.spec") or EPM list file ("packaging/cups.list"). The latter also supports building of binary RPMs, so it may be more convenient to use. You can find the RPM software at: http://www.rpm.org/ The EPM software is available at: https://michaelrsweet.github.io/epm CREATING BINARY DISTRIBUTIONS WITH EPM -------------------------------------- The top level makefile supports generation of many types of binary distributions using EPM. To build a binary distribution type: make ENTER or gmake ENTER for FreeBSD, NetBSD, and OpenBSD. The target is one of the following: - "epm": Builds a script + tarfile package - "bsd": Builds a *BSD package - "deb": Builds a Debian package - "pkg": Builds a Solaris package - "rpm": Builds a RPM package - "slackware": Build a Slackware package GETTING DEBUG LOGGING FROM CUPS ------------------------------- When configured with the `--enable-debug-printfs` option, CUPS compiles in additional debug logging support in the scheduler, CUPS API, and CUPS Imaging API. The following environment variables are used to enable and control debug logging: - `CUPS_DEBUG_FILTER`: Specifies a POSIX regular expression to control which messages are logged. - `CUPS_DEBUG_LEVEL`: Specifies a number from 0 to 9 to control the verbosity of the logging. The default level is 1. - `CUPS_DEBUG_LOG`: Specifies a log file to use. Specify the name "-" to send the messages to stderr. Prefix a filename with "+" to append to an existing file. You can include a single "%d" in the filename to embed the current process ID. REPORTING PROBLEMS ------------------ If you have problems, *read the documentation first*! If the documentation does not solve your problems, please post a message on the users forum at: https://www.cups.org/ Include your operating system and version, compiler and version, and any errors or problems you've run into. The "config.log" file and the output from the configure script and make should also be sent, as it often helps to determine the cause of your problem. If you are running a version of Linux, be sure to provide the Linux distribution you have, too. cups-2.3.1/desktop/000775 000765 000024 00000000000 13574721672 014250 5ustar00mikestaff000000 000000 cups-2.3.1/config.guess000775 000765 000024 00000131355 13574721672 015127 0ustar00mikestaff000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-11-29' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cups-2.3.1/backend/000775 000765 000024 00000000000 13574721672 014166 5ustar00mikestaff000000 000000 cups-2.3.1/ppdc/000775 000765 000024 00000000000 13574721672 013525 5ustar00mikestaff000000 000000 cups-2.3.1/.lgtm.yml000664 000765 000024 00000000207 13574721672 014342 0ustar00mikestaff000000 000000 queries: - exclude: cpp/integer-multiplication-cast-to-long - exclude: cpp/missing-header-guard - exclude: cpp/short-global-name cups-2.3.1/NOTICE000664 000765 000024 00000004440 13574721672 013505 0ustar00mikestaff000000 000000 CUPS Copyright © 2007-2019 by Apple Inc. Copyright © 1997-2007 by Easy Software Products. CUPS and the CUPS logo are trademarks of Apple Inc. The MD5 Digest code is Copyright 1999 Aladdin Enterprises. The Kerberos support code ("KSC") is copyright 2006 by Jelmer Vernooij and is provided 'as-is', without any express or implied warranty. In no event will the author or Apple Inc. be held liable for any damages arising from the use of the KSC. Sources files containing KSC have the following text at the top of each source file: This file contains Kerberos support code, copyright 2006 by Jelmer Vernooij. The KSC copyright and license apply only to Kerberos-related feature code in CUPS. Such code is typically conditionally compiled based on the present of the HAVE_GSSAPI preprocessor definition. Permission is granted to anyone to use the KSC for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of the KSC must not be misrepresented; you must not claim that you wrote the original software. If you use the KSC in a product, an acknowledgment in the product documentation would be appreciated but is not required. 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. cups-2.3.1/README.md000664 000765 000024 00000015634 13574721672 014067 0ustar00mikestaff000000 000000 README - CUPS v2.3.1 - 2019-12-13 ================================= 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 interfaces, a web interface, and a C API to manage printers and print jobs. It supports printing to both local (parallel, serial, USB) and networked printers, and printers can be shared from one computer to another, even over the Internet! Internally, CUPS uses PostScript Printer Description ("PPD") files to describe printer capabilities and features and a wide variety of generic and device- specific programs to convert and print many types of files. Sample drivers are included with CUPS to support many Dymo, EPSON, HP, Intellitech, OKIDATA, and Zebra printers. Many more drivers are available online and (in some cases) on the driver CD-ROM that came with your printer. CUPS is licensed under the Apache License Version 2.0. See the file "LICENSE" for more information. 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 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. Please read the documentation before asking questions. GETTING SUPPORT AND OTHER RESOURCES ----------------------------------- If you have problems, *read the documentation first!* We also provide two mailing lists which are available at . See the CUPS web site at for other resources. SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER ------------------------------------------------ CUPS includes a web-based administration tool that allows you to manage printers, classes, and jobs on your server. Open 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. You will be asked for the administration password (root or any other user in the "sys", "system", "root", "admin", or "lpadmin" group on your system) when performing any administrative function. SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE ----------------------------------------------- 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": 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 You can run the `lpinfo -m` command to list all of the available drivers: lpinfo -m Run the `lpinfo -v` command to list the available printers: lpinfo -v Then use the correct URI to add the printer using the `lpadmin` command: lpadmin -p printername -E -v device-uri -m ppd-name Current network printers typically use `ipp` or `ipps` URIS: lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere lpadmin -p printername -E -v ipps://11.22.33.44/ipp/print -m everywhere Older network printers typically use `socket` or `lpd` URIs: lpadmin -p printername -E -v socket://11.22.33.44 -m ppd-name lpadmin -p printername -E -v lpd://11.22.33.44/ -m ppd-name The sample drivers provide basic printing capabilities, but generally do not exercise the full potential of the printers or CUPS. Other drivers provide greater printing capabilities. PRINTING FILES -------------- CUPS provides both the System V `lp` and Berkeley `lpr` commands for printing: lp filename lpr filename Both the `lp` and `lpr` commands support printing options for the driver: lp -o media=A4 -o resolution=600dpi filename lpr -o media=A4 -o resolution=600dpi filename CUPS recognizes many types of images files as well as PDF, PostScript, and text files, so you can print those files directly rather than through an application. If you have an application that generates output specifically for your printer then you need to use the `-oraw` or `-l` options: lp -o raw filename lpr -l filename This will prevent the filters from misinterpreting your print file. 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 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 CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. cups-2.3.1/cups-config.in000775 000765 000024 00000004650 13574721672 015354 0ustar00mikestaff000000 000000 #!/bin/sh # # CUPS configuration utility. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # VERSION="@CUPS_VERSION@" APIVERSION="2.3" BUILD="@CUPS_BUILD@" prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ includedir=@includedir@ libdir=@libdir@ datarootdir=@datadir@ datadir=@datadir@ sysconfdir=@sysconfdir@ cups_datadir=@CUPS_DATADIR@ cups_serverbin=@CUPS_SERVERBIN@ cups_serverroot=@CUPS_SERVERROOT@ INSTALLSTATIC=@INSTALLSTATIC@ # flags for compiler and linker... CFLAGS="" LDFLAGS="@EXPORT_LDFLAGS@" LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@" # Check for local invocation... selfdir=`dirname $0` if test -f "$selfdir/cups/cups.h"; then CFLAGS="-I$selfdir" LDFLAGS="-L$selfdir/cups $LDFLAGS" libdir="$selfdir/cups" else if test $includedir != /usr/include; then CFLAGS="$CFLAGS -I$includedir" fi if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then LDFLAGS="$LDFLAGS -L$libdir" fi fi usage () { echo "Usage: cups-config --api-version" echo " cups-config --build" echo " cups-config --cflags" echo " cups-config --datadir" echo " cups-config --help" echo " cups-config --ldflags" echo " cups-config [--image] [--static] --libs" echo " cups-config --serverbin" echo " cups-config --serverroot" echo " cups-config --version" exit $1 } if test $# -eq 0; then usage 1 fi # Parse command line options static=no while test $# -gt 0; do case $1 in --api-version) echo $APIVERSION ;; --build) echo $BUILD ;; --cflags) echo $CFLAGS ;; --datadir) echo $cups_datadir ;; --help) usage 0 ;; --image) # Do nothing ;; --ldflags) echo $LDFLAGS ;; --libs) if test $static = no; then libs="@EXTLINKCUPS@"; else libs="$libdir/libcups.a $LIBS"; fi echo $libs ;; --serverbin) echo $cups_serverbin ;; --serverroot) echo $cups_serverroot ;; --static) if test -z "$INSTALLSTATIC"; then echo "WARNING: Static libraries not installed." >&2 else static=yes fi ;; --version) echo $VERSION ;; *) usage 1 ;; esac shift done cups-2.3.1/config.sub000775 000765 000024 00000105412 13574721672 014565 0ustar00mikestaff000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-10-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cups-2.3.1/CONTRIBUTING.md000664 000765 000024 00000001266 13574721672 015035 0ustar00mikestaff000000 000000 Contributing to CUPS ==================== CUPS is developed by Apple Inc. and distributed as open source software under 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 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. cups-2.3.1/examples/000775 000765 000024 00000000000 13574721672 014415 5ustar00mikestaff000000 000000 cups-2.3.1/CHANGES.md000664 000765 000024 00000046756 13574721672 014213 0ustar00mikestaff000000 000000 CHANGES - 2.3.1 - 2019-12-13 ============================ Changes in CUPS v2.3.1 ---------------------- - Documentation updates (Issue #5661, #5674, #5682) - CVE-2019-2228: The `ippSetValuetag` function did not validate the default language value. - Fixed a crash bug in the web interface (Issue #5621) - The PPD cache code now looks up page sizes using their dimensions (Issue #5633) - PPD files containing "custom" option keywords did not work (Issue #5639) - Added a workaround for the scheduler's systemd support (Issue #5640) - On Windows, TLS certificates generated on February 29 would likely fail (Issue #5643) - Added a DigestOptions directive for the `client.conf` file to control whether MD5-based Digest authentication is allowed (Issue #5647) - 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 `ippeveprinter` program now supports authentication (Issue #5665) - The `ippeveprinter` program now advertises DNS-SD services on the correct interfaces, and provides a way to turn them off (Issue #5666) - The `--with-dbusdir` option was ignored by the configure script (Issue #5671) - Sandboxed applications were not able to get the default printer (Issue #5676) - Log file access controls were not preserved by `cupsctl` (Issue #5677) - Default printers set with `lpoptions` did not work in all cases (Issue #5681, Issue #5683, Issue #5684) - Fixed an error in the jobs web interface template (Issue #5694) - Fixed an off-by-one error in `ippEnumString` (Issue #5695) - Fixed some new compiler warnings (Issue #5700) - Fixed a few issues with the Apple Raster support (rdar://55301114) - The IPP backend did not detect all cases where a job should be retried using a raster format (rdar://56021091) - Fixed spelling of "fold-accordion". - Fixed the default common name for TLS certificates used by `ippeveprinter`. - Fixed the option names used for IPP Everywhere finishing options. - Added support for the second roll of the DYMO Twin/DUO label printers. 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) - Removed dead code from the scheduler (Issue #5593) - "make" failed with GZIP options (Issue #5595) - 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 it is clear what happened (Issue #5604) - The `lpadmin` command did not always update the PPD file for changes to the `cupsIPPSupplies` and `cupsSNMPSupplies` keywords (Issue #5610) - 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 ----------------------- - The `cups-config` script no longer adds extra libraries when linking against shared libraries (Issue #5261) - The supplied example print documents have been optimized for size (Issue #5529) - The `cupsctl` command now prevents setting "cups-files.conf" directives (Issue #5530) - The "forbidden" message in the web interface is now explained (Issue #5547) - The footer in the web interface covered some content on small displays (Issue #5574) - The libusb-based USB backend now enforces read limits, improving print speed in many cases (Issue #5583) - The `ippeveprinter` command now looks for print commands in the "command" subdirectory. - The `ipptool` command now supports `$date-current` and `$date-start` variables to insert the current and starting date and time values, as well as ISO-8601 relative time values such as "PT30S" for 30 seconds in the future. Changes in CUPS v2.3b8 ---------------------- - Media size matching now uses a tolerance of 0.5mm (rdar://33822024) - The lpadmin command would hang with a bad PPD file (rdar://41495016) - Fixed a potential crash bug in cups-driverd (rdar://46625579) - Fixed a performance regression with large PPDs (rdar://47040759) - Fixed a memory reallocation bug in HTTP header value expansion (rdar://problem/50000749) - Timed out job submission now yields an error (Issue #5570) - Restored minimal support for the `Emulators` keyword in PPD files to allow old Samsung printer drivers to continue to work (Issue #5562) - The scheduler did not encode octetString values like "job-password" correctly for the print filters (Issue #5558) - The `cupsCheckDestSupported` function did not check octetString values correctly (Issue #5557) - Added support for `UserAgentTokens` directive in "client.conf" (Issue #5555) - Updated the systemd service file for cupsd (Issue #5551) - The `ippValidateAttribute` function did not catch all instances of invalid UTF-8 strings (Issue #5509) - Fixed an issue with the self-signed certificates generated by GNU TLS (Issue #5506) - Fixed a potential memory leak when reading at the end of a file (Issue #5473) - Fixed potential unaligned accesses in the string pool (Issue #5474) - Fixed a potential memory leak when loading a PPD file (Issue #5475) - Added a USB quirks rule for the Lexmark E120n (Issue #5478) - Updated the USB quirks rule for Zebra label printers (Issue #5395) - Fixed a compile error on Linux (Issue #5483) - The lpadmin command, web interface, and scheduler all queried an IPP Everywhere printer differently, resulting in different PPDs for the same printer (Issue #5484) - The web interface no longer provides access to the log files (Issue #5513) - Non-Kerberized printing to Windows via IPP was broken (Issue #5515) - Eliminated use of private headers and some deprecated macOS APIs (Issue #5516) - The scheduler no longer stops a printer if an error occurs when a job is canceled or aborted (Issue #5517) - Added a USB quirks rule for the DYMO 450 Turbo (Issue #5521) - Added a USB quirks rule for Xerox printers (Issue #5523) - The scheduler's self-signed certificate did not include all of the alternate names for the server when using GNU TLS (Issue #5525) - Fixed compiler warnings with newer versions of GCC (Issue #5532, Issue #5533) - Fixed some PPD caching and IPP Everywhere PPD accounting/password bugs (Issue #5535) - Fixed `PreserveJobHistory` bug with time values (Issue #5538) - The scheduler no longer advertises the HTTP methods it supports (Issue #5540) - Localization updates (Issue #5461, Issues #5471, Issue #5481, Issue #5486, Issue #5489, Issue #5491, Issue #5492, Issue #5493, Issue #5494, Issue #5495, Issue #5497, Issue #5499, Issue #5500, Issue #5501, Issue #5504) - The scheduler did not always idle exit as quickly as it could. - Added a new `ippeveprinter` command based on the old ippserver sample code. Changes in CUPS v2.3b7 ---------------------- - Fixed some build failures (Issue #5451, Issue #5463) - Running ppdmerge with the same input and output filenames did not work as advertised (Issue #5455) Changes in CUPS v2.3b6 ---------------------- - Localization update (Issue #5339, Issue #5348, Issue #5362, Issue #5408, Issue #5410) - Documentation updates (Issue #5369, Issue #5402, Issue #5403, Issue #5404) - CVE-2018-4300: Linux session cookies used a predictable random number seed. - All user commands now support the `--help` option (Issue #5326) - The `lpoptions` command now works with IPP Everywhere printers that have not yet been added as local queues (Issue #5045) - The lpadmin command would create a non-working printer in some error cases (Issue #5305) - The scheduler would crash if an empty `AccessLog` directive was specified (Issue #5309) - The scheduler did not idle-exit on some Linux distributions (Issue #5319) - Fixed a regression in the changes to ippValidateAttribute (Issue #5322, Issue #5330) - Fixed a crash bug in the Epson dot matrix driver (Issue #5323) - Automatic debug logging of job errors did not work with systemd (Issue #5337) - The web interface did not list the IPP Everywhere "driver" (Issue #5338) - The scheduler did not report all of the supported job options and values (Issue #5340) - The IPP Everywhere "driver" now properly supports face-up printers (Issue #5345) - Fixed some typos in the label printer drivers (Issue #5350) - Setting the `Community` name to the empty string in `snmp.conf` now disables SNMP supply level monitoring by all the standard network backends (Issue #5354) - Multi-file jobs could get stuck if the backend failed (Issue #5359, Issue #5413) - The IPP Everywhere "driver" no longer does local filtering when printing to a shared CUPS printer (Issue #5361) - The lpadmin command now correctly reports IPP errors when configuring an IPP Everywhere printer (Issue #5370) - Fixed some memory leaks discovered by Coverity (Issue #5375) - The PPD compiler incorrectly terminated JCL options (Issue #5379) - The cupstestppd utility did not generate errors for missing/mismatched CloseUI/JCLCloseUI keywords (Issue #5381) - The scheduler now reports the actual location of the log file (Issue #5398) - Added USB quirk rules (Issue #5395, Issue #5420, Issue #5443) - The generated PPD files for IPP Everywhere printers did not contain the cupsManualCopies keyword (Issue #5433) - Kerberos credentials might be truncated (Issue #5435) - The handling of `MaxJobTime 0` did not match the documentation (Issue #5438) - Fixed a bug adding a queue with the `-E` option (Issue #5440) - The `cupsaddsmb` program has been removed (Issue #5449) - The `cupstestdsc` program has been removed (Issue #5450) - The scheduler was being backgrounded on macOS, causing applications to spin (rdar://40436080) - The scheduler did not validate that required initial request attributes were in the operation group (rdar://41098178) - Authentication in the web interface did not work on macOS (rdar://41444473) - Fixed an issue with HTTP Digest authentication (rdar://41709086) - The scheduler could crash when job history was purged (rdar://42198057) - Fixed a crash bug when mapping PPD duplex options to IPP attributes (rdar://46183976) - Fixed a memory leak for some IPP (extension) syntaxes. - The `cupscgi`, `cupsmime`, and `cupsppdc` support libraries are no longer installed as shared libraries. - The `snmp` backend is now deprecated. Changes in CUPS v2.3b5 ---------------------- - The `ipptool` program no longer checks for duplicate attributes when running in list or CSV mode (Issue #5278) - The `cupsCreateJob`, `cupsPrintFile2`, and `cupsPrintFiles2` APIs did not use the supplied HTTP connection (Issue #5288) - Fixed another crash in the scheduler when adding an IPP Everywhere printer (Issue #5290) - Added a workaround for certain web browsers that do not support multiple authentication schemes in a single response header (Issue #5289) - Fixed policy limits containing the `All` operation (Issue #5296) - The scheduler was always restarted after idle-exit with systemd (Issue #5297) - Added a USB quirks rule for the HP LaserJet P1102 (Issue #5310) - The mailto notifier did not wait for the welcome message (Issue #5312) - Fixed a parsing bug in the pstops filter (Issue #5321) - Documentation updates (Issue #5299, Issue #5301, Issue #5306) - Localization updates (Issue #5317) - The scheduler allowed environment variables to be specified in the `cupsd.conf` file (rdar://37836779, rdar://37836995, rdar://37837252, rdar://37837581) - Fax queues did not support pause (p) or wait-for-dialtone (w) characters (rdar://39212256) - The scheduler did not validate notify-recipient-uri values properly (rdar://40068936) - The IPP parser allowed invalid group tags (rdar://40442124) - Fixed a parsing bug in the new authentication code. Changes in CUPS v2.3b4 ---------------------- - NOTICE: Printer drivers are now deprecated (Issue #5270) - Kerberized printing to another CUPS server did not work correctly (Issue #5233) - Fixed printing to some IPP Everywhere printers (Issue #5238) - Fixed installation of filters (Issue #5247) - The scheduler now supports using temporary print queues for older IPP/1.1 print queues like those shared by CUPS 1.3 and earlier (Issue #5241) - Star Micronics printers need the "unidir" USB quirk rule (Issue #5251) - Documentation fixes (Issue #5252) - Fixed a compile issue when PAM is not available (Issue #5253) - Label printers supported by the rastertolabel driver don't support SNMP, so don't delay printing to test it (Issue #5256) - The scheduler could crash while adding an IPP Everywhere printer (Issue #5258) - The Lexmark Optra E310 printer needs the "no-reattach" USB quirk rule (Issue #5259) - Systemd did not restart cupsd when configuration changes were made that required a restart (Issue #5263) - The IPP Everywhere PPD generator did not include the `cupsJobPassword` keyword, when supported (Issue #5265) - Fixed an Avahi crash bug in the scheduler (Issue #5268) - Raw print queues are now deprecated (Issue #5269) - Fixed an RPM packaging problem (Issue #5276) - The IPP backend did not properly detect failed PDF prints (rdar://34055474) - TLS connections now properly timeout (rdar://34938533) - Temp files could not be created in some sandboxed applications (rdar://37789645) - The ipptool `--ippserver` option did not encode out-of-band attributes correctly. - Added public `cupsEncodeOption` API for encoding a single option as an IPP attribute. - Removed support for the `-D_PPD_DEPRECATED=""` developer cheat - the PPD API should no longer be used. - Removed support for `-D_IPP_PRIVATE_STRUCTURES=1` developer cheat - the IPP accessor functions should be used instead. Changes in CUPS v2.3b3 ---------------------- - More fixes for printing to old CUPS servers (Issue #5211) - The IPP Everywhere PPD generator did not support deep grayscale or 8-bit per component AdobeRGB (Issue #5227) - Additional changes for the scheduler to substitute default values for invalid job attributes when running in "relaxed conformance" mode (Issue #5229) - Localization changes (Issue #5232, rdar://37068158) - The `cupsCopyDestInfo` function did not work with all print queues (Issue #5235) Changes in CUPS v2.3b2 ---------------------- - Localization changes (Issue #5210) - Build fixes (Issue #5217) - IPP Everywhere PPDs were not localized to English (Issue #5205) - The `cupsGetDests` and `cupsEnumDests` functions no longer filter out local print services like IPP USB devices (Issue #5206) - The `cupsCopyDest` function now correctly copies the `is_default` value (Issue #5208) - Printing to old CUPS servers has been fixed (Issue #5211) - The `ppdInstallableConflict` tested too many constraints (Issue #5213) - All HTTP field values can now be longer than `HTTP_MAX_VALUE` bytes (Issue #5216) - Added a USB quirk rule for Canon MP280 series printers (Issue #5221) - The `cupsRasterWritePixels` function did not correctly swap bytes for some formats (Issue #5225) - Fixed an issue with mapping finishing options (rdar://34250727) - The `ppdLocalizeIPPReason` function incorrectly returned a localized version of "none" (rdar://36566269) - The scheduler did not add ".local" to the default DNS-SD host name when needed. Changes in CUPS v2.3b1 ---------------------- - CUPS is now provided under the Apache License, Version 2.0. - Documentation updates (Issue #4580, Issue #5177, Issue #5192) - The `cupsCopyDestConflicts` function now handles collection attribute ("media-col", "finishings-col", etc.) constraints (Issue #4096) - The `lpoptions` command incorrectly saved default options (Issue #4717) - The `lpstat` command now reports when new jobs are being held (Issue #4761) - The `ippfind` command now supports finding printers whose name starts with an underscore (Issue #4833) - The CUPS library now supports the latest HTTP Digest authentication specification including support for SHA-256 (Issue #4862) - The scheduler now supports the "printer-id" attribute (Issue #4868) - No longer support backslash, question mark, or quotes in printer names (Issue #4966) - The scheduler no longer logs pages as they are printed, instead just logging a total of the pages printed at job completion (Issue #4991) - Dropped RSS subscription management from the web interface (Issue #5012) - Bonjour printer sharing now uses the DNS-SD hostname (or ServerName value if none is defined) when registering shared printers on the network (Issue #5071) - The `ipptool` command now supports writing `ippserver` attributes files (Issue #5093) - The `lp` and `lpr` commands now provide better error messages when the default printer cannot be found (Issue #5096) - The `lpadmin` command now provides a better error message when an unsupported System V interface script is used (Issue #5111) - The scheduler did not write out dirty configuration and state files if there were open client connections (Issue #5118) - The `SSLOptions` directive now supports `MinTLS` and `MaxTLS` options to control the minimum and maximum TLS versions that will be allowed, respectively (Issue #5119) - Dropped hard-coded CGI scripting language support (Issue #5124) - The `cupsEnumDests` function did not include options from the lpoptions files (Issue #5144) - Fixed the `ippserver` sample code when threading is disabled or unavailable (Issue #5154) - Added label markup to checkbox and radio button controls in the web interface templates (Issue #5161) - Fixed group validation on OpenBSD (Issue #5166) - Improved IPP Everywhere media support, including a new `cupsAddDestMediaOptions` function (Issue #5167) - IPP Everywhere PPDs now include localizations of printer-specific media types, when available (Issue #5168) - The cups-driverd program incorrectly stopped scanning PPDs as soon as a loop was seen (Issue #5170) - IPP Everywhere PPDs now support IPP job presets (Issue #5179) - IPP Everywhere PPDs now support finishing templates (Issue #5180) - Fixed a journald support bug in the scheduler (Issue #5181) - Fixed PAM module detection and added support for the common PAM definitions (Issue #5185) - The scheduler now substitutes default values for invalid job attributes when running in "relaxed conformance" mode (Issue #5186) - The scheduler did not work with older versions of uClibc (Issue #5188) - The scheduler now generates a strings file for localizing PPD options (Issue #5194) cups-2.3.1/cgi-bin/000775 000765 000024 00000000000 13574721672 014107 5ustar00mikestaff000000 000000 cups-2.3.1/templates/000775 000765 000024 00000000000 13574721672 014575 5ustar00mikestaff000000 000000 cups-2.3.1/doc/000775 000765 000024 00000000000 13574721672 013344 5ustar00mikestaff000000 000000 cups-2.3.1/filter/000775 000765 000024 00000000000 13574721672 014064 5ustar00mikestaff000000 000000 cups-2.3.1/data/000775 000765 000024 00000000000 13574721672 013510 5ustar00mikestaff000000 000000 cups-2.3.1/conf/000775 000765 000024 00000000000 13574721672 013524 5ustar00mikestaff000000 000000 cups-2.3.1/cups/000775 000765 000024 00000000000 13574721672 013551 5ustar00mikestaff000000 000000 cups-2.3.1/cups/raster-interstub.c000664 000765 000024 00000004336 13574721672 017240 0ustar00mikestaff000000 000000 /* * cupsRasterInterpretPPD stub for CUPS. * * Copyright © 2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include /* * This stub wraps the _cupsRasterInterpretPPD function in libcups - this allows * one library to provide all of the CUPS API functions while still supporting * the old split library organization... */ /* * 'cupsRasterInterpretPPD()' - Interpret PPD commands to create a page header. * * This function is used by raster image processing (RIP) filters like * cgpdftoraster and imagetoraster when writing CUPS raster data for a page. * It is not used by raster printer driver filters which only read CUPS * raster data. * * * @code cupsRasterInterpretPPD@ does not mark the options in the PPD using * the "num_options" and "options" arguments. Instead, mark the options with * @code cupsMarkOptions@ and @code ppdMarkOption@ prior to calling it - * this allows for per-page options without manipulating the options array. * * The "func" argument specifies an optional callback function that is * called prior to the computation of the final raster data. The function * can make changes to the @link cups_page_header2_t@ data as needed to use a * supported raster format and then returns 0 on success and -1 if the * requested attributes cannot be supported. * * * @code cupsRasterInterpretPPD@ supports a subset of the PostScript language. * Currently only the @code [@, @code ]@, @code <<@, @code >>@, @code {@, * @code }@, @code cleartomark@, @code copy@, @code dup@, @code index@, * @code pop@, @code roll@, @code setpagedevice@, and @code stopped@ operators * are supported. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on failure */ cupsRasterInterpretPPD( cups_page_header2_t *h, /* O - Page header to create */ ppd_file_t *ppd, /* I - PPD file */ int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ cups_interpret_cb_t func) /* I - Optional page header callback (@code NULL@ for none) */ { return (_cupsRasterInterpretPPD(h, ppd, num_options, options, func)); } cups-2.3.1/cups/cups.h000664 000765 000024 00000061763 13574721672 014711 0ustar00mikestaff000000 000000 /* * API definitions for CUPS. * * 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 * information. */ #ifndef _CUPS_CUPS_H_ # define _CUPS_CUPS_H_ /* * Include necessary headers... */ # include # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include /* Windows does not support the ssize_t type, so map it to long... */ typedef long ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ # include "file.h" # include "ipp.h" # include "language.h" # include "pwg.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define CUPS_VERSION 2.0301 # define CUPS_VERSION_MAJOR 2 # define CUPS_VERSION_MINOR 3 # define CUPS_VERSION_PATCH 1 # define CUPS_BC_FD 3 /* Back-channel file descriptor for * select/poll */ # define CUPS_DATE_ANY (time_t)-1 # define CUPS_EXCLUDE_NONE (const char *)0 # define CUPS_FORMAT_AUTO "application/octet-stream" # define CUPS_FORMAT_COMMAND "application/vnd.cups-command" # define CUPS_FORMAT_JPEG "image/jpeg" # define CUPS_FORMAT_PDF "application/pdf" # define CUPS_FORMAT_POSTSCRIPT "application/postscript" # define CUPS_FORMAT_RAW "application/vnd.cups-raw" # define CUPS_FORMAT_TEXT "text/plain" # define CUPS_HTTP_DEFAULT (http_t *)0 # define CUPS_INCLUDE_ALL (const char *)0 # define CUPS_JOBID_ALL -1 # define CUPS_JOBID_CURRENT 0 # define CUPS_LENGTH_VARIABLE (ssize_t)0 # define CUPS_TIMEOUT_DEFAULT 0 # define CUPS_WHICHJOBS_ALL -1 # define CUPS_WHICHJOBS_ACTIVE 0 # define CUPS_WHICHJOBS_COMPLETED 1 /* Flags for cupsConnectDest and cupsEnumDests */ # define CUPS_DEST_FLAGS_NONE 0x00 /* No flags are set */ # define CUPS_DEST_FLAGS_UNCONNECTED 0x01 /* There is no connection */ # define CUPS_DEST_FLAGS_MORE 0x02 /* There are more destinations */ # define CUPS_DEST_FLAGS_REMOVED 0x04 /* The destination has gone away */ # define CUPS_DEST_FLAGS_ERROR 0x08 /* An error occurred */ # define CUPS_DEST_FLAGS_RESOLVING 0x10 /* The destination address is being * resolved */ # define CUPS_DEST_FLAGS_CONNECTING 0x20 /* A connection is being established */ # define CUPS_DEST_FLAGS_CANCELED 0x40 /* Operation was canceled */ # define CUPS_DEST_FLAGS_DEVICE 0x80 /* For @link cupsConnectDest@: Connect to device */ /* Flags for cupsGetDestMediaByName/Size */ # define CUPS_MEDIA_FLAGS_DEFAULT 0x00 /* Find the closest size supported by * the printer */ # define CUPS_MEDIA_FLAGS_BORDERLESS 0x01 /* Find a borderless size */ # define CUPS_MEDIA_FLAGS_DUPLEX 0x02 /* Find a size compatible with 2-sided * printing */ # define CUPS_MEDIA_FLAGS_EXACT 0x04 /* Find an exact match for the size */ # define CUPS_MEDIA_FLAGS_READY 0x08 /* If the printer supports media * sensing, find the size amongst the * "ready" media. */ /* Options and values */ # define CUPS_COPIES "copies" # define CUPS_COPIES_SUPPORTED "copies-supported" # define CUPS_FINISHINGS "finishings" # define CUPS_FINISHINGS_SUPPORTED "finishings-supported" # define CUPS_FINISHINGS_BIND "7" # define CUPS_FINISHINGS_COVER "6" # define CUPS_FINISHINGS_FOLD "10" # define CUPS_FINISHINGS_NONE "3" # define CUPS_FINISHINGS_PUNCH "5" # define CUPS_FINISHINGS_STAPLE "4" # define CUPS_FINISHINGS_TRIM "11" # define CUPS_MEDIA "media" # define CUPS_MEDIA_READY "media-ready" # define CUPS_MEDIA_SUPPORTED "media-supported" # define CUPS_MEDIA_3X5 "na_index-3x5_3x5in" # define CUPS_MEDIA_4X6 "na_index-4x6_4x6in" # define CUPS_MEDIA_5X7 "na_5x7_5x7in" # define CUPS_MEDIA_8X10 "na_govt-letter_8x10in" # define CUPS_MEDIA_A3 "iso_a3_297x420mm" # define CUPS_MEDIA_A4 "iso_a4_210x297mm" # define CUPS_MEDIA_A5 "iso_a5_148x210mm" # define CUPS_MEDIA_A6 "iso_a6_105x148mm" # define CUPS_MEDIA_ENV10 "na_number-10_4.125x9.5in" # define CUPS_MEDIA_ENVDL "iso_dl_110x220mm" # define CUPS_MEDIA_LEGAL "na_legal_8.5x14in" # define CUPS_MEDIA_LETTER "na_letter_8.5x11in" # define CUPS_MEDIA_PHOTO_L "oe_photo-l_3.5x5in" # define CUPS_MEDIA_SUPERBA3 "na_super-b_13x19in" # define CUPS_MEDIA_TABLOID "na_ledger_11x17in" # define CUPS_MEDIA_SOURCE "media-source" # define CUPS_MEDIA_SOURCE_SUPPORTED "media-source-supported" # define CUPS_MEDIA_SOURCE_AUTO "auto" # define CUPS_MEDIA_SOURCE_MANUAL "manual" # define CUPS_MEDIA_TYPE "media-type" # define CUPS_MEDIA_TYPE_SUPPORTED "media-type-supported" # define CUPS_MEDIA_TYPE_AUTO "auto" # define CUPS_MEDIA_TYPE_ENVELOPE "envelope" # define CUPS_MEDIA_TYPE_LABELS "labels" # define CUPS_MEDIA_TYPE_LETTERHEAD "stationery-letterhead" # define CUPS_MEDIA_TYPE_PHOTO "photographic" # define CUPS_MEDIA_TYPE_PHOTO_GLOSSY "photographic-glossy" # define CUPS_MEDIA_TYPE_PHOTO_MATTE "photographic-matte" # define CUPS_MEDIA_TYPE_PLAIN "stationery" # define CUPS_MEDIA_TYPE_TRANSPARENCY "transparency" # define CUPS_NUMBER_UP "number-up" # define CUPS_NUMBER_UP_SUPPORTED "number-up-supported" # define CUPS_ORIENTATION "orientation-requested" # define CUPS_ORIENTATION_SUPPORTED "orientation-requested-supported" # define CUPS_ORIENTATION_PORTRAIT "3" # define CUPS_ORIENTATION_LANDSCAPE "4" # define CUPS_PRINT_COLOR_MODE "print-color-mode" # define CUPS_PRINT_COLOR_MODE_SUPPORTED "print-color-mode-supported" # define CUPS_PRINT_COLOR_MODE_AUTO "auto" # define CUPS_PRINT_COLOR_MODE_MONOCHROME "monochrome" # define CUPS_PRINT_COLOR_MODE_COLOR "color" # define CUPS_PRINT_QUALITY "print-quality" # define CUPS_PRINT_QUALITY_SUPPORTED "print-quality-supported" # define CUPS_PRINT_QUALITY_DRAFT "3" # define CUPS_PRINT_QUALITY_NORMAL "4" # define CUPS_PRINT_QUALITY_HIGH "5" # define CUPS_SIDES "sides" # define CUPS_SIDES_SUPPORTED "sides-supported" # define CUPS_SIDES_ONE_SIDED "one-sided" # define CUPS_SIDES_TWO_SIDED_PORTRAIT "two-sided-long-edge" # define CUPS_SIDES_TWO_SIDED_LANDSCAPE "two-sided-short-edge" /* * Types and structures... */ typedef unsigned cups_ptype_t; /* Printer type/capability bits */ enum cups_ptype_e /* Printer type/capability bit * constants */ { /* Not a typedef'd enum so we can OR */ CUPS_PRINTER_LOCAL = 0x0000, /* Local printer or class */ CUPS_PRINTER_CLASS = 0x0001, /* Printer class */ CUPS_PRINTER_REMOTE = 0x0002, /* Remote printer or class */ CUPS_PRINTER_BW = 0x0004, /* Can do B&W printing */ CUPS_PRINTER_COLOR = 0x0008, /* Can do color printing */ CUPS_PRINTER_DUPLEX = 0x0010, /* Can do two-sided printing */ CUPS_PRINTER_STAPLE = 0x0020, /* Can staple output */ CUPS_PRINTER_COPIES = 0x0040, /* Can do copies in hardware */ CUPS_PRINTER_COLLATE = 0x0080, /* Can quickly collate copies */ CUPS_PRINTER_PUNCH = 0x0100, /* Can punch output */ CUPS_PRINTER_COVER = 0x0200, /* Can cover output */ CUPS_PRINTER_BIND = 0x0400, /* Can bind output */ CUPS_PRINTER_SORT = 0x0800, /* Can sort output */ CUPS_PRINTER_SMALL = 0x1000, /* Can print on Letter/Legal/A4-size media */ CUPS_PRINTER_MEDIUM = 0x2000, /* Can print on Tabloid/B/C/A3/A2-size media */ CUPS_PRINTER_LARGE = 0x4000, /* Can print on D/E/A1/A0-size media */ CUPS_PRINTER_VARIABLE = 0x8000, /* Can print on rolls and custom-size media */ CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class @private@ * @since Deprecated@ */ CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */ CUPS_PRINTER_FAX = 0x40000, /* Fax queue */ CUPS_PRINTER_REJECTING = 0x80000, /* Printer is rejecting jobs */ CUPS_PRINTER_DELETE = 0x100000, /* Delete printer * @deprecated@ @exclude all@ */ CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared * @since CUPS 1.2/macOS 10.5@ */ CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication * @since CUPS 1.2/macOS 10.5@ */ CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands * @since CUPS 1.2/macOS 10.5@ */ CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was discovered @since CUPS 1.2/macOS 10.5@ */ CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device * @since CUPS 1.4/macOS 10.6@ @private@ */ CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities * @since CUPS 1.4/macOS 10.6@ @private@ */ CUPS_PRINTER_3D = 0x8000000, /* Printer with 3D capabilities @exclude all@ @private@ */ CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT | * DEFAULT | FAX | REJECTING | DELETE | * NOT_SHARED | AUTHENTICATED | * COMMANDS | DISCOVERED) @private@ */ }; typedef struct cups_option_s /**** Printer Options ****/ { char *name; /* Name of option */ char *value; /* Value of option */ } cups_option_t; typedef struct cups_dest_s /**** Destination ****/ { char *name, /* Printer or class name */ *instance; /* Local instance name or NULL */ int is_default; /* Is this printer the default? */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ } cups_dest_t; typedef struct _cups_dinfo_s cups_dinfo_t; /* Destination capability and status * information @since CUPS 1.6/macOS 10.8@ */ typedef struct cups_job_s /**** Job ****/ { int id; /* The job ID */ char *dest; /* Printer or class name */ char *title; /* Title/job name */ char *user; /* User that submitted the job */ char *format; /* Document format */ ipp_jstate_t state; /* Job state */ int size; /* Size in kilobytes */ int priority; /* Priority (1-100) */ time_t completed_time; /* Time the job was completed */ time_t creation_time; /* Time the job was created */ time_t processing_time; /* Time the job was processed */ } cups_job_t; typedef struct cups_size_s /**** Media Size @since CUPS 1.6/macOS 10.8@ ****/ { char media[128]; /* Media name to use */ int width, /* Width in hundredths of millimeters */ length, /* Length in hundredths of * millimeters */ bottom, /* Bottom margin in hundredths of * millimeters */ left, /* Left margin in hundredths of * millimeters */ right, /* Right margin in hundredths of * millimeters */ top; /* Top margin in hundredths of * millimeters */ } cups_size_t; typedef int (*cups_client_cert_cb_t)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data); /* Client credentials callback * @since CUPS 1.5/macOS 10.7@ */ typedef int (*cups_dest_cb_t)(void *user_data, unsigned flags, cups_dest_t *dest); /* Destination enumeration callback * @since CUPS 1.6/macOS 10.8@ */ # ifdef __BLOCKS__ typedef int (^cups_dest_block_t)(unsigned flags, cups_dest_t *dest); /* Destination enumeration block * @since CUPS 1.6/macOS 10.8@ * @exclude all@ */ # endif /* __BLOCKS__ */ typedef const char *(*cups_password_cb_t)(const char *prompt); /* Password callback @exclude all@ */ typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data); /* New password callback * @since CUPS 1.4/macOS 10.6@ */ typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, cups_array_t *certs, void *user_data); /* Server credentials callback * @since CUPS 1.5/macOS 10.7@ */ /* * Functions... */ extern int cupsCancelJob(const char *name, int job_id) _CUPS_PUBLIC; extern ipp_t *cupsDoFileRequest(http_t *http, ipp_t *request, const char *resource, const char *filename) _CUPS_PUBLIC; extern ipp_t *cupsDoRequest(http_t *http, ipp_t *request, const char *resource) _CUPS_PUBLIC; extern http_encryption_t cupsEncryption(void); extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs) _CUPS_PUBLIC; extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED_MSG("Use cupsEnumDests instead."); extern const char *cupsGetDefault(void) _CUPS_PUBLIC; extern int cupsGetJobs(cups_job_t **jobs, const char *name, int myjobs, int whichjobs) _CUPS_PUBLIC; extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED_MSG("Use cupsEnumDests instead."); extern ipp_status_t cupsLastError(void) _CUPS_PUBLIC; extern int cupsPrintFile(const char *name, const char *filename, const char *title, int num_options, cups_option_t *options) _CUPS_PUBLIC; extern int cupsPrintFiles(const char *name, int num_files, const char **files, const char *title, int num_options, cups_option_t *options) _CUPS_PUBLIC; extern char *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED_MSG("Use cupsTempFd or cupsTempFile2 instead."); extern int cupsTempFd(char *filename, int len) _CUPS_PUBLIC; extern int cupsAddDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests) _CUPS_PUBLIC; extern void cupsFreeDests(int num_dests, cups_dest_t *dests) _CUPS_PUBLIC; extern cups_dest_t *cupsGetDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests) _CUPS_PUBLIC; extern int cupsGetDests(cups_dest_t **dests) _CUPS_PUBLIC; extern void cupsSetDests(int num_dests, cups_dest_t *dests) _CUPS_PUBLIC; extern int cupsAddOption(const char *name, const char *value, int num_options, cups_option_t **options) _CUPS_PUBLIC; extern void cupsEncodeOptions(ipp_t *ipp, int num_options, cups_option_t *options) _CUPS_PUBLIC; extern void cupsFreeOptions(int num_options, cups_option_t *options) _CUPS_PUBLIC; extern const char *cupsGetOption(const char *name, int num_options, cups_option_t *options) _CUPS_PUBLIC; extern int cupsParseOptions(const char *arg, int num_options, cups_option_t **options) _CUPS_PUBLIC; extern const char *cupsGetPassword(const char *prompt) _CUPS_PUBLIC; extern const char *cupsServer(void) _CUPS_PUBLIC; extern void cupsSetEncryption(http_encryption_t e) _CUPS_PUBLIC; extern void cupsSetPasswordCB(cups_password_cb_t cb) _CUPS_PUBLIC; extern void cupsSetServer(const char *server) _CUPS_PUBLIC; extern void cupsSetUser(const char *user) _CUPS_PUBLIC; extern const char *cupsUser(void) _CUPS_PUBLIC; /**** New in CUPS 1.1.20 ****/ extern int cupsDoAuthentication(http_t *http, const char *method, const char *resource) _CUPS_API_1_1_20; extern http_status_t cupsGetFile(http_t *http, const char *resource, const char *filename) _CUPS_API_1_1_20; extern http_status_t cupsGetFd(http_t *http, const char *resource, int fd) _CUPS_API_1_1_20; extern http_status_t cupsPutFile(http_t *http, const char *resource, const char *filename) _CUPS_API_1_1_20; extern http_status_t cupsPutFd(http_t *http, const char *resource, int fd) _CUPS_API_1_1_20; /**** New in CUPS 1.1.21 ****/ extern const char *cupsGetDefault2(http_t *http) _CUPS_API_1_1_21; extern int cupsGetDests2(http_t *http, cups_dest_t **dests) _CUPS_API_1_1_21; extern int cupsGetJobs2(http_t *http, cups_job_t **jobs, const char *name, int myjobs, int whichjobs) _CUPS_API_1_1_21; extern int cupsPrintFile2(http_t *http, const char *name, const char *filename, const char *title, int num_options, cups_option_t *options) _CUPS_API_1_1_21; extern int cupsPrintFiles2(http_t *http, const char *name, int num_files, const char **files, const char *title, int num_options, cups_option_t *options) _CUPS_API_1_1_21; extern int cupsSetDests2(http_t *http, int num_dests, cups_dest_t *dests) _CUPS_API_1_1_21; /**** New in CUPS 1.2/macOS 10.5 ****/ extern void cupsEncodeOptions2(ipp_t *ipp, int num_options, cups_option_t *options, ipp_tag_t group_tag) _CUPS_API_1_2; extern const char *cupsLastErrorString(void) _CUPS_API_1_2; extern char *cupsNotifySubject(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2; extern char *cupsNotifyText(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2; extern int cupsRemoveOption(const char *name, int num_options, cups_option_t **options) _CUPS_API_1_2; extern cups_file_t *cupsTempFile2(char *filename, int len) _CUPS_API_1_2; /**** New in CUPS 1.3/macOS 10.5 ****/ extern ipp_t *cupsDoIORequest(http_t *http, ipp_t *request, const char *resource, int infile, int outfile) _CUPS_API_1_3; extern int cupsRemoveDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests) _CUPS_API_1_3; extern void cupsSetDefaultDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests) _CUPS_API_1_3; /**** New in CUPS 1.4/macOS 10.6 ****/ extern ipp_status_t cupsCancelJob2(http_t *http, const char *name, int job_id, int purge) _CUPS_API_1_4; extern int cupsCreateJob(http_t *http, const char *name, const char *title, int num_options, cups_option_t *options) _CUPS_API_1_4; extern ipp_status_t cupsFinishDocument(http_t *http, const char *name) _CUPS_API_1_4; extern cups_dest_t *cupsGetNamedDest(http_t *http, const char *name, const char *instance) _CUPS_API_1_4; extern const char *cupsGetPassword2(const char *prompt, http_t *http, const char *method, const char *resource) _CUPS_API_1_4; extern ipp_t *cupsGetResponse(http_t *http, const char *resource) _CUPS_API_1_4; extern ssize_t cupsReadResponseData(http_t *http, char *buffer, size_t length) _CUPS_API_1_4; extern http_status_t cupsSendRequest(http_t *http, ipp_t *request, const char *resource, size_t length) _CUPS_API_1_4; extern void cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data) _CUPS_API_1_4; extern http_status_t cupsStartDocument(http_t *http, const char *name, int job_id, const char *docname, const char *format, int last_document) _CUPS_API_1_4; extern http_status_t cupsWriteRequestData(http_t *http, const char *buffer, size_t length) _CUPS_API_1_4; /**** New in CUPS 1.5/macOS 10.7 ****/ extern void cupsSetClientCertCB(cups_client_cert_cb_t cb, void *user_data) _CUPS_API_1_5; extern int cupsSetCredentials(cups_array_t *certs) _CUPS_API_1_5; extern void cupsSetServerCertCB(cups_server_cert_cb_t cb, void *user_data) _CUPS_API_1_5; /**** New in CUPS 1.6/macOS 10.8 ****/ extern ipp_status_t cupsCancelDestJob(http_t *http, cups_dest_t *dest, int job_id) _CUPS_API_1_6; extern int cupsCheckDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option, const char *value) _CUPS_API_1_6; extern ipp_status_t cupsCloseDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id) _CUPS_API_1_6; extern http_t *cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec, int *cancel, char *resource, size_t resourcesize, cups_dest_cb_t cb, void *user_data) _CUPS_API_1_6; # ifdef __BLOCKS__ extern http_t *cupsConnectDestBlock(cups_dest_t *dest, unsigned flags, int msec, int *cancel, char *resource, size_t resourcesize, cups_dest_block_t block) _CUPS_API_1_6; # endif /* __BLOCKS__ */ extern int cupsCopyDest(cups_dest_t *dest, int num_dests, cups_dest_t **dests) _CUPS_API_1_6; extern cups_dinfo_t *cupsCopyDestInfo(http_t *http, cups_dest_t *dest) _CUPS_API_1_6; extern int cupsCopyDestConflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int num_options, cups_option_t *options, const char *new_option, const char *new_value, int *num_conflicts, cups_option_t **conflicts, int *num_resolved, cups_option_t **resolved) _CUPS_API_1_6; extern ipp_status_t cupsCreateDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int *job_id, const char *title, int num_options, cups_option_t *options) _CUPS_API_1_6; extern int cupsEnumDests(unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data) _CUPS_API_1_6; # ifdef __BLOCKS__ extern int cupsEnumDestsBlock(unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_block_t block) _CUPS_API_1_6; # endif /* __BLOCKS__ */ extern ipp_status_t cupsFinishDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info) _CUPS_API_1_6; extern void cupsFreeDestInfo(cups_dinfo_t *dinfo) _CUPS_API_1_6; extern int cupsGetDestMediaByName(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *media, unsigned flags, cups_size_t *size) _CUPS_API_1_6; extern int cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int width, int length, unsigned flags, cups_size_t *size) _CUPS_API_1_6; extern const char *cupsLocalizeDestOption(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option) _CUPS_API_1_6; extern const char *cupsLocalizeDestValue(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option, const char *value) _CUPS_API_1_6; extern http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id, const char *docname, const char *format, int num_options, cups_option_t *options, int last_document) _CUPS_API_1_6; /* New in CUPS 1.7 */ extern ipp_attribute_t *cupsFindDestDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option) _CUPS_API_1_7; extern ipp_attribute_t *cupsFindDestReady(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option) _CUPS_API_1_7; extern ipp_attribute_t *cupsFindDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option) _CUPS_API_1_7; extern int cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int n, unsigned flags, cups_size_t *size) _CUPS_API_1_7; extern int cupsGetDestMediaCount(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags) _CUPS_API_1_7; extern int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size) _CUPS_API_1_7; extern void cupsSetUserAgent(const char *user_agent) _CUPS_API_1_7; extern const char *cupsUserAgent(void) _CUPS_API_1_7; /* New in CUPS 2.0/macOS 10.10 */ extern cups_dest_t *cupsGetDestWithURI(const char *name, const char *uri) _CUPS_API_2_0; extern const char *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, unsigned flags, cups_size_t *size) _CUPS_API_2_0; extern int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date) _CUPS_API_2_0; extern int cupsSetServerCredentials(const char *path, const char *common_name, int auto_create) _CUPS_API_2_0; /* New in CUPS 2.2/macOS 10.12 */ extern ssize_t cupsHashData(const char *algorithm, const void *data, size_t datalen, unsigned char *hash, size_t hashsize) _CUPS_API_2_2; /* New in CUPS 2.2.4 */ extern int cupsAddIntegerOption(const char *name, int value, int num_options, cups_option_t **options) _CUPS_API_2_2_4; extern int cupsGetIntegerOption(const char *name, int num_options, cups_option_t *options) _CUPS_API_2_2_4; /* New in CUPS 2.2.7 */ extern const char *cupsHashString(const unsigned char *hash, size_t hashsize, char *buffer, size_t bufsize) _CUPS_API_2_2_7; /* New in CUPS 2.3 */ extern int cupsAddDestMediaOptions(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size, int num_options, cups_option_t **options) _CUPS_API_2_3; extern ipp_attribute_t *cupsEncodeOption(ipp_t *ipp, ipp_tag_t group_tag, const char *name, const char *value) _CUPS_API_2_3; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_CUPS_H_ */ cups-2.3.1/cups/thread.c000664 000765 000024 00000021574 13574721672 015175 0ustar00mikestaff000000 000000 /* * Threading primitives for CUPS. * * Copyright © 2009-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "thread-private.h" #if defined(HAVE_PTHREAD_H) /* * '_cupsCondBroadcast()' - Wake up waiting threads. */ void _cupsCondBroadcast(_cups_cond_t *cond) /* I - Condition */ { pthread_cond_broadcast(cond); } /* * '_cupsCondInit()' - Initialize a condition variable. */ void _cupsCondInit(_cups_cond_t *cond) /* I - Condition */ { pthread_cond_init(cond, NULL); } /* * '_cupsCondWait()' - Wait for a condition with optional timeout. */ void _cupsCondWait(_cups_cond_t *cond, /* I - Condition */ _cups_mutex_t *mutex, /* I - Mutex */ double timeout) /* I - Timeout in seconds (0 or negative for none) */ { if (timeout > 0.0) { struct timespec abstime; /* Timeout */ clock_gettime(CLOCK_REALTIME, &abstime); abstime.tv_sec += (long)timeout; abstime.tv_nsec += (long)(1000000000 * (timeout - (long)timeout)); while (abstime.tv_nsec >= 1000000000) { abstime.tv_nsec -= 1000000000; abstime.tv_sec ++; }; pthread_cond_timedwait(cond, mutex, &abstime); } else pthread_cond_wait(cond, mutex); } /* * '_cupsMutexInit()' - Initialize a mutex. */ void _cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ { pthread_mutex_init(mutex, NULL); } /* * '_cupsMutexLock()' - Lock a mutex. */ void _cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ { pthread_mutex_lock(mutex); } /* * '_cupsMutexUnlock()' - Unlock a mutex. */ void _cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ { pthread_mutex_unlock(mutex); } /* * '_cupsRWInit()' - Initialize a reader/writer lock. */ void _cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { pthread_rwlock_init(rwlock, NULL); } /* * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. */ void _cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { pthread_rwlock_rdlock(rwlock); } /* * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. */ void _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ { pthread_rwlock_wrlock(rwlock); } /* * '_cupsRWUnlock()' - Release a reader/writer lock. */ void _cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { pthread_rwlock_unlock(rwlock); } /* * '_cupsThreadCancel()' - Cancel (kill) a thread. */ void _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */ { pthread_cancel(thread); } /* * '_cupsThreadCreate()' - Create a thread. */ _cups_thread_t /* O - Thread ID */ _cupsThreadCreate( _cups_thread_func_t func, /* I - Entry point */ void *arg) /* I - Entry point context */ { pthread_t thread; if (pthread_create(&thread, NULL, (void *(*)(void *))func, arg)) return (0); else return (thread); } /* * '_cupsThreadDetach()' - Tell the OS that the thread is running independently. */ void _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */ { pthread_detach(thread); } /* * '_cupsThreadWait()' - Wait for a thread to exit. */ void * /* O - Return value */ _cupsThreadWait(_cups_thread_t thread) /* I - Thread ID */ { void *ret; /* Return value */ if (pthread_join(thread, &ret)) return (NULL); else return (ret); } #elif defined(_WIN32) # include /* * '_cupsCondBroadcast()' - Wake up waiting threads. */ void _cupsCondBroadcast(_cups_cond_t *cond) /* I - Condition */ { // TODO: Implement me } /* * '_cupsCondInit()' - Initialize a condition variable. */ void _cupsCondInit(_cups_cond_t *cond) /* I - Condition */ { // TODO: Implement me } /* * '_cupsCondWait()' - Wait for a condition with optional timeout. */ void _cupsCondWait(_cups_cond_t *cond, /* I - Condition */ _cups_mutex_t *mutex, /* I - Mutex */ double timeout) /* I - Timeout in seconds (0 or negative for none) */ { // TODO: Implement me } /* * '_cupsMutexInit()' - Initialize a mutex. */ void _cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ { InitializeCriticalSection(&mutex->m_criticalSection); mutex->m_init = 1; } /* * '_cupsMutexLock()' - Lock a mutex. */ void _cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ { if (!mutex->m_init) { _cupsGlobalLock(); if (!mutex->m_init) { InitializeCriticalSection(&mutex->m_criticalSection); mutex->m_init = 1; } _cupsGlobalUnlock(); } EnterCriticalSection(&mutex->m_criticalSection); } /* * '_cupsMutexUnlock()' - Unlock a mutex. */ void _cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ { LeaveCriticalSection(&mutex->m_criticalSection); } /* * '_cupsRWInit()' - Initialize a reader/writer lock. */ void _cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { _cupsMutexInit((_cups_mutex_t *)rwlock); } /* * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. */ void _cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { _cupsMutexLock((_cups_mutex_t *)rwlock); } /* * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. */ void _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ { _cupsMutexLock((_cups_mutex_t *)rwlock); } /* * '_cupsRWUnlock()' - Release a reader/writer lock. */ void _cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { _cupsMutexUnlock((_cups_mutex_t *)rwlock); } /* * '_cupsThreadCancel()' - Cancel (kill) a thread. */ void _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */ { // TODO: Implement me } /* * '_cupsThreadCreate()' - Create a thread. */ _cups_thread_t /* O - Thread ID */ _cupsThreadCreate( _cups_thread_func_t func, /* I - Entry point */ void *arg) /* I - Entry point context */ { return (_beginthreadex(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL)); } /* * '_cupsThreadDetach()' - Tell the OS that the thread is running independently. */ void _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */ { // TODO: Implement me (void)thread; } /* * '_cupsThreadWait()' - Wait for a thread to exit. */ void * /* O - Return value */ _cupsThreadWait(_cups_thread_t thread) /* I - Thread ID */ { // TODO: Implement me (void)thread; return (NULL); } #else /* No threading */ /* * '_cupsCondBroadcast()' - Wake up waiting threads. */ void _cupsCondBroadcast(_cups_cond_t *cond) /* I - Condition */ { // TODO: Implement me } /* * '_cupsCondInit()' - Initialize a condition variable. */ void _cupsCondInit(_cups_cond_t *cond) /* I - Condition */ { // TODO: Implement me } /* * '_cupsCondWait()' - Wait for a condition with optional timeout. */ void _cupsCondWait(_cups_cond_t *cond, /* I - Condition */ _cups_mutex_t *mutex, /* I - Mutex */ double timeout) /* I - Timeout in seconds (0 or negative for none) */ { // TODO: Implement me } /* * '_cupsMutexInit()' - Initialize a mutex. */ void _cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ { (void)mutex; } /* * '_cupsMutexLock()' - Lock a mutex. */ void _cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ { (void)mutex; } /* * '_cupsMutexUnlock()' - Unlock a mutex. */ void _cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ { (void)mutex; } /* * '_cupsRWInit()' - Initialize a reader/writer lock. */ void _cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { (void)rwlock; } /* * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. */ void _cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { (void)rwlock; } /* * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. */ void _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ { (void)rwlock; } /* * '_cupsRWUnlock()' - Release a reader/writer lock. */ void _cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ { (void)rwlock; } /* * '_cupsThreadCancel()' - Cancel (kill) a thread. */ void _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */ { (void)thread; } /* * '_cupsThreadCreate()' - Create a thread. */ _cups_thread_t /* O - Thread ID */ _cupsThreadCreate( _cups_thread_func_t func, /* I - Entry point */ void *arg) /* I - Entry point context */ { fputs("DEBUG: CUPS was compiled without threading support, no thread created.\n", stderr); (void)func; (void)arg; return (0); } /* * '_cupsThreadDetach()' - Tell the OS that the thread is running independently. */ void _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */ { (void)thread; } /* * '_cupsThreadWait()' - Wait for a thread to exit. */ void * /* O - Return value */ _cupsThreadWait(_cups_thread_t thread) /* I - Thread ID */ { (void)thread; return (NULL); } #endif /* HAVE_PTHREAD_H */ cups-2.3.1/cups/testoptions.c000664 000765 000024 00000011650 13574721672 016313 0ustar00mikestaff000000 000000 /* * Option unit test program for CUPS. * * Copyright 2008-2016 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" /* * 'main()' - Test option processing functions. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int status = 0, /* Exit status */ num_options; /* Number of options */ cups_option_t *options; /* Options */ const char *value; /* Value of an option */ ipp_t *request; /* IPP request */ ipp_attribute_t *attr; /* IPP attribute */ int count; /* Number of attributes */ if (argc == 1) { /* * cupsParseOptions() */ fputs("cupsParseOptions: ", stdout); num_options = cupsParseOptions("foo=1234 " "bar=\"One Fish\",\"Two Fish\",\"Red Fish\"," "\"Blue Fish\" " "baz={param1=1 param2=2} " "foobar=FOO\\ BAR " "barfoo=barfoo " "barfoo=\"\'BAR FOO\'\" " "auth-info=user,pass\\\\,word\\\\\\\\", 0, &options); if (num_options != 6) { printf("FAIL (num_options=%d, expected 6)\n", num_options); status ++; } else if ((value = cupsGetOption("foo", num_options, options)) == NULL || strcmp(value, "1234")) { printf("FAIL (foo=\"%s\", expected \"1234\")\n", value); status ++; } else if ((value = cupsGetOption("bar", num_options, options)) == NULL || strcmp(value, "One Fish,Two Fish,Red Fish,Blue Fish")) { printf("FAIL (bar=\"%s\", expected \"One Fish,Two Fish,Red Fish,Blue " "Fish\")\n", value); status ++; } else if ((value = cupsGetOption("baz", num_options, options)) == NULL || strcmp(value, "{param1=1 param2=2}")) { printf("FAIL (baz=\"%s\", expected \"{param1=1 param2=2}\")\n", value); status ++; } else if ((value = cupsGetOption("foobar", num_options, options)) == NULL || strcmp(value, "FOO BAR")) { printf("FAIL (foobar=\"%s\", expected \"FOO BAR\")\n", value); status ++; } else if ((value = cupsGetOption("barfoo", num_options, options)) == NULL || strcmp(value, "\'BAR FOO\'")) { printf("FAIL (barfoo=\"%s\", expected \"\'BAR FOO\'\")\n", value); status ++; } else if ((value = cupsGetOption("auth-info", num_options, options)) == NULL || strcmp(value, "user,pass\\,word\\\\")) { printf("FAIL (auth-info=\"%s\", expected \"user,pass\\,word\\\\\")\n", value); status ++; } else puts("PASS"); fputs("cupsEncodeOptions2: ", stdout); request = ippNew(); ippSetOperation(request, IPP_OP_PRINT_JOB); cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB); for (count = 0, attr = ippFirstAttribute(request); attr; attr = ippNextAttribute(request), count ++); if (count != 6) { printf("FAIL (%d attributes, expected 6)\n", count); status ++; } else if ((attr = ippFindAttribute(request, "foo", IPP_TAG_ZERO)) == NULL) { puts("FAIL (Unable to find attribute \"foo\")"); status ++; } else if (ippGetValueTag(attr) != IPP_TAG_NAME) { printf("FAIL (\"foo\" of type %s, expected name)\n", ippTagString(ippGetValueTag(attr))); status ++; } else if (ippGetCount(attr) != 1) { printf("FAIL (\"foo\" has %d values, expected 1)\n", (int)ippGetCount(attr)); status ++; } else if (strcmp(ippGetString(attr, 0, NULL), "1234")) { printf("FAIL (\"foo\" has value %s, expected 1234)\n", ippGetString(attr, 0, NULL)); status ++; } else if ((attr = ippFindAttribute(request, "auth-info", IPP_TAG_ZERO)) == NULL) { puts("FAIL (Unable to find attribute \"auth-info\")"); status ++; } else if (ippGetValueTag(attr) != IPP_TAG_TEXT) { printf("FAIL (\"auth-info\" of type %s, expected text)\n", ippTagString(ippGetValueTag(attr))); status ++; } else if (ippGetCount(attr) != 2) { printf("FAIL (\"auth-info\" has %d values, expected 2)\n", (int)ippGetCount(attr)); status ++; } else if (strcmp(ippGetString(attr, 0, NULL), "user")) { printf("FAIL (\"auth-info\"[0] has value \"%s\", expected \"user\")\n", ippGetString(attr, 0, NULL)); status ++; } else if (strcmp(ippGetString(attr, 1, NULL), "pass,word\\")) { printf("FAIL (\"auth-info\"[1] has value \"%s\", expected \"pass,word\\\")\n", ippGetString(attr, 1, NULL)); status ++; } else puts("PASS"); } else { int i; /* Looping var */ cups_option_t *option; /* Current option */ num_options = cupsParseOptions(argv[1], 0, &options); for (i = 0, option = options; i < num_options; i ++, option ++) printf("options[%d].name=\"%s\", value=\"%s\"\n", i, option->name, option->value); } exit (status); } cups-2.3.1/cups/api-admin.header000664 000765 000024 00000001302 13574721672 016556 0ustar00mikestaff000000 000000

Administrative APIs

Header cups/adminutil.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS API
Programming: HTTP and IPP APIs
cups-2.3.1/cups/testthreads.c000664 000765 000024 00000015233 13574721672 016253 0ustar00mikestaff000000 000000 /* * 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 #include #include #include /* * 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"); } cups-2.3.1/cups/api-admin.shtml000664 000765 000024 00000012475 13574721672 016472 0ustar00mikestaff000000 000000

Overview

The administrative APIs provide convenience functions to perform certain administrative functions with the CUPS scheduler.

Note:

Administrative functions normally require administrative privileges to execute and must not be used in ordinary user applications!

Scheduler Settings

The cupsAdminGetServerSettings and cupsAdminSetServerSettings functions allow you to get and set simple directives and their values, respectively, in the cupsd.conf file for the CUPS scheduler. Settings are stored in CUPS option arrays which provide a simple list of string name/value pairs. While any simple cupsd.conf directive name can be specified, the following convenience names are also defined to control common complex directives:

  • CUPS_SERVER_DEBUG_LOGGING
  • : For cupsAdminGetServerSettings, a value of "1" means that the LogLevel directive is set to debug or debug2 while a value of "0" means it is set to any other value. For cupsAdminSetServerSettings a value of "1" sets the LogLeveL to debug while a value of "0" sets it to warn.
  • CUPS_SERVER_REMOTE_ADMIN
  • : A value of "1" specifies that administrative requests are accepted from remote addresses while "0" specifies that requests are only accepted from local addresses (loopback interface and domain sockets).
  • CUPS_SERVER_REMOTE_ANY
  • : A value of "1" specifies that requests are accepts from any address while "0" specifies that requests are only accepted from the local subnet (when sharing is enabled) or local addresses (loopback interface and domain sockets).
  • CUPS_SERVER_SHARE_PRINTERS
  • : A value of "1" specifies that printer sharing is enabled for selected printers and remote requests are accepted while a value of "0" specifies that printer sharing is disables and remote requests are not accepted.
  • CUPS_SERVER_USER_CANCEL_ANY
  • : A value of "1" specifies that the default security policy allows any user to cancel any print job, regardless of the owner. A value of "0" specifies that only administrative users can cancel other user's jobs.
Note:

Changing settings will restart the CUPS scheduler.

When printer sharing or the web interface are enabled, the scheduler's launch-on-demand functionality is effectively disabled. This can affect power usage, system performance, and the security profile of a system.

The recommended way to make changes to the cupsd.conf is to first call cupsAdminGetServerSettings, make any changes to the returned option array, and then call cupsAdminSetServerSettings to save those settings. For example, to enable the web interface:

#include <cups/cups.h>
#include <cups/adminutil.h>

void
enable_web_interface(void)
{
  int num_settings = 0;           /* Number of settings */
  cups_option_t *settings = NULL; /* Settings */


  if (!cupsAdminGetServerSettings(CUPS_HTTP_DEFAULT, &num_settings, &settings))
  {
    fprintf(stderr, "ERROR: Unable to get server settings: %s\n", cupsLastErrorString());
    return;
  }

  num_settings = cupsAddOption("WebInterface", "Yes", num_settings, &settings);

  if (!cupsAdminSetServerSettings(CUPS_HTTP_DEFAULT, num_settings, settings))
  {
    fprintf(stderr, "ERROR: Unable to set server settings: %s\n", cupsLastErrorString());
  }

  cupsFreeOptions(num_settings, settings);
}

Devices

Printers can be discovered through the CUPS scheduler using the cupsGetDevices API. Typically this API is used to locate printers to add the the system. Each device that is found will cause a supplied callback function to be executed. For example, to list the available printer devices that can be found within 30 seconds:

#include <cups/cups.h>
#include <cups/adminutil.h>


void
get_devices_cb(
    const char *device_class,           /* I - Class */
    const char *device_id,              /* I - 1284 device ID */
    const char *device_info,            /* I - Description */
    const char *device_make_and_model,  /* I - Make and model */
    const char *device_uri,             /* I - Device URI */
    const char *device_location,        /* I - Location */
    void       *user_data)              /* I - User data */
{
  puts(device_uri);
}


void
show_devices(void)
{
  cupsGetDevices(CUPS_HTTP_DEFAULT, 30, NULL, NULL, get_devices_cb, NULL);
}
cups-2.3.1/cups/ipp-vars.c000664 000765 000024 00000012774 13574721672 015471 0ustar00mikestaff000000 000000 /* * IPP data file parsing functions. * * 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 * information. */ /* * Include necessary headers... */ #include #include "ipp-private.h" #include "string-private.h" #include "debug-internal.h" /* * '_ippVarsDeinit()' - Free all memory associated with the IPP variables. */ void _ippVarsDeinit(_ipp_vars_t *v) /* I - IPP variables */ { if (v->uri) { free(v->uri); v->uri = NULL; } cupsFreeOptions(v->num_vars, v->vars); v->num_vars = 0; v->vars = NULL; } /* * '_ippVarsExpand()' - Expand variables in the source string. */ void _ippVarsExpand(_ipp_vars_t *v, /* I - IPP variables */ char *dst, /* I - Destination buffer */ const char *src, /* I - Source string */ size_t dstsize) /* I - Destination buffer size */ { char *dstptr, /* Pointer into destination */ *dstend, /* End of destination */ temp[256], /* Temporary string */ *tempptr; /* Pointer into temporary string */ const char *value; /* Value to substitute */ dstptr = dst; dstend = dst + dstsize - 1; while (*src && dstptr < dstend) { if (*src == '$') { /* * Substitute a string/number... */ if (!strncmp(src, "$$", 2)) { value = "$"; src += 2; } else if (!strncmp(src, "$ENV[", 5)) { strlcpy(temp, src + 5, sizeof(temp)); for (tempptr = temp; *tempptr; tempptr ++) if (*tempptr == ']') break; if (*tempptr) *tempptr++ = '\0'; value = getenv(temp); src += tempptr - temp + 5; } else { if (src[1] == '{') { src += 2; strlcpy(temp, src, sizeof(temp)); if ((tempptr = strchr(temp, '}')) != NULL) *tempptr = '\0'; else tempptr = temp + strlen(temp); } else { strlcpy(temp, src + 1, sizeof(temp)); for (tempptr = temp; *tempptr; tempptr ++) if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_') break; if (*tempptr) *tempptr = '\0'; } value = _ippVarsGet(v, temp); src += tempptr - temp + 1; } if (value) { strlcpy(dstptr, value, (size_t)(dstend - dstptr + 1)); dstptr += strlen(dstptr); } } else *dstptr++ = *src++; } *dstptr = '\0'; } /* * '_ippVarsGet()' - Get a variable string. */ const char * /* O - Value or @code NULL@ if not set */ _ippVarsGet(_ipp_vars_t *v, /* I - IPP variables */ const char *name) /* I - Variable name */ { if (!v) return (NULL); else if (!strcmp(name, "uri")) return (v->uri); else if (!strcmp(name, "uriuser") || !strcmp(name, "username")) return (v->username[0] ? v->username : NULL); else if (!strcmp(name, "scheme") || !strcmp(name, "method")) return (v->scheme); else if (!strcmp(name, "hostname")) return (v->host); else if (!strcmp(name, "port")) return (v->portstr); else if (!strcmp(name, "resource")) return (v->resource); else if (!strcmp(name, "user")) return (cupsUser()); else return (cupsGetOption(name, v->num_vars, v->vars)); } /* * '_ippVarsInit()' - Initialize . */ void _ippVarsInit(_ipp_vars_t *v, /* I - IPP variables */ _ipp_fattr_cb_t attrcb, /* I - Attribute (filter) callback */ _ipp_ferror_cb_t errorcb, /* I - Error callback */ _ipp_ftoken_cb_t tokencb) /* I - Token callback */ { memset(v, 0, sizeof(_ipp_vars_t)); v->attrcb = attrcb; v->errorcb = errorcb; v->tokencb = tokencb; } /* * '_ippVarsPasswordCB()' - Password callback using the IPP variables. */ const char * /* O - Password string or @code NULL@ */ _ippVarsPasswordCB( const char *prompt, /* I - Prompt string (not used) */ http_t *http, /* I - HTTP connection (not used) */ const char *method, /* I - HTTP method (not used) */ const char *resource, /* I - Resource path (not used) */ void *user_data) /* I - IPP variables */ { _ipp_vars_t *v = (_ipp_vars_t *)user_data; /* I - IPP variables */ (void)prompt; (void)http; (void)method; (void)resource; if (v->username[0] && v->password && v->password_tries < 3) { v->password_tries ++; cupsSetUser(v->username); return (v->password); } else { return (NULL); } } /* * '_ippVarsSet()' - Set an IPP variable. */ int /* O - 1 on success, 0 on failure */ _ippVarsSet(_ipp_vars_t *v, /* I - IPP variables */ const char *name, /* I - Variable name */ const char *value) /* I - Variable value */ { if (!strcmp(name, "uri")) { char uri[1024]; /* New printer URI */ http_uri_status_t uri_status; /* URI status */ if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK) return (0); if (v->username[0]) { if ((v->password = strchr(v->username, ':')) != NULL) *(v->password)++ = '\0'; } snprintf(v->portstr, sizeof(v->portstr), "%d", v->port); if (v->uri) free(v->uri); httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), v->scheme, NULL, v->host, v->port, v->resource); v->uri = strdup(uri); return (v->uri != NULL); } else { v->num_vars = cupsAddOption(name, value, v->num_vars, &v->vars); return (1); } } cups-2.3.1/cups/api-filter.shtml000664 000765 000024 00000075117 13574721672 016671 0ustar00mikestaff000000 000000

Overview

Filters (which include printer drivers and port monitors) and backends are used to convert job files to a printable format and send that data to the printer itself. All of these programs use a common interface for processing print jobs and communicating status information to the scheduler. Each is run with a standard set of command-line arguments:

argv[1]
The job ID
argv[2]
The user printing the job
argv[3]
The job name/title
argv[4]
The number of copies to print
argv[5]
The options that were provided when the job was submitted
argv[6]
The file to print (first program only)

The scheduler runs one or more of these programs to print any given job. The first filter reads from the print file and writes to the standard output, while the remaining filters read from the standard input and write to the standard output. The backend is the last filter in the chain and writes to the device.

Filters are always run as a non-privileged user, typically "lp", with no connection to the user's desktop. Backends are run either as a non-privileged user or as root if the file permissions do not allow user or group execution. The file permissions section talks about this in more detail.

Security Considerations

It is always important to use security programming practices. Filters and most backends are run as a non-privileged user, so the major security consideration is resource utilization - filters should not depend on unlimited amounts of CPU, memory, or disk space, and should protect against conditions that could lead to excess usage of any resource like infinite loops and unbounded recursion. In addition, filters must never allow the user to specify an arbitrary file path to a separator page, template, or other file used by the filter since that can lead to an unauthorized disclosure of information. Always treat input as suspect and validate it!

If you are developing a backend that runs as root, make sure to check for potential buffer overflows, integer under/overflow conditions, and file accesses since these can lead to privilege escalations. When writing files, always validate the file path and never allow a user to determine where to store a file.

Note:

Never write files to a user's home directory. Aside from the security implications, CUPS is a network print service and as such the network user may not be the same as the local user and/or there may not be a local home directory to write to.

In addition, some operating systems provide additional security mechanisms that further limit file system access, even for backends running as root. On macOS, for example, no backend may write to a user's home directory. See the Sandboxing on macOS section for more information.

Canceled Jobs and Signal Handling

The scheduler sends SIGTERM when a printing job is canceled or held. Filters, backends, and port monitors must catch SIGTERM and perform any cleanup necessary to produce a valid output file or return the printer to a known good state. The recommended behavior is to end the output on the current page, preferably on the current line or object being printed.

Filters and backends may also receive SIGPIPE when an upstream or downstream filter/backend exits with a non-zero status. Developers should generally ignore SIGPIPE at the beginning of main() with the following function call:

#include <signal.h>

...

int
main(int argc, char *argv[])
{
  signal(SIGPIPE, SIG_IGN);

  ...
}

File Permissions

For security reasons, CUPS will only run filters and backends that are owned by root and do not have world or group write permissions. The recommended permissions for filters and backends are 0555 - read and execute but no write. Backends that must run as root should use permissions of 0500 - read and execute by root, no access for other users. Write permissions can be enabled for the root user only.

To avoid a warning message, the directory containing your filter(s) must also be owned by root and have world and group write disabled - permissions of 0755 or 0555 are strongly encouraged.

Temporary Files

Temporary files should be created in the directory specified by the "TMPDIR" environment variable. The cupsTempFile2 function can be used to safely create temporary files in this directory.

Copy Generation

The argv[4] argument specifies the number of copies to produce of the input file. In general, you should only generate copies if the filename argument is supplied. The only exception to this are filters that produce device-independent PostScript output, since the PostScript filter pstops is responsible for generating copies of PostScript files.

Exit Codes

Filters must exit with status 0 when they successfully generate print data or 1 when they encounter an error. Backends can return any of the cups_backend_t constants.

Environment Variables

The following environment variables are defined by the printing system when running print filters and backends:

APPLE_LANGUAGE
The Apple language identifier associated with the job (macOS only).
CHARSET
The job character set, typically "utf-8".
CLASS
When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set.
CONTENT_TYPE
The MIME type associated with the file (e.g. application/postscript).
CUPS_CACHEDIR
The directory where cache files can be stored. Cache files can be used to retain information between jobs or files in a job.
CUPS_DATADIR
The directory where (read-only) CUPS data files can be found.
CUPS_FILETYPE
The type of file being printed: "job-sheet" for a banner page and "document" for a regular print file.
CUPS_SERVERROOT
The root directory of the server.
DEVICE_URI
The device-uri associated with the printer.
FINAL_CONTENT_TYPE
The MIME type associated with the printer (e.g. application/vnd.cups-postscript).
LANG
The language locale associated with the job.
PPD
The full pathname of the PostScript Printer Description (PPD) file for this printer.
PRINTER
The queue name of the class or printer.
RIP_CACHE
The recommended amount of memory to use for Raster Image Processors (RIPs).
TMPDIR
The directory where temporary files should be created.

Communicating with the Scheduler

Filters and backends communicate with the scheduler by writing messages to the standard error file. The scheduler reads messages from all filters in a job and processes the message based on its prefix. For example, the following code sets the current printer state message to "Printing page 5":

int page = 5;

fprintf(stderr, "INFO: Printing page %d\n", page);

Each message is a single line of text starting with one of the following prefix strings:

ALERT: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "alert" log level.
ATTR: attribute=value [attribute=value]
Sets the named printer or job attribute(s). Typically this is used to set the marker-colors, marker-high-levels, marker-levels, marker-low-levels, marker-message, marker-names, marker-types, printer-alert, and printer-alert-description printer attributes. Standard marker-types values are listed in Table 1. String values need special handling - see Reporting Attribute String Values below.
CRIT: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "critical" log level.
DEBUG: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "debug" log level.
DEBUG2: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "debug2" log level.
EMERG: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "emergency" log level.
ERROR: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "error" log level. Use "ERROR:" messages for non-persistent processing errors.
INFO: message
Sets the printer-state-message attribute. If the current log level is set to "debug2", also adds the specified message to the current error log file using the "info" log level.
NOTICE: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "notice" log level.
PAGE: page-number #-copies
PAGE: total #-pages
Adds an entry to the current page log file. The first form adds #-copies to the job-media-sheets-completed attribute. The second form sets the job-media-sheets-completed attribute to #-pages.
PPD: keyword=value [keyword=value ...]
Changes or adds keywords to the printer's PPD file. Typically this is used to update installable options or default media settings based on the printer configuration.
STATE: + printer-state-reason [printer-state-reason ...]
STATE: - printer-state-reason [printer-state-reason ...]
Sets or clears printer-state-reason keywords for the current queue. Typically this is used to indicate persistent media, ink, toner, and configuration conditions or errors on a printer. Table 2 lists some of the standard "printer-state-reasons" keywords from the IANA IPP Registry - use vendor-prefixed ("com.example.foo") keywords for custom states. See Managing Printer State in a Filter for more information.
WARNING: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "warning" log level.

Messages without one of these prefixes are treated as if they began with the "DEBUG:" prefix string.

Table 1: Standard marker-types Values
marker-type Description
developer Developer unit
fuser Fuser unit
fuser-cleaning-pad Fuser cleaning pad
fuser-oil Fuser oil
ink Ink supply
opc Photo conductor
solid-wax Wax supply
staples Staple supply
toner Toner supply
transfer-unit Transfer unit
waste-ink Waste ink tank
waste-toner Waste toner tank
waste-wax Waste wax tank

Table 2: Standard State Keywords
Keyword Description
connecting-to-device Connecting to printer but not printing yet.
cover-open The printer's cover is open.
input-tray-missing The paper tray is missing.
marker-supply-empty The printer is out of ink.
marker-supply-low The printer is almost out of ink.
marker-waste-almost-full The printer's waste bin is almost full.
marker-waste-full The printer's waste bin is full.
media-empty The paper tray (any paper tray) is empty.
media-jam There is a paper jam.
media-low The paper tray (any paper tray) is almost empty.
media-needed The paper tray needs to be filled (for a job that is printing).
paused Stop the printer.
timed-out Unable to connect to printer.
toner-empty The printer is out of toner.
toner-low The printer is low on toner.

Reporting Attribute String Values

When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:

name=simple
name=simple,simple,...
name='complex value'
name="complex value"
name='"complex value"','"complex value"',...

Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:

int levels[4] = { 40, 50, 60, 70 }; /* CMYK */

fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr);
fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr);
fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1],
        levels[2], levels[3], levels[4]);
fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr);
fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr);

Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:

fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);

When multiple values are reported, each value must be enclosed by a set of single and double quotes:

fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
      "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);

The IPP backend includes a quote_string function that may be used to properly quote a complex value in an "ATTR:" message:

static const char *                     /* O - Quoted string */
quote_string(const char *s,             /* I - String */
             char       *q,             /* I - Quoted string buffer */
             size_t     qsize)          /* I - Size of quoted string buffer */
{
  char  *qptr,                          /* Pointer into string buffer */
        *qend;                          /* End of string buffer */


  qptr = q;
  qend = q + qsize - 5;

  if (qend < q)
  {
    *q = '\0';
    return (q);
  }

  *qptr++ = '\'';
  *qptr++ = '\"';

  while (*s && qptr < qend)
  {
    if (*s == '\\' || *s == '\"' || *s == '\'')
    {
      if (qptr < (qend - 4))
      {
        *qptr++ = '\\';
        *qptr++ = '\\';
        *qptr++ = '\\';
      }
      else
        break;
    }

    *qptr++ = *s++;
  }

  *qptr++ = '\"';
  *qptr++ = '\'';
  *qptr   = '\0';

  return (q);
}

Managing Printer State in a Filter

Filters are responsible for managing the state keywords they set using "STATE:" messages. Typically you will update all of the keywords that are used by the filter at startup, for example:

if (foo_condition != 0)
  fputs("STATE: +com.example.foo\n", stderr);
else
  fputs("STATE: -com.example.foo\n", stderr);

if (bar_condition != 0)
  fputs("STATE: +com.example.bar\n", stderr);
else
  fputs("STATE: -com.example.bar\n", stderr);

Then as conditions change, your filter sends "STATE: +keyword" or "STATE: -keyword" messages as necessary to set or clear the corresponding keyword, respectively.

State keywords are often used to notify the user of issues that span across jobs, for example "media-empty-warning" that indicates one or more paper trays are empty. These keywords should not be cleared unless the corresponding issue no longer exists.

Filters should clear job-related keywords on startup and exit so that they do not remain set between jobs. For example, "connecting-to-device" is a job sub-state and not an issue that applies when a job is not printing.

Note:

"STATE:" messages often provide visible alerts to the user. For example, on macOS setting a printer-state-reason value with an "-error" or "-warning" suffix will cause the printer's dock item to bounce if the corresponding reason is localized with a cupsIPPReason keyword in the printer's PPD file.

When providing a vendor-prefixed keyword, always provide the corresponding standard keyword (if any) to allow clients to respond to the condition correctly. For example, if you provide a vendor-prefixed keyword for a low cyan ink condition ("com.example.cyan-ink-low") you must also set the "marker-supply-low-warning" keyword. In such cases you should also refrain from localizing the vendor-prefixed keyword in the PPD file - otherwise both the generic and vendor-specific keyword will be shown in the user interface.

Reporting Supply Levels

CUPS tracks several "marker-*" attributes for ink/toner supply level reporting. These attributes allow applications to display the current supply levels for a printer without printer-specific software. Table 3 lists the marker attributes and what they represent.

Filters set marker attributes by sending "ATTR:" messages to stderr. For example, a filter supporting an inkjet printer with black and tri-color ink cartridges would use the following to initialize the supply attributes:

fputs("ATTR: marker-colors=#000000,#00FFFF#FF00FF#FFFF00\n", stderr);
fputs("ATTR: marker-low-levels=5,10\n", stderr);
fputs("ATTR: marker-names=Black,Tri-Color\n", stderr);
fputs("ATTR: marker-types=ink,ink\n", stderr);

Then periodically the filter queries the printer for its current supply levels and updates them with a separate "ATTR:" message:

int black_level, tri_level;
...
fprintf(stderr, "ATTR: marker-levels=%d,%d\n", black_level, tri_level);
Table 3: Supply Level Attributes
Attribute Description
marker-colors A list of comma-separated colors; each color is either "none" or one or more hex-encoded sRGB colors of the form "#RRGGBB".
marker-high-levels A list of comma-separated "almost full" level values from 0 to 100; a value of 100 should be used for supplies that are consumed/emptied like ink cartridges.
marker-levels A list of comma-separated level values for each supply. A value of -1 indicates the level is unavailable, -2 indicates unknown, and -3 indicates the level is unknown but has not yet reached capacity. Values from 0 to 100 indicate the corresponding percentage.
marker-low-levels A list of comma-separated "almost empty" level values from 0 to 100; a value of 0 should be used for supplies that are filled like waste ink tanks.
marker-message A human-readable supply status message for the user like "12 pages of ink remaining."
marker-names A list of comma-separated supply names like "Cyan Ink", "Fuser", etc.
marker-types A list of comma-separated supply types; the types are listed in Table 1.

Communicating with the Backend

Filters can communicate with the backend via the cupsBackChannelRead and cupsSideChannelDoRequest functions. The cupsBackChannelRead function reads data that has been sent back from the device and is typically used to obtain status and configuration information. For example, the following code polls the backend for back-channel data:

#include <cups/cups.h>

char buffer[8192];
ssize_t bytes;

/* Use a timeout of 0.0 seconds to poll for back-channel data */
bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0.0);

Filters can also use select() or poll() on the back-channel file descriptor (3 or CUPS_BC_FD) to read data only when it is available.

The cupsSideChannelDoRequest function allows you to get out-of-band status information and do synchronization with the device. For example, the following code gets the current IEEE-1284 device ID string from the backend:

#include <cups/sidechannel.h>

char data[2049];
int datalen;
cups_sc_status_t status;

/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for
   nul-termination... */
datalen = sizeof(data) - 1;

/* Get the IEEE-1284 device ID, waiting for up to 1 second */
status = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_DEVICE_ID, data, &datalen, 1.0);

/* Use the returned value if OK was returned and the length is non-zero */
if (status == CUPS_SC_STATUS_OK && datalen > 0)
  data[datalen] = '\0';
else
  data[0] = '\0';

Forcing All Output to a Printer

The cupsSideChannelDoRequest function allows you to tell the backend to send all pending data to the printer. This is most often needed when sending query commands to the printer. For example:

#include <cups/cups.h>
#include <cups/sidechannel.h>

char data[1024];
int datalen = sizeof(data);
cups_sc_status_t status;

/* Flush pending output to stdout */
fflush(stdout);

/* Drain output to backend, waiting for up to 30 seconds */
status = cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, data, &datalen, 30.0);

/* Read the response if the output was sent */
if (status == CUPS_SC_STATUS_OK)
{
  ssize_t bytes;

  /* Wait up to 10.0 seconds for back-channel data */
  bytes = cupsBackChannelRead(data, sizeof(data), 10.0);
  /* do something with the data from the printer */
}

Communicating with Filters

Backends communicate with filters using the reciprocal functions cupsBackChannelWrite, cupsSideChannelRead, and cupsSideChannelWrite. We recommend writing back-channel data using a timeout of 1.0 seconds:

#include <cups/cups.h>

char buffer[8192];
ssize_t bytes;

/* Obtain data from printer/device */
...

/* Use a timeout of 1.0 seconds to give filters a chance to read */
cupsBackChannelWrite(buffer, bytes, 1.0);

The cupsSideChannelRead function reads a side-channel command from a filter, driver, or port monitor. Backends can either poll for commands using a timeout of 0.0, wait indefinitely for commands using a timeout of -1.0 (probably in a separate thread for that purpose), or use select or poll on the CUPS_SC_FD file descriptor (4) to handle input and output on several file descriptors at the same time.

Once a command is processed, the backend uses the cupsSideChannelWrite function to send its response. For example, the following code shows how to poll for a side-channel command and respond to it:

#include <cups/sidechannel.h>

cups_sc_command_t command;
cups_sc_status_t status;
char data[2048];
int datalen = sizeof(data);

/* Poll for a command... */
if (!cupsSideChannelRead(&command, &status, data, &datalen, 0.0))
{
  switch (command)
  {
    /* handle supported commands, fill data/datalen/status with values as needed */

    default :
        status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
	datalen = 0;
	break;
  }

  /* Send a response... */
  cupsSideChannelWrite(command, status, data, datalen, 1.0);
}

Doing SNMP Queries with Network Printers

The Simple Network Management Protocol (SNMP) allows you to get the current status, page counter, and supply levels from most network printers. Every piece of information is associated with an Object Identifier (OID), and every printer has a community name associated with it. OIDs can be queried directly or by "walking" over a range of OIDs with a common prefix.

The two CUPS SNMP functions provide a simple API for querying network printers through the side-channel interface. Each accepts a string containing an OID like ".1.3.6.1.2.1.43.10.2.1.4.1.1" (the standard page counter OID) along with a timeout for the query.

The cupsSideChannelSNMPGet function queries a single OID and returns the value as a string in a buffer you supply:

#include <cups/sidechannel.h>

char data[512];
int datalen = sizeof(data);

if (cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", data, &datalen, 5.0)
        == CUPS_SC_STATUS_OK)
{
  /* Do something with the value */
  printf("Page counter is: %s\n", data);
}

The cupsSideChannelSNMPWalk function allows you to query a whole group of OIDs, calling a function of your choice for each OID that is found:

#include <cups/sidechannel.h>

void
my_callback(const char *oid, const char *data, int datalen, void *context)
{
  /* Do something with the value */
  printf("%s=%s\n", oid, data);
}

...

void *my_data;

cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);

Sandboxing on macOS

Starting with macOS 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:

  1. Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the /private/var/spool/cups directory and other files on mounted filesystems except for user home directories under /Users.
  2. Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the CUPS_CACHEDIR environment variable, to the state directory specified by the CUPS_STATEDIR environment variable, to the temporary directory specified by the TMPDIR environment variable, and under the /private/var/db, /private/var/folders, /private/var/lib, /private/var/mysql, /private/var/run, /private/var/spool (except /private/var/spool/cups), /Library/Application Support, /Library/Caches, /Library/Logs, /Library/Preferences, /Library/WebServer, and /Users/Shared directories.
  3. Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the /Users directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.
  4. Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. Filters cannot access Bluetooth and USB printers directly.
  5. Network: filters and backends can access UNIX domain sockets under the /private/tmp, /private/var/run, and /private/var/tmp directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.
  6. Notifications: filters and backends can send notifications via the Darwin notify_post() API.
Note:

The sandbox profile used in CUPS still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.

cups-2.3.1/cups/testdest.c000664 000765 000024 00000051327 13574721672 015564 0ustar00mikestaff000000 000000 /* * CUPS destination API test program for CUPS. * * Copyright © 2012-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include #include "cups.h" /* * Local functions... */ static int enum_cb(void *user_data, unsigned flags, cups_dest_t *dest); static void localize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value); static void print_file(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *filename, int num_options, cups_option_t *options); static void show_conflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options); static void show_default(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option); static void show_media(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, const char *name); static void show_supported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value); static void usage(const char *arg) _CUPS_NORETURN; /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ http_t *http; /* Connection to destination */ cups_dest_t *dest = NULL; /* Destination */ cups_dinfo_t *dinfo; /* Destination info */ unsigned dflags = CUPS_DEST_FLAGS_NONE; /* Destination flags */ if (argc < 2) return (0); if (!strcmp(argv[1], "--get")) { cups_dest_t *dests; /* Destinations */ int num_dests = cupsGetDests2(CUPS_HTTP_DEFAULT, &dests); /* Number of destinations */ for (i = 0; i < num_dests; i ++) enum_cb(NULL, 0, dests + i); cupsFreeDests(num_dests, dests); return (0); } else if (!strcmp(argv[1], "--enum")) { cups_ptype_t type = 0, /* Printer type filter */ mask = 0; /* Printer type mask */ for (i = 2; i < argc; i ++) { if (!strcmp(argv[i], "grayscale")) { type |= CUPS_PRINTER_BW; mask |= CUPS_PRINTER_BW; } else if (!strcmp(argv[i], "color")) { type |= CUPS_PRINTER_COLOR; mask |= CUPS_PRINTER_COLOR; } else if (!strcmp(argv[i], "duplex")) { type |= CUPS_PRINTER_DUPLEX; mask |= CUPS_PRINTER_DUPLEX; } else if (!strcmp(argv[i], "staple")) { type |= CUPS_PRINTER_STAPLE; mask |= CUPS_PRINTER_STAPLE; } else if (!strcmp(argv[i], "small")) { type |= CUPS_PRINTER_SMALL; mask |= CUPS_PRINTER_SMALL; } else if (!strcmp(argv[i], "medium")) { type |= CUPS_PRINTER_MEDIUM; mask |= CUPS_PRINTER_MEDIUM; } else if (!strcmp(argv[i], "large")) { type |= CUPS_PRINTER_LARGE; mask |= CUPS_PRINTER_LARGE; } else usage(argv[i]); } cupsEnumDests(CUPS_DEST_FLAGS_NONE, 5000, NULL, type, mask, enum_cb, NULL); return (0); } i = 1; if (!strcmp(argv[i], "--device")) { dflags = CUPS_DEST_FLAGS_DEVICE; i ++; } if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "ipps://", 7)) dest = cupsGetDestWithURI(NULL, argv[i]); else if (!strcmp(argv[i], "default")) { dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); if (dest && dest->instance) printf("default is \"%s/%s\".\n", dest->name, dest->instance); else if (dest) printf("default is \"%s\".\n", dest->name); else puts("no default destination."); } else dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL); if (!dest) { printf("testdest: Unable to get destination \"%s\": %s\n", argv[i], cupsLastErrorString()); return (1); } i ++; if ((http = cupsConnectDest(dest, dflags, 30000, NULL, NULL, 0, NULL, NULL)) == NULL) { printf("testdest: Unable to connect to destination \"%s\": %s\n", dest->name, cupsLastErrorString()); return (1); } if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL) { printf("testdest: Unable to get information for destination \"%s\": %s\n", dest->name, cupsLastErrorString()); return (1); } if (i == argc || !strcmp(argv[i], "supported")) { i ++; if ((i + 1) < argc) show_supported(http, dest, dinfo, argv[i], argv[i + 1]); else if (argc > 2) show_supported(http, dest, dinfo, argv[i], NULL); else show_supported(http, dest, dinfo, NULL, NULL); } else if (!strcmp(argv[i], "conflicts") && (i + 1) < argc) { int num_options = 0;/* Number of options */ cups_option_t *options = NULL;/* Options */ for (i ++; i < argc; i ++) num_options = cupsParseOptions(argv[i], num_options, &options); show_conflicts(http, dest, dinfo, num_options, options); } else if (!strcmp(argv[i], "default") && (i + 1) < argc) { show_default(http, dest, dinfo, argv[i + 1]); } else if (!strcmp(argv[i], "localize")) { i ++; if ((i + 1) < argc) localize(http, dest, dinfo, argv[i], argv[i + 1]); else if (argc > 2) localize(http, dest, dinfo, argv[i], NULL); else localize(http, dest, dinfo, NULL, NULL); } else if (!strcmp(argv[i], "media")) { const char *name = NULL; /* Media name, if any */ unsigned flags = CUPS_MEDIA_FLAGS_DEFAULT; /* Media selection flags */ for (i ++; i < argc; i ++) { if (!strcmp(argv[i], "borderless")) flags = CUPS_MEDIA_FLAGS_BORDERLESS; else if (!strcmp(argv[i], "duplex")) flags = CUPS_MEDIA_FLAGS_DUPLEX; else if (!strcmp(argv[i], "exact")) flags = CUPS_MEDIA_FLAGS_EXACT; else if (!strcmp(argv[i], "ready")) flags = CUPS_MEDIA_FLAGS_READY; else if (name) usage(argv[i]); else name = argv[i]; } show_media(http, dest, dinfo, flags, name); } else if (!strcmp(argv[i], "print") && (i + 1) < argc) { int num_options = 0;/* Number of options */ cups_option_t *options = NULL;/* Options */ const char *filename = argv[i + 1]; for (i += 2; i < argc; i ++) num_options = cupsParseOptions(argv[i], num_options, &options); print_file(http, dest, dinfo, filename, num_options, options); } else usage(argv[i]); return (0); } /* * 'enum_cb()' - Print the results from the enumeration of destinations. */ static int /* O - 1 to continue */ enum_cb(void *user_data, /* I - User data (unused) */ unsigned flags, /* I - Flags */ cups_dest_t *dest) /* I - Destination */ { int i; /* Looping var */ (void)user_data; (void)flags; if (dest->instance) printf("%s%s/%s%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name, dest->instance, dest->is_default ? " (Default)" : ""); else printf("%s%s%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name, dest->is_default ? " (Default)" : ""); for (i = 0; i < dest->num_options; i ++) printf(" %s=\"%s\"\n", dest->options[i].name, dest->options[i].value); puts(""); return (1); } /* * 'localize()' - Localize an option and value. */ static void localize(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 */ 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 ++) localize(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)) localize(http, dest, dinfo, options[i], NULL); } } else if (!value) { printf("%s (%s)\n", option, cupsLocalizeDestOption(http, dest, dinfo, option)); 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 ++) printf(" %s\n", ippEnumString(option, ippGetInteger(attr, i))); 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_TEXTLANG : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : 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 (%s)\n", ippGetString(attr, i, NULL), cupsLocalizeDestValue(http, dest, dinfo, option, 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 puts(cupsLocalizeDestValue(http, dest, dinfo, option, value)); } /* * 'print_file()' - Print a file. */ static void print_file(http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ const char *filename, /* I - File to print */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { cups_file_t *fp; /* File to print */ int job_id; /* Job ID */ ipp_status_t status; /* Submission status */ const char *title; /* Title of job */ char buffer[32768]; /* File buffer */ ssize_t bytes; /* Bytes read/to write */ if ((fp = cupsFileOpen(filename, "r")) == NULL) { printf("Unable to open \"%s\": %s\n", filename, strerror(errno)); return; } if ((title = strrchr(filename, '/')) != NULL) title ++; else title = filename; if ((status = cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to create job: %s\n", cupsLastErrorString()); cupsFileClose(fp); return; } printf("Created job ID: %d\n", job_id); if (cupsStartDestDocument(http, dest, dinfo, job_id, title, CUPS_FORMAT_AUTO, 0, NULL, 1) != HTTP_STATUS_CONTINUE) { printf("Unable to send document: %s\n", cupsLastErrorString()); cupsFileClose(fp); return; } while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) { if (cupsWriteRequestData(http, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE) { printf("Unable to write document data: %s\n", cupsLastErrorString()); break; } } cupsFileClose(fp); if ((status = cupsFinishDestDocument(http, dest, dinfo)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to send document: %s\n", cupsLastErrorString()); return; } puts("Job queued."); } /* * 'show_conflicts()' - Show conflicts for selected options. */ static void show_conflicts( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { (void)http; (void)dest; (void)dinfo; (void)num_options; (void)options; } /* * 'show_default()' - Show default value for option. */ static void show_default(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 (!strcmp(option, "media")) { /* * Show default media option... */ cups_size_t size; /* Media size information */ if (cupsGetDestMediaDefault(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size)) printf("%s (%.2fx%.2fmm, margins=[%.2f %.2f %.2f %.2f])\n", size.media, size.width * 0.01, size.length * 0.01, size.left * 0.01, size.bottom * 0.01, size.right * 0.01, size.top * 0.01); else puts("FAILED"); } else { /* * Show default other option... */ ipp_attribute_t *defattr; /* Default attribute */ if ((defattr = cupsFindDestDefault(http, dest, dinfo, option)) != NULL) { char value[1024]; /* Value of default attribute */ ippAttributeString(defattr, value, sizeof(value)); puts(value); } else puts("FAILED"); } } /* * 'show_media()' - Show available media. */ static void show_media(http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags, /* I - Media flags */ const char *name) /* I - Size name */ { int i, /* Looping var */ count; /* Number of sizes */ cups_size_t size; /* Media size info */ if (name) { double dw, dl; /* Width and length from name */ char units[32]; /* Units */ int width, /* Width in 100ths of millimeters */ length; /* Length in 100ths of millimeters */ if (sscanf(name, "%lfx%lf%31s", &dw, &dl, units) == 3) { if (!strcmp(units, "in")) { width = (int)(dw * 2540.0); length = (int)(dl * 2540.0); } else if (!strcmp(units, "mm")) { width = (int)(dw * 100.0); length = (int)(dl * 100.0); } else { puts(" bad units in size"); return; } if (cupsGetDestMediaBySize(http, dest, dinfo, width, length, flags, &size)) { printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top); } else { puts(" not supported"); } } else if (cupsGetDestMediaByName(http, dest, dinfo, name, flags, &size)) { printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top); } else { puts(" not supported"); } } else { count = cupsGetDestMediaCount(http, dest, dinfo, flags); printf("%d size%s:\n", count, count == 1 ? "" : "s"); for (i = 0; i < count; i ++) { if (cupsGetDestMediaByIndex(http, dest, dinfo, i, flags, &size)) printf(" %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top); else puts(" error"); } } } /* * '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"); } /* * 'usage()' - Show program usage. */ static void usage(const char *arg) /* I - Argument for usage message */ { if (arg) printf("testdest: Unknown option \"%s\".\n", arg); puts("Usage:"); puts(" ./testdest [--device] name [operation ...]"); puts(" ./testdest [--device] ipp://... [operation ...]"); puts(" ./testdest [--device] ipps://... [operation ...]"); puts(" ./testdest --get"); puts(" ./testdest --enum [grayscale] [color] [duplex] [staple] [small]\n" " [medium] [large]"); puts(""); puts("Operations:"); puts(" conflicts options"); puts(" default option"); puts(" localize option [value]"); puts(" media [borderless] [duplex] [exact] [ready] [name or size]"); puts(" print filename [options]"); puts(" supported [option [value]]"); exit(arg != NULL); } cups-2.3.1/cups/http-private.h000664 000765 000024 00000026766 13574721672 016372 0ustar00mikestaff000000 000000 /* * Private HTTP definitions for CUPS. * * Copyright 2007-2018 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. */ #ifndef _CUPS_HTTP_PRIVATE_H_ # define _CUPS_HTTP_PRIVATE_H_ /* * Include necessary headers... */ # include "config.h" # include # include # include # ifdef __sun # include # endif /* __sun */ # include # ifdef _WIN32 # define _WINSOCK_DEPRECATED_NO_WARNINGS 1 # include # include # define CUPS_SOCAST (const char *) # else # include # include # include # define CUPS_SOCAST # endif /* _WIN32 */ # ifdef HAVE_GSSAPI # ifdef HAVE_GSS_GSSAPI_H # include # elif defined(HAVE_GSSAPI_GSSAPI_H) # include # elif defined(HAVE_GSSAPI_H) # include # endif /* HAVE_GSS_GSSAPI_H */ # ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE # define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name # endif /* !HAVE_GSS_C_NT_HOSTBASED_SERVICE */ # endif /* HAVE_GSSAPI */ # ifdef HAVE_AUTHORIZATION_H # include # endif /* HAVE_AUTHORIZATION_H */ # if defined(__APPLE__) && !defined(_SOCKLEN_T) /* * macOS 10.2.x does not define socklen_t, and in fact uses an int instead of * unsigned type for length values... */ typedef int socklen_t; # endif /* __APPLE__ && !_SOCKLEN_T */ # include # include "ipp-private.h" # ifdef HAVE_GNUTLS # include # include # elif defined(HAVE_CDSASSL) # include # include # include # ifdef HAVE_SECITEM_H # include # endif /* HAVE_SECITEM_H */ # ifdef HAVE_SECCERTIFICATE_H # include # include # endif /* HAVE_SECCERTIFICATE_H */ # elif defined(HAVE_SSPISSL) # include # include # include # define SECURITY_WIN32 # include # include # endif /* HAVE_GNUTLS */ # ifndef _WIN32 # include # include # ifdef HAVE_GETIFADDRS # include # else # include # ifdef HAVE_SYS_SOCKIO_H # include # endif /* HAVE_SYS_SOCKIO_H */ # endif /* HAVE_GETIFADDRS */ # endif /* !_WIN32 */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define _HTTP_MAX_SBUFFER 65536 /* Size of (de)compression buffer */ # define _HTTP_RESOLVE_DEFAULT 0 /* Just resolve with default options */ # define _HTTP_RESOLVE_STDERR 1 /* Log resolve progress to stderr */ # define _HTTP_RESOLVE_FQDN 2 /* Resolve to a FQDN */ # define _HTTP_RESOLVE_FAXOUT 4 /* Resolve FaxOut service? */ # define _HTTP_TLS_NONE 0 /* No TLS options */ # define _HTTP_TLS_ALLOW_RC4 1 /* Allow RC4 cipher suites */ # define _HTTP_TLS_ALLOW_DH 2 /* Allow DH/DHE key negotiation */ # define _HTTP_TLS_DENY_CBC 4 /* Deny CBC cipher suites */ # define _HTTP_TLS_SET_DEFAULT 128 /* Setting the default TLS options */ # define _HTTP_TLS_SSL3 0 /* Min/max version is SSL/3.0 */ # define _HTTP_TLS_1_0 1 /* Min/max version is TLS/1.0 */ # define _HTTP_TLS_1_1 2 /* Min/max version is TLS/1.1 */ # define _HTTP_TLS_1_2 3 /* Min/max version is TLS/1.2 */ # define _HTTP_TLS_1_3 4 /* Min/max version is TLS/1.3 */ # define _HTTP_TLS_MAX 5 /* Highest known TLS version */ /* * Types and functions for SSL support... */ # ifdef HAVE_GNUTLS /* * The GNU TLS library is more of a "bare metal" SSL/TLS library... */ typedef gnutls_session_t http_tls_t; typedef gnutls_certificate_credentials_t *http_tls_credentials_t; # elif defined(HAVE_CDSASSL) /* * Darwin's Security framework provides its own SSL/TLS context structure * for its IO and protocol management... */ typedef SSLContextRef http_tls_t; typedef CFArrayRef http_tls_credentials_t; # elif defined(HAVE_SSPISSL) /* * Windows' SSPI library gets a CUPS wrapper... */ typedef struct _http_sspi_s /**** SSPI/SSL data structure ****/ { CredHandle creds; /* Credentials */ CtxtHandle context; /* SSL context */ BOOL contextInitialized; /* Is context init'd? */ SecPkgContext_StreamSizes streamSizes;/* SSL data stream sizes */ BYTE *decryptBuffer; /* Data pre-decryption*/ size_t decryptBufferLength; /* Length of decrypt buffer */ size_t decryptBufferUsed; /* Bytes used in buffer */ BYTE *readBuffer; /* Data post-decryption */ int readBufferLength; /* Length of read buffer */ int readBufferUsed; /* Bytes used in buffer */ BYTE *writeBuffer; /* Data pre-encryption */ int writeBufferLength; /* Length of write buffer */ PCCERT_CONTEXT localCert, /* Local certificate */ remoteCert; /* Remote (peer's) certificate */ char error[256]; /* Most recent error message */ } _http_sspi_t; typedef _http_sspi_t *http_tls_t; typedef PCCERT_CONTEXT http_tls_credentials_t; # else /* * Otherwise define stub types since we have no SSL support... */ typedef void *http_tls_t; typedef void *http_tls_credentials_t; # endif /* HAVE_GNUTLS */ typedef enum _http_coding_e /**** HTTP content coding enumeration ****/ { _HTTP_CODING_IDENTITY, /* No content coding */ _HTTP_CODING_GZIP, /* LZ77+gzip decompression */ _HTTP_CODING_DEFLATE, /* LZ77+zlib compression */ _HTTP_CODING_GUNZIP, /* LZ77+gzip decompression */ _HTTP_CODING_INFLATE /* LZ77+zlib decompression */ } _http_coding_t; typedef enum _http_mode_e /**** HTTP mode enumeration ****/ { _HTTP_MODE_CLIENT, /* Client connected to server */ _HTTP_MODE_SERVER /* Server connected (accepted) from client */ } _http_mode_t; # ifndef _HTTP_NO_PRIVATE struct _http_s /**** HTTP connection structure ****/ { int fd; /* File descriptor for this socket */ int blocking; /* To block or not to block */ int error; /* Last error on read */ time_t activity; /* Time since last read/write */ http_state_t state; /* State of client */ http_status_t status; /* Status of last request */ http_version_t version; /* Protocol version */ http_keepalive_t keep_alive; /* Keep-alive supported? */ struct sockaddr_in _hostaddr; /* Address of connected host (deprecated) */ char hostname[HTTP_MAX_HOST], /* Name of connected host */ _fields[HTTP_FIELD_ACCEPT_ENCODING][HTTP_MAX_VALUE]; /* Field values up to Accept-Encoding (deprecated) */ char *data; /* Pointer to data buffer */ http_encoding_t data_encoding; /* Chunked or not */ int _data_remaining;/* Number of bytes left (deprecated) */ int used; /* Number of bytes used in buffer */ char buffer[HTTP_MAX_BUFFER]; /* Buffer for incoming data */ int _auth_type; /* Authentication in use (deprecated) */ unsigned char _md5_state[88]; /* MD5 state (deprecated) */ char nonce[HTTP_MAX_VALUE]; /* Nonce value */ unsigned nonce_count; /* Nonce count */ http_tls_t tls; /* TLS state information */ http_encryption_t encryption; /* Encryption requirements */ /**** New in CUPS 1.1.19 ****/ fd_set *input_set; /* select() set for httpWait() (deprecated) */ http_status_t expect; /* Expect: header */ char *cookie; /* Cookie value(s) */ /**** New in CUPS 1.1.20 ****/ char _authstring[HTTP_MAX_VALUE], /* Current Authorization value (deprecated) */ userpass[HTTP_MAX_VALUE]; /* Username:password string */ int digest_tries; /* Number of tries for digest auth */ /**** New in CUPS 1.2 ****/ off_t data_remaining; /* Number of bytes left */ http_addr_t *hostaddr; /* Current host address and port */ http_addrlist_t *addrlist; /* List of valid addresses */ char wbuffer[HTTP_MAX_BUFFER]; /* Buffer for outgoing data */ int wused; /* Write buffer bytes used */ /**** New in CUPS 1.3 ****/ char *authstring; /* Current Authorization field */ # ifdef HAVE_GSSAPI gss_OID gssmech; /* Authentication mechanism */ gss_ctx_id_t gssctx; /* Authentication context */ gss_name_t gssname; /* Authentication server name */ # endif /* HAVE_GSSAPI */ # ifdef HAVE_AUTHORIZATION_H AuthorizationRef auth_ref; /* Authorization ref */ # endif /* HAVE_AUTHORIZATION_H */ /**** New in CUPS 1.5 ****/ http_tls_credentials_t tls_credentials; /* TLS credentials */ http_timeout_cb_t timeout_cb; /* Timeout callback */ void *timeout_data; /* User data pointer */ double timeout_value; /* Timeout in seconds */ int wait_value; /* httpWait value for timeout */ # ifdef HAVE_GSSAPI char gsshost[256]; /* Hostname for Kerberos */ # endif /* HAVE_GSSAPI */ /**** New in CUPS 1.7 ****/ int tls_upgrade; /* Non-zero if we are doing an upgrade */ _http_mode_t mode; /* _HTTP_MODE_CLIENT or _HTTP_MODE_SERVER */ # ifdef HAVE_LIBZ _http_coding_t coding; /* _HTTP_CODING_xxx */ void *stream; /* (De)compression stream */ unsigned char *sbuffer; /* (De)compression buffer */ # endif /* HAVE_LIBZ */ /**** New in CUPS 2.2.9 ****/ char algorithm[65], /* Algorithm from WWW-Authenticate */ nextnonce[HTTP_MAX_VALUE], /* Next nonce value from Authentication-Info */ opaque[HTTP_MAX_VALUE], /* Opaque value from WWW-Authenticate */ realm[HTTP_MAX_VALUE]; /* Realm from WWW-Authenticate */ /**** New in CUPS 2.3 ****/ char *fields[HTTP_FIELD_MAX], /* Allocated field values */ *default_fields[HTTP_FIELD_MAX]; /* Default field values, if any */ }; # endif /* !_HTTP_NO_PRIVATE */ /* * Some OS's don't have hstrerror(), most notably Solaris... */ # ifndef HAVE_HSTRERROR extern const char *_cups_hstrerror(int error); # define hstrerror _cups_hstrerror # endif /* !HAVE_HSTRERROR */ /* * Prototypes... */ extern void _httpAddrSetPort(http_addr_t *addr, int port) _CUPS_PRIVATE; extern http_tls_credentials_t _httpCreateCredentials(cups_array_t *credentials) _CUPS_PRIVATE; extern char *_httpDecodeURI(char *dst, const char *src, size_t dstsize) _CUPS_PRIVATE; extern void _httpDisconnect(http_t *http) _CUPS_PRIVATE; extern char *_httpEncodeURI(char *dst, const char *src, size_t dstsize) _CUPS_PRIVATE; extern void _httpFreeCredentials(http_tls_credentials_t credentials) _CUPS_PRIVATE; extern const char *_httpResolveURI(const char *uri, char *resolved_uri, size_t resolved_size, int options, int (*cb)(void *context), void *context) _CUPS_PRIVATE; extern int _httpSetDigestAuthString(http_t *http, const char *nonce, const char *method, const char *resource) _CUPS_PRIVATE; extern const char *_httpStatus(cups_lang_t *lang, http_status_t status) _CUPS_PRIVATE; extern void _httpTLSInitialize(void) _CUPS_PRIVATE; extern size_t _httpTLSPending(http_t *http) _CUPS_PRIVATE; extern int _httpTLSRead(http_t *http, char *buf, int len) _CUPS_PRIVATE; extern void _httpTLSSetOptions(int options, int min_version, int max_version) _CUPS_PRIVATE; extern int _httpTLSStart(http_t *http) _CUPS_PRIVATE; extern void _httpTLSStop(http_t *http) _CUPS_PRIVATE; extern int _httpTLSWrite(http_t *http, const char *buf, int len) _CUPS_PRIVATE; extern int _httpUpdate(http_t *http, http_status_t *status) _CUPS_PRIVATE; extern int _httpWait(http_t *http, int msec, int usessl) _CUPS_PRIVATE; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_HTTP_PRIVATE_H_ */ cups-2.3.1/cups/auth.c000664 000765 000024 00000075542 13574721672 014673 0ustar00mikestaff000000 000000 /* * Authentication functions for CUPS. * * Copyright 2007-2019 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * This file contains Kerberos support code, copyright 2006 by * Jelmer Vernooij. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ #if HAVE_AUTHORIZATION_H # include #endif /* HAVE_AUTHORIZATION_H */ #if defined(SO_PEERCRED) && defined(AF_LOCAL) # include #endif /* SO_PEERCRED && AF_LOCAL */ /* * Local functions... */ static const char *cups_auth_find(const char *www_authenticate, const char *scheme); static const char *cups_auth_param(const char *scheme, const char *name, char *value, size_t valsize); static const char *cups_auth_scheme(const char *www_authenticate, char *scheme, size_t schemesize); #ifdef HAVE_GSSAPI # define CUPS_GSS_OK 0 /* Successfully set credentials */ # define CUPS_GSS_NONE -1 /* No credentials */ # define CUPS_GSS_FAIL -2 /* Failed credentials/authentication */ # ifdef HAVE_GSS_ACQUIRE_CRED_EX_F # ifdef HAVE_GSS_GSSAPI_SPI_H # include # else # define GSS_AUTH_IDENTITY_TYPE_1 1 # define gss_acquire_cred_ex_f __ApplePrivate_gss_acquire_cred_ex_f typedef struct gss_auth_identity /* @private@ */ { uint32_t type; uint32_t flags; char *username; char *realm; char *password; gss_buffer_t *credentialsRef; } gss_auth_identity_desc; extern OM_uint32 gss_acquire_cred_ex_f(gss_status_id_t, const gss_name_t, OM_uint32, OM_uint32, const gss_OID, gss_cred_usage_t, gss_auth_identity_t, void *, void (*)(void *, OM_uint32, gss_status_id_t, gss_cred_id_t, gss_OID_set, OM_uint32)); # endif /* HAVE_GSS_GSSAPI_SPI_H */ # include typedef struct _cups_gss_acquire_s /* Acquire callback data */ { dispatch_semaphore_t sem; /* Synchronization semaphore */ OM_uint32 major; /* Returned status code */ gss_cred_id_t creds; /* Returned credentials */ } _cups_gss_acquire_t; static void cups_gss_acquire(void *ctx, OM_uint32 major, gss_status_id_t status, gss_cred_id_t creds, gss_OID_set oids, OM_uint32 time_rec); # endif /* HAVE_GSS_ACQUIRE_CRED_EX_F */ static gss_name_t cups_gss_getname(http_t *http, const char *service_name); # ifdef DEBUG static void cups_gss_printf(OM_uint32 major_status, OM_uint32 minor_status, const char *message); # else # define cups_gss_printf(major, minor, message) # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ static int cups_local_auth(http_t *http); /* * 'cupsDoAuthentication()' - Authenticate a request. * * This function should be called in response to a @code HTTP_STATUS_UNAUTHORIZED@ * status, prior to resubmitting your request. * * @since CUPS 1.1.20/macOS 10.4@ */ int /* O - 0 on success, -1 on error */ cupsDoAuthentication( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *method, /* I - Request method ("GET", "POST", "PUT") */ const char *resource) /* I - Resource path */ { const char *password, /* Password string */ *www_auth, /* WWW-Authenticate header */ *schemedata; /* Scheme-specific data */ char scheme[256], /* Scheme name */ prompt[1024]; /* Prompt for user */ int localauth; /* Local authentication result */ _cups_globals_t *cg; /* Global data */ DEBUG_printf(("cupsDoAuthentication(http=%p, method=\"%s\", resource=\"%s\")", (void *)http, method, resource)); if (!http) http = _cupsConnect(); if (!http || !method || !resource) return (-1); DEBUG_printf(("2cupsDoAuthentication: digest_tries=%d, userpass=\"%s\"", http->digest_tries, http->userpass)); DEBUG_printf(("2cupsDoAuthentication: WWW-Authenticate=\"%s\"", httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE))); /* * Clear the current authentication string... */ httpSetAuthString(http, NULL, NULL); /* * See if we can do local authentication... */ if (http->digest_tries < 3) { if ((localauth = cups_local_auth(http)) == 0) { DEBUG_printf(("2cupsDoAuthentication: authstring=\"%s\"", http->authstring)); if (http->status == HTTP_STATUS_UNAUTHORIZED) http->digest_tries ++; return (0); } else if (localauth == -1) { http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; return (-1); /* Error or canceled */ } } /* * Nope, loop through the authentication schemes to find the first we support. */ www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE); for (schemedata = cups_auth_scheme(www_auth, scheme, sizeof(scheme)); schemedata; schemedata = cups_auth_scheme(schemedata + strlen(scheme), scheme, sizeof(scheme))) { /* * Check the scheme name... */ DEBUG_printf(("2cupsDoAuthentication: Trying scheme \"%s\"...", scheme)); #ifdef HAVE_GSSAPI if (!_cups_strcasecmp(scheme, "Negotiate")) { /* * Kerberos authentication... */ int gss_status; /* Auth status */ if ((gss_status = _cupsSetNegotiateAuthString(http, method, resource)) == CUPS_GSS_FAIL) { DEBUG_puts("1cupsDoAuthentication: Negotiate failed."); http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; return (-1); } else if (gss_status == CUPS_GSS_NONE) { DEBUG_puts("2cupsDoAuthentication: No credentials for Negotiate."); continue; } else { DEBUG_puts("2cupsDoAuthentication: Using Negotiate."); break; } } else #endif /* HAVE_GSSAPI */ if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest")) { /* * Other schemes not yet supported... */ DEBUG_printf(("2cupsDoAuthentication: Scheme \"%s\" not yet supported.", scheme)); continue; } /* * See if we should retry the current username:password... */ if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest")))) { /* * Nope - get a new password from the user... */ char default_username[HTTP_MAX_VALUE]; /* Default username */ cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); if (cups_auth_param(schemedata, "username", default_username, sizeof(default_username))) cupsSetUser(default_username); snprintf(prompt, sizeof(prompt), _cupsLangString(cg->lang_default, _("Password for %s on %s? ")), cupsUser(), http->hostname[0] == '/' ? "localhost" : http->hostname); http->digest_tries = _cups_strncasecmp(scheme, "Digest", 6) != 0; http->userpass[0] = '\0'; if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL) { DEBUG_puts("1cupsDoAuthentication: User canceled password request."); http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; return (-1); } snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(), password); } else if (http->status == HTTP_STATUS_UNAUTHORIZED) http->digest_tries ++; if (http->status == HTTP_STATUS_UNAUTHORIZED && http->digest_tries >= 3) { DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)", http->digest_tries)); http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; return (-1); } /* * Got a password; encode it for the server... */ if (!_cups_strcasecmp(scheme, "Basic")) { /* * Basic authentication... */ char encode[256]; /* Base64 buffer */ DEBUG_puts("2cupsDoAuthentication: Using Basic."); httpEncode64_2(encode, sizeof(encode), http->userpass, (int)strlen(http->userpass)); httpSetAuthString(http, "Basic", encode); break; } else if (!_cups_strcasecmp(scheme, "Digest")) { /* * Digest authentication... */ char nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */ cups_auth_param(schemedata, "algorithm", http->algorithm, sizeof(http->algorithm)); cups_auth_param(schemedata, "opaque", http->opaque, sizeof(http->opaque)); cups_auth_param(schemedata, "nonce", nonce, sizeof(nonce)); cups_auth_param(schemedata, "realm", http->realm, sizeof(http->realm)); if (_httpSetDigestAuthString(http, nonce, method, resource)) { DEBUG_puts("2cupsDoAuthentication: Using Digest."); break; } } } if (http->authstring) { DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\".", http->authstring)); return (0); } else { DEBUG_puts("1cupsDoAuthentication: No supported schemes."); http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; return (-1); } } #ifdef HAVE_GSSAPI /* * '_cupsSetNegotiateAuthString()' - Set the Kerberos authentication string. */ int /* O - 0 on success, negative on error */ _cupsSetNegotiateAuthString( http_t *http, /* I - Connection to server */ const char *method, /* I - Request method ("GET", "POST", "PUT") */ const char *resource) /* I - Resource path */ { OM_uint32 minor_status, /* Minor status code */ major_status; /* Major status code */ gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; /* Output token */ (void)method; (void)resource; # ifdef __APPLE__ /* * If the weak-linked GSSAPI/Kerberos library is not present, don't try * to use it... */ if (&gss_init_sec_context == NULL) { DEBUG_puts("1_cupsSetNegotiateAuthString: Weak-linked GSSAPI/Kerberos " "framework is not present"); return (CUPS_GSS_NONE); } # endif /* __APPLE__ */ if (!strcmp(http->hostname, "localhost") || http->hostname[0] == '/' || isdigit(http->hostname[0] & 255) || !strchr(http->hostname, '.')) { DEBUG_printf(("1_cupsSetNegotiateAuthString: Kerberos not available for host \"%s\".", http->hostname)); return (CUPS_GSS_NONE); } if (http->gssname == GSS_C_NO_NAME) { http->gssname = cups_gss_getname(http, _cupsGSSServiceName()); } if (http->gssctx != GSS_C_NO_CONTEXT) { gss_delete_sec_context(&minor_status, &http->gssctx, GSS_C_NO_BUFFER); http->gssctx = GSS_C_NO_CONTEXT; } major_status = gss_init_sec_context(&minor_status, GSS_C_NO_CREDENTIAL, &http->gssctx, http->gssname, http->gssmech, GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG, GSS_C_INDEFINITE, GSS_C_NO_CHANNEL_BINDINGS, GSS_C_NO_BUFFER, &http->gssmech, &output_token, NULL, NULL); # ifdef HAVE_GSS_ACQUIRE_CRED_EX_F if (major_status == GSS_S_NO_CRED) { /* * Ask the user for credentials... */ char prompt[1024], /* Prompt for user */ userbuf[256]; /* Kerberos username */ const char *username, /* Username string */ *password; /* Password string */ _cups_gss_acquire_t data; /* Callback data */ gss_auth_identity_desc identity; /* Kerberos user identity */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread global data */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); snprintf(prompt, sizeof(prompt), _cupsLangString(cg->lang_default, _("Password for %s on %s? ")), cupsUser(), http->gsshost); if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL) return (CUPS_GSS_FAIL); /* * Try to acquire credentials... */ username = cupsUser(); if (!strchr(username, '@')) { snprintf(userbuf, sizeof(userbuf), "%s@%s", username, http->gsshost); username = userbuf; } identity.type = GSS_AUTH_IDENTITY_TYPE_1; identity.flags = 0; identity.username = (char *)username; identity.realm = (char *)""; identity.password = (char *)password; identity.credentialsRef = NULL; data.sem = dispatch_semaphore_create(0); data.major = 0; data.creds = NULL; if (data.sem) { major_status = gss_acquire_cred_ex_f(NULL, GSS_C_NO_NAME, 0, GSS_C_INDEFINITE, GSS_KRB5_MECHANISM, GSS_C_INITIATE, (gss_auth_identity_t)&identity, &data, cups_gss_acquire); if (major_status == GSS_S_COMPLETE) { dispatch_semaphore_wait(data.sem, DISPATCH_TIME_FOREVER); major_status = data.major; } dispatch_release(data.sem); if (major_status == GSS_S_COMPLETE) { OM_uint32 release_minor; /* Minor status from releasing creds */ major_status = gss_init_sec_context(&minor_status, data.creds, &http->gssctx, http->gssname, http->gssmech, GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG, GSS_C_INDEFINITE, GSS_C_NO_CHANNEL_BINDINGS, GSS_C_NO_BUFFER, &http->gssmech, &output_token, NULL, NULL); gss_release_cred(&release_minor, &data.creds); } } } # endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */ if (major_status == GSS_S_NO_CRED) { cups_gss_printf(major_status, minor_status, "_cupsSetNegotiateAuthString: No credentials"); return (CUPS_GSS_NONE); } else if (GSS_ERROR(major_status)) { cups_gss_printf(major_status, minor_status, "_cupsSetNegotiateAuthString: Unable to initialize security context"); return (CUPS_GSS_FAIL); } # ifdef DEBUG else if (major_status == GSS_S_CONTINUE_NEEDED) cups_gss_printf(major_status, minor_status, "_cupsSetNegotiateAuthString: Continuation needed"); # endif /* DEBUG */ if (output_token.length > 0 && output_token.length <= 65536) { /* * Allocate the authorization string since Windows KDCs can have * arbitrarily large credentials... */ int authsize = 10 + /* "Negotiate " */ (((int)output_token.length * 4 / 3 + 3) & ~3) + 1; /* Base64 + nul */ httpSetAuthString(http, NULL, NULL); if ((http->authstring = malloc((size_t)authsize)) == NULL) { http->authstring = http->_authstring; authsize = sizeof(http->_authstring); } strlcpy(http->authstring, "Negotiate ", (size_t)authsize); httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value, (int)output_token.length); gss_release_buffer(&minor_status, &output_token); } else { DEBUG_printf(("1_cupsSetNegotiateAuthString: Kerberos credentials too " "large - %d bytes!", (int)output_token.length)); gss_release_buffer(&minor_status, &output_token); return (CUPS_GSS_FAIL); } return (CUPS_GSS_OK); } #endif /* HAVE_GSSAPI */ /* * 'cups_auth_find()' - Find the named WWW-Authenticate scheme. * * The "www_authenticate" parameter points to the current position in the header. * * Returns @code NULL@ if the auth scheme is not present. */ static const char * /* O - Start of matching scheme or @code NULL@ if not found */ cups_auth_find(const char *www_authenticate, /* I - Pointer into WWW-Authenticate header */ const char *scheme) /* I - Authentication scheme */ { size_t schemelen = strlen(scheme); /* Length of scheme */ DEBUG_printf(("8cups_auth_find(www_authenticate=\"%s\", scheme=\"%s\"(%d))", www_authenticate, scheme, (int)schemelen)); while (*www_authenticate) { /* * Skip leading whitespace and commas... */ DEBUG_printf(("9cups_auth_find: Before whitespace: \"%s\"", www_authenticate)); while (isspace(*www_authenticate & 255) || *www_authenticate == ',') www_authenticate ++; DEBUG_printf(("9cups_auth_find: After whitespace: \"%s\"", www_authenticate)); /* * See if this is "Scheme" followed by whitespace or the end of the string. */ if (!strncmp(www_authenticate, scheme, schemelen) && (isspace(www_authenticate[schemelen] & 255) || www_authenticate[schemelen] == ',' || !www_authenticate[schemelen])) { /* * Yes, this is the start of the scheme-specific information... */ DEBUG_printf(("9cups_auth_find: Returning \"%s\".", www_authenticate)); return (www_authenticate); } /* * Skip the scheme name or param="value" string... */ while (!isspace(*www_authenticate & 255) && *www_authenticate) { if (*www_authenticate == '\"') { /* * Skip quoted value... */ www_authenticate ++; while (*www_authenticate && *www_authenticate != '\"') www_authenticate ++; DEBUG_printf(("9cups_auth_find: After quoted: \"%s\"", www_authenticate)); } www_authenticate ++; } DEBUG_printf(("9cups_auth_find: After skip: \"%s\"", www_authenticate)); } DEBUG_puts("9cups_auth_find: Returning NULL."); return (NULL); } /* * 'cups_auth_param()' - Copy the value for the named authentication parameter, * if present. */ static const char * /* O - Parameter value or @code NULL@ if not present */ cups_auth_param(const char *scheme, /* I - Pointer to auth data */ const char *name, /* I - Name of parameter */ char *value, /* I - Value buffer */ size_t valsize) /* I - Size of value buffer */ { char *valptr = value, /* Pointer into value buffer */ *valend = value + valsize - 1; /* Pointer to end of buffer */ size_t namelen = strlen(name); /* Name length */ int param; /* Is this a parameter? */ DEBUG_printf(("8cups_auth_param(scheme=\"%s\", name=\"%s\", value=%p, valsize=%d)", scheme, name, (void *)value, (int)valsize)); while (!isspace(*scheme & 255) && *scheme) scheme ++; while (*scheme) { while (isspace(*scheme & 255) || *scheme == ',') scheme ++; if (!strncmp(scheme, name, namelen) && scheme[namelen] == '=') { /* * Found the parameter, copy the value... */ scheme += namelen + 1; if (*scheme == '\"') { scheme ++; while (*scheme && *scheme != '\"') { if (valptr < valend) *valptr++ = *scheme; scheme ++; } } else { while (*scheme && strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~+/=", *scheme)) { if (valptr < valend) *valptr++ = *scheme; scheme ++; } } *valptr = '\0'; DEBUG_printf(("9cups_auth_param: Returning \"%s\".", value)); return (value); } /* * Skip the param=value string... */ param = 0; while (!isspace(*scheme & 255) && *scheme) { if (*scheme == '=') param = 1; else if (*scheme == '\"') { /* * Skip quoted value... */ scheme ++; while (*scheme && *scheme != '\"') scheme ++; } scheme ++; } /* * If this wasn't a parameter, we are at the end of this scheme's * parameters... */ if (!param) break; } *value = '\0'; DEBUG_puts("9cups_auth_param: Returning NULL."); return (NULL); } /* * 'cups_auth_scheme()' - Get the (next) WWW-Authenticate scheme. * * The "www_authenticate" parameter points to the current position in the header. * * Returns @code NULL@ if there are no (more) auth schemes present. */ static const char * /* O - Start of scheme or @code NULL@ if not found */ cups_auth_scheme(const char *www_authenticate, /* I - Pointer into WWW-Authenticate header */ char *scheme, /* I - Scheme name buffer */ size_t schemesize) /* I - Size of buffer */ { const char *start; /* Start of scheme data */ char *sptr = scheme, /* Pointer into scheme buffer */ *send = scheme + schemesize - 1;/* End of scheme buffer */ int param; /* Is this a parameter? */ DEBUG_printf(("8cups_auth_scheme(www_authenticate=\"%s\", scheme=%p, schemesize=%d)", www_authenticate, (void *)scheme, (int)schemesize)); while (*www_authenticate) { /* * Skip leading whitespace and commas... */ while (isspace(*www_authenticate & 255) || *www_authenticate == ',') www_authenticate ++; /* * Parse the scheme name or param="value" string... */ for (sptr = scheme, start = www_authenticate, param = 0; *www_authenticate && *www_authenticate != ',' && !isspace(*www_authenticate & 255); www_authenticate ++) { if (*www_authenticate == '=') param = 1; else if (!param && sptr < send) *sptr++ = *www_authenticate; else if (*www_authenticate == '\"') { /* * Skip quoted value... */ www_authenticate ++; while (*www_authenticate && *www_authenticate != '\"') www_authenticate ++; } } if (sptr > scheme && !param) { *sptr = '\0'; DEBUG_printf(("9cups_auth_scheme: Returning \"%s\".", start)); return (start); } } *scheme = '\0'; DEBUG_puts("9cups_auth_scheme: Returning NULL."); return (NULL); } #ifdef HAVE_GSSAPI # ifdef HAVE_GSS_ACQUIRE_CRED_EX_F /* * 'cups_gss_acquire()' - Kerberos credentials callback. */ static void cups_gss_acquire( void *ctx, /* I - Caller context */ OM_uint32 major, /* I - Major error code */ gss_status_id_t status, /* I - Status (unused) */ gss_cred_id_t creds, /* I - Credentials (if any) */ gss_OID_set oids, /* I - Mechanism OIDs (unused) */ OM_uint32 time_rec) /* I - Timestamp (unused) */ { uint32_t min; /* Minor error code */ _cups_gss_acquire_t *data; /* Callback data */ (void)status; (void)time_rec; data = (_cups_gss_acquire_t *)ctx; data->major = major; data->creds = creds; gss_release_oid_set(&min, &oids); dispatch_semaphore_signal(data->sem); } # endif /* HAVE_GSS_ACQUIRE_CRED_EX_F */ /* * 'cups_gss_getname()' - Get CUPS service credentials for authentication. */ static gss_name_t /* O - Server name */ cups_gss_getname( http_t *http, /* I - Connection to server */ const char *service_name) /* I - Service name */ { gss_buffer_desc token = GSS_C_EMPTY_BUFFER; /* Service token */ OM_uint32 major_status, /* Major status code */ minor_status; /* Minor status code */ gss_name_t server_name; /* Server name */ char buf[1024]; /* Name buffer */ DEBUG_printf(("7cups_gss_getname(http=%p, service_name=\"%s\")", http, service_name)); /* * Get the hostname... */ if (!http->gsshost[0]) { httpGetHostname(http, http->gsshost, sizeof(http->gsshost)); if (!strcmp(http->gsshost, "localhost")) { if (gethostname(http->gsshost, sizeof(http->gsshost)) < 0) { DEBUG_printf(("1cups_gss_getname: gethostname() failed: %s", strerror(errno))); http->gsshost[0] = '\0'; return (NULL); } if (!strchr(http->gsshost, '.')) { /* * The hostname is not a FQDN, so look it up... */ struct hostent *host; /* Host entry to get FQDN */ if ((host = gethostbyname(http->gsshost)) != NULL && host->h_name) { /* * Use the resolved hostname... */ strlcpy(http->gsshost, host->h_name, sizeof(http->gsshost)); } else { DEBUG_printf(("1cups_gss_getname: gethostbyname(\"%s\") failed.", http->gsshost)); http->gsshost[0] = '\0'; return (NULL); } } } } /* * Get a service name we can use for authentication purposes... */ snprintf(buf, sizeof(buf), "%s@%s", service_name, http->gsshost); DEBUG_printf(("8cups_gss_getname: Looking up \"%s\".", buf)); token.value = buf; token.length = strlen(buf); server_name = GSS_C_NO_NAME; major_status = gss_import_name(&minor_status, &token, GSS_C_NT_HOSTBASED_SERVICE, &server_name); if (GSS_ERROR(major_status)) { cups_gss_printf(major_status, minor_status, "cups_gss_getname: gss_import_name() failed"); return (NULL); } return (server_name); } # ifdef DEBUG /* * 'cups_gss_printf()' - Show debug error messages from GSSAPI. */ static void cups_gss_printf(OM_uint32 major_status,/* I - Major status code */ OM_uint32 minor_status,/* I - Minor status code */ const char *message) /* I - Prefix for error message */ { OM_uint32 err_major_status, /* Major status code for display */ err_minor_status; /* Minor status code for display */ OM_uint32 msg_ctx; /* Message context */ gss_buffer_desc major_status_string = GSS_C_EMPTY_BUFFER, /* Major status message */ minor_status_string = GSS_C_EMPTY_BUFFER; /* Minor status message */ msg_ctx = 0; err_major_status = gss_display_status(&err_minor_status, major_status, GSS_C_GSS_CODE, GSS_C_NO_OID, &msg_ctx, &major_status_string); if (!GSS_ERROR(err_major_status)) gss_display_status(&err_minor_status, minor_status, GSS_C_MECH_CODE, GSS_C_NULL_OID, &msg_ctx, &minor_status_string); DEBUG_printf(("1%s: %s, %s", message, (char *)major_status_string.value, (char *)minor_status_string.value)); gss_release_buffer(&err_minor_status, &major_status_string); gss_release_buffer(&err_minor_status, &minor_status_string); } # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ /* * 'cups_local_auth()' - Get the local authorization certificate if * available/applicable. */ static int /* O - 0 if available */ /* 1 if not available */ /* -1 error */ cups_local_auth(http_t *http) /* I - HTTP connection to server */ { #if defined(_WIN32) || defined(__EMX__) /* * Currently _WIN32 and OS-2 do not support the CUPS server... */ return (1); #else int pid; /* Current process ID */ FILE *fp; /* Certificate file */ char trc[16], /* Try Root Certificate parameter */ filename[1024]; /* Certificate filename */ const char *www_auth, /* WWW-Authenticate header */ *schemedata; /* Data for the named auth scheme */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ # if defined(HAVE_AUTHORIZATION_H) OSStatus status; /* Status */ AuthorizationItem auth_right; /* Authorization right */ AuthorizationRights auth_rights; /* Authorization rights */ AuthorizationFlags auth_flags; /* Authorization flags */ AuthorizationExternalForm auth_extrn; /* Authorization ref external */ char auth_key[1024]; /* Buffer */ char buffer[1024]; /* Buffer */ # endif /* HAVE_AUTHORIZATION_H */ DEBUG_printf(("7cups_local_auth(http=%p) hostaddr=%s, hostname=\"%s\"", (void *)http, httpAddrString(http->hostaddr, filename, sizeof(filename)), http->hostname)); /* * See if we are accessing localhost... */ if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0) { DEBUG_puts("8cups_local_auth: Not a local connection!"); return (1); } www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE); # if defined(HAVE_AUTHORIZATION_H) /* * Delete any previous authorization reference... */ if (http->auth_ref) { AuthorizationFree(http->auth_ref, kAuthorizationFlagDefaults); http->auth_ref = NULL; } if (!getenv("GATEWAY_INTERFACE") && (schemedata = cups_auth_find(www_auth, "AuthRef")) != NULL && cups_auth_param(schemedata, "key", auth_key, sizeof(auth_key))) { status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &http->auth_ref); if (status != errAuthorizationSuccess) { DEBUG_printf(("8cups_local_auth: AuthorizationCreate() returned %d", (int)status)); return (-1); } auth_right.name = auth_key; auth_right.valueLength = 0; auth_right.value = NULL; auth_right.flags = 0; auth_rights.count = 1; auth_rights.items = &auth_right; auth_flags = kAuthorizationFlagDefaults | kAuthorizationFlagPreAuthorize | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights; status = AuthorizationCopyRights(http->auth_ref, &auth_rights, kAuthorizationEmptyEnvironment, auth_flags, NULL); if (status == errAuthorizationSuccess) status = AuthorizationMakeExternalForm(http->auth_ref, &auth_extrn); if (status == errAuthorizationSuccess) { /* * Set the authorization string and return... */ httpEncode64_2(buffer, sizeof(buffer), (void *)&auth_extrn, sizeof(auth_extrn)); httpSetAuthString(http, "AuthRef", buffer); DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", http->authstring)); return (0); } else if (status == errAuthorizationCanceled) return (-1); DEBUG_printf(("9cups_local_auth: AuthorizationCopyRights() returned %d", (int)status)); /* * Fall through to try certificates... */ } # endif /* HAVE_AUTHORIZATION_H */ # ifdef HAVE_GSSAPI if (cups_auth_find(www_auth, "Negotiate")) return (1); # endif /* HAVE_GSSAPI */ # if defined(SO_PEERCRED) && defined(AF_LOCAL) /* * See if we can authenticate using the peer credentials provided over a * domain socket; if so, specify "PeerCred username" as the authentication * information... */ if (http->hostaddr->addr.sa_family == AF_LOCAL && !getenv("GATEWAY_INTERFACE") && /* Not via CGI programs... */ cups_auth_find(www_auth, "PeerCred")) { /* * Verify that the current cupsUser() matches the current UID... */ struct passwd *pwd; /* Password information */ const char *username; /* Current username */ username = cupsUser(); if ((pwd = getpwnam(username)) != NULL && pwd->pw_uid == getuid()) { httpSetAuthString(http, "PeerCred", username); DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", http->authstring)); return (0); } } # endif /* SO_PEERCRED && AF_LOCAL */ if ((schemedata = cups_auth_find(www_auth, "Local")) == NULL) return (1); /* * Try opening a certificate file for this PID. If that fails, * try the root certificate... */ pid = getpid(); snprintf(filename, sizeof(filename), "%s/certs/%d", cg->cups_statedir, pid); if ((fp = fopen(filename, "r")) == NULL && pid > 0) { /* * No certificate for this PID; see if we can get the root certificate... */ DEBUG_printf(("9cups_local_auth: Unable to open file \"%s\": %s", filename, strerror(errno))); if (!cups_auth_param(schemedata, "trc", trc, sizeof(trc))) { /* * Scheduler doesn't want us to use the root certificate... */ return (1); } snprintf(filename, sizeof(filename), "%s/certs/0", cg->cups_statedir); if ((fp = fopen(filename, "r")) == NULL) DEBUG_printf(("9cups_local_auth: Unable to open file \"%s\": %s", filename, strerror(errno))); } if (fp) { /* * Read the certificate from the file... */ char certificate[33], /* Certificate string */ *certptr; /* Pointer to certificate string */ certptr = fgets(certificate, sizeof(certificate), fp); fclose(fp); if (certptr) { /* * Set the authorization string and return... */ httpSetAuthString(http, "Local", certificate); DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", http->authstring)); return (0); } } return (1); #endif /* _WIN32 || __EMX__ */ } cups-2.3.1/cups/tls-darwin.c000664 000765 000024 00000177207 13574721672 016017 0ustar00mikestaff000000 000000 /* * TLS support code 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.c ****/ /* * Include necessary headers... */ #include #include "tls-darwin.h" /* * Constants, very secure stuff... */ #define _CUPS_CDSA_PASSWORD "42" /* CUPS keychain password */ #define _CUPS_CDSA_PASSLEN 2 /* Length of keychain password */ /* * Local globals... */ static int tls_auto_create = 0; /* Auto-create self-signed certs? */ static char *tls_common_name = NULL; /* Default common name */ #if TARGET_OS_OSX static int tls_cups_keychain = 0; /* Opened the CUPS keychain? */ static SecKeychainRef tls_keychain = NULL; /* Server cert keychain */ #else static SecIdentityRef tls_selfsigned = NULL; /* Temporary self-signed cert */ #endif /* TARGET_OS_OSX */ static char *tls_keypath = NULL; /* Server cert keychain path */ static _cups_mutex_t tls_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex for keychain/certs */ static int tls_options = -1,/* Options for TLS connections */ tls_min_version = _HTTP_TLS_1_0, tls_max_version = _HTTP_TLS_MAX; /* * Local functions... */ static CFArrayRef http_cdsa_copy_server(const char *common_name); static SecCertificateRef http_cdsa_create_credential(http_credential_t *credential); #if TARGET_OS_OSX static const char *http_cdsa_default_path(char *buffer, size_t bufsize); static SecKeychainRef http_cdsa_open_keychain(const char *path, char *filename, size_t filesize); static SecKeychainRef http_cdsa_open_system_keychain(void); #endif /* TARGET_OS_OSX */ static OSStatus http_cdsa_read(SSLConnectionRef connection, void *data, size_t *dataLength); static int http_cdsa_set_credentials(http_t *http); static OSStatus http_cdsa_write(SSLConnectionRef connection, const void *data, size_t *dataLength); /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsMakeServerCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ const char *common_name, /* I - Common name */ int num_alt_names, /* I - Number of subject alternate names */ const char **alt_names, /* I - Subject Alternate Names */ time_t expiration_date) /* I - Expiration date */ { #if TARGET_OS_OSX int pid, /* Process ID of command */ status, /* Status of command */ i; /* Looping var */ char command[1024], /* Command */ *argv[5], /* Command-line arguments */ *envp[1000], /* Environment variables */ days[32], /* CERTTOOL_EXPIRATION_DAYS env var */ keychain[1024], /* Keychain argument */ infofile[1024], /* Type-in information for cert */ filename[1024]; /* Default keychain path */ cups_file_t *fp; /* Seed/info file */ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, (void *)alt_names, (int)expiration_date)); (void)num_alt_names; (void)alt_names; if (!path) path = http_cdsa_default_path(filename, sizeof(filename)); /* * Run the "certtool" command to generate a self-signed certificate... */ if (!cupsFileFind("certtool", getenv("PATH"), 1, command, sizeof(command))) return (-1); /* * Create a file with the certificate information fields... * * Note: This assumes that the default questions are asked by the certtool * command... */ if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL) return (-1); cupsFilePrintf(fp, "CUPS Self-Signed Certificate\n" /* Enter key and certificate label */ "r\n" /* Generate RSA key pair */ "2048\n" /* 2048 bit encryption key */ "y\n" /* OK (y = yes) */ "b\n" /* Usage (b=signing/encryption) */ "2\n" /* Sign with SHA256 */ "y\n" /* OK (y = yes) */ "%s\n" /* Common name */ "\n" /* Country (default) */ "\n" /* Organization (default) */ "\n" /* Organizational unit (default) */ "\n" /* State/Province (default) */ "\n" /* Email address */ "y\n", /* OK (y = yes) */ common_name); cupsFileClose(fp); snprintf(keychain, sizeof(keychain), "k=%s", path); argv[0] = "certtool"; argv[1] = "c"; argv[2] = keychain; argv[3] = NULL; snprintf(days, sizeof(days), "CERTTOOL_EXPIRATION_DAYS=%d", (int)((expiration_date - time(NULL) + 86399) / 86400)); envp[0] = days; for (i = 0; i < (int)(sizeof(envp) / sizeof(envp[0]) - 2) && environ[i]; i ++) envp[i + 1] = environ[i]; envp[i] = NULL; posix_spawn_file_actions_t actions; /* File actions */ posix_spawn_file_actions_init(&actions); posix_spawn_file_actions_addclose(&actions, 0); posix_spawn_file_actions_addopen(&actions, 0, infofile, O_RDONLY, 0); posix_spawn_file_actions_addclose(&actions, 1); posix_spawn_file_actions_addopen(&actions, 1, "/dev/null", O_WRONLY, 0); posix_spawn_file_actions_addclose(&actions, 2); posix_spawn_file_actions_addopen(&actions, 2, "/dev/null", O_WRONLY, 0); if (posix_spawn(&pid, command, &actions, NULL, argv, envp)) { unlink(infofile); return (-1); } posix_spawn_file_actions_destroy(&actions); unlink(infofile); while (waitpid(pid, &status, 0) < 0) if (errno != EINTR) { status = -1; break; } return (!status); #else int status = 0; /* Return status */ OSStatus err; /* Error code (if any) */ CFStringRef cfcommon_name = NULL; /* CF string for server name */ SecIdentityRef ident = NULL; /* Identity */ SecKeyRef publicKey = NULL, /* Public key */ privateKey = NULL; /* Private key */ SecCertificateRef cert = NULL; /* Self-signed certificate */ CFMutableDictionaryRef keyParams = NULL; /* Key generation parameters */ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date)); (void)path; (void)num_alt_names; (void)alt_names; (void)expiration_date; if (path) { DEBUG_puts("1cupsMakeServerCredentials: No keychain support compiled in, returning 0."); return (0); } if (tls_selfsigned) { DEBUG_puts("1cupsMakeServerCredentials: Using existing self-signed cert."); return (1); } cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8); if (!cfcommon_name) { DEBUG_puts("1cupsMakeServerCredentials: Unable to create CF string of common name."); goto cleanup; } /* * Create a public/private key pair... */ keyParams = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (!keyParams) { DEBUG_puts("1cupsMakeServerCredentials: Unable to create key parameters dictionary."); goto cleanup; } CFDictionaryAddValue(keyParams, kSecAttrKeyType, kSecAttrKeyTypeRSA); CFDictionaryAddValue(keyParams, kSecAttrKeySizeInBits, CFSTR("2048")); CFDictionaryAddValue(keyParams, kSecAttrLabel, cfcommon_name); err = SecKeyGeneratePair(keyParams, &publicKey, &privateKey); if (err != noErr) { DEBUG_printf(("1cupsMakeServerCredentials: Unable to generate key pair: %d.", (int)err)); goto cleanup; } /* * Create a self-signed certificate using the public/private key pair... */ CFIndex usageInt = kSecKeyUsageAll; CFNumberRef usage = CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &usageInt); CFIndex lenInt = 0; CFNumberRef len = CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &lenInt); CFTypeRef certKeys[] = { kSecCSRBasicContraintsPathLen, kSecSubjectAltName, kSecCertificateKeyUsage }; CFTypeRef certValues[] = { len, cfcommon_name, usage }; CFDictionaryRef certParams = CFDictionaryCreate(kCFAllocatorDefault, certKeys, certValues, sizeof(certKeys) / sizeof(certKeys[0]), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFRelease(usage); CFRelease(len); const void *ca_o[] = { kSecOidOrganization, CFSTR("") }; const void *ca_cn[] = { kSecOidCommonName, cfcommon_name }; CFArrayRef ca_o_dn = CFArrayCreate(kCFAllocatorDefault, ca_o, 2, NULL); CFArrayRef ca_cn_dn = CFArrayCreate(kCFAllocatorDefault, ca_cn, 2, NULL); const void *ca_dn_array[2]; ca_dn_array[0] = CFArrayCreate(kCFAllocatorDefault, (const void **)&ca_o_dn, 1, NULL); ca_dn_array[1] = CFArrayCreate(kCFAllocatorDefault, (const void **)&ca_cn_dn, 1, NULL); CFArrayRef subject = CFArrayCreate(kCFAllocatorDefault, ca_dn_array, 2, NULL); cert = SecGenerateSelfSignedCertificate(subject, certParams, publicKey, privateKey); CFRelease(subject); CFRelease(certParams); if (!cert) { DEBUG_puts("1cupsMakeServerCredentials: Unable to create self-signed certificate."); goto cleanup; } ident = SecIdentityCreate(kCFAllocatorDefault, cert, privateKey); if (ident) { _cupsMutexLock(&tls_mutex); if (tls_selfsigned) CFRelease(ident); else tls_selfsigned = ident; _cupsMutexLock(&tls_mutex); # if 0 /* Someday perhaps SecItemCopyMatching will work for identities, at which point */ CFTypeRef itemKeys[] = { kSecClass, kSecAttrLabel, kSecValueRef }; CFTypeRef itemValues[] = { kSecClassIdentity, cfcommon_name, ident }; CFDictionaryRef itemAttrs = CFDictionaryCreate(kCFAllocatorDefault, itemKeys, itemValues, sizeof(itemKeys) / sizeof(itemKeys[0]), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); err = SecItemAdd(itemAttrs, NULL); /* SecItemAdd consumes itemAttrs... */ CFRelease(ident); if (err != noErr) { DEBUG_printf(("1cupsMakeServerCredentials: Unable to add identity to keychain: %d.", (int)err)); goto cleanup; } # endif /* 0 */ status = 1; } else DEBUG_puts("1cupsMakeServerCredentials: Unable to create identity from cert and keys."); /* * Cleanup and return... */ cleanup: if (cfcommon_name) CFRelease(cfcommon_name); if (keyParams) CFRelease(keyParams); if (cert) CFRelease(cert); if (publicKey) CFRelease(publicKey); if (privateKey) CFRelease(privateKey); DEBUG_printf(("1cupsMakeServerCredentials: Returning %d.", status)); return (status); #endif /* TARGET_OS_OSX */ } /* * 'cupsSetServerCredentials()' - Set the default server credentials. * * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * * @since CUPS 2.0/macOS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsSetServerCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ const char *common_name, /* I - Default common name for server */ int auto_create) /* I - 1 = automatically create self-signed certificates */ { DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create)); #if TARGET_OS_OSX char filename[1024]; /* Keychain filename */ SecKeychainRef keychain = http_cdsa_open_keychain(path, filename, sizeof(filename)); if (!keychain) { DEBUG_puts("1cupsSetServerCredentials: Unable to open keychain."); return (0); } _cupsMutexLock(&tls_mutex); /* * Close any keychain that is currently open... */ if (tls_keychain) CFRelease(tls_keychain); if (tls_keypath) _cupsStrFree(tls_keypath); if (tls_common_name) _cupsStrFree(tls_common_name); /* * Save the new keychain... */ tls_keychain = keychain; tls_keypath = _cupsStrAlloc(filename); tls_auto_create = auto_create; tls_common_name = _cupsStrAlloc(common_name); _cupsMutexUnlock(&tls_mutex); DEBUG_puts("1cupsSetServerCredentials: Opened keychain, returning 1."); return (1); #else if (path) { DEBUG_puts("1cupsSetServerCredentials: No keychain support compiled in, returning 0."); return (0); } tls_auto_create = auto_create; tls_common_name = _cupsStrAlloc(common_name); return (1); #endif /* TARGET_OS_OSX */ } /* * 'httpCopyCredentials()' - Copy the credentials associated with the peer in * an encrypted connection. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - Status of call (0 = success) */ httpCopyCredentials( http_t *http, /* I - Connection to server */ cups_array_t **credentials) /* O - Array of credentials */ { OSStatus error; /* Error code */ SecTrustRef peerTrust; /* Peer trust reference */ CFIndex count; /* Number of credentials */ SecCertificateRef secCert; /* Certificate reference */ CFDataRef data; /* Certificate data */ int i; /* Looping var */ DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", (void *)http, (void *)credentials)); if (credentials) *credentials = NULL; if (!http || !http->tls || !credentials) return (-1); if (!(error = SSLCopyPeerTrust(http->tls, &peerTrust)) && peerTrust) { DEBUG_printf(("2httpCopyCredentials: Peer provided %d certificates.", (int)SecTrustGetCertificateCount(peerTrust))); if ((*credentials = cupsArrayNew(NULL, NULL)) != NULL) { count = SecTrustGetCertificateCount(peerTrust); for (i = 0; i < count; i ++) { secCert = SecTrustGetCertificateAtIndex(peerTrust, i); #ifdef DEBUG CFStringRef cf_name = SecCertificateCopySubjectSummary(secCert); char name[1024]; if (cf_name) CFStringGetCString(cf_name, name, sizeof(name), kCFStringEncodingUTF8); else strlcpy(name, "unknown", sizeof(name)); DEBUG_printf(("2httpCopyCredentials: Certificate %d name is \"%s\".", i, name)); #endif /* DEBUG */ if ((data = SecCertificateCopyData(secCert)) != NULL) { DEBUG_printf(("2httpCopyCredentials: Adding %d byte certificate blob.", (int)CFDataGetLength(data))); httpAddCredential(*credentials, CFDataGetBytePtr(data), (size_t)CFDataGetLength(data)); CFRelease(data); } } } CFRelease(peerTrust); } return (error); } /* * '_httpCreateCredentials()' - Create credentials in the internal format. */ http_tls_credentials_t /* O - Internal credentials */ _httpCreateCredentials( cups_array_t *credentials) /* I - Array of credentials */ { CFMutableArrayRef peerCerts; /* Peer credentials reference */ SecCertificateRef secCert; /* Certificate reference */ http_credential_t *credential; /* Credential data */ if (!credentials) return (NULL); if ((peerCerts = CFArrayCreateMutable(kCFAllocatorDefault, cupsArrayCount(credentials), &kCFTypeArrayCallBacks)) == NULL) return (NULL); for (credential = (http_credential_t *)cupsArrayFirst(credentials); credential; credential = (http_credential_t *)cupsArrayNext(credentials)) { if ((secCert = http_cdsa_create_credential(credential)) != NULL) { CFArrayAppendValue(peerCerts, secCert); CFRelease(secCert); } } return (peerCerts); } /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * * @since CUPS 2.0/macOS 10.10@ */ int /* O - 1 if valid, 0 otherwise */ httpCredentialsAreValidForName( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Name to check */ { SecCertificateRef secCert; /* Certificate reference */ CFStringRef cfcert_name = NULL; /* Certificate's common name (CF string) */ char cert_name[256]; /* Certificate's common name (C string) */ int valid = 1; /* Valid name? */ if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL) return (0); /* * Compare the common names... */ if ((cfcert_name = SecCertificateCopySubjectSummary(secCert)) == NULL) { /* * Can't get common name, cannot be valid... */ valid = 0; } else if (CFStringGetCString(cfcert_name, cert_name, sizeof(cert_name), kCFStringEncodingUTF8) && _cups_strcasecmp(common_name, cert_name)) { /* * Not an exact match for the common name, check for wildcard certs... */ const char *domain = strchr(common_name, '.'); /* Domain in common name */ if (strncmp(cert_name, "*.", 2) || !domain || _cups_strcasecmp(domain, cert_name + 1)) { /* * Not a wildcard match. */ /* TODO: Check subject alternate names */ valid = 0; } } if (cfcert_name) CFRelease(cfcert_name); CFRelease(secCert); return (valid); } /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * * @since CUPS 2.0/macOS 10.10@ */ http_trust_t /* O - Level of trust */ httpCredentialsGetTrust( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for trust lookup */ { SecCertificateRef secCert; /* Certificate reference */ http_trust_t trust = HTTP_TRUST_OK; /* Trusted? */ cups_array_t *tcreds = NULL; /* Trusted credentials */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */ if (!common_name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No common name specified."), 1); return (HTTP_TRUST_UNKNOWN); } if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create credentials from array."), 1); return (HTTP_TRUST_UNKNOWN); } if (cg->any_root < 0) _cupsSetDefaults(); /* * Look this common name up in the default keychains... */ httpLoadCredentials(NULL, &tcreds, common_name); if (tcreds) { char credentials_str[1024], /* String for incoming credentials */ tcreds_str[1024]; /* String for saved credentials */ httpCredentialsString(credentials, credentials_str, sizeof(credentials_str)); httpCredentialsString(tcreds, tcreds_str, sizeof(tcreds_str)); if (strcmp(credentials_str, tcreds_str)) { /* * Credentials don't match, let's look at the expiration date of the new * credentials and allow if the new ones have a later expiration... */ if (!cg->trust_first) { /* * Do not trust certificates on first use... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Trust on first use is disabled."), 1); trust = HTTP_TRUST_INVALID; } else if (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds)) { /* * The new credentials are not newly issued... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("New credentials are older than stored credentials."), 1); trust = HTTP_TRUST_INVALID; } else if (!httpCredentialsAreValidForName(credentials, common_name)) { /* * The common name does not match the issued certificate... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("New credentials are not valid for name."), 1); trust = HTTP_TRUST_INVALID; } else if (httpCredentialsGetExpiration(tcreds) < time(NULL)) { /* * Save the renewed credentials... */ trust = HTTP_TRUST_RENEWED; httpSaveCredentials(NULL, credentials, common_name); } } httpFreeCredentials(tcreds); } else if (cg->validate_certs && !httpCredentialsAreValidForName(credentials, common_name)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No stored credentials, not valid for name."), 1); trust = HTTP_TRUST_INVALID; } else if (!cg->trust_first) { /* * See if we have a site CA certificate we can compare... */ if (!httpLoadCredentials(NULL, &tcreds, "site")) { if (cupsArrayCount(credentials) != (cupsArrayCount(tcreds) + 1)) { /* * Certificate isn't directly generated from the CA cert... */ trust = HTTP_TRUST_INVALID; } else { /* * Do a tail comparison of the two certificates... */ http_credential_t *a, *b; /* Certificates */ for (a = (http_credential_t *)cupsArrayFirst(tcreds), b = (http_credential_t *)cupsArrayIndex(credentials, 1); a && b; a = (http_credential_t *)cupsArrayNext(tcreds), b = (http_credential_t *)cupsArrayNext(credentials)) if (a->datalen != b->datalen || memcmp(a->data, b->data, a->datalen)) break; if (a || b) trust = HTTP_TRUST_INVALID; } if (trust != HTTP_TRUST_OK) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Credentials do not validate against site CA certificate."), 1); } else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Trust on first use is disabled."), 1); trust = HTTP_TRUST_INVALID; } } if (trust == HTTP_TRUST_OK && !cg->expired_certs && !SecCertificateIsValid(secCert, CFAbsoluteTimeGetCurrent())) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Credentials have expired."), 1); trust = HTTP_TRUST_EXPIRED; } if (trust == HTTP_TRUST_OK && !cg->any_root && cupsArrayCount(credentials) == 1) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Self-signed credentials are blocked."), 1); trust = HTTP_TRUST_INVALID; } CFRelease(secCert); return (trust); } /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * * @since CUPS 2.0/macOS 10.10@ */ time_t /* O - Expiration date of credentials */ httpCredentialsGetExpiration( cups_array_t *credentials) /* I - Credentials */ { SecCertificateRef secCert; /* Certificate reference */ time_t expiration; /* Expiration date */ if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL) return (0); expiration = (time_t)(SecCertificateNotValidAfter(secCert) + kCFAbsoluteTimeIntervalSince1970); CFRelease(secCert); return (expiration); } /* * 'httpCredentialsString()' - Return a string representing the credentials. * * @since CUPS 2.0/macOS 10.10@ */ size_t /* O - Total size of credentials string */ httpCredentialsString( cups_array_t *credentials, /* I - Credentials */ char *buffer, /* I - Buffer or @code NULL@ */ size_t bufsize) /* I - Size of buffer */ { http_credential_t *first; /* First certificate */ SecCertificateRef secCert; /* Certificate reference */ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", (void *)credentials, (void *)buffer, CUPS_LLCAST bufsize)); if (!buffer) return (0); if (buffer && bufsize > 0) *buffer = '\0'; if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL && (secCert = http_cdsa_create_credential(first)) != NULL) { /* * Copy certificate (string) values from the SecCertificateRef and produce * a one-line summary. The API for accessing certificate values like the * issuer name is, um, "interesting"... */ # if TARGET_OS_OSX CFDictionaryRef cf_dict; /* Dictionary for certificate */ # endif /* TARGET_OS_OSX */ CFStringRef cf_string; /* CF string */ char commonName[256],/* Common name associated with cert */ issuer[256], /* Issuer name */ sigalg[256]; /* Signature algorithm */ time_t expiration; /* Expiration date of cert */ unsigned char md5_digest[16]; /* MD5 result */ if (SecCertificateCopyCommonName(secCert, &cf_string) == noErr) { CFStringGetCString(cf_string, commonName, (CFIndex)sizeof(commonName), kCFStringEncodingUTF8); CFRelease(cf_string); } else { strlcpy(commonName, "unknown", sizeof(commonName)); } strlcpy(issuer, "unknown", sizeof(issuer)); strlcpy(sigalg, "UnknownSignature", sizeof(sigalg)); # if TARGET_OS_OSX if ((cf_dict = SecCertificateCopyValues(secCert, NULL, NULL)) != NULL) { CFDictionaryRef cf_issuer = CFDictionaryGetValue(cf_dict, kSecOIDX509V1IssuerName); CFDictionaryRef cf_sigalg = CFDictionaryGetValue(cf_dict, kSecOIDX509V1SignatureAlgorithm); if (cf_issuer) { CFArrayRef cf_values = CFDictionaryGetValue(cf_issuer, kSecPropertyKeyValue); CFIndex i, count = CFArrayGetCount(cf_values); CFDictionaryRef cf_value; for (i = 0; i < count; i ++) { cf_value = CFArrayGetValueAtIndex(cf_values, i); if (!CFStringCompare(CFDictionaryGetValue(cf_value, kSecPropertyKeyLabel), kSecOIDOrganizationName, kCFCompareCaseInsensitive)) CFStringGetCString(CFDictionaryGetValue(cf_value, kSecPropertyKeyValue), issuer, (CFIndex)sizeof(issuer), kCFStringEncodingUTF8); } } if (cf_sigalg) { CFArrayRef cf_values = CFDictionaryGetValue(cf_sigalg, kSecPropertyKeyValue); CFIndex i, count = CFArrayGetCount(cf_values); CFDictionaryRef cf_value; for (i = 0; i < count; i ++) { cf_value = CFArrayGetValueAtIndex(cf_values, i); if (!CFStringCompare(CFDictionaryGetValue(cf_value, kSecPropertyKeyLabel), CFSTR("Algorithm"), kCFCompareCaseInsensitive)) { CFStringRef cf_algorithm = CFDictionaryGetValue(cf_value, kSecPropertyKeyValue); if (!CFStringCompare(cf_algorithm, CFSTR("1.2.840.113549.1.1.5"), kCFCompareCaseInsensitive)) strlcpy(sigalg, "SHA1WithRSAEncryption", sizeof(sigalg)); else if (!CFStringCompare(cf_algorithm, CFSTR("1.2.840.113549.1.1.11"), kCFCompareCaseInsensitive)) strlcpy(sigalg, "SHA256WithRSAEncryption", sizeof(sigalg)); else if (!CFStringCompare(cf_algorithm, CFSTR("1.2.840.113549.1.1.4"), kCFCompareCaseInsensitive)) strlcpy(sigalg, "MD5WithRSAEncryption", sizeof(sigalg)); } } } CFRelease(cf_dict); } # endif /* TARGET_OS_OSX */ expiration = (time_t)(SecCertificateNotValidAfter(secCert) + kCFAbsoluteTimeIntervalSince1970); cupsHashData("md5", first->data, first->datalen, md5_digest, sizeof(md5_digest)); snprintf(buffer, bufsize, "%s (issued by %s) / %s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", commonName, issuer, httpGetDateString(expiration), sigalg, md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]); CFRelease(secCert); } DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer)); return (strlen(buffer)); } /* * '_httpFreeCredentials()' - Free internal credentials. */ void _httpFreeCredentials( http_tls_credentials_t credentials) /* I - Internal credentials */ { if (!credentials) return; CFRelease(credentials); } /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ httpLoadCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ cups_array_t **credentials, /* IO - Credentials */ const char *common_name) /* I - Common name for credentials */ { OSStatus err; /* Error info */ #if TARGET_OS_OSX char filename[1024]; /* Filename for keychain */ SecKeychainRef keychain = NULL,/* Keychain reference */ syschain = NULL;/* System keychain */ CFArrayRef list; /* Keychain list */ #endif /* TARGET_OS_OSX */ SecCertificateRef cert = NULL; /* Certificate */ CFDataRef data; /* Certificate data */ SecPolicyRef policy = NULL; /* Policy ref */ CFStringRef cfcommon_name = NULL; /* Server name */ CFMutableDictionaryRef query = NULL; /* Query qualifiers */ DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, (void *)credentials, common_name)); if (!credentials) return (-1); *credentials = NULL; #if TARGET_OS_OSX keychain = http_cdsa_open_keychain(path, filename, sizeof(filename)); if (!keychain) goto cleanup; syschain = http_cdsa_open_system_keychain(); #else if (path) return (-1); #endif /* TARGET_OS_OSX */ cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8); policy = SecPolicyCreateSSL(1, cfcommon_name); if (cfcommon_name) CFRelease(cfcommon_name); if (!policy) goto cleanup; if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks))) goto cleanup; CFDictionaryAddValue(query, kSecClass, kSecClassCertificate); CFDictionaryAddValue(query, kSecMatchPolicy, policy); CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue); CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne); #if TARGET_OS_OSX if (syschain) { const void *values[2] = { syschain, keychain }; list = CFArrayCreate(kCFAllocatorDefault, (const void **)values, 2, &kCFTypeArrayCallBacks); } else list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks); CFDictionaryAddValue(query, kSecMatchSearchList, list); CFRelease(list); #endif /* TARGET_OS_OSX */ err = SecItemCopyMatching(query, (CFTypeRef *)&cert); if (err) goto cleanup; if (CFGetTypeID(cert) != SecCertificateGetTypeID()) goto cleanup; if ((data = SecCertificateCopyData(cert)) != NULL) { DEBUG_printf(("1httpLoadCredentials: Adding %d byte certificate blob.", (int)CFDataGetLength(data))); *credentials = cupsArrayNew(NULL, NULL); httpAddCredential(*credentials, CFDataGetBytePtr(data), (size_t)CFDataGetLength(data)); CFRelease(data); } cleanup : #if TARGET_OS_OSX if (keychain) CFRelease(keychain); if (syschain) CFRelease(syschain); #endif /* TARGET_OS_OSX */ if (cert) CFRelease(cert); if (policy) CFRelease(policy); if (query) CFRelease(query); DEBUG_printf(("1httpLoadCredentials: Returning %d.", *credentials ? 0 : -1)); return (*credentials ? 0 : -1); } /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ httpSaveCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for credentials */ { int ret = -1; /* Return value */ OSStatus err; /* Error info */ #if TARGET_OS_OSX char filename[1024]; /* Filename for keychain */ SecKeychainRef keychain = NULL;/* Keychain reference */ CFArrayRef list; /* Keychain list */ #endif /* TARGET_OS_OSX */ SecCertificateRef cert = NULL; /* Certificate */ CFMutableDictionaryRef attrs = NULL; /* Attributes for add */ DEBUG_printf(("httpSaveCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, (void *)credentials, common_name)); if (!credentials) goto cleanup; if (!httpCredentialsAreValidForName(credentials, common_name)) { DEBUG_puts("1httpSaveCredentials: Common name does not match."); return (-1); } if ((cert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL) { DEBUG_puts("1httpSaveCredentials: Unable to create certificate."); goto cleanup; } #if TARGET_OS_OSX keychain = http_cdsa_open_keychain(path, filename, sizeof(filename)); if (!keychain) goto cleanup; #else if (path) return (-1); #endif /* TARGET_OS_OSX */ if ((attrs = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)) == NULL) { DEBUG_puts("1httpSaveCredentials: Unable to create dictionary."); goto cleanup; } CFDictionaryAddValue(attrs, kSecClass, kSecClassCertificate); CFDictionaryAddValue(attrs, kSecValueRef, cert); #if TARGET_OS_OSX if ((list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks)) == NULL) { DEBUG_puts("1httpSaveCredentials: Unable to create list of keychains."); goto cleanup; } CFDictionaryAddValue(attrs, kSecMatchSearchList, list); CFRelease(list); #endif /* TARGET_OS_OSX */ /* Note: SecItemAdd consumes "attrs"... */ err = SecItemAdd(attrs, NULL); DEBUG_printf(("1httpSaveCredentials: SecItemAdd returned %d.", (int)err)); cleanup : #if TARGET_OS_OSX if (keychain) CFRelease(keychain); #endif /* TARGET_OS_OSX */ if (cert) CFRelease(cert); DEBUG_printf(("1httpSaveCredentials: Returning %d.", ret)); return (ret); } /* * '_httpTLSInitialize()' - Initialize the TLS stack. */ void _httpTLSInitialize(void) { /* * Nothing to do... */ } /* * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes. */ size_t _httpTLSPending(http_t *http) /* I - HTTP connection */ { size_t bytes; /* Bytes that are available */ if (!SSLGetBufferedReadSize(http->tls, &bytes)) return (bytes); return (0); } /* * '_httpTLSRead()' - Read from a SSL/TLS connection. */ int /* O - Bytes read */ _httpTLSRead(http_t *http, /* I - HTTP connection */ char *buf, /* I - Buffer to store data */ int len) /* I - Length of buffer */ { int result; /* Return value */ OSStatus error; /* Error info */ size_t processed; /* Number of bytes processed */ error = SSLRead(http->tls, buf, (size_t)len, &processed); DEBUG_printf(("6_httpTLSRead: error=%d, processed=%d", (int)error, (int)processed)); switch (error) { case 0 : result = (int)processed; break; case errSSLWouldBlock : if (processed) result = (int)processed; else { result = -1; errno = EINTR; } break; case errSSLClosedGraceful : default : if (processed) result = (int)processed; else { result = -1; errno = EPIPE; } break; } return (result); } /* * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options. */ void _httpTLSSetOptions(int options, /* I - Options */ int min_version, /* I - Minimum TLS version */ int max_version) /* I - Maximum TLS version */ { if (!(options & _HTTP_TLS_SET_DEFAULT) || tls_options < 0) { tls_options = options; tls_min_version = min_version; tls_max_version = max_version; } } /* * '_httpTLSStart()' - Set up SSL/TLS support on a connection. */ int /* O - 0 on success, -1 on failure */ _httpTLSStart(http_t *http) /* I - HTTP connection */ { char hostname[256], /* Hostname */ *hostptr; /* Pointer into hostname */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ OSStatus error; /* Error code */ const char *message = NULL;/* Error message */ char msgbuf[1024]; /* Error message buffer */ cups_array_t *credentials; /* Credentials array */ cups_array_t *names; /* CUPS distinguished names */ CFArrayRef dn_array; /* CF distinguished names array */ CFIndex count; /* Number of credentials */ CFDataRef data; /* Certificate data */ int i; /* Looping var */ http_credential_t *credential; /* Credential data */ DEBUG_printf(("3_httpTLSStart(http=%p)", (void *)http)); if (tls_options < 0) { DEBUG_puts("4_httpTLSStart: Setting defaults."); _cupsSetDefaults(); DEBUG_printf(("4_httpTLSStart: tls_options=%x, tls_min_version=%d, tls_max_version=%d", tls_options, tls_min_version, tls_max_version)); } #if TARGET_OS_OSX if (http->mode == _HTTP_MODE_SERVER && !tls_keychain) { DEBUG_puts("4_httpTLSStart: cupsSetServerCredentials not called."); http->error = errno = EINVAL; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Server credentials not set."), 1); return (-1); } #endif /* TARGET_OS_OSX */ if ((http->tls = SSLCreateContext(kCFAllocatorDefault, http->mode == _HTTP_MODE_CLIENT ? kSSLClientSide : kSSLServerSide, kSSLStreamType)) == NULL) { DEBUG_puts("4_httpTLSStart: SSLCreateContext failed."); http->error = errno = ENOMEM; http->status = HTTP_STATUS_ERROR; _cupsSetHTTPError(HTTP_STATUS_ERROR); return (-1); } error = SSLSetConnection(http->tls, http); DEBUG_printf(("4_httpTLSStart: SSLSetConnection, error=%d", (int)error)); if (!error) { error = SSLSetIOFuncs(http->tls, http_cdsa_read, http_cdsa_write); DEBUG_printf(("4_httpTLSStart: SSLSetIOFuncs, error=%d", (int)error)); } if (!error) { error = SSLSetSessionOption(http->tls, kSSLSessionOptionBreakOnServerAuth, true); DEBUG_printf(("4_httpTLSStart: SSLSetSessionOption, error=%d", (int)error)); } if (!error) { static const SSLProtocol protocols[] = /* Min/max protocol versions */ { kSSLProtocol3, kTLSProtocol1, kTLSProtocol11, kTLSProtocol12, kTLSProtocol13 }; if (tls_min_version < _HTTP_TLS_MAX) { error = SSLSetProtocolVersionMin(http->tls, protocols[tls_min_version]); DEBUG_printf(("4_httpTLSStart: SSLSetProtocolVersionMin(%d), error=%d", protocols[tls_min_version], (int)error)); } if (!error && tls_max_version < _HTTP_TLS_MAX) { error = SSLSetProtocolVersionMax(http->tls, protocols[tls_max_version]); DEBUG_printf(("4_httpTLSStart: SSLSetProtocolVersionMax(%d), error=%d", protocols[tls_max_version], (int)error)); } } if (!error) { SSLCipherSuite supported[100]; /* Supported cipher suites */ size_t num_supported; /* Number of supported cipher suites */ SSLCipherSuite enabled[100]; /* Cipher suites to enable */ size_t num_enabled; /* Number of cipher suites to enable */ num_supported = sizeof(supported) / sizeof(supported[0]); error = SSLGetSupportedCiphers(http->tls, supported, &num_supported); if (!error) { DEBUG_printf(("4_httpTLSStart: %d cipher suites supported.", (int)num_supported)); for (i = 0, num_enabled = 0; i < (int)num_supported && num_enabled < (sizeof(enabled) / sizeof(enabled[0])); i ++) { switch (supported[i]) { /* Obviously insecure cipher suites that we never want to use */ case SSL_NULL_WITH_NULL_NULL : case SSL_RSA_WITH_NULL_MD5 : case SSL_RSA_WITH_NULL_SHA : case SSL_RSA_EXPORT_WITH_RC4_40_MD5 : case SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 : case SSL_RSA_EXPORT_WITH_DES40_CBC_SHA : case SSL_RSA_WITH_DES_CBC_SHA : case SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA : case SSL_DH_DSS_WITH_DES_CBC_SHA : case SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA : case SSL_DH_RSA_WITH_DES_CBC_SHA : case SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA : case SSL_DHE_DSS_WITH_DES_CBC_SHA : case SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA : case SSL_DHE_RSA_WITH_DES_CBC_SHA : case SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 : case SSL_DH_anon_WITH_RC4_128_MD5 : case SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA : case SSL_DH_anon_WITH_DES_CBC_SHA : case SSL_DH_anon_WITH_3DES_EDE_CBC_SHA : case SSL_FORTEZZA_DMS_WITH_NULL_SHA : case TLS_DH_anon_WITH_AES_128_CBC_SHA : case TLS_DH_anon_WITH_AES_256_CBC_SHA : case TLS_ECDH_ECDSA_WITH_NULL_SHA : case TLS_ECDHE_RSA_WITH_NULL_SHA : case TLS_ECDH_anon_WITH_NULL_SHA : case TLS_ECDH_anon_WITH_RC4_128_SHA : case TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA : case TLS_ECDH_anon_WITH_AES_128_CBC_SHA : case TLS_ECDH_anon_WITH_AES_256_CBC_SHA : case TLS_RSA_WITH_NULL_SHA256 : case TLS_DH_anon_WITH_AES_128_CBC_SHA256 : case TLS_DH_anon_WITH_AES_256_CBC_SHA256 : case TLS_PSK_WITH_NULL_SHA : case TLS_DHE_PSK_WITH_NULL_SHA : case TLS_RSA_PSK_WITH_NULL_SHA : case TLS_DH_anon_WITH_AES_128_GCM_SHA256 : case TLS_DH_anon_WITH_AES_256_GCM_SHA384 : case TLS_PSK_WITH_NULL_SHA256 : case TLS_PSK_WITH_NULL_SHA384 : case TLS_DHE_PSK_WITH_NULL_SHA256 : case TLS_DHE_PSK_WITH_NULL_SHA384 : case TLS_RSA_PSK_WITH_NULL_SHA256 : case TLS_RSA_PSK_WITH_NULL_SHA384 : case SSL_RSA_WITH_DES_CBC_MD5 : DEBUG_printf(("4_httpTLSStart: Excluding insecure cipher suite %d", supported[i])); break; /* RC4 cipher suites that should only be used as a last resort */ case SSL_RSA_WITH_RC4_128_MD5 : case SSL_RSA_WITH_RC4_128_SHA : case TLS_ECDH_ECDSA_WITH_RC4_128_SHA : case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA : case TLS_ECDH_RSA_WITH_RC4_128_SHA : case TLS_ECDHE_RSA_WITH_RC4_128_SHA : case TLS_PSK_WITH_RC4_128_SHA : case TLS_DHE_PSK_WITH_RC4_128_SHA : case TLS_RSA_PSK_WITH_RC4_128_SHA : if (tls_options & _HTTP_TLS_ALLOW_RC4) enabled[num_enabled ++] = supported[i]; else DEBUG_printf(("4_httpTLSStart: Excluding RC4 cipher suite %d", supported[i])); break; /* DH/DHE cipher suites that are problematic with parameters < 1024 bits */ case TLS_DH_DSS_WITH_AES_128_CBC_SHA : case TLS_DH_RSA_WITH_AES_128_CBC_SHA : case TLS_DHE_DSS_WITH_AES_128_CBC_SHA : case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : case TLS_DH_DSS_WITH_AES_256_CBC_SHA : case TLS_DH_RSA_WITH_AES_256_CBC_SHA : case TLS_DHE_DSS_WITH_AES_256_CBC_SHA : case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : case TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA : case TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA : case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA : case TLS_DH_DSS_WITH_AES_128_CBC_SHA256 : case TLS_DH_RSA_WITH_AES_128_CBC_SHA256 : case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 : case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 : case TLS_DH_DSS_WITH_AES_256_CBC_SHA256 : case TLS_DH_RSA_WITH_AES_256_CBC_SHA256 : case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 : case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 : case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA : case TLS_DHE_PSK_WITH_AES_128_CBC_SHA : case TLS_DHE_PSK_WITH_AES_256_CBC_SHA : case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 : case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 : if (tls_options & _HTTP_TLS_DENY_CBC) { DEBUG_printf(("4_httpTLSStart: Excluding CBC cipher suite %d", supported[i])); break; } // case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 : // case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 : case TLS_DH_RSA_WITH_AES_128_GCM_SHA256 : case TLS_DH_RSA_WITH_AES_256_GCM_SHA384 : // case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 : // case TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 : case TLS_DH_DSS_WITH_AES_128_GCM_SHA256 : case TLS_DH_DSS_WITH_AES_256_GCM_SHA384 : case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 : case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 : if (tls_options & _HTTP_TLS_ALLOW_DH) enabled[num_enabled ++] = supported[i]; else DEBUG_printf(("4_httpTLSStart: Excluding DH/DHE cipher suite %d", supported[i])); break; case TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA : case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 : case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 : case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 : case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 : case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 : case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 : case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 : case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 : case TLS_RSA_WITH_3DES_EDE_CBC_SHA : case TLS_RSA_WITH_AES_128_CBC_SHA : case TLS_RSA_WITH_AES_256_CBC_SHA : if (tls_options & _HTTP_TLS_DENY_CBC) { DEBUG_printf(("4_httpTLSStart: Excluding CBC cipher suite %d", supported[i])); break; } /* Anything else we'll assume is "secure" */ default : enabled[num_enabled ++] = supported[i]; break; } } DEBUG_printf(("4_httpTLSStart: %d cipher suites enabled.", (int)num_enabled)); error = SSLSetEnabledCiphers(http->tls, enabled, num_enabled); } } if (!error && http->mode == _HTTP_MODE_CLIENT) { /* * Client: set client-side credentials, if any... */ if (cg->client_cert_cb) { error = SSLSetSessionOption(http->tls, kSSLSessionOptionBreakOnCertRequested, true); DEBUG_printf(("4_httpTLSStart: kSSLSessionOptionBreakOnCertRequested, " "error=%d", (int)error)); } else { error = http_cdsa_set_credentials(http); DEBUG_printf(("4_httpTLSStart: http_cdsa_set_credentials, error=%d", (int)error)); } } else if (!error) { /* * Server: find/create a certificate for TLS... */ if (http->fields[HTTP_FIELD_HOST]) { /* * Use hostname for TLS upgrade... */ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname)); } else { /* * Resolve hostname from connection address... */ http_addr_t addr; /* Connection address */ socklen_t addrlen; /* Length of address */ addrlen = sizeof(addr); if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen)) { DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno))); hostname[0] = '\0'; } else if (httpAddrLocalhost(&addr)) hostname[0] = '\0'; else { httpAddrLookup(&addr, hostname, sizeof(hostname)); DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname)); } } if (isdigit(hostname[0] & 255) || hostname[0] == '[') hostname[0] = '\0'; /* Don't allow numeric addresses */ if (hostname[0]) http->tls_credentials = http_cdsa_copy_server(hostname); else if (tls_common_name) http->tls_credentials = http_cdsa_copy_server(tls_common_name); if (!http->tls_credentials && tls_auto_create && (hostname[0] || tls_common_name)) { DEBUG_printf(("4_httpTLSStart: Auto-create credentials for \"%s\".", hostname[0] ? hostname : tls_common_name)); if (!cupsMakeServerCredentials(tls_keypath, hostname[0] ? hostname : tls_common_name, 0, NULL, time(NULL) + 365 * 86400)) { DEBUG_puts("4_httpTLSStart: cupsMakeServerCredentials failed."); http->error = errno = EINVAL; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create server credentials."), 1); return (-1); } http->tls_credentials = http_cdsa_copy_server(hostname[0] ? hostname : tls_common_name); } if (!http->tls_credentials) { DEBUG_puts("4_httpTLSStart: Unable to find server credentials."); http->error = errno = EINVAL; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to find server credentials."), 1); return (-1); } error = SSLSetCertificate(http->tls, http->tls_credentials); DEBUG_printf(("4_httpTLSStart: SSLSetCertificate, error=%d", (int)error)); } DEBUG_printf(("4_httpTLSStart: tls_credentials=%p", (void *)http->tls_credentials)); /* * Let the server know which hostname/domain we are trying to connect to * in case it wants to serve up a certificate with a matching common name. */ if (!error && http->mode == _HTTP_MODE_CLIENT) { /* * Client: get the hostname to use for TLS... */ if (httpAddrLocalhost(http->hostaddr)) { strlcpy(hostname, "localhost", sizeof(hostname)); } else { /* * Otherwise make sure the hostname we have does not end in a trailing dot. */ strlcpy(hostname, http->hostname, sizeof(hostname)); if ((hostptr = hostname + strlen(hostname) - 1) >= hostname && *hostptr == '.') *hostptr = '\0'; } error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname)); DEBUG_printf(("4_httpTLSStart: SSLSetPeerDomainName, error=%d", (int)error)); } if (!error) { int done = 0; /* Are we done yet? */ double old_timeout; /* Old timeout value */ http_timeout_cb_t old_cb; /* Old timeout callback */ void *old_data; /* Old timeout data */ /* * Enforce a minimum timeout of 10 seconds for the TLS handshake... */ old_timeout = http->timeout_value; old_cb = http->timeout_cb; old_data = http->timeout_data; if (!old_cb || old_timeout < 10.0) { DEBUG_puts("4_httpTLSStart: Setting timeout to 10 seconds."); httpSetTimeout(http, 10.0, NULL, NULL); } /* * Do the TLS handshake... */ while (!error && !done) { error = SSLHandshake(http->tls); DEBUG_printf(("4_httpTLSStart: SSLHandshake returned %d.", (int)error)); switch (error) { case noErr : done = 1; break; case errSSLWouldBlock : error = noErr; /* Force a retry */ usleep(1000); /* in 1 millisecond */ break; case errSSLServerAuthCompleted : error = 0; if (cg->server_cert_cb) { error = httpCopyCredentials(http, &credentials); if (!error) { error = (cg->server_cert_cb)(http, http->tls, credentials, cg->server_cert_data); httpFreeCredentials(credentials); } DEBUG_printf(("4_httpTLSStart: Server certificate callback " "returned %d.", (int)error)); } break; case errSSLClientCertRequested : error = 0; if (cg->client_cert_cb) { names = NULL; if (!(error = SSLCopyDistinguishedNames(http->tls, &dn_array)) && dn_array) { if ((names = cupsArrayNew(NULL, NULL)) != NULL) { for (i = 0, count = CFArrayGetCount(dn_array); i < count; i++) { data = (CFDataRef)CFArrayGetValueAtIndex(dn_array, i); if ((credential = malloc(sizeof(*credential))) != NULL) { credential->datalen = (size_t)CFDataGetLength(data); if ((credential->data = malloc(credential->datalen))) { memcpy((void *)credential->data, CFDataGetBytePtr(data), credential->datalen); cupsArrayAdd(names, credential); } else free(credential); } } } CFRelease(dn_array); } if (!error) { error = (cg->client_cert_cb)(http, http->tls, names, cg->client_cert_data); DEBUG_printf(("4_httpTLSStart: Client certificate callback " "returned %d.", (int)error)); } httpFreeCredentials(names); } break; case errSSLUnknownRootCert : message = _("Unable to establish a secure connection to host " "(untrusted certificate)."); break; case errSSLNoRootCert : message = _("Unable to establish a secure connection to host " "(self-signed certificate)."); break; case errSSLCertExpired : message = _("Unable to establish a secure connection to host " "(expired certificate)."); break; case errSSLCertNotYetValid : message = _("Unable to establish a secure connection to host " "(certificate not yet valid)."); break; case errSSLHostNameMismatch : message = _("Unable to establish a secure connection to host " "(host name mismatch)."); break; case errSSLXCertChainInvalid : message = _("Unable to establish a secure connection to host " "(certificate chain invalid)."); break; case errSSLConnectionRefused : message = _("Unable to establish a secure connection to host " "(peer dropped connection before responding)."); break; default : break; } } /* * Restore the previous timeout settings... */ httpSetTimeout(http, old_timeout, old_cb, old_data); } if (error) { http->error = error; http->status = HTTP_STATUS_ERROR; errno = ECONNREFUSED; CFRelease(http->tls); http->tls = NULL; /* * If an error string wasn't set by the callbacks use a generic one... */ if (!message) { if (!cg->lang_default) cg->lang_default = cupsLangDefault(); snprintf(msgbuf, sizeof(msgbuf), _cupsLangString(cg->lang_default, _("Unable to establish a secure connection to host (%d).")), error); message = msgbuf; } _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, message, 1); return (-1); } return (0); } /* * '_httpTLSStop()' - Shut down SSL/TLS on a connection. */ void _httpTLSStop(http_t *http) /* I - HTTP connection */ { while (SSLClose(http->tls) == errSSLWouldBlock) usleep(1000); CFRelease(http->tls); if (http->tls_credentials) CFRelease(http->tls_credentials); http->tls = NULL; http->tls_credentials = NULL; } /* * '_httpTLSWrite()' - Write to a SSL/TLS connection. */ int /* O - Bytes written */ _httpTLSWrite(http_t *http, /* I - HTTP connection */ const char *buf, /* I - Buffer holding data */ int len) /* I - Length of buffer */ { ssize_t result; /* Return value */ OSStatus error; /* Error info */ size_t processed; /* Number of bytes processed */ DEBUG_printf(("2_httpTLSWrite(http=%p, buf=%p, len=%d)", (void *)http, (void *)buf, len)); error = SSLWrite(http->tls, buf, (size_t)len, &processed); switch (error) { case 0 : result = (int)processed; break; case errSSLWouldBlock : if (processed) { result = (int)processed; } else { result = -1; errno = EINTR; } break; case errSSLClosedGraceful : default : if (processed) { result = (int)processed; } else { result = -1; errno = EPIPE; } break; } DEBUG_printf(("3_httpTLSWrite: Returning %d.", (int)result)); return ((int)result); } /* * 'http_cdsa_copy_server()' - Find and copy server credentials from the keychain. */ static CFArrayRef /* O - Array of certificates or NULL */ http_cdsa_copy_server( const char *common_name) /* I - Server's hostname */ { #if TARGET_OS_OSX OSStatus err; /* Error info */ SecIdentityRef identity = NULL;/* Identity */ CFArrayRef certificates = NULL; /* Certificate array */ SecPolicyRef policy = NULL; /* Policy ref */ CFStringRef cfcommon_name = NULL; /* Server name */ CFMutableDictionaryRef query = NULL; /* Query qualifiers */ CFArrayRef list = NULL; /* Keychain list */ SecKeychainRef syschain = NULL;/* System keychain */ SecKeychainStatus status = 0; /* Keychain status */ DEBUG_printf(("3http_cdsa_copy_server(common_name=\"%s\")", common_name)); cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8); policy = SecPolicyCreateSSL(1, cfcommon_name); if (!policy) { DEBUG_puts("4http_cdsa_copy_server: Unable to create SSL policy."); goto cleanup; } if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks))) { DEBUG_puts("4http_cdsa_copy_server: Unable to create query dictionary."); goto cleanup; } _cupsMutexLock(&tls_mutex); err = SecKeychainGetStatus(tls_keychain, &status); if (err == noErr && !(status & kSecUnlockStateStatus) && tls_cups_keychain) SecKeychainUnlock(tls_keychain, _CUPS_CDSA_PASSLEN, _CUPS_CDSA_PASSWORD, TRUE); CFDictionaryAddValue(query, kSecClass, kSecClassIdentity); CFDictionaryAddValue(query, kSecMatchPolicy, policy); CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue); CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne); syschain = http_cdsa_open_system_keychain(); if (syschain) { const void *values[2] = { syschain, tls_keychain }; list = CFArrayCreate(kCFAllocatorDefault, (const void **)values, 2, &kCFTypeArrayCallBacks); } else list = CFArrayCreate(kCFAllocatorDefault, (const void **)&tls_keychain, 1, &kCFTypeArrayCallBacks); CFDictionaryAddValue(query, kSecMatchSearchList, list); CFRelease(list); err = SecItemCopyMatching(query, (CFTypeRef *)&identity); _cupsMutexUnlock(&tls_mutex); if (err != noErr) { DEBUG_printf(("4http_cdsa_copy_server: SecItemCopyMatching failed with status %d.", (int)err)); goto cleanup; } if (CFGetTypeID(identity) != SecIdentityGetTypeID()) { DEBUG_puts("4http_cdsa_copy_server: Search returned something that is not an identity."); goto cleanup; } if ((certificates = CFArrayCreate(NULL, (const void **)&identity, 1, &kCFTypeArrayCallBacks)) == NULL) { DEBUG_puts("4http_cdsa_copy_server: Unable to create array of certificates."); goto cleanup; } cleanup : if (syschain) CFRelease(syschain); if (identity) CFRelease(identity); if (policy) CFRelease(policy); if (cfcommon_name) CFRelease(cfcommon_name); if (query) CFRelease(query); DEBUG_printf(("4http_cdsa_copy_server: Returning %p.", (void *)certificates)); return (certificates); #else (void)common_name; if (!tls_selfsigned) return (NULL); return (CFArrayCreate(NULL, (const void **)&tls_selfsigned, 1, &kCFTypeArrayCallBacks)); #endif /* TARGET_OS_OSX */ } /* * 'http_cdsa_create_credential()' - Create a single credential in the internal format. */ static SecCertificateRef /* O - Certificate */ http_cdsa_create_credential( http_credential_t *credential) /* I - Credential */ { SecCertificateRef cert; /* Certificate */ CFDataRef data; /* Data object */ if (!credential) return (NULL); data = CFDataCreate(kCFAllocatorDefault, credential->data, (CFIndex)credential->datalen); cert = SecCertificateCreateWithData(kCFAllocatorDefault, data); CFRelease(data); return (cert); } #if TARGET_OS_OSX /* * 'http_cdsa_default_path()' - Get the default keychain path. */ static const char * /* O - Keychain path */ http_cdsa_default_path(char *buffer, /* I - Path buffer */ size_t bufsize) /* I - Size of buffer */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * Determine the default keychain path. Note that the login and system * keychains are no longer accessible to user applications starting in macOS * 10.11.4 (!), so we need to create our own keychain just for CUPS. */ if (cg->home) snprintf(buffer, bufsize, "%s/.cups/ssl.keychain", cg->home); else strlcpy(buffer, "/etc/cups/ssl.keychain", bufsize); DEBUG_printf(("1http_cdsa_default_path: Using default path \"%s\".", buffer)); return (buffer); } /* * 'http_cdsa_open_keychain()' - Open (or create) a keychain. */ static SecKeychainRef /* O - Keychain or NULL */ http_cdsa_open_keychain( const char *path, /* I - Path to keychain */ char *filename, /* I - Keychain filename */ size_t filesize) /* I - Size of filename buffer */ { SecKeychainRef keychain = NULL;/* Temporary keychain */ OSStatus err; /* Error code */ Boolean interaction; /* Interaction allowed? */ SecKeychainStatus status = 0; /* Keychain status */ /* * Get the keychain filename... */ if (!path) { path = http_cdsa_default_path(filename, filesize); tls_cups_keychain = 1; } else { strlcpy(filename, path, filesize); tls_cups_keychain = 0; } /* * Save the interaction setting and disable while we open the keychain... */ SecKeychainGetUserInteractionAllowed(&interaction); SecKeychainSetUserInteractionAllowed(FALSE); if (access(path, R_OK) && tls_cups_keychain) { /* * Create a new keychain at the given path... */ err = SecKeychainCreate(path, _CUPS_CDSA_PASSLEN, _CUPS_CDSA_PASSWORD, FALSE, NULL, &keychain); } else { /* * Open the existing keychain and unlock as needed... */ err = SecKeychainOpen(path, &keychain); if (err == noErr) err = SecKeychainGetStatus(keychain, &status); if (err == noErr && !(status & kSecUnlockStateStatus) && tls_cups_keychain) err = SecKeychainUnlock(keychain, _CUPS_CDSA_PASSLEN, _CUPS_CDSA_PASSWORD, TRUE); } /* * Restore interaction setting... */ SecKeychainSetUserInteractionAllowed(interaction); /* * Release the keychain if we had any errors... */ if (err != noErr) { /* TODO: Set cups last error string */ DEBUG_printf(("4http_cdsa_open_keychain: Unable to open keychain (%d), returning NULL.", (int)err)); if (keychain) { CFRelease(keychain); keychain = NULL; } } /* * Return the keychain or NULL... */ return (keychain); } /* * 'http_cdsa_open_system_keychain()' - Open the System keychain. */ static SecKeychainRef http_cdsa_open_system_keychain(void) { SecKeychainRef keychain = NULL;/* Temporary keychain */ OSStatus err; /* Error code */ Boolean interaction; /* Interaction allowed? */ SecKeychainStatus status = 0; /* Keychain status */ /* * Save the interaction setting and disable while we open the keychain... */ SecKeychainGetUserInteractionAllowed(&interaction); SecKeychainSetUserInteractionAllowed(TRUE); err = SecKeychainOpen("/Library/Keychains/System.keychain", &keychain); if (err == noErr) err = SecKeychainGetStatus(keychain, &status); if (err == noErr && !(status & kSecUnlockStateStatus)) err = errSecInteractionNotAllowed; /* * Restore interaction setting... */ SecKeychainSetUserInteractionAllowed(interaction); /* * Release the keychain if we had any errors... */ if (err != noErr) { /* TODO: Set cups last error string */ DEBUG_printf(("4http_cdsa_open_system_keychain: Unable to open keychain (%d), returning NULL.", (int)err)); if (keychain) { CFRelease(keychain); keychain = NULL; } } /* * Return the keychain or NULL... */ return (keychain); } #endif /* TARGET_OS_OSX */ /* * 'http_cdsa_read()' - Read function for the CDSA library. */ static OSStatus /* O - -1 on error, 0 on success */ http_cdsa_read( SSLConnectionRef connection, /* I - SSL/TLS connection */ void *data, /* I - Data buffer */ size_t *dataLength) /* IO - Number of bytes */ { OSStatus result; /* Return value */ ssize_t bytes; /* Number of bytes read */ http_t *http; /* HTTP connection */ http = (http_t *)connection; if (!http->blocking || http->timeout_value > 0.0) { /* * Make sure we have data before we read... */ while (!_httpWait(http, http->wait_value, 0)) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; http->error = ETIMEDOUT; return (-1); } } do { bytes = recv(http->fd, data, *dataLength, 0); } while (bytes == -1 && (errno == EINTR || errno == EAGAIN)); if ((size_t)bytes == *dataLength) { result = 0; } else if (bytes > 0) { *dataLength = (size_t)bytes; result = errSSLWouldBlock; } else { *dataLength = 0; if (bytes == 0) result = errSSLClosedGraceful; else if (errno == EAGAIN) result = errSSLWouldBlock; else result = errSSLClosedAbort; } return (result); } /* * 'http_cdsa_set_credentials()' - Set the TLS credentials. */ static int /* O - Status of connection */ http_cdsa_set_credentials(http_t *http) /* I - HTTP connection */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ OSStatus error = 0; /* Error code */ http_tls_credentials_t credentials = NULL; /* TLS credentials */ DEBUG_printf(("7http_tls_set_credentials(%p)", (void *)http)); /* * Prefer connection specific credentials... */ if ((credentials = http->tls_credentials) == NULL) credentials = cg->tls_credentials; if (credentials) { error = SSLSetCertificate(http->tls, credentials); DEBUG_printf(("4http_tls_set_credentials: SSLSetCertificate, error=%d", (int)error)); } else DEBUG_puts("4http_tls_set_credentials: No credentials to set."); return (error); } /* * 'http_cdsa_write()' - Write function for the CDSA library. */ static OSStatus /* O - -1 on error, 0 on success */ http_cdsa_write( SSLConnectionRef connection, /* I - SSL/TLS connection */ const void *data, /* I - Data buffer */ size_t *dataLength) /* IO - Number of bytes */ { OSStatus result; /* Return value */ ssize_t bytes; /* Number of bytes read */ http_t *http; /* HTTP connection */ http = (http_t *)connection; do { bytes = write(http->fd, data, *dataLength); } while (bytes == -1 && (errno == EINTR || errno == EAGAIN)); if ((size_t)bytes == *dataLength) { result = 0; } else if (bytes >= 0) { *dataLength = (size_t)bytes; result = errSSLWouldBlock; } else { *dataLength = 0; if (errno == EAGAIN) result = errSSLWouldBlock; else result = errSSLClosedAbort; } return (result); } cups-2.3.1/cups/request.c000664 000765 000024 00000072310 13574721672 015410 0ustar00mikestaff000000 000000 /* * IPP utilities for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ #ifndef O_BINARY # define O_BINARY 0 #endif /* O_BINARY */ #ifndef MSG_DONTWAIT # define MSG_DONTWAIT 0 #endif /* !MSG_DONTWAIT */ /* * 'cupsDoFileRequest()' - Do an IPP request with a file. * * This function sends the IPP request and attached file to the specified * server, retrying and authenticating as necessary. The request is freed with * @link ippDelete@. */ ipp_t * /* O - Response data */ cupsDoFileRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ ipp_t *request, /* I - IPP request */ const char *resource, /* I - HTTP resource for POST */ const char *filename) /* I - File to send or @code NULL@ for none */ { ipp_t *response; /* IPP response data */ int infile; /* Input file */ DEBUG_printf(("cupsDoFileRequest(http=%p, request=%p(%s), resource=\"%s\", filename=\"%s\")", (void *)http, (void *)request, request ? ippOpString(request->request.op.operation_id) : "?", resource, filename)); if (filename) { if ((infile = open(filename, O_RDONLY | O_BINARY)) < 0) { /* * Can't get file information! */ _cupsSetError(errno == ENOENT ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED, NULL, 0); ippDelete(request); return (NULL); } } else infile = -1; response = cupsDoIORequest(http, request, resource, infile, -1); if (infile >= 0) close(infile); return (response); } /* * 'cupsDoIORequest()' - Do an IPP request with file descriptors. * * This function sends the IPP request with the optional input file "infile" to * the specified server, retrying and authenticating as necessary. The request * is freed with @link ippDelete@. * * If "infile" is a valid file descriptor, @code cupsDoIORequest@ copies * all of the data from the file after the IPP request message. * * If "outfile" is a valid file descriptor, @code cupsDoIORequest@ copies * all of the data after the IPP response message to the file. * * @since CUPS 1.3/macOS 10.5@ */ ipp_t * /* O - Response data */ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ ipp_t *request, /* I - IPP request */ const char *resource, /* I - HTTP resource for POST */ int infile, /* I - File to read from or -1 for none */ int outfile) /* I - File to write to or -1 for none */ { ipp_t *response = NULL; /* IPP response data */ size_t length = 0; /* Content-Length value */ http_status_t status; /* Status of HTTP request */ struct stat fileinfo; /* File information */ ssize_t bytes; /* Number of bytes read/written */ char buffer[32768]; /* Output buffer */ DEBUG_printf(("cupsDoIORequest(http=%p, request=%p(%s), resource=\"%s\", infile=%d, outfile=%d)", (void *)http, (void *)request, request ? ippOpString(request->request.op.operation_id) : "?", resource, infile, outfile)); /* * Range check input... */ if (!request || !resource) { ippDelete(request); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Get the default connection as needed... */ if (!http && (http = _cupsConnect()) == NULL) { ippDelete(request); return (NULL); } /* * See if we have a file to send... */ if (infile >= 0) { if (fstat(infile, &fileinfo)) { /* * Can't get file information! */ _cupsSetError(errno == EBADF ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED, NULL, 0); ippDelete(request); return (NULL); } #ifdef _WIN32 if (fileinfo.st_mode & _S_IFDIR) #else if (S_ISDIR(fileinfo.st_mode)) #endif /* _WIN32 */ { /* * Can't send a directory... */ _cupsSetError(IPP_STATUS_ERROR_NOT_POSSIBLE, strerror(EISDIR), 0); ippDelete(request); return (NULL); } #ifndef _WIN32 if (!S_ISREG(fileinfo.st_mode)) length = 0; /* Chunk when piping */ else #endif /* !_WIN32 */ length = ippLength(request) + (size_t)fileinfo.st_size; } else length = ippLength(request); DEBUG_printf(("2cupsDoIORequest: Request length=%ld, total length=%ld", (long)ippLength(request), (long)length)); /* * Clear any "Local" authentication data since it is probably stale... */ if (http->authstring && !strncmp(http->authstring, "Local ", 6)) httpSetAuthString(http, NULL, NULL); /* * Loop until we can send the request without authorization problems. */ while (response == NULL) { DEBUG_puts("2cupsDoIORequest: setup..."); /* * Send the request... */ status = cupsSendRequest(http, request, resource, length); DEBUG_printf(("2cupsDoIORequest: status=%d", status)); if (status == HTTP_STATUS_CONTINUE && request->state == IPP_STATE_DATA && infile >= 0) { DEBUG_puts("2cupsDoIORequest: file write..."); /* * Send the file with the request... */ #ifndef _WIN32 if (S_ISREG(fileinfo.st_mode)) #endif /* _WIN32 */ lseek(infile, 0, SEEK_SET); while ((bytes = read(infile, buffer, sizeof(buffer))) > 0) { if ((status = cupsWriteRequestData(http, buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE) break; } } /* * Get the server's response... */ if (status <= HTTP_STATUS_CONTINUE || status == HTTP_STATUS_OK) { response = cupsGetResponse(http, resource); status = httpGetStatus(http); } DEBUG_printf(("2cupsDoIORequest: status=%d", status)); if (status == HTTP_STATUS_ERROR || (status >= HTTP_STATUS_BAD_REQUEST && status != HTTP_STATUS_UNAUTHORIZED && status != HTTP_STATUS_UPGRADE_REQUIRED)) { _cupsSetHTTPError(status); break; } if (response && outfile >= 0) { /* * Write trailing data to file... */ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) if (write(outfile, buffer, (size_t)bytes) < bytes) break; } if (http->state != HTTP_STATE_WAITING) { /* * Flush any remaining data... */ httpFlush(http); } } /* * Delete the original request and return the response... */ ippDelete(request); return (response); } /* * 'cupsDoRequest()' - Do an IPP request. * * This function sends the IPP request to the specified server, retrying * and authenticating as necessary. The request is freed with @link ippDelete@. */ ipp_t * /* O - Response data */ cupsDoRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ ipp_t *request, /* I - IPP request */ const char *resource) /* I - HTTP resource for POST */ { DEBUG_printf(("cupsDoRequest(http=%p, request=%p(%s), resource=\"%s\")", (void *)http, (void *)request, request ? ippOpString(request->request.op.operation_id) : "?", resource)); return (cupsDoIORequest(http, request, resource, -1, -1)); } /* * 'cupsGetResponse()' - Get a response to an IPP request. * * Use this function to get the response for an IPP request sent using * @link cupsSendRequest@. For requests that return additional data, use * @link cupsReadResponseData@ after getting a successful response, * otherwise call @link httpFlush@ to complete the response processing. * * @since CUPS 1.4/macOS 10.6@ */ ipp_t * /* O - Response or @code NULL@ on HTTP error */ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource) /* I - HTTP resource for POST */ { http_status_t status; /* HTTP status */ ipp_state_t state; /* IPP read state */ ipp_t *response = NULL; /* IPP response */ DEBUG_printf(("cupsGetResponse(http=%p, resource=\"%s\")", (void *)http, resource)); DEBUG_printf(("1cupsGetResponse: http->state=%d", http ? http->state : HTTP_STATE_ERROR)); /* * Connect to the default server as needed... */ if (!http) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if ((http = cg->http) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection."), 1); DEBUG_puts("1cupsGetResponse: No active connection - returning NULL."); return (NULL); } } if (http->state != HTTP_STATE_POST_RECV && http->state != HTTP_STATE_POST_SEND) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request sent."), 1); DEBUG_puts("1cupsGetResponse: Not in POST state - returning NULL."); return (NULL); } /* * Check for an unfinished chunked request... */ if (http->data_encoding == HTTP_ENCODING_CHUNKED) { /* * Send a 0-length chunk to finish off the request... */ DEBUG_puts("2cupsGetResponse: Finishing chunked POST..."); if (httpWrite2(http, "", 0) < 0) return (NULL); } /* * Wait for a response from the server... */ DEBUG_printf(("2cupsGetResponse: Update loop, http->status=%d...", http->status)); do { status = httpUpdate(http); } while (status == HTTP_STATUS_CONTINUE); DEBUG_printf(("2cupsGetResponse: status=%d", status)); if (status == HTTP_STATUS_OK) { /* * Get the IPP response... */ response = ippNew(); while ((state = ippRead(http, response)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; if (state == IPP_STATE_ERROR) { /* * Flush remaining data and delete the response... */ DEBUG_puts("1cupsGetResponse: IPP read error!"); httpFlush(http); ippDelete(response); response = NULL; http->status = status = HTTP_STATUS_ERROR; http->error = EINVAL; } } else if (status != HTTP_STATUS_ERROR) { /* * Flush any error message... */ httpFlush(http); /* * Then handle encryption and authentication... */ if (status == HTTP_STATUS_UNAUTHORIZED) { /* * See if we can do authentication... */ DEBUG_puts("2cupsGetResponse: Need authorization..."); if (!cupsDoAuthentication(http, "POST", resource)) httpReconnect2(http, 30000, NULL); else http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* * Force a reconnect with encryption... */ DEBUG_puts("2cupsGetResponse: Need encryption..."); if (!httpReconnect2(http, 30000, NULL)) httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); } #endif /* HAVE_SSL */ } if (response) { ipp_attribute_t *attr; /* status-message attribute */ attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); DEBUG_printf(("1cupsGetResponse: status-code=%s, status-message=\"%s\"", ippErrorString(response->request.status.status_code), attr ? attr->values[0].string.text : "")); _cupsSetError(response->request.status.status_code, attr ? attr->values[0].string.text : ippErrorString(response->request.status.status_code), 0); } return (response); } /* * 'cupsLastError()' - Return the last IPP status code received on the current * thread. */ ipp_status_t /* O - IPP status code from last request */ cupsLastError(void) { return (_cupsGlobals()->last_error); } /* * 'cupsLastErrorString()' - Return the last IPP status-message received on the * current thread. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - status-message text from last request */ cupsLastErrorString(void) { return (_cupsGlobals()->last_status_message); } /* * '_cupsNextDelay()' - Return the next retry delay value. * * This function currently returns the Fibonacci sequence 1 1 2 3 5 8. * * Pass 0 for the current delay value to initialize the sequence. */ int /* O - Next delay value */ _cupsNextDelay(int current, /* I - Current delay value or 0 */ int *previous) /* IO - Previous delay value */ { int next; /* Next delay value */ if (current > 0) { next = (current + *previous) % 12; *previous = next < current ? 0 : current; } else { next = 1; *previous = 0; } return (next); } /* * 'cupsReadResponseData()' - Read additional data after the IPP response. * * This function is used after @link cupsGetResponse@ to read the PPD or document * files from @code CUPS_GET_PPD@ and @code CUPS_GET_DOCUMENT@ requests, * respectively. * * @since CUPS 1.4/macOS 10.6@ */ ssize_t /* O - Bytes read, 0 on EOF, -1 on error */ cupsReadResponseData( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ char *buffer, /* I - Buffer to use */ size_t length) /* I - Number of bytes to read */ { /* * Get the default connection as needed... */ DEBUG_printf(("cupsReadResponseData(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (!http) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if ((http = cg->http) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1); return (-1); } } /* * Then read from the HTTP connection... */ return (httpRead2(http, buffer, length)); } /* * 'cupsSendRequest()' - Send an IPP request. * * Use @link cupsWriteRequestData@ to write any additional data (document, PPD * file, etc.) for the request, @link cupsGetResponse@ to get the IPP response, * and @link cupsReadResponseData@ to read any additional data following the * response. Only one request can be sent/queued at a time per @code http_t@ * connection. * * Returns the initial HTTP status code, which will be @code HTTP_STATUS_CONTINUE@ * on a successful send of the request. * * Note: Unlike @link cupsDoFileRequest@, @link cupsDoIORequest@, and * @link cupsDoRequest@, the request is NOT freed with @link ippDelete@. * * @since CUPS 1.4/macOS 10.6@ */ http_status_t /* O - Initial HTTP status */ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ ipp_t *request, /* I - IPP request */ const char *resource, /* I - Resource path */ size_t length) /* I - Length of data to follow or @code CUPS_LENGTH_VARIABLE@ */ { http_status_t status; /* Status of HTTP request */ int got_status; /* Did we get the status? */ ipp_state_t state; /* State of IPP processing */ http_status_t expect; /* Expect: header to use */ char date[256]; /* Date: header value */ int digest; /* Are we using Digest authentication? */ DEBUG_printf(("cupsSendRequest(http=%p, request=%p(%s), resource=\"%s\", length=" CUPS_LLFMT ")", (void *)http, (void *)request, request ? ippOpString(request->request.op.operation_id) : "?", resource, CUPS_LLCAST length)); /* * Range check input... */ if (!request || !resource) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (HTTP_STATUS_ERROR); } /* * Get the default connection as needed... */ if (!http && (http = _cupsConnect()) == NULL) return (HTTP_STATUS_SERVICE_UNAVAILABLE); /* * If the prior request was not flushed out, do so now... */ if (http->state == HTTP_STATE_GET_SEND || http->state == HTTP_STATE_POST_SEND) { DEBUG_puts("2cupsSendRequest: Flush prior response."); httpFlush(http); } else if (http->state != HTTP_STATE_WAITING) { DEBUG_printf(("1cupsSendRequest: Unknown HTTP state (%d), " "reconnecting.", http->state)); if (httpReconnect2(http, 30000, NULL)) return (HTTP_STATUS_ERROR); } #ifdef HAVE_SSL /* * See if we have an auth-info attribute and are communicating over * a non-local link. If so, encrypt the link so that we can pass * the authentication information securely... */ if (ippFindAttribute(request, "auth-info", IPP_TAG_TEXT) && !httpAddrLocalhost(http->hostaddr) && !http->tls && httpEncryption(http, HTTP_ENCRYPTION_REQUIRED)) { DEBUG_puts("1cupsSendRequest: Unable to encrypt connection."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } #endif /* HAVE_SSL */ /* * Reconnect if the last response had a "Connection: close"... */ if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) { DEBUG_puts("2cupsSendRequest: Connection: close"); httpClearFields(http); if (httpReconnect2(http, 30000, NULL)) { DEBUG_puts("1cupsSendRequest: Unable to reconnect."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } } /* * Loop until we can send the request without authorization problems. */ expect = HTTP_STATUS_CONTINUE; for (;;) { DEBUG_puts("2cupsSendRequest: Setup..."); /* * Setup the HTTP variables needed... */ httpClearFields(http); httpSetExpect(http, expect); httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp"); httpSetField(http, HTTP_FIELD_DATE, httpGetDateString2(time(NULL), date, (int)sizeof(date))); httpSetLength(http, length); digest = http->authstring && !strncmp(http->authstring, "Digest ", 7); if (digest) { /* * Update the Digest authentication string... */ _httpSetDigestAuthString(http, http->nextnonce, "POST", resource); } #ifdef HAVE_GSSAPI if (http->authstring && !strncmp(http->authstring, "Negotiate", 9)) { /* * Do not use cached Kerberos credentials since they will look like a * "replay" attack... */ _cupsSetNegotiateAuthString(http, "POST", resource); } #endif /* HAVE_GSSAPI */ httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); DEBUG_printf(("2cupsSendRequest: authstring=\"%s\"", http->authstring)); /* * Try the request... */ DEBUG_puts("2cupsSendRequest: Sending HTTP POST..."); if (httpPost(http, resource)) { DEBUG_puts("2cupsSendRequest: POST failed, reconnecting."); if (httpReconnect2(http, 30000, NULL)) { DEBUG_puts("1cupsSendRequest: Unable to reconnect."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } else continue; } /* * Send the IPP data... */ DEBUG_puts("2cupsSendRequest: Writing IPP request..."); request->state = IPP_STATE_IDLE; status = HTTP_STATUS_CONTINUE; got_status = 0; while ((state = ippWrite(http, request)) != IPP_STATE_DATA) { if (httpCheck(http)) { got_status = 1; _httpUpdate(http, &status); if (status >= HTTP_STATUS_MULTIPLE_CHOICES) break; } else if (state == IPP_STATE_ERROR) break; } if (state == IPP_STATE_ERROR) { /* * We weren't able to send the IPP request. But did we already get a HTTP * error status? */ if (!got_status || status < HTTP_STATUS_MULTIPLE_CHOICES) { /* * No, something else went wrong. */ DEBUG_puts("1cupsSendRequest: Unable to send IPP request."); http->status = HTTP_STATUS_ERROR; http->state = HTTP_STATE_WAITING; return (HTTP_STATUS_ERROR); } } /* * Wait up to 1 second to get the 100-continue response as needed... */ if (!got_status || (digest && status == HTTP_STATUS_CONTINUE)) { if (expect == HTTP_STATUS_CONTINUE || digest) { DEBUG_puts("2cupsSendRequest: Waiting for 100-continue..."); if (httpWait(http, 1000)) _httpUpdate(http, &status); } else if (httpCheck(http)) _httpUpdate(http, &status); } DEBUG_printf(("2cupsSendRequest: status=%d", status)); /* * Process the current HTTP status... */ if (status >= HTTP_STATUS_MULTIPLE_CHOICES) { int temp_status; /* Temporary status */ _cupsSetHTTPError(status); do { temp_status = httpUpdate(http); } while (temp_status != HTTP_STATUS_ERROR && http->state == HTTP_STATE_POST_RECV); httpFlush(http); } switch (status) { case HTTP_STATUS_CONTINUE : case HTTP_STATUS_OK : case HTTP_STATUS_ERROR : DEBUG_printf(("1cupsSendRequest: Returning %d.", status)); return (status); case HTTP_STATUS_UNAUTHORIZED : if (cupsDoAuthentication(http, "POST", resource)) { DEBUG_puts("1cupsSendRequest: Returning HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED."); return (HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED); } DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_STATUS_UNAUTHORIZED."); if (httpReconnect2(http, 30000, NULL)) { DEBUG_puts("1cupsSendRequest: Unable to reconnect."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } break; #ifdef HAVE_SSL case HTTP_STATUS_UPGRADE_REQUIRED : /* * Flush any error message, reconnect, and then upgrade with * encryption... */ DEBUG_puts("2cupsSendRequest: Reconnecting after " "HTTP_STATUS_UPGRADE_REQUIRED."); if (httpReconnect2(http, 30000, NULL)) { DEBUG_puts("1cupsSendRequest: Unable to reconnect."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } DEBUG_puts("2cupsSendRequest: Upgrading to TLS."); if (httpEncryption(http, HTTP_ENCRYPTION_REQUIRED)) { DEBUG_puts("1cupsSendRequest: Unable to encrypt connection."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } break; #endif /* HAVE_SSL */ case HTTP_STATUS_EXPECTATION_FAILED : /* * Don't try using the Expect: header the next time around... */ expect = (http_status_t)0; DEBUG_puts("2cupsSendRequest: Reconnecting after " "HTTP_EXPECTATION_FAILED."); if (httpReconnect2(http, 30000, NULL)) { DEBUG_puts("1cupsSendRequest: Unable to reconnect."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } break; default : /* * Some other error... */ return (status); } } } /* * 'cupsWriteRequestData()' - Write additional data after an IPP request. * * This function is used after @link cupsSendRequest@ to provide a PPD and * after @link cupsStartDocument@ to provide a document file. * * @since CUPS 1.4/macOS 10.6@ */ http_status_t /* O - @code HTTP_STATUS_CONTINUE@ if OK or HTTP status on error */ cupsWriteRequestData( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *buffer, /* I - Bytes to write */ size_t length) /* I - Number of bytes to write */ { int wused; /* Previous bytes in buffer */ /* * Get the default connection as needed... */ DEBUG_printf(("cupsWriteRequestData(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (!http) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if ((http = cg->http) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1); DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR."); return (HTTP_STATUS_ERROR); } } /* * Then write to the HTTP connection... */ wused = http->wused; if (httpWrite2(http, buffer, length) < 0) { DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0); return (HTTP_STATUS_ERROR); } /* * Finally, check if we have any pending data from the server... */ if (length >= HTTP_MAX_BUFFER || http->wused < wused || (wused > 0 && (size_t)http->wused == length)) { /* * We've written something to the server, so check for response data... */ if (_httpWait(http, 0, 1)) { http_status_t status; /* Status from _httpUpdate */ _httpUpdate(http, &status); if (status >= HTTP_STATUS_MULTIPLE_CHOICES) { _cupsSetHTTPError(status); do { status = httpUpdate(http); } while (status != HTTP_STATUS_ERROR && http->state == HTTP_STATE_POST_RECV); httpFlush(http); } DEBUG_printf(("1cupsWriteRequestData: Returning %d.\n", status)); return (status); } } DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_CONTINUE."); return (HTTP_STATUS_CONTINUE); } /* * '_cupsConnect()' - Get the default server connection... */ http_t * /* O - HTTP connection */ _cupsConnect(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if we are connected to the same server... */ if (cg->http) { /* * Compare the connection hostname, port, and encryption settings to * the cached defaults; these were initialized the first time we * connected... */ if (strcmp(cg->http->hostname, cg->server) || #ifdef AF_LOCAL (httpAddrFamily(cg->http->hostaddr) != AF_LOCAL && cg->ipp_port != httpAddrPort(cg->http->hostaddr)) || #else cg->ipp_port != httpAddrPort(cg->http->hostaddr) || #endif /* AF_LOCAL */ (cg->http->encryption != cg->encryption && cg->http->encryption == HTTP_ENCRYPTION_NEVER)) { /* * Need to close the current connection because something has changed... */ httpClose(cg->http); cg->http = NULL; } else { /* * Same server, see if the connection is still established... */ char ch; /* Connection check byte */ ssize_t n; /* Number of bytes */ #ifdef _WIN32 if ((n = recv(cg->http->fd, &ch, 1, MSG_PEEK)) == 0 || (n < 0 && WSAGetLastError() != WSAEWOULDBLOCK)) #else if ((n = recv(cg->http->fd, &ch, 1, MSG_PEEK | MSG_DONTWAIT)) == 0 || (n < 0 && errno != EWOULDBLOCK)) #endif /* _WIN32 */ { /* * Nope, close the connection... */ httpClose(cg->http); cg->http = NULL; } } } /* * (Re)connect as needed... */ if (!cg->http) { if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL)) == NULL) { if (errno) _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0); else _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, _("Unable to connect to host."), 1); } } /* * Return the cached connection... */ return (cg->http); } /* * '_cupsSetError()' - Set the last IPP status code and status-message. */ void _cupsSetError(ipp_status_t status, /* I - IPP status code */ const char *message, /* I - status-message value */ int localize) /* I - Localize the message? */ { _cups_globals_t *cg; /* Global data */ if (!message && errno) { message = strerror(errno); localize = 0; } cg = _cupsGlobals(); cg->last_error = status; if (cg->last_status_message) { _cupsStrFree(cg->last_status_message); cg->last_status_message = NULL; } if (message) { if (localize) { /* * Get the message catalog... */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); cg->last_status_message = _cupsStrAlloc(_cupsLangString(cg->lang_default, message)); } else cg->last_status_message = _cupsStrAlloc(message); } DEBUG_printf(("4_cupsSetError: last_error=%s, last_status_message=\"%s\"", ippErrorString(cg->last_error), cg->last_status_message)); } /* * '_cupsSetHTTPError()' - Set the last error using the HTTP status. */ void _cupsSetHTTPError(http_status_t status) /* I - HTTP status code */ { switch (status) { case HTTP_STATUS_NOT_FOUND : _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, httpStatus(status), 0); break; case HTTP_STATUS_UNAUTHORIZED : _cupsSetError(IPP_STATUS_ERROR_NOT_AUTHENTICATED, httpStatus(status), 0); break; case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED : _cupsSetError(IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED, httpStatus(status), 0); break; case HTTP_STATUS_FORBIDDEN : _cupsSetError(IPP_STATUS_ERROR_FORBIDDEN, httpStatus(status), 0); break; case HTTP_STATUS_BAD_REQUEST : _cupsSetError(IPP_STATUS_ERROR_BAD_REQUEST, httpStatus(status), 0); break; case HTTP_STATUS_REQUEST_TOO_LARGE : _cupsSetError(IPP_STATUS_ERROR_REQUEST_VALUE, httpStatus(status), 0); break; case HTTP_STATUS_NOT_IMPLEMENTED : _cupsSetError(IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, httpStatus(status), 0); break; case HTTP_STATUS_NOT_SUPPORTED : _cupsSetError(IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, httpStatus(status), 0); break; case HTTP_STATUS_UPGRADE_REQUIRED : _cupsSetError(IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED, httpStatus(status), 0); break; case HTTP_STATUS_CUPS_PKI_ERROR : _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, httpStatus(status), 0); break; case HTTP_STATUS_ERROR : _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); break; default : DEBUG_printf(("4_cupsSetHTTPError: HTTP error %d mapped to " "IPP_STATUS_ERROR_SERVICE_UNAVAILABLE!", status)); _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, httpStatus(status), 0); break; } } cups-2.3.1/cups/testraster.c000664 000765 000024 00000050751 13574721672 016125 0ustar00mikestaff000000 000000 /* * Raster test program routines for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include #include /* * Local functions... */ static int do_ras_file(const char *filename); static int do_raster_tests(cups_mode_t mode); static void print_changes(cups_page_header2_t *header, cups_page_header2_t *expected); /* * 'main()' - Test the raster functions. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int errors = 0; /* Number of errors */ if (argc == 1) { errors += do_raster_tests(CUPS_RASTER_WRITE); errors += do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED); errors += do_raster_tests(CUPS_RASTER_WRITE_PWG); errors += do_raster_tests(CUPS_RASTER_WRITE_APPLE); } else { int i; /* Looping var */ for (i = 1; i < argc; i ++) errors += do_ras_file(argv[i]); } return (errors); } /* * 'do_ras_file()' - Test reading of a raster file. */ static int /* O - Number of errors */ do_ras_file(const char *filename) /* I - Filename */ { unsigned y; /* Looping vars */ int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned char *data; /* Raster data */ int errors = 0; /* Number of errors */ unsigned pages = 0; /* Number of pages */ if ((fd = open(filename, O_RDONLY)) < 0) { printf("%s: %s\n", filename, strerror(errno)); return (1); } if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) { printf("%s: cupsRasterOpen failed.\n", filename); close(fd); return (1); } printf("%s:\n", filename); while (cupsRasterReadHeader2(ras, &header)) { pages ++; data = malloc(header.cupsBytesPerLine); printf(" Page %u: %ux%ux%u@%ux%udpi", pages, header.cupsWidth, header.cupsHeight, header.cupsBitsPerPixel, header.HWResolution[0], header.HWResolution[1]); fflush(stdout); for (y = 0; y < header.cupsHeight; y ++) if (cupsRasterReadPixels(ras, data, header.cupsBytesPerLine) < header.cupsBytesPerLine) break; if (y < header.cupsHeight) printf(" ERROR AT LINE %d\n", y); else putchar('\n'); free(data); } printf("EOF at %ld\n", (long)lseek(fd, SEEK_CUR, 0)); cupsRasterClose(ras); close(fd); return (errors); } /* * 'do_raster_tests()' - Test reading and writing of raster data. */ static int /* O - Number of errors */ do_raster_tests(cups_mode_t mode) /* O - Write mode */ { unsigned page, x, y, count;/* Looping vars */ FILE *fp; /* Raster file */ cups_raster_t *r; /* Raster stream */ cups_page_header2_t header, /* Page header */ expected; /* Expected page header */ unsigned char data[2048]; /* Raster data */ int errors = 0; /* Number of errors */ /* * Test writing... */ printf("cupsRasterOpen(%s): ", mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE" : mode == CUPS_RASTER_WRITE_COMPRESSED ? "CUPS_RASTER_WRITE_COMPRESSED" : mode == CUPS_RASTER_WRITE_PWG ? "CUPS_RASTER_WRITE_PWG" : "CUPS_RASTER_WRITE_APPLE"); fflush(stdout); if ((fp = fopen("test.raster", "wb")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); return (1); } if ((r = cupsRasterOpen(fileno(fp), mode)) == NULL) { printf("FAIL (%s)\n", strerror(errno)); fclose(fp); return (1); } puts("PASS"); for (page = 0; page < 4; page ++) { memset(&header, 0, sizeof(header)); header.cupsWidth = 256; header.cupsHeight = 256; header.cupsBytesPerLine = 256; header.HWResolution[0] = 64; header.HWResolution[1] = 64; header.PageSize[0] = 288; header.PageSize[1] = 288; header.cupsPageSize[0] = 288.0f; header.cupsPageSize[1] = 288.0f; strlcpy(header.MediaType, "auto", sizeof(header.MediaType)); if (page & 1) { header.cupsBytesPerLine *= 4; header.cupsColorSpace = CUPS_CSPACE_CMYK; header.cupsColorOrder = CUPS_ORDER_CHUNKED; header.cupsNumColors = 4; } else { header.cupsColorSpace = CUPS_CSPACE_W; header.cupsColorOrder = CUPS_ORDER_CHUNKED; header.cupsNumColors = 1; } if (page & 2) { header.cupsBytesPerLine *= 2; header.cupsBitsPerColor = 16; header.cupsBitsPerPixel = (page & 1) ? 64 : 16; } else { header.cupsBitsPerColor = 8; header.cupsBitsPerPixel = (page & 1) ? 32 : 8; } printf("cupsRasterWriteHeader2(page %d): ", page + 1); if (cupsRasterWriteHeader2(r, &header)) { puts("PASS"); } else { puts("FAIL"); errors ++; } fputs("cupsRasterWritePixels: ", stdout); fflush(stdout); memset(data, 0, header.cupsBytesPerLine); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { for (x = 0; x < header.cupsBytesPerLine; x ++) data[x] = (unsigned char)x; for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { memset(data, 255, header.cupsBytesPerLine); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { for (x = 0; x < header.cupsBytesPerLine; x ++) data[x] = (unsigned char)(x / 4); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else puts("PASS"); } } } } cupsRasterClose(r); fclose(fp); /* * Test reading... */ fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout); fflush(stdout); if ((fp = fopen("test.raster", "rb")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); return (1); } if ((r = cupsRasterOpen(fileno(fp), CUPS_RASTER_READ)) == NULL) { printf("FAIL (%s)\n", strerror(errno)); fclose(fp); return (1); } puts("PASS"); for (page = 0; page < 4; page ++) { memset(&expected, 0, sizeof(expected)); expected.cupsWidth = 256; expected.cupsHeight = 256; expected.cupsBytesPerLine = 256; expected.HWResolution[0] = 64; expected.HWResolution[1] = 64; expected.PageSize[0] = 288; expected.PageSize[1] = 288; strlcpy(expected.MediaType, "auto", sizeof(expected.MediaType)); if (mode != CUPS_RASTER_WRITE_PWG) { expected.cupsPageSize[0] = 288.0f; expected.cupsPageSize[1] = 288.0f; } if (mode >= CUPS_RASTER_WRITE_PWG) { strlcpy(expected.MediaClass, "PwgRaster", sizeof(expected.MediaClass)); expected.cupsInteger[7] = 0xffffff; } if (page & 1) { expected.cupsBytesPerLine *= 4; expected.cupsColorSpace = CUPS_CSPACE_CMYK; expected.cupsColorOrder = CUPS_ORDER_CHUNKED; expected.cupsNumColors = 4; } else { expected.cupsColorSpace = CUPS_CSPACE_W; expected.cupsColorOrder = CUPS_ORDER_CHUNKED; expected.cupsNumColors = 1; } if (page & 2) { expected.cupsBytesPerLine *= 2; expected.cupsBitsPerColor = 16; expected.cupsBitsPerPixel = (page & 1) ? 64 : 16; } else { expected.cupsBitsPerColor = 8; expected.cupsBitsPerPixel = (page & 1) ? 32 : 8; } printf("cupsRasterReadHeader2(page %d): ", page + 1); fflush(stdout); if (!cupsRasterReadHeader2(r, &header)) { puts("FAIL (read error)"); errors ++; break; } else if (memcmp(&header, &expected, sizeof(header))) { puts("FAIL (bad page header)"); errors ++; print_changes(&header, &expected); } else puts("PASS"); fputs("cupsRasterReadPixels: ", stdout); fflush(stdout); for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } if (data[0] != 0 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) { printf("FAIL (raster line %d corrupt)\n", y); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x]) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], 0); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } for (x = 0; x < header.cupsBytesPerLine; x ++) if (data[x] != (x & 255)) break; if (x < header.cupsBytesPerLine) { printf("FAIL (raster line %d corrupt)\n", y + 64); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != (x & 255)) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], x & 255); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } if (data[0] != 255 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) { printf("fail (raster line %d corrupt)\n", y + 128); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != 255) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], 255); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } for (x = 0; x < header.cupsBytesPerLine; x ++) if (data[x] != ((x / 4) & 255)) break; if (x < header.cupsBytesPerLine) { printf("FAIL (raster line %d corrupt)\n", y + 192); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != ((x / 4) & 255)) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], (x / 4) & 255); } } errors ++; break; } } if (y == 64) puts("PASS"); } } } } cupsRasterClose(r); fclose(fp); return (errors); } /* * 'print_changes()' - Print differences in the page header. */ static void print_changes( cups_page_header2_t *header, /* I - Actual page header */ cups_page_header2_t *expected) /* I - Expected page header */ { int i; /* Looping var */ if (strcmp(header->MediaClass, expected->MediaClass)) printf(" MediaClass (%s), expected (%s)\n", header->MediaClass, expected->MediaClass); if (strcmp(header->MediaColor, expected->MediaColor)) printf(" MediaColor (%s), expected (%s)\n", header->MediaColor, expected->MediaColor); if (strcmp(header->MediaType, expected->MediaType)) printf(" MediaType (%s), expected (%s)\n", header->MediaType, expected->MediaType); if (strcmp(header->OutputType, expected->OutputType)) printf(" OutputType (%s), expected (%s)\n", header->OutputType, expected->OutputType); if (header->AdvanceDistance != expected->AdvanceDistance) printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance, expected->AdvanceDistance); if (header->AdvanceMedia != expected->AdvanceMedia) printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia, expected->AdvanceMedia); if (header->Collate != expected->Collate) printf(" Collate %d, expected %d\n", header->Collate, expected->Collate); if (header->CutMedia != expected->CutMedia) printf(" CutMedia %d, expected %d\n", header->CutMedia, expected->CutMedia); if (header->Duplex != expected->Duplex) printf(" Duplex %d, expected %d\n", header->Duplex, expected->Duplex); if (header->HWResolution[0] != expected->HWResolution[0] || header->HWResolution[1] != expected->HWResolution[1]) printf(" HWResolution [%d %d], expected [%d %d]\n", header->HWResolution[0], header->HWResolution[1], expected->HWResolution[0], expected->HWResolution[1]); if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox, sizeof(header->ImagingBoundingBox))) printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3], expected->ImagingBoundingBox[0], expected->ImagingBoundingBox[1], expected->ImagingBoundingBox[2], expected->ImagingBoundingBox[3]); if (header->InsertSheet != expected->InsertSheet) printf(" InsertSheet %d, expected %d\n", header->InsertSheet, expected->InsertSheet); if (header->Jog != expected->Jog) printf(" Jog %d, expected %d\n", header->Jog, expected->Jog); if (header->LeadingEdge != expected->LeadingEdge) printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge, expected->LeadingEdge); if (header->Margins[0] != expected->Margins[0] || header->Margins[1] != expected->Margins[1]) printf(" Margins [%d %d], expected [%d %d]\n", header->Margins[0], header->Margins[1], expected->Margins[0], expected->Margins[1]); if (header->ManualFeed != expected->ManualFeed) printf(" ManualFeed %d, expected %d\n", header->ManualFeed, expected->ManualFeed); if (header->MediaPosition != expected->MediaPosition) printf(" MediaPosition %d, expected %d\n", header->MediaPosition, expected->MediaPosition); if (header->MediaWeight != expected->MediaWeight) printf(" MediaWeight %d, expected %d\n", header->MediaWeight, expected->MediaWeight); if (header->MirrorPrint != expected->MirrorPrint) printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint, expected->MirrorPrint); if (header->NegativePrint != expected->NegativePrint) printf(" NegativePrint %d, expected %d\n", header->NegativePrint, expected->NegativePrint); if (header->NumCopies != expected->NumCopies) printf(" NumCopies %d, expected %d\n", header->NumCopies, expected->NumCopies); if (header->Orientation != expected->Orientation) printf(" Orientation %d, expected %d\n", header->Orientation, expected->Orientation); if (header->OutputFaceUp != expected->OutputFaceUp) printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp, expected->OutputFaceUp); if (header->PageSize[0] != expected->PageSize[0] || header->PageSize[1] != expected->PageSize[1]) printf(" PageSize [%d %d], expected [%d %d]\n", header->PageSize[0], header->PageSize[1], expected->PageSize[0], expected->PageSize[1]); if (header->Separations != expected->Separations) printf(" Separations %d, expected %d\n", header->Separations, expected->Separations); if (header->TraySwitch != expected->TraySwitch) printf(" TraySwitch %d, expected %d\n", header->TraySwitch, expected->TraySwitch); if (header->Tumble != expected->Tumble) printf(" Tumble %d, expected %d\n", header->Tumble, expected->Tumble); if (header->cupsWidth != expected->cupsWidth) printf(" cupsWidth %d, expected %d\n", header->cupsWidth, expected->cupsWidth); if (header->cupsHeight != expected->cupsHeight) printf(" cupsHeight %d, expected %d\n", header->cupsHeight, expected->cupsHeight); if (header->cupsMediaType != expected->cupsMediaType) printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType, expected->cupsMediaType); if (header->cupsBitsPerColor != expected->cupsBitsPerColor) printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor, expected->cupsBitsPerColor); if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel) printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel, expected->cupsBitsPerPixel); if (header->cupsBytesPerLine != expected->cupsBytesPerLine) printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine, expected->cupsBytesPerLine); if (header->cupsColorOrder != expected->cupsColorOrder) printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder, expected->cupsColorOrder); if (header->cupsColorSpace != expected->cupsColorSpace) printf(" cupsColorSpace %d, expected %d\n", header->cupsColorSpace, expected->cupsColorSpace); if (header->cupsCompression != expected->cupsCompression) printf(" cupsCompression %d, expected %d\n", header->cupsCompression, expected->cupsCompression); if (header->cupsRowCount != expected->cupsRowCount) printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount, expected->cupsRowCount); if (header->cupsRowFeed != expected->cupsRowFeed) printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed, expected->cupsRowFeed); if (header->cupsRowStep != expected->cupsRowStep) printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep, expected->cupsRowStep); if (header->cupsNumColors != expected->cupsNumColors) printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors, expected->cupsNumColors); if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001) printf(" cupsBorderlessScalingFactor %g, expected %g\n", header->cupsBorderlessScalingFactor, expected->cupsBorderlessScalingFactor); if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 || fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001) printf(" cupsPageSize [%g %g], expected [%g %g]\n", header->cupsPageSize[0], header->cupsPageSize[1], expected->cupsPageSize[0], expected->cupsPageSize[1]); if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 || fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 || fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 || fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001) printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n", header->cupsImagingBBox[0], header->cupsImagingBBox[1], header->cupsImagingBBox[2], header->cupsImagingBBox[3], expected->cupsImagingBBox[0], expected->cupsImagingBBox[1], expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]); for (i = 0; i < 16; i ++) if (header->cupsInteger[i] != expected->cupsInteger[i]) printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i], expected->cupsInteger[i]); for (i = 0; i < 16; i ++) if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001) printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i], expected->cupsReal[i]); for (i = 0; i < 16; i ++) if (strcmp(header->cupsString[i], expected->cupsString[i])) printf(" cupsString%d (%s), expected (%s)\n", i, header->cupsString[i], expected->cupsString[i]); if (strcmp(header->cupsMarkerType, expected->cupsMarkerType)) printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType, expected->cupsMarkerType); if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent)) printf(" cupsRenderingIntent (%s), expected (%s)\n", header->cupsRenderingIntent, expected->cupsRenderingIntent); if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName)) printf(" cupsPageSizeName (%s), expected (%s)\n", header->cupsPageSizeName, expected->cupsPageSizeName); } cups-2.3.1/cups/api-filter.header000664 000765 000024 00000002150 13574721672 016755 0ustar00mikestaff000000 000000

Filter and Backend Programming

Headers cups/backend.h
cups/ppd.h
cups/sidechannel.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS API
Programming: PPD API
Programming: Raster API
Programming: Developing PostScript Printer Drivers
Programming: Developing Raster Printer Drivers
Specifications: CUPS Design Description
cups-2.3.1/cups/util.c000664 000765 000024 00000065012 13574721672 014676 0ustar00mikestaff000000 000000 /* * Printing utilities for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ /* * 'cupsCancelJob()' - Cancel a print job on the default server. * * Pass @code CUPS_JOBID_ALL@ to cancel all jobs or @code CUPS_JOBID_CURRENT@ * to cancel the current job on the named destination. * * Use the @link cupsLastError@ and @link cupsLastErrorString@ functions to get * the cause of any failure. * * @exclude all@ */ int /* O - 1 on success, 0 on failure */ cupsCancelJob(const char *name, /* I - Name of printer or class */ int job_id) /* I - Job ID, @code CUPS_JOBID_CURRENT@ for the current job, or @code CUPS_JOBID_ALL@ for all jobs */ { return (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) < IPP_STATUS_REDIRECTION_OTHER_SITE); } /* * 'cupsCancelJob2()' - Cancel or purge a print job. * * Canceled jobs remain in the job history while purged jobs are removed * from the job history. * * Pass @code CUPS_JOBID_ALL@ to cancel all jobs or @code CUPS_JOBID_CURRENT@ * to cancel the current job on the named destination. * * Use the @link cupsLastError@ and @link cupsLastErrorString@ functions to get * the cause of any failure. * * @since CUPS 1.4/macOS 10.6@ @exclude all@ */ ipp_status_t /* O - IPP status */ cupsCancelJob2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Name of printer or class */ int job_id, /* I - Job ID, @code CUPS_JOBID_CURRENT@ for the current job, or @code CUPS_JOBID_ALL@ for all jobs */ int purge) /* I - 1 to purge, 0 to cancel */ { char uri[HTTP_MAX_URI]; /* Job/printer URI */ ipp_t *request; /* IPP request */ /* * Range check input... */ if (job_id < -1 || (!name && job_id == 0)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Connect to the default server as needed... */ if (!http) if ((http = _cupsConnect()) == NULL) return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE); /* * Build an IPP_CANCEL_JOB or IPP_PURGE_JOBS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * job-uri or printer-uri + job-id * requesting-user-name * [purge-job] or [purge-jobs] */ request = ippNewRequest(job_id < 0 ? IPP_OP_PURGE_JOBS : IPP_OP_CANCEL_JOB); if (name) { httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", ippPort(), "/printers/%s", name); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); } else if (job_id > 0) { snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); } ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (purge && job_id >= 0) ippAddBoolean(request, IPP_TAG_OPERATION, "purge-job", 1); else if (!purge && job_id < 0) ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", 0); /* * Do the request... */ ippDelete(cupsDoRequest(http, request, "/jobs/")); return (cupsLastError()); } /* * 'cupsCreateJob()' - Create an empty job for streaming. * * Use this function when you want to stream print data using the * @link cupsStartDocument@, @link cupsWriteRequestData@, and * @link cupsFinishDocument@ functions. If you have one or more files to * print, use the @link cupsPrintFile2@ or @link cupsPrintFiles2@ function * instead. * * @since CUPS 1.4/macOS 10.6@ @exclude all@ */ int /* O - Job ID or 0 on error */ cupsCreateJob( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Destination name */ const char *title, /* I - Title of job */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { int job_id = 0; /* job-id value */ ipp_status_t status; /* Create-Job status */ cups_dest_t *dest; /* Destination */ cups_dinfo_t *info; /* Destination information */ DEBUG_printf(("cupsCreateJob(http=%p, name=\"%s\", title=\"%s\", num_options=%d, options=%p)", (void *)http, name, title, num_options, (void *)options)); /* * Range check input... */ if (!name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Lookup the destination... */ if ((dest = cupsGetNamedDest(http, name, NULL)) == NULL) { DEBUG_puts("1cupsCreateJob: Destination not found."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); return (0); } /* * Query dest information and create the job... */ DEBUG_puts("1cupsCreateJob: Querying destination info."); if ((info = cupsCopyDestInfo(http, dest)) == NULL) { DEBUG_puts("1cupsCreateJob: Query failed."); cupsFreeDests(1, dest); return (0); } status = cupsCreateDestJob(http, dest, info, &job_id, title, num_options, options); DEBUG_printf(("1cupsCreateJob: cupsCreateDestJob returned %04x (%s)", status, ippErrorString(status))); cupsFreeDestInfo(info); cupsFreeDests(1, dest); /* * Return the job... */ if (status >= IPP_STATUS_REDIRECTION_OTHER_SITE) return (0); else return (job_id); } /* * 'cupsFinishDocument()' - Finish sending a document. * * The document must have been started using @link cupsStartDocument@. * * @since CUPS 1.4/macOS 10.6@ @exclude all@ */ ipp_status_t /* O - Status of document submission */ cupsFinishDocument(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name) /* I - Destination name */ { char resource[1024]; /* Printer resource */ snprintf(resource, sizeof(resource), "/printers/%s", name); ippDelete(cupsGetResponse(http, resource)); return (cupsLastError()); } /* * 'cupsFreeJobs()' - Free memory used by job data. */ void cupsFreeJobs(int num_jobs, /* I - Number of jobs */ cups_job_t *jobs) /* I - Jobs */ { int i; /* Looping var */ cups_job_t *job; /* Current job */ if (num_jobs <= 0 || !jobs) return; for (i = num_jobs, job = jobs; i > 0; i --, job ++) { _cupsStrFree(job->dest); _cupsStrFree(job->user); _cupsStrFree(job->format); _cupsStrFree(job->title); } free(jobs); } /* * 'cupsGetClasses()' - Get a list of printer classes from the default server. * * This function is deprecated and no longer returns a list of printer * classes - use @link cupsGetDests@ instead. * * @deprecated@ @exclude all@ */ int /* O - Number of classes */ cupsGetClasses(char ***classes) /* O - Classes */ { if (classes) *classes = NULL; return (0); } /* * 'cupsGetDefault()' - Get the default printer or class for the default server. * * This function returns the default printer or class as defined by * the LPDEST or PRINTER environment variables. If these environment * variables are not set, the server default destination is returned. * Applications should use the @link cupsGetDests@ and @link cupsGetDest@ * functions to get the user-defined default printer, as this function does * not support the lpoptions-defined default printer. * * @exclude all@ */ const char * /* O - Default printer or @code NULL@ */ cupsGetDefault(void) { /* * Return the default printer... */ return (cupsGetDefault2(CUPS_HTTP_DEFAULT)); } /* * 'cupsGetDefault2()' - Get the default printer or class for the specified server. * * This function returns the default printer or class as defined by * the LPDEST or PRINTER environment variables. If these environment * variables are not set, the server default destination is returned. * Applications should use the @link cupsGetDests@ and @link cupsGetDest@ * functions to get the user-defined default printer, as this function does * not support the lpoptions-defined default printer. * * @since CUPS 1.1.21/macOS 10.4@ @exclude all@ */ const char * /* O - Default printer or @code NULL@ */ cupsGetDefault2(http_t *http) /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ { ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if we have a user default printer set... */ if (_cupsUserDefault(cg->def_printer, sizeof(cg->def_printer))) return (cg->def_printer); /* * Connect to the server as needed... */ if (!http) if ((http = _cupsConnect()) == NULL) return (NULL); /* * Build a CUPS_GET_DEFAULT request, which requires the following * attributes: * * attributes-charset * attributes-natural-language */ request = ippNewRequest(IPP_OP_CUPS_GET_DEFAULT); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL) { strlcpy(cg->def_printer, attr->values[0].string.text, sizeof(cg->def_printer)); ippDelete(response); return (cg->def_printer); } ippDelete(response); } return (NULL); } /* * 'cupsGetJobs()' - Get the jobs from the default server. * * A "whichjobs" value of @code CUPS_WHICHJOBS_ALL@ returns all jobs regardless * of state, while @code CUPS_WHICHJOBS_ACTIVE@ returns jobs that are * pending, processing, or held and @code CUPS_WHICHJOBS_COMPLETED@ returns * jobs that are stopped, canceled, aborted, or completed. * * @exclude all@ */ int /* O - Number of jobs */ cupsGetJobs(cups_job_t **jobs, /* O - Job data */ const char *name, /* I - @code NULL@ = all destinations, otherwise show jobs for named destination */ int myjobs, /* I - 0 = all users, 1 = mine */ int whichjobs) /* I - @code CUPS_WHICHJOBS_ALL@, @code CUPS_WHICHJOBS_ACTIVE@, or @code CUPS_WHICHJOBS_COMPLETED@ */ { /* * Return the jobs... */ return (cupsGetJobs2(CUPS_HTTP_DEFAULT, jobs, name, myjobs, whichjobs)); } /* * 'cupsGetJobs2()' - Get the jobs from the specified server. * * A "whichjobs" value of @code CUPS_WHICHJOBS_ALL@ returns all jobs regardless * of state, while @code CUPS_WHICHJOBS_ACTIVE@ returns jobs that are * pending, processing, or held and @code CUPS_WHICHJOBS_COMPLETED@ returns * jobs that are stopped, canceled, aborted, or completed. * * @since CUPS 1.1.21/macOS 10.4@ */ int /* O - Number of jobs */ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ cups_job_t **jobs, /* O - Job data */ const char *name, /* I - @code NULL@ = all destinations, otherwise show jobs for named destination */ int myjobs, /* I - 0 = all users, 1 = mine */ int whichjobs) /* I - @code CUPS_WHICHJOBS_ALL@, @code CUPS_WHICHJOBS_ACTIVE@, or @code CUPS_WHICHJOBS_COMPLETED@ */ { int n; /* Number of jobs */ ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ cups_job_t *temp; /* Temporary pointer */ int id, /* job-id */ priority, /* job-priority */ size; /* job-k-octets */ ipp_jstate_t state; /* job-state */ time_t completed_time, /* time-at-completed */ creation_time, /* time-at-creation */ processing_time; /* time-at-processing */ const char *dest, /* job-printer-uri */ *format, /* document-format */ *title, /* job-name */ *user; /* job-originating-user-name */ char uri[HTTP_MAX_URI]; /* URI for jobs */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ static const char * const attrs[] = /* Requested attributes */ { "document-format", "job-id", "job-k-octets", "job-name", "job-originating-user-name", "job-printer-uri", "job-priority", "job-state", "time-at-completed", "time-at-creation", "time-at-processing" }; /* * Range check input... */ if (!jobs) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (-1); } /* * Get the right URI... */ if (name) { if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", name) < HTTP_URI_STATUS_OK) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create printer-uri"), 1); return (-1); } } else strlcpy(uri, "ipp://localhost/", sizeof(uri)); if (!http) if ((http = _cupsConnect()) == NULL) return (-1); /* * Build an IPP_GET_JOBS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * requesting-user-name * which-jobs * my-jobs * requested-attributes */ request = ippNewRequest(IPP_OP_GET_JOBS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (myjobs) ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); if (whichjobs == CUPS_WHICHJOBS_COMPLETED) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", NULL, "completed"); else if (whichjobs == CUPS_WHICHJOBS_ALL) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", NULL, "all"); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(attrs) / sizeof(attrs[0]), NULL, attrs); /* * Do the request and get back a response... */ n = 0; *jobs = NULL; if ((response = cupsDoRequest(http, request, "/")) != NULL) { for (attr = response->attrs; attr; attr = attr->next) { /* * Skip leading attributes until we hit a job... */ while (attr && attr->group_tag != IPP_TAG_JOB) attr = attr->next; if (!attr) break; /* * Pull the needed attributes from this job... */ id = 0; size = 0; priority = 50; state = IPP_JSTATE_PENDING; user = "unknown"; dest = NULL; format = "application/octet-stream"; title = "untitled"; creation_time = 0; completed_time = 0; processing_time = 0; while (attr && attr->group_tag == IPP_TAG_JOB) { if (!strcmp(attr->name, "job-id") && attr->value_tag == IPP_TAG_INTEGER) id = attr->values[0].integer; else if (!strcmp(attr->name, "job-state") && attr->value_tag == IPP_TAG_ENUM) state = (ipp_jstate_t)attr->values[0].integer; else if (!strcmp(attr->name, "job-priority") && attr->value_tag == IPP_TAG_INTEGER) priority = attr->values[0].integer; else if (!strcmp(attr->name, "job-k-octets") && attr->value_tag == IPP_TAG_INTEGER) size = attr->values[0].integer; else if (!strcmp(attr->name, "time-at-completed") && attr->value_tag == IPP_TAG_INTEGER) completed_time = attr->values[0].integer; else if (!strcmp(attr->name, "time-at-creation") && attr->value_tag == IPP_TAG_INTEGER) creation_time = attr->values[0].integer; else if (!strcmp(attr->name, "time-at-processing") && attr->value_tag == IPP_TAG_INTEGER) processing_time = attr->values[0].integer; else if (!strcmp(attr->name, "job-printer-uri") && attr->value_tag == IPP_TAG_URI) { if ((dest = strrchr(attr->values[0].string.text, '/')) != NULL) dest ++; } else if (!strcmp(attr->name, "job-originating-user-name") && attr->value_tag == IPP_TAG_NAME) user = attr->values[0].string.text; else if (!strcmp(attr->name, "document-format") && attr->value_tag == IPP_TAG_MIMETYPE) format = attr->values[0].string.text; else if (!strcmp(attr->name, "job-name") && (attr->value_tag == IPP_TAG_TEXT || attr->value_tag == IPP_TAG_NAME)) title = attr->values[0].string.text; attr = attr->next; } /* * See if we have everything needed... */ if (!dest || !id) { if (!attr) break; else continue; } /* * Allocate memory for the job... */ if (n == 0) temp = malloc(sizeof(cups_job_t)); else temp = realloc(*jobs, sizeof(cups_job_t) * (size_t)(n + 1)); if (!temp) { /* * Ran out of memory! */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); cupsFreeJobs(n, *jobs); *jobs = NULL; ippDelete(response); return (-1); } *jobs = temp; temp += n; n ++; /* * Copy the data over... */ temp->dest = _cupsStrAlloc(dest); temp->user = _cupsStrAlloc(user); temp->format = _cupsStrAlloc(format); temp->title = _cupsStrAlloc(title); temp->id = id; temp->priority = priority; temp->state = state; temp->size = size; temp->completed_time = completed_time; temp->creation_time = creation_time; temp->processing_time = processing_time; if (!attr) break; } ippDelete(response); } if (n == 0 && cg->last_error >= IPP_STATUS_ERROR_BAD_REQUEST) return (-1); else return (n); } /* * 'cupsGetPrinters()' - Get a list of printers from the default server. * * This function is deprecated and no longer returns a list of printers - use * @link cupsGetDests@ instead. * * @deprecated@ @exclude all@ */ int /* O - Number of printers */ cupsGetPrinters(char ***printers) /* O - Printers */ { if (printers) *printers = NULL; return (0); } /* * 'cupsPrintFile()' - Print a file to a printer or class on the default server. * * @exclude all@ */ int /* O - Job ID or 0 on error */ cupsPrintFile(const char *name, /* I - Destination name */ const char *filename, /* I - File to print */ const char *title, /* I - Title of job */ int num_options,/* I - Number of options */ cups_option_t *options) /* I - Options */ { DEBUG_printf(("cupsPrintFile(name=\"%s\", filename=\"%s\", title=\"%s\", num_options=%d, options=%p)", name, filename, title, num_options, (void *)options)); return (cupsPrintFiles2(CUPS_HTTP_DEFAULT, name, 1, &filename, title, num_options, options)); } /* * 'cupsPrintFile2()' - Print a file to a printer or class on the specified * server. * * @since CUPS 1.1.21/macOS 10.4@ @exclude all@ */ int /* O - Job ID or 0 on error */ cupsPrintFile2( http_t *http, /* I - Connection to server */ const char *name, /* I - Destination name */ const char *filename, /* I - File to print */ const char *title, /* I - Title of job */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { DEBUG_printf(("cupsPrintFile2(http=%p, name=\"%s\", filename=\"%s\", title=\"%s\", num_options=%d, options=%p)", (void *)http, name, filename, title, num_options, (void *)options)); return (cupsPrintFiles2(http, name, 1, &filename, title, num_options, options)); } /* * 'cupsPrintFiles()' - Print one or more files to a printer or class on the * default server. * * @exclude all@ */ int /* O - Job ID or 0 on error */ cupsPrintFiles( const char *name, /* I - Destination name */ int num_files, /* I - Number of files */ const char **files, /* I - File(s) to print */ const char *title, /* I - Title of job */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { DEBUG_printf(("cupsPrintFiles(name=\"%s\", num_files=%d, files=%p, title=\"%s\", num_options=%d, options=%p)", name, num_files, (void *)files, title, num_options, (void *)options)); /* * Print the file(s)... */ return (cupsPrintFiles2(CUPS_HTTP_DEFAULT, name, num_files, files, title, num_options, options)); } /* * 'cupsPrintFiles2()' - Print one or more files to a printer or class on the * specified server. * * @since CUPS 1.1.21/macOS 10.4@ @exclude all@ */ int /* O - Job ID or 0 on error */ cupsPrintFiles2( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Destination name */ int num_files, /* I - Number of files */ const char **files, /* I - File(s) to print */ const char *title, /* I - Title of job */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { int i; /* Looping var */ int job_id; /* New job ID */ const char *docname; /* Basename of current filename */ const char *format; /* Document format */ cups_file_t *fp; /* Current file */ char buffer[8192]; /* Copy buffer */ ssize_t bytes; /* Bytes in buffer */ http_status_t status; /* Status of write */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ ipp_status_t cancel_status; /* Status code to preserve */ char *cancel_message; /* Error message to preserve */ DEBUG_printf(("cupsPrintFiles2(http=%p, name=\"%s\", num_files=%d, files=%p, title=\"%s\", num_options=%d, options=%p)", (void *)http, name, num_files, (void *)files, title, num_options, (void *)options)); /* * Range check input... */ if (!name || num_files < 1 || !files) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Create the print job... */ if ((job_id = cupsCreateJob(http, name, title, num_options, options)) == 0) return (0); /* * Send each of the files... */ if (cupsGetOption("raw", num_options, options)) format = CUPS_FORMAT_RAW; else if ((format = cupsGetOption("document-format", num_options, options)) == NULL) format = CUPS_FORMAT_AUTO; for (i = 0; i < num_files; i ++) { /* * Start the next file... */ if ((docname = strrchr(files[i], '/')) != NULL) docname ++; else docname = files[i]; if ((fp = cupsFileOpen(files[i], "rb")) == NULL) { /* * Unable to open print file, cancel the job and return... */ _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_ACCESS, NULL, 0); goto cancel_job; } status = cupsStartDocument(http, name, job_id, docname, format, i == (num_files - 1)); while (status == HTTP_STATUS_CONTINUE && (bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) status = cupsWriteRequestData(http, buffer, (size_t)bytes); cupsFileClose(fp); if (status != HTTP_STATUS_CONTINUE || cupsFinishDocument(http, name) != IPP_STATUS_OK) { /* * Unable to queue, cancel the job and return... */ goto cancel_job; } } return (job_id); /* * If we get here, something happened while sending the print job so we need * to cancel the job without setting the last error (since we need to preserve * the current error... */ cancel_job: cancel_status = cg->last_error; cancel_message = cg->last_status_message ? _cupsStrRetain(cg->last_status_message) : NULL; cupsCancelJob2(http, name, job_id, 0); cg->last_error = cancel_status; cg->last_status_message = cancel_message; return (0); } /* * 'cupsStartDocument()' - Add a document to a job created with cupsCreateJob(). * * Use @link cupsWriteRequestData@ to write data for the document and * @link cupsFinishDocument@ to finish the document and get the submission status. * * The MIME type constants @code CUPS_FORMAT_AUTO@, @code CUPS_FORMAT_PDF@, * @code CUPS_FORMAT_POSTSCRIPT@, @code CUPS_FORMAT_RAW@, and * @code CUPS_FORMAT_TEXT@ are provided for the "format" argument, although * any supported MIME type string can be supplied. * * @since CUPS 1.4/macOS 10.6@ @exclude all@ */ http_status_t /* O - HTTP status of request */ cupsStartDocument( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Destination name */ int job_id, /* I - Job ID from @link cupsCreateJob@ */ const char *docname, /* I - Name of document */ const char *format, /* I - MIME type or @code CUPS_FORMAT_foo@ */ int last_document) /* I - 1 for last document in job, 0 otherwise */ { char resource[1024], /* Resource for destinatio */ printer_uri[1024]; /* Printer URI */ ipp_t *request; /* Send-Document request */ http_status_t status; /* HTTP status */ /* * Create a Send-Document request... */ if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0); return (HTTP_STATUS_ERROR); } httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", NULL, "localhost", ippPort(), "/printers/%s", name); snprintf(resource, sizeof(resource), "/printers/%s", name); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer_uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (docname) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "document-name", NULL, docname); if (format) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format); ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last_document); /* * Send and delete the request, then return the status... */ status = cupsSendRequest(http, request, resource, CUPS_LENGTH_VARIABLE); ippDelete(request); return (status); } cups-2.3.1/cups/adminutil.c000664 000765 000024 00000117151 13574721672 015711 0ustar00mikestaff000000 000000 /* * Administration utility API definitions for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 2001-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include "ppd.h" #include "adminutil.h" #include #include #ifndef _WIN32 # include # include #endif /* !_WIN32 */ /* * Local functions... */ static http_status_t get_cupsd_conf(http_t *http, _cups_globals_t *cg, time_t last_update, char *name, size_t namelen, int *remote); static void invalidate_cupsd_cache(_cups_globals_t *cg); /* * 'cupsAdminCreateWindowsPPD()' - Create the Windows PPD file for a printer. * * @deprecated@ */ char * /* O - PPD file or NULL */ cupsAdminCreateWindowsPPD( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *dest, /* I - Printer or class */ char *buffer, /* I - Filename buffer */ int bufsize) /* I - Size of filename buffer */ { (void)http; (void)dest; (void)bufsize; if (buffer) *buffer = '\0'; return (NULL); } /* * 'cupsAdminExportSamba()' - Export a printer to Samba. * * @deprecated@ */ int /* O - 1 on success, 0 on failure */ cupsAdminExportSamba( const char *dest, /* I - Destination to export */ const char *ppd, /* I - PPD file */ const char *samba_server, /* I - Samba server */ const char *samba_user, /* I - Samba username */ const char *samba_password, /* I - Samba password */ FILE *logfile) /* I - Log file, if any */ { (void)dest; (void)ppd; (void)samba_server; (void)samba_user; (void)samba_password; (void)logfile; return (0); } /* * 'cupsAdminGetServerSettings()' - Get settings from the server. * * The returned settings should be freed with cupsFreeOptions() when * you are done with them. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - 1 on success, 0 on failure */ cupsAdminGetServerSettings( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int *num_settings, /* O - Number of settings */ cups_option_t **settings) /* O - Settings */ { int i; /* Looping var */ cups_file_t *cupsd; /* cupsd.conf file */ char cupsdconf[1024]; /* cupsd.conf filename */ int remote; /* Remote cupsd.conf file? */ http_status_t status; /* Status of getting cupsd.conf */ char line[1024], /* Line from cupsd.conf file */ *value; /* Value on line */ cups_option_t *setting; /* Current setting */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (!http) { /* * See if we are connected to the same server... */ if (cg->http) { /* * Compare the connection hostname, port, and encryption settings to * the cached defaults; these were initialized the first time we * connected... */ if (strcmp(cg->http->hostname, cg->server) || cg->ipp_port != httpAddrPort(cg->http->hostaddr) || (cg->http->encryption != cg->encryption && cg->http->encryption == HTTP_ENCRYPTION_NEVER)) { /* * Need to close the current connection because something has changed... */ httpClose(cg->http); cg->http = NULL; } } /* * (Re)connect as needed... */ if (!cg->http) { if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 0, NULL)) == NULL) { if (errno) _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0); else _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, _("Unable to connect to host."), 1); if (num_settings) *num_settings = 0; if (settings) *settings = NULL; return (0); } } http = cg->http; } if (!http || !num_settings || !settings) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); if (num_settings) *num_settings = 0; if (settings) *settings = NULL; return (0); } *num_settings = 0; *settings = NULL; /* * Get the cupsd.conf file... */ if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf, sizeof(cupsdconf), &remote)) == HTTP_STATUS_OK) { if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) { char message[1024]; /* Message string */ snprintf(message, sizeof(message), _cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")), cupsdconf, strerror(errno)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); } } else cupsd = NULL; if (cupsd) { /* * Read the file, keeping track of what settings are enabled... */ int remote_access = 0, /* Remote access allowed? */ remote_admin = 0, /* Remote administration allowed? */ remote_any = 0, /* Remote access from anywhere allowed? */ browsing = 1, /* Browsing enabled? */ cancel_policy = 1, /* Cancel-job policy set? */ debug_logging = 0; /* LogLevel debug set? */ int linenum = 0, /* Line number in file */ in_location = 0, /* In a location section? */ in_policy = 0, /* In a policy section? */ in_cancel_job = 0, /* In a cancel-job section? */ in_admin_location = 0; /* In the /admin location? */ invalidate_cupsd_cache(cg); cg->cupsd_update = time(NULL); httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname)); while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) { if (!value && strncmp(line, "")) { in_policy = 0; } else if (!_cups_strcasecmp(line, "")) { in_cancel_job = 0; } else if (!_cups_strcasecmp(line, "Require") && in_cancel_job) { cancel_policy = 0; } else if (!_cups_strcasecmp(line, "")) { in_admin_location = 0; in_location = 0; } else if (!_cups_strcasecmp(line, "Allow") && value && _cups_strcasecmp(value, "localhost") && _cups_strcasecmp(value, "127.0.0.1") #ifdef AF_LOCAL && *value != '/' #endif /* AF_LOCAL */ #ifdef AF_INET6 && strcmp(value, "::1") #endif /* AF_INET6 */ ) { if (in_admin_location) remote_admin = 1; else if (!_cups_strcasecmp(value, "all")) remote_any = 1; } else if (line[0] != '<' && !in_location && !in_policy && _cups_strcasecmp(line, "Allow") && _cups_strcasecmp(line, "AuthType") && _cups_strcasecmp(line, "Deny") && _cups_strcasecmp(line, "Order") && _cups_strcasecmp(line, "Require") && _cups_strcasecmp(line, "Satisfy")) cg->cupsd_num_settings = cupsAddOption(line, value, cg->cupsd_num_settings, &(cg->cupsd_settings)); } cupsFileClose(cupsd); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, debug_logging ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, (remote_access && remote_admin) ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, remote_any ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, (remote_access && browsing) ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, cancel_policy ? "1" : "0", cg->cupsd_num_settings, &(cg->cupsd_settings)); } else if (status != HTTP_STATUS_NOT_MODIFIED) invalidate_cupsd_cache(cg); /* * Remove any temporary files and copy the settings array... */ if (remote) unlink(cupsdconf); for (i = cg->cupsd_num_settings, setting = cg->cupsd_settings; i > 0; i --, setting ++) *num_settings = cupsAddOption(setting->name, setting->value, *num_settings, settings); return (cg->cupsd_num_settings > 0); } /* * 'cupsAdminSetServerSettings()' - Set settings on the server. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - 1 on success, 0 on failure */ cupsAdminSetServerSettings( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int num_settings, /* I - Number of settings */ cups_option_t *settings) /* I - Settings */ { int i; /* Looping var */ http_status_t status; /* GET/PUT status */ const char *server_port_env; /* SERVER_PORT env var */ int server_port; /* IPP port for server */ cups_file_t *cupsd; /* cupsd.conf file */ char cupsdconf[1024]; /* cupsd.conf filename */ int remote; /* Remote cupsd.conf file? */ char tempfile[1024]; /* Temporary new cupsd.conf */ cups_file_t *temp; /* Temporary file */ char line[1024], /* Line from cupsd.conf file */ *value; /* Value on line */ int linenum, /* Line number in file */ in_location, /* In a location section? */ in_policy, /* In a policy section? */ in_default_policy, /* In the default policy section? */ in_cancel_job, /* In a cancel-job section? */ in_admin_location, /* In the /admin location? */ in_conf_location, /* In the /admin/conf location? */ in_log_location, /* In the /admin/log location? */ in_root_location; /* In the / location? */ const char *val; /* Setting value */ int share_printers, /* Share local printers */ remote_admin, /* Remote administration allowed? */ remote_any, /* Remote access from anywhere? */ user_cancel_any, /* Cancel-job policy set? */ debug_logging; /* LogLevel debug set? */ int wrote_port_listen, /* Wrote the port/listen lines? */ wrote_browsing, /* Wrote the browsing lines? */ wrote_policy, /* Wrote the policy? */ wrote_loglevel, /* Wrote the LogLevel line? */ wrote_admin_location, /* Wrote the /admin location? */ wrote_conf_location, /* Wrote the /admin/conf location? */ wrote_log_location, /* Wrote the /admin/log location? */ wrote_root_location; /* Wrote the / location? */ int indent; /* Indentation */ int cupsd_num_settings; /* New number of settings */ int old_share_printers, /* Share local printers */ old_remote_admin, /* Remote administration allowed? */ old_remote_any, /* Remote access from anywhere? */ old_user_cancel_any, /* Cancel-job policy set? */ old_debug_logging; /* LogLevel debug set? */ cups_option_t *cupsd_settings, /* New settings */ *setting; /* Current setting */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (!http) http = _cupsConnect(); if (!http || !num_settings || !settings) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Get the cupsd.conf file... */ if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf), &remote) == HTTP_STATUS_OK) { if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (0); } } else return (0); /* * Get current settings... */ if (!cupsAdminGetServerSettings(http, &cupsd_num_settings, &cupsd_settings)) return (0); if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, cupsd_num_settings, cupsd_settings)) != NULL) old_debug_logging = atoi(val); else old_debug_logging = 0; DEBUG_printf(("1cupsAdminSetServerSettings: old debug_logging=%d", old_debug_logging)); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, cupsd_num_settings, cupsd_settings)) != NULL) old_remote_admin = atoi(val); else old_remote_admin = 0; DEBUG_printf(("1cupsAdminSetServerSettings: old remote_admin=%d", old_remote_admin)); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, cupsd_num_settings, cupsd_settings)) != NULL) old_remote_any = atoi(val); else old_remote_any = 0; DEBUG_printf(("1cupsAdminSetServerSettings: old remote_any=%d", old_remote_any)); if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, cupsd_num_settings, cupsd_settings)) != NULL) old_share_printers = atoi(val); else old_share_printers = 0; DEBUG_printf(("1cupsAdminSetServerSettings: old share_printers=%d", old_share_printers)); if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, cupsd_num_settings, cupsd_settings)) != NULL) old_user_cancel_any = atoi(val); else old_user_cancel_any = 0; DEBUG_printf(("1cupsAdminSetServerSettings: old user_cancel_any=%d", old_user_cancel_any)); cupsFreeOptions(cupsd_num_settings, cupsd_settings); /* * Get basic settings... */ if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, settings)) != NULL) { debug_logging = atoi(val); if (debug_logging == old_debug_logging) { /* * No change to this setting... */ debug_logging = -1; } } else debug_logging = -1; DEBUG_printf(("1cupsAdminSetServerSettings: debug_logging=%d", debug_logging)); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, settings)) != NULL) { remote_any = atoi(val); if (remote_any == old_remote_any) { /* * No change to this setting... */ remote_any = -1; } } else remote_any = -1; DEBUG_printf(("1cupsAdminSetServerSettings: remote_any=%d", remote_any)); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, settings)) != NULL) { remote_admin = atoi(val); if (remote_admin == old_remote_admin) { /* * No change to this setting... */ remote_admin = -1; } } else remote_admin = -1; DEBUG_printf(("1cupsAdminSetServerSettings: remote_admin=%d", remote_admin)); if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, settings)) != NULL) { share_printers = atoi(val); if (share_printers == old_share_printers) { /* * No change to this setting... */ share_printers = -1; } } else share_printers = -1; DEBUG_printf(("1cupsAdminSetServerSettings: share_printers=%d", share_printers)); if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, settings)) != NULL) { user_cancel_any = atoi(val); if (user_cancel_any == old_user_cancel_any) { /* * No change to this setting... */ user_cancel_any = -1; } } else user_cancel_any = -1; DEBUG_printf(("1cupsAdminSetServerSettings: user_cancel_any=%d", user_cancel_any)); /* * Create a temporary file for the new cupsd.conf file... */ if ((temp = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL) { cupsFileClose(cupsd); if (remote) unlink(cupsdconf); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (0); } /* * Copy the old file to the new, making changes along the way... */ cupsd_num_settings = 0; in_admin_location = 0; in_cancel_job = 0; in_conf_location = 0; in_default_policy = 0; in_location = 0; in_log_location = 0; in_policy = 0; in_root_location = 0; linenum = 0; wrote_admin_location = 0; wrote_browsing = 0; wrote_conf_location = 0; wrote_log_location = 0; wrote_loglevel = 0; wrote_policy = 0; wrote_port_listen = 0; wrote_root_location = 0; indent = 0; if ((server_port_env = getenv("SERVER_PORT")) != NULL) { if ((server_port = atoi(server_port_env)) <= 0) server_port = ippPort(); } else server_port = ippPort(); if (server_port <= 0) server_port = IPP_PORT; while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) { if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")) && (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0)) { if (!wrote_port_listen) { wrote_port_listen = 1; if (remote_admin > 0 || remote_any > 0 || share_printers > 0) { cupsFilePuts(temp, "# Allow remote access\n"); cupsFilePrintf(temp, "Port %d\n", server_port); } else { cupsFilePuts(temp, "# Only listen for connections from the local " "machine.\n"); cupsFilePrintf(temp, "Listen localhost:%d\n", server_port); } #ifdef CUPS_DEFAULT_DOMAINSOCKET if ((!value || strcmp(CUPS_DEFAULT_DOMAINSOCKET, value)) && !access(CUPS_DEFAULT_DOMAINSOCKET, 0)) cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n"); #endif /* CUPS_DEFAULT_DOMAINSOCKET */ } else if (value && value[0] == '/' #ifdef CUPS_DEFAULT_DOMAINSOCKET && strcmp(CUPS_DEFAULT_DOMAINSOCKET, value) #endif /* CUPS_DEFAULT_DOMAINSOCKET */ ) cupsFilePrintf(temp, "Listen %s\n", value); } else if ((!_cups_strcasecmp(line, "Browsing") || !_cups_strcasecmp(line, "BrowseLocalProtocols")) && share_printers >= 0) { if (!wrote_browsing) { wrote_browsing = 1; if (share_printers) { const char *localp = cupsGetOption("BrowseLocalProtocols", num_settings, settings); if (!localp || !localp[0]) localp = cupsGetOption("BrowseLocalProtocols", cupsd_num_settings, cupsd_settings); cupsFilePuts(temp, "# Share local printers on the local network.\n"); cupsFilePuts(temp, "Browsing On\n"); if (!localp) localp = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS; cupsFilePrintf(temp, "BrowseLocalProtocols %s\n", localp); cupsd_num_settings = cupsAddOption("BrowseLocalProtocols", localp, cupsd_num_settings, &cupsd_settings); } else { cupsFilePuts(temp, "# Disable printer sharing.\n"); cupsFilePuts(temp, "Browsing Off\n"); } } } else if (!_cups_strcasecmp(line, "LogLevel") && debug_logging >= 0) { wrote_loglevel = 1; if (debug_logging) { cupsFilePuts(temp, "# Show troubleshooting information in error_log.\n"); cupsFilePuts(temp, "LogLevel debug\n"); } else { cupsFilePuts(temp, "# Show general information in error_log.\n"); cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); } } else if (!_cups_strcasecmp(line, "\n", line, value); indent += 2; } else if (!_cups_strcasecmp(line, "")) { indent -= 2; if (!wrote_policy && in_default_policy) { wrote_policy = 1; if (!user_cancel_any) cupsFilePuts(temp, " # Only the owner or an administrator can " "cancel a job...\n" " \n" " Order deny,allow\n" " Require user @OWNER " CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); } in_policy = 0; in_default_policy = 0; cupsFilePuts(temp, "\n"); } else if (!_cups_strcasecmp(line, "\n", line, value); } else if (!_cups_strcasecmp(line, "")) { in_location = 0; indent -= 2; if (in_admin_location && remote_admin >= 0) { wrote_admin_location = 1; if (remote_admin) cupsFilePuts(temp, " # Allow remote administration...\n"); else if (remote_admin == 0) cupsFilePuts(temp, " # Restrict access to the admin pages...\n"); cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); } else if (in_conf_location && remote_admin >= 0) { wrote_conf_location = 1; if (remote_admin) cupsFilePuts(temp, " # Allow remote access to the configuration " "files...\n"); else cupsFilePuts(temp, " # Restrict access to the configuration " "files...\n"); cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); } else if (in_log_location && remote_admin >= 0) { wrote_log_location = 1; if (remote_admin) cupsFilePuts(temp, " # Allow remote access to the log " "files...\n"); else cupsFilePuts(temp, " # Restrict access to the log " "files...\n"); cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); } else if (in_root_location && (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0)) { wrote_root_location = 1; if (remote_admin > 0 && share_printers > 0) cupsFilePuts(temp, " # Allow shared printing and remote " "administration...\n"); else if (remote_admin > 0) cupsFilePuts(temp, " # Allow remote administration...\n"); else if (share_printers > 0) cupsFilePuts(temp, " # Allow shared printing...\n"); else if (remote_any > 0) cupsFilePuts(temp, " # Allow remote access...\n"); else cupsFilePuts(temp, " # Restrict access to the server...\n"); cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin > 0 || remote_any > 0 || share_printers > 0) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); } in_admin_location = 0; in_conf_location = 0; in_log_location = 0; in_root_location = 0; cupsFilePuts(temp, "\n"); } else if (!_cups_strcasecmp(line, "= 0) { /* * Don't write anything for this limit section... */ in_cancel_job = 2; } else { cupsFilePrintf(temp, "%*s%s", indent, "", line); while (*value) { for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++); if (*valptr) *valptr++ = '\0'; if (!_cups_strcasecmp(value, "cancel-job") && user_cancel_any >= 0) { /* * Write everything except for this definition... */ in_cancel_job = 1; } else cupsFilePrintf(temp, " %s", value); for (value = valptr; _cups_isspace(*value); value ++); } cupsFilePuts(temp, ">\n"); } } else cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value); indent += 2; } else if (!_cups_strcasecmp(line, "") && in_cancel_job) { indent -= 2; if (in_cancel_job == 1) cupsFilePuts(temp, " \n"); wrote_policy = 1; if (!user_cancel_any) cupsFilePuts(temp, " # Only the owner or an administrator can cancel " "a job...\n" " \n" " Order deny,allow\n" " Require user @OWNER " CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); in_cancel_job = 0; } else if ((((in_admin_location || in_conf_location || in_root_location || in_log_location) && (remote_admin >= 0 || remote_any >= 0)) || (in_root_location && share_printers >= 0)) && (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny") || !_cups_strcasecmp(line, "Order"))) continue; else if (in_cancel_job == 2) continue; else if (line[0] == '<') { if (value) { cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value); indent += 2; } else { if (line[1] == '/') indent -= 2; cupsFilePrintf(temp, "%*s%s\n", indent, "", line); } } else if (!in_policy && !in_location && (val = cupsGetOption(line, num_settings, settings)) != NULL) { /* * Replace this directive's value with the new one... */ cupsd_num_settings = cupsAddOption(line, val, cupsd_num_settings, &cupsd_settings); /* * Write the new value in its place, without indentation since we * only support setting root directives, not in sections... */ cupsFilePrintf(temp, "%s %s\n", line, val); } else if (value) { if (!in_policy && !in_location) { /* * Record the non-policy, non-location directives that we find * in the server settings, since we cache this info and record it * in cupsAdminGetServerSettings()... */ cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings, &cupsd_settings); } cupsFilePrintf(temp, "%*s%s %s\n", indent, "", line, value); } else cupsFilePrintf(temp, "%*s%s\n", indent, "", line); } /* * Write any missing info... */ if (!wrote_browsing && share_printers >= 0) { if (share_printers > 0) { cupsFilePuts(temp, "# Share local printers on the local network.\n"); cupsFilePuts(temp, "Browsing On\n"); } else { cupsFilePuts(temp, "# Disable printer sharing and shared printers.\n"); cupsFilePuts(temp, "Browsing Off\n"); } } if (!wrote_loglevel && debug_logging >= 0) { if (debug_logging) { cupsFilePuts(temp, "# Show troubleshooting information in error_log.\n"); cupsFilePuts(temp, "LogLevel debug\n"); } else { cupsFilePuts(temp, "# Show general information in error_log.\n"); cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); } } if (!wrote_port_listen && (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0)) { if (remote_admin > 0 || remote_any > 0 || share_printers > 0) { cupsFilePuts(temp, "# Allow remote access\n"); cupsFilePrintf(temp, "Port %d\n", ippPort()); } else { cupsFilePuts(temp, "# Only listen for connections from the local machine.\n"); cupsFilePrintf(temp, "Listen localhost:%d\n", ippPort()); } #ifdef CUPS_DEFAULT_DOMAINSOCKET if (!access(CUPS_DEFAULT_DOMAINSOCKET, 0)) cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n"); #endif /* CUPS_DEFAULT_DOMAINSOCKET */ } if (!wrote_root_location && (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0)) { if (remote_admin > 0 && share_printers > 0) cupsFilePuts(temp, "# Allow shared printing and remote administration...\n"); else if (remote_admin > 0) cupsFilePuts(temp, "# Allow remote administration...\n"); else if (share_printers > 0) cupsFilePuts(temp, "# Allow shared printing...\n"); else if (remote_any > 0) cupsFilePuts(temp, "# Allow remote access...\n"); else cupsFilePuts(temp, "# Restrict access to the server...\n"); cupsFilePuts(temp, "\n" " Order allow,deny\n"); if (remote_admin > 0 || remote_any > 0 || share_printers > 0) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } if (!wrote_admin_location && remote_admin >= 0) { if (remote_admin) cupsFilePuts(temp, "# Allow remote administration...\n"); else cupsFilePuts(temp, "# Restrict access to the admin pages...\n"); cupsFilePuts(temp, "\n" " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } if (!wrote_conf_location && remote_admin >= 0) { if (remote_admin) cupsFilePuts(temp, "# Allow remote access to the configuration files...\n"); else cupsFilePuts(temp, "# Restrict access to the configuration files...\n"); cupsFilePuts(temp, "\n" " AuthType Default\n" " Require user @SYSTEM\n" " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } if (!wrote_log_location && remote_admin >= 0) { if (remote_admin) cupsFilePuts(temp, "# Allow remote access to the log files...\n"); else cupsFilePuts(temp, "# Restrict access to the log files...\n"); cupsFilePuts(temp, "\n" " AuthType Default\n" " Require user @SYSTEM\n" " Order allow,deny\n"); if (remote_admin) cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); cupsFilePuts(temp, "\n"); } if (!wrote_policy && user_cancel_any >= 0) { cupsFilePuts(temp, "\n" " # Job-related operations must be done by the owner " "or an administrator...\n" " \n" " Require user @OWNER @SYSTEM\n" " Order deny,allow\n" " \n" " # All administration operations require an " "administrator to authenticate...\n" " \n" " AuthType Default\n" " Require user @SYSTEM\n" " Order deny,allow\n" "\n"); if (!user_cancel_any) cupsFilePuts(temp, " # Only the owner or an administrator can cancel " "a job...\n" " \n" " Order deny,allow\n" " Require user @OWNER " CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); cupsFilePuts(temp, " \n" " Order deny,allow\n" " \n" "\n"); } for (i = num_settings, setting = settings; i > 0; i --, setting ++) if (setting->name[0] != '_' && _cups_strcasecmp(setting->name, "Listen") && _cups_strcasecmp(setting->name, "Port") && !cupsGetOption(setting->name, cupsd_num_settings, cupsd_settings)) { /* * Add this directive to the list of directives we have written... */ cupsd_num_settings = cupsAddOption(setting->name, setting->value, cupsd_num_settings, &cupsd_settings); /* * Write the new value, without indentation since we only support * setting root directives, not in sections... */ cupsFilePrintf(temp, "%s %s\n", setting->name, setting->value); } cupsFileClose(cupsd); cupsFileClose(temp); /* * Upload the configuration file to the server... */ status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile); if (status == HTTP_STATUS_CREATED) { /* * Updated OK, add the basic settings... */ if (debug_logging >= 0) cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, debug_logging ? "1" : "0", cupsd_num_settings, &cupsd_settings); else cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, old_debug_logging ? "1" : "0", cupsd_num_settings, &cupsd_settings); if (remote_admin >= 0) cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, remote_admin ? "1" : "0", cupsd_num_settings, &cupsd_settings); else cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, old_remote_admin ? "1" : "0", cupsd_num_settings, &cupsd_settings); if (remote_any >= 0) cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, remote_any ? "1" : "0", cupsd_num_settings, &cupsd_settings); else cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, old_remote_any ? "1" : "0", cupsd_num_settings, &cupsd_settings); if (share_printers >= 0) cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, share_printers ? "1" : "0", cupsd_num_settings, &cupsd_settings); else cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, old_share_printers ? "1" : "0", cupsd_num_settings, &cupsd_settings); if (user_cancel_any >= 0) cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, user_cancel_any ? "1" : "0", cupsd_num_settings, &cupsd_settings); else cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, old_user_cancel_any ? "1" : "0", cupsd_num_settings, &cupsd_settings); /* * Save the new values... */ invalidate_cupsd_cache(cg); cg->cupsd_num_settings = cupsd_num_settings; cg->cupsd_settings = cupsd_settings; cg->cupsd_update = time(NULL); httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname)); } else cupsFreeOptions(cupsd_num_settings, cupsd_settings); /* * Remote our temp files and return... */ if (remote) unlink(cupsdconf); unlink(tempfile); return (status == HTTP_STATUS_CREATED); } /* * 'get_cupsd_conf()' - Get the current cupsd.conf file. */ static http_status_t /* O - Status of request */ get_cupsd_conf( http_t *http, /* I - Connection to server */ _cups_globals_t *cg, /* I - Global data */ time_t last_update, /* I - Last update time for file */ char *name, /* I - Filename buffer */ size_t namesize, /* I - Size of filename buffer */ int *remote) /* O - Remote file? */ { int fd; /* Temporary file descriptor */ #ifndef _WIN32 struct stat info; /* cupsd.conf file information */ #endif /* _WIN32 */ http_status_t status; /* Status of getting cupsd.conf */ char host[HTTP_MAX_HOST]; /* Hostname for connection */ /* * See if we already have the data we need... */ httpGetHostname(http, host, sizeof(host)); if (_cups_strcasecmp(cg->cupsd_hostname, host)) invalidate_cupsd_cache(cg); snprintf(name, namesize, "%s/cupsd.conf", cg->cups_serverroot); *remote = 0; #ifndef _WIN32 if (!_cups_strcasecmp(host, "localhost") && !access(name, R_OK)) { /* * Read the local file rather than using HTTP... */ if (stat(name, &info)) { char message[1024]; /* Message string */ snprintf(message, sizeof(message), _cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")), name, strerror(errno)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0); *name = '\0'; return (HTTP_STATUS_SERVER_ERROR); } else if (last_update && info.st_mtime <= last_update) status = HTTP_STATUS_NOT_MODIFIED; else status = HTTP_STATUS_OK; } else #endif /* !_WIN32 */ { /* * Read cupsd.conf via a HTTP GET request... */ if ((fd = cupsTempFd(name, (int)namesize)) < 0) { *name = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); invalidate_cupsd_cache(cg); return (HTTP_STATUS_SERVER_ERROR); } *remote = 1; httpClearFields(http); if (last_update) httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, httpGetDateString(last_update)); status = cupsGetFd(http, "/admin/conf/cupsd.conf", fd); close(fd); if (status != HTTP_STATUS_OK) { unlink(name); *name = '\0'; } } return (status); } /* * 'invalidate_cupsd_cache()' - Invalidate the cached cupsd.conf settings. */ static void invalidate_cupsd_cache( _cups_globals_t *cg) /* I - Global data */ { cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings); cg->cupsd_hostname[0] = '\0'; cg->cupsd_update = 0; cg->cupsd_num_settings = 0; cg->cupsd_settings = NULL; } cups-2.3.1/cups/http-support.c000664 000765 000024 00000205351 13574721672 016414 0ustar00mikestaff000000 000000 /* * HTTP support routines for CUPS. * * 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. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #ifdef HAVE_DNSSD # include # ifdef _WIN32 # include # elif defined(HAVE_POLL) # include # else # include # endif /* _WIN32 */ #elif defined(HAVE_AVAHI) # include # include # include #endif /* HAVE_DNSSD */ /* * Local types... */ typedef struct _http_uribuf_s /* URI buffer */ { #ifdef HAVE_AVAHI AvahiSimplePoll *poll; /* Poll state */ #endif /* HAVE_AVAHI */ char *buffer; /* Pointer to buffer */ size_t bufsize; /* Size of buffer */ int options; /* Options passed to _httpResolveURI */ const char *resource; /* Resource from URI */ const char *uuid; /* UUID from URI */ } _http_uribuf_t; /* * Local globals... */ static const char * const http_days[7] =/* Days of the week */ { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static const char * const http_months[12] = { /* Months of the year */ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static const char * const http_states[] = { /* HTTP state strings */ "HTTP_STATE_ERROR", "HTTP_STATE_WAITING", "HTTP_STATE_OPTIONS", "HTTP_STATE_GET", "HTTP_STATE_GET_SEND", "HTTP_STATE_HEAD", "HTTP_STATE_POST", "HTTP_STATE_POST_RECV", "HTTP_STATE_POST_SEND", "HTTP_STATE_PUT", "HTTP_STATE_PUT_RECV", "HTTP_STATE_DELETE", "HTTP_STATE_TRACE", "HTTP_STATE_CONNECT", "HTTP_STATE_STATUS", "HTTP_STATE_UNKNOWN_METHOD", "HTTP_STATE_UNKNOWN_VERSION" }; /* * Local functions... */ static const char *http_copy_decode(char *dst, const char *src, int dstsize, const char *term, int decode); static char *http_copy_encode(char *dst, const char *src, char *dstend, const char *reserved, const char *term, int encode); #ifdef HAVE_DNSSD static void DNSSD_API http_resolve_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullName, const char *hostTarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context); #endif /* HAVE_DNSSD */ #ifdef HAVE_AVAHI static void http_client_cb(AvahiClient *client, AvahiClientState state, void *simple_poll); static int http_poll_cb(struct pollfd *pollfds, unsigned int num_pollfds, int timeout, void *context); static void http_resolve_cb(AvahiServiceResolver *resolver, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags flags, void *context); #endif /* HAVE_AVAHI */ /* * 'httpAssembleURI()' - Assemble a uniform resource identifier from its * components. * * This function escapes reserved characters in the URI depending on the * value of the "encoding" argument. You should use this function in * place of traditional string functions whenever you need to create a * URI string. * * @since CUPS 1.2/macOS 10.5@ */ http_uri_status_t /* O - URI status */ httpAssembleURI( http_uri_coding_t encoding, /* I - Encoding flags */ char *uri, /* I - URI buffer */ int urilen, /* I - Size of URI buffer */ const char *scheme, /* I - Scheme name */ const char *username, /* I - Username */ const char *host, /* I - Hostname or address */ int port, /* I - Port number */ const char *resource) /* I - Resource */ { char *ptr, /* Pointer into URI buffer */ *end; /* End of URI buffer */ /* * Range check input... */ if (!uri || urilen < 1 || !scheme || port < 0) { if (uri) *uri = '\0'; return (HTTP_URI_STATUS_BAD_ARGUMENTS); } /* * Assemble the URI starting with the scheme... */ end = uri + urilen - 1; ptr = http_copy_encode(uri, scheme, end, NULL, NULL, 0); if (!ptr) goto assemble_overflow; if (!strcmp(scheme, "geo") || !strcmp(scheme, "mailto") || !strcmp(scheme, "tel")) { /* * geo:, mailto:, and tel: only have :, no //... */ if (ptr < end) *ptr++ = ':'; else goto assemble_overflow; } else { /* * Schemes other than geo:, mailto:, and tel: typically have //... */ if ((ptr + 2) < end) { *ptr++ = ':'; *ptr++ = '/'; *ptr++ = '/'; } else goto assemble_overflow; } /* * Next the username and hostname, if any... */ if (host) { const char *hostptr; /* Pointer into hostname */ int have_ipv6; /* Do we have an IPv6 address? */ if (username && *username) { /* * Add username@ first... */ ptr = http_copy_encode(ptr, username, end, "/?#[]@", NULL, encoding & HTTP_URI_CODING_USERNAME); if (!ptr) goto assemble_overflow; if (ptr < end) *ptr++ = '@'; else goto assemble_overflow; } /* * Then add the hostname. Since IPv6 is a particular pain to deal * with, we have several special cases to deal with. If we get * an IPv6 address with brackets around it, assume it is already in * URI format. Since DNS-SD service names can sometimes look like * raw IPv6 addresses, we specifically look for "._tcp" in the name, * too... */ for (hostptr = host, have_ipv6 = strchr(host, ':') && !strstr(host, "._tcp"); *hostptr && have_ipv6; hostptr ++) if (*hostptr != ':' && !isxdigit(*hostptr & 255)) { have_ipv6 = *hostptr == '%'; break; } if (have_ipv6) { /* * We have a raw IPv6 address... */ if (strchr(host, '%') && !(encoding & HTTP_URI_CODING_RFC6874)) { /* * We have a link-local address, add "[v1." prefix... */ if ((ptr + 4) < end) { *ptr++ = '['; *ptr++ = 'v'; *ptr++ = '1'; *ptr++ = '.'; } else goto assemble_overflow; } else { /* * We have a normal (or RFC 6874 link-local) address, add "[" prefix... */ if (ptr < end) *ptr++ = '['; else goto assemble_overflow; } /* * Copy the rest of the IPv6 address, and terminate with "]". */ while (ptr < end && *host) { if (*host == '%') { /* * Convert/encode zone separator */ if (encoding & HTTP_URI_CODING_RFC6874) { if (ptr >= (end - 2)) goto assemble_overflow; *ptr++ = '%'; *ptr++ = '2'; *ptr++ = '5'; } else *ptr++ = '+'; host ++; } else *ptr++ = *host++; } if (*host) goto assemble_overflow; if (ptr < end) *ptr++ = ']'; else goto assemble_overflow; } else { /* * Otherwise, just copy the host string (the extra chars are not in the * "reg-name" ABNF rule; anything <= SP or >= DEL plus % gets automatically * percent-encoded. */ ptr = http_copy_encode(ptr, host, end, "\"#/:<>?@[\\]^`{|}", NULL, encoding & HTTP_URI_CODING_HOSTNAME); if (!ptr) goto assemble_overflow; } /* * Finish things off with the port number... */ if (port > 0) { snprintf(ptr, (size_t)(end - ptr + 1), ":%d", port); ptr += strlen(ptr); if (ptr >= end) goto assemble_overflow; } } /* * Last but not least, add the resource string... */ if (resource) { char *query; /* Pointer to query string */ /* * Copy the resource string up to the query string if present... */ query = strchr(resource, '?'); ptr = http_copy_encode(ptr, resource, end, NULL, "?", encoding & HTTP_URI_CODING_RESOURCE); if (!ptr) goto assemble_overflow; if (query) { /* * Copy query string without encoding... */ ptr = http_copy_encode(ptr, query, end, NULL, NULL, encoding & HTTP_URI_CODING_QUERY); if (!ptr) goto assemble_overflow; } } else if (ptr < end) *ptr++ = '/'; else goto assemble_overflow; /* * Nul-terminate the URI buffer and return with no errors... */ *ptr = '\0'; return (HTTP_URI_STATUS_OK); /* * Clear the URI string and return an overflow error; I don't usually * like goto's, but in this case it makes sense... */ assemble_overflow: *uri = '\0'; return (HTTP_URI_STATUS_OVERFLOW); } /* * 'httpAssembleURIf()' - Assemble a uniform resource identifier from its * components with a formatted resource. * * This function creates a formatted version of the resource string * argument "resourcef" and escapes reserved characters in the URI * depending on the value of the "encoding" argument. You should use * this function in place of traditional string functions whenever * you need to create a URI string. * * @since CUPS 1.2/macOS 10.5@ */ http_uri_status_t /* O - URI status */ httpAssembleURIf( http_uri_coding_t encoding, /* I - Encoding flags */ char *uri, /* I - URI buffer */ int urilen, /* I - Size of URI buffer */ const char *scheme, /* I - Scheme name */ const char *username, /* I - Username */ const char *host, /* I - Hostname or address */ int port, /* I - Port number */ const char *resourcef, /* I - Printf-style resource */ ...) /* I - Additional arguments as needed */ { va_list ap; /* Pointer to additional arguments */ char resource[1024]; /* Formatted resource string */ int bytes; /* Bytes in formatted string */ /* * Range check input... */ if (!uri || urilen < 1 || !scheme || port < 0 || !resourcef) { if (uri) *uri = '\0'; return (HTTP_URI_STATUS_BAD_ARGUMENTS); } /* * Format the resource string and assemble the URI... */ va_start(ap, resourcef); bytes = vsnprintf(resource, sizeof(resource), resourcef, ap); va_end(ap); if ((size_t)bytes >= sizeof(resource)) { *uri = '\0'; return (HTTP_URI_STATUS_OVERFLOW); } else return (httpAssembleURI(encoding, uri, urilen, scheme, username, host, port, resource)); } /* * 'httpAssembleUUID()' - Assemble a name-based UUID URN conforming to RFC 4122. * * This function creates a unique 128-bit identifying number using the server * name, port number, random data, and optionally an object name and/or object * number. The result is formatted as a UUID URN as defined in RFC 4122. * * The buffer needs to be at least 46 bytes in size. * * @since CUPS 1.7/macOS 10.9@ */ char * /* I - UUID string */ httpAssembleUUID(const char *server, /* I - Server name */ int port, /* I - Port number */ const char *name, /* I - Object name or NULL */ int number, /* I - Object number or 0 */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of buffer */ { char data[1024]; /* Source string for MD5 */ unsigned char md5sum[16]; /* MD5 digest/sum */ /* * Build a version 3 UUID conforming to RFC 4122. * * Start with the MD5 sum of the server, port, object name and * number, and some random data on the end. */ snprintf(data, sizeof(data), "%s:%d:%s:%d:%04x:%04x", server, port, name ? name : server, number, (unsigned)CUPS_RAND() & 0xffff, (unsigned)CUPS_RAND() & 0xffff); cupsHashData("md5", (unsigned char *)data, strlen(data), md5sum, sizeof(md5sum)); /* * Generate the UUID from the MD5... */ snprintf(buffer, bufsize, "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" "%02x%02x%02x%02x%02x%02x", md5sum[0], md5sum[1], md5sum[2], md5sum[3], md5sum[4], md5sum[5], (md5sum[6] & 15) | 0x30, md5sum[7], (md5sum[8] & 0x3f) | 0x40, md5sum[9], md5sum[10], md5sum[11], md5sum[12], md5sum[13], md5sum[14], md5sum[15]); return (buffer); } /* * 'httpDecode64()' - Base64-decode a string. * * This function is deprecated. Use the httpDecode64_2() function instead * which provides buffer length arguments. * * @deprecated@ @exclude all@ */ char * /* O - Decoded string */ httpDecode64(char *out, /* I - String to write to */ const char *in) /* I - String to read from */ { int outlen; /* Output buffer length */ /* * Use the old maximum buffer size for binary compatibility... */ outlen = 512; return (httpDecode64_2(out, &outlen, in)); } /* * 'httpDecode64_2()' - Base64-decode a string. * * The caller must initialize "outlen" to the maximum size of the decoded * string before calling @code httpDecode64_2@. On return "outlen" contains the * decoded length of the string. * * @since CUPS 1.1.21/macOS 10.4@ */ char * /* O - Decoded string */ httpDecode64_2(char *out, /* I - String to write to */ int *outlen, /* IO - Size of output string */ const char *in) /* I - String to read from */ { int pos; /* Bit position */ unsigned base64; /* Value of this character */ char *outptr, /* Output pointer */ *outend; /* End of output buffer */ /* * Range check input... */ if (!out || !outlen || *outlen < 1 || !in) return (NULL); if (!*in) { *out = '\0'; *outlen = 0; return (out); } /* * Convert from base-64 to bytes... */ for (outptr = out, outend = out + *outlen - 1, pos = 0; *in != '\0'; in ++) { /* * Decode this character into a number from 0 to 63... */ if (*in >= 'A' && *in <= 'Z') base64 = (unsigned)(*in - 'A'); else if (*in >= 'a' && *in <= 'z') base64 = (unsigned)(*in - 'a' + 26); else if (*in >= '0' && *in <= '9') base64 = (unsigned)(*in - '0' + 52); else if (*in == '+') base64 = 62; else if (*in == '/') base64 = 63; else if (*in == '=') break; else continue; /* * Store the result in the appropriate chars... */ switch (pos) { case 0 : if (outptr < outend) *outptr = (char)(base64 << 2); pos ++; break; case 1 : if (outptr < outend) *outptr++ |= (char)((base64 >> 4) & 3); if (outptr < outend) *outptr = (char)((base64 << 4) & 255); pos ++; break; case 2 : if (outptr < outend) *outptr++ |= (char)((base64 >> 2) & 15); if (outptr < outend) *outptr = (char)((base64 << 6) & 255); pos ++; break; case 3 : if (outptr < outend) *outptr++ |= (char)base64; pos = 0; break; } } *outptr = '\0'; /* * Return the decoded string and size... */ *outlen = (int)(outptr - out); return (out); } /* * 'httpEncode64()' - Base64-encode a string. * * This function is deprecated. Use the httpEncode64_2() function instead * which provides buffer length arguments. * * @deprecated@ @exclude all@ */ char * /* O - Encoded string */ httpEncode64(char *out, /* I - String to write to */ const char *in) /* I - String to read from */ { return (httpEncode64_2(out, 512, in, (int)strlen(in))); } /* * 'httpEncode64_2()' - Base64-encode a string. * * @since CUPS 1.1.21/macOS 10.4@ */ char * /* O - Encoded string */ httpEncode64_2(char *out, /* I - String to write to */ int outlen, /* I - Maximum size of output string */ const char *in, /* I - String to read from */ int inlen) /* I - Size of input string */ { char *outptr, /* Output pointer */ *outend; /* End of output buffer */ static const char base64[] = /* Base64 characters... */ { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" "+/" }; /* * Range check input... */ if (!out || outlen < 1 || !in) return (NULL); /* * Convert bytes to base-64... */ for (outptr = out, outend = out + outlen - 1; inlen > 0; in ++, inlen --) { /* * Encode the up to 3 characters as 4 Base64 numbers... */ if (outptr < outend) *outptr ++ = base64[(in[0] & 255) >> 2]; if (outptr < outend) { if (inlen > 1) *outptr ++ = base64[(((in[0] & 255) << 4) | ((in[1] & 255) >> 4)) & 63]; else *outptr ++ = base64[((in[0] & 255) << 4) & 63]; } in ++; inlen --; if (inlen <= 0) { if (outptr < outend) *outptr ++ = '='; if (outptr < outend) *outptr ++ = '='; break; } if (outptr < outend) { if (inlen > 1) *outptr ++ = base64[(((in[0] & 255) << 2) | ((in[1] & 255) >> 6)) & 63]; else *outptr ++ = base64[((in[0] & 255) << 2) & 63]; } in ++; inlen --; if (inlen <= 0) { if (outptr < outend) *outptr ++ = '='; break; } if (outptr < outend) *outptr ++ = base64[in[0] & 63]; } *outptr = '\0'; /* * Return the encoded string... */ return (out); } /* * 'httpGetDateString()' - Get a formatted date/time string from a time value. * * @deprecated@ @exclude all@ */ const char * /* O - Date/time string */ httpGetDateString(time_t t) /* I - Time in seconds */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ return (httpGetDateString2(t, cg->http_date, sizeof(cg->http_date))); } /* * 'httpGetDateString2()' - Get a formatted date/time string from a time value. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Date/time string */ httpGetDateString2(time_t t, /* I - Time in seconds */ char *s, /* I - String buffer */ int slen) /* I - Size of string buffer */ { struct tm tdate; /* UNIX date/time data */ gmtime_r(&t, &tdate); snprintf(s, (size_t)slen, "%s, %02d %s %d %02d:%02d:%02d GMT", http_days[tdate.tm_wday], tdate.tm_mday, http_months[tdate.tm_mon], tdate.tm_year + 1900, tdate.tm_hour, tdate.tm_min, tdate.tm_sec); return (s); } /* * 'httpGetDateTime()' - Get a time value from a formatted date/time string. */ time_t /* O - Time in seconds */ httpGetDateTime(const char *s) /* I - Date/time string */ { int i; /* Looping var */ char mon[16]; /* Abbreviated month name */ int day, year; /* Day of month and year */ int hour, min, sec; /* Time */ int days; /* Number of days since 1970 */ static const int normal_days[] = /* Days to a month, normal years */ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; static const int leap_days[] = /* Days to a month, leap years */ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; DEBUG_printf(("2httpGetDateTime(s=\"%s\")", s)); /* * Extract the date and time from the formatted string... */ if (sscanf(s, "%*s%d%15s%d%d:%d:%d", &day, mon, &year, &hour, &min, &sec) < 6) return (0); DEBUG_printf(("4httpGetDateTime: day=%d, mon=\"%s\", year=%d, hour=%d, " "min=%d, sec=%d", day, mon, year, hour, min, sec)); /* * Convert the month name to a number from 0 to 11. */ for (i = 0; i < 12; i ++) if (!_cups_strcasecmp(mon, http_months[i])) break; if (i >= 12) return (0); DEBUG_printf(("4httpGetDateTime: i=%d", i)); /* * Now convert the date and time to a UNIX time value in seconds since * 1970. We can't use mktime() since the timezone may not be UTC but * the date/time string *is* UTC. */ if ((year & 3) == 0 && ((year % 100) != 0 || (year % 400) == 0)) days = leap_days[i] + day - 1; else days = normal_days[i] + day - 1; DEBUG_printf(("4httpGetDateTime: days=%d", days)); days += (year - 1970) * 365 + /* 365 days per year (normally) */ ((year - 1) / 4 - 492) - /* + leap days */ ((year - 1) / 100 - 19) + /* - 100 year days */ ((year - 1) / 400 - 4); /* + 400 year days */ DEBUG_printf(("4httpGetDateTime: days=%d\n", days)); return (days * 86400 + hour * 3600 + min * 60 + sec); } /* * 'httpSeparate()' - Separate a Universal Resource Identifier into its * components. * * This function is deprecated; use the httpSeparateURI() function instead. * * @deprecated@ @exclude all@ */ void httpSeparate(const char *uri, /* I - Universal Resource Identifier */ char *scheme, /* O - Scheme [32] (http, https, etc.) */ char *username, /* O - Username [1024] */ char *host, /* O - Hostname [1024] */ int *port, /* O - Port number to use */ char *resource) /* O - Resource/filename [1024] */ { httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, 32, username, HTTP_MAX_URI, host, HTTP_MAX_URI, port, resource, HTTP_MAX_URI); } /* * 'httpSeparate2()' - Separate a Universal Resource Identifier into its * components. * * This function is deprecated; use the httpSeparateURI() function instead. * * @since CUPS 1.1.21/macOS 10.4@ * @deprecated@ @exclude all@ */ void httpSeparate2(const char *uri, /* I - Universal Resource Identifier */ char *scheme, /* O - Scheme (http, https, etc.) */ int schemelen, /* I - Size of scheme buffer */ char *username, /* O - Username */ int usernamelen, /* I - Size of username buffer */ char *host, /* O - Hostname */ int hostlen, /* I - Size of hostname buffer */ int *port, /* O - Port number to use */ char *resource, /* O - Resource/filename */ int resourcelen) /* I - Size of resource buffer */ { httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, schemelen, username, usernamelen, host, hostlen, port, resource, resourcelen); } /* * 'httpSeparateURI()' - Separate a Universal Resource Identifier into its * components. * * @since CUPS 1.2/macOS 10.5@ */ http_uri_status_t /* O - Result of separation */ httpSeparateURI( http_uri_coding_t decoding, /* I - Decoding flags */ const char *uri, /* I - Universal Resource Identifier */ char *scheme, /* O - Scheme (http, https, etc.) */ int schemelen, /* I - Size of scheme buffer */ char *username, /* O - Username */ int usernamelen, /* I - Size of username buffer */ char *host, /* O - Hostname */ int hostlen, /* I - Size of hostname buffer */ int *port, /* O - Port number to use */ char *resource, /* O - Resource/filename */ int resourcelen) /* I - Size of resource buffer */ { char *ptr, /* Pointer into string... */ *end; /* End of string */ const char *sep; /* Separator character */ http_uri_status_t status; /* Result of separation */ /* * Initialize everything to blank... */ if (scheme && schemelen > 0) *scheme = '\0'; if (username && usernamelen > 0) *username = '\0'; if (host && hostlen > 0) *host = '\0'; if (port) *port = 0; if (resource && resourcelen > 0) *resource = '\0'; /* * Range check input... */ if (!uri || !port || !scheme || schemelen <= 0 || !username || usernamelen <= 0 || !host || hostlen <= 0 || !resource || resourcelen <= 0) return (HTTP_URI_STATUS_BAD_ARGUMENTS); if (!*uri) return (HTTP_URI_STATUS_BAD_URI); /* * Grab the scheme portion of the URI... */ status = HTTP_URI_STATUS_OK; if (!strncmp(uri, "//", 2)) { /* * Workaround for HP IPP client bug... */ strlcpy(scheme, "ipp", (size_t)schemelen); status = HTTP_URI_STATUS_MISSING_SCHEME; } else if (*uri == '/') { /* * Filename... */ strlcpy(scheme, "file", (size_t)schemelen); status = HTTP_URI_STATUS_MISSING_SCHEME; } else { /* * Standard URI with scheme... */ for (ptr = scheme, end = scheme + schemelen - 1; *uri && *uri != ':' && ptr < end;) if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789-+.", *uri) != NULL) *ptr++ = *uri++; else break; *ptr = '\0'; if (*uri != ':' || *scheme == '.' || !*scheme) { *scheme = '\0'; return (HTTP_URI_STATUS_BAD_SCHEME); } uri ++; } /* * Set the default port number... */ if (!strcmp(scheme, "http")) *port = 80; else if (!strcmp(scheme, "https")) *port = 443; else if (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) *port = 631; else if (!_cups_strcasecmp(scheme, "lpd")) *port = 515; else if (!strcmp(scheme, "socket")) /* Not yet registered with IANA... */ *port = 9100; else if (strcmp(scheme, "file") && strcmp(scheme, "mailto") && strcmp(scheme, "tel")) status = HTTP_URI_STATUS_UNKNOWN_SCHEME; /* * Now see if we have a hostname... */ if (!strncmp(uri, "//", 2)) { /* * Yes, extract it... */ uri += 2; /* * Grab the username, if any... */ if ((sep = strpbrk(uri, "@/")) != NULL && *sep == '@') { /* * Get a username:password combo... */ uri = http_copy_decode(username, uri, usernamelen, "@", decoding & HTTP_URI_CODING_USERNAME); if (!uri) { *username = '\0'; return (HTTP_URI_STATUS_BAD_USERNAME); } uri ++; } /* * Then the hostname/IP address... */ if (*uri == '[') { /* * Grab IPv6 address... */ uri ++; if (*uri == 'v') { /* * Skip IPvFuture ("vXXXX.") prefix... */ uri ++; while (isxdigit(*uri & 255)) uri ++; if (*uri != '.') { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } uri ++; } uri = http_copy_decode(host, uri, hostlen, "]", decoding & HTTP_URI_CODING_HOSTNAME); if (!uri) { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } /* * Validate value... */ if (*uri != ']') { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } uri ++; for (ptr = host; *ptr; ptr ++) if (*ptr == '+') { /* * Convert zone separator to % and stop here... */ *ptr = '%'; break; } else if (*ptr == '%') { /* * Stop at zone separator (RFC 6874) */ break; } else if (*ptr != ':' && *ptr != '.' && !isxdigit(*ptr & 255)) { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } } else { /* * Validate the hostname or IPv4 address first... */ for (ptr = (char *)uri; *ptr; ptr ++) if (strchr(":?/", *ptr)) break; else if (!strchr("abcdefghijklmnopqrstuvwxyz" /* unreserved */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" /* unreserved */ "0123456789" /* unreserved */ "-._~" /* unreserved */ "%" /* pct-encoded */ "!$&'()*+,;=" /* sub-delims */ "\\", *ptr)) /* SMB domain */ { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } /* * Then copy the hostname or IPv4 address to the buffer... */ uri = http_copy_decode(host, uri, hostlen, ":?/", decoding & HTTP_URI_CODING_HOSTNAME); if (!uri) { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } } /* * Validate hostname for file scheme - only empty and localhost are * acceptable. */ if (!strcmp(scheme, "file") && strcmp(host, "localhost") && host[0]) { *host = '\0'; return (HTTP_URI_STATUS_BAD_HOSTNAME); } /* * See if we have a port number... */ if (*uri == ':') { /* * Yes, collect the port number... */ if (!isdigit(uri[1] & 255)) { *port = 0; return (HTTP_URI_STATUS_BAD_PORT); } *port = (int)strtol(uri + 1, (char **)&uri, 10); if (*port <= 0 || *port > 65535) { *port = 0; return (HTTP_URI_STATUS_BAD_PORT); } if (*uri != '/' && *uri) { *port = 0; return (HTTP_URI_STATUS_BAD_PORT); } } } /* * The remaining portion is the resource string... */ if (*uri == '?' || !*uri) { /* * Hostname but no path... */ status = HTTP_URI_STATUS_MISSING_RESOURCE; *resource = '/'; /* * Copy any query string... */ if (*uri == '?') uri = http_copy_decode(resource + 1, uri, resourcelen - 1, NULL, decoding & HTTP_URI_CODING_QUERY); else resource[1] = '\0'; } else { uri = http_copy_decode(resource, uri, resourcelen, "?", decoding & HTTP_URI_CODING_RESOURCE); if (uri && *uri == '?') { /* * Concatenate any query string... */ char *resptr = resource + strlen(resource); uri = http_copy_decode(resptr, uri, resourcelen - (int)(resptr - resource), NULL, decoding & HTTP_URI_CODING_QUERY); } } if (!uri) { *resource = '\0'; return (HTTP_URI_STATUS_BAD_RESOURCE); } /* * Return the URI separation status... */ return (status); } /* * '_httpSetDigestAuthString()' - Calculate a Digest authentication response * using the appropriate RFC 2068/2617/7616 * algorithm. */ int /* O - 1 on success, 0 on failure */ _httpSetDigestAuthString( http_t *http, /* I - HTTP connection */ const char *nonce, /* I - Nonce value */ const char *method, /* I - HTTP method */ const char *resource) /* I - HTTP resource path */ { char kd[65], /* Final MD5/SHA-256 digest */ ha1[65], /* Hash of username:realm:password */ ha2[65], /* Hash of method:request-uri */ username[HTTP_MAX_VALUE], /* username:password */ *password, /* Pointer to password */ temp[1024], /* Temporary string */ digest[1024]; /* Digest auth data */ unsigned char hash[32]; /* Hash buffer */ size_t hashsize; /* Size of hash */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */ DEBUG_printf(("2_httpSetDigestAuthString(http=%p, nonce=\"%s\", method=\"%s\", resource=\"%s\")", (void *)http, nonce, method, resource)); if (nonce && *nonce && strcmp(nonce, http->nonce)) { strlcpy(http->nonce, nonce, sizeof(http->nonce)); if (nonce == http->nextnonce) http->nextnonce[0] = '\0'; http->nonce_count = 1; } else http->nonce_count ++; strlcpy(username, http->userpass, sizeof(username)); if ((password = strchr(username, ':')) != NULL) *password++ = '\0'; else return (0); if (http->algorithm[0]) { /* * Follow RFC 2617/7616... */ int i; /* Looping var */ char cnonce[65]; /* cnonce value */ const char *hashalg; /* Hashing algorithm */ for (i = 0; i < 64; i ++) cnonce[i] = "0123456789ABCDEF"[CUPS_RAND() & 15]; cnonce[64] = '\0'; if (!_cups_strcasecmp(http->algorithm, "MD5")) { /* * RFC 2617 Digest with MD5 */ if (cg->digestoptions == _CUPS_DIGESTOPTIONS_DENYMD5) { DEBUG_puts("3_httpSetDigestAuthString: MD5 Digest is disabled."); return (0); } hashalg = "md5"; } else if (!_cups_strcasecmp(http->algorithm, "SHA-256")) { /* * RFC 7616 Digest with SHA-256 */ hashalg = "sha2-256"; } else { /* * Some other algorithm we don't support, skip this one... */ return (0); } /* * Calculate digest value... */ /* H(A1) = H(username:realm:password) */ snprintf(temp, sizeof(temp), "%s:%s:%s", username, http->realm, password); hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, ha1, sizeof(ha1)); /* H(A2) = H(method:uri) */ snprintf(temp, sizeof(temp), "%s:%s", method, resource); hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, ha2, sizeof(ha2)); /* KD = H(H(A1):nonce:nc:cnonce:qop:H(A2)) */ snprintf(temp, sizeof(temp), "%s:%s:%08x:%s:%s:%s", ha1, http->nonce, http->nonce_count, cnonce, "auth", ha2); hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, kd, sizeof(kd)); /* * Pass the RFC 2617/7616 WWW-Authenticate header... */ if (http->opaque[0]) snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", algorithm=%s, qop=auth, opaque=\"%s\", cnonce=\"%s\", nc=%08x, uri=\"%s\", response=\"%s\"", cupsUser(), http->realm, http->nonce, http->algorithm, http->opaque, cnonce, http->nonce_count, resource, kd); else snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", algorithm=%s, qop=auth, cnonce=\"%s\", nc=%08x, uri=\"%s\", response=\"%s\"", username, http->realm, http->nonce, http->algorithm, cnonce, http->nonce_count, resource, kd); } else { /* * Use old RFC 2069 Digest method... */ /* H(A1) = H(username:realm:password) */ snprintf(temp, sizeof(temp), "%s:%s:%s", username, http->realm, password); hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, ha1, sizeof(ha1)); /* H(A2) = H(method:uri) */ snprintf(temp, sizeof(temp), "%s:%s", method, resource); hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, ha2, sizeof(ha2)); /* KD = H(H(A1):nonce:H(A2)) */ snprintf(temp, sizeof(temp), "%s:%s:%s", ha1, http->nonce, ha2); hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); cupsHashString(hash, hashsize, kd, sizeof(kd)); /* * Pass the old RFC 2069 WWW-Authenticate header... */ snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"", username, http->realm, http->nonce, resource, kd); } httpSetAuthString(http, "Digest", digest); return (1); } /* * 'httpStateString()' - Return the string describing a HTTP state value. * * @since CUPS 2.0/OS 10.10@ */ const char * /* O - State string */ httpStateString(http_state_t state) /* I - HTTP state value */ { if (state < HTTP_STATE_ERROR || state > HTTP_STATE_UNKNOWN_VERSION) return ("HTTP_STATE_???"); else return (http_states[state - HTTP_STATE_ERROR]); } /* * '_httpStatus()' - Return the localized string describing a HTTP status code. * * The returned string is localized using the passed message catalog. */ const char * /* O - Localized status string */ _httpStatus(cups_lang_t *lang, /* I - Language */ http_status_t status) /* I - HTTP status code */ { const char *s; /* Status string */ switch (status) { case HTTP_STATUS_ERROR : s = strerror(errno); break; case HTTP_STATUS_CONTINUE : s = _("Continue"); break; case HTTP_STATUS_SWITCHING_PROTOCOLS : s = _("Switching Protocols"); break; case HTTP_STATUS_OK : s = _("OK"); break; case HTTP_STATUS_CREATED : s = _("Created"); break; case HTTP_STATUS_ACCEPTED : s = _("Accepted"); break; case HTTP_STATUS_NO_CONTENT : s = _("No Content"); break; case HTTP_STATUS_MOVED_PERMANENTLY : s = _("Moved Permanently"); break; case HTTP_STATUS_FOUND : s = _("Found"); break; case HTTP_STATUS_SEE_OTHER : s = _("See Other"); break; case HTTP_STATUS_NOT_MODIFIED : s = _("Not Modified"); break; case HTTP_STATUS_BAD_REQUEST : s = _("Bad Request"); break; case HTTP_STATUS_UNAUTHORIZED : case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED : s = _("Unauthorized"); break; case HTTP_STATUS_FORBIDDEN : s = _("Forbidden"); break; case HTTP_STATUS_NOT_FOUND : s = _("Not Found"); break; case HTTP_STATUS_REQUEST_TOO_LARGE : s = _("Request Entity Too Large"); break; case HTTP_STATUS_URI_TOO_LONG : s = _("URI Too Long"); break; case HTTP_STATUS_UPGRADE_REQUIRED : s = _("Upgrade Required"); break; case HTTP_STATUS_NOT_IMPLEMENTED : s = _("Not Implemented"); break; case HTTP_STATUS_NOT_SUPPORTED : s = _("Not Supported"); break; case HTTP_STATUS_EXPECTATION_FAILED : s = _("Expectation Failed"); break; case HTTP_STATUS_SERVICE_UNAVAILABLE : s = _("Service Unavailable"); break; case HTTP_STATUS_SERVER_ERROR : s = _("Internal Server Error"); break; case HTTP_STATUS_CUPS_PKI_ERROR : s = _("SSL/TLS Negotiation Error"); break; case HTTP_STATUS_CUPS_WEBIF_DISABLED : s = _("Web Interface is Disabled"); break; default : s = _("Unknown"); break; } return (_cupsLangString(lang, s)); } /* * 'httpStatus()' - Return a short string describing a HTTP status code. * * The returned string is localized to the current POSIX locale and is based * on the status strings defined in RFC 7231. */ const char * /* O - Localized status string */ httpStatus(http_status_t status) /* I - HTTP status code */ { _cups_globals_t *cg = _cupsGlobals(); /* Global data */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); return (_httpStatus(cg->lang_default, status)); } /* * 'httpURIStatusString()' - Return a string describing a URI status code. * * @since CUPS 2.0/OS 10.10@ */ const char * /* O - Localized status string */ httpURIStatusString( http_uri_status_t status) /* I - URI status code */ { const char *s; /* Status string */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); switch (status) { case HTTP_URI_STATUS_OVERFLOW : s = _("URI too large"); break; case HTTP_URI_STATUS_BAD_ARGUMENTS : s = _("Bad arguments to function"); break; case HTTP_URI_STATUS_BAD_RESOURCE : s = _("Bad resource in URI"); break; case HTTP_URI_STATUS_BAD_PORT : s = _("Bad port number in URI"); break; case HTTP_URI_STATUS_BAD_HOSTNAME : s = _("Bad hostname/address in URI"); break; case HTTP_URI_STATUS_BAD_USERNAME : s = _("Bad username in URI"); break; case HTTP_URI_STATUS_BAD_SCHEME : s = _("Bad scheme in URI"); break; case HTTP_URI_STATUS_BAD_URI : s = _("Bad/empty URI"); break; case HTTP_URI_STATUS_OK : s = _("OK"); break; case HTTP_URI_STATUS_MISSING_SCHEME : s = _("Missing scheme in URI"); break; case HTTP_URI_STATUS_UNKNOWN_SCHEME : s = _("Unknown scheme in URI"); break; case HTTP_URI_STATUS_MISSING_RESOURCE : s = _("Missing resource in URI"); break; default: s = _("Unknown"); break; } return (_cupsLangString(cg->lang_default, s)); } #ifndef HAVE_HSTRERROR /* * '_cups_hstrerror()' - hstrerror() emulation function for Solaris and others. */ const char * /* O - Error string */ _cups_hstrerror(int error) /* I - Error number */ { static const char * const errors[] = /* Error strings */ { "OK", "Host not found.", "Try again.", "Unrecoverable lookup error.", "No data associated with name." }; if (error < 0 || error > 4) return ("Unknown hostname lookup error."); else return (errors[error]); } #endif /* !HAVE_HSTRERROR */ /* * '_httpDecodeURI()' - Percent-decode a HTTP request URI. */ char * /* O - Decoded URI or NULL on error */ _httpDecodeURI(char *dst, /* I - Destination buffer */ const char *src, /* I - Source URI */ size_t dstsize) /* I - Size of destination buffer */ { if (http_copy_decode(dst, src, (int)dstsize, NULL, 1)) return (dst); else return (NULL); } /* * '_httpEncodeURI()' - Percent-encode a HTTP request URI. */ char * /* O - Encoded URI */ _httpEncodeURI(char *dst, /* I - Destination buffer */ const char *src, /* I - Source URI */ size_t dstsize) /* I - Size of destination buffer */ { http_copy_encode(dst, src, dst + dstsize - 1, NULL, NULL, 1); return (dst); } /* * '_httpResolveURI()' - Resolve a DNS-SD URI. */ const char * /* O - Resolved URI */ _httpResolveURI( const char *uri, /* I - DNS-SD URI */ char *resolved_uri, /* I - Buffer for resolved URI */ size_t resolved_size, /* I - Size of URI buffer */ int options, /* I - Resolve options */ int (*cb)(void *context), /* I - Continue callback function */ void *context) /* I - Context pointer for callback */ { char scheme[32], /* URI components... */ userpass[256], hostname[1024], resource[1024]; int port; #ifdef DEBUG http_uri_status_t status; /* URI decode status */ #endif /* DEBUG */ DEBUG_printf(("_httpResolveURI(uri=\"%s\", resolved_uri=%p, resolved_size=" CUPS_LLFMT ", options=0x%x, cb=%p, context=%p)", uri, (void *)resolved_uri, CUPS_LLCAST resolved_size, options, (void *)cb, context)); /* * Get the device URI... */ #ifdef DEBUG if ((status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource))) < HTTP_URI_STATUS_OK) #else if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) #endif /* DEBUG */ { if (options & _HTTP_RESOLVE_STDERR) _cupsLangPrintFilter(stderr, "ERROR", _("Bad device-uri \"%s\"."), uri); DEBUG_printf(("2_httpResolveURI: httpSeparateURI returned %d!", status)); DEBUG_puts("2_httpResolveURI: Returning NULL"); return (NULL); } /* * Resolve it as needed... */ if (strstr(hostname, "._tcp")) { #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) char *regtype, /* Pointer to type in hostname */ *domain, /* Pointer to domain in hostname */ *uuid, /* Pointer to UUID in URI */ *uuidend; /* Pointer to end of UUID in URI */ _http_uribuf_t uribuf; /* URI buffer */ int offline = 0; /* offline-report state set? */ # ifdef HAVE_DNSSD DNSServiceRef ref, /* DNS-SD master service reference */ domainref = NULL,/* DNS-SD service reference for domain */ ippref = NULL, /* DNS-SD service reference for network IPP */ ippsref = NULL, /* DNS-SD service reference for network IPPS */ localref; /* DNS-SD service reference for .local */ int extrasent = 0; /* Send the domain/IPP/IPPS resolves? */ # ifdef HAVE_POLL struct pollfd polldata; /* Polling data */ # else /* select() */ fd_set input_set; /* Input set for select() */ struct timeval stimeout; /* Timeout value for select() */ # endif /* HAVE_POLL */ # elif defined(HAVE_AVAHI) AvahiClient *client; /* Client information */ int error; /* Status */ # endif /* HAVE_DNSSD */ if (options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname); /* * Separate the hostname into service name, registration type, and domain... */ for (regtype = strstr(hostname, "._tcp") - 2; regtype > hostname; regtype --) if (regtype[0] == '.' && regtype[1] == '_') { /* * Found ._servicetype in front of ._tcp... */ *regtype++ = '\0'; break; } if (regtype <= hostname) { DEBUG_puts("2_httpResolveURI: Bad hostname, returning NULL"); return (NULL); } for (domain = strchr(regtype, '.'); domain; domain = strchr(domain + 1, '.')) if (domain[1] != '_') break; if (domain) *domain++ = '\0'; if ((uuid = strstr(resource, "?uuid=")) != NULL) { *uuid = '\0'; uuid += 6; if ((uuidend = strchr(uuid, '&')) != NULL) *uuidend = '\0'; } resolved_uri[0] = '\0'; uribuf.buffer = resolved_uri; uribuf.bufsize = resolved_size; uribuf.options = options; uribuf.resource = resource; uribuf.uuid = uuid; DEBUG_printf(("2_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", " "domain=\"%s\"\n", hostname, regtype, domain)); if (options & _HTTP_RESOLVE_STDERR) { fputs("STATE: +connecting-to-device\n", stderr); fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", " "domain=\"local.\"...\n", hostname, regtype); } uri = NULL; # ifdef HAVE_DNSSD if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError) { uint32_t myinterface = kDNSServiceInterfaceIndexAny; /* Lookup on any interface */ if (!strcmp(scheme, "ippusb")) myinterface = kDNSServiceInterfaceIndexLocalOnly; localref = ref; if (DNSServiceResolve(&localref, kDNSServiceFlagsShareConnection, myinterface, hostname, regtype, "local.", http_resolve_cb, &uribuf) == kDNSServiceErr_NoError) { int fds; /* Number of ready descriptors */ time_t timeout, /* Poll timeout */ start_time = time(NULL),/* Start time */ end_time = start_time + 90; /* End time */ while (time(NULL) < end_time) { if (options & _HTTP_RESOLVE_STDERR) _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer.")); if (cb && !(*cb)(context)) { DEBUG_puts("2_httpResolveURI: callback returned 0 (stop)"); break; } /* * Wakeup every 2 seconds to emit a "looking for printer" message... */ if ((timeout = end_time - time(NULL)) > 2) timeout = 2; # ifdef HAVE_POLL polldata.fd = DNSServiceRefSockFD(ref); polldata.events = POLLIN; fds = poll(&polldata, 1, (int)(1000 * timeout)); # else /* select() */ FD_ZERO(&input_set); FD_SET(DNSServiceRefSockFD(ref), &input_set); # ifdef _WIN32 stimeout.tv_sec = (long)timeout; # else stimeout.tv_sec = timeout; # endif /* _WIN32 */ stimeout.tv_usec = 0; fds = select(DNSServiceRefSockFD(ref)+1, &input_set, NULL, NULL, &stimeout); # endif /* HAVE_POLL */ if (fds < 0) { if (errno != EINTR && errno != EAGAIN) { DEBUG_printf(("2_httpResolveURI: poll error: %s", strerror(errno))); break; } } else if (fds == 0) { /* * Wait 2 seconds for a response to the local resolve; if nothing * comes in, do an additional domain resolution... */ if (extrasent == 0 && domain && _cups_strcasecmp(domain, "local.")) { if (options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", " "domain=\"%s\"...\n", hostname, regtype, domain ? domain : ""); domainref = ref; if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, myinterface, hostname, regtype, domain, http_resolve_cb, &uribuf) == kDNSServiceErr_NoError) extrasent = 1; } else if (extrasent == 0 && !strcmp(scheme, "ippusb")) { if (options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"_ipps._tcp\", domain=\"local.\"...\n", hostname); ippsref = ref; if (DNSServiceResolve(&ippsref, kDNSServiceFlagsShareConnection, kDNSServiceInterfaceIndexAny, hostname, "_ipps._tcp", domain, http_resolve_cb, &uribuf) == kDNSServiceErr_NoError) extrasent = 1; } else if (extrasent == 1 && !strcmp(scheme, "ippusb")) { if (options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"_ipp._tcp\", domain=\"local.\"...\n", hostname); ippref = ref; if (DNSServiceResolve(&ippref, kDNSServiceFlagsShareConnection, kDNSServiceInterfaceIndexAny, hostname, "_ipp._tcp", domain, http_resolve_cb, &uribuf) == kDNSServiceErr_NoError) extrasent = 2; } /* * If it hasn't resolved within 5 seconds set the offline-report * printer-state-reason... */ if ((options & _HTTP_RESOLVE_STDERR) && offline == 0 && time(NULL) > (start_time + 5)) { fputs("STATE: +offline-report\n", stderr); offline = 1; } } else { if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError && resolved_uri[0]) { uri = resolved_uri; break; } } } if (extrasent) { if (domainref) DNSServiceRefDeallocate(domainref); if (ippref) DNSServiceRefDeallocate(ippref); if (ippsref) DNSServiceRefDeallocate(ippsref); } DNSServiceRefDeallocate(localref); } DNSServiceRefDeallocate(ref); } # else /* HAVE_AVAHI */ if ((uribuf.poll = avahi_simple_poll_new()) != NULL) { avahi_simple_poll_set_func(uribuf.poll, http_poll_cb, NULL); if ((client = avahi_client_new(avahi_simple_poll_get(uribuf.poll), 0, http_client_cb, &uribuf, &error)) != NULL) { if (avahi_service_resolver_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, hostname, regtype, "local.", AVAHI_PROTO_UNSPEC, 0, http_resolve_cb, &uribuf) != NULL) { time_t start_time = time(NULL), /* Start time */ end_time = start_time + 90; /* End time */ int pstatus; /* Poll status */ pstatus = avahi_simple_poll_iterate(uribuf.poll, 2000); if (pstatus == 0 && !resolved_uri[0] && domain && _cups_strcasecmp(domain, "local.")) { /* * Resolve for .local hasn't returned anything, try the listed * domain... */ avahi_service_resolver_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, hostname, regtype, domain, AVAHI_PROTO_UNSPEC, 0, http_resolve_cb, &uribuf); } while (!pstatus && !resolved_uri[0] && time(NULL) < end_time) { if ((pstatus = avahi_simple_poll_iterate(uribuf.poll, 2000)) != 0) break; /* * If it hasn't resolved within 5 seconds set the offline-report * printer-state-reason... */ if ((options & _HTTP_RESOLVE_STDERR) && offline == 0 && time(NULL) > (start_time + 5)) { fputs("STATE: +offline-report\n", stderr); offline = 1; } } /* * Collect the result (if we got one). */ if (resolved_uri[0]) uri = resolved_uri; } avahi_client_free(client); } avahi_simple_poll_free(uribuf.poll); } # endif /* HAVE_DNSSD */ if (options & _HTTP_RESOLVE_STDERR) { if (uri) { fprintf(stderr, "DEBUG: Resolved as \"%s\"...\n", uri); fputs("STATE: -connecting-to-device,offline-report\n", stderr); } else { fputs("DEBUG: Unable to resolve URI\n", stderr); fputs("STATE: -connecting-to-device\n", stderr); } } #else /* HAVE_DNSSD || HAVE_AVAHI */ /* * No DNS-SD support... */ uri = NULL; #endif /* HAVE_DNSSD || HAVE_AVAHI */ if ((options & _HTTP_RESOLVE_STDERR) && !uri) _cupsLangPrintFilter(stderr, "INFO", _("Unable to find printer.")); } else { /* * Nothing more to do... */ strlcpy(resolved_uri, uri, resolved_size); uri = resolved_uri; } DEBUG_printf(("2_httpResolveURI: Returning \"%s\"", uri)); return (uri); } #ifdef HAVE_AVAHI /* * 'http_client_cb()' - Client callback for resolving URI. */ static void http_client_cb( AvahiClient *client, /* I - Client information */ AvahiClientState state, /* I - Current state */ void *context) /* I - Pointer to URI buffer */ { DEBUG_printf(("7http_client_cb(client=%p, state=%d, context=%p)", client, state, context)); /* * If the connection drops, quit. */ if (state == AVAHI_CLIENT_FAILURE) { _http_uribuf_t *uribuf = (_http_uribuf_t *)context; /* URI buffer */ avahi_simple_poll_quit(uribuf->poll); } } #endif /* HAVE_AVAHI */ /* * 'http_copy_decode()' - Copy and decode a URI. */ static const char * /* O - New source pointer or NULL on error */ http_copy_decode(char *dst, /* O - Destination buffer */ const char *src, /* I - Source pointer */ int dstsize, /* I - Destination size */ const char *term, /* I - Terminating characters */ int decode) /* I - Decode %-encoded values */ { char *ptr, /* Pointer into buffer */ *end; /* End of buffer */ int quoted; /* Quoted character */ /* * Copy the src to the destination until we hit a terminating character * or the end of the string. */ for (ptr = dst, end = dst + dstsize - 1; *src && (!term || !strchr(term, *src)); src ++) if (ptr < end) { if (*src == '%' && decode) { if (isxdigit(src[1] & 255) && isxdigit(src[2] & 255)) { /* * Grab a hex-encoded character... */ src ++; if (isalpha(*src)) quoted = (tolower(*src) - 'a' + 10) << 4; else quoted = (*src - '0') << 4; src ++; if (isalpha(*src)) quoted |= tolower(*src) - 'a' + 10; else quoted |= *src - '0'; *ptr++ = (char)quoted; } else { /* * Bad hex-encoded character... */ *ptr = '\0'; return (NULL); } } else if ((*src & 255) <= 0x20 || (*src & 255) >= 0x7f) { *ptr = '\0'; return (NULL); } else *ptr++ = *src; } *ptr = '\0'; return (src); } /* * 'http_copy_encode()' - Copy and encode a URI. */ static char * /* O - End of current URI */ http_copy_encode(char *dst, /* O - Destination buffer */ const char *src, /* I - Source pointer */ char *dstend, /* I - End of destination buffer */ const char *reserved, /* I - Extra reserved characters */ const char *term, /* I - Terminating characters */ int encode) /* I - %-encode reserved chars? */ { static const char hex[] = "0123456789ABCDEF"; while (*src && dst < dstend) { if (term && *src == *term) return (dst); if (encode && (*src == '%' || *src <= ' ' || *src & 128 || (reserved && strchr(reserved, *src)))) { /* * Hex encode reserved characters... */ if ((dst + 2) >= dstend) break; *dst++ = '%'; *dst++ = hex[(*src >> 4) & 15]; *dst++ = hex[*src & 15]; src ++; } else *dst++ = *src++; } *dst = '\0'; if (*src) return (NULL); else return (dst); } #ifdef HAVE_DNSSD /* * 'http_resolve_cb()' - Build a device URI for the given service name. */ static void DNSSD_API http_resolve_cb( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Results flags */ uint32_t interfaceIndex, /* I - Interface number */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *fullName, /* I - Full service name */ const char *hostTarget, /* I - Hostname */ uint16_t port, /* I - Port number */ uint16_t txtLen, /* I - Length of TXT record */ const unsigned char *txtRecord, /* I - TXT record data */ void *context) /* I - Pointer to URI buffer */ { _http_uribuf_t *uribuf = (_http_uribuf_t *)context; /* URI buffer */ const char *scheme, /* URI scheme */ *hostptr, /* Pointer into hostTarget */ *reskey, /* "rp" or "rfo" */ *resdefault; /* Default path */ char resource[257], /* Remote path */ fqdn[256]; /* FQDN of the .local name */ const void *value; /* Value from TXT record */ uint8_t valueLen; /* Length of value */ DEBUG_printf(("4http_resolve_cb(sdRef=%p, flags=%x, interfaceIndex=%u, errorCode=%d, fullName=\"%s\", hostTarget=\"%s\", port=%u, txtLen=%u, txtRecord=%p, context=%p)", (void *)sdRef, flags, interfaceIndex, errorCode, fullName, hostTarget, port, txtLen, (void *)txtRecord, context)); /* * If we have a UUID, compare it... */ if (uribuf->uuid && (value = TXTRecordGetValuePtr(txtLen, txtRecord, "UUID", &valueLen)) != NULL) { char uuid[256]; /* UUID value */ memcpy(uuid, value, valueLen); uuid[valueLen] = '\0'; if (_cups_strcasecmp(uuid, uribuf->uuid)) { if (uribuf->options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Found UUID %s, looking for %s.", uuid, uribuf->uuid); DEBUG_printf(("5http_resolve_cb: Found UUID %s, looking for %s.", uuid, uribuf->uuid)); return; } } /* * Figure out the scheme from the full name... */ if (strstr(fullName, "._ipps") || strstr(fullName, "._ipp-tls")) scheme = "ipps"; else if (strstr(fullName, "._ipp") || strstr(fullName, "._fax-ipp")) scheme = "ipp"; else if (strstr(fullName, "._http.")) scheme = "http"; else if (strstr(fullName, "._https.")) scheme = "https"; else if (strstr(fullName, "._printer.")) scheme = "lpd"; else if (strstr(fullName, "._pdl-datastream.")) scheme = "socket"; else scheme = "riousbprint"; /* * Extract the "remote printer" key from the TXT record... */ if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) && (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) && !TXTRecordGetValuePtr(txtLen, txtRecord, "printer-type", &valueLen)) { reskey = "rfo"; resdefault = "/ipp/faxout"; } else { reskey = "rp"; resdefault = "/"; } if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, reskey, &valueLen)) != NULL) { if (((char *)value)[0] == '/') { /* * Value (incorrectly) has a leading slash already... */ memcpy(resource, value, valueLen); resource[valueLen] = '\0'; } else { /* * Convert to resource by concatenating with a leading "/"... */ resource[0] = '/'; memcpy(resource + 1, value, valueLen); resource[valueLen + 1] = '\0'; } } else { /* * Use the default value... */ strlcpy(resource, resdefault, sizeof(resource)); } /* * Lookup the FQDN if needed... */ if ((uribuf->options & _HTTP_RESOLVE_FQDN) && (hostptr = hostTarget + strlen(hostTarget) - 7) > hostTarget && !_cups_strcasecmp(hostptr, ".local.")) { /* * OK, we got a .local name but the caller needs a real domain. Start by * getting the IP address of the .local name and then do reverse-lookups... */ http_addrlist_t *addrlist, /* List of addresses */ *addr; /* Current address */ DEBUG_printf(("5http_resolve_cb: Looking up \"%s\".", hostTarget)); snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port)); if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL) { for (addr = addrlist; addr; addr = addr->next) { int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD); if (!error) { DEBUG_printf(("5http_resolve_cb: Found \"%s\".", fqdn)); if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn || _cups_strcasecmp(hostptr, ".local")) { hostTarget = fqdn; break; } } #ifdef DEBUG else DEBUG_printf(("5http_resolve_cb: \"%s\" did not resolve: %d", httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)), error)); #endif /* DEBUG */ } httpAddrFreeList(addrlist); } } /* * Assemble the final device URI... */ if ((!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) && !strcmp(uribuf->resource, "/cups")) httpAssembleURIf(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, ntohs(port), "%s?snmp=false", resource); else httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, ntohs(port), resource); DEBUG_printf(("5http_resolve_cb: Resolved URI is \"%s\"...", uribuf->buffer)); } #elif defined(HAVE_AVAHI) /* * 'http_poll_cb()' - Wait for input on the specified file descriptors. * * Note: This function is needed because avahi_simple_poll_iterate is broken * and always uses a timeout of 0 (!) milliseconds. * (Avahi Ticket #364) * * @private@ */ static int /* O - Number of file descriptors matching */ http_poll_cb( struct pollfd *pollfds, /* I - File descriptors */ unsigned int num_pollfds, /* I - Number of file descriptors */ int timeout, /* I - Timeout in milliseconds (used) */ void *context) /* I - User data (unused) */ { (void)timeout; (void)context; return (poll(pollfds, num_pollfds, 2000)); } /* * 'http_resolve_cb()' - Build a device URI for the given service name. */ static void http_resolve_cb( AvahiServiceResolver *resolver, /* I - Resolver (unused) */ AvahiIfIndex interface, /* I - Interface index (unused) */ AvahiProtocol protocol, /* I - Network protocol (unused) */ AvahiResolverEvent event, /* I - Event (found, etc.) */ const char *name, /* I - Service name */ const char *type, /* I - Registration type */ const char *domain, /* I - Domain (unused) */ const char *hostTarget, /* I - Hostname */ const AvahiAddress *address, /* I - Address (unused) */ uint16_t port, /* I - Port number */ AvahiStringList *txt, /* I - TXT record */ AvahiLookupResultFlags flags, /* I - Lookup flags (unused) */ void *context) /* I - Pointer to URI buffer */ { _http_uribuf_t *uribuf = (_http_uribuf_t *)context; /* URI buffer */ const char *scheme, /* URI scheme */ *hostptr, /* Pointer into hostTarget */ *reskey, /* "rp" or "rfo" */ *resdefault; /* Default path */ char resource[257], /* Remote path */ fqdn[256]; /* FQDN of the .local name */ AvahiStringList *pair; /* Current TXT record key/value pair */ char *value; /* Value for "rp" key */ size_t valueLen = 0; /* Length of "rp" key */ DEBUG_printf(("4http_resolve_cb(resolver=%p, " "interface=%d, protocol=%d, event=%d, name=\"%s\", " "type=\"%s\", domain=\"%s\", hostTarget=\"%s\", address=%p, " "port=%d, txt=%p, flags=%d, context=%p)", resolver, interface, protocol, event, name, type, domain, hostTarget, address, port, txt, flags, context)); if (event != AVAHI_RESOLVER_FOUND) { avahi_service_resolver_free(resolver); avahi_simple_poll_quit(uribuf->poll); return; } /* * If we have a UUID, compare it... */ if (uribuf->uuid && (pair = avahi_string_list_find(txt, "UUID")) != NULL) { char uuid[256]; /* UUID value */ avahi_string_list_get_pair(pair, NULL, &value, &valueLen); memcpy(uuid, value, valueLen); uuid[valueLen] = '\0'; if (_cups_strcasecmp(uuid, uribuf->uuid)) { if (uribuf->options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Found UUID %s, looking for %s.", uuid, uribuf->uuid); DEBUG_printf(("5http_resolve_cb: Found UUID %s, looking for %s.", uuid, uribuf->uuid)); return; } } /* * Figure out the scheme from the full name... */ if (strstr(type, "_ipp.")) scheme = "ipp"; else if (strstr(type, "_printer.")) scheme = "lpd"; else if (strstr(type, "_pdl-datastream.")) scheme = "socket"; else scheme = "riousbprint"; if (!strncmp(type, "_ipps.", 6) || !strncmp(type, "_ipp-tls.", 9)) scheme = "ipps"; else if (!strncmp(type, "_ipp.", 5) || !strncmp(type, "_fax-ipp.", 9)) scheme = "ipp"; else if (!strncmp(type, "_http.", 6)) scheme = "http"; else if (!strncmp(type, "_https.", 7)) scheme = "https"; else if (!strncmp(type, "_printer.", 9)) scheme = "lpd"; else if (!strncmp(type, "_pdl-datastream.", 16)) scheme = "socket"; else { avahi_service_resolver_free(resolver); avahi_simple_poll_quit(uribuf->poll); return; } /* * Extract the remote resource key from the TXT record... */ if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) && (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) && !avahi_string_list_find(txt, "printer-type")) { reskey = "rfo"; resdefault = "/ipp/faxout"; } else { reskey = "rp"; resdefault = "/"; } if ((pair = avahi_string_list_find(txt, reskey)) != NULL) { avahi_string_list_get_pair(pair, NULL, &value, &valueLen); if (value[0] == '/') { /* * Value (incorrectly) has a leading slash already... */ memcpy(resource, value, valueLen); resource[valueLen] = '\0'; } else { /* * Convert to resource by concatenating with a leading "/"... */ resource[0] = '/'; memcpy(resource + 1, value, valueLen); resource[valueLen + 1] = '\0'; } } else { /* * Use the default value... */ strlcpy(resource, resdefault, sizeof(resource)); } /* * Lookup the FQDN if needed... */ if ((uribuf->options & _HTTP_RESOLVE_FQDN) && (hostptr = hostTarget + strlen(hostTarget) - 6) > hostTarget && !_cups_strcasecmp(hostptr, ".local")) { /* * OK, we got a .local name but the caller needs a real domain. Start by * getting the IP address of the .local name and then do reverse-lookups... */ http_addrlist_t *addrlist, /* List of addresses */ *addr; /* Current address */ DEBUG_printf(("5http_resolve_cb: Looking up \"%s\".", hostTarget)); snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port)); if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL) { for (addr = addrlist; addr; addr = addr->next) { int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD); if (!error) { DEBUG_printf(("5http_resolve_cb: Found \"%s\".", fqdn)); if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn || _cups_strcasecmp(hostptr, ".local")) { hostTarget = fqdn; break; } } #ifdef DEBUG else DEBUG_printf(("5http_resolve_cb: \"%s\" did not resolve: %d", httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)), error)); #endif /* DEBUG */ } httpAddrFreeList(addrlist); } } /* * Assemble the final device URI using the resolved hostname... */ httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, port, resource); DEBUG_printf(("5http_resolve_cb: Resolved URI is \"%s\".", uribuf->buffer)); avahi_simple_poll_quit(uribuf->poll); } #endif /* HAVE_DNSSD */ cups-2.3.1/cups/http.h000664 000765 000024 00000072044 13574721672 014710 0ustar00mikestaff000000 000000 /* * Hyper-Text Transport Protocol definitions for CUPS. * * Copyright © 2007-2018 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. */ #ifndef _CUPS_HTTP_H_ # define _CUPS_HTTP_H_ /* * Include necessary headers... */ # include "versioning.h" # include "array.h" # include # include # include # ifdef _WIN32 # ifndef __CUPS_SSIZE_T_DEFINED # define __CUPS_SSIZE_T_DEFINED /* Windows does not support the ssize_t type, so map it to off_t... */ typedef off_t ssize_t; /* @private@ */ # endif /* !__CUPS_SSIZE_T_DEFINED */ # include # include # else # include # include # include # include # include # include # include # include # if !defined(__APPLE__) || !defined(TCP_NODELAY) # include # endif /* !__APPLE__ || !TCP_NODELAY */ # if defined(AF_UNIX) && !defined(AF_LOCAL) # define AF_LOCAL AF_UNIX /* Older UNIX's have old names... */ # endif /* AF_UNIX && !AF_LOCAL */ # ifdef AF_LOCAL # include # endif /* AF_LOCAL */ # if defined(LOCAL_PEERCRED) && !defined(SO_PEERCRED) # define SO_PEERCRED LOCAL_PEERCRED # endif /* LOCAL_PEERCRED && !SO_PEERCRED */ # endif /* _WIN32 */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Oh, the wonderful world of IPv6 compatibility. Apparently some * implementations expose the (more logical) 32-bit address parts * to everyone, while others only expose it to kernel code... To * make supporting IPv6 even easier, each vendor chose different * core structure and union names, so the same defines or code * can't be used on all platforms. * * The following will likely need tweaking on new platforms that * support IPv6 - the "s6_addr32" define maps to the 32-bit integer * array in the in6_addr union, which is named differently on various * platforms. */ #if defined(AF_INET6) && !defined(s6_addr32) # if defined(__sun) # define s6_addr32 _S6_un._S6_u32 # elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)|| defined(__DragonFly__) # define s6_addr32 __u6_addr.__u6_addr32 # elif defined(_WIN32) /* * Windows only defines byte and 16-bit word members of the union and * requires special casing of all raw address code... */ # define s6_addr32 error_need_win32_specific_code # endif /* __sun */ #endif /* AF_INET6 && !s6_addr32 */ /* * Limits... */ # define HTTP_MAX_URI 1024 /* Max length of URI string */ # define HTTP_MAX_HOST 256 /* Max length of hostname string */ # define HTTP_MAX_BUFFER 2048 /* Max length of data buffer */ # define HTTP_MAX_VALUE 256 /* Max header field value length */ /* * Types and structures... */ typedef enum http_auth_e /**** HTTP authentication types @exclude all@ ****/ { HTTP_AUTH_NONE, /* No authentication in use */ HTTP_AUTH_BASIC, /* Basic authentication in use */ HTTP_AUTH_MD5, /* Digest authentication in use */ HTTP_AUTH_MD5_SESS, /* MD5-session authentication in use */ HTTP_AUTH_MD5_INT, /* Digest authentication in use for body */ HTTP_AUTH_MD5_SESS_INT, /* MD5-session authentication in use for body */ HTTP_AUTH_NEGOTIATE /* GSSAPI authentication in use @since CUPS 1.3/macOS 10.5@ */ } http_auth_t; typedef enum http_encoding_e /**** HTTP transfer encoding values ****/ { HTTP_ENCODING_LENGTH, /* Data is sent with Content-Length */ HTTP_ENCODING_CHUNKED, /* Data is chunked */ HTTP_ENCODING_FIELDS /* Sending HTTP fields */ # ifndef _CUPS_NO_DEPRECATED # define HTTP_ENCODE_LENGTH HTTP_ENCODING_LENGTH # define HTTP_ENCODE_CHUNKED HTTP_ENCODING_CHUNKED # define HTTP_ENCODE_FIELDS HTTP_ENCODING_FIELDS # endif /* !_CUPS_NO_DEPRECATED */ } http_encoding_t; typedef enum http_encryption_e /**** HTTP encryption values ****/ { HTTP_ENCRYPTION_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */ HTTP_ENCRYPTION_NEVER, /* Never encrypt */ HTTP_ENCRYPTION_REQUIRED, /* Encryption is required (TLS upgrade) */ HTTP_ENCRYPTION_ALWAYS /* Always encrypt (SSL) */ # ifndef _CUPS_NO_DEPRECATED # define HTTP_ENCRYPT_IF_REQUESTED HTTP_ENCRYPTION_IF_REQUESTED # define HTTP_ENCRYPT_NEVER HTTP_ENCRYPTION_NEVER # define HTTP_ENCRYPT_REQUIRED HTTP_ENCRYPTION_REQUIRED # define HTTP_ENCRYPT_ALWAYS HTTP_ENCRYPTION_ALWAYS # endif /* !_CUPS_NO_DEPRECATED */ } http_encryption_t; typedef enum http_field_e /**** HTTP field names ****/ { HTTP_FIELD_UNKNOWN = -1, /* Unknown field */ HTTP_FIELD_ACCEPT_LANGUAGE, /* Accept-Language field */ HTTP_FIELD_ACCEPT_RANGES, /* Accept-Ranges field */ HTTP_FIELD_AUTHORIZATION, /* Authorization field */ HTTP_FIELD_CONNECTION, /* Connection field */ HTTP_FIELD_CONTENT_ENCODING, /* Content-Encoding field */ HTTP_FIELD_CONTENT_LANGUAGE, /* Content-Language field */ HTTP_FIELD_CONTENT_LENGTH, /* Content-Length field */ HTTP_FIELD_CONTENT_LOCATION, /* Content-Location field */ HTTP_FIELD_CONTENT_MD5, /* Content-MD5 field */ HTTP_FIELD_CONTENT_RANGE, /* Content-Range field */ HTTP_FIELD_CONTENT_TYPE, /* Content-Type field */ HTTP_FIELD_CONTENT_VERSION, /* Content-Version field */ HTTP_FIELD_DATE, /* Date field */ HTTP_FIELD_HOST, /* Host field */ HTTP_FIELD_IF_MODIFIED_SINCE, /* If-Modified-Since field */ HTTP_FIELD_IF_UNMODIFIED_SINCE, /* If-Unmodified-Since field */ HTTP_FIELD_KEEP_ALIVE, /* Keep-Alive field */ HTTP_FIELD_LAST_MODIFIED, /* Last-Modified field */ HTTP_FIELD_LINK, /* Link field */ HTTP_FIELD_LOCATION, /* Location field */ HTTP_FIELD_RANGE, /* Range field */ HTTP_FIELD_REFERER, /* Referer field */ HTTP_FIELD_RETRY_AFTER, /* Retry-After field */ HTTP_FIELD_TRANSFER_ENCODING, /* Transfer-Encoding field */ HTTP_FIELD_UPGRADE, /* Upgrade field */ HTTP_FIELD_USER_AGENT, /* User-Agent field */ HTTP_FIELD_WWW_AUTHENTICATE, /* WWW-Authenticate field */ HTTP_FIELD_ACCEPT_ENCODING, /* Accepting-Encoding field @since CUPS 1.7/macOS 10.9@ */ HTTP_FIELD_ALLOW, /* Allow field @since CUPS 1.7/macOS 10.9@ */ HTTP_FIELD_SERVER, /* Server field @since CUPS 1.7/macOS 10.9@ */ HTTP_FIELD_AUTHENTICATION_INFO, /* Authentication-Info field (@since CUPS 2.2.9) */ HTTP_FIELD_MAX /* Maximum field index */ } http_field_t; typedef enum http_keepalive_e /**** HTTP keep-alive values ****/ { HTTP_KEEPALIVE_OFF = 0, /* No keep alive support */ HTTP_KEEPALIVE_ON /* Use keep alive */ } http_keepalive_t; typedef enum http_state_e /**** HTTP state values; states **** are server-oriented... ****/ { HTTP_STATE_ERROR = -1, /* Error on socket */ HTTP_STATE_WAITING, /* Waiting for command */ HTTP_STATE_OPTIONS, /* OPTIONS command, waiting for blank line */ HTTP_STATE_GET, /* GET command, waiting for blank line */ HTTP_STATE_GET_SEND, /* GET command, sending data */ HTTP_STATE_HEAD, /* HEAD command, waiting for blank line */ HTTP_STATE_POST, /* POST command, waiting for blank line */ HTTP_STATE_POST_RECV, /* POST command, receiving data */ HTTP_STATE_POST_SEND, /* POST command, sending data */ HTTP_STATE_PUT, /* PUT command, waiting for blank line */ HTTP_STATE_PUT_RECV, /* PUT command, receiving data */ HTTP_STATE_DELETE, /* DELETE command, waiting for blank line */ HTTP_STATE_TRACE, /* TRACE command, waiting for blank line */ HTTP_STATE_CONNECT, /* CONNECT command, waiting for blank line */ HTTP_STATE_STATUS, /* Command complete, sending status */ HTTP_STATE_UNKNOWN_METHOD, /* Unknown request method, waiting for blank line @since CUPS 1.7/macOS 10.9@ */ HTTP_STATE_UNKNOWN_VERSION /* Unknown request method, waiting for blank line @since CUPS 1.7/macOS 10.9@ */ # ifndef _CUPS_NO_DEPRECATED # define HTTP_WAITING HTTP_STATE_WAITING # define HTTP_OPTIONS HTTP_STATE_OPTIONS # define HTTP_GET HTTP_STATE_GET # define HTTP_GET_SEND HTTP_STATE_GET_SEND # define HTTP_HEAD HTTP_STATE_HEAD # define HTTP_POST HTTP_STATE_POST # define HTTP_POST_RECV HTTP_STATE_POST_RECV # define HTTP_POST_SEND HTTP_STATE_POST_SEND # define HTTP_PUT HTTP_STATE_PUT # define HTTP_PUT_RECV HTTP_STATE_PUT_RECV # define HTTP_DELETE HTTP_STATE_DELETE # define HTTP_TRACE HTTP_STATE_TRACE # define HTTP_CLOSE HTTP_STATE_CONNECT # define HTTP_STATUS HTTP_STATE_STATUS # endif /* !_CUPS_NO_DEPRECATED */ } http_state_t; typedef enum http_status_e /**** HTTP status codes ****/ { HTTP_STATUS_ERROR = -1, /* An error response from httpXxxx() */ HTTP_STATUS_NONE = 0, /* No Expect value @since CUPS 1.7/macOS 10.9@ */ HTTP_STATUS_CONTINUE = 100, /* Everything OK, keep going... */ HTTP_STATUS_SWITCHING_PROTOCOLS, /* HTTP upgrade to TLS/SSL */ HTTP_STATUS_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */ HTTP_STATUS_CREATED, /* PUT command was successful */ HTTP_STATUS_ACCEPTED, /* DELETE command was successful */ HTTP_STATUS_NOT_AUTHORITATIVE, /* Information isn't authoritative */ HTTP_STATUS_NO_CONTENT, /* Successful command, no new data */ HTTP_STATUS_RESET_CONTENT, /* Content was reset/recreated */ HTTP_STATUS_PARTIAL_CONTENT, /* Only a partial file was received/sent */ HTTP_STATUS_MULTIPLE_CHOICES = 300, /* Multiple files match request */ HTTP_STATUS_MOVED_PERMANENTLY, /* Document has moved permanently */ HTTP_STATUS_FOUND, /* Document was found at a different URI */ HTTP_STATUS_SEE_OTHER, /* See this other link */ HTTP_STATUS_NOT_MODIFIED, /* File not modified */ HTTP_STATUS_USE_PROXY, /* Must use a proxy to access this URI */ HTTP_STATUS_TEMPORARY_REDIRECT = 307, /* Temporary redirection */ HTTP_STATUS_BAD_REQUEST = 400, /* Bad request */ HTTP_STATUS_UNAUTHORIZED, /* Unauthorized to access host */ HTTP_STATUS_PAYMENT_REQUIRED, /* Payment required */ HTTP_STATUS_FORBIDDEN, /* Forbidden to access this URI */ HTTP_STATUS_NOT_FOUND, /* URI was not found */ HTTP_STATUS_METHOD_NOT_ALLOWED, /* Method is not allowed */ HTTP_STATUS_NOT_ACCEPTABLE, /* Not Acceptable */ HTTP_STATUS_PROXY_AUTHENTICATION, /* Proxy Authentication is Required */ HTTP_STATUS_REQUEST_TIMEOUT, /* Request timed out */ HTTP_STATUS_CONFLICT, /* Request is self-conflicting */ HTTP_STATUS_GONE, /* Server has gone away */ HTTP_STATUS_LENGTH_REQUIRED, /* A content length or encoding is required */ HTTP_STATUS_PRECONDITION, /* Precondition failed */ HTTP_STATUS_REQUEST_TOO_LARGE, /* Request entity too large */ HTTP_STATUS_URI_TOO_LONG, /* URI too long */ HTTP_STATUS_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */ HTTP_STATUS_REQUESTED_RANGE, /* The requested range is not satisfiable */ HTTP_STATUS_EXPECTATION_FAILED, /* The expectation given in an Expect header field was not met */ HTTP_STATUS_UPGRADE_REQUIRED = 426, /* Upgrade to SSL/TLS required */ HTTP_STATUS_SERVER_ERROR = 500, /* Internal server error */ HTTP_STATUS_NOT_IMPLEMENTED, /* Feature not implemented */ HTTP_STATUS_BAD_GATEWAY, /* Bad gateway */ HTTP_STATUS_SERVICE_UNAVAILABLE, /* Service is unavailable */ HTTP_STATUS_GATEWAY_TIMEOUT, /* Gateway connection timed out */ HTTP_STATUS_NOT_SUPPORTED, /* HTTP version not supported */ HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED = 1000, /* User canceled authorization @since CUPS 1.4@ */ HTTP_STATUS_CUPS_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */ HTTP_STATUS_CUPS_WEBIF_DISABLED /* Web interface is disabled @private@ */ # define HTTP_STATUS_MOVED_TEMPORARILY HTTP_STATUS_FOUND /* Renamed in RFC 7231 */ # ifndef _CUPS_NO_DEPRECATED /* Old names for this enumeration */ # define HTTP_ERROR HTTP_STATUS_ERROR # define HTTP_CONTINUE HTTP_STATUS_CONTINUE # define HTTP_SWITCHING_PROTOCOLS HTTP_STATUS_SWITCHING_PROTOCOLS # define HTTP_OK HTTP_STATUS_OK # define HTTP_CREATED HTTP_STATUS_CREATED # define HTTP_ACCEPTED HTTP_STATUS_ACCEPTED # define HTTP_NOT_AUTHORITATIVE HTTP_STATUS_NOT_AUTHORITATIVE # define HTTP_NO_CONTENT HTTP_STATUS_NO_CONTENT # define HTTP_RESET_CONTENT HTTP_STATUS_RESET_CONTENT # define HTTP_PARTIAL_CONTENT HTTP_STATUS_PARTIAL_CONTENT # define HTTP_MULTIPLE_CHOICES HTTP_STATUS_MULTIPLE_CHOICES # define HTTP_MOVED_PERMANENTLY HTTP_STATUS_MOVED_PERMANENTLY # define HTTP_MOVED_TEMPORARILY HTTP_STATUS_MOVED_TEMPORARILY # define HTTP_SEE_OTHER HTTP_STATUS_SEE_OTHER # define HTTP_NOT_MODIFIED HTTP_STATUS_NOT_MODIFIED # define HTTP_USE_PROXY HTTP_STATUS_USE_PROXY # define HTTP_BAD_REQUEST HTTP_STATUS_BAD_REQUEST # define HTTP_UNAUTHORIZED HTTP_STATUS_UNAUTHORIZED # define HTTP_PAYMENT_REQUIRED HTTP_STATUS_PAYMENT_REQUIRED # define HTTP_FORBIDDEN HTTP_STATUS_FORBIDDEN # define HTTP_NOT_FOUND HTTP_STATUS_NOT_FOUND # define HTTP_METHOD_NOT_ALLOWED HTTP_STATUS_METHOD_NOT_ALLOWED # define HTTP_NOT_ACCEPTABLE HTTP_STATUS_NOT_ACCEPTABLE # define HTTP_PROXY_AUTHENTICATION HTTP_STATUS_PROXY_AUTHENTICATION # define HTTP_REQUEST_TIMEOUT HTTP_STATUS_REQUEST_TIMEOUT # define HTTP_CONFLICT HTTP_STATUS_CONFLICT # define HTTP_GONE HTTP_STATUS_GONE # define HTTP_LENGTH_REQUIRED HTTP_STATUS_LENGTH_REQUIRED # define HTTP_PRECONDITION HTTP_STATUS_PRECONDITION # define HTTP_REQUEST_TOO_LARGE HTTP_STATUS_REQUEST_TOO_LARGE # define HTTP_URI_TOO_LONG HTTP_STATUS_URI_TOO_LONG # define HTTP_UNSUPPORTED_MEDIATYPE HTTP_STATUS_UNSUPPORTED_MEDIATYPE # define HTTP_REQUESTED_RANGE HTTP_STATUS_REQUESTED_RANGE # define HTTP_EXPECTATION_FAILED HTTP_STATUS_EXPECTATION_FAILED # define HTTP_UPGRADE_REQUIRED HTTP_STATUS_UPGRADE_REQUIRED # define HTTP_SERVER_ERROR HTTP_STATUS_SERVER_ERROR # define HTTP_NOT_IMPLEMENTED HTTP_STATUS_NOT_IMPLEMENTED # define HTTP_BAD_GATEWAY HTTP_STATUS_BAD_GATEWAY # define HTTP_SERVICE_UNAVAILABLE HTTP_STATUS_SERVICE_UNAVAILABLE # define HTTP_GATEWAY_TIMEOUT HTTP_STATUS_GATEWAY_TIMEOUT # define HTTP_NOT_SUPPORTED HTTP_STATUS_NOT_SUPPORTED # define HTTP_AUTHORIZATION_CANCELED HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED # define HTTP_PKI_ERROR HTTP_STATUS_CUPS_PKI_ERROR # define HTTP_WEBIF_DISABLED HTTP_STATUS_CUPS_WEBIF_DISABLED # endif /* !_CUPS_NO_DEPRECATED */ } http_status_t; typedef enum http_trust_e /**** Level of trust for credentials @since CUPS 2.0/OS 10.10@ */ { HTTP_TRUST_OK = 0, /* Credentials are OK/trusted */ HTTP_TRUST_INVALID, /* Credentials are invalid */ HTTP_TRUST_CHANGED, /* Credentials have changed */ HTTP_TRUST_EXPIRED, /* Credentials are expired */ HTTP_TRUST_RENEWED, /* Credentials have been renewed */ HTTP_TRUST_UNKNOWN, /* Credentials are unknown/new */ } http_trust_t; typedef enum http_uri_status_e /**** URI separation status @since CUPS 1.2@ ****/ { HTTP_URI_STATUS_OVERFLOW = -8, /* URI buffer for httpAssembleURI is too small */ HTTP_URI_STATUS_BAD_ARGUMENTS = -7, /* Bad arguments to function (error) */ HTTP_URI_STATUS_BAD_RESOURCE = -6, /* Bad resource in URI (error) */ HTTP_URI_STATUS_BAD_PORT = -5, /* Bad port number in URI (error) */ HTTP_URI_STATUS_BAD_HOSTNAME = -4, /* Bad hostname in URI (error) */ HTTP_URI_STATUS_BAD_USERNAME = -3, /* Bad username in URI (error) */ HTTP_URI_STATUS_BAD_SCHEME = -2, /* Bad scheme in URI (error) */ HTTP_URI_STATUS_BAD_URI = -1, /* Bad/empty URI (error) */ HTTP_URI_STATUS_OK = 0, /* URI decoded OK */ HTTP_URI_STATUS_MISSING_SCHEME, /* Missing scheme in URI (warning) */ HTTP_URI_STATUS_UNKNOWN_SCHEME, /* Unknown scheme in URI (warning) */ HTTP_URI_STATUS_MISSING_RESOURCE /* Missing resource in URI (warning) */ # ifndef _CUPS_NO_DEPRECATED # define HTTP_URI_OVERFLOW HTTP_URI_STATUS_OVERFLOW # define HTTP_URI_BAD_ARGUMENTS HTTP_URI_STATUS_BAD_ARGUMENTS # define HTTP_URI_BAD_RESOURCE HTTP_URI_STATUS_BAD_RESOURCE # define HTTP_URI_BAD_PORT HTTP_URI_STATUS_BAD_PORT # define HTTP_URI_BAD_HOSTNAME HTTP_URI_STATUS_BAD_HOSTNAME # define HTTP_URI_BAD_USERNAME HTTP_URI_STATUS_BAD_USERNAME # define HTTP_URI_BAD_SCHEME HTTP_URI_STATUS_BAD_SCHEME # define HTTP_URI_BAD_URI HTTP_URI_STATUS_BAD_URI # define HTTP_URI_OK HTTP_URI_STATUS_OK # define HTTP_URI_MISSING_SCHEME HTTP_URI_STATUS_MISSING_SCHEME # define HTTP_URI_UNKNOWN_SCHEME HTTP_URI_STATUS_UNKNOWN_SCHEME # define HTTP_URI_MISSING_RESOURCE HTTP_URI_STATUS_MISSING_RESOURCE # endif /* !_CUPS_NO_DEPRECATED */ } http_uri_status_t; typedef enum http_uri_coding_e /**** URI en/decode flags ****/ { HTTP_URI_CODING_NONE = 0, /* Don't en/decode anything */ HTTP_URI_CODING_USERNAME = 1, /* En/decode the username portion */ HTTP_URI_CODING_HOSTNAME = 2, /* En/decode the hostname portion */ HTTP_URI_CODING_RESOURCE = 4, /* En/decode the resource portion */ HTTP_URI_CODING_MOST = 7, /* En/decode all but the query */ HTTP_URI_CODING_QUERY = 8, /* En/decode the query portion */ HTTP_URI_CODING_ALL = 15, /* En/decode everything */ HTTP_URI_CODING_RFC6874 = 16 /* Use RFC 6874 address format */ } http_uri_coding_t; typedef enum http_version_e /**** HTTP version numbers @exclude all@ ****/ { HTTP_VERSION_0_9 = 9, /* HTTP/0.9 */ HTTP_VERSION_1_0 = 100, /* HTTP/1.0 */ HTTP_VERSION_1_1 = 101 /* HTTP/1.1 */ # ifndef _CUPS_NO_DEPRECATED # define HTTP_0_9 HTTP_VERSION_0_9 # define HTTP_1_0 HTTP_VERSION_1_0 # define HTTP_1_1 HTTP_VERSION_1_1 # endif /* !_CUPS_NO_DEPRECATED */ } http_version_t; typedef union _http_addr_u /**** Socket address union, which **** makes using IPv6 and other **** address types easier and **** more portable. @since CUPS 1.2/macOS 10.5@ ****/ { struct sockaddr addr; /* Base structure for family value */ struct sockaddr_in ipv4; /* IPv4 address */ #ifdef AF_INET6 struct sockaddr_in6 ipv6; /* IPv6 address */ #endif /* AF_INET6 */ #ifdef AF_LOCAL struct sockaddr_un un; /* Domain socket file */ #endif /* AF_LOCAL */ char pad[256]; /* Padding to ensure binary compatibility */ } http_addr_t; typedef struct http_addrlist_s /**** Socket address list, which is **** used to enumerate all of the **** addresses that are associated **** with a hostname. @since CUPS 1.2/macOS 10.5@ **** @exclude all@ ****/ { struct http_addrlist_s *next; /* Pointer to next address in list */ http_addr_t addr; /* Address */ } http_addrlist_t; typedef struct _http_s http_t; /**** HTTP connection type ****/ typedef struct http_credential_s /**** HTTP credential data @since CUPS 1.5/macOS 10.7@ @exclude all@ ****/ { void *data; /* Pointer to credential data */ size_t datalen; /* Credential length */ } http_credential_t; typedef int (*http_timeout_cb_t)(http_t *http, void *user_data); /**** HTTP timeout callback @since CUPS 1.5/macOS 10.7@ ****/ /* * Prototypes... */ extern void httpBlocking(http_t *http, int b) _CUPS_PUBLIC; extern int httpCheck(http_t *http) _CUPS_PUBLIC; extern void httpClearFields(http_t *http) _CUPS_PUBLIC; extern void httpClose(http_t *http) _CUPS_PUBLIC; extern http_t *httpConnect(const char *host, int port) _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead."); extern http_t *httpConnectEncrypt(const char *host, int port, http_encryption_t encryption) _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead."); extern int httpDelete(http_t *http, const char *uri) _CUPS_PUBLIC; extern int httpEncryption(http_t *http, http_encryption_t e) _CUPS_PUBLIC; extern int httpError(http_t *http) _CUPS_PUBLIC; extern void httpFlush(http_t *http) _CUPS_PUBLIC; extern int httpGet(http_t *http, const char *uri) _CUPS_PUBLIC; extern char *httpGets(char *line, int length, http_t *http) _CUPS_PUBLIC; extern const char *httpGetDateString(time_t t) _CUPS_PUBLIC; extern time_t httpGetDateTime(const char *s) _CUPS_PUBLIC; extern const char *httpGetField(http_t *http, http_field_t field) _CUPS_PUBLIC; extern struct hostent *httpGetHostByName(const char *name) _CUPS_PUBLIC; extern char *httpGetSubField(http_t *http, http_field_t field, const char *name, char *value) _CUPS_PUBLIC; extern int httpHead(http_t *http, const char *uri) _CUPS_PUBLIC; extern void httpInitialize(void) _CUPS_PUBLIC; extern int httpOptions(http_t *http, const char *uri) _CUPS_PUBLIC; extern int httpPost(http_t *http, const char *uri) _CUPS_PUBLIC; extern int httpPrintf(http_t *http, const char *format, ...) _CUPS_FORMAT(2, 3) _CUPS_PUBLIC; extern int httpPut(http_t *http, const char *uri) _CUPS_PUBLIC; extern int httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpRead2 instead."); extern int httpReconnect(http_t *http) _CUPS_DEPRECATED_1_6_MSG("Use httpReconnect2 instead."); extern void httpSeparate(const char *uri, char *method, char *username, char *host, int *port, char *resource) _CUPS_DEPRECATED_1_2_MSG("Use httpSeparateURI instead."); extern void httpSetField(http_t *http, http_field_t field, const char *value) _CUPS_PUBLIC; extern const char *httpStatus(http_status_t status) _CUPS_PUBLIC; extern int httpTrace(http_t *http, const char *uri) _CUPS_PUBLIC; extern http_status_t httpUpdate(http_t *http) _CUPS_PUBLIC; extern int httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED_MSG("Use httpWrite2 instead."); extern char *httpEncode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpEncode64_2 instead."); extern char *httpDecode64(char *out, const char *in) _CUPS_DEPRECATED_MSG("Use httpDecode64_2 instead."); extern int httpGetLength(http_t *http) _CUPS_DEPRECATED_1_2_MSG("Use httpGetLength2 instead."); extern char *httpMD5(const char *, const char *, const char *, char [33]) _CUPS_DEPRECATED_MSG("Use cupsDoAuth or cupsHashData instead."); extern char *httpMD5Final(const char *, const char *, const char *, char [33]) _CUPS_DEPRECATED_2_2_MSG("Use cupsDoAuth or cupsHashData instead."); extern char *httpMD5String(const unsigned char *, char [33]) _CUPS_DEPRECATED_2_2_MSG("Use cupsHashString instead."); /**** New in CUPS 1.1.19 ****/ extern void httpClearCookie(http_t *http) _CUPS_API_1_1_19; extern const char *httpGetCookie(http_t *http) _CUPS_API_1_1_19; extern void httpSetCookie(http_t *http, const char *cookie) _CUPS_API_1_1_19; extern int httpWait(http_t *http, int msec) _CUPS_API_1_1_19; /**** New in CUPS 1.1.21 ****/ extern char *httpDecode64_2(char *out, int *outlen, const char *in) _CUPS_API_1_1_21; extern char *httpEncode64_2(char *out, int outlen, const char *in, int inlen) _CUPS_API_1_1_21; extern void httpSeparate2(const char *uri, char *method, int methodlen, char *username, int usernamelen, char *host, int hostlen, int *port, char *resource, int resourcelen) _CUPS_DEPRECATED_1_2_MSG("Use httpSeparateURI instead."); /**** New in CUPS 1.2/macOS 10.5 ****/ extern int httpAddrAny(const http_addr_t *addr) _CUPS_API_1_2; extern http_addrlist_t *httpAddrConnect(http_addrlist_t *addrlist, int *sock) _CUPS_API_1_2; extern int httpAddrEqual(const http_addr_t *addr1, const http_addr_t *addr2) _CUPS_API_1_2; extern void httpAddrFreeList(http_addrlist_t *addrlist) _CUPS_API_1_2; extern http_addrlist_t *httpAddrGetList(const char *hostname, int family, const char *service) _CUPS_API_1_2; extern int httpAddrLength(const http_addr_t *addr) _CUPS_API_1_2; extern int httpAddrLocalhost(const http_addr_t *addr) _CUPS_API_1_2; extern char *httpAddrLookup(const http_addr_t *addr, char *name, int namelen) _CUPS_API_1_2; extern char *httpAddrString(const http_addr_t *addr, char *s, int slen) _CUPS_API_1_2; extern http_uri_status_t httpAssembleURI(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resource) _CUPS_API_1_2; extern http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resourcef, ...) _CUPS_FORMAT(8, 9) _CUPS_API_1_2; extern int httpFlushWrite(http_t *http) _CUPS_API_1_2; extern int httpGetBlocking(http_t *http) _CUPS_API_1_2; extern const char *httpGetDateString2(time_t t, char *s, int slen) _CUPS_API_1_2; extern int httpGetFd(http_t *http) _CUPS_API_1_2; extern const char *httpGetHostname(http_t *http, char *s, int slen) _CUPS_API_1_2; extern off_t httpGetLength2(http_t *http) _CUPS_API_1_2; extern http_status_t httpGetStatus(http_t *http) _CUPS_API_1_2; extern char *httpGetSubField2(http_t *http, http_field_t field, const char *name, char *value, int valuelen) _CUPS_API_1_2; extern ssize_t httpRead2(http_t *http, char *buffer, size_t length) _CUPS_API_1_2; extern http_uri_status_t httpSeparateURI(http_uri_coding_t decoding, const char *uri, char *scheme, int schemelen, char *username, int usernamelen, char *host, int hostlen, int *port, char *resource, int resourcelen) _CUPS_API_1_2; extern void httpSetExpect(http_t *http, http_status_t expect) _CUPS_API_1_2; extern void httpSetLength(http_t *http, size_t length) _CUPS_API_1_2; extern ssize_t httpWrite2(http_t *http, const char *buffer, size_t length) _CUPS_API_1_2; /**** New in CUPS 1.3/macOS 10.5 ****/ extern char *httpGetAuthString(http_t *http) _CUPS_API_1_3; extern void httpSetAuthString(http_t *http, const char *scheme, const char *data) _CUPS_API_1_3; /**** New in CUPS 1.5/macOS 10.7 ****/ extern int httpAddCredential(cups_array_t *credentials, const void *data, size_t datalen) _CUPS_API_1_5; extern int httpCopyCredentials(http_t *http, cups_array_t **credentials) _CUPS_API_1_5; extern void httpFreeCredentials(cups_array_t *certs) _CUPS_API_1_5; extern int httpSetCredentials(http_t *http, cups_array_t *certs) _CUPS_API_1_5; extern void httpSetTimeout(http_t *http, double timeout, http_timeout_cb_t cb, void *user_data) _CUPS_API_1_5; /**** New in CUPS 1.6/macOS 10.8 ****/ extern http_addrlist_t *httpAddrConnect2(http_addrlist_t *addrlist, int *sock, int msec, int *cancel) _CUPS_API_1_6; extern http_state_t httpGetState(http_t *http) _CUPS_API_1_6; extern http_version_t httpGetVersion(http_t *http) _CUPS_API_1_6; extern int httpReconnect2(http_t *http, int msec, int *cancel) _CUPS_API_1_6; /**** New in CUPS 1.7/macOS 10.9 ****/ extern http_t *httpAcceptConnection(int fd, int blocking) _CUPS_API_1_7; extern http_addrlist_t *httpAddrCopyList(http_addrlist_t *src) _CUPS_API_1_7; extern int httpAddrListen(http_addr_t *addr, int port) _CUPS_API_1_7; extern int httpAddrPort(http_addr_t *addr) _CUPS_API_1_7; extern char *httpAssembleUUID(const char *server, int port, const char *name, int number, char *buffer, size_t bufsize) _CUPS_API_1_7; extern http_t *httpConnect2(const char *host, int port, http_addrlist_t *addrlist, int family, http_encryption_t encryption, int blocking, int msec, int *cancel) _CUPS_API_1_7; extern const char *httpGetContentEncoding(http_t *http) _CUPS_API_1_7; extern http_status_t httpGetExpect(http_t *http) _CUPS_API_1_7; extern ssize_t httpPeek(http_t *http, char *buffer, size_t length) _CUPS_API_1_7; extern http_state_t httpReadRequest(http_t *http, char *resource, size_t resourcelen) _CUPS_API_1_7; extern void httpSetDefaultField(http_t *http, http_field_t field, const char *value) _CUPS_API_1_7; extern http_state_t httpWriteResponse(http_t *http, http_status_t status) _CUPS_API_1_7; /* New in CUPS 2.0/macOS 10.10 */ extern int httpAddrClose(http_addr_t *addr, int fd) _CUPS_API_2_0; extern int httpAddrFamily(http_addr_t *addr) _CUPS_API_2_0; extern int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2) _CUPS_API_2_0; extern int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name); extern time_t httpCredentialsGetExpiration(cups_array_t *credentials) _CUPS_API_2_0; extern http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name) _CUPS_API_2_0; extern size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize) _CUPS_API_2_0; extern http_field_t httpFieldValue(const char *name) _CUPS_API_2_0; extern time_t httpGetActivity(http_t *http) _CUPS_API_2_0; extern http_addr_t *httpGetAddress(http_t *http) _CUPS_API_2_0; extern http_encryption_t httpGetEncryption(http_t *http) _CUPS_API_2_0; extern http_keepalive_t httpGetKeepAlive(http_t *http) _CUPS_API_2_0; extern size_t httpGetPending(http_t *http) _CUPS_API_2_0; extern size_t httpGetReady(http_t *http) _CUPS_API_2_0; extern size_t httpGetRemaining(http_t *http) _CUPS_API_2_0; extern int httpIsChunked(http_t *http) _CUPS_API_2_0; extern int httpIsEncrypted(http_t *http) _CUPS_API_2_0; extern int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name) _CUPS_API_2_0; extern const char *httpResolveHostname(http_t *http, char *buffer, size_t bufsize) _CUPS_API_2_0; extern int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name) _CUPS_API_2_0; extern void httpSetKeepAlive(http_t *http, http_keepalive_t keep_alive) _CUPS_API_2_0; extern void httpShutdown(http_t *http) _CUPS_API_2_0; extern const char *httpStateString(http_state_t state) _CUPS_API_2_0; extern const char *httpURIStatusString(http_uri_status_t status) _CUPS_API_2_0; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_HTTP_H_ */ cups-2.3.1/cups/ppd-conflicts.c000664 000765 000024 00000101116 13574721672 016462 0ustar00mikestaff000000 000000 /* * Option conflict management routines for CUPS. * * Copyright 2007-2018 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * Local constants... */ enum { _PPD_OPTION_CONSTRAINTS, _PPD_INSTALLABLE_CONSTRAINTS, _PPD_ALL_CONSTRAINTS }; /* * Local functions... */ static int ppd_is_installable(ppd_group_t *installable, const char *option); static void ppd_load_constraints(ppd_file_t *ppd); static cups_array_t *ppd_test_constraints(ppd_file_t *ppd, const char *option, const char *choice, int num_options, cups_option_t *options, int which); /* * 'cupsGetConflicts()' - Get a list of conflicting options in a marked PPD. * * This function gets a list of options that would conflict if "option" and * "choice" were marked in the PPD. You would typically call this function * after marking the currently selected options in the PPD in order to * determine whether a new option selection would cause a conflict. * * The number of conflicting options are returned with "options" pointing to * the conflicting options. The returned option array must be freed using * @link cupsFreeOptions@. * * @since CUPS 1.4/macOS 10.6@ */ int /* O - Number of conflicting options */ cupsGetConflicts( ppd_file_t *ppd, /* I - PPD file */ const char *option, /* I - Option to test */ const char *choice, /* I - Choice to test */ cups_option_t **options) /* O - Conflicting options */ { int i, /* Looping var */ num_options; /* Number of conflicting options */ cups_array_t *active; /* Active conflicts */ _ppd_cups_uiconsts_t *c; /* Current constraints */ _ppd_cups_uiconst_t *cptr; /* Current constraint */ ppd_choice_t *marked; /* Marked choice */ /* * Range check input... */ if (options) *options = NULL; if (!ppd || !option || !choice || !options) return (0); /* * Test for conflicts... */ active = ppd_test_constraints(ppd, option, choice, 0, NULL, _PPD_ALL_CONSTRAINTS); /* * Loop through all of the UI constraints and add any options that conflict... */ for (num_options = 0, c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active); c; c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) { for (i = c->num_constraints, cptr = c->constraints; i > 0; i --, cptr ++) if (_cups_strcasecmp(cptr->option->keyword, option)) { if (cptr->choice) num_options = cupsAddOption(cptr->option->keyword, cptr->choice->choice, num_options, options); else if ((marked = ppdFindMarkedChoice(ppd, cptr->option->keyword)) != NULL) num_options = cupsAddOption(cptr->option->keyword, marked->choice, num_options, options); } } cupsArrayDelete(active); return (num_options); } /* * 'cupsResolveConflicts()' - Resolve conflicts in a marked PPD. * * This function attempts to resolve any conflicts in a marked PPD, returning * a list of option changes that are required to resolve them. On input, * "num_options" and "options" contain any pending option changes that have * not yet been marked, while "option" and "choice" contain the most recent * selection which may or may not be in "num_options" or "options". * * On successful return, "num_options" and "options" are updated to contain * "option" and "choice" along with any changes required to resolve conflicts * specified in the PPD file and 1 is returned. * * If option conflicts cannot be resolved, "num_options" and "options" are not * changed and 0 is returned. * * When resolving conflicts, @code cupsResolveConflicts@ does not consider * changes to the current page size (@code media@, @code PageSize@, and * @code PageRegion@) or to the most recent option specified in "option". * Thus, if the only way to resolve a conflict is to change the page size * or the option the user most recently changed, @code cupsResolveConflicts@ * will return 0 to indicate it was unable to resolve the conflicts. * * The @code cupsResolveConflicts@ function uses one of two sources of option * constraint information. The preferred constraint information is defined by * @code cupsUIConstraints@ and @code cupsUIResolver@ attributes - in this * case, the PPD file provides constraint resolution actions. * * The backup constraint information is defined by the * @code UIConstraints@ and @code NonUIConstraints@ attributes. These * constraints are resolved algorithmically by first selecting the default * choice for the conflicting option, then iterating over all possible choices * until a non-conflicting option choice is found. * * @since CUPS 1.4/macOS 10.6@ */ int /* O - 1 on success, 0 on failure */ cupsResolveConflicts( ppd_file_t *ppd, /* I - PPD file */ const char *option, /* I - Newly selected option or @code NULL@ for none */ const char *choice, /* I - Newly selected choice or @code NULL@ for none */ int *num_options, /* IO - Number of additional selected options */ cups_option_t **options) /* IO - Additional selected options */ { int i, /* Looping var */ tries, /* Number of tries */ num_newopts; /* Number of new options */ cups_option_t *newopts; /* New options */ cups_array_t *active = NULL, /* Active constraints */ *pass, /* Resolvers for this pass */ *resolvers, /* Resolvers we have used */ *test; /* Test array for conflicts */ _ppd_cups_uiconsts_t *consts; /* Current constraints */ _ppd_cups_uiconst_t *constptr; /* Current constraint */ ppd_attr_t *resolver; /* Current resolver */ const char *resval; /* Pointer into resolver value */ char resoption[PPD_MAX_NAME], /* Current resolver option */ reschoice[PPD_MAX_NAME], /* Current resolver choice */ *resptr, /* Pointer into option/choice */ firstpage[255]; /* AP_FIRSTPAGE_Keyword string */ const char *value; /* Selected option value */ int changed; /* Did we change anything? */ ppd_choice_t *marked; /* Marked choice */ /* * Range check input... */ if (!ppd || !num_options || !options || (option == NULL) != (choice == NULL)) return (0); /* * Build a shadow option array... */ num_newopts = 0; newopts = NULL; for (i = 0; i < *num_options; i ++) num_newopts = cupsAddOption((*options)[i].name, (*options)[i].value, num_newopts, &newopts); if (option && _cups_strcasecmp(option, "Collate")) num_newopts = cupsAddOption(option, choice, num_newopts, &newopts); /* * Loop until we have no conflicts... */ cupsArraySave(ppd->sorted_attrs); resolvers = NULL; pass = cupsArrayNew((cups_array_func_t)_cups_strcasecmp, NULL); tries = 0; while (tries < 100 && (active = ppd_test_constraints(ppd, NULL, NULL, num_newopts, newopts, _PPD_ALL_CONSTRAINTS)) != NULL) { tries ++; if (!resolvers) resolvers = cupsArrayNew((cups_array_func_t)_cups_strcasecmp, NULL); for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active), changed = 0; consts; consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) { if (consts->resolver[0]) { /* * Look up the resolver... */ if (cupsArrayFind(pass, consts->resolver)) continue; /* Already applied this resolver... */ if (cupsArrayFind(resolvers, consts->resolver)) { /* * Resolver loop! */ DEBUG_printf(("1cupsResolveConflicts: Resolver loop with %s!", consts->resolver)); goto error; } if ((resolver = ppdFindAttr(ppd, "cupsUIResolver", consts->resolver)) == NULL) { DEBUG_printf(("1cupsResolveConflicts: Resolver %s not found!", consts->resolver)); goto error; } if (!resolver->value) { DEBUG_printf(("1cupsResolveConflicts: Resolver %s has no value!", consts->resolver)); goto error; } /* * Add the options from the resolver... */ cupsArrayAdd(pass, consts->resolver); cupsArrayAdd(resolvers, consts->resolver); for (resval = resolver->value; *resval && !changed;) { while (_cups_isspace(*resval)) resval ++; if (*resval != '*') break; for (resval ++, resptr = resoption; *resval && !_cups_isspace(*resval); resval ++) if (resptr < (resoption + sizeof(resoption) - 1)) *resptr++ = *resval; *resptr = '\0'; while (_cups_isspace(*resval)) resval ++; for (resptr = reschoice; *resval && !_cups_isspace(*resval); resval ++) if (resptr < (reschoice + sizeof(reschoice) - 1)) *resptr++ = *resval; *resptr = '\0'; if (!resoption[0] || !reschoice[0]) break; /* * Is this the option we are changing? */ snprintf(firstpage, sizeof(firstpage), "AP_FIRSTPAGE_%s", resoption); if (option && (!_cups_strcasecmp(resoption, option) || !_cups_strcasecmp(firstpage, option) || (!_cups_strcasecmp(option, "PageSize") && !_cups_strcasecmp(resoption, "PageRegion")) || (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") && !_cups_strcasecmp(resoption, "PageSize")) || (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") && !_cups_strcasecmp(resoption, "PageRegion")) || (!_cups_strcasecmp(option, "PageRegion") && !_cups_strcasecmp(resoption, "PageSize")) || (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion") && !_cups_strcasecmp(resoption, "PageSize")) || (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion") && !_cups_strcasecmp(resoption, "PageRegion")))) continue; /* * Try this choice... */ if ((test = ppd_test_constraints(ppd, resoption, reschoice, num_newopts, newopts, _PPD_ALL_CONSTRAINTS)) == NULL) { /* * That worked... */ changed = 1; } else cupsArrayDelete(test); /* * Add the option/choice from the resolver regardless of whether it * worked; this makes sure that we can cascade several changes to * make things resolve... */ num_newopts = cupsAddOption(resoption, reschoice, num_newopts, &newopts); } } else { /* * Try resolving by choosing the default values for non-installable * options, then by iterating through the possible choices... */ int j; /* Looping var */ ppd_choice_t *cptr; /* Current choice */ ppd_size_t *size; /* Current page size */ for (i = consts->num_constraints, constptr = consts->constraints; i > 0 && !changed; i --, constptr ++) { /* * Can't resolve by changing an installable option... */ if (constptr->installable) continue; /* * Is this the option we are changing? */ if (option && (!_cups_strcasecmp(constptr->option->keyword, option) || (!_cups_strcasecmp(option, "PageSize") && !_cups_strcasecmp(constptr->option->keyword, "PageRegion")) || (!_cups_strcasecmp(option, "PageRegion") && !_cups_strcasecmp(constptr->option->keyword, "PageSize")))) continue; /* * Get the current option choice... */ if ((value = cupsGetOption(constptr->option->keyword, num_newopts, newopts)) == NULL) { if (!_cups_strcasecmp(constptr->option->keyword, "PageSize") || !_cups_strcasecmp(constptr->option->keyword, "PageRegion")) { if ((value = cupsGetOption("PageSize", num_newopts, newopts)) == NULL) value = cupsGetOption("PageRegion", num_newopts, newopts); if (!value) { if ((size = ppdPageSize(ppd, NULL)) != NULL) value = size->name; else value = ""; } } else { marked = ppdFindMarkedChoice(ppd, constptr->option->keyword); value = marked ? marked->choice : ""; } } if (!_cups_strncasecmp(value, "Custom.", 7)) value = "Custom"; /* * Try the default choice... */ test = NULL; if (_cups_strcasecmp(value, constptr->option->defchoice) && (test = ppd_test_constraints(ppd, constptr->option->keyword, constptr->option->defchoice, num_newopts, newopts, _PPD_OPTION_CONSTRAINTS)) == NULL) { /* * That worked... */ num_newopts = cupsAddOption(constptr->option->keyword, constptr->option->defchoice, num_newopts, &newopts); changed = 1; } else { /* * Try each choice instead... */ for (j = constptr->option->num_choices, cptr = constptr->option->choices; j > 0; j --, cptr ++) { cupsArrayDelete(test); test = NULL; if (_cups_strcasecmp(value, cptr->choice) && _cups_strcasecmp(constptr->option->defchoice, cptr->choice) && _cups_strcasecmp("Custom", cptr->choice) && (test = ppd_test_constraints(ppd, constptr->option->keyword, cptr->choice, num_newopts, newopts, _PPD_OPTION_CONSTRAINTS)) == NULL) { /* * This choice works... */ num_newopts = cupsAddOption(constptr->option->keyword, cptr->choice, num_newopts, &newopts); changed = 1; break; } } cupsArrayDelete(test); } } } } if (!changed) { DEBUG_puts("1cupsResolveConflicts: Unable to automatically resolve " "constraint!"); goto error; } cupsArrayClear(pass); cupsArrayDelete(active); active = NULL; } if (tries >= 100) goto error; /* * Free the caller's option array... */ cupsFreeOptions(*num_options, *options); /* * If Collate is the option we are testing, add it here. Otherwise, remove * any Collate option from the resolve list since the filters automatically * handle manual collation... */ if (option && !_cups_strcasecmp(option, "Collate")) num_newopts = cupsAddOption(option, choice, num_newopts, &newopts); else num_newopts = cupsRemoveOption("Collate", num_newopts, &newopts); /* * Return the new list of options to the caller... */ *num_options = num_newopts; *options = newopts; cupsArrayDelete(pass); cupsArrayDelete(resolvers); cupsArrayRestore(ppd->sorted_attrs); DEBUG_printf(("1cupsResolveConflicts: Returning %d options:", num_newopts)); #ifdef DEBUG for (i = 0; i < num_newopts; i ++) DEBUG_printf(("1cupsResolveConflicts: options[%d]: %s=%s", i, newopts[i].name, newopts[i].value)); #endif /* DEBUG */ return (1); /* * If we get here, we failed to resolve... */ error: cupsFreeOptions(num_newopts, newopts); cupsArrayDelete(active); cupsArrayDelete(pass); cupsArrayDelete(resolvers); cupsArrayRestore(ppd->sorted_attrs); DEBUG_puts("1cupsResolveConflicts: Unable to resolve conflicts!"); return (0); } /* * 'ppdConflicts()' - Check to see if there are any conflicts among the * marked option choices. * * The returned value is the same as returned by @link ppdMarkOption@. */ int /* O - Number of conflicts found */ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */ { int i, /* Looping variable */ conflicts; /* Number of conflicts */ cups_array_t *active; /* Active conflicts */ _ppd_cups_uiconsts_t *c; /* Current constraints */ _ppd_cups_uiconst_t *cptr; /* Current constraint */ ppd_option_t *o; /* Current option */ if (!ppd) return (0); /* * Clear all conflicts... */ cupsArraySave(ppd->options); for (o = ppdFirstOption(ppd); o; o = ppdNextOption(ppd)) o->conflicted = 0; cupsArrayRestore(ppd->options); /* * Test for conflicts... */ active = ppd_test_constraints(ppd, NULL, NULL, 0, NULL, _PPD_ALL_CONSTRAINTS); conflicts = cupsArrayCount(active); /* * Loop through all of the UI constraints and flag any options * that conflict... */ for (c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active); c; c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) { for (i = c->num_constraints, cptr = c->constraints; i > 0; i --, cptr ++) cptr->option->conflicted = 1; } cupsArrayDelete(active); /* * Return the number of conflicts found... */ return (conflicts); } /* * 'ppdInstallableConflict()' - Test whether an option choice conflicts with * an installable option. * * This function tests whether a particular option choice is available based * on constraints against options in the "InstallableOptions" group. * * @since CUPS 1.4/macOS 10.6@ */ int /* O - 1 if conflicting, 0 if not conflicting */ ppdInstallableConflict( ppd_file_t *ppd, /* I - PPD file */ const char *option, /* I - Option */ const char *choice) /* I - Choice */ { cups_array_t *active; /* Active conflicts */ DEBUG_printf(("2ppdInstallableConflict(ppd=%p, option=\"%s\", choice=\"%s\")", ppd, option, choice)); /* * Range check input... */ if (!ppd || !option || !choice) return (0); /* * Test constraints using the new option... */ active = ppd_test_constraints(ppd, option, choice, 0, NULL, _PPD_INSTALLABLE_CONSTRAINTS); cupsArrayDelete(active); return (active != NULL); } /* * 'ppd_is_installable()' - Determine whether an option is in the * InstallableOptions group. */ static int /* O - 1 if installable, 0 if normal */ ppd_is_installable( ppd_group_t *installable, /* I - InstallableOptions group */ const char *name) /* I - Option name */ { if (installable) { int i; /* Looping var */ ppd_option_t *option; /* Current option */ for (i = installable->num_options, option = installable->options; i > 0; i --, option ++) if (!_cups_strcasecmp(option->keyword, name)) return (1); } return (0); } /* * 'ppd_load_constraints()' - Load constraints from a PPD file. */ static void ppd_load_constraints(ppd_file_t *ppd) /* I - PPD file */ { int i; /* Looping var */ ppd_const_t *oldconst; /* Current UIConstraints data */ ppd_attr_t *constattr; /* Current cupsUIConstraints attribute */ _ppd_cups_uiconsts_t *consts; /* Current cupsUIConstraints data */ _ppd_cups_uiconst_t *constptr; /* Current constraint */ ppd_group_t *installable; /* Installable options group */ const char *vptr; /* Pointer into constraint value */ char option[PPD_MAX_NAME], /* Option name/MainKeyword */ choice[PPD_MAX_NAME], /* Choice/OptionKeyword */ *ptr; /* Pointer into option or choice */ DEBUG_printf(("7ppd_load_constraints(ppd=%p)", ppd)); /* * Create an array to hold the constraint data... */ ppd->cups_uiconstraints = cupsArrayNew(NULL, NULL); /* * Find the installable options group if it exists... */ for (i = ppd->num_groups, installable = ppd->groups; i > 0; i --, installable ++) if (!_cups_strcasecmp(installable->name, "InstallableOptions")) break; if (i <= 0) installable = NULL; /* * Load old-style [Non]UIConstraints data... */ for (i = ppd->num_consts, oldconst = ppd->consts; i > 0; i --, oldconst ++) { /* * Weed out nearby duplicates, since the PPD spec requires that you * define both "*Foo foo *Bar bar" and "*Bar bar *Foo foo"... */ if (i > 1 && !_cups_strcasecmp(oldconst[0].option1, oldconst[1].option2) && !_cups_strcasecmp(oldconst[0].choice1, oldconst[1].choice2) && !_cups_strcasecmp(oldconst[0].option2, oldconst[1].option1) && !_cups_strcasecmp(oldconst[0].choice2, oldconst[1].choice1)) continue; /* * Allocate memory... */ if ((consts = calloc(1, sizeof(_ppd_cups_uiconsts_t))) == NULL) { DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " "UIConstraints!"); return; } if ((constptr = calloc(2, sizeof(_ppd_cups_uiconst_t))) == NULL) { free(consts); DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " "UIConstraints!"); return; } /* * Fill in the information... */ consts->num_constraints = 2; consts->constraints = constptr; if (!_cups_strncasecmp(oldconst->option1, "Custom", 6) && !_cups_strcasecmp(oldconst->choice1, "True")) { constptr[0].option = ppdFindOption(ppd, oldconst->option1 + 6); constptr[0].choice = ppdFindChoice(constptr[0].option, "Custom"); constptr[0].installable = 0; } else { constptr[0].option = ppdFindOption(ppd, oldconst->option1); constptr[0].choice = ppdFindChoice(constptr[0].option, oldconst->choice1); constptr[0].installable = ppd_is_installable(installable, oldconst->option1); } if (!constptr[0].option || (!constptr[0].choice && oldconst->choice1[0])) { DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", oldconst->option1, oldconst->choice1)); free(consts->constraints); free(consts); continue; } if (!_cups_strncasecmp(oldconst->option2, "Custom", 6) && !_cups_strcasecmp(oldconst->choice2, "True")) { constptr[1].option = ppdFindOption(ppd, oldconst->option2 + 6); constptr[1].choice = ppdFindChoice(constptr[1].option, "Custom"); constptr[1].installable = 0; } else { constptr[1].option = ppdFindOption(ppd, oldconst->option2); constptr[1].choice = ppdFindChoice(constptr[1].option, oldconst->choice2); constptr[1].installable = ppd_is_installable(installable, oldconst->option2); } if (!constptr[1].option || (!constptr[1].choice && oldconst->choice2[0])) { DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", oldconst->option2, oldconst->choice2)); free(consts->constraints); free(consts); continue; } consts->installable = constptr[0].installable || constptr[1].installable; /* * Add it to the constraints array... */ cupsArrayAdd(ppd->cups_uiconstraints, consts); } /* * Then load new-style constraints... */ for (constattr = ppdFindAttr(ppd, "cupsUIConstraints", NULL); constattr; constattr = ppdFindNextAttr(ppd, "cupsUIConstraints", NULL)) { if (!constattr->value) { DEBUG_puts("8ppd_load_constraints: Bad cupsUIConstraints value!"); continue; } for (i = 0, vptr = strchr(constattr->value, '*'); vptr; i ++, vptr = strchr(vptr + 1, '*')); if (i == 0) { DEBUG_puts("8ppd_load_constraints: Bad cupsUIConstraints value!"); continue; } if ((consts = calloc(1, sizeof(_ppd_cups_uiconsts_t))) == NULL) { DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " "cupsUIConstraints!"); return; } if ((constptr = calloc((size_t)i, sizeof(_ppd_cups_uiconst_t))) == NULL) { free(consts); DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " "cupsUIConstraints!"); return; } consts->num_constraints = i; consts->constraints = constptr; strlcpy(consts->resolver, constattr->spec, sizeof(consts->resolver)); for (i = 0, vptr = strchr(constattr->value, '*'); vptr; i ++, vptr = strchr(vptr, '*'), constptr ++) { /* * Extract "*Option Choice" or just "*Option"... */ for (vptr ++, ptr = option; *vptr && !_cups_isspace(*vptr); vptr ++) if (ptr < (option + sizeof(option) - 1)) *ptr++ = *vptr; *ptr = '\0'; while (_cups_isspace(*vptr)) vptr ++; if (*vptr == '*') choice[0] = '\0'; else { for (ptr = choice; *vptr && !_cups_isspace(*vptr); vptr ++) if (ptr < (choice + sizeof(choice) - 1)) *ptr++ = *vptr; *ptr = '\0'; } if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True")) { _cups_strcpy(option, option + 6); strlcpy(choice, "Custom", sizeof(choice)); } constptr->option = ppdFindOption(ppd, option); constptr->choice = ppdFindChoice(constptr->option, choice); constptr->installable = ppd_is_installable(installable, option); consts->installable |= constptr->installable; if (!constptr->option || (!constptr->choice && choice[0])) { DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", option, choice)); break; } } if (!vptr) cupsArrayAdd(ppd->cups_uiconstraints, consts); else { free(consts->constraints); free(consts); } } } /* * 'ppd_test_constraints()' - See if any constraints are active. */ static cups_array_t * /* O - Array of active constraints */ ppd_test_constraints( ppd_file_t *ppd, /* I - PPD file */ const char *option, /* I - Current option */ const char *choice, /* I - Current choice */ int num_options, /* I - Number of additional options */ cups_option_t *options, /* I - Additional options */ int which) /* I - Which constraints to test */ { int i; /* Looping var */ _ppd_cups_uiconsts_t *consts; /* Current constraints */ _ppd_cups_uiconst_t *constptr; /* Current constraint */ ppd_choice_t key, /* Search key */ *marked; /* Marked choice */ cups_array_t *active = NULL; /* Active constraints */ const char *value, /* Current value */ *firstvalue; /* AP_FIRSTPAGE_Keyword value */ char firstpage[255]; /* AP_FIRSTPAGE_Keyword string */ DEBUG_printf(("7ppd_test_constraints(ppd=%p, option=\"%s\", choice=\"%s\", " "num_options=%d, options=%p, which=%d)", ppd, option, choice, num_options, options, which)); if (!ppd->cups_uiconstraints) ppd_load_constraints(ppd); DEBUG_printf(("9ppd_test_constraints: %d constraints!", cupsArrayCount(ppd->cups_uiconstraints))); cupsArraySave(ppd->marked); for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(ppd->cups_uiconstraints); consts; consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(ppd->cups_uiconstraints)) { DEBUG_printf(("9ppd_test_constraints: installable=%d, resolver=\"%s\", " "num_constraints=%d option1=\"%s\", choice1=\"%s\", " "option2=\"%s\", choice2=\"%s\", ...", consts->installable, consts->resolver, consts->num_constraints, consts->constraints[0].option->keyword, consts->constraints[0].choice ? consts->constraints[0].choice->choice : "", consts->constraints[1].option->keyword, consts->constraints[1].choice ? consts->constraints[1].choice->choice : "")); if (consts->installable && which < _PPD_INSTALLABLE_CONSTRAINTS) continue; /* Skip installable option constraint */ if (!consts->installable && which == _PPD_INSTALLABLE_CONSTRAINTS) continue; /* Skip non-installable option constraint */ if ((which == _PPD_OPTION_CONSTRAINTS || which == _PPD_INSTALLABLE_CONSTRAINTS) && option) { /* * Skip constraints that do not involve the current option... */ for (i = consts->num_constraints, constptr = consts->constraints; i > 0; i --, constptr ++) { if (!_cups_strcasecmp(constptr->option->keyword, option)) break; if (!_cups_strncasecmp(option, "AP_FIRSTPAGE_", 13) && !_cups_strcasecmp(constptr->option->keyword, option + 13)) break; } if (!i) continue; } DEBUG_puts("9ppd_test_constraints: Testing..."); for (i = consts->num_constraints, constptr = consts->constraints; i > 0; i --, constptr ++) { DEBUG_printf(("9ppd_test_constraints: %s=%s?", constptr->option->keyword, constptr->choice ? constptr->choice->choice : "")); if (constptr->choice && (!_cups_strcasecmp(constptr->option->keyword, "PageSize") || !_cups_strcasecmp(constptr->option->keyword, "PageRegion"))) { /* * PageSize and PageRegion are used depending on the selected input slot * and manual feed mode. Validate against the selected page size instead * of an individual option... */ if (option && choice && (!_cups_strcasecmp(option, "PageSize") || !_cups_strcasecmp(option, "PageRegion"))) { value = choice; } else if ((value = cupsGetOption("PageSize", num_options, options)) == NULL) if ((value = cupsGetOption("PageRegion", num_options, options)) == NULL) if ((value = cupsGetOption("media", num_options, options)) == NULL) { ppd_size_t *size = ppdPageSize(ppd, NULL); if (size) value = size->name; } if (value && !_cups_strncasecmp(value, "Custom.", 7)) value = "Custom"; if (option && choice && (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") || !_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion"))) { firstvalue = choice; } else if ((firstvalue = cupsGetOption("AP_FIRSTPAGE_PageSize", num_options, options)) == NULL) firstvalue = cupsGetOption("AP_FIRSTPAGE_PageRegion", num_options, options); if (firstvalue && !_cups_strncasecmp(firstvalue, "Custom.", 7)) firstvalue = "Custom"; if ((!value || _cups_strcasecmp(value, constptr->choice->choice)) && (!firstvalue || _cups_strcasecmp(firstvalue, constptr->choice->choice))) { DEBUG_puts("9ppd_test_constraints: NO"); break; } } else if (constptr->choice) { /* * Compare against the constrained choice... */ if (option && choice && !_cups_strcasecmp(option, constptr->option->keyword)) { if (!_cups_strncasecmp(choice, "Custom.", 7)) value = "Custom"; else value = choice; } else if ((value = cupsGetOption(constptr->option->keyword, num_options, options)) != NULL) { if (!_cups_strncasecmp(value, "Custom.", 7)) value = "Custom"; } else if (constptr->choice->marked) value = constptr->choice->choice; else value = NULL; /* * Now check AP_FIRSTPAGE_option... */ snprintf(firstpage, sizeof(firstpage), "AP_FIRSTPAGE_%s", constptr->option->keyword); if (option && choice && !_cups_strcasecmp(option, firstpage)) { if (!_cups_strncasecmp(choice, "Custom.", 7)) firstvalue = "Custom"; else firstvalue = choice; } else if ((firstvalue = cupsGetOption(firstpage, num_options, options)) != NULL) { if (!_cups_strncasecmp(firstvalue, "Custom.", 7)) firstvalue = "Custom"; } else firstvalue = NULL; DEBUG_printf(("9ppd_test_constraints: value=%s, firstvalue=%s", value, firstvalue)); if ((!value || _cups_strcasecmp(value, constptr->choice->choice)) && (!firstvalue || _cups_strcasecmp(firstvalue, constptr->choice->choice))) { DEBUG_puts("9ppd_test_constraints: NO"); break; } } else if (option && choice && !_cups_strcasecmp(option, constptr->option->keyword)) { if (!_cups_strcasecmp(choice, "None") || !_cups_strcasecmp(choice, "Off") || !_cups_strcasecmp(choice, "False")) { DEBUG_puts("9ppd_test_constraints: NO"); break; } } else if ((value = cupsGetOption(constptr->option->keyword, num_options, options)) != NULL) { if (!_cups_strcasecmp(value, "None") || !_cups_strcasecmp(value, "Off") || !_cups_strcasecmp(value, "False")) { DEBUG_puts("9ppd_test_constraints: NO"); break; } } else { key.option = constptr->option; if ((marked = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) == NULL || (!_cups_strcasecmp(marked->choice, "None") || !_cups_strcasecmp(marked->choice, "Off") || !_cups_strcasecmp(marked->choice, "False"))) { DEBUG_puts("9ppd_test_constraints: NO"); break; } } } if (i <= 0) { if (!active) active = cupsArrayNew(NULL, NULL); cupsArrayAdd(active, consts); DEBUG_puts("9ppd_test_constraints: Added..."); } } cupsArrayRestore(ppd->marked); DEBUG_printf(("8ppd_test_constraints: Found %d active constraints!", cupsArrayCount(active))); return (active); } cups-2.3.1/cups/thread-private.h000664 000765 000024 00000006661 13574721672 016652 0ustar00mikestaff000000 000000 /* * Private threading definitions for CUPS. * * Copyright 2009-2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_THREAD_PRIVATE_H_ # define _CUPS_THREAD_PRIVATE_H_ /* * Include necessary headers... */ # include "config.h" # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ # ifdef HAVE_PTHREAD_H /* POSIX threading */ # include typedef void *(*_cups_thread_func_t)(void *arg); typedef pthread_t _cups_thread_t; typedef pthread_cond_t _cups_cond_t; typedef pthread_mutex_t _cups_mutex_t; typedef pthread_rwlock_t _cups_rwlock_t; typedef pthread_key_t _cups_threadkey_t; # define _CUPS_COND_INITIALIZER PTHREAD_COND_INITIALIZER # define _CUPS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER # define _CUPS_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER # define _CUPS_THREADKEY_INITIALIZER 0 # define _cupsThreadGetData(k) pthread_getspecific(k) # define _cupsThreadSetData(k,p) pthread_setspecific(k,p) # elif defined(_WIN32) /* Windows threading */ # include # include typedef void *(__stdcall *_cups_thread_func_t)(void *arg); typedef int _cups_thread_t; typedef char _cups_cond_t; /* TODO: Implement Win32 conditional */ typedef struct _cups_mutex_s { int m_init; /* Flag for on-demand initialization */ CRITICAL_SECTION m_criticalSection; /* Win32 Critical Section */ } _cups_mutex_t; typedef _cups_mutex_t _cups_rwlock_t; /* TODO: Implement Win32 reader/writer lock */ typedef DWORD _cups_threadkey_t; # define _CUPS_COND_INITIALIZER 0 # define _CUPS_MUTEX_INITIALIZER { 0, 0 } # define _CUPS_RWLOCK_INITIALIZER { 0, 0 } # define _CUPS_THREADKEY_INITIALIZER 0 # define _cupsThreadGetData(k) TlsGetValue(k) # define _cupsThreadSetData(k,p) TlsSetValue(k,p) # else /* No threading */ typedef void *(*_cups_thread_func_t)(void *arg); typedef int _cups_thread_t; typedef char _cups_cond_t; typedef char _cups_mutex_t; typedef char _cups_rwlock_t; typedef void *_cups_threadkey_t; # define _CUPS_COND_INITIALIZER 0 # define _CUPS_MUTEX_INITIALIZER 0 # define _CUPS_RWLOCK_INITIALIZER 0 # define _CUPS_THREADKEY_INITIALIZER (void *)0 # define _cupsThreadGetData(k) k # define _cupsThreadSetData(k,p) k=p # endif /* HAVE_PTHREAD_H */ /* * Functions... */ extern void _cupsCondBroadcast(_cups_cond_t *cond) _CUPS_PRIVATE; extern void _cupsCondInit(_cups_cond_t *cond) _CUPS_PRIVATE; extern void _cupsCondWait(_cups_cond_t *cond, _cups_mutex_t *mutex, double timeout) _CUPS_PRIVATE; extern void _cupsMutexInit(_cups_mutex_t *mutex) _CUPS_PRIVATE; extern void _cupsMutexLock(_cups_mutex_t *mutex) _CUPS_PRIVATE; extern void _cupsMutexUnlock(_cups_mutex_t *mutex) _CUPS_PRIVATE; extern void _cupsRWInit(_cups_rwlock_t *rwlock) _CUPS_PRIVATE; extern void _cupsRWLockRead(_cups_rwlock_t *rwlock) _CUPS_PRIVATE; extern void _cupsRWLockWrite(_cups_rwlock_t *rwlock) _CUPS_PRIVATE; extern void _cupsRWUnlock(_cups_rwlock_t *rwlock) _CUPS_PRIVATE; extern void _cupsThreadCancel(_cups_thread_t thread) _CUPS_PRIVATE; extern _cups_thread_t _cupsThreadCreate(_cups_thread_func_t func, void *arg) _CUPS_PRIVATE; extern void _cupsThreadDetach(_cups_thread_t thread) _CUPS_PRIVATE; extern void *_cupsThreadWait(_cups_thread_t thread) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_THREAD_PRIVATE_H_ */ cups-2.3.1/cups/array.c000664 000765 000024 00000066342 13574721672 015046 0ustar00mikestaff000000 000000 /* * Sorted array routines for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include "string-private.h" #include "debug-internal.h" #include "array-private.h" /* * Limits... */ #define _CUPS_MAXSAVE 32 /**** Maximum number of saves ****/ /* * Types and structures... */ struct _cups_array_s /**** CUPS array structure ****/ { /* * The current implementation uses an insertion sort into an array of * sorted pointers. We leave the array type private/opaque so that we * can change the underlying implementation without affecting the users * of this API. */ int num_elements, /* Number of array elements */ alloc_elements, /* Allocated array elements */ current, /* Current element */ insert, /* Last inserted element */ unique, /* Are all elements unique? */ num_saved, /* Number of saved elements */ saved[_CUPS_MAXSAVE]; /* Saved elements */ void **elements; /* Array elements */ cups_array_func_t compare; /* Element comparison function */ void *data; /* User data passed to compare */ cups_ahash_func_t hashfunc; /* Hash function */ int hashsize, /* Size of hash */ *hash; /* Hash array */ cups_acopy_func_t copyfunc; /* Copy function */ cups_afree_func_t freefunc; /* Free function */ }; /* * Local functions... */ static int cups_array_add(cups_array_t *a, void *e, int insert); static int cups_array_find(cups_array_t *a, void *e, int prev, int *rdiff); /* * 'cupsArrayAdd()' - Add an element to the array. * * When adding an element to a sorted array, non-unique elements are * appended at the end of the run of identical elements. For unsorted arrays, * the element is appended to the end of the array. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 on success, 0 on failure */ cupsArrayAdd(cups_array_t *a, /* I - Array */ void *e) /* I - Element */ { DEBUG_printf(("2cupsArrayAdd(a=%p, e=%p)", (void *)a, e)); /* * Range check input... */ if (!a || !e) { DEBUG_puts("3cupsArrayAdd: returning 0"); return (0); } /* * Append the element... */ return (cups_array_add(a, e, 0)); } /* * '_cupsArrayAddStrings()' - Add zero or more delimited strings to an array. * * Note: The array MUST be created using the @link _cupsArrayNewStrings@ * function. Duplicate strings are NOT added. If the string pointer "s" is NULL * or the empty string, no strings are added to the array. */ int /* O - 1 on success, 0 on failure */ _cupsArrayAddStrings(cups_array_t *a, /* I - Array */ const char *s, /* I - Delimited strings or NULL */ char delim)/* I - Delimiter character */ { char *buffer, /* Copy of string */ *start, /* Start of string */ *end; /* End of string */ int status = 1; /* Status of add */ DEBUG_printf(("_cupsArrayAddStrings(a=%p, s=\"%s\", delim='%c')", (void *)a, s, delim)); if (!a || !s || !*s) { DEBUG_puts("1_cupsArrayAddStrings: Returning 0"); return (0); } if (delim == ' ') { /* * Skip leading whitespace... */ DEBUG_puts("1_cupsArrayAddStrings: Skipping leading whitespace."); while (*s && isspace(*s & 255)) s ++; DEBUG_printf(("1_cupsArrayAddStrings: Remaining string \"%s\".", s)); } if (!strchr(s, delim) && (delim != ' ' || (!strchr(s, '\t') && !strchr(s, '\n')))) { /* * String doesn't contain a delimiter, so add it as a single value... */ DEBUG_puts("1_cupsArrayAddStrings: No delimiter seen, adding a single " "value."); if (!cupsArrayFind(a, (void *)s)) status = cupsArrayAdd(a, (void *)s); } else if ((buffer = strdup(s)) == NULL) { DEBUG_puts("1_cupsArrayAddStrings: Unable to duplicate string."); status = 0; } else { for (start = end = buffer; *end; start = end) { /* * Find the end of the current delimited string and see if we need to add * it... */ if (delim == ' ') { while (*end && !isspace(*end & 255)) end ++; while (*end && isspace(*end & 255)) *end++ = '\0'; } else if ((end = strchr(start, delim)) != NULL) *end++ = '\0'; else end = start + strlen(start); DEBUG_printf(("1_cupsArrayAddStrings: Adding \"%s\", end=\"%s\"", start, end)); if (!cupsArrayFind(a, start)) status &= cupsArrayAdd(a, start); } free(buffer); } DEBUG_printf(("1_cupsArrayAddStrings: Returning %d.", status)); return (status); } /* * 'cupsArrayClear()' - Clear the array. * * This function is equivalent to removing all elements in the array. * The caller is responsible for freeing the memory used by the * elements themselves. * * @since CUPS 1.2/macOS 10.5@ */ void cupsArrayClear(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return; /* * Free the existing elements as needed.. */ if (a->freefunc) { int i; /* Looping var */ void **e; /* Current element */ for (i = a->num_elements, e = a->elements; i > 0; i --, e ++) (a->freefunc)(*e, a->data); } /* * Set the number of elements to 0; we don't actually free the memory * here - that is done in cupsArrayDelete()... */ a->num_elements = 0; a->current = -1; a->insert = -1; a->unique = 1; a->num_saved = 0; } /* * 'cupsArrayCount()' - Get the number of elements in the array. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Number of elements */ cupsArrayCount(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (0); /* * Return the number of elements... */ return (a->num_elements); } /* * 'cupsArrayCurrent()' - Return the current element in the array. * * The current element is undefined until you call @link cupsArrayFind@, * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - Element */ cupsArrayCurrent(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (NULL); /* * Return the current element... */ if (a->current >= 0 && a->current < a->num_elements) return (a->elements[a->current]); else return (NULL); } /* * 'cupsArrayDelete()' - Free all memory used by the array. * * The caller is responsible for freeing the memory used by the * elements themselves. * * @since CUPS 1.2/macOS 10.5@ */ void cupsArrayDelete(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return; /* * Free the elements if we have a free function (otherwise the caller is * responsible for doing the dirty work...) */ if (a->freefunc) { int i; /* Looping var */ void **e; /* Current element */ for (i = a->num_elements, e = a->elements; i > 0; i --, e ++) (a->freefunc)(*e, a->data); } /* * Free the array of element pointers... */ if (a->alloc_elements) free(a->elements); if (a->hashsize) free(a->hash); free(a); } /* * 'cupsArrayDup()' - Duplicate the array. * * @since CUPS 1.2/macOS 10.5@ */ cups_array_t * /* O - Duplicate array */ cupsArrayDup(cups_array_t *a) /* I - Array */ { cups_array_t *da; /* Duplicate array */ /* * Range check input... */ if (!a) return (NULL); /* * Allocate memory for the array... */ da = calloc(1, sizeof(cups_array_t)); if (!da) return (NULL); da->compare = a->compare; da->data = a->data; da->current = a->current; da->insert = a->insert; da->unique = a->unique; da->num_saved = a->num_saved; memcpy(da->saved, a->saved, sizeof(a->saved)); if (a->num_elements) { /* * Allocate memory for the elements... */ da->elements = malloc((size_t)a->num_elements * sizeof(void *)); if (!da->elements) { free(da); return (NULL); } /* * Copy the element pointers... */ if (a->copyfunc) { /* * Use the copy function to make a copy of each element... */ int i; /* Looping var */ for (i = 0; i < a->num_elements; i ++) da->elements[i] = (a->copyfunc)(a->elements[i], a->data); } else { /* * Just copy raw pointers... */ memcpy(da->elements, a->elements, (size_t)a->num_elements * sizeof(void *)); } da->num_elements = a->num_elements; da->alloc_elements = a->num_elements; } /* * Return the new array... */ return (da); } /* * 'cupsArrayFind()' - Find an element in the array. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - Element found or @code NULL@ */ cupsArrayFind(cups_array_t *a, /* I - Array */ void *e) /* I - Element */ { int current, /* Current element */ diff, /* Difference */ hash; /* Hash index */ /* * Range check input... */ if (!a || !e) return (NULL); /* * See if we have any elements... */ if (!a->num_elements) return (NULL); /* * Yes, look for a match... */ if (a->hash) { hash = (*(a->hashfunc))(e, a->data); if (hash < 0 || hash >= a->hashsize) { current = a->current; hash = -1; } else { current = a->hash[hash]; if (current < 0 || current >= a->num_elements) current = a->current; } } else { current = a->current; hash = -1; } current = cups_array_find(a, e, current, &diff); if (!diff) { /* * Found a match! If the array does not contain unique values, find * the first element that is the same... */ if (!a->unique && a->compare) { /* * The array is not unique, find the first match... */ while (current > 0 && !(*(a->compare))(e, a->elements[current - 1], a->data)) current --; } a->current = current; if (hash >= 0) a->hash[hash] = current; return (a->elements[current]); } else { /* * No match... */ a->current = -1; return (NULL); } } /* * 'cupsArrayFirst()' - Get the first element in the array. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - First element or @code NULL@ if the array is empty */ cupsArrayFirst(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (NULL); /* * Return the first element... */ a->current = 0; return (cupsArrayCurrent(a)); } /* * 'cupsArrayGetIndex()' - Get the index of the current element. * * The current element is undefined until you call @link cupsArrayFind@, * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - Index of the current element, starting at 0 */ cupsArrayGetIndex(cups_array_t *a) /* I - Array */ { if (!a) return (-1); else return (a->current); } /* * 'cupsArrayGetInsert()' - Get the index of the last inserted element. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - Index of the last inserted element, starting at 0 */ cupsArrayGetInsert(cups_array_t *a) /* I - Array */ { if (!a) return (-1); else return (a->insert); } /* * 'cupsArrayIndex()' - Get the N-th element in the array. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - N-th element or @code NULL@ */ cupsArrayIndex(cups_array_t *a, /* I - Array */ int n) /* I - Index into array, starting at 0 */ { if (!a) return (NULL); a->current = n; return (cupsArrayCurrent(a)); } /* * 'cupsArrayInsert()' - Insert an element in the array. * * When inserting an element in a sorted array, non-unique elements are * inserted at the beginning of the run of identical elements. For unsorted * arrays, the element is inserted at the beginning of the array. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on failure, 1 on success */ cupsArrayInsert(cups_array_t *a, /* I - Array */ void *e) /* I - Element */ { DEBUG_printf(("2cupsArrayInsert(a=%p, e=%p)", (void *)a, e)); /* * Range check input... */ if (!a || !e) { DEBUG_puts("3cupsArrayInsert: returning 0"); return (0); } /* * Insert the element... */ return (cups_array_add(a, e, 1)); } /* * 'cupsArrayLast()' - Get the last element in the array. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - Last element or @code NULL@ if the array is empty */ cupsArrayLast(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (NULL); /* * Return the last element... */ a->current = a->num_elements - 1; return (cupsArrayCurrent(a)); } /* * 'cupsArrayNew()' - Create a new array. * * The comparison function ("f") is used to create a sorted array. The function * receives pointers to two elements and the user data pointer ("d") - the user * data pointer argument can safely be omitted when not required so functions * like @code strcmp@ can be used for sorted string arrays. * * @since CUPS 1.2/macOS 10.5@ */ cups_array_t * /* O - Array */ cupsArrayNew(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ void *d) /* I - User data pointer or @code NULL@ */ { return (cupsArrayNew3(f, d, 0, 0, 0, 0)); } /* * 'cupsArrayNew2()' - Create a new array with hash. * * The comparison function ("f") is used to create a sorted array. The function * receives pointers to two elements and the user data pointer ("d") - the user * data pointer argument can safely be omitted when not required so functions * like @code strcmp@ can be used for sorted string arrays. * * The hash function ("h") is used to implement cached lookups with the * specified hash size ("hsize"). * * @since CUPS 1.3/macOS 10.5@ */ cups_array_t * /* O - Array */ cupsArrayNew2(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ void *d, /* I - User data or @code NULL@ */ cups_ahash_func_t h, /* I - Hash function or @code NULL@ for unhashed lookups */ int hsize) /* I - Hash size (>= 0) */ { return (cupsArrayNew3(f, d, h, hsize, 0, 0)); } /* * 'cupsArrayNew3()' - Create a new array with hash and/or free function. * * The comparison function ("f") is used to create a sorted array. The function * receives pointers to two elements and the user data pointer ("d") - the user * data pointer argument can safely be omitted when not required so functions * like @code strcmp@ can be used for sorted string arrays. * * The hash function ("h") is used to implement cached lookups with the * specified hash size ("hsize"). * * The copy function ("cf") is used to automatically copy/retain elements when * added or the array is copied. * * The free function ("cf") is used to automatically free/release elements when * removed or the array is deleted. * * @since CUPS 1.5/macOS 10.7@ */ cups_array_t * /* O - Array */ cupsArrayNew3(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ void *d, /* I - User data or @code NULL@ */ cups_ahash_func_t h, /* I - Hash function or @code NULL@ for unhashed lookups */ int hsize, /* I - Hash size (>= 0) */ cups_acopy_func_t cf, /* I - Copy function */ cups_afree_func_t ff) /* I - Free function */ { cups_array_t *a; /* Array */ /* * Allocate memory for the array... */ a = calloc(1, sizeof(cups_array_t)); if (!a) return (NULL); a->compare = f; a->data = d; a->current = -1; a->insert = -1; a->num_saved = 0; a->unique = 1; if (hsize > 0 && h) { a->hashfunc = h; a->hashsize = hsize; a->hash = malloc((size_t)hsize * sizeof(int)); if (!a->hash) { free(a); return (NULL); } memset(a->hash, -1, (size_t)hsize * sizeof(int)); } a->copyfunc = cf; a->freefunc = ff; return (a); } /* * '_cupsArrayNewStrings()' - Create a new array of comma-delimited strings. * * Note: The array automatically manages copies of the strings passed. If the * string pointer "s" is NULL or the empty string, no strings are added to the * newly created array. */ cups_array_t * /* O - Array */ _cupsArrayNewStrings(const char *s, /* I - Delimited strings or NULL */ char delim) /* I - Delimiter character */ { cups_array_t *a; /* Array */ if ((a = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)_cupsStrAlloc, (cups_afree_func_t)_cupsStrFree)) != NULL) _cupsArrayAddStrings(a, s, delim); return (a); } /* * 'cupsArrayNext()' - Get the next element in the array. * * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)". * * The next element is undefined until you call @link cupsArrayFind@, * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ * to set the current element. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - Next element or @code NULL@ */ cupsArrayNext(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (NULL); /* * Return the next element... */ if (a->current < a->num_elements) a->current ++; return (cupsArrayCurrent(a)); } /* * 'cupsArrayPrev()' - Get the previous element in the array. * * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)". * * The previous element is undefined until you call @link cupsArrayFind@, * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ * to set the current element. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - Previous element or @code NULL@ */ cupsArrayPrev(cups_array_t *a) /* I - Array */ { /* * Range check input... */ if (!a) return (NULL); /* * Return the previous element... */ if (a->current >= 0) a->current --; return (cupsArrayCurrent(a)); } /* * 'cupsArrayRemove()' - Remove an element from the array. * * If more than one element matches "e", only the first matching element is * removed. * * The caller is responsible for freeing the memory used by the * removed element. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 on success, 0 on failure */ cupsArrayRemove(cups_array_t *a, /* I - Array */ void *e) /* I - Element */ { ssize_t i, /* Looping var */ current; /* Current element */ int diff; /* Difference */ /* * Range check input... */ if (!a || !e) return (0); /* * See if the element is in the array... */ if (!a->num_elements) return (0); current = cups_array_find(a, e, a->current, &diff); if (diff) return (0); /* * Yes, now remove it... */ a->num_elements --; if (a->freefunc) (a->freefunc)(a->elements[current], a->data); if (current < a->num_elements) memmove(a->elements + current, a->elements + current + 1, (size_t)(a->num_elements - current) * sizeof(void *)); if (current <= a->current) a->current --; if (current < a->insert) a->insert --; else if (current == a->insert) a->insert = -1; for (i = 0; i < a->num_saved; i ++) if (current <= a->saved[i]) a->saved[i] --; if (a->num_elements <= 1) a->unique = 1; return (1); } /* * 'cupsArrayRestore()' - Reset the current element to the last @link cupsArraySave@. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - New current element */ cupsArrayRestore(cups_array_t *a) /* I - Array */ { if (!a) return (NULL); if (a->num_saved <= 0) return (NULL); a->num_saved --; a->current = a->saved[a->num_saved]; if (a->current >= 0 && a->current < a->num_elements) return (a->elements[a->current]); else return (NULL); } /* * 'cupsArraySave()' - Mark the current element for a later @link cupsArrayRestore@. * * The current element is undefined until you call @link cupsArrayFind@, * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ * to set the current element. * * The save/restore stack is guaranteed to be at least 32 elements deep. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 on success, 0 on failure */ cupsArraySave(cups_array_t *a) /* I - Array */ { if (!a) return (0); if (a->num_saved >= _CUPS_MAXSAVE) return (0); a->saved[a->num_saved] = a->current; a->num_saved ++; return (1); } /* * 'cupsArrayUserData()' - Return the user data for an array. * * @since CUPS 1.2/macOS 10.5@ */ void * /* O - User data */ cupsArrayUserData(cups_array_t *a) /* I - Array */ { if (a) return (a->data); else return (NULL); } /* * 'cups_array_add()' - Insert or append an element to the array. * * @since CUPS 1.2/macOS 10.5@ */ static int /* O - 1 on success, 0 on failure */ cups_array_add(cups_array_t *a, /* I - Array */ void *e, /* I - Element to add */ int insert) /* I - 1 = insert, 0 = append */ { int i, /* Looping var */ current; /* Current element */ int diff; /* Comparison with current element */ DEBUG_printf(("7cups_array_add(a=%p, e=%p, insert=%d)", (void *)a, e, insert)); /* * Verify we have room for the new element... */ if (a->num_elements >= a->alloc_elements) { /* * Allocate additional elements; start with 16 elements, then * double the size until 1024 elements, then add 1024 elements * thereafter... */ void **temp; /* New array elements */ int count; /* New allocation count */ if (a->alloc_elements == 0) { count = 16; temp = malloc((size_t)count * sizeof(void *)); } else { if (a->alloc_elements < 1024) count = a->alloc_elements * 2; else count = a->alloc_elements + 1024; temp = realloc(a->elements, (size_t)count * sizeof(void *)); } DEBUG_printf(("9cups_array_add: count=" CUPS_LLFMT, CUPS_LLCAST count)); if (!temp) { DEBUG_puts("9cups_array_add: allocation failed, returning 0"); return (0); } a->alloc_elements = count; a->elements = temp; } /* * Find the insertion point for the new element; if there is no * compare function or elements, just add it to the beginning or end... */ if (!a->num_elements || !a->compare) { /* * No elements or comparison function, insert/append as needed... */ if (insert) current = 0; /* Insert at beginning */ else current = a->num_elements; /* Append to the end */ } else { /* * Do a binary search for the insertion point... */ current = cups_array_find(a, e, a->insert, &diff); if (diff > 0) { /* * Insert after the current element... */ current ++; } else if (!diff) { /* * Compared equal, make sure we add to the begining or end of * the current run of equal elements... */ a->unique = 0; if (insert) { /* * Insert at beginning of run... */ while (current > 0 && !(*(a->compare))(e, a->elements[current - 1], a->data)) current --; } else { /* * Append at end of run... */ do { current ++; } while (current < a->num_elements && !(*(a->compare))(e, a->elements[current], a->data)); } } } /* * Insert or append the element... */ if (current < a->num_elements) { /* * Shift other elements to the right... */ memmove(a->elements + current + 1, a->elements + current, (size_t)(a->num_elements - current) * sizeof(void *)); if (a->current >= current) a->current ++; for (i = 0; i < a->num_saved; i ++) if (a->saved[i] >= current) a->saved[i] ++; DEBUG_printf(("9cups_array_add: insert element at index " CUPS_LLFMT, CUPS_LLCAST current)); } #ifdef DEBUG else DEBUG_printf(("9cups_array_add: append element at " CUPS_LLFMT, CUPS_LLCAST current)); #endif /* DEBUG */ if (a->copyfunc) { if ((a->elements[current] = (a->copyfunc)(e, a->data)) == NULL) { DEBUG_puts("8cups_array_add: Copy function returned NULL, returning 0"); return (0); } } else a->elements[current] = e; a->num_elements ++; a->insert = current; #ifdef DEBUG for (current = 0; current < a->num_elements; current ++) DEBUG_printf(("9cups_array_add: a->elements[" CUPS_LLFMT "]=%p", CUPS_LLCAST current, a->elements[current])); #endif /* DEBUG */ DEBUG_puts("9cups_array_add: returning 1"); return (1); } /* * 'cups_array_find()' - Find an element in the array. */ static int /* O - Index of match */ cups_array_find(cups_array_t *a, /* I - Array */ void *e, /* I - Element */ int prev, /* I - Previous index */ int *rdiff) /* O - Difference of match */ { int left, /* Left side of search */ right, /* Right side of search */ current, /* Current element */ diff; /* Comparison with current element */ DEBUG_printf(("7cups_array_find(a=%p, e=%p, prev=%d, rdiff=%p)", (void *)a, e, prev, (void *)rdiff)); if (a->compare) { /* * Do a binary search for the element... */ DEBUG_puts("9cups_array_find: binary search"); if (prev >= 0 && prev < a->num_elements) { /* * Start search on either side of previous... */ if ((diff = (*(a->compare))(e, a->elements[prev], a->data)) == 0 || (diff < 0 && prev == 0) || (diff > 0 && prev == (a->num_elements - 1))) { /* * Exact or edge match, return it! */ DEBUG_printf(("9cups_array_find: Returning %d, diff=%d", prev, diff)); *rdiff = diff; return (prev); } else if (diff < 0) { /* * Start with previous on right side... */ left = 0; right = prev; } else { /* * Start wih previous on left side... */ left = prev; right = a->num_elements - 1; } } else { /* * Start search in the middle... */ left = 0; right = a->num_elements - 1; } do { current = (left + right) / 2; diff = (*(a->compare))(e, a->elements[current], a->data); DEBUG_printf(("9cups_array_find: left=%d, right=%d, current=%d, diff=%d", left, right, current, diff)); if (diff == 0) break; else if (diff < 0) right = current; else left = current; } while ((right - left) > 1); if (diff != 0) { /* * Check the last 1 or 2 elements... */ if ((diff = (*(a->compare))(e, a->elements[left], a->data)) <= 0) current = left; else { diff = (*(a->compare))(e, a->elements[right], a->data); current = right; } } } else { /* * Do a linear pointer search... */ DEBUG_puts("9cups_array_find: linear search"); diff = 1; for (current = 0; current < a->num_elements; current ++) if (a->elements[current] == e) { diff = 0; break; } } /* * Return the closest element and the difference... */ DEBUG_printf(("8cups_array_find: Returning %d, diff=%d", current, diff)); *rdiff = diff; return (current); } cups-2.3.1/cups/getputfile.c000664 000765 000024 00000026573 13574721672 016102 0ustar00mikestaff000000 000000 /* * Get/put file functions for CUPS. * * Copyright 2007-2018 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ /* * 'cupsGetFd()' - Get a file from the server. * * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved. * * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ int fd) /* I - File descriptor */ { ssize_t bytes; /* Number of bytes read */ char buffer[8192]; /* Buffer for file */ http_status_t status; /* HTTP status from server */ char if_modified_since[HTTP_MAX_VALUE]; /* If-Modified-Since header */ int new_auth = 0; /* Using new auth information? */ int digest; /* Are we using Digest authentication? */ /* * Range check input... */ DEBUG_printf(("cupsGetFd(http=%p, resource=\"%s\", fd=%d)", (void *)http, resource, fd)); if (!resource || fd < 0) { if (http) http->error = EINVAL; return (HTTP_STATUS_ERROR); } if (!http) if ((http = _cupsConnect()) == NULL) return (HTTP_STATUS_SERVICE_UNAVAILABLE); /* * Then send GET requests to the HTTP server... */ strlcpy(if_modified_since, httpGetField(http, HTTP_FIELD_IF_MODIFIED_SINCE), sizeof(if_modified_since)); do { if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) { httpClearFields(http); if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } } httpClearFields(http); httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, if_modified_since); digest = http->authstring && !strncmp(http->authstring, "Digest ", 7); if (digest && !new_auth) { /* * Update the Digest authentication string... */ _httpSetDigestAuthString(http, http->nextnonce, "GET", resource); } #ifdef HAVE_GSSAPI if (http->authstring && !strncmp(http->authstring, "Negotiate", 9) && !new_auth) { /* * Do not use cached Kerberos credentials since they will look like a * "replay" attack... */ _cupsSetNegotiateAuthString(http, "GET", resource); } #endif /* HAVE_GSSAPI */ httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); if (httpGet(http, resource)) { if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } else { status = HTTP_STATUS_UNAUTHORIZED; continue; } } new_auth = 0; while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... */ httpFlush(http); /* * See if we can do authentication... */ new_auth = 1; if (cupsDoAuthentication(http, "GET", resource)) { status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; } if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); /* * See if we actually got the file or an error... */ if (status == HTTP_STATUS_OK) { /* * Yes, copy the file... */ while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) write(fd, buffer, (size_t)bytes); } else { _cupsSetHTTPError(status); httpFlush(http); } /* * Return the request status... */ DEBUG_printf(("1cupsGetFd: Returning %d...", status)); return (status); } /* * 'cupsGetFile()' - Get a file from the server. * * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved. * * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ const char *filename) /* I - Filename */ { int fd; /* File descriptor */ http_status_t status; /* Status */ /* * Range check input... */ if (!http || !resource || !filename) { if (http) http->error = EINVAL; return (HTTP_STATUS_ERROR); } /* * Create the file... */ if ((fd = open(filename, O_WRONLY | O_EXCL | O_TRUNC)) < 0) { /* * Couldn't open the file! */ http->error = errno; return (HTTP_STATUS_ERROR); } /* * Get the file... */ status = cupsGetFd(http, resource, fd); /* * If the file couldn't be gotten, then remove the file... */ close(fd); if (status != HTTP_STATUS_OK) unlink(filename); /* * Return the HTTP status code... */ return (status); } /* * 'cupsPutFd()' - Put a file on the server. * * This function returns @code HTTP_STATUS_CREATED@ when the file is stored * successfully. * * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ int fd) /* I - File descriptor */ { ssize_t bytes; /* Number of bytes read */ int retries; /* Number of retries */ char buffer[8192]; /* Buffer for file */ http_status_t status; /* HTTP status from server */ int new_auth = 0; /* Using new auth information? */ int digest; /* Are we using Digest authentication? */ /* * Range check input... */ DEBUG_printf(("cupsPutFd(http=%p, resource=\"%s\", fd=%d)", (void *)http, resource, fd)); if (!resource || fd < 0) { if (http) http->error = EINVAL; return (HTTP_STATUS_ERROR); } if (!http) if ((http = _cupsConnect()) == NULL) return (HTTP_STATUS_SERVICE_UNAVAILABLE); /* * Then send PUT requests to the HTTP server... */ retries = 0; do { if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) { httpClearFields(http); if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } } DEBUG_printf(("2cupsPutFd: starting attempt, authstring=\"%s\"...", http->authstring)); httpClearFields(http); httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked"); httpSetExpect(http, HTTP_STATUS_CONTINUE); digest = http->authstring && !strncmp(http->authstring, "Digest ", 7); if (digest && !new_auth) { /* * Update the Digest authentication string... */ _httpSetDigestAuthString(http, http->nextnonce, "PUT", resource); } #ifdef HAVE_GSSAPI if (http->authstring && !strncmp(http->authstring, "Negotiate", 9) && !new_auth) { /* * Do not use cached Kerberos credentials since they will look like a * "replay" attack... */ _cupsSetNegotiateAuthString(http, "PUT", resource); } #endif /* HAVE_GSSAPI */ httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); if (httpPut(http, resource)) { if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } else { status = HTTP_STATUS_UNAUTHORIZED; continue; } } /* * Wait up to 1 second for a 100-continue response... */ if (httpWait(http, 1000)) status = httpUpdate(http); else status = HTTP_STATUS_CONTINUE; if (status == HTTP_STATUS_CONTINUE) { /* * Copy the file... */ lseek(fd, 0, SEEK_SET); while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) if (httpCheck(http)) { if ((status = httpUpdate(http)) != HTTP_STATUS_CONTINUE) break; } else httpWrite2(http, buffer, (size_t)bytes); } if (status == HTTP_STATUS_CONTINUE) { httpWrite2(http, buffer, 0); while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); } if (status == HTTP_STATUS_ERROR && !retries) { DEBUG_printf(("2cupsPutFd: retry on status %d", status)); retries ++; /* Flush any error message... */ httpFlush(http); /* Reconnect... */ if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } /* Try again... */ continue; } DEBUG_printf(("2cupsPutFd: status=%d", status)); new_auth = 0; if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... */ httpFlush(http); /* * See if we can do authentication... */ new_auth = 1; if (cupsDoAuthentication(http, "PUT", resource)) { status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; } if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED || (status == HTTP_STATUS_ERROR && retries < 2)); /* * See if we actually put the file or an error... */ if (status != HTTP_STATUS_CREATED) { _cupsSetHTTPError(status); httpFlush(http); } DEBUG_printf(("1cupsPutFd: Returning %d...", status)); return (status); } /* * 'cupsPutFile()' - Put a file on the server. * * This function returns @code HTTP_CREATED@ when the file is stored * successfully. * * @since CUPS 1.1.20/macOS 10.4@ */ http_status_t /* O - HTTP status */ cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *resource, /* I - Resource name */ const char *filename) /* I - Filename */ { int fd; /* File descriptor */ http_status_t status; /* Status */ /* * Range check input... */ if (!http || !resource || !filename) { if (http) http->error = EINVAL; return (HTTP_STATUS_ERROR); } /* * Open the local file... */ if ((fd = open(filename, O_RDONLY)) < 0) { /* * Couldn't open the file! */ http->error = errno; return (HTTP_STATUS_ERROR); } /* * Put the file... */ status = cupsPutFd(http, resource, fd); close(fd); return (status); } cups-2.3.1/cups/ppd-util.c000664 000765 000024 00000043141 13574721672 015456 0ustar00mikestaff000000 000000 /* * PPD utilities for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ /* * Local functions... */ static int cups_get_printer_uri(http_t *http, const char *name, char *host, int hostsize, int *port, char *resource, int resourcesize, int depth); /* * 'cupsGetPPD()' - Get the PPD file for a printer on the default server. * * For classes, @code cupsGetPPD@ returns the PPD file for the first printer * in the class. * * The returned filename is stored in a static buffer and is overwritten with * each call to @code cupsGetPPD@ or @link cupsGetPPD2@. The caller "owns" the * file that is created and must @code unlink@ the returned filename. */ const char * /* O - Filename for PPD file */ cupsGetPPD(const char *name) /* I - Destination name */ { _ppd_globals_t *pg = _ppdGlobals(); /* Pointer to library globals */ time_t modtime = 0; /* Modification time */ /* * Return the PPD file... */ pg->ppd_filename[0] = '\0'; if (cupsGetPPD3(CUPS_HTTP_DEFAULT, name, &modtime, pg->ppd_filename, sizeof(pg->ppd_filename)) == HTTP_STATUS_OK) return (pg->ppd_filename); else return (NULL); } /* * 'cupsGetPPD2()' - Get the PPD file for a printer from the specified server. * * For classes, @code cupsGetPPD2@ returns the PPD file for the first printer * in the class. * * The returned filename is stored in a static buffer and is overwritten with * each call to @link cupsGetPPD@ or @code cupsGetPPD2@. The caller "owns" the * file that is created and must @code unlink@ the returned filename. * * @since CUPS 1.1.21/macOS 10.4@ */ const char * /* O - Filename for PPD file */ cupsGetPPD2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name) /* I - Destination name */ { _ppd_globals_t *pg = _ppdGlobals(); /* Pointer to library globals */ time_t modtime = 0; /* Modification time */ pg->ppd_filename[0] = '\0'; if (cupsGetPPD3(http, name, &modtime, pg->ppd_filename, sizeof(pg->ppd_filename)) == HTTP_STATUS_OK) return (pg->ppd_filename); else return (NULL); } /* * 'cupsGetPPD3()' - Get the PPD file for a printer on the specified * server if it has changed. * * The "modtime" parameter contains the modification time of any * locally-cached content and is updated with the time from the PPD file on * the server. * * The "buffer" parameter contains the local PPD filename. If it contains * the empty string, a new temporary file is created, otherwise the existing * file will be overwritten as needed. The caller "owns" the file that is * created and must @code unlink@ the returned filename. * * On success, @code HTTP_STATUS_OK@ is returned for a new PPD file and * @code HTTP_STATUS_NOT_MODIFIED@ if the existing PPD file is up-to-date. Any other * status is an error. * * For classes, @code cupsGetPPD3@ returns the PPD file for the first printer * in the class. * * @since CUPS 1.4/macOS 10.6@ */ http_status_t /* O - HTTP status */ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Destination name */ time_t *modtime, /* IO - Modification time */ char *buffer, /* I - Filename buffer */ size_t bufsize) /* I - Size of filename buffer */ { int http_port; /* Port number */ char http_hostname[HTTP_MAX_HOST]; /* Hostname associated with connection */ http_t *http2; /* Alternate HTTP connection */ int fd; /* PPD file */ char localhost[HTTP_MAX_URI],/* Local hostname */ hostname[HTTP_MAX_URI], /* Hostname */ resource[HTTP_MAX_URI]; /* Resource name */ int port; /* Port number */ http_status_t status; /* HTTP status from server */ char tempfile[1024] = ""; /* Temporary filename */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * Range check input... */ DEBUG_printf(("cupsGetPPD3(http=%p, name=\"%s\", modtime=%p(%d), buffer=%p, " "bufsize=%d)", http, name, modtime, modtime ? (int)*modtime : 0, buffer, (int)bufsize)); if (!name) { DEBUG_puts("2cupsGetPPD3: No printer name, returning NULL."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer name"), 1); return (HTTP_STATUS_NOT_ACCEPTABLE); } if (!modtime) { DEBUG_puts("2cupsGetPPD3: No modtime, returning NULL."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No modification time"), 1); return (HTTP_STATUS_NOT_ACCEPTABLE); } if (!buffer || bufsize <= 1) { DEBUG_puts("2cupsGetPPD3: No filename buffer, returning NULL."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad filename buffer"), 1); return (HTTP_STATUS_NOT_ACCEPTABLE); } #ifndef _WIN32 /* * See if the PPD file is available locally... */ if (http) httpGetHostname(http, hostname, sizeof(hostname)); else { strlcpy(hostname, cupsServer(), sizeof(hostname)); if (hostname[0] == '/') strlcpy(hostname, "localhost", sizeof(hostname)); } if (!_cups_strcasecmp(hostname, "localhost")) { char ppdname[1024]; /* PPD filename */ struct stat ppdinfo; /* PPD file information */ snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd", cg->cups_serverroot, name); if (!stat(ppdname, &ppdinfo) && !access(ppdname, R_OK)) { /* * OK, the file exists and is readable, use it! */ if (buffer[0]) { DEBUG_printf(("2cupsGetPPD3: Using filename \"%s\".", buffer)); unlink(buffer); if (symlink(ppdname, buffer) && errno != EEXIST) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (HTTP_STATUS_SERVER_ERROR); } } else { int tries; /* Number of tries */ const char *tmpdir; /* TMPDIR environment variable */ struct timeval curtime; /* Current time */ #ifdef __APPLE__ /* * On macOS and iOS, the TMPDIR environment variable is not always the * best location to place temporary files due to sandboxing. Instead, * the confstr function should be called to get the proper per-user, * per-process TMPDIR value. */ char tmppath[1024]; /* Temporary directory */ if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK)) tmpdir = NULL; if (!tmpdir) { if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath))) tmpdir = tmppath; else tmpdir = "/private/tmp"; /* This should never happen */ } #else /* * Previously we put root temporary files in the default CUPS temporary * directory under /var/spool/cups. However, since the scheduler cleans * out temporary files there and runs independently of the user apps, we * don't want to use it unless specifically told to by cupsd. */ if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = "/tmp"; #endif /* __APPLE__ */ DEBUG_printf(("2cupsGetPPD3: tmpdir=\"%s\".", tmpdir)); /* * Make the temporary name using the specified directory... */ tries = 0; do { /* * Get the current time of day... */ gettimeofday(&curtime, NULL); /* * Format a string using the hex time values... */ snprintf(buffer, bufsize, "%s/%08lx%05lx", tmpdir, (unsigned long)curtime.tv_sec, (unsigned long)curtime.tv_usec); /* * Try to make a symlink... */ if (!symlink(ppdname, buffer)) break; DEBUG_printf(("2cupsGetPPD3: Symlink \"%s\" to \"%s\" failed: %s", ppdname, buffer, strerror(errno))); tries ++; } while (tries < 1000); if (tries >= 1000) { DEBUG_puts("2cupsGetPPD3: Unable to symlink after 1000 tries, returning error."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (HTTP_STATUS_SERVER_ERROR); } } if (*modtime >= ppdinfo.st_mtime) { DEBUG_printf(("2cupsGetPPD3: Returning not-modified, filename=\"%s\".", buffer)); return (HTTP_STATUS_NOT_MODIFIED); } else { DEBUG_printf(("2cupsGetPPD3: Returning ok, filename=\"%s\", modtime=%ld.", buffer, (long)ppdinfo.st_mtime)); *modtime = ppdinfo.st_mtime; return (HTTP_STATUS_OK); } } } #endif /* !_WIN32 */ /* * Try finding a printer URI for this printer... */ DEBUG_puts("2cupsGetPPD3: Unable to access local file, copying..."); if (!http) { if ((http = _cupsConnect()) == NULL) { DEBUG_puts("2cupsGetPPD3: Unable to connect to scheduler."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } } if (!cups_get_printer_uri(http, name, hostname, sizeof(hostname), &port, resource, sizeof(resource), 0)) { DEBUG_puts("2cupsGetPPD3: Unable to get printer URI."); return (HTTP_STATUS_NOT_FOUND); } DEBUG_printf(("2cupsGetPPD3: Printer hostname=\"%s\", port=%d", hostname, port)); if (cupsServer()[0] == '/' && !_cups_strcasecmp(hostname, "localhost") && port == ippPort()) { /* * Redirect localhost to domain socket... */ strlcpy(hostname, cupsServer(), sizeof(hostname)); port = 0; DEBUG_printf(("2cupsGetPPD3: Redirecting to \"%s\".", hostname)); } /* * Remap local hostname to localhost... */ httpGetHostname(NULL, localhost, sizeof(localhost)); DEBUG_printf(("2cupsGetPPD3: Local hostname=\"%s\"", localhost)); if (!_cups_strcasecmp(localhost, hostname)) strlcpy(hostname, "localhost", sizeof(hostname)); /* * Get the hostname and port number we are connected to... */ httpGetHostname(http, http_hostname, sizeof(http_hostname)); http_port = httpAddrPort(http->hostaddr); DEBUG_printf(("2cupsGetPPD3: Connection hostname=\"%s\", port=%d", http_hostname, http_port)); /* * Reconnect to the correct server as needed... */ if (!_cups_strcasecmp(http_hostname, hostname) && port == http_port) http2 = http; else if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL)) == NULL) { DEBUG_puts("2cupsGetPPD3: Unable to connect to server"); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } /* * Get a temp file... */ if (buffer[0]) fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY, 0600); else fd = cupsTempFd(tempfile, sizeof(tempfile)); if (fd < 0) { /* * Can't open file; close the server connection and return NULL... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); if (http2 != http) httpClose(http2); return (HTTP_STATUS_SERVER_ERROR); } /* * And send a request to the HTTP server... */ strlcat(resource, ".ppd", sizeof(resource)); if (*modtime > 0) httpSetField(http2, HTTP_FIELD_IF_MODIFIED_SINCE, httpGetDateString(*modtime)); status = cupsGetFd(http2, resource, fd); close(fd); /* * See if we actually got the file or an error... */ if (status == HTTP_STATUS_OK) { *modtime = httpGetDateTime(httpGetField(http2, HTTP_FIELD_DATE)); if (tempfile[0]) strlcpy(buffer, tempfile, bufsize); } else if (status != HTTP_STATUS_NOT_MODIFIED) { _cupsSetHTTPError(status); if (buffer[0]) unlink(buffer); else if (tempfile[0]) unlink(tempfile); } else if (tempfile[0]) unlink(tempfile); if (http2 != http) httpClose(http2); /* * Return the PPD file... */ DEBUG_printf(("2cupsGetPPD3: Returning status %d", status)); return (status); } /* * 'cupsGetServerPPD()' - Get an available PPD file from the server. * * This function returns the named PPD file from the server. The * list of available PPDs is provided by the IPP @code CUPS_GET_PPDS@ * operation. * * You must remove (unlink) the PPD file when you are finished with * it. The PPD filename is stored in a static location that will be * overwritten on the next call to @link cupsGetPPD@, @link cupsGetPPD2@, * or @link cupsGetServerPPD@. * * @since CUPS 1.3/macOS 10.5@ */ char * /* O - Name of PPD file or @code NULL@ on error */ cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name) /* I - Name of PPD file ("ppd-name") */ { int fd; /* PPD file descriptor */ ipp_t *request; /* IPP request */ _ppd_globals_t *pg = _ppdGlobals(); /* Pointer to library globals */ /* * Range check input... */ if (!name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No PPD name"), 1); return (NULL); } if (!http) if ((http = _cupsConnect()) == NULL) return (NULL); /* * Get a temp file... */ if ((fd = cupsTempFd(pg->ppd_filename, sizeof(pg->ppd_filename))) < 0) { /* * Can't open file; close the server connection and return NULL... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0); return (NULL); } /* * Get the PPD file... */ request = ippNewRequest(IPP_OP_CUPS_GET_PPD); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL, name); ippDelete(cupsDoIORequest(http, request, "/", -1, fd)); close(fd); if (cupsLastError() != IPP_STATUS_OK) { unlink(pg->ppd_filename); return (NULL); } else return (pg->ppd_filename); } /* * 'cups_get_printer_uri()' - Get the printer-uri-supported attribute for the * first printer in a class. */ static int /* O - 1 on success, 0 on failure */ cups_get_printer_uri( http_t *http, /* I - Connection to server */ const char *name, /* I - Name of printer or class */ char *host, /* I - Hostname buffer */ int hostsize, /* I - Size of hostname buffer */ int *port, /* O - Port number */ char *resource, /* I - Resource buffer */ int resourcesize, /* I - Size of resource buffer */ int depth) /* I - Depth of query */ { int i; /* Looping var */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* Current attribute */ char uri[HTTP_MAX_URI], /* printer-uri attribute */ scheme[HTTP_MAX_URI], /* Scheme name */ username[HTTP_MAX_URI]; /* Username:password */ static const char * const requested_attrs[] = { /* Requested attributes */ "member-uris", "printer-uri-supported" }; DEBUG_printf(("4cups_get_printer_uri(http=%p, name=\"%s\", host=%p, hostsize=%d, resource=%p, resourcesize=%d, depth=%d)", http, name, host, hostsize, resource, resourcesize, depth)); /* * Setup the printer URI... */ if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", name) < HTTP_URI_STATUS_OK) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create printer-uri"), 1); *host = '\0'; *resource = '\0'; return (0); } DEBUG_printf(("5cups_get_printer_uri: printer-uri=\"%s\"", uri)); /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * requested-attributes */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(requested_attrs) / sizeof(requested_attrs[0]), NULL, requested_attrs); /* * Do the request and get back a response... */ snprintf(resource, (size_t)resourcesize, "/printers/%s", name); if ((response = cupsDoRequest(http, request, resource)) != NULL) { if ((attr = ippFindAttribute(response, "member-uris", IPP_TAG_URI)) != NULL) { /* * Get the first actual printer name in the class... */ DEBUG_printf(("5cups_get_printer_uri: Got member-uris with %d values.", ippGetCount(attr))); for (i = 0; i < attr->num_values; i ++) { DEBUG_printf(("5cups_get_printer_uri: member-uris[%d]=\"%s\"", i, ippGetString(attr, i, NULL))); httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize); if (!strncmp(resource, "/printers/", 10)) { /* * Found a printer! */ ippDelete(response); DEBUG_printf(("5cups_get_printer_uri: Found printer member with host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource)); return (1); } } } else if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) { httpSeparateURI(HTTP_URI_CODING_ALL, _httpResolveURI(attr->values[0].string.text, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL), scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize); ippDelete(response); DEBUG_printf(("5cups_get_printer_uri: Resolved to host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource)); if (!strncmp(resource, "/classes/", 9)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer-uri found for class"), 1); *host = '\0'; *resource = '\0'; DEBUG_puts("5cups_get_printer_uri: Not returning class."); return (0); } return (1); } ippDelete(response); } if (cupsLastError() != IPP_STATUS_ERROR_NOT_FOUND) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer-uri found"), 1); *host = '\0'; *resource = '\0'; DEBUG_puts("5cups_get_printer_uri: Printer URI not found."); return (0); } cups-2.3.1/cups/pwg-media.c000664 000765 000024 00000112656 13574721672 015602 0ustar00mikestaff000000 000000 /* * PWG media name API implementation for CUPS. * * Copyright 2009-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include /* * Local macros... */ #define _PWG_MEDIA_IN(p,l,a,x,y) {p, l, a, (int)(x * 2540), (int)(y * 2540)} #define _PWG_MEDIA_MM(p,l,a,x,y) {p, l, a, (int)(x * 100), (int)(y * 100)} #define _PWG_EPSILON 50 /* Matching tolerance */ /* * Local functions... */ static int pwg_compare_legacy(pwg_media_t *a, pwg_media_t *b); static int pwg_compare_pwg(pwg_media_t *a, pwg_media_t *b); static int pwg_compare_ppd(pwg_media_t *a, pwg_media_t *b); static char *pwg_format_inches(char *buf, size_t bufsize, int val); static char *pwg_format_millimeters(char *buf, size_t bufsize, int val); static int pwg_scan_measurement(const char *buf, char **bufptr, int numer, int denom); /* * Local globals... */ static pwg_media_t const cups_pwg_media[] = { /* Media size lookup table */ /* North American Standard Sheet Media Sizes */ _PWG_MEDIA_IN("na_index-3x5_3x5in", NULL, "3x5", 3, 5), _PWG_MEDIA_IN("na_personal_3.625x6.5in", NULL, "EnvPersonal", 3.625, 6.5), _PWG_MEDIA_IN("na_monarch_3.875x7.5in", "monarch-envelope", "EnvMonarch", 3.875, 7.5), _PWG_MEDIA_IN("na_number-9_3.875x8.875in", "na-number-9-envelope", "Env9", 3.875, 8.875), _PWG_MEDIA_IN("na_index-4x6_4x6in", NULL, "4x6", 4, 6), _PWG_MEDIA_IN("na_number-10_4.125x9.5in", "na-number-10-envelope", "Env10", 4.125, 9.5), _PWG_MEDIA_IN("na_a2_4.375x5.75in", NULL, "EnvA2", 4.375, 5.75), _PWG_MEDIA_IN("na_number-11_4.5x10.375in", NULL, "Env11", 4.5, 10.375), _PWG_MEDIA_IN("na_number-12_4.75x11in", NULL, "Env12", 4.75, 11), _PWG_MEDIA_IN("na_5x7_5x7in", NULL, "5x7", 5, 7), _PWG_MEDIA_IN("na_index-5x8_5x8in", NULL, "5x8", 5, 8), _PWG_MEDIA_IN("na_number-14_5x11.5in", NULL, "Env14", 5, 11.5), _PWG_MEDIA_IN("na_invoice_5.5x8.5in", "invoice", "Statement", 5.5, 8.5), _PWG_MEDIA_IN("na_index-4x6-ext_6x8in", NULL, "6x8", 6, 8), _PWG_MEDIA_IN("na_6x9_6x9in", "na-6x9-envelope", "6x9", 6, 9), _PWG_MEDIA_IN("na_c5_6.5x9.5in", NULL, "6.5x9.5", 6.5, 9.5), _PWG_MEDIA_IN("na_7x9_7x9in", "na-7x9-envelope", "7x9", 7, 9), _PWG_MEDIA_IN("na_executive_7.25x10.5in", "executive", "Executive", 7.25, 10.5), _PWG_MEDIA_IN("na_govt-letter_8x10in", "na-8x10", "8x10", 8, 10), _PWG_MEDIA_IN("na_govt-legal_8x13in", NULL, "8x13", 8, 13), _PWG_MEDIA_IN("na_quarto_8.5x10.83in", "quarto", "Quarto", 8.5, 10.83), _PWG_MEDIA_IN("na_letter_8.5x11in", "na-letter", "Letter", 8.5, 11), _PWG_MEDIA_IN("na_fanfold-eur_8.5x12in", NULL, "FanFoldGerman", 8.5, 12), _PWG_MEDIA_IN("na_letter-plus_8.5x12.69in", NULL, "LetterPlus", 8.5, 12.69), _PWG_MEDIA_IN("na_foolscap_8.5x13in", NULL, "FanFoldGermanLegal", 8.5, 13), _PWG_MEDIA_IN("na_oficio_8.5x13.4in", NULL, "Oficio", 8.5, 13.4), _PWG_MEDIA_IN("na_legal_8.5x14in", "na-legal", "Legal", 8.5, 14), _PWG_MEDIA_IN("na_super-a_8.94x14in", NULL, "SuperA", 8.94, 14), _PWG_MEDIA_IN("na_9x11_9x11in", "na-9x11-envelope", "9x11", 9, 11), _PWG_MEDIA_IN("na_arch-a_9x12in", "arch-a", "ARCHA", 9, 12), _PWG_MEDIA_IN("na_letter-extra_9.5x12in", NULL, "LetterExtra", 9.5, 12), _PWG_MEDIA_IN("na_legal-extra_9.5x15in", NULL, "LegalExtra", 9.5, 15), _PWG_MEDIA_IN("na_10x11_10x11in", NULL, "10x11", 10, 11), _PWG_MEDIA_IN("na_10x13_10x13in", "na-10x13-envelope", "10x13", 10, 13), _PWG_MEDIA_IN("na_10x14_10x14in", "na-10x14-envelope", "10x14", 10, 14), _PWG_MEDIA_IN("na_10x15_10x15in", "na-10x15-envelope", "10x15", 10, 15), _PWG_MEDIA_IN("na_11x12_11x12in", NULL, "11x12", 11, 12), _PWG_MEDIA_IN("na_edp_11x14in", NULL, "11x14", 11, 14), _PWG_MEDIA_IN("na_fanfold-us_11x14.875in", NULL, "11x14.875", 11, 14.875), _PWG_MEDIA_IN("na_11x15_11x15in", NULL, "11x15", 11, 15), _PWG_MEDIA_IN("na_ledger_11x17in", "tabloid", "Tabloid", 11, 17), _PWG_MEDIA_IN("na_eur-edp_12x14in", NULL, NULL, 12, 14), _PWG_MEDIA_IN("na_arch-b_12x18in", "arch-b", "ARCHB", 12, 18), _PWG_MEDIA_IN("na_12x19_12x19in", NULL, "12x19", 12, 19), _PWG_MEDIA_IN("na_b-plus_12x19.17in", NULL, "SuperB", 12, 19.17), _PWG_MEDIA_IN("na_super-b_13x19in", "super-b", "13x19", 13, 19), _PWG_MEDIA_IN("na_c_17x22in", "c", "AnsiC", 17, 22), _PWG_MEDIA_IN("na_arch-c_18x24in", "arch-c", "ARCHC", 18, 24), _PWG_MEDIA_IN("na_d_22x34in", "d", "AnsiD", 22, 34), _PWG_MEDIA_IN("na_arch-d_24x36in", "arch-d", "ARCHD", 24, 36), _PWG_MEDIA_IN("asme_f_28x40in", "f", "28x40", 28, 40), _PWG_MEDIA_IN("na_wide-format_30x42in", NULL, "30x42", 30, 42), _PWG_MEDIA_IN("na_e_34x44in", "e", "AnsiE", 34, 44), _PWG_MEDIA_IN("na_arch-e_36x48in", "arch-e", "ARCHE", 36, 48), _PWG_MEDIA_IN("na_f_44x68in", NULL, "AnsiF", 44, 68), /* ISO Standard Sheet Media Sizes */ _PWG_MEDIA_MM("iso_a10_26x37mm", "iso-a10", "A10", 26, 37), _PWG_MEDIA_MM("iso_a9_37x52mm", "iso-a9", "A9", 37, 52), _PWG_MEDIA_MM("iso_a8_52x74mm", "iso-a8", "A8", 52, 74), _PWG_MEDIA_MM("iso_a7_74x105mm", "iso-a7", "A7", 74, 105), _PWG_MEDIA_MM("iso_a6_105x148mm", "iso-a6", "A6", 105, 148), _PWG_MEDIA_MM("iso_a5_148x210mm", "iso-a5", "A5", 148, 210), _PWG_MEDIA_MM("iso_a5-extra_174x235mm", NULL, "A5Extra", 174, 235), _PWG_MEDIA_MM("iso_a4_210x297mm", "iso-a4", "A4", 210, 297), _PWG_MEDIA_MM("iso_a4-tab_225x297mm", NULL, "A4Tab", 225, 297), _PWG_MEDIA_MM("iso_a4-extra_235.5x322.3mm", NULL, "A4Extra", 235.5, 322.3), _PWG_MEDIA_MM("iso_a3_297x420mm", "iso-a3", "A3", 297, 420), _PWG_MEDIA_MM("iso_a4x3_297x630mm", "iso-a4x3", "A4x3", 297, 630), _PWG_MEDIA_MM("iso_a4x4_297x841mm", "iso-a4x4", "A4x4", 297, 841), _PWG_MEDIA_MM("iso_a4x5_297x1051mm", "iso-a4x5", "A4x5", 297, 1051), _PWG_MEDIA_MM("iso_a4x6_297x1261mm", "iso-a4x6", "A4x6", 297, 1261), _PWG_MEDIA_MM("iso_a4x7_297x1471mm", "iso-a4x7", "A4x7", 297, 1471), _PWG_MEDIA_MM("iso_a4x8_297x1682mm", "iso-a4x8", "A4x8", 297, 1682), _PWG_MEDIA_MM("iso_a4x9_297x1892mm", "iso-a4x9", "A4x9", 297, 1892), _PWG_MEDIA_MM("iso_a3-extra_322x445mm", "iso-a3-extra", "A3Extra", 322, 445), _PWG_MEDIA_MM("iso_a2_420x594mm", "iso-a2", "A2", 420, 594), _PWG_MEDIA_MM("iso_a3x3_420x891mm", "iso-a3x3", "A3x3", 420, 891), _PWG_MEDIA_MM("iso_a3x4_420x1189mm", "iso-a3x4", "A3x4", 420, 1189), _PWG_MEDIA_MM("iso_a3x5_420x1486mm", "iso-a3x5", "A3x6", 420, 1486), _PWG_MEDIA_MM("iso_a3x6_420x1783mm", "iso-a3x6", "A3x6", 420, 1783), _PWG_MEDIA_MM("iso_a3x7_420x2080mm", "iso-a3x7", "A3x7", 420, 2080), _PWG_MEDIA_MM("iso_a1_594x841mm", "iso-a1", "A1", 594, 841), _PWG_MEDIA_MM("iso_a2x3_594x1261mm", "iso-a2x3", "A2x3", 594, 1261), _PWG_MEDIA_MM("iso_a2x4_594x1682mm", "iso-a2x4", "A2x4", 594, 1682), _PWG_MEDIA_MM("iso_a2x5_594x2102mm", "iso-a2x5", "A2x5", 594, 2102), _PWG_MEDIA_MM("iso_a0_841x1189mm", "iso-a0", "A0", 841, 1189), _PWG_MEDIA_MM("iso_a1x3_841x1783mm", "iso-a1x3", "A1x3", 841, 1783), _PWG_MEDIA_MM("iso_a1x4_841x2378mm", "iso-a1x4", "A1x4", 841, 2378), _PWG_MEDIA_MM("iso_2a0_1189x1682mm", NULL, "1189x1682mm", 1189, 1682), _PWG_MEDIA_MM("iso_a0x3_1189x2523mm", NULL, "A0x3", 1189, 2523), _PWG_MEDIA_MM("iso_b10_31x44mm", "iso-b10", "ISOB10", 31, 44), _PWG_MEDIA_MM("iso_b9_44x62mm", "iso-b9", "ISOB9", 44, 62), _PWG_MEDIA_MM("iso_b8_62x88mm", "iso-b8", "ISOB8", 62, 88), _PWG_MEDIA_MM("iso_b7_88x125mm", "iso-b7", "ISOB7", 88, 125), _PWG_MEDIA_MM("iso_b6_125x176mm", "iso-b6", "ISOB6", 125, 176), _PWG_MEDIA_MM("iso_b6c4_125x324mm", NULL, "125x324mm", 125, 324), _PWG_MEDIA_MM("iso_b5_176x250mm", "iso-b5", "ISOB5", 176, 250), _PWG_MEDIA_MM("iso_b5-extra_201x276mm", NULL, "ISOB5Extra", 201, 276), _PWG_MEDIA_MM("iso_b4_250x353mm", "iso-b4", "ISOB4", 250, 353), _PWG_MEDIA_MM("iso_b3_353x500mm", "iso-b3", "ISOB3", 353, 500), _PWG_MEDIA_MM("iso_b2_500x707mm", "iso-b2", "ISOB2", 500, 707), _PWG_MEDIA_MM("iso_b1_707x1000mm", "iso-b1", "ISOB1", 707, 1000), _PWG_MEDIA_MM("iso_b0_1000x1414mm", "iso-b0", "ISOB0", 1000, 1414), _PWG_MEDIA_MM("iso_c10_28x40mm", "iso-c10", "EnvC10", 28, 40), _PWG_MEDIA_MM("iso_c9_40x57mm", "iso-c9", "EnvC9", 40, 57), _PWG_MEDIA_MM("iso_c8_57x81mm", "iso-c8", "EnvC8", 57, 81), _PWG_MEDIA_MM("iso_c7_81x114mm", "iso-c7", "EnvC7", 81, 114), _PWG_MEDIA_MM("iso_c7c6_81x162mm", NULL, "EnvC76", 81, 162), _PWG_MEDIA_MM("iso_c6_114x162mm", "iso-c6", "EnvC6", 114, 162), _PWG_MEDIA_MM("iso_c6c5_114x229mm", NULL, "EnvC65", 114, 229), _PWG_MEDIA_MM("iso_c5_162x229mm", "iso-c5", "EnvC5", 162, 229), _PWG_MEDIA_MM("iso_c4_229x324mm", "iso-c4", "EnvC4", 229, 324), _PWG_MEDIA_MM("iso_c3_324x458mm", "iso-c3", "EnvC3", 324, 458), _PWG_MEDIA_MM("iso_c2_458x648mm", "iso-c2", "EnvC2", 458, 648), _PWG_MEDIA_MM("iso_c1_648x917mm", "iso-c1", "EnvC1", 648, 917), _PWG_MEDIA_MM("iso_c0_917x1297mm", "iso-c0", "EnvC0", 917, 1297), _PWG_MEDIA_MM("iso_dl_110x220mm", "iso-designated", "EnvDL", 110, 220), _PWG_MEDIA_MM("iso_ra4_215x305mm", "iso-ra4", "RA4", 215, 305), _PWG_MEDIA_MM("iso_sra4_225x320mm", "iso-sra4", "SRA4", 225, 320), _PWG_MEDIA_MM("iso_ra3_305x430mm", "iso-ra3", "RA3", 305, 430), _PWG_MEDIA_MM("iso_sra3_320x450mm", "iso-sra3", "SRA3", 320, 450), _PWG_MEDIA_MM("iso_ra2_430x610mm", "iso-ra2", "RA2", 430, 610), _PWG_MEDIA_MM("iso_sra2_450x640mm", "iso-sra2", "SRA2", 450, 640), _PWG_MEDIA_MM("iso_ra1_610x860mm", "iso-ra1", "RA1", 610, 860), _PWG_MEDIA_MM("iso_sra1_640x900mm", "iso-sra1", "SRA1", 640, 900), _PWG_MEDIA_MM("iso_ra0_860x1220mm", "iso-ra0", "RA0", 860, 1220), _PWG_MEDIA_MM("iso_sra0_900x1280mm", "iso-sra0", "SRA0", 900, 1280), /* Japanese Standard Sheet Media Sizes */ _PWG_MEDIA_MM("jis_b10_32x45mm", "jis-b10", "B10", 32, 45), _PWG_MEDIA_MM("jis_b9_45x64mm", "jis-b9", "B9", 45, 64), _PWG_MEDIA_MM("jis_b8_64x91mm", "jis-b8", "B8", 64, 91), _PWG_MEDIA_MM("jis_b7_91x128mm", "jis-b7", "B7", 91, 128), _PWG_MEDIA_MM("jis_b6_128x182mm", "jis-b6", "B6", 128, 182), _PWG_MEDIA_MM("jis_b5_182x257mm", "jis-b5", "B5", 182, 257), _PWG_MEDIA_MM("jis_b4_257x364mm", "jis-b4", "B4", 257, 364), _PWG_MEDIA_MM("jis_b3_364x515mm", "jis-b3", "B3", 364, 515), _PWG_MEDIA_MM("jis_b2_515x728mm", "jis-b2", "B2", 515, 728), _PWG_MEDIA_MM("jis_b1_728x1030mm", "jis-b1", "B1", 728, 1030), _PWG_MEDIA_MM("jis_b0_1030x1456mm", "jis-b0", "B0", 1030, 1456), _PWG_MEDIA_MM("jis_exec_216x330mm", NULL, "216x330mm", 216, 330), _PWG_MEDIA_MM("jpn_kaku1_270x382mm", NULL, "EnvKaku1", 270, 382), _PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332), _PWG_MEDIA_MM("jpn_kaku3_216x277mm", NULL, "EnvKaku3", 216, 277), _PWG_MEDIA_MM("jpn_kaku4_197x267mm", NULL, "EnvKaku4", 197, 267), _PWG_MEDIA_MM("jpn_kaku5_190x240mm", NULL, "EnvKaku5", 190, 240), _PWG_MEDIA_MM("jpn_kaku7_142x205mm", NULL, "EnvKaku7", 142, 205), _PWG_MEDIA_MM("jpn_kaku8_119x197mm", NULL, "EnvKaku8", 119, 197), _PWG_MEDIA_MM("jpn_chou4_90x205mm", NULL, "EnvChou4", 90, 205), _PWG_MEDIA_MM("jpn_hagaki_100x148mm", NULL, "Postcard", 100, 148), _PWG_MEDIA_MM("jpn_you4_105x235mm", NULL, "EnvYou4", 105, 235), _PWG_MEDIA_MM("jpn_you6_98x190mm", NULL, "EnvYou6", 98, 190), _PWG_MEDIA_MM("jpn_chou2_111.1x146mm", NULL, NULL, 111.1, 146), _PWG_MEDIA_MM("jpn_chou3_120x235mm", NULL, "EnvChou3", 120, 235), _PWG_MEDIA_MM("jpn_chou40_90x225mm", NULL, "EnvChou40", 90, 225), _PWG_MEDIA_MM("jpn_oufuku_148x200mm", NULL, "DoublePostcardRotated", 148, 200), _PWG_MEDIA_MM("jpn_kahu_240x322.1mm", NULL, "240x322mm", 240, 322.1), /* Chinese Standard Sheet Media Sizes */ _PWG_MEDIA_MM("prc_32k_97x151mm", NULL, "PRC32K", 97, 151), _PWG_MEDIA_MM("prc_1_102x165mm", NULL, "EnvPRC1", 102, 165), _PWG_MEDIA_MM("prc_2_102x176mm", NULL, "EnvPRC2", 102, 176), _PWG_MEDIA_MM("prc_4_110x208mm", NULL, "EnvPRC4", 110, 208), _PWG_MEDIA_MM("prc_8_120x309mm", NULL, "EnvPRC8", 120, 309), _PWG_MEDIA_MM("prc_6_120x320mm", NULL, NULL, 120, 320), _PWG_MEDIA_MM("prc_16k_146x215mm", NULL, "PRC16K", 146, 215), _PWG_MEDIA_MM("prc_7_160x230mm", NULL, "EnvPRC7", 160, 230), _PWG_MEDIA_MM("om_juuro-ku-kai_198x275mm", NULL, "198x275mm", 198, 275), _PWG_MEDIA_MM("om_pa-kai_267x389mm", NULL, "267x389mm", 267, 389), _PWG_MEDIA_MM("om_dai-pa-kai_275x395mm", NULL, "275x395mm", 275, 395), /* Chinese Standard Sheet Media Inch Sizes */ _PWG_MEDIA_IN("roc_16k_7.75x10.75in", NULL, "roc16k", 7.75, 10.75), _PWG_MEDIA_IN("roc_8k_10.75x15.5in", NULL, "roc8k", 10.75, 15.5), /* Other English Standard Sheet Media Sizes */ _PWG_MEDIA_IN("oe_photo-l_3.5x5in", NULL, "3.5x5", 3.5, 5), /* Other Metric Standard Sheet Media Sizes */ _PWG_MEDIA_MM("om_small-photo_100x150mm", NULL, "100x150mm", 100, 150), _PWG_MEDIA_MM("om_italian_110x230mm", NULL, "EnvItalian", 110, 230), _PWG_MEDIA_MM("om_large-photo_200x300", NULL, "200x300mm", 200, 300), _PWG_MEDIA_MM("om_folio_210x330mm", "folio", "Folio", 210, 330), _PWG_MEDIA_MM("om_folio-sp_215x315mm", NULL, "FolioSP", 215, 315), _PWG_MEDIA_MM("om_invite_220x220mm", NULL, "EnvInvite", 220, 220), _PWG_MEDIA_MM("om_small-photo_100x200mm", NULL, "100x200mm", 100, 200), /* Disc Sizes */ _PWG_MEDIA_MM("disc_standard_40x118mm", NULL, "Disc", 118, 118) }; /* * 'pwgFormatSizeName()' - Generate a PWG self-describing media size name. * * This function generates a PWG self-describing media size name of the form * "prefix_name_WIDTHxLENGTHunits". The prefix is typically "custom" or "roll" * for user-supplied sizes but can also be "disc", "iso", "jis", "jpn", "na", * "oe", "om", "prc", or "roc". A value of @code NULL@ automatically chooses * "oe" or "om" depending on the units. * * The size name may only contain lowercase letters, numbers, "-", and ".". If * @code NULL@ is passed, the size name will contain the formatted dimensions. * * The width and length are specified in hundredths of millimeters, equivalent * to 1/100000th of a meter or 1/2540th of an inch. The width, length, and * units used for the generated size name are calculated automatically if the * units string is @code NULL@, otherwise inches ("in") or millimeters ("mm") * are used. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ pwgFormatSizeName(char *keyword, /* I - Keyword buffer */ size_t keysize, /* I - Size of keyword buffer */ const char *prefix, /* I - Prefix for PWG size or @code NULL@ for automatic */ const char *name, /* I - Size name or @code NULL@ */ int width, /* I - Width of page in 2540ths */ int length, /* I - Length of page in 2540ths */ const char *units) /* I - Units - "in", "mm", or @code NULL@ for automatic */ { char usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */ *uptr; /* Pointer into unit size */ char *(*format)(char *, size_t, int); /* Formatting function */ /* * Range check input... */ DEBUG_printf(("pwgFormatSize(keyword=%p, keysize=" CUPS_LLFMT ", prefix=\"%s\", name=\"%s\", width=%d, length=%d, units=\"%s\")", (void *)keyword, CUPS_LLCAST keysize, prefix, name, width, length, units)); if (keyword) *keyword = '\0'; if (!keyword || keysize < 32 || width < 0 || length < 0 || (units && strcmp(units, "in") && strcmp(units, "mm"))) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media name arguments."), 1); return (0); } if (name) { /* * Validate name... */ const char *nameptr; /* Pointer into name */ for (nameptr = name; *nameptr; nameptr ++) if (!(*nameptr >= 'a' && *nameptr <= 'z') && !(*nameptr >= '0' && *nameptr <= '9') && *nameptr != '.' && *nameptr != '-') { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media name arguments."), 1); return (0); } } else name = usize; if (prefix && !strcmp(prefix, "disc")) width = 4000; /* Disc sizes use hardcoded 40mm inner diameter */ if (!units) { if ((width % 635) == 0 && (length % 635) == 0) { /* * Use inches since the size is a multiple of 1/4 inch. */ units = "in"; } else { /* * Use millimeters since the size is not a multiple of 1/4 inch. */ units = "mm"; } } if (!strcmp(units, "in")) { format = pwg_format_inches; if (!prefix) prefix = "oe"; } else { format = pwg_format_millimeters; if (!prefix) prefix = "om"; } /* * Format the size string... */ uptr = usize; (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), width); uptr += strlen(uptr); *uptr++ = 'x'; (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), length); uptr += strlen(uptr); /* * Safe because usize can hold up to 12 + 1 + 12 + 4 bytes. */ memcpy(uptr, units, 3); /* * Format the name... */ snprintf(keyword, keysize, "%s_%s_%s", prefix, name, usize); return (1); } /* * 'pwgInitSize()' - Initialize a pwg_size_t structure using IPP Job Template * attributes. * * This function initializes a pwg_size_t structure from an IPP "media" or * "media-col" attribute in the specified IPP message. 0 is returned if neither * attribute is found in the message or the values are not valid. * * The "margins_set" variable is initialized to 1 if any "media-xxx-margin" * member attribute was specified in the "media-col" Job Template attribute, * otherwise it is initialized to 0. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 if size was initialized, 0 otherwise */ pwgInitSize(pwg_size_t *size, /* I - Size to initialize */ ipp_t *job, /* I - Job template attributes */ int *margins_set) /* O - 1 if margins were set, 0 otherwise */ { ipp_attribute_t *media, /* media attribute */ *media_bottom_margin, /* media-bottom-margin member attribute */ *media_col, /* media-col attribute */ *media_left_margin, /* media-left-margin member attribute */ *media_right_margin, /* media-right-margin member attribute */ *media_size, /* media-size member attribute */ *media_top_margin, /* media-top-margin member attribute */ *x_dimension, /* x-dimension member attribute */ *y_dimension; /* y-dimension member attribute */ pwg_media_t *pwg; /* PWG media value */ /* * Range check input... */ if (!size || !job || !margins_set) return (0); /* * Look for media-col and then media... */ memset(size, 0, sizeof(pwg_size_t)); *margins_set = 0; if ((media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION)) != NULL) { /* * Got media-col, look for media-size member attribute... */ if ((media_size = ippFindAttribute(media_col->values[0].collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL) { /* * Got media-size, look for x-dimension and y-dimension member * attributes... */ x_dimension = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_INTEGER); y_dimension = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_INTEGER); if (x_dimension && y_dimension) { size->width = x_dimension->values[0].integer; size->length = y_dimension->values[0].integer; } else if (!x_dimension) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing x-dimension in media-size."), 1); return (0); } else if (!y_dimension) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing y-dimension in media-size."), 1); return (0); } } else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media-size in media-col."), 1); return (0); } /* media-*-margin */ media_bottom_margin = ippFindAttribute(media_col->values[0].collection, "media-bottom-margin", IPP_TAG_INTEGER); media_left_margin = ippFindAttribute(media_col->values[0].collection, "media-left-margin", IPP_TAG_INTEGER); media_right_margin = ippFindAttribute(media_col->values[0].collection, "media-right-margin", IPP_TAG_INTEGER); media_top_margin = ippFindAttribute(media_col->values[0].collection, "media-top-margin", IPP_TAG_INTEGER); if (media_bottom_margin && media_left_margin && media_right_margin && media_top_margin) { *margins_set = 1; size->bottom = media_bottom_margin->values[0].integer; size->left = media_left_margin->values[0].integer; size->right = media_right_margin->values[0].integer; size->top = media_top_margin->values[0].integer; } } else { if ((media = ippFindAttribute(job, "media", IPP_TAG_NAME)) == NULL) if ((media = ippFindAttribute(job, "media", IPP_TAG_KEYWORD)) == NULL) if ((media = ippFindAttribute(job, "PageSize", IPP_TAG_NAME)) == NULL) media = ippFindAttribute(job, "PageRegion", IPP_TAG_NAME); if (media && media->values[0].string.text) { const char *name = media->values[0].string.text; /* Name string */ if ((pwg = pwgMediaForPWG(name)) == NULL) { /* * Not a PWG name, try a legacy name... */ if ((pwg = pwgMediaForLegacy(name)) == NULL) { /* * Not a legacy name, try a PPD name... */ const char *suffix; /* Suffix on media string */ pwg = pwgMediaForPPD(name); if (pwg && (suffix = name + strlen(name) - 10 /* .FullBleed */) > name && !_cups_strcasecmp(suffix, ".FullBleed")) { /* * Indicate that margins are set with the default values of 0. */ *margins_set = 1; } } } if (pwg) { size->width = pwg->width; size->length = pwg->length; } else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unsupported media value."), 1); return (0); } } else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media or media-col."), 1); return (0); } } return (1); } /* * 'pwgMediaForLegacy()' - Find a PWG media size by ISO/IPP legacy name. * * The "name" argument specifies the legacy ISO media size name, for example * "iso-a4" or "na-letter". * * @since CUPS 1.7/macOS 10.9@ */ pwg_media_t * /* O - Matching size or NULL */ pwgMediaForLegacy(const char *legacy) /* I - Legacy size name */ { pwg_media_t key; /* Search key */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (!legacy) return (NULL); /* * Build the lookup table for PWG names as needed... */ if (!cg->leg_size_lut) { int i; /* Looping var */ pwg_media_t *size; /* Current size */ cg->leg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_legacy, NULL); for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), size = (pwg_media_t *)cups_pwg_media; i > 0; i --, size ++) if (size->legacy) cupsArrayAdd(cg->leg_size_lut, size); } /* * Lookup the name... */ key.legacy = legacy; return ((pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key)); } /* * 'pwgMediaForPPD()' - Find a PWG media size by Adobe PPD name. * * The "ppd" argument specifies an Adobe page size name as defined in Table B.1 * of the Adobe PostScript Printer Description File Format Specification Version * 4.3. * * If the name is non-standard, the returned PWG media size is stored in * thread-local storage and is overwritten by each call to the function in the * thread. Custom names can be of the form "Custom.WIDTHxLENGTH[units]" or * "WIDTHxLENGTH[units]". * * @since CUPS 1.7/macOS 10.9@ */ pwg_media_t * /* O - Matching size or NULL */ pwgMediaForPPD(const char *ppd) /* I - PPD size name */ { pwg_media_t key, /* Search key */ *size; /* Matching size */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (!ppd) return (NULL); /* * Build the lookup table for PWG names as needed... */ if (!cg->ppd_size_lut) { int i; /* Looping var */ cg->ppd_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_ppd, NULL); for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), size = (pwg_media_t *)cups_pwg_media; i > 0; i --, size ++) if (size->ppd) cupsArrayAdd(cg->ppd_size_lut, size); } /* * Lookup the name... */ key.ppd = ppd; if ((size = (pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL) { /* * See if the name is of the form: * * [Custom.]WIDTHxLENGTH[.FullBleed] - Size in points/inches [borderless] * [Custom.]WIDTHxLENGTHcm[.FullBleed] - Size in centimeters [borderless] * [Custom.]WIDTHxLENGTHft[.FullBleed] - Size in feet [borderless] * [Custom.]WIDTHxLENGTHin[.FullBleed] - Size in inches [borderless] * [Custom.]WIDTHxLENGTHm[.FullBleed] - Size in meters [borderless] * [Custom.]WIDTHxLENGTHmm[.FullBleed] - Size in millimeters [borderless] * [Custom.]WIDTHxLENGTHpt[.FullBleed] - Size in points [borderless] */ int w, l, /* Width and length of page */ numer, /* Unit scaling factor */ denom; /* ... */ char *ptr; /* Pointer into name */ const char *units; /* Pointer to units */ int custom; /* Custom page size? */ if (!_cups_strncasecmp(ppd, "Custom.", 7)) { custom = 1; numer = 2540; denom = 72; ptr = (char *)ppd + 7; } else { custom = 0; numer = 2540; denom = 1; ptr = (char *)ppd; } /* * Find any units in the size... */ units = strchr(ptr, '.'); while (units && isdigit(units[1] & 255)) units = strchr(units + 1, '.'); if (units) units -= 2; else units = ptr + strlen(ptr) - 2; if (units > ptr) { if (isdigit(*units & 255) || *units == '.') units ++; if (!_cups_strncasecmp(units, "cm", 2)) { numer = 1000; denom = 1; } else if (!_cups_strncasecmp(units, "ft", 2)) { numer = 2540 * 12; denom = 1; } else if (!_cups_strncasecmp(units, "in", 2)) { numer = 2540; denom = 1; } else if (!_cups_strncasecmp(units, "mm", 2)) { numer = 100; denom = 1; } else if (*units == 'm' || *units == 'M') { numer = 100000; denom = 1; } else if (!_cups_strncasecmp(units, "pt", 2)) { numer = 2540; denom = 72; } } w = pwg_scan_measurement(ptr, &ptr, numer, denom); if (ptr && ptr > ppd && *ptr == 'x') { l = pwg_scan_measurement(ptr + 1, &ptr, numer, denom); if (ptr) { /* * Not a standard size; convert it to a PWG custom name of the form: * * [oe|om]_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu */ char wstr[32], lstr[32]; /* Width and length as strings */ size = &(cg->pwg_media); size->width = w; size->length = l; size->pwg = cg->pwg_name; pwgFormatSizeName(cg->pwg_name, sizeof(cg->pwg_name), custom ? "custom" : NULL, custom ? ppd + 7 : NULL, size->width, size->length, NULL); if ((w % 635) == 0 && (l % 635) == 0) snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%s", pwg_format_inches(wstr, sizeof(wstr), w), pwg_format_inches(lstr, sizeof(lstr), l)); else snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%smm", pwg_format_millimeters(wstr, sizeof(wstr), w), pwg_format_millimeters(lstr, sizeof(lstr), l)); size->ppd = cg->ppd_name; } } } return (size); } /* * 'pwgMediaForPWG()' - Find a PWG media size by 5101.1 self-describing name. * * The "pwg" argument specifies a self-describing media size name of the form * "prefix_name_WIDTHxLENGTHunits" as defined in PWG 5101.1. * * If the name is non-standard, the returned PWG media size is stored in * thread-local storage and is overwritten by each call to the function in the * thread. * * @since CUPS 1.7/macOS 10.9@ */ pwg_media_t * /* O - Matching size or NULL */ pwgMediaForPWG(const char *pwg) /* I - PWG size name */ { char *ptr; /* Pointer into name */ pwg_media_t key, /* Search key */ *size; /* Matching size */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (!pwg) return (NULL); /* * Build the lookup table for PWG names as needed... */ if (!cg->pwg_size_lut) { int i; /* Looping var */ cg->pwg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_pwg, NULL); for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), size = (pwg_media_t *)cups_pwg_media; i > 0; i --, size ++) cupsArrayAdd(cg->pwg_size_lut, size); } /* * Lookup the name... */ key.pwg = pwg; if ((size = (pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL && (ptr = (char *)strchr(pwg, '_')) != NULL && (ptr = (char *)strchr(ptr + 1, '_')) != NULL) { /* * Try decoding the self-describing name of the form: * * class_name_WWWxHHHin[_something] * class_name_WWWxHHHmm[_something] */ int w, l; /* Width and length of page */ int numer; /* Scale factor for units */ const char *units; /* Units from size */ if ((units = strchr(ptr + 1, '_')) != NULL) units -= 2; else units = ptr + strlen(ptr) - 2; ptr ++; if (units >= ptr && (!strcmp(units, "in") || !strncmp(units, "in_", 3))) numer = 2540; else numer = 100; w = pwg_scan_measurement(ptr, &ptr, numer, 1); if (ptr && *ptr == 'x') { l = pwg_scan_measurement(ptr + 1, &ptr, numer, 1); if (ptr) { char wstr[32], lstr[32]; /* Width and length strings */ if (!strncmp(pwg, "disc_", 5)) w = l; /* Make the media size OUTERxOUTER */ size = &(cg->pwg_media); size->width = w; size->length = l; strlcpy(cg->pwg_name, pwg, sizeof(cg->pwg_name)); size->pwg = cg->pwg_name; if (numer == 100) snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%smm", pwg_format_millimeters(wstr, sizeof(wstr), w), pwg_format_millimeters(lstr, sizeof(lstr), l)); else snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%s", pwg_format_inches(wstr, sizeof(wstr), w), pwg_format_inches(lstr, sizeof(lstr), l)); size->ppd = cg->ppd_name; } } } return (size); } /* * 'pwgMediaForSize()' - Get the PWG media size for the given dimensions. * * The "width" and "length" are in hundredths of millimeters, equivalent to * 1/100000th of a meter or 1/2540th of an inch. * * If the dimensions are non-standard, the returned PWG media size is stored in * thread-local storage and is overwritten by each call to the function in the * thread. * * @since CUPS 1.7/macOS 10.9@ */ pwg_media_t * /* O - PWG media name */ pwgMediaForSize(int width, /* I - Width in hundredths of millimeters */ int length) /* I - Length in hundredths of millimeters */ { /* * Adobe uses a size matching algorithm with an epsilon of 5 points, which * is just about 176/2540ths... But a lot of international media sizes are * very close so use 0.5mm (50/2540ths) as the maximum delta. */ return (_pwgMediaNearSize(width, length, _PWG_EPSILON)); } /* * '_pwgMediaNearSize()' - Get the PWG media size within the given tolerance. */ pwg_media_t * /* O - PWG media name */ _pwgMediaNearSize(int width, /* I - Width in hundredths of millimeters */ int length, /* I - Length in hundredths of millimeters */ int epsilon) /* I - Match within this tolernace. PWG units */ { int i; /* Looping var */ pwg_media_t *media, /* Current media */ *best_media = NULL; /* Best match */ int dw, dl, /* Difference in width and length */ best_dw = 999, /* Best difference in width and length */ best_dl = 999; char wstr[32], lstr[32]; /* Width and length as strings */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ /* * Range check input... */ if (width <= 0 || length <= 0) return (NULL); /* * Look for a standard size... */ for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), media = (pwg_media_t *)cups_pwg_media; i > 0; i --, media ++) { dw = abs(media->width - width); dl = abs(media->length - length); if (!dw && !dl) return (media); else if (dw <= epsilon && dl <= epsilon) { if (dw <= best_dw && dl <= best_dl) { best_media = media; best_dw = dw; best_dl = dl; } } } if (best_media) return (best_media); /* * Not a standard size; convert it to a PWG custom name of the form: * * custom_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu */ pwgFormatSizeName(cg->pwg_name, sizeof(cg->pwg_name), "custom", NULL, width, length, NULL); cg->pwg_media.pwg = cg->pwg_name; cg->pwg_media.width = width; cg->pwg_media.length = length; if ((width % 635) == 0 && (length % 635) == 0) snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%s", pwg_format_inches(wstr, sizeof(wstr), width), pwg_format_inches(lstr, sizeof(lstr), length)); else snprintf(cg->ppd_name, sizeof(cg->ppd_name), "%sx%smm", pwg_format_millimeters(wstr, sizeof(wstr), width), pwg_format_millimeters(lstr, sizeof(lstr), length)); cg->pwg_media.ppd = cg->ppd_name; return (&(cg->pwg_media)); } /* * '_pwgMediaTable()' - Return the internal media size table. */ const pwg_media_t * /* O - Pointer to first entry */ _pwgMediaTable(size_t *num_media) /* O - Number of entries */ { *num_media = sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0]); return (cups_pwg_media); } /* * 'pwg_compare_legacy()' - Compare two sizes using the legacy names. */ static int /* O - Result of comparison */ pwg_compare_legacy(pwg_media_t *a, /* I - First size */ pwg_media_t *b) /* I - Second size */ { return (strcmp(a->legacy, b->legacy)); } /* * 'pwg_compare_ppd()' - Compare two sizes using the PPD names. */ static int /* O - Result of comparison */ pwg_compare_ppd(pwg_media_t *a, /* I - First size */ pwg_media_t *b) /* I - Second size */ { return (strcmp(a->ppd, b->ppd)); } /* * 'pwg_compare_pwg()' - Compare two sizes using the PWG names. */ static int /* O - Result of comparison */ pwg_compare_pwg(pwg_media_t *a, /* I - First size */ pwg_media_t *b) /* I - Second size */ { return (strcmp(a->pwg, b->pwg)); } /* * 'pwg_format_inches()' - Convert and format PWG units as inches. */ static char * /* O - String */ pwg_format_inches(char *buf, /* I - Buffer */ size_t bufsize, /* I - Size of buffer */ int val) /* I - Value in hundredths of millimeters */ { int thousandths, /* Thousandths of inches */ integer, /* Integer portion */ fraction; /* Fractional portion */ /* * Convert hundredths of millimeters to thousandths of inches and round to * the nearest thousandth. */ thousandths = (val * 1000 + 1270) / 2540; integer = thousandths / 1000; fraction = thousandths % 1000; /* * Format as a pair of integers (avoids locale stuff), avoiding trailing * zeros... */ if (fraction == 0) snprintf(buf, bufsize, "%d", integer); else if (fraction % 10) snprintf(buf, bufsize, "%d.%03d", integer, fraction); else if (fraction % 100) snprintf(buf, bufsize, "%d.%02d", integer, fraction / 10); else snprintf(buf, bufsize, "%d.%01d", integer, fraction / 100); return (buf); } /* * 'pwg_format_millimeters()' - Convert and format PWG units as millimeters. */ static char * /* O - String */ pwg_format_millimeters(char *buf, /* I - Buffer */ size_t bufsize, /* I - Size of buffer */ int val) /* I - Value in hundredths of millimeters */ { int integer, /* Integer portion */ fraction; /* Fractional portion */ /* * Convert hundredths of millimeters to integer and fractional portions. */ integer = val / 100; fraction = val % 100; /* * Format as a pair of integers (avoids locale stuff), avoiding trailing * zeros... */ if (fraction == 0) snprintf(buf, bufsize, "%d", integer); else if (fraction % 10) snprintf(buf, bufsize, "%d.%02d", integer, fraction); else snprintf(buf, bufsize, "%d.%01d", integer, fraction / 10); return (buf); } /* * 'pwg_scan_measurement()' - Scan a measurement in inches or millimeters. * * The "factor" argument specifies the scale factor for the units to convert to * hundredths of millimeters. The returned value is NOT rounded but is an * exact conversion of the fraction value (no floating point is used). */ static int /* O - Hundredths of millimeters */ pwg_scan_measurement( const char *buf, /* I - Number string */ char **bufptr, /* O - First byte after the number */ int numer, /* I - Numerator from units */ int denom) /* I - Denominator from units */ { int value = 0, /* Measurement value */ fractional = 0, /* Fractional value */ divisor = 1, /* Fractional divisor */ digits = 10 * numer * denom; /* Maximum fractional value to read */ /* * Scan integer portion... */ while (*buf >= '0' && *buf <= '9') value = value * 10 + (*buf++) - '0'; if (*buf == '.') { /* * Scan fractional portion... */ buf ++; while (divisor < digits && *buf >= '0' && *buf <= '9') { fractional = fractional * 10 + (*buf++) - '0'; divisor *= 10; } /* * Skip trailing digits that won't contribute... */ while (*buf >= '0' && *buf <= '9') buf ++; } if (bufptr) *bufptr = (char *)buf; return (value * numer / denom + fractional * numer / denom / divisor); } cups-2.3.1/cups/ipp-private.h000664 000765 000024 00000014731 13574721672 016170 0ustar00mikestaff000000 000000 /* * Private IPP definitions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_IPP_PRIVATE_H_ # define _CUPS_IPP_PRIVATE_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define IPP_BUF_SIZE (IPP_MAX_LENGTH + 2) /* Size of buffer */ /* * Structures... */ typedef union _ipp_request_u /**** Request Header ****/ { struct /* Any Header */ { ipp_uchar_t version[2]; /* Protocol version number */ int op_status; /* Operation ID or status code*/ int request_id; /* Request ID */ } any; struct /* Operation Header */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_op_t operation_id; /* Operation ID */ int request_id; /* Request ID */ } op; struct /* Status Header */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_status_t status_code; /* Status code */ int request_id; /* Request ID */ } status; /**** New in CUPS 1.1.19 ****/ struct /* Event Header @since CUPS 1.1.19/macOS 10.3@ */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_status_t status_code; /* Status code */ int request_id; /* Request ID */ } event; } _ipp_request_t; typedef union _ipp_value_u /**** Attribute Value ****/ { int integer; /* Integer/enumerated value */ char boolean; /* Boolean value */ ipp_uchar_t date[11]; /* Date/time value */ struct { int xres, /* Horizontal resolution */ yres; /* Vertical resolution */ ipp_res_t units; /* Resolution units */ } resolution; /* Resolution value */ struct { int lower, /* Lower value */ upper; /* Upper value */ } range; /* Range of integers value */ struct { char *language; /* Language code */ char *text; /* String */ } string; /* String with language value */ struct { int length; /* Length of attribute */ void *data; /* Data in attribute */ } unknown; /* Unknown attribute type */ /**** New in CUPS 1.1.19 ****/ ipp_t *collection; /* Collection value @since CUPS 1.1.19/macOS 10.3@ */ } _ipp_value_t; struct _ipp_attribute_s /**** IPP attribute ****/ { ipp_attribute_t *next; /* Next attribute in list */ ipp_tag_t group_tag, /* Job/Printer/Operation group tag */ value_tag; /* What type of value is it? */ char *name; /* Name of attribute */ int num_values; /* Number of values */ _ipp_value_t values[1]; /* Values */ }; struct _ipp_s /**** IPP Request/Response/Notification ****/ { ipp_state_t state; /* State of request */ _ipp_request_t request; /* Request header */ ipp_attribute_t *attrs; /* Attributes */ ipp_attribute_t *last; /* Last attribute in list */ ipp_attribute_t *current; /* Current attribute (for read/write) */ ipp_tag_t curtag; /* Current attribute group tag */ /**** New in CUPS 1.2 ****/ ipp_attribute_t *prev; /* Previous attribute (for read) @since CUPS 1.2/macOS 10.5@ */ /**** New in CUPS 1.4.4 ****/ int use; /* Use count @since CUPS 1.4.4/macOS 10.6.?@ */ /**** New in CUPS 2.0 ****/ int atend, /* At end of list? */ curindex; /* Current attribute index for hierarchical search */ }; typedef struct _ipp_option_s /**** Attribute mapping data ****/ { int multivalue; /* Option has multiple values? */ const char *name; /* Option/attribute name */ ipp_tag_t value_tag; /* Value tag for this attribute */ ipp_tag_t group_tag; /* Group tag for this attribute */ ipp_tag_t alt_group_tag; /* Alternate group tag for this * attribute */ const ipp_op_t *operations; /* Allowed operations for this attr */ } _ipp_option_t; typedef struct _ipp_file_s _ipp_file_t;/**** File Parser ****/ typedef struct _ipp_vars_s _ipp_vars_t;/**** Variables ****/ typedef int (*_ipp_fattr_cb_t)(_ipp_file_t *f, void *user_data, const char *attr); /**** File Attribute (Filter) Callback ****/ typedef int (*_ipp_ferror_cb_t)(_ipp_file_t *f, void *user_data, const char *error); /**** File Parser Error Callback ****/ typedef int (*_ipp_ftoken_cb_t)(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *token); /**** File Parser Token Callback ****/ struct _ipp_vars_s /**** Variables ****/ { char *uri, /* URI for printer */ scheme[64], /* Scheme from URI */ username[256], /* Username from URI */ *password, /* Password from URI (if any) */ host[256], /* Hostname from URI */ portstr[32], /* Port number string */ resource[1024]; /* Resource path from URI */ int port; /* Port number from URI */ int num_vars; /* Number of variables */ cups_option_t *vars; /* Array of variables */ int password_tries; /* Number of retries for password */ _ipp_fattr_cb_t attrcb; /* Attribute (filter) callback */ _ipp_ferror_cb_t errorcb; /* Error callback */ _ipp_ftoken_cb_t tokencb; /* Token callback */ }; struct _ipp_file_s /**** File Parser */ { const char *filename; /* Filename */ cups_file_t *fp; /* File pointer */ int linenum; /* Current line number */ ipp_t *attrs; /* Attributes */ ipp_tag_t group_tag; /* Current group for new attributes */ }; /* * Prototypes for private functions... */ /* encode.c */ #ifdef DEBUG extern const char *_ippCheckOptions(void) _CUPS_PRIVATE; #endif /* DEBUG */ extern _ipp_option_t *_ippFindOption(const char *name) _CUPS_PRIVATE; /* ipp-file.c */ extern ipp_t *_ippFileParse(_ipp_vars_t *v, const char *filename, void *user_data) _CUPS_PRIVATE; extern int _ippFileReadToken(_ipp_file_t *f, char *token, size_t tokensize) _CUPS_PRIVATE; /* ipp-vars.c */ extern void _ippVarsDeinit(_ipp_vars_t *v) _CUPS_PRIVATE; extern void _ippVarsExpand(_ipp_vars_t *v, char *dst, const char *src, size_t dstsize) _CUPS_NONNULL(1,2,3) _CUPS_PRIVATE; extern const char *_ippVarsGet(_ipp_vars_t *v, const char *name) _CUPS_PRIVATE; extern void _ippVarsInit(_ipp_vars_t *v, _ipp_fattr_cb_t attrcb, _ipp_ferror_cb_t errorcb, _ipp_ftoken_cb_t tokencb) _CUPS_PRIVATE; extern const char *_ippVarsPasswordCB(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data) _CUPS_PRIVATE; extern int _ippVarsSet(_ipp_vars_t *v, const char *name, const char *value) _CUPS_PRIVATE; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_IPP_H_ */ cups-2.3.1/cups/ipp-support.c000664 000765 000024 00000237251 13574721672 016231 0ustar00mikestaff000000 000000 /* * Internet Printing Protocol support functions for CUPS. * * Copyright © 2007-2018 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. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * Local globals... */ static const char * const ipp_states[] = { "IPP_STATE_ERROR", "IPP_STATE_IDLE", "IPP_STATE_HEADER", "IPP_STATE_ATTRIBUTE", "IPP_STATE_DATA" }; static const char * const ipp_status_oks[] = /* "OK" status codes */ { /* (name) = abandoned standard value */ "successful-ok", "successful-ok-ignored-or-substituted-attributes", "successful-ok-conflicting-attributes", "successful-ok-ignored-subscriptions", "(successful-ok-ignored-notifications)", "successful-ok-too-many-events", "(successful-ok-but-cancel-subscription)", "successful-ok-events-complete" }, * const ipp_status_400s[] = /* Client errors */ { /* (name) = abandoned standard value */ "client-error-bad-request", "client-error-forbidden", "client-error-not-authenticated", "client-error-not-authorized", "client-error-not-possible", "client-error-timeout", "client-error-not-found", "client-error-gone", "client-error-request-entity-too-large", "client-error-request-value-too-long", "client-error-document-format-not-supported", "client-error-attributes-or-values-not-supported", "client-error-uri-scheme-not-supported", "client-error-charset-not-supported", "client-error-conflicting-attributes", "client-error-compression-not-supported", "client-error-compression-error", "client-error-document-format-error", "client-error-document-access-error", "client-error-attributes-not-settable", "client-error-ignored-all-subscriptions", "client-error-too-many-subscriptions", "(client-error-ignored-all-notifications)", "(client-error-client-print-support-file-not-found)", "client-error-document-password-error", "client-error-document-permission-error", "client-error-document-security-error", "client-error-document-unprintable-error", "client-error-account-info-needed", "client-error-account-closed", "client-error-account-limit-reached", "client-error-account-authorization-failed", "client-error-not-fetchable" }, * const ipp_status_480s[] = /* Vendor client errors */ { /* 0x0480 - 0x048F */ "0x0480", "0x0481", "0x0482", "0x0483", "0x0484", "0x0485", "0x0486", "0x0487", "0x0488", "0x0489", "0x048A", "0x048B", "0x048C", "0x048D", "0x048E", "0x048F", /* 0x0490 - 0x049F */ "0x0490", "0x0491", "0x0492", "0x0493", "0x0494", "0x0495", "0x0496", "0x0497", "0x0498", "0x0499", "0x049A", "0x049B", "cups-error-account-info-needed", "cups-error-account-closed", "cups-error-account-limit-reached", "cups-error-account-authorization-failed" }, * const ipp_status_500s[] = /* Server errors */ { "server-error-internal-error", "server-error-operation-not-supported", "server-error-service-unavailable", "server-error-version-not-supported", "server-error-device-error", "server-error-temporary-error", "server-error-not-accepting-jobs", "server-error-busy", "server-error-job-canceled", "server-error-multiple-document-jobs-not-supported", "server-error-printer-is-deactivated", "server-error-too-many-jobs", "server-error-too-many-documents" }, * const ipp_status_1000s[] = /* CUPS internal */ { "cups-authentication-canceled", "cups-pki-error", "cups-upgrade-required" }; static const char * const ipp_std_ops[] = { /* 0x0000 - 0x000f */ "0x0000", "0x0001", "Print-Job", /* RFC 8011 */ "Print-URI", /* RFC 8011 */ "Validate-Job", /* RFC 8011 */ "Create-Job", /* RFC 8011 */ "Send-Document", /* RFC 8011 */ "Send-URI", /* RFC 8011 */ "Cancel-Job", /* RFC 8011 */ "Get-Job-Attributes", /* RFC 8011 */ "Get-Jobs", /* RFC 8011 */ "Get-Printer-Attributes", /* RFC 8011 */ "Hold-Job", /* RFC 8011 */ "Release-Job", /* RFC 8011 */ "Restart-Job", /* RFC 8011 */ "0x000f", /* 0x0010 - 0x001f */ "Pause-Printer", /* RFC 8011 */ "Resume-Printer", /* RFC 8011 */ "Purge-Jobs", /* RFC 8011 */ "Set-Printer-Attributes", /* RFC 3380 */ "Set-Job-Attributes", /* RFC 3380 */ "Get-Printer-Supported-Values", /* RFC 3380 */ "Create-Printer-Subscriptions", /* RFC 3995 */ "Create-Job-Subscriptions", /* RFC 3995 */ "Get-Subscription-Attributes", /* RFC 3995 */ "Get-Subscriptions", /* RFC 3995 */ "Renew-Subscription", /* RFC 3995 */ "Cancel-Subscription", /* RFC 3995 */ "Get-Notifications", /* RFC 3996 */ "(Send-Notifications)", "Get-Resource-Attributes", /* IPP System */ "(Get-Resource-Data)", /* 0x0020 - 0x002f */ "Get-Resources", /* IPP System */ "(Get-Printer-Support-Files)", "Enable-Printer", /* RFC 3998 */ "Disable-Printer", /* RFC 3998 */ "Pause-Printer-After-Current-Job", /* RFC 3998 */ "Hold-New-Jobs", /* RFC 3998 */ "Release-Held-New-Jobs", /* RFC 3998 */ "Deactivate-Printer", /* RFC 3998 */ "Activate-Printer", /* RFC 3998 */ "Restart-Printer", /* RFC 3998 */ "Shutdown-Printer", /* RFC 3998 */ "Startup-Printer", /* RFC 3998 */ "Reprocess-Job", /* RFC 3998 */ "Cancel-Current-Job", /* RFC 3998 */ "Suspend-Current-Job", /* RFC 3998 */ "Resume-Job", /* RFC 3998 */ /* 0x0030 - 0x003f */ "Promote-Job", /* RFC 3998 */ "Schedule-Job-After", /* RFC 3998 */ "0x0032", "Cancel-Document", /* IPP DocObject */ "Get-Document-Attributes", /* IPP DocObject */ "Get-Documents", /* IPP DocObject */ "Delete-Document", /* IPP DocObject */ "Set-Document-Attributes", /* IPP DocObject */ "Cancel-Jobs", /* IPP JPS2 */ "Cancel-My-Jobs", /* IPP JPS2 */ "Resubmit-Job", /* IPP JPS2 */ "Close-Job", /* IPP JPS2 */ "Identify-Printer", /* IPP JPS3 */ "Validate-Document", /* IPP JPS3 */ "Add-Document-Images", /* IPP Scan */ "Acknowledge-Document", /* IPP INFRA */ /* 0x0040 - 0x004f */ "Acknowledge-Identify-Printer", /* IPP INFRA */ "Acknowledge-Job", /* IPP INFRA */ "Fetch-Document", /* IPP INFRA */ "Fetch-Job", /* IPP INFRA */ "Get-Output-Device-Attributes", /* IPP INFRA */ "Update-Active-Jobs", /* IPP INFRA */ "Deregister-Output-Device", /* IPP INFRA */ "Update-Document-Status", /* IPP INFRA */ "Update-Job-Status", /* IPP INFRA */ "Update-Output-Device-Attributes", /* IPP INFRA */ "Get-Next-Document-Data", /* IPP Scan */ "Allocate-Printer-Resources", /* IPP System */ "Create-Printer", /* IPP System */ "Deallocate-Printer-Resources", /* IPP System */ "Delete-Printer", /* IPP System */ "Get-Printers", /* IPP System */ /* 0x0050 - 0x005f */ "Shutdown-One-Printer", /* IPP System */ "Startup-One-Printer", /* IPP System */ "Cancel-Resource", /* IPP System */ "Create-Resource", /* IPP System */ "Install-Resource", /* IPP System */ "Send-Resource-Data", /* IPP System */ "Set-Resource-Attributes", /* IPP System */ "Create-Resource-Subscriptions", /* IPP System */ "Create-System-Subscriptions", /* IPP System */ "Disable-All-Printers", /* IPP System */ "Enable-All-Printers", /* IPP System */ "Get-System-Attributes", /* IPP System */ "Get-System-Supported-Values", /* IPP System */ "Pause-All-Printers", /* IPP System */ "Pause-All-Printers-After-Current-Job", /* IPP System */ "Register-Output-Device", /* IPP System */ /* 0x0060 - 0x0064 */ "Restart-System", /* IPP System */ "Resume-All-Printers", /* IPP System */ "Set-System-Attributes", /* IPP System */ "Shutdown-All-Printers", /* IPP System */ "Startup-All-Printers" /* IPP System */ }, * const ipp_cups_ops[] = { "CUPS-Get-Default", "CUPS-Get-Printers", "CUPS-Add-Modify-Printer", "CUPS-Delete-Printer", "CUPS-Get-Classes", "CUPS-Add-Modify-Class", "CUPS-Delete-Class", "CUPS-Accept-Jobs", "CUPS-Reject-Jobs", "CUPS-Set-Default", "CUPS-Get-Devices", "CUPS-Get-PPDs", "CUPS-Move-Job", "CUPS-Authenticate-Job", "CUPS-Get-PPD" }, * const ipp_cups_ops2[] = { "CUPS-Get-Document", "CUPS-Create-Local-Printer" }, * const ipp_tag_names[] = { /* Value/group tag names */ "zero", /* 0x00 */ "operation-attributes-tag", /* 0x01 */ "job-attributes-tag", /* 0x02 */ "end-of-attributes-tag", /* 0x03 */ "printer-attributes-tag", /* 0x04 */ "unsupported-attributes-tag", /* 0x05 */ "subscription-attributes-tag", /* 0x06 - RFC 3995 */ "event-notification-attributes-tag", /* 0x07 - RFC 3995 */ "resource-attributes-tag", /* 0x08 - IPP System */ "document-attributes-tag", /* 0x09 - IPP DocObject */ "system-attributes-tag", /* 0x0a - IPP System */ "0x0b", /* 0x0b */ "0x0c", /* 0x0c */ "0x0d", /* 0x0d */ "0x0e", /* 0x0e */ "0x0f", /* 0x0f */ "unsupported", /* 0x10 */ "default", /* 0x11 */ "unknown", /* 0x12 */ "no-value", /* 0x13 */ "0x14", /* 0x14 */ "not-settable", /* 0x15 - RFC 3380 */ "delete-attribute", /* 0x16 - RFC 3380 */ "admin-define", /* 0x17 - RFC 3380 */ "0x18", /* 0x18 */ "0x19", /* 0x19 */ "0x1a", /* 0x1a */ "0x1b", /* 0x1b */ "0x1c", /* 0x1c */ "0x1d", /* 0x1d */ "0x1e", /* 0x1e */ "0x1f", /* 0x1f */ "0x20", /* 0x20 */ "integer", /* 0x21 */ "boolean", /* 0x22 */ "enum", /* 0x23 */ "0x24", /* 0x24 */ "0x25", /* 0x25 */ "0x26", /* 0x26 */ "0x27", /* 0x27 */ "0x28", /* 0x28 */ "0x29", /* 0x29 */ "0x2a", /* 0x2a */ "0x2b", /* 0x2b */ "0x2c", /* 0x2c */ "0x2d", /* 0x2d */ "0x2e", /* 0x2e */ "0x2f", /* 0x2f */ "octetString", /* 0x30 */ "dateTime", /* 0x31 */ "resolution", /* 0x32 */ "rangeOfInteger", /* 0x33 */ "collection", /* 0x34 */ "textWithLanguage", /* 0x35 */ "nameWithLanguage", /* 0x36 */ "endCollection", /* 0x37 */ "0x38", /* 0x38 */ "0x39", /* 0x39 */ "0x3a", /* 0x3a */ "0x3b", /* 0x3b */ "0x3c", /* 0x3c */ "0x3d", /* 0x3d */ "0x3e", /* 0x3e */ "0x3f", /* 0x3f */ "0x40", /* 0x40 */ "textWithoutLanguage",/* 0x41 */ "nameWithoutLanguage",/* 0x42 */ "0x43", /* 0x43 */ "keyword", /* 0x44 */ "uri", /* 0x45 */ "uriScheme", /* 0x46 */ "charset", /* 0x47 */ "naturalLanguage", /* 0x48 */ "mimeMediaType", /* 0x49 */ "memberAttrName" /* 0x4a */ }; static const char * const ipp_document_states[] = { /* document-state-enums */ "pending", "4", "processing", "processing-stopped", /* IPP INFRA */ "canceled", "aborted", "completed" }, * const ipp_finishings[] = { /* finishings enums */ "none", "staple", "punch", "cover", "bind", "saddle-stitch", "edge-stitch", "fold", "trim", "bale", "booklet-maker", "jog-offset", "coat", /* IPP Finishings 2.0 */ "laminate", /* IPP Finishings 2.0 */ "17", "18", "19", "staple-top-left", "staple-bottom-left", "staple-top-right", "staple-bottom-right", "edge-stitch-left", "edge-stitch-top", "edge-stitch-right", "edge-stitch-bottom", "staple-dual-left", "staple-dual-top", "staple-dual-right", "staple-dual-bottom", "staple-triple-left", /* IPP Finishings 2.0 */ "staple-triple-top", /* IPP Finishings 2.0 */ "staple-triple-right",/* IPP Finishings 2.0 */ "staple-triple-bottom",/* IPP Finishings 2.0 */ "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "bind-left", "bind-top", "bind-right", "bind-bottom", "54", "55", "56", "57", "58", "59", "trim-after-pages", "trim-after-documents", "trim-after-copies", "trim-after-job", "64", "65", "66", "67", "68", "69", "punch-top-left", /* IPP Finishings 2.0 */ "punch-bottom-left", /* IPP Finishings 2.0 */ "punch-top-right", /* IPP Finishings 2.0 */ "punch-bottom-right", /* IPP Finishings 2.0 */ "punch-dual-left", /* IPP Finishings 2.0 */ "punch-dual-top", /* IPP Finishings 2.0 */ "punch-dual-right", /* IPP Finishings 2.0 */ "punch-dual-bottom", /* IPP Finishings 2.0 */ "punch-triple-left", /* IPP Finishings 2.0 */ "punch-triple-top", /* IPP Finishings 2.0 */ "punch-triple-right", /* IPP Finishings 2.0 */ "punch-triple-bottom",/* IPP Finishings 2.0 */ "punch-quad-left", /* IPP Finishings 2.0 */ "punch-quad-top", /* IPP Finishings 2.0 */ "punch-quad-right", /* IPP Finishings 2.0 */ "punch-quad-bottom", /* IPP Finishings 2.0 */ "punch-multiple-left",/* IPP Finishings 2.1/Canon */ "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-accordion", /* IPP Finishings 2.0 */ "fold-double-gate", /* IPP Finishings 2.0 */ "fold-gate", /* IPP Finishings 2.0 */ "fold-half", /* IPP Finishings 2.0 */ "fold-half-z", /* IPP Finishings 2.0 */ "fold-left-gate", /* IPP Finishings 2.0 */ "fold-letter", /* IPP Finishings 2.0 */ "fold-parallel", /* IPP Finishings 2.0 */ "fold-poster", /* IPP Finishings 2.0 */ "fold-right-gate", /* IPP Finishings 2.0 */ "fold-z", /* IPP Finishings 2.0 */ "fold-engineering-z" /* IPP Finishings 2.1 */ }, * const ipp_finishings_vendor[] = { /* 0x40000000 to 0x4000000F */ "0x40000000", "0x40000001", "0x40000002", "0x40000003", "0x40000004", "0x40000005", "0x40000006", "0x40000007", "0x40000008", "0x40000009", "0x4000000A", "0x4000000B", "0x4000000C", "0x4000000D", "0x4000000E", "0x4000000F", /* 0x40000010 to 0x4000001F */ "0x40000010", "0x40000011", "0x40000012", "0x40000013", "0x40000014", "0x40000015", "0x40000016", "0x40000017", "0x40000018", "0x40000019", "0x4000001A", "0x4000001B", "0x4000001C", "0x4000001D", "0x4000001E", "0x4000001F", /* 0x40000020 to 0x4000002F */ "0x40000020", "0x40000021", "0x40000022", "0x40000023", "0x40000024", "0x40000025", "0x40000026", "0x40000027", "0x40000028", "0x40000029", "0x4000002A", "0x4000002B", "0x4000002C", "0x4000002D", "0x4000002E", "0x4000002F", /* 0x40000030 to 0x4000003F */ "0x40000030", "0x40000031", "0x40000032", "0x40000033", "0x40000034", "0x40000035", "0x40000036", "0x40000037", "0x40000038", "0x40000039", "0x4000003A", "0x4000003B", "0x4000003C", "0x4000003D", "0x4000003E", "0x4000003F", /* 0x40000040 - 0x4000004F */ "0x40000040", "0x40000041", "0x40000042", "0x40000043", "0x40000044", "0x40000045", "cups-punch-top-left", "cups-punch-bottom-left", "cups-punch-top-right", "cups-punch-bottom-right", "cups-punch-dual-left", "cups-punch-dual-top", "cups-punch-dual-right", "cups-punch-dual-bottom", "cups-punch-triple-left", "cups-punch-triple-top", /* 0x40000050 - 0x4000005F */ "cups-punch-triple-right", "cups-punch-triple-bottom", "cups-punch-quad-left", "cups-punch-quad-top", "cups-punch-quad-right", "cups-punch-quad-bottom", "0x40000056", "0x40000057", "0x40000058", "0x40000059", "cups-fold-accordion", "cups-fold-double-gate", "cups-fold-gate", "cups-fold-half", "cups-fold-half-z", "cups-fold-left-gate", /* 0x40000060 - 0x40000064 */ "cups-fold-letter", "cups-fold-parallel", "cups-fold-poster", "cups-fold-right-gate", "cups-fold-z" }, * const ipp_job_collation_types[] = { /* job-collation-type enums */ "uncollated-sheets", "collated-documents", "uncollated-documents" }, * const ipp_job_states[] = { /* job-state enums */ "pending", "pending-held", "processing", "processing-stopped", "canceled", "aborted", "completed" }, * const ipp_orientation_requesteds[] = { /* orientation-requested enums */ "portrait", "landscape", "reverse-landscape", "reverse-portrait", "none" }, * const ipp_print_qualities[] = { /* print-quality enums */ "draft", "normal", "high" }, * const ipp_printer_states[] = { /* printer-state enums */ "idle", "processing", "stopped" }, * const ipp_resource_states[] = { /* resource-state enums */ "pending", "available", "installed", "canceled", "aborted" }, * const ipp_system_states[] = { /* system-state enums */ "idle", "processing", "stopped" }; /* * Local functions... */ static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize); /* * 'ippAttributeString()' - Convert the attribute's value to a string. * * Returns the number of bytes that would be written, not including the * trailing nul. The buffer pointer can be NULL to get the required length, * just like (v)snprintf. * * @since CUPS 1.6/macOS 10.8@ */ size_t /* O - Number of bytes less nul */ ippAttributeString( ipp_attribute_t *attr, /* I - Attribute */ char *buffer, /* I - String buffer or NULL */ size_t bufsize) /* I - Size of string buffer */ { int i; /* Looping var */ char *bufptr, /* Pointer into buffer */ *bufend, /* End of buffer */ temp[256]; /* Temporary string */ const char *ptr, /* Pointer into string */ *end; /* Pointer to end of string */ _ipp_value_t *val; /* Current value */ if (!attr || !attr->name) { if (buffer) *buffer = '\0'; return (0); } bufptr = buffer; if (buffer) bufend = buffer + bufsize - 1; else bufend = NULL; for (i = attr->num_values, val = attr->values; i > 0; i --, val ++) { if (val > attr->values) { if (buffer && bufptr < bufend) *bufptr++ = ','; else bufptr ++; } switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { case IPP_TAG_ENUM : ptr = ippEnumString(attr->name, val->integer); if (buffer && bufptr < bufend) strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; case IPP_TAG_INTEGER : if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d", val->integer); else bufptr += snprintf(temp, sizeof(temp), "%d", val->integer); break; case IPP_TAG_BOOLEAN : if (buffer && bufptr < bufend) strlcpy(bufptr, val->boolean ? "true" : "false", (size_t)(bufend - bufptr + 1)); bufptr += val->boolean ? 4 : 5; break; case IPP_TAG_RANGE : if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d-%d", val->range.lower, val->range.upper); else bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, val->range.upper); break; case IPP_TAG_RESOLUTION : if (val->resolution.xres == val->resolution.yres) { if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else bufptr += snprintf(temp, sizeof(temp), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } else if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); break; case IPP_TAG_DATE : { unsigned year; /* Year */ year = ((unsigned)val->date[0] << 8) + (unsigned)val->date[1]; if (val->date[9] == 0 && val->date[10] == 0) snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ", year, val->date[2], val->date[3], val->date[4], val->date[5], val->date[6]); else snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u", year, val->date[2], val->date[3], val->date[4], val->date[5], val->date[6], val->date[8], val->date[9], val->date[10]); if (buffer && bufptr < bufend) strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_CHARSET : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_MIMETYPE : case IPP_TAG_LANGUAGE : case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : if (!val->string.text) break; for (ptr = val->string.text; *ptr; ptr ++) { if (*ptr == '\\' || *ptr == '\"' || *ptr == '[') { if (buffer && bufptr < bufend) *bufptr = '\\'; bufptr ++; } if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } if (val->string.language) { /* * Add "[language]" to end of string... */ if (buffer && bufptr < bufend) *bufptr = '['; bufptr ++; if (buffer && bufptr < bufend) strlcpy(bufptr, val->string.language, (size_t)(bufend - bufptr)); bufptr += strlen(val->string.language); if (buffer && bufptr < bufend) *bufptr = ']'; bufptr ++; } break; case IPP_TAG_BEGIN_COLLECTION : if (buffer && bufptr < bufend) bufptr += ipp_col_string(val->collection, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ipp_col_string(val->collection, NULL, 0); break; case IPP_TAG_STRING : for (ptr = val->unknown.data, end = ptr + val->unknown.length; ptr < end; ptr ++) { if (*ptr == '\\' || _cups_isspace(*ptr)) { if (buffer && bufptr < bufend) *bufptr = '\\'; bufptr ++; if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } else if (!isprint(*ptr & 255)) { if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *ptr & 255); else bufptr += snprintf(temp, sizeof(temp), "\\%03o", *ptr & 255); } else { if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } } break; default : ptr = ippTagString(attr->value_tag); if (buffer && bufptr < bufend) strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; } } if (buffer && bufptr < bufend) *bufptr = '\0'; else if (bufend) *bufend = '\0'; return ((size_t)(bufptr - buffer)); } /* * 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the * given requested-attributes attribute. * * This function creates a (sorted) CUPS array of attribute names matching the * list of "requested-attribute" values supplied in an IPP request. All IANA- * registered values are supported in addition to the CUPS IPP extension * attributes. * * The @code request@ parameter specifies the request message that was read from * the client. * * @code NULL@ is returned if all attributes should be returned. Otherwise, the * result is a sorted array of attribute names, where @code cupsArrayFind(array, * "attribute-name")@ will return a non-NULL pointer. The array must be freed * using the @code cupsArrayDelete@ function. * * @since CUPS 1.7/macOS 10.9@ */ cups_array_t * /* O - CUPS array or @code NULL@ if all */ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ { int i, j, /* Looping vars */ count, /* Number of values */ added; /* Was name added? */ ipp_op_t op; /* IPP operation code */ ipp_attribute_t *requested; /* requested-attributes attribute */ cups_array_t *ra; /* Requested attributes array */ const char *value; /* Current value */ /* The following lists come from the current IANA IPP registry of attributes */ static const char * const document_description[] = { /* document-description group */ "compression", "copies-actual", "cover-back-actual", "cover-front-actual", "current-page-order", "date-time-at-completed", "date-time-at-creation", "date-time-at-processing", "detailed-status-messages", "document-access-errors", "document-charset", "document-digital-signature", "document-format", "document-format-details", "document-format-detected", "document-format-version", "document-format-version-detected", "document-job-id", "document-job-uri", "document-message", "document-metadata", "document-name", "document-natural-language", "document-number", "document-printer-uri", "document-state", "document-state-message", "document-state-reasons", "document-uri", "document-uuid", /* IPP JPS3 */ "errors-count", "finishings-actual", "finishings-col-actual", "force-front-side-actual", "imposition-template-actual", "impressions", "impressions-col", "impressions-completed", "impressions-completed-col", "impressions-completed-current-copy", "insert-sheet-actual", "k-octets", "k-octets-processed", "last-document", "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-input-tray-check-actual", "media-sheets", "media-sheets-col", "media-sheets-completed", "media-sheets-completed-col", "more-info", "multiple-object-handling-actual", /* IPP 3D */ "number-up-actual", "orientation-requested-actual", "output-bin-actual", "output-device-assigned", "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", "pages", "pages-col", "pages-completed", "pages-completed-col", "pages-completed-current-copy", "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", "print-accuracy-actual", /* IPP 3D */ "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "printer-up-time", "separator-sheets-actual", "sheet-completed-copy-number", "sides-actual", "time-at-completed", "time-at-creation", "time-at-processing", "x-image-position-actual", "x-image-shift-actual", "x-side1-image-shift-actual", "x-side2-image-shift-actual", "y-image-position-actual", "y-image-shift-actual", "y-side1-image-shift-actual", "y-side2-image-shift-actual" }; static const char * const document_template[] = { /* document-template group */ "chamber-humidity", /* IPP 3D */ "chamber-humidity-default", /* IPP 3D */ "chamber-humidity-supported", /* IPP 3D */ "chamber-temperature", /* IPP 3D */ "chamber-temperature-default", /* IPP 3D */ "chamber-temperature-supported", /* IPP 3D */ "copies", "copies-default", "copies-supported", "cover-back", "cover-back-default", "cover-back-supported", "cover-front", "cover-front-default", "cover-front-supported", "feed-orientation", "feed-orientation-default", "feed-orientation-supported", "finishings", "finishings-col", "finishings-col-database", "finishings-col-default", "finishings-col-ready", "finishings-col-supported", "finishings-default", "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", "font-name-requested-supported", "font-size-requested", "font-size-requested-default", "font-size-requested-supported", "force-front-side", "force-front-side-default", "force-front-side-supported", "imposition-template", "imposition-template-default", "imposition-template-supported", "insert-after-page-number-supported", "insert-count-supported", "insert-sheet", "insert-sheet-default", "insert-sheet-supported", "material-amount-units-supported", /* IPP 3D */ "material-diameter-supported", /* IPP 3D */ "material-purpose-supported", /* IPP 3D */ "material-rate-supported", /* IPP 3D */ "material-rate-units-supported", /* IPP 3D */ "material-shell-thickness-supported",/* IPP 3D */ "material-temperature-supported", /* IPP 3D */ "material-type-supported", /* IPP 3D */ "materials-col", /* IPP 3D */ "materials-col-database", /* IPP 3D */ "materials-col-default", /* IPP 3D */ "materials-col-ready", /* IPP 3D */ "materials-col-supported", /* IPP 3D */ "max-materials-col-supported", /* IPP 3D */ "max-stitching-locations-supported", "media", "media-back-coating-supported", "media-bottom-margin-supported", "media-col", "media-col-default", "media-col-ready", "media-col-supported", "media-color-supported", "media-default", "media-front-coating-supported", "media-grain-supported", "media-hole-count-supported", "media-info-supported", "media-input-tray-check", "media-input-tray-check-default", "media-input-tray-check-supported", "media-key-supported", "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", "media-source-supported", "media-supported", "media-thickness-supported", "media-top-margin-supported", "media-type-supported", "media-weight-metric-supported", "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", "multiple-object-handling", /* IPP 3D */ "multiple-object-handling-default", /* IPP 3D */ "multiple-object-handling-supported",/* IPP 3D */ "number-up", "number-up-default", "number-up-supported", "orientation-requested", "orientation-requested-default", "orientation-requested-supported", "output-mode", /* CUPS extension */ "output-mode-default", /* CUPS extension */ "output-mode-supported", /* CUPS extension */ "overrides", "overrides-supported", "page-delivery", "page-delivery-default", "page-delivery-supported", "page-order-received", "page-order-received-default", "page-order-received-supported", "page-ranges", "page-ranges-supported", "pages-per-subset", "pages-per-subset-supported", "pdl-init-file", "pdl-init-file-default", "pdl-init-file-entry-supported", "pdl-init-file-location-supported", "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", "platform-temperature", /* IPP 3D */ "platform-temperature-default", /* IPP 3D */ "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", "print-accuracy", /* IPP 3D */ "print-accuracy-default", /* IPP 3D */ "print-accuracy-supported", /* IPP 3D */ "print-base", /* IPP 3D */ "print-base-default", /* IPP 3D */ "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", "print-objects", /* IPP 3D */ "print-objects-default", /* IPP 3D */ "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ "print-supports", /* IPP 3D */ "print-supports-default", /* IPP 3D */ "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", "separator-sheets", "separator-sheets-default", "separator-sheets-supported", "sheet-collate", "sheet-collate-default", "sheet-collate-supported", "sides", "sides-default", "sides-supported", "stitching-locations-supported", "stitching-offset-supported", "x-image-position", "x-image-position-default", "x-image-position-supported", "x-image-shift", "x-image-shift-default", "x-image-shift-supported", "x-side1-image-shift", "x-side1-image-shift-default", "x-side1-image-shift-supported", "x-side2-image-shift", "x-side2-image-shift-default", "x-side2-image-shift-supported", "y-image-position", "y-image-position-default", "y-image-position-supported", "y-image-shift", "y-image-shift-default", "y-image-shift-supported", "y-side1-image-shift", "y-side1-image-shift-default", "y-side1-image-shift-supported", "y-side2-image-shift", "y-side2-image-shift-default", "y-side2-image-shift-supported" }; static const char * const job_description[] = { /* job-description group */ "chamber-humidity-actual", /* IPP 3D */ "chamber-temperature-actual", /* IPP 3D */ "compression-supplied", "copies-actual", "cover-back-actual", "cover-front-actual", "current-page-order", "date-time-at-completed", "date-time-at-creation", "date-time-at-processing", "destination-statuses", "document-charset-supplied", "document-digital-signature-supplied", "document-format-details-supplied", "document-format-supplied", "document-message-supplied", "document-metadata", "document-name-supplied", "document-natural-language-supplied", "document-overrides-actual", "errors-count", "finishings-actual", "finishings-col-actual", "force-front-side-actual", "imposition-template-actual", "impressions-completed-current-copy", "insert-sheet-actual", "job-account-id-actual", "job-accounting-sheets-actual", "job-accounting-user-id-actual", "job-attribute-fidelity", "job-charge-info", /* CUPS extension */ "job-collation-type", "job-collation-type-actual", "job-copies-actual", "job-cover-back-actual", "job-cover-front-actual", "job-detailed-status-message", "job-document-access-errors", "job-error-sheet-actual", "job-finishings-actual", "job-finishings-col-actual", "job-hold-until-actual", "job-id", "job-impressions", "job-impressions-col", "job-impressions-completed", "job-impressions-completed-col", "job-k-octets", "job-k-octets-processed", "job-mandatory-attributes", "job-media-progress", /* CUPS extension */ "job-media-sheets", "job-media-sheets-col", "job-media-sheets-completed", "job-media-sheets-completed-col", "job-message-from-operator", "job-more-info", "job-name", "job-originating-host-name", /* CUPS extension */ "job-originating-user-name", "job-originating-user-uri", /* IPP JPS3 */ "job-pages", "job-pages-col", "job-pages-completed", "job-pages-completed-col", "job-pages-completed-current-copy", "job-printer-state-message", /* CUPS extension */ "job-printer-state-reasons", /* CUPS extension */ "job-printer-up-time", "job-printer-uri", "job-priority-actual", "job-resource-ids", /* IPP System */ "job-save-printer-make-and-model", "job-sheet-message-actual", "job-sheets-actual", "job-sheets-col-actual", "job-state", "job-state-message", "job-state-reasons", "job-uri", "job-uuid", /* IPP JPS3 */ "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-check-input-tray-actual", "multiple-document-handling-actual", "multiple-object-handling-actual", /* IPP 3D */ "number-of-documents", "number-of-intervening-jobs", "number-up-actual", "orientation-requested-actual", "original-requesting-user-name", "output-bin-actual", "output-device-assigned", "output-device-job-state", /* IPP INFRA */ "output-device-job-state-message", /* IPP INFRA */ "output-device-job-state-reasons", /* IPP INFRA */ "output-device-uuid-assigned", /* IPP INFRA */ "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", "print-accuracy-actual", /* IPP 3D */ "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "separator-sheets-actual", "sheet-collate-actual", "sheet-completed-copy-number", "sheet-completed-document-number", "sides-actual", "time-at-completed", "time-at-creation", "time-at-processing", "warnings-count", "x-image-position-actual", "x-image-shift-actual", "x-side1-image-shift-actual", "x-side2-image-shift-actual", "y-image-position-actual", "y-image-shift-actual", "y-side1-image-shift-actual", "y-side2-image-shift-actual" }; static const char * const job_template[] = { /* job-template group */ "accuracy-units-supported", /* IPP 3D */ "chamber-humidity", /* IPP 3D */ "chamber-humidity-default", /* IPP 3D */ "chamber-humidity-supported", /* IPP 3D */ "chamber-temperature", /* IPP 3D */ "chamber-temperature-default", /* IPP 3D */ "chamber-temperature-supported", /* IPP 3D */ "confirmation-sheet-print", /* IPP FaxOut */ "confirmation-sheet-print-default", "copies", "copies-default", "copies-supported", "cover-back", "cover-back-default", "cover-back-supported", "cover-front", "cover-front-default", "cover-front-supported", "cover-sheet-info", /* IPP FaxOut */ "cover-sheet-info-default", "cover-sheet-info-supported", "destination-uri-schemes-supported",/* IPP FaxOut */ "destination-uris", /* IPP FaxOut */ "destination-uris-supported", "feed-orientation", "feed-orientation-default", "feed-orientation-supported", "finishings", "finishings-col", "finishings-col-database", "finishings-col-default", "finishings-col-ready", "finishings-col-supported", "finishings-default", "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", "font-name-requested-supported", "font-size-requested", "font-size-requested-default", "font-size-requested-supported", "force-front-side", "force-front-side-default", "force-front-side-supported", "imposition-template", "imposition-template-default", "imposition-template-supported", "insert-after-page-number-supported", "insert-count-supported", "insert-sheet", "insert-sheet-default", "insert-sheet-supported", "job-account-id", "job-account-id-default", "job-account-id-supported", "job-accounting-sheets" "job-accounting-sheets-default" "job-accounting-sheets-supported" "job-accounting-user-id", "job-accounting-user-id-default", "job-accounting-user-id-supported", "job-copies", "job-copies-default", "job-copies-supported", "job-cover-back", "job-cover-back-default", "job-cover-back-supported", "job-cover-front", "job-cover-front-default", "job-cover-front-supported", "job-delay-output-until", "job-delay-output-until-default", "job-delay-output-until-supported", "job-delay-output-until-time", "job-delay-output-until-time-default", "job-delay-output-until-time-supported", "job-error-action", "job-error-action-default", "job-error-action-supported", "job-error-sheet", "job-error-sheet-default", "job-error-sheet-supported", "job-finishings", "job-finishings-col", "job-finishings-col-default", "job-finishings-col-supported", "job-finishings-default", "job-finishings-supported", "job-hold-until", "job-hold-until-default", "job-hold-until-supported", "job-hold-until-time", "job-hold-until-time-default", "job-hold-until-time-supported", "job-message-to-operator", "job-message-to-operator-default", "job-message-to-operator-supported", "job-phone-number", "job-phone-number-default", "job-phone-number-supported", "job-priority", "job-priority-default", "job-priority-supported", "job-recipient-name", "job-recipient-name-default", "job-recipient-name-supported", "job-save-disposition", "job-save-disposition-default", "job-save-disposition-supported", "job-sheets", "job-sheets-col", "job-sheets-col-default", "job-sheets-col-supported", "job-sheets-default", "job-sheets-supported", "logo-uri-schemes-supported", "material-amount-units-supported", /* IPP 3D */ "material-diameter-supported", /* IPP 3D */ "material-purpose-supported", /* IPP 3D */ "material-rate-supported", /* IPP 3D */ "material-rate-units-supported", /* IPP 3D */ "material-shell-thickness-supported",/* IPP 3D */ "material-temperature-supported", /* IPP 3D */ "material-type-supported", /* IPP 3D */ "materials-col", /* IPP 3D */ "materials-col-database", /* IPP 3D */ "materials-col-default", /* IPP 3D */ "materials-col-ready", /* IPP 3D */ "materials-col-supported", /* IPP 3D */ "max-materials-col-supported", /* IPP 3D */ "max-save-info-supported", "max-stitching-locations-supported", "media", "media-back-coating-supported", "media-bottom-margin-supported", "media-col", "media-col-default", "media-col-ready", "media-col-supported", "media-color-supported", "media-default", "media-front-coating-supported", "media-grain-supported", "media-hole-count-supported", "media-info-supported", "media-input-tray-check", "media-input-tray-check-default", "media-input-tray-check-supported", "media-key-supported", "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", "media-source-supported", "media-supported", "media-thickness-supported", "media-top-margin-supported", "media-type-supported", "media-weight-metric-supported", "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", "multiple-object-handling", /* IPP 3D */ "multiple-object-handling-default", /* IPP 3D */ "multiple-object-handling-supported",/* IPP 3D */ "number-of-retries", /* IPP FaxOut */ "number-of-retries-default", "number-of-retries-supported", "number-up", "number-up-default", "number-up-supported", "orientation-requested", "orientation-requested-default", "orientation-requested-supported", "output-bin", "output-bin-default", "output-bin-supported", "output-device", "output-device-supported", "output-device-uuid-supported", /* IPP INFRA */ "output-mode", /* CUPS extension */ "output-mode-default", /* CUPS extension */ "output-mode-supported", /* CUPS extension */ "overrides", "overrides-supported", "page-delivery", "page-delivery-default", "page-delivery-supported", "page-order-received", "page-order-received-default", "page-order-received-supported", "page-ranges", "page-ranges-supported", "pages-per-subset", "pages-per-subset-supported", "pdl-init-file", "pdl-init-file-default", "pdl-init-file-entry-supported", "pdl-init-file-location-supported", "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", "platform-temperature", /* IPP 3D */ "platform-temperature-default", /* IPP 3D */ "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", "print-accuracy", /* IPP 3D */ "print-accuracy-default", /* IPP 3D */ "print-accuracy-supported", /* IPP 3D */ "print-base", /* IPP 3D */ "print-base-default", /* IPP 3D */ "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", "print-objects", /* IPP 3D */ "print-objects-default", /* IPP 3D */ "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ "print-supports", /* IPP 3D */ "print-supports-default", /* IPP 3D */ "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", "proof-print", "proof-print-default", "proof-print-supported", "retry-interval", /* IPP FaxOut */ "retry-interval-default", "retry-interval-supported", "retry-timeout", /* IPP FaxOut */ "retry-timeout-default", "retry-timeout-supported", "save-disposition-supported", "save-document-format-default", "save-document-format-supported", "save-location-default", "save-location-supported", "save-name-subdirectory-supported", "save-name-supported", "separator-sheets", "separator-sheets-default", "separator-sheets-supported", "sheet-collate", "sheet-collate-default", "sheet-collate-supported", "sides", "sides-default", "sides-supported", "stitching-locations-supported", "stitching-offset-supported", "x-image-position", "x-image-position-default", "x-image-position-supported", "x-image-shift", "x-image-shift-default", "x-image-shift-supported", "x-side1-image-shift", "x-side1-image-shift-default", "x-side1-image-shift-supported", "x-side2-image-shift", "x-side2-image-shift-default", "x-side2-image-shift-supported", "y-image-position", "y-image-position-default", "y-image-position-supported", "y-image-shift", "y-image-shift-default", "y-image-shift-supported", "y-side1-image-shift", "y-side1-image-shift-default", "y-side1-image-shift-supported", "y-side2-image-shift", "y-side2-image-shift-default", "y-side2-image-shift-supported" }; static const char * const printer_description[] = { /* printer-description group */ "auth-info-required", /* CUPS extension */ "chamber-humidity-current", /* IPP 3D */ "chamber-temperature-current", /* IPP 3D */ "charset-configured", "charset-supported", "color-supported", "compression-supported", "device-service-count", "device-uri", /* CUPS extension */ "device-uuid", "document-charset-default", "document-charset-supported", "document-creation-attributes-supported", "document-digital-signature-default", "document-digital-signature-supported", "document-format-default", "document-format-details-default", "document-format-details-supported", "document-format-supported", "document-format-varying-attributes", "document-format-version-default", "document-format-version-supported", "document-natural-language-default", "document-natural-language-supported", "document-password-supported", "document-privacy-attributes", /* IPP Privacy Attributes */ "document-privacy-scope", /* IPP Privacy Attributes */ "generated-natural-language-supported", "identify-actions-default", "identify-actions-supported", "input-source-supported", "ipp-features-supported", "ipp-versions-supported", "ippget-event-life", "job-authorization-uri-supported", /* CUPS extension */ "job-constraints-supported", "job-creation-attributes-supported", "job-finishings-col-ready", "job-finishings-ready", "job-ids-supported", "job-impressions-supported", "job-k-limit", /* CUPS extension */ "job-k-octets-supported", "job-media-sheets-supported", "job-page-limit", /* CUPS extension */ "job-password-encryption-supported", "job-password-supported", "job-presets-supported", /* IPP Presets */ "job-privacy-attributes", /* IPP Privacy Attributes */ "job-privacy-scope", /* IPP Privacy Attributes */ "job-quota-period", /* CUPS extension */ "job-resolvers-supported", "job-settable-attributes-supported", "job-spooling-supported", "job-triggers-supported", /* IPP Presets */ "jpeg-k-octets-supported", /* CUPS extension */ "jpeg-x-dimension-supported", /* CUPS extension */ "jpeg-y-dimension-supported", /* CUPS extension */ "landscape-orientation-requested-preferred", /* CUPS extension */ "marker-change-time", /* CUPS extension */ "marker-colors", /* CUPS extension */ "marker-high-levels", /* CUPS extension */ "marker-levels", /* CUPS extension */ "marker-low-levels", /* CUPS extension */ "marker-message", /* CUPS extension */ "marker-names", /* CUPS extension */ "marker-types", /* CUPS extension */ "member-names", /* CUPS extension */ "member-uris", /* CUPS extension */ "multiple-destination-uris-supported",/* IPP FaxOut */ "multiple-document-jobs-supported", "multiple-operation-time-out", "multiple-operation-time-out-action", "natural-language-configured", "operations-supported", "pages-per-minute", "pages-per-minute-color", "pdf-k-octets-supported", /* CUPS extension */ "pdf-features-supported", /* IPP 3D */ "pdf-versions-supported", /* CUPS extension */ "pdl-override-supported", "platform-shape", /* IPP 3D */ "port-monitor", /* CUPS extension */ "port-monitor-supported", /* CUPS extension */ "preferred-attributes-supported", "printer-alert", "printer-alert-description", "printer-camera-image-uri", /* IPP 3D */ "printer-charge-info", "printer-charge-info-uri", "printer-commands", /* CUPS extension */ "printer-config-change-date-time", "printer-config-change-time", "printer-config-changes", /* IPP System */ "printer-contact-col", /* IPP System */ "printer-current-time", "printer-detailed-status-messages", "printer-device-id", "printer-dns-sd-name", /* CUPS extension */ "printer-driver-installer", "printer-fax-log-uri", /* IPP FaxOut */ "printer-fax-modem-info", /* IPP FaxOut */ "printer-fax-modem-name", /* IPP FaxOut */ "printer-fax-modem-number", /* IPP FaxOut */ "printer-firmware-name", /* PWG 5110.1 */ "printer-firmware-patches", /* PWG 5110.1 */ "printer-firmware-string-version", /* PWG 5110.1 */ "printer-firmware-version", /* PWG 5110.1 */ "printer-geo-location", "printer-get-attributes-supported", "printer-icc-profiles", "printer-icons", "printer-id", /* IPP System */ "printer-info", "printer-input-tray", /* IPP JPS3 */ "printer-is-accepting-jobs", "printer-is-shared", /* CUPS extension */ "printer-is-temporary", /* CUPS extension */ "printer-kind", /* IPP Paid Printing */ "printer-location", "printer-make-and-model", "printer-mandatory-job-attributes", "printer-message-date-time", "printer-message-from-operator", "printer-message-time", "printer-more-info", "printer-more-info-manufacturer", "printer-name", "printer-native-formats", "printer-organization", "printer-organizational-unit", "printer-output-tray", /* IPP JPS3 */ "printer-service-type", /* IPP System */ "printer-settable-attributes-supported", "printer-state", "printer-state-change-date-time", "printer-state-change-time", "printer-state-message", "printer-state-reasons", "printer-supply", "printer-supply-description", "printer-supply-info-uri", "printer-type", /* CUPS extension */ "printer-up-time", "printer-uri-supported", "printer-uuid", "printer-xri-supported", "pwg-raster-document-resolution-supported", "pwg-raster-document-sheet-back", "pwg-raster-document-type-supported", "queued-job-count", "reference-uri-schemes-supported", "repertoire-supported", "requesting-user-name-allowed", /* CUPS extension */ "requesting-user-name-denied", /* CUPS extension */ "requesting-user-uri-supported", "smi2699-auth-print-group", /* PWG ippserver extension */ "smi2699-auth-proxy-group", /* PWG ippserver extension */ "smi2699-device-command", /* PWG ippserver extension */ "smi2699-device-format", /* PWG ippserver extension */ "smi2699-device-name", /* PWG ippserver extension */ "smi2699-device-uri", /* PWG ippserver extension */ "subordinate-printers-supported", "subscription-privacy-attributes", /* IPP Privacy Attributes */ "subscription-privacy-scope", /* IPP Privacy Attributes */ "urf-supported", /* CUPS extension */ "uri-authentication-supported", "uri-security-supported", "user-defined-value-supported", "which-jobs-supported", "xri-authentication-supported", "xri-security-supported", "xri-uri-scheme-supported" }; static const char * const resource_description[] = { /* resource-description group - IPP System */ "resource-info", "resource-name" }; static const char * const resource_status[] = { /* resource-status group - IPP System */ "date-time-at-canceled", "date-time-at-creation", "date-time-at-installed", "resource-data-uri", "resource-format", "resource-id", "resource-k-octets", "resource-state", "resource-state-message", "resource-state-reasons", "resource-string-version", "resource-type", "resource-use-count", "resource-uuid", "resource-version", "time-at-canceled", "time-at-creation", "time-at-installed" }; static const char * const resource_template[] = { /* resource-template group - IPP System */ "resource-format", "resource-format-supported", "resource-info", "resource-name", "resource-type", "resource-type-supported" }; static const char * const subscription_description[] = { /* subscription-description group */ "notify-job-id", "notify-lease-expiration-time", "notify-printer-up-time", "notify-printer-uri", "notify-resource-id", /* IPP System */ "notify-system-uri", /* IPP System */ "notify-sequence-number", "notify-subscriber-user-name", "notify-subscriber-user-uri", "notify-subscription-id", "notify-subscription-uuid" /* IPP JPS3 */ }; static const char * const subscription_template[] = { /* subscription-template group */ "notify-attributes", "notify-attributes-supported", "notify-charset", "notify-events", "notify-events-default", "notify-events-supported", "notify-lease-duration", "notify-lease-duration-default", "notify-lease-duration-supported", "notify-max-events-supported", "notify-natural-language", "notify-pull-method", "notify-pull-method-supported", "notify-recipient-uri", "notify-schemes-supported", "notify-time-interval", "notify-user-data" }; static const char * const system_description[] = { /* system-description group - IPP System */ "charset-configured", "charset-supported", "generated-natural-language-supported", "ipp-features-supported", "ipp-versions-supported", "natural-language-configured", "operations-supported", "power-calendar-policy-col", "power-event-policy-col", "power-timeout-policy-col", "printer-creation-attributes-supported", "resource-settable-attributes-supported", "smi2699-auth-group-supported", /* PWG ippserver extension */ "smi2699-device-command-supported", /* PWG ippserver extension */ "smi2699-device-format-format", /* PWG ippserver extension */ "smi2699-device-uri-schemes-supported", /* PWG ippserver extension */ "system-contact-col", "system-current-time", "system-default-printer-id", "system-device-id", "system-geo-location", "system-info", "system-location", "system-mandatory-printer-attributes", "system-make-and-model", "system-message-from-operator", "system-name", "system-settable-attributes-supported", "system-strings-languages-supported", "system-strings-uri", "system-xri-supported" }; static const char * const system_status[] = { /* system-status group - IPP System */ "power-log-col", "power-state-capabilities-col", "power-state-counters-col", "power-state-monitor-col", "power-state-transitions-col", "system-config-change-date-time", "system-config-change-time", "system-config-changes", "system-configured-printers", "system-configured-resources", "system-serial-number", "system-state", "system-state-change-date-time", "system-state-change-time", "system-state-message", "system-state-reasons", "system-up-time", "system-uuid" }; /* * Get the requested-attributes attribute... */ op = ippGetOperation(request); if ((requested = ippFindAttribute(request, "requested-attributes", IPP_TAG_KEYWORD)) == NULL) { /* * The Get-Jobs operation defaults to "job-id" and "job-uri", all others * default to "all"... */ if (op == IPP_OP_GET_JOBS) { ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-uri"); return (ra); } else return (NULL); } /* * If the attribute contains a single "all" keyword, return NULL... */ count = ippGetCount(requested); if (count == 1 && !strcmp(ippGetString(requested, 0, NULL), "all")) return (NULL); /* * Create an array using "strcmp" as the comparison function... */ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); for (i = 0; i < count; i ++) { added = 0; value = ippGetString(requested, i, NULL); if (!strcmp(value, "document-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_DOCUMENT_ATTRIBUTES || op == IPP_OP_GET_DOCUMENTS))) { for (j = 0; j < (int)(sizeof(document_description) / sizeof(document_description[0])); j ++) cupsArrayAdd(ra, (void *)document_description[j]); added = 1; } if (!strcmp(value, "document-template") || !strcmp(value, "all")) { for (j = 0; j < (int)(sizeof(document_template) / sizeof(document_template[0])); j ++) cupsArrayAdd(ra, (void *)document_template[j]); added = 1; } if (!strcmp(value, "job-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS))) { for (j = 0; j < (int)(sizeof(job_description) / sizeof(job_description[0])); j ++) cupsArrayAdd(ra, (void *)job_description[j]); added = 1; } if (!strcmp(value, "job-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_PRINTER_ATTRIBUTES))) { for (j = 0; j < (int)(sizeof(job_template) / sizeof(job_template[0])); j ++) cupsArrayAdd(ra, (void *)job_template[j]); added = 1; } if (!strcmp(value, "printer-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_PRINTER_ATTRIBUTES || op == IPP_OP_GET_PRINTERS || op == IPP_OP_CUPS_GET_DEFAULT || op == IPP_OP_CUPS_GET_PRINTERS || op == IPP_OP_CUPS_GET_CLASSES))) { for (j = 0; j < (int)(sizeof(printer_description) / sizeof(printer_description[0])); j ++) cupsArrayAdd(ra, (void *)printer_description[j]); added = 1; } if (!strcmp(value, "resource-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) { for (j = 0; j < (int)(sizeof(resource_description) / sizeof(resource_description[0])); j ++) cupsArrayAdd(ra, (void *)resource_description[j]); added = 1; } if (!strcmp(value, "resource-status") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) { for (j = 0; j < (int)(sizeof(resource_status) / sizeof(resource_status[0])); j ++) cupsArrayAdd(ra, (void *)resource_status[j]); added = 1; } if (!strcmp(value, "resource-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES || op == IPP_OP_GET_SYSTEM_ATTRIBUTES))) { for (j = 0; j < (int)(sizeof(resource_template) / sizeof(resource_template[0])); j ++) cupsArrayAdd(ra, (void *)resource_template[j]); added = 1; } if (!strcmp(value, "subscription-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) { for (j = 0; j < (int)(sizeof(subscription_description) / sizeof(subscription_description[0])); j ++) cupsArrayAdd(ra, (void *)subscription_description[j]); added = 1; } if (!strcmp(value, "subscription-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) { for (j = 0; j < (int)(sizeof(subscription_template) / sizeof(subscription_template[0])); j ++) cupsArrayAdd(ra, (void *)subscription_template[j]); added = 1; } if (!strcmp(value, "system-description") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) { for (j = 0; j < (int)(sizeof(system_description) / sizeof(system_description[0])); j ++) cupsArrayAdd(ra, (void *)system_description[j]); added = 1; } if (!strcmp(value, "system-status") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) { for (j = 0; j < (int)(sizeof(system_status) / sizeof(system_status[0])); j ++) cupsArrayAdd(ra, (void *)system_status[j]); added = 1; } if (!added) cupsArrayAdd(ra, (void *)value); } return (ra); } /* * 'ippEnumString()' - Return a string corresponding to the enum value. */ const char * /* O - Enum string */ ippEnumString(const char *attrname, /* I - Attribute name */ int enumvalue) /* I - Enum value */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * Check for standard enum values... */ if (!strcmp(attrname, "document-state") && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0])))) return (ipp_document_states[enumvalue - 3]); else if (!strcmp(attrname, "finishings") || !strcmp(attrname, "finishings-actual") || !strcmp(attrname, "finishings-default") || !strcmp(attrname, "finishings-ready") || !strcmp(attrname, "finishings-supported") || !strcmp(attrname, "job-finishings") || !strcmp(attrname, "job-finishings-default") || !strcmp(attrname, "job-finishings-supported")) { if (enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0])))) return (ipp_finishings[enumvalue - 3]); else if (enumvalue >= 0x40000000 && enumvalue < (0x40000000 + (int)(sizeof(ipp_finishings_vendor) / sizeof(ipp_finishings_vendor[0])))) return (ipp_finishings_vendor[enumvalue - 0x40000000]); } else if ((!strcmp(attrname, "job-collation-type") || !strcmp(attrname, "job-collation-type-actual")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_job_collation_types) / sizeof(ipp_job_collation_types[0])))) return (ipp_job_collation_types[enumvalue - 3]); else if (!strcmp(attrname, "job-state") && enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED) return (ipp_job_states[enumvalue - IPP_JSTATE_PENDING]); else if (!strcmp(attrname, "operations-supported")) return (ippOpString((ipp_op_t)enumvalue)); else if ((!strcmp(attrname, "orientation-requested") || !strcmp(attrname, "orientation-requested-actual") || !strcmp(attrname, "orientation-requested-default") || !strcmp(attrname, "orientation-requested-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_orientation_requesteds) / sizeof(ipp_orientation_requesteds[0])))) return (ipp_orientation_requesteds[enumvalue - 3]); else if ((!strcmp(attrname, "print-quality") || !strcmp(attrname, "print-quality-actual") || !strcmp(attrname, "print-quality-default") || !strcmp(attrname, "print-quality-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0])))) return (ipp_print_qualities[enumvalue - 3]); else if (!strcmp(attrname, "printer-state") && enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED) return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]); else if (!strcmp(attrname, "resource-state") && enumvalue >= IPP_RSTATE_PENDING && enumvalue <= IPP_RSTATE_ABORTED) return (ipp_resource_states[enumvalue - IPP_RSTATE_PENDING]); else if (!strcmp(attrname, "system-state") && enumvalue >= IPP_SSTATE_IDLE && enumvalue <= IPP_SSTATE_STOPPED) return (ipp_system_states[enumvalue - IPP_SSTATE_IDLE]); /* * Not a standard enum value, just return the decimal equivalent... */ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "%d", enumvalue); return (cg->ipp_unknown); } /* * 'ippEnumValue()' - Return the value associated with a given enum string. */ int /* O - Enum value or -1 if unknown */ ippEnumValue(const char *attrname, /* I - Attribute name */ const char *enumstring) /* I - Enum string */ { int i, /* Looping var */ num_strings; /* Number of strings to compare */ const char * const *strings; /* Strings to compare */ /* * If the string is just a number, return it... */ if (isdigit(*enumstring & 255)) return ((int)strtol(enumstring, NULL, 0)); /* * Otherwise look up the string... */ if (!strcmp(attrname, "document-state")) { num_strings = (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0])); strings = ipp_document_states; } else if (!strcmp(attrname, "finishings") || !strcmp(attrname, "finishings-actual") || !strcmp(attrname, "finishings-default") || !strcmp(attrname, "finishings-ready") || !strcmp(attrname, "finishings-supported")) { for (i = 0; i < (int)(sizeof(ipp_finishings_vendor) / sizeof(ipp_finishings_vendor[0])); i ++) if (!strcmp(enumstring, ipp_finishings_vendor[i])) return (i + 0x40000000); num_strings = (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0])); strings = ipp_finishings; } else if (!strcmp(attrname, "job-collation-type") || !strcmp(attrname, "job-collation-type-actual")) { num_strings = (int)(sizeof(ipp_job_collation_types) / sizeof(ipp_job_collation_types[0])); strings = ipp_job_collation_types; } else if (!strcmp(attrname, "job-state")) { num_strings = (int)(sizeof(ipp_job_states) / sizeof(ipp_job_states[0])); strings = ipp_job_states; } else if (!strcmp(attrname, "operations-supported")) return (ippOpValue(enumstring)); else if (!strcmp(attrname, "orientation-requested") || !strcmp(attrname, "orientation-requested-actual") || !strcmp(attrname, "orientation-requested-default") || !strcmp(attrname, "orientation-requested-supported")) { num_strings = (int)(sizeof(ipp_orientation_requesteds) / sizeof(ipp_orientation_requesteds[0])); strings = ipp_orientation_requesteds; } else if (!strcmp(attrname, "print-quality") || !strcmp(attrname, "print-quality-actual") || !strcmp(attrname, "print-quality-default") || !strcmp(attrname, "print-quality-supported")) { num_strings = (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0])); strings = ipp_print_qualities; } else if (!strcmp(attrname, "printer-state")) { num_strings = (int)(sizeof(ipp_printer_states) / sizeof(ipp_printer_states[0])); strings = ipp_printer_states; } else if (!strcmp(attrname, "resource-state")) { num_strings = (int)(sizeof(ipp_resource_states) / sizeof(ipp_resource_states[0])); strings = ipp_resource_states; } else if (!strcmp(attrname, "system-state")) { num_strings = (int)(sizeof(ipp_system_states) / sizeof(ipp_system_states[0])); strings = ipp_system_states; } else return (-1); for (i = 0; i < num_strings; i ++) if (!strcmp(enumstring, strings[i])) return (i + 3); return (-1); } /* * 'ippErrorString()' - Return a name for the given status code. */ const char * /* O - Text string */ ippErrorString(ipp_status_t error) /* I - Error status */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if the error code is a known value... */ if (error >= IPP_STATUS_OK && error <= IPP_STATUS_OK_EVENTS_COMPLETE) return (ipp_status_oks[error]); else if (error == IPP_STATUS_REDIRECTION_OTHER_SITE) return ("redirection-other-site"); else if (error == IPP_STATUS_CUPS_SEE_OTHER) return ("cups-see-other"); else if (error >= IPP_STATUS_ERROR_BAD_REQUEST && error <= IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED) return (ipp_status_400s[error - IPP_STATUS_ERROR_BAD_REQUEST]); else if (error >= 0x480 && error <= IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED) return (ipp_status_480s[error - 0x0480]); else if (error >= IPP_STATUS_ERROR_INTERNAL && error <= IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS) return (ipp_status_500s[error - IPP_STATUS_ERROR_INTERNAL]); else if (error >= IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED && error <= IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED) return (ipp_status_1000s[error - IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED]); /* * No, build an "0xxxxx" error string... */ sprintf(cg->ipp_unknown, "0x%04x", error); return (cg->ipp_unknown); } /* * 'ippErrorValue()' - Return a status code for the given name. * * @since CUPS 1.2/macOS 10.5@ */ ipp_status_t /* O - IPP status code */ ippErrorValue(const char *name) /* I - Name */ { size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_oks[i])) return ((ipp_status_t)i); if (!_cups_strcasecmp(name, "redirection-other-site")) return (IPP_STATUS_REDIRECTION_OTHER_SITE); if (!_cups_strcasecmp(name, "cups-see-other")) return (IPP_STATUS_CUPS_SEE_OTHER); for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_400s[i])) return ((ipp_status_t)(i + 0x400)); for (i = 0; i < (sizeof(ipp_status_480s) / sizeof(ipp_status_480s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_480s[i])) return ((ipp_status_t)(i + 0x480)); for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_500s[i])) return ((ipp_status_t)(i + 0x500)); for (i = 0; i < (sizeof(ipp_status_1000s) / sizeof(ipp_status_1000s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_1000s[i])) return ((ipp_status_t)(i + 0x1000)); return ((ipp_status_t)-1); } /* * 'ippOpString()' - Return a name for the given operation id. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Name */ ippOpString(ipp_op_t op) /* I - Operation ID */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if the operation ID is a known value... */ if (op >= IPP_OP_PRINT_JOB && op < (ipp_op_t)(sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0]))) return (ipp_std_ops[op]); else if (op == IPP_OP_PRIVATE) return ("windows-ext"); else if (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD) return (ipp_cups_ops[op - IPP_OP_CUPS_GET_DEFAULT]); else if (op >= IPP_OP_CUPS_GET_DOCUMENT && op <= IPP_OP_CUPS_CREATE_LOCAL_PRINTER) return (ipp_cups_ops2[op - IPP_OP_CUPS_GET_DOCUMENT]); /* * No, build an "0xxxxx" operation string... */ sprintf(cg->ipp_unknown, "0x%04x", op); return (cg->ipp_unknown); } /* * 'ippOpValue()' - Return an operation id for the given name. * * @since CUPS 1.2/macOS 10.5@ */ ipp_op_t /* O - Operation ID */ ippOpValue(const char *name) /* I - Textual name */ { size_t i; /* Looping var */ if (!strncmp(name, "0x", 2)) return ((ipp_op_t)strtol(name + 2, NULL, 16)); for (i = 0; i < (sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])); i ++) if (!_cups_strcasecmp(name, ipp_std_ops[i])) return ((ipp_op_t)i); if (!_cups_strcasecmp(name, "windows-ext")) return (IPP_OP_PRIVATE); for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++) if (!_cups_strcasecmp(name, ipp_cups_ops[i])) return ((ipp_op_t)(i + 0x4001)); for (i = 0; i < (sizeof(ipp_cups_ops2) / sizeof(ipp_cups_ops2[0])); i ++) if (!_cups_strcasecmp(name, ipp_cups_ops2[i])) return ((ipp_op_t)(i + 0x4027)); if (!_cups_strcasecmp(name, "Create-Job-Subscription")) return (IPP_OP_CREATE_JOB_SUBSCRIPTIONS); if (!_cups_strcasecmp(name, "Create-Printer-Subscription")) return (IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS); if (!_cups_strcasecmp(name, "CUPS-Add-Class")) return (IPP_OP_CUPS_ADD_MODIFY_CLASS); if (!_cups_strcasecmp(name, "CUPS-Add-Printer")) return (IPP_OP_CUPS_ADD_MODIFY_PRINTER); return (IPP_OP_CUPS_INVALID); } /* * 'ippPort()' - Return the default IPP port number. */ int /* O - Port number */ ippPort(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_puts("ippPort()"); if (!cg->ipp_port) _cupsSetDefaults(); DEBUG_printf(("1ippPort: Returning %d...", cg->ipp_port)); return (cg->ipp_port); } /* * 'ippSetPort()' - Set the default port number. */ void ippSetPort(int p) /* I - Port number to use */ { DEBUG_printf(("ippSetPort(p=%d)", p)); _cupsGlobals()->ipp_port = p; } /* * 'ippStateString()' - Return the name corresponding to a state value. * * @since CUPS 2.0/OS 10.10@ */ const char * /* O - State name */ ippStateString(ipp_state_t state) /* I - State value */ { if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA) return (ipp_states[state - IPP_STATE_ERROR]); else return ("UNKNOWN"); } /* * 'ippTagString()' - Return the tag name corresponding to a tag value. * * The returned names are defined in RFC 8011 and the IANA IPP Registry. * * @since CUPS 1.4/macOS 10.6@ */ const char * /* O - Tag name */ ippTagString(ipp_tag_t tag) /* I - Tag value */ { tag &= IPP_TAG_CUPS_MASK; if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0]))) return (ipp_tag_names[tag]); else return ("UNKNOWN"); } /* * 'ippTagValue()' - Return the tag value corresponding to a tag name. * * The tag names are defined in RFC 8011 and the IANA IPP Registry. * * @since CUPS 1.4/macOS 10.6@ */ ipp_tag_t /* O - Tag value */ ippTagValue(const char *name) /* I - Tag name */ { size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++) if (!_cups_strcasecmp(name, ipp_tag_names[i])) return ((ipp_tag_t)i); if (!_cups_strcasecmp(name, "operation")) return (IPP_TAG_OPERATION); else if (!_cups_strcasecmp(name, "job")) return (IPP_TAG_JOB); else if (!_cups_strcasecmp(name, "printer")) return (IPP_TAG_PRINTER); else if (!_cups_strcasecmp(name, "unsupported")) return (IPP_TAG_UNSUPPORTED_GROUP); else if (!_cups_strcasecmp(name, "subscription")) return (IPP_TAG_SUBSCRIPTION); else if (!_cups_strcasecmp(name, "event")) return (IPP_TAG_EVENT_NOTIFICATION); else if (!_cups_strcasecmp(name, "language")) return (IPP_TAG_LANGUAGE); else if (!_cups_strcasecmp(name, "mimetype")) return (IPP_TAG_MIMETYPE); else if (!_cups_strcasecmp(name, "name")) return (IPP_TAG_NAME); else if (!_cups_strcasecmp(name, "text")) return (IPP_TAG_TEXT); else if (!_cups_strcasecmp(name, "begCollection")) return (IPP_TAG_BEGIN_COLLECTION); else return (IPP_TAG_ZERO); } /* * 'ipp_col_string()' - Convert a collection to a string. */ static size_t /* O - Number of bytes */ ipp_col_string(ipp_t *col, /* I - Collection attribute */ char *buffer, /* I - Buffer or NULL */ size_t bufsize) /* I - Size of buffer */ { char *bufptr, /* Position in buffer */ *bufend, /* End of buffer */ prefix = '{', /* Prefix character */ temp[256]; /* Temporary string */ ipp_attribute_t *attr; /* Current member attribute */ if (!col) { if (buffer) *buffer = '\0'; return (0); } bufptr = buffer; bufend = buffer + bufsize - 1; for (attr = col->attrs; attr; attr = attr->next) { if (!attr->name) continue; if (buffer && bufptr < bufend) *bufptr = prefix; bufptr ++; prefix = ' '; if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%s=", attr->name); else bufptr += strlen(attr->name) + 1; if (buffer && bufptr < bufend) bufptr += ippAttributeString(attr, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ippAttributeString(attr, temp, sizeof(temp)); } if (prefix == '{') { if (buffer && bufptr < bufend) *bufptr = prefix; bufptr ++; } if (buffer && bufptr < bufend) *bufptr = '}'; bufptr ++; return ((size_t)(bufptr - buffer)); } cups-2.3.1/cups/cupspm-icon.png000664 000765 000024 00000031310 13574721672 016512 0ustar00mikestaff000000 000000 PNG  IHDR8|2IDATx@;IjD/ /hw׳LL:κc|3X_/ Zy1;/OW|>LPyyP*4e9H!i9@YyIa6W|n^ A &<WB@YZ>uEAU}FSg IhK<vܶxpǃmm~\ר^G} gTN'@$L%]\/?Pj 0+C oX]MXet24oRiOG~,xHZ>J$WdH[SâQq|8̤hcG -;(O# ]Or!^)R$O%RxW^Ax1rK+BNX?0O`9Z_+YyY?]G+0J|"!|H;7ވE:p`ᅬz1J+77x!`PWWqC~>VRakaEQD ,˗ sMչZƑ&R] ax^Yk_`H/]]jEQB|Im&0=H kv #*,wJ&"u03G^yTxmH>J$WDH$B"V$7Q'#ț?'z=nݏ?v!4&4S;턩I"(EBxL? .̚8тSOu?L~ k+5k7CXz(iopwZ,AeiW HY-- G$L%W_n) 7( P{~%/ZJ|"!|"1g%on'vr^L#5x1^\oEQ$;a_m f@XzZ?'55Ň ԁ!>ԩ9j)3>LZox3aj`-̘{Q3C.†J}ѻr 3;Fuu?YQ!TTIӧpv'ؾ ?OTTȗ^2ew}5"Ƌ`ˁINċs2y"$qEyC< S!|#@6ÿ` lxpJ@c^Jxqqz7R)#%f9>[T0MС|/*6`;%vssmɿ 0'L@e%9@`.E3) Wg[lS 8{"#5(B-RSO_|q[Jc*b nj@8LoA8cy9.y['S{ūe|xyAYEOV2.LxU8˱Jb&e0^(-u|2ͣ ƦjKU(A*ZD9yO2xw Iόyx[8o2MM0!X,}, beh|x]X#t2~^_& rx`wh4젃N?H E,ܶaqA{ U|rVR>~=8ÇA2*BooaFIp>kZg j+XI"e?^?x"|M&*8g`OӦECs<I\WU3gJ<—XMf↓pCc4֩2W0F"hxXlLsqYb;podlYY۶m۶m۶m۶m۶q5sM|UJ\"3;7HV qQ.y(\Pq +>z,4_¥2| Wn(L'C(L*+^a&|N:W,Z h×_4\j/WxMCoHoJoKHޗ>>>>>+PMK:ֵfFB`,ebIVl.a\<Ӽ̛x( ߛ3YY؉k#\vlڬȒS3) !rZ|JKt ռ"$bW C?,˩<7Op{Z왎ٞO~AV^b|4l~*[9-Yɘ 8 x v|jIߔyCgŖAKu`NPK/g6bVbzv\a\s" 5=iTtX5`caS0(_QPO03a2 Kek3_b\ѼʁߚCi? & ]F{8/W Shiɯy寔 keFO4# 7 rQ΋g,BE46HK~vn-4CzAu1攽nq$56i1_4Wܺ 9d׿[3(uGjP< ,`T/A^ԜPgv $+7qw!ϓx^DnrzjOM1e>{>sNO{YػfY|o\tEBxįpWz1à1rl>ܟ}W*-Sb~Ygo M;79Zlh 7"؛ʟ?T}{w|nLIK/wǖP 8,ODa3fδZ\,?suF!Ci#/ bS 0%RdСvAoxİVӣp⫠Hŋ]ǸםÇ߶bw+!eK&< ] Aox%I*Wܣ b?wtN4z_V-i-[p#۴yNzN7})܄4g׷lybzQVA[ꖔ4EpF G0H5Xxx\[=5*: >WRp{< ;w<0A~NSQ}Al{AmzCMY,1mG֮풜<֖-XQ2}zVj]6۫8唏v*#c~~ 4>蘈,Z^=f:,p|P.^~s%%?e]~q-#^}&n}O|\sǪUЎEvIk}7QmۦG"c־I> UW@E ̙(<qN0K b*ep5f+CdJB^{"cs. :͑Vn_ۂذhuNNM|_v;D:ƍogaB|6Q̍A > V|I`cT7 -bs@99B@c82A [jE{F|~h:[1 ޖP_IBjla7ܢ!`NѪ'a:Cs)Iz}geKjKIZ0$/mG] y{!+#?X֢np㯯R|ysxX)QQ2N.L!AM}cɆz24ץߔu(7WXP~}k¾};G"! >d^,:Q[Cڊ/M4xT[SM<^tNM.ǺE>f5uއ<abAʢB~KQV|Tc:G)P3/,7V z~.) /hqNaڛJ} Ÿ|pr#g5UᘙRv ?*mTOc'@UDzznI8@xWHVY$c(;aJJJ(, e2oG;&X;'@'Zv(s3|5`mrZd\ ;ԩho]gl=tX O)^j'<&ll% gl /%loNqs2y-kxv4'X+lQ{ \-sG-SO̘?:6ךEV,}҄8lbNhUP #޿adO qrT_RR%clK&vUN_@HWwF8J<`_K~Ӥ5Cȝ|U#{;)Q4ScƠ^uC]s1* ğ]6~SՁlQnAFr_(58L8סQE{..@X1vsn~ >6I1ZyW\hJ(CaM~|s#7IRNaVWV 4dRGGdu62ؾ5|Éiر0t:^dϭIP"l ;IM#d{#3Uix`5@peajX8)\܇ uf0T{JY$-%^}T8c@O_86pܦ%X?=aB!o39/V?PxR+D*MJ fJ(΅a03uCZV- $ Vws> I@=V=*l}J,ܽ>0[p9C 3\G~MdEcG~IB L͸\%J"zX h;)x‰JYwmqǟ:W_C4j]UVL̩` Y`3ײ_uF[}RUW !D.-GZp&nWsUUTT* #Lൻ4(Q(5`8g5W7kT*L@"!DKld/4bJ!L,vA6MVZTY9tbEi^ 07ZG:L@O>W\)kn`zMպ亸_b,$,7t Սeg_wfl ;t͜ 'N$yƦO?5k>$NJڢx46<%MƋ )L:+;:P]wʳdSQE; !Zaj-oS$CT_":ɥ;/R/"tWFIĄXpz=<ͷFl(*0`BgI 7:7 T.FtsxkCsgĴŞaTSI# {t!94zP˵T_"/ C-tqG$Vs-#hzƌgx RP=\1Na'id#W_aG1G—2I4E$ ;)-0I$HvEX$ky?D6H׍GԧIyiW;7]Y=zS"‹ _q%I*IG1޹V((>|xͅNb.x9|,$a'$,Bܟ^Xٺf.Ed/!aq:;6DYzYu7%r Uy=/3]b)0lS]s]n~  & fgv8䮷ߡ =dq)<u_Z]Sn~C3Xaa'SOCh?)| }I+ @YYn{ʫf| [*퐭k%/E7/6i)-ǫ$*\9ƺ,K0H`Ud7~7+wExM"a)ǃ$2ƒYg7/h=Z%XZR4Z%ǢwܧeUEXz,m3>^C̳;s$Es->#I2`>LR LQ) ^$_>Hr2IG0I>dxXD9 'e!5º:J6̑x mmq B Ѯ -Fo [Ɵz 9s,+L\hx>G'|˭gnvaD1F.&R goTUўh7?3pjM vO"F1oݓ;wBu-N2?3Iz:)I5+3PtM<99DXY&yLٲj6!k4&{YFD#UߟI[Jʆ|>G)v$?/LQG iyK 6ݙ$OW_IdI $JbGꥀ~m'=]ڦDRIf΂#;V_cՙ6m'8$=8tݡk$!eS8R~W5fCܚ߹=@Ҟ0mp.$H>#s Kt"I 2 $UN2?lRM:_ Dη='iD{:NEExfbD$x{C`ga&ߙ!f_t ge;x"ɤ$&r"IXjPj~~״4!I}L&Ofd$|zʒ$/&skD{$2D &ėUX]Gyox?͵zsa_len) # else # define sockaddr_len(a) (sizeof(struct sockaddr)) # endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */ for (bufptr = buffer, bufend = buffer + conf.ifc_len; bufptr < bufend; bufptr += ifpsize) { /* * Get the current interface information... */ ifp = (struct ifreq *)bufptr; ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr)); if (ifpsize < sizeof(struct ifreq)) ifpsize = sizeof(struct ifreq); memset(&request, 0, sizeof(request)); memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name)); /* * Check the status of the interface... */ if (ioctl(sock, SIOCGIFFLAGS, &request) < 0) continue; /* * Allocate memory for a single interface record... */ if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL) { /* * Unable to allocate memory... */ close(sock); return (-1); } /* * Add this record to the front of the list and copy the name, flags, * and network address... */ temp->ifa_next = *addrs; *addrs = temp; temp->ifa_name = strdup(ifp->ifr_name); temp->ifa_flags = request.ifr_flags; if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL) memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr))); /* * Try to get the netmask for the interface... */ if (!ioctl(sock, SIOCGIFNETMASK, &request)) { /* * Got it, make a copy... */ if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL) memcpy(temp->ifa_netmask, &(request.ifr_netmask), sizeof(request.ifr_netmask)); } /* * Then get the broadcast or point-to-point (destination) address, * if applicable... */ if (temp->ifa_flags & IFF_BROADCAST) { /* * Have a broadcast address, so get it! */ if (!ioctl(sock, SIOCGIFBRDADDR, &request)) { /* * Got it, make a copy... */ if ((temp->ifa_broadaddr = calloc(1, sizeof(request.ifr_broadaddr))) != NULL) memcpy(temp->ifa_broadaddr, &(request.ifr_broadaddr), sizeof(request.ifr_broadaddr)); } } else if (temp->ifa_flags & IFF_POINTOPOINT) { /* * Point-to-point interface; grab the remote address... */ if (!ioctl(sock, SIOCGIFDSTADDR, &request)) { temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr)); memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr), sizeof(request.ifr_dstaddr)); } } } /* * OK, we're done with the socket, close it and return 0... */ close(sock); return (0); } /* * '_cups_freeifaddrs()' - Free an interface list... */ void _cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */ { struct ifaddrs *next; /* Next interface in list */ while (addrs != NULL) { /* * Make a copy of the next interface pointer... */ next = addrs->ifa_next; /* * Free data values as needed... */ if (addrs->ifa_name) { free(addrs->ifa_name); addrs->ifa_name = NULL; } if (addrs->ifa_addr) { free(addrs->ifa_addr); addrs->ifa_addr = NULL; } if (addrs->ifa_netmask) { free(addrs->ifa_netmask); addrs->ifa_netmask = NULL; } if (addrs->ifa_dstaddr) { free(addrs->ifa_dstaddr); addrs->ifa_dstaddr = NULL; } /* * Free this node and continue to the next... */ free(addrs); addrs = next; } } #endif /* !HAVE_GETIFADDRS */ cups-2.3.1/cups/ppd-private.h000664 000765 000024 00000022026 13574721672 016157 0ustar00mikestaff000000 000000 /* * Private PPD definitions for CUPS. * * 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. * * PostScript is a trademark of Adobe Systems, Inc. */ #ifndef _CUPS_PPD_PRIVATE_H_ # define _CUPS_PPD_PRIVATE_H_ /* * Include necessary headers... */ # include # include # include "pwg-private.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define _PPD_CACHE_VERSION 9 /* Version number in cache file */ /* * Types and structures... */ typedef struct _ppd_globals_s /**** CUPS PPD global state data ****/ { /* ppd.c */ ppd_status_t ppd_status; /* Status of last ppdOpen*() */ int ppd_line; /* Current line number */ ppd_conform_t ppd_conform; /* Level of conformance required */ /* ppd-util.c */ char ppd_filename[HTTP_MAX_URI]; /* PPD filename */ } _ppd_globals_t; typedef enum _ppd_localization_e /**** Selector for _ppdOpen ****/ { _PPD_LOCALIZATION_DEFAULT, /* Load only the default localization */ _PPD_LOCALIZATION_ICC_PROFILES, /* Load only the color profile localization */ _PPD_LOCALIZATION_NONE, /* Load no localizations */ _PPD_LOCALIZATION_ALL /* Load all localizations */ } _ppd_localization_t; typedef enum _ppd_parse_e /**** Selector for _ppdParseOptions ****/ { _PPD_PARSE_OPTIONS, /* Parse only the options */ _PPD_PARSE_PROPERTIES, /* Parse only the properties */ _PPD_PARSE_ALL /* Parse everything */ } _ppd_parse_t; typedef struct _ppd_cups_uiconst_s /**** Constraint from cupsUIConstraints ****/ { ppd_option_t *option; /* Constrained option */ ppd_choice_t *choice; /* Constrained choice or @code NULL@ */ int installable; /* Installable option? */ } _ppd_cups_uiconst_t; typedef struct _ppd_cups_uiconsts_s /**** cupsUIConstraints ****/ { char resolver[PPD_MAX_NAME]; /* Resolver name */ int installable, /* Constrained against any installable options? */ num_constraints; /* Number of constraints */ _ppd_cups_uiconst_t *constraints; /* Constraints */ } _ppd_cups_uiconsts_t; typedef enum _pwg_print_color_mode_e /**** PWG print-color-mode indices ****/ { _PWG_PRINT_COLOR_MODE_MONOCHROME = 0, /* print-color-mode=monochrome */ _PWG_PRINT_COLOR_MODE_COLOR, /* print-color-mode=color */ /* Other values are not supported by CUPS yet. */ _PWG_PRINT_COLOR_MODE_MAX } _pwg_print_color_mode_t; typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/ { _PWG_PRINT_QUALITY_DRAFT = 0, /* print-quality=3 */ _PWG_PRINT_QUALITY_NORMAL, /* print-quality=4 */ _PWG_PRINT_QUALITY_HIGH, /* print-quality=5 */ _PWG_PRINT_QUALITY_MAX } _pwg_print_quality_t; typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/ { ipp_finishings_t value; /* finishings value */ int num_options; /* Number of options to apply */ cups_option_t *options; /* Options to apply */ } _pwg_finishings_t; struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/ { int num_bins; /* Number of output bins */ pwg_map_t *bins; /* Output bins */ int num_sizes; /* Number of media sizes */ pwg_size_t *sizes; /* Media sizes */ int custom_max_width, /* Maximum custom width in 2540ths */ custom_max_length, /* Maximum custom length in 2540ths */ custom_min_width, /* Minimum custom width in 2540ths */ custom_min_length; /* Minimum custom length in 2540ths */ char *custom_max_keyword, /* Maximum custom size PWG keyword */ *custom_min_keyword, /* Minimum custom size PWG keyword */ custom_ppd_size[41]; /* Custom PPD size name */ pwg_size_t custom_size; /* Custom size record */ char *source_option; /* PPD option for media source */ int num_sources; /* Number of media sources */ pwg_map_t *sources; /* Media sources */ int num_types; /* Number of media types */ pwg_map_t *types; /* Media types */ int num_presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX]; /* Number of print-color-mode/print-quality options */ cups_option_t *presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX]; /* print-color-mode/print-quality options */ char *sides_option, /* PPD option for sides */ *sides_1sided, /* Choice for one-sided */ *sides_2sided_long, /* Choice for two-sided-long-edge */ *sides_2sided_short; /* Choice for two-sided-short-edge */ char *product; /* Product value */ cups_array_t *filters, /* cupsFilter/cupsFilter2 values */ *prefilters; /* cupsPreFilter values */ int single_file; /* cupsSingleFile value */ cups_array_t *finishings; /* cupsIPPFinishings values */ cups_array_t *templates; /* cupsFinishingTemplate values */ int max_copies, /* cupsMaxCopies value */ account_id, /* cupsJobAccountId value */ accounting_user_id; /* cupsJobAccountingUserId value */ char *password; /* cupsJobPassword value */ cups_array_t *mandatory; /* cupsMandatory value */ char *charge_info_uri; /* cupsChargeInfoURI value */ cups_array_t *strings; /* Localization strings */ cups_array_t *support_files; /* Support files - ICC profiles, etc. */ }; /* * Prototypes... */ extern int _cupsConvertOptions(ipp_t *request, ppd_file_t *ppd, _ppd_cache_t *pc, ipp_attribute_t *media_col_sup, ipp_attribute_t *doc_handling_sup, ipp_attribute_t *print_color_mode_sup, const char *user, const char *format, int copies, int num_options, cups_option_t *options) _CUPS_PRIVATE; extern int _cupsRasterExecPS(cups_page_header2_t *h, int *preferred_bits, const char *code) _CUPS_NONNULL(3) _CUPS_PRIVATE; extern int _cupsRasterInterpretPPD(cups_page_header2_t *h, ppd_file_t *ppd, int num_options, cups_option_t *options, cups_interpret_cb_t func) _CUPS_PRIVATE; extern _ppd_cache_t *_ppdCacheCreateWithFile(const char *filename, ipp_t **attrs) _CUPS_PRIVATE; extern _ppd_cache_t *_ppdCacheCreateWithPPD(ppd_file_t *ppd) _CUPS_PRIVATE; extern void _ppdCacheDestroy(_ppd_cache_t *pc) _CUPS_PRIVATE; extern const char *_ppdCacheGetBin(_ppd_cache_t *pc, const char *output_bin) _CUPS_PRIVATE; extern int _ppdCacheGetFinishingOptions(_ppd_cache_t *pc, ipp_t *job, ipp_finishings_t value, int num_options, cups_option_t **options) _CUPS_PRIVATE; extern int _ppdCacheGetFinishingValues(ppd_file_t *ppd, _ppd_cache_t *pc, int max_values, int *values) _CUPS_PRIVATE; extern const char *_ppdCacheGetInputSlot(_ppd_cache_t *pc, ipp_t *job, const char *keyword) _CUPS_PRIVATE; extern const char *_ppdCacheGetMediaType(_ppd_cache_t *pc, ipp_t *job, const char *keyword) _CUPS_PRIVATE; extern const char *_ppdCacheGetOutputBin(_ppd_cache_t *pc, const char *keyword) _CUPS_PRIVATE; extern const char *_ppdCacheGetPageSize(_ppd_cache_t *pc, ipp_t *job, const char *keyword, int *exact) _CUPS_PRIVATE; extern pwg_size_t *_ppdCacheGetSize(_ppd_cache_t *pc, const char *page_size) _CUPS_PRIVATE; extern const char *_ppdCacheGetSource(_ppd_cache_t *pc, const char *input_slot) _CUPS_PRIVATE; extern const char *_ppdCacheGetType(_ppd_cache_t *pc, const char *media_type) _CUPS_PRIVATE; extern int _ppdCacheWriteFile(_ppd_cache_t *pc, const char *filename, ipp_t *attrs) _CUPS_PRIVATE; extern char *_ppdCreateFromIPP(char *buffer, size_t bufsize, ipp_t *response) _CUPS_PRIVATE; extern void _ppdFreeLanguages(cups_array_t *languages) _CUPS_PRIVATE; extern cups_encoding_t _ppdGetEncoding(const char *name) _CUPS_PRIVATE; extern cups_array_t *_ppdGetLanguages(ppd_file_t *ppd) _CUPS_PRIVATE; extern _ppd_globals_t *_ppdGlobals(void) _CUPS_PRIVATE; extern unsigned _ppdHashName(const char *name) _CUPS_PRIVATE; extern ppd_attr_t *_ppdLocalizedAttr(ppd_file_t *ppd, const char *keyword, const char *spec, const char *ll_CC) _CUPS_PRIVATE; extern char *_ppdNormalizeMakeAndModel(const char *make_and_model, char *buffer, size_t bufsize) _CUPS_PRIVATE; extern ppd_file_t *_ppdOpen(cups_file_t *fp, _ppd_localization_t localization) _CUPS_PRIVATE; extern ppd_file_t *_ppdOpenFile(const char *filename, _ppd_localization_t localization) _CUPS_PRIVATE; extern int _ppdParseOptions(const char *s, int num_options, cups_option_t **options, _ppd_parse_t which) _CUPS_PRIVATE; extern const char *_pwgInputSlotForSource(const char *media_source, char *name, size_t namesize) _CUPS_PRIVATE; extern const char *_pwgMediaTypeForType(const char *media_type, char *name, size_t namesize) _CUPS_PRIVATE; extern const char *_pwgPageSizeForMedia(pwg_media_t *media, char *name, size_t namesize) _CUPS_PRIVATE; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_PPD_PRIVATE_H_ */ cups-2.3.1/cups/ipp.c000664 000765 000024 00000554251 13574721672 014521 0ustar00mikestaff000000 000000 /* * Internet Printing Protocol functions for CUPS. * * 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. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #ifdef _WIN32 # include #endif /* _WIN32 */ /* * Local functions... */ static ipp_attribute_t *ipp_add_attr(ipp_t *ipp, const char *name, ipp_tag_t group_tag, ipp_tag_t value_tag, int num_values); static void ipp_free_values(ipp_attribute_t *attr, int element, int count); static char *ipp_get_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2); static char *ipp_lang_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2); static size_t ipp_length(ipp_t *ipp, int collection); static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer, size_t length); static ssize_t ipp_read_file(int *fd, ipp_uchar_t *buffer, size_t length); static void ipp_set_error(ipp_status_t status, const char *format, ...); static _ipp_value_t *ipp_set_value(ipp_t *ipp, ipp_attribute_t **attr, int element); static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer, size_t length); /* * '_cupsBufferGet()' - Get a read/write buffer. */ char * /* O - Buffer */ _cupsBufferGet(size_t size) /* I - Size required */ { _cups_buffer_t *buffer; /* Current buffer */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ for (buffer = cg->cups_buffers; buffer; buffer = buffer->next) if (!buffer->used && buffer->size >= size) break; if (!buffer) { if ((buffer = malloc(sizeof(_cups_buffer_t) + size - 1)) == NULL) return (NULL); buffer->next = cg->cups_buffers; buffer->size = size; cg->cups_buffers = buffer; } buffer->used = 1; return (buffer->d); } /* * '_cupsBufferRelease()' - Release a read/write buffer. */ void _cupsBufferRelease(char *b) /* I - Buffer to release */ { _cups_buffer_t *buffer; /* Buffer */ /* * Mark this buffer as unused... */ buffer = (_cups_buffer_t *)(b - offsetof(_cups_buffer_t, d)); buffer->used = 0; } /* * 'ippAddBoolean()' - Add a boolean attribute to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddBoolean(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ char value) /* I - Value of attribute */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), name, value)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BOOLEAN, 1)) == NULL) return (NULL); attr->values[0].boolean = value; return (attr); } /* * 'ippAddBooleans()' - Add an array of boolean values. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddBooleans(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ int num_values, /* I - Number of values */ const char *values) /* I - Values */ { int i; /* Looping var */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BOOLEAN, num_values)) == NULL) return (NULL); if (values) { for (i = num_values, value = attr->values; i > 0; i --, value ++) value->boolean = *values++; } return (attr); } /* * 'ippAddCollection()' - Add a collection value. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * @since CUPS 1.1.19/macOS 10.3@ */ ipp_attribute_t * /* O - New attribute */ ippAddCollection(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ ipp_t *value) /* I - Value */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BEGIN_COLLECTION, 1)) == NULL) return (NULL); attr->values[0].collection = value; if (value) value->use ++; return (attr); } /* * 'ippAddCollections()' - Add an array of collection values. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * @since CUPS 1.1.19/macOS 10.3@ */ ipp_attribute_t * /* O - New attribute */ ippAddCollections( ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ int num_values, /* I - Number of values */ const ipp_t **values) /* I - Values */ { int i; /* Looping var */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BEGIN_COLLECTION, num_values)) == NULL) return (NULL); if (values) { for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->collection = (ipp_t *)*values++; value->collection->use ++; } } return (attr); } /* * 'ippAddDate()' - Add a dateTime attribute to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddDate(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ const ipp_uchar_t *value) /* I - Value */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value)); /* * Range check input... */ if (!ipp || !name || !value || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_DATE, 1)) == NULL) return (NULL); memcpy(attr->values[0].date, value, 11); return (attr); } /* * 'ippAddInteger()' - Add a integer attribute to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported values include enum (@code IPP_TAG_ENUM@) and integer * (@code IPP_TAG_INTEGER@). */ ipp_attribute_t * /* O - New attribute */ ippAddInteger(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ int value) /* I - Value of attribute */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, value)); value_tag &= IPP_TAG_CUPS_MASK; /* * Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand * function... */ if (value_tag >= IPP_TAG_UNSUPPORTED_VALUE && value_tag <= IPP_TAG_ADMINDEFINE) return (ippAddOutOfBand(ipp, group, value_tag, name)); /* * Range check input... */ #if 0 if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM)) return (NULL); #else if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); #endif /* 0 */ /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, value_tag, 1)) == NULL) return (NULL); attr->values[0].integer = value; return (attr); } /* * 'ippAddIntegers()' - Add an array of integer values. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported values include enum (@code IPP_TAG_ENUM@) and integer * (@code IPP_TAG_INTEGER@). */ ipp_attribute_t * /* O - New attribute */ ippAddIntegers(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ int num_values, /* I - Number of values */ const int *values) /* I - Values */ { int i; /* Looping var */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, (void *)values)); value_tag &= IPP_TAG_CUPS_MASK; /* * Range check input... */ #if 0 if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM) || num_values < 1) return (NULL); #else if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); #endif /* 0 */ /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, value_tag, num_values)) == NULL) return (NULL); if (values) { for (i = num_values, value = attr->values; i > 0; i --, value ++) value->integer = *values++; } return (attr); } /* * 'ippAddOctetString()' - Add an octetString value to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * @since CUPS 1.2/macOS 10.5@ */ ipp_attribute_t * /* O - New attribute */ ippAddOctetString(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ const void *data, /* I - octetString data */ int datalen) /* I - Length of data in bytes */ { ipp_attribute_t *attr; /* New attribute */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || datalen < 0 || datalen > IPP_MAX_LENGTH) return (NULL); if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_STRING, 1)) == NULL) return (NULL); /* * Initialize the attribute data... */ attr->values[0].unknown.length = datalen; if (data) { if ((attr->values[0].unknown.data = malloc((size_t)datalen)) == NULL) { ippDeleteAttribute(ipp, attr); return (NULL); } memcpy(attr->values[0].unknown.data, data, (size_t)datalen); } /* * Return the new attribute... */ return (attr); } /* * 'ippAddOutOfBand()' - Add an out-of-band value to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported out-of-band values include unsupported-value * (@code IPP_TAG_UNSUPPORTED_VALUE@), default (@code IPP_TAG_DEFAULT@), unknown * (@code IPP_TAG_UNKNOWN@), no-value (@code IPP_TAG_NOVALUE@), not-settable * (@code IPP_TAG_NOTSETTABLE@), delete-attribute (@code IPP_TAG_DELETEATTR@), and * admin-define (@code IPP_TAG_ADMINDEFINE@). * * @since CUPS 1.6/macOS 10.8@ */ ipp_attribute_t * /* O - New attribute */ ippAddOutOfBand(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name) /* I - Name of attribute */ { DEBUG_printf(("ippAddOutOfBand(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name)); value_tag &= IPP_TAG_CUPS_MASK; /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_UNSUPPORTED_VALUE && value_tag != IPP_TAG_DEFAULT && value_tag != IPP_TAG_UNKNOWN && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_NOTSETTABLE && value_tag != IPP_TAG_DELETEATTR && value_tag != IPP_TAG_ADMINDEFINE)) return (NULL); /* * Create the attribute... */ return (ipp_add_attr(ipp, name, group, value_tag, 1)); } /* * 'ippAddRange()' - Add a range of values to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * The @code lower@ parameter must be less than or equal to the @code upper@ parameter. */ ipp_attribute_t * /* O - New attribute */ ippAddRange(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ int lower, /* I - Lower value */ int upper) /* I - Upper value */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, upper=%d)", (void *)ipp, group, ippTagString(group), name, lower, upper)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RANGE, 1)) == NULL) return (NULL); attr->values[0].range.lower = lower; attr->values[0].range.upper = upper; return (attr); } /* * 'ippAddRanges()' - Add ranges of values to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddRanges(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ int num_values, /* I - Number of values */ const int *lower, /* I - Lower values */ const int *upper) /* I - Upper values */ { int i; /* Looping var */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, lower=%p, upper=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)lower, (void *)upper)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RANGE, num_values)) == NULL) return (NULL); if (lower && upper) { for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->range.lower = *lower++; value->range.upper = *upper++; } } return (attr); } /* * 'ippAddResolution()' - Add a resolution value to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddResolution(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ ipp_res_t units, /* I - Units for resolution */ int xres, /* I - X resolution */ int yres) /* I - Y resolution */ { ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", units=%d, xres=%d, yres=%d)", (void *)ipp, group, ippTagString(group), name, units, xres, yres)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM || xres < 0 || yres < 0) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RESOLUTION, 1)) == NULL) return (NULL); attr->values[0].resolution.xres = xres; attr->values[0].resolution.yres = yres; attr->values[0].resolution.units = units; return (attr); } /* * 'ippAddResolutions()' - Add resolution values to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). */ ipp_attribute_t * /* O - New attribute */ ippAddResolutions(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ const char *name, /* I - Name of attribute */ int num_values,/* I - Number of values */ ipp_res_t units, /* I - Units for resolution */ const int *xres, /* I - X resolutions */ const int *yres) /* I - Y resolutions */ { int i; /* Looping var */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", num_value=%d, units=%d, xres=%p, yres=%p)", (void *)ipp, group, ippTagString(group), name, num_values, units, (void *)xres, (void *)yres)); /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1 || units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM) return (NULL); /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RESOLUTION, num_values)) == NULL) return (NULL); if (xres && yres) { for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->resolution.xres = *xres++; value->resolution.yres = *yres++; value->resolution.units = units; } } return (attr); } /* * 'ippAddSeparator()' - Add a group separator to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. */ ipp_attribute_t * /* O - New attribute */ ippAddSeparator(ipp_t *ipp) /* I - IPP message */ { DEBUG_printf(("ippAddSeparator(ipp=%p)", (void *)ipp)); /* * Range check input... */ if (!ipp) return (NULL); /* * Create the attribute... */ return (ipp_add_attr(ipp, NULL, IPP_TAG_ZERO, IPP_TAG_ZERO, 0)); } /* * 'ippAddString()' - Add a language-encoded string to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme * (@code IPP_TAG_URISCHEME@). * * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage and * textWithLanguage string values and must be @code NULL@ for all other string values. */ ipp_attribute_t * /* O - New attribute */ ippAddString(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ const char *language, /* I - Language code */ const char *value) /* I - Value */ { ipp_tag_t temp_tag; /* Temporary value tag (masked) */ ipp_attribute_t *attr; /* New attribute */ char code[IPP_MAX_LANGUAGE]; /* Charset/language code buffer */ DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", language=\"%s\", value=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, language, value)); /* * Range check input... */ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK); #if 0 if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (temp_tag < IPP_TAG_TEXT && temp_tag != IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_NAMELANG) || temp_tag > IPP_TAG_MIMETYPE) return (NULL); if ((temp_tag == IPP_TAG_TEXTLANG || temp_tag == IPP_TAG_NAMELANG) != (language != NULL)) return (NULL); #else if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); #endif /* 0 */ /* * See if we need to map charset, language, or locale values... */ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && strcmp(language, ipp_lang_code(language, code, sizeof(code)))) value_tag = temp_tag; /* Don't do a fast copy */ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) && strcmp(value, ipp_get_code(value, code, sizeof(code)))) value_tag = temp_tag; /* Don't do a fast copy */ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) && strcmp(value, ipp_lang_code(value, code, sizeof(code)))) value_tag = temp_tag; /* Don't do a fast copy */ /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, value_tag, 1)) == NULL) return (NULL); /* * Initialize the attribute data... */ if ((int)value_tag & IPP_TAG_CUPS_CONST) { attr->values[0].string.language = (char *)language; attr->values[0].string.text = (char *)value; } else { if (language) attr->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language, code, sizeof(code))); if (value) { if (value_tag == IPP_TAG_CHARSET) attr->values[0].string.text = _cupsStrAlloc(ipp_get_code(value, code, sizeof(code))); else if (value_tag == IPP_TAG_LANGUAGE) attr->values[0].string.text = _cupsStrAlloc(ipp_lang_code(value, code, sizeof(code))); else attr->values[0].string.text = _cupsStrAlloc(value); } } return (attr); } /* * 'ippAddStringf()' - Add a formatted string to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document * (@code IPP_TAG_DOCUMENT@), event notification * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@), * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@), * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme * (@code IPP_TAG_URISCHEME@). * * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage * and textWithLanguage string values and must be @code NULL@ for all other * string values. * * The @code format@ parameter uses formatting characters compatible with the * printf family of standard functions. Additional arguments follow it as * needed. The formatted string is truncated as needed to the maximum length of * the corresponding value type. * * @since CUPS 1.7/macOS 10.9@ */ ipp_attribute_t * /* O - New attribute */ ippAddStringf(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ const char *language, /* I - Language code (@code NULL@ for default) */ const char *format, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { ipp_attribute_t *attr; /* New attribute */ va_list ap; /* Argument pointer */ va_start(ap, format); attr = ippAddStringfv(ipp, group, value_tag, name, language, format, ap); va_end(ap); return (attr); } /* * 'ippAddStringfv()' - Add a formatted string to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document * (@code IPP_TAG_DOCUMENT@), event notification * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@), * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@), * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme * (@code IPP_TAG_URISCHEME@). * * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage * and textWithLanguage string values and must be @code NULL@ for all other * string values. * * The @code format@ parameter uses formatting characters compatible with the * printf family of standard functions. Additional arguments are passed in the * stdarg pointer @code ap@. The formatted string is truncated as needed to the * maximum length of the corresponding value type. * * @since CUPS 1.7/macOS 10.9@ */ ipp_attribute_t * /* O - New attribute */ ippAddStringfv(ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ const char *language, /* I - Language code (@code NULL@ for default) */ const char *format, /* I - Printf-style format string */ va_list ap) /* I - Additional arguments */ { char buffer[IPP_MAX_TEXT + 4]; /* Formatted text string */ ssize_t bytes, /* Length of formatted value */ max_bytes; /* Maximum number of bytes for value */ /* * Range check input... */ if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE || !format) return (NULL); if ((value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG) != (language != NULL)) return (NULL); /* * Format the string... */ if (!strcmp(format, "%s")) { /* * Optimize the simple case... */ const char *s = va_arg(ap, char *); if (!s) s = "(null)"; bytes = (ssize_t)strlen(s); strlcpy(buffer, s, sizeof(buffer)); } else { /* * Do a full formatting of the message... */ if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0) return (NULL); } /* * Limit the length of the string... */ switch (value_tag) { default : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : max_bytes = IPP_MAX_TEXT; break; case IPP_TAG_NAME : case IPP_TAG_NAMELANG : max_bytes = IPP_MAX_NAME; break; case IPP_TAG_CHARSET : max_bytes = IPP_MAX_CHARSET; break; case IPP_TAG_KEYWORD : max_bytes = IPP_MAX_KEYWORD; break; case IPP_TAG_LANGUAGE : max_bytes = IPP_MAX_LANGUAGE; break; case IPP_TAG_MIMETYPE : max_bytes = IPP_MAX_MIMETYPE; break; case IPP_TAG_URI : max_bytes = IPP_MAX_URI; break; case IPP_TAG_URISCHEME : max_bytes = IPP_MAX_URISCHEME; break; } if (bytes >= max_bytes) { char *bufmax, /* Buffer at max_bytes */ *bufptr; /* Pointer into buffer */ bufptr = buffer + strlen(buffer) - 1; bufmax = buffer + max_bytes - 1; while (bufptr > bufmax) { if (*bufptr & 0x80) { while ((*bufptr & 0xc0) == 0x80 && bufptr > buffer) bufptr --; } bufptr --; } *bufptr = '\0'; } /* * Add the formatted string and return... */ return (ippAddString(ipp, group, value_tag, name, language, buffer)); } /* * 'ippAddStrings()' - Add language-encoded strings to an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme * (@code IPP_TAG_URISCHEME@). * * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage and * textWithLanguage string values and must be @code NULL@ for all other string values. */ ipp_attribute_t * /* O - New attribute */ ippAddStrings( ipp_t *ipp, /* I - IPP message */ ipp_tag_t group, /* I - IPP group */ ipp_tag_t value_tag, /* I - Type of attribute */ const char *name, /* I - Name of attribute */ int num_values, /* I - Number of values */ const char *language, /* I - Language code (@code NULL@ for default) */ const char * const *values) /* I - Values */ { int i; /* Looping var */ ipp_tag_t temp_tag; /* Temporary value tag (masked) */ ipp_attribute_t *attr; /* New attribute */ _ipp_value_t *value; /* Current value */ char code[32]; /* Language/charset value buffer */ DEBUG_printf(("ippAddStrings(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", num_values=%d, language=\"%s\", values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, language, (void *)values)); /* * Range check input... */ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK); #if 0 if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (temp_tag < IPP_TAG_TEXT && temp_tag != IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_NAMELANG) || temp_tag > IPP_TAG_MIMETYPE || num_values < 1) return (NULL); if ((temp_tag == IPP_TAG_TEXTLANG || temp_tag == IPP_TAG_NAMELANG) != (language != NULL)) return (NULL); #else if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); #endif /* 0 */ /* * See if we need to map charset, language, or locale values... */ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && strcmp(language, ipp_lang_code(language, code, sizeof(code)))) value_tag = temp_tag; /* Don't do a fast copy */ else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST)) { for (i = 0; i < num_values; i ++) if (strcmp(values[i], ipp_get_code(values[i], code, sizeof(code)))) { value_tag = temp_tag; /* Don't do a fast copy */ break; } } else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST)) { for (i = 0; i < num_values; i ++) if (strcmp(values[i], ipp_lang_code(values[i], code, sizeof(code)))) { value_tag = temp_tag; /* Don't do a fast copy */ break; } } /* * Create the attribute... */ if ((attr = ipp_add_attr(ipp, name, group, value_tag, num_values)) == NULL) return (NULL); /* * Initialize the attribute data... */ for (i = num_values, value = attr->values; i > 0; i --, value ++) { if (language) { if (value == attr->values) { if ((int)value_tag & IPP_TAG_CUPS_CONST) value->string.language = (char *)language; else value->string.language = _cupsStrAlloc(ipp_lang_code(language, code, sizeof(code))); } else value->string.language = attr->values[0].string.language; } if (values) { if ((int)value_tag & IPP_TAG_CUPS_CONST) value->string.text = (char *)*values++; else if (value_tag == IPP_TAG_CHARSET) value->string.text = _cupsStrAlloc(ipp_get_code(*values++, code, sizeof(code))); else if (value_tag == IPP_TAG_LANGUAGE) value->string.text = _cupsStrAlloc(ipp_lang_code(*values++, code, sizeof(code))); else value->string.text = _cupsStrAlloc(*values++); } } return (attr); } /* * 'ippContainsInteger()' - Determine whether an attribute contains the * specified value or is within the list of ranges. * * Returns non-zero when the attribute contains either a matching integer or * enum value, or the value falls within one of the rangeOfInteger values for * the attribute. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on a match, 0 on no match */ ippContainsInteger( ipp_attribute_t *attr, /* I - Attribute */ int value) /* I - Integer/enum value */ { int i; /* Looping var */ _ipp_value_t *avalue; /* Current attribute value */ /* * Range check input... */ if (!attr) return (0); if (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM && attr->value_tag != IPP_TAG_RANGE) return (0); /* * Compare... */ if (attr->value_tag == IPP_TAG_RANGE) { for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) if (value >= avalue->range.lower && value <= avalue->range.upper) return (1); } else { for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) if (value == avalue->integer) return (1); } return (0); } /* * 'ippContainsString()' - Determine whether an attribute contains the * specified string value. * * Returns non-zero when the attribute contains a matching charset, keyword, * naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on a match, 0 on no match */ ippContainsString( ipp_attribute_t *attr, /* I - Attribute */ const char *value) /* I - String value */ { int i; /* Looping var */ _ipp_value_t *avalue; /* Current attribute value */ DEBUG_printf(("ippContainsString(attr=%p, value=\"%s\")", (void *)attr, value)); /* * Range check input... */ if (!attr || !value) { DEBUG_puts("1ippContainsString: Returning 0 (bad input)"); return (0); } /* * Compare... */ DEBUG_printf(("1ippContainsString: attr %s, %s with %d values.", attr->name, ippTagString(attr->value_tag), attr->num_values)); switch (attr->value_tag & IPP_TAG_CUPS_MASK) { case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : case IPP_TAG_LANGUAGE : case IPP_TAG_URI : case IPP_TAG_URISCHEME : for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) { DEBUG_printf(("1ippContainsString: value[%d]=\"%s\"", attr->num_values - i, avalue->string.text)); if (!strcmp(value, avalue->string.text)) { DEBUG_puts("1ippContainsString: Returning 1 (match)"); return (1); } } case IPP_TAG_MIMETYPE : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) { DEBUG_printf(("1ippContainsString: value[%d]=\"%s\"", attr->num_values - i, avalue->string.text)); if (!_cups_strcasecmp(value, avalue->string.text)) { DEBUG_puts("1ippContainsString: Returning 1 (match)"); return (1); } } default : break; } DEBUG_puts("1ippContainsString: Returning 0 (no match)"); return (0); } /* * 'ippCopyAttribute()' - Copy an attribute. * * The specified attribute, @code attr@, is copied to the destination IPP message. * When @code quickcopy@ is non-zero, a "shallow" reference copy of the attribute is * created - this should only be done as long as the original source IPP message will * not be freed for the life of the destination. * * @since CUPS 1.6/macOS 10.8@ */ ipp_attribute_t * /* O - New attribute */ ippCopyAttribute( ipp_t *dst, /* I - Destination IPP message */ ipp_attribute_t *srcattr, /* I - Attribute to copy */ int quickcopy) /* I - 1 for a referenced copy, 0 for normal */ { int i; /* Looping var */ ipp_tag_t srctag; /* Source value tag */ ipp_attribute_t *dstattr; /* Destination attribute */ _ipp_value_t *srcval, /* Source value */ *dstval; /* Destination value */ DEBUG_printf(("ippCopyAttribute(dst=%p, srcattr=%p, quickcopy=%d)", (void *)dst, (void *)srcattr, quickcopy)); /* * Range check input... */ if (!dst || !srcattr) return (NULL); /* * Copy it... */ quickcopy = (quickcopy && (srcattr->value_tag & IPP_TAG_CUPS_CONST)) ? IPP_TAG_CUPS_CONST : 0; srctag = srcattr->value_tag & IPP_TAG_CUPS_MASK; switch (srctag) { case IPP_TAG_ZERO : dstattr = ippAddSeparator(dst); break; case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : dstattr = ippAddOutOfBand(dst, srcattr->group_tag, srctag, srcattr->name); break; case IPP_TAG_INTEGER : case IPP_TAG_ENUM : case IPP_TAG_BOOLEAN : case IPP_TAG_DATE : case IPP_TAG_RESOLUTION : case IPP_TAG_RANGE : if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) != NULL) memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t)); break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_RESERVED_STRING : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) break; if (quickcopy) { /* * Can safely quick-copy these string values... */ memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t)); } else { /* * Otherwise do a normal reference counted copy... */ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) dstval->string.text = _cupsStrAlloc(srcval->string.text); } break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) break; if (quickcopy) { /* * Can safely quick-copy these string values... */ memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t)); } else if (srcattr->value_tag & IPP_TAG_CUPS_CONST) { /* * Otherwise do a normal reference counted copy... */ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) { if (srcval == srcattr->values) dstval->string.language = _cupsStrAlloc(srcval->string.language); else dstval->string.language = dstattr->values[0].string.language; dstval->string.text = _cupsStrAlloc(srcval->string.text); } } break; case IPP_TAG_BEGIN_COLLECTION : if ((dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name, srcattr->num_values, NULL)) == NULL) break; for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) { dstval->collection = srcval->collection; srcval->collection->use ++; } break; case IPP_TAG_STRING : default : if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) == NULL) break; for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) { dstval->unknown.length = srcval->unknown.length; if (dstval->unknown.length > 0) { if ((dstval->unknown.data = malloc((size_t)dstval->unknown.length)) == NULL) dstval->unknown.length = 0; else memcpy(dstval->unknown.data, srcval->unknown.data, (size_t)dstval->unknown.length); } } break; /* anti-compiler-warning-code */ } return (dstattr); } /* * 'ippCopyAttributes()' - Copy attributes from one IPP message to another. * * Zero or more attributes are copied from the source IPP message, @code src@, to the * destination IPP message, @code dst@. When @code quickcopy@ is non-zero, a "shallow" * reference copy of the attribute is created - this should only be done as long as the * original source IPP message will not be freed for the life of the destination. * * The @code cb@ and @code context@ parameters provide a generic way to "filter" the * attributes that are copied - the function must return 1 to copy the attribute or * 0 to skip it. The function may also choose to do a partial copy of the source attribute * itself. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on error */ ippCopyAttributes( ipp_t *dst, /* I - Destination IPP message */ ipp_t *src, /* I - Source IPP message */ int quickcopy, /* I - 1 for a referenced copy, 0 for normal */ ipp_copycb_t cb, /* I - Copy callback or @code NULL@ for none */ void *context) /* I - Context pointer */ { ipp_attribute_t *srcattr; /* Source attribute */ DEBUG_printf(("ippCopyAttributes(dst=%p, src=%p, quickcopy=%d, cb=%p, context=%p)", (void *)dst, (void *)src, quickcopy, (void *)cb, context)); /* * Range check input... */ if (!dst || !src) return (0); /* * Loop through source attributes and copy as needed... */ for (srcattr = src->attrs; srcattr; srcattr = srcattr->next) if (!cb || (*cb)(context, dst, srcattr)) if (!ippCopyAttribute(dst, srcattr, quickcopy)) return (0); return (1); } /* * 'ippDateToTime()' - Convert from RFC 2579 Date/Time format to time in * seconds. */ time_t /* O - UNIX time value */ ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */ { struct tm unixdate; /* UNIX date/time info */ time_t t; /* Computed time */ if (!date) return (0); memset(&unixdate, 0, sizeof(unixdate)); /* * RFC-2579 date/time format is: * * Byte(s) Description * ------- ----------- * 0-1 Year (0 to 65535) * 2 Month (1 to 12) * 3 Day (1 to 31) * 4 Hours (0 to 23) * 5 Minutes (0 to 59) * 6 Seconds (0 to 60, 60 = "leap second") * 7 Deciseconds (0 to 9) * 8 +/- UTC * 9 UTC hours (0 to 11) * 10 UTC minutes (0 to 59) */ unixdate.tm_year = ((date[0] << 8) | date[1]) - 1900; unixdate.tm_mon = date[2] - 1; unixdate.tm_mday = date[3]; unixdate.tm_hour = date[4]; unixdate.tm_min = date[5]; unixdate.tm_sec = date[6]; t = mktime(&unixdate); if (date[8] == '-') t += date[9] * 3600 + date[10] * 60; else t -= date[9] * 3600 + date[10] * 60; return (t); } /* * 'ippDelete()' - Delete an IPP message. */ void ippDelete(ipp_t *ipp) /* I - IPP message */ { ipp_attribute_t *attr, /* Current attribute */ *next; /* Next attribute */ DEBUG_printf(("ippDelete(ipp=%p)", (void *)ipp)); if (!ipp) return; ipp->use --; if (ipp->use > 0) { DEBUG_printf(("4debug_retain: %p IPP message (use=%d)", (void *)ipp, ipp->use)); return; } DEBUG_printf(("4debug_free: %p IPP message", (void *)ipp)); for (attr = ipp->attrs; attr != NULL; attr = next) { next = attr->next; DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values)); ipp_free_values(attr, 0, attr->num_values); if (attr->name) _cupsStrFree(attr->name); free(attr); } free(ipp); } /* * 'ippDeleteAttribute()' - Delete a single attribute in an IPP message. * * @since CUPS 1.1.19/macOS 10.3@ */ void ippDeleteAttribute( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t *attr) /* I - Attribute to delete */ { ipp_attribute_t *current, /* Current attribute */ *prev; /* Previous attribute */ DEBUG_printf(("ippDeleteAttribute(ipp=%p, attr=%p(%s))", (void *)ipp, (void *)attr, attr ? attr->name : "(null)")); /* * Range check input... */ if (!attr) return; DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values)); /* * Find the attribute in the list... */ if (ipp) { for (current = ipp->attrs, prev = NULL; current; prev = current, current = current->next) if (current == attr) { /* * Found it, remove the attribute from the list... */ if (prev) prev->next = current->next; else ipp->attrs = current->next; if (current == ipp->last) ipp->last = prev; break; } if (!current) return; } /* * Free memory used by the attribute... */ ipp_free_values(attr, 0, attr->num_values); if (attr->name) _cupsStrFree(attr->name); free(attr); } /* * 'ippDeleteValues()' - Delete values in an attribute. * * The @code element@ parameter specifies the first value to delete, starting at * 0. It must be less than the number of values returned by @link ippGetCount@. * * The @code attr@ parameter may be modified as a result of setting the value. * * Deleting all values in an attribute deletes the attribute. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippDeleteValues( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - Attribute */ int element, /* I - Index of first value to delete (0-based) */ int count) /* I - Number of values to delete */ { /* * Range check input... */ if (!ipp || !attr || !*attr || element < 0 || element >= (*attr)->num_values || count <= 0 || (element + count) >= (*attr)->num_values) return (0); /* * If we are deleting all values, just delete the attribute entirely. */ if (count == (*attr)->num_values) { ippDeleteAttribute(ipp, *attr); *attr = NULL; return (1); } /* * Otherwise free the values in question and return. */ ipp_free_values(*attr, element, count); return (1); } /* * 'ippFindAttribute()' - Find a named attribute in a request. * * Starting with CUPS 2.0, the attribute name can contain a hierarchical list * of attribute and member names separated by slashes, for example * "media-col/media-size". */ ipp_attribute_t * /* O - Matching attribute */ ippFindAttribute(ipp_t *ipp, /* I - IPP message */ const char *name, /* I - Name of attribute */ ipp_tag_t type) /* I - Type of attribute */ { DEBUG_printf(("2ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type))); if (!ipp || !name) return (NULL); /* * Reset the current pointer... */ ipp->current = NULL; ipp->atend = 0; /* * Search for the attribute... */ return (ippFindNextAttribute(ipp, name, type)); } /* * 'ippFindNextAttribute()' - Find the next named attribute in a request. * * Starting with CUPS 2.0, the attribute name can contain a hierarchical list * of attribute and member names separated by slashes, for example * "media-col/media-size". */ ipp_attribute_t * /* O - Matching attribute */ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */ const char *name, /* I - Name of attribute */ ipp_tag_t type) /* I - Type of attribute */ { ipp_attribute_t *attr, /* Current atttribute */ *childattr; /* Child attribute */ ipp_tag_t value_tag; /* Value tag */ char parent[1024], /* Parent attribute name */ *child = NULL; /* Child attribute name */ DEBUG_printf(("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type))); if (!ipp || !name) return (NULL); DEBUG_printf(("3ippFindNextAttribute: atend=%d", ipp->atend)); if (ipp->atend) return (NULL); if (strchr(name, '/')) { /* * Search for child attribute... */ strlcpy(parent, name, sizeof(parent)); if ((child = strchr(parent, '/')) == NULL) { DEBUG_puts("3ippFindNextAttribute: Attribute name too long."); return (NULL); } *child++ = '\0'; if (ipp->current && ipp->current->name && ipp->current->value_tag == IPP_TAG_BEGIN_COLLECTION && !strcmp(parent, ipp->current->name)) { while (ipp->curindex < ipp->current->num_values) { if ((childattr = ippFindNextAttribute(ipp->current->values[ipp->curindex].collection, child, type)) != NULL) return (childattr); ipp->curindex ++; if (ipp->curindex < ipp->current->num_values && ipp->current->values[ipp->curindex].collection) ipp->current->values[ipp->curindex].collection->current = NULL; } ipp->prev = ipp->current; ipp->current = ipp->current->next; ipp->curindex = 0; if (!ipp->current) { ipp->atend = 1; return (NULL); } } if (!ipp->current) { ipp->prev = NULL; ipp->current = ipp->attrs; ipp->curindex = 0; } name = parent; attr = ipp->current; } else if (ipp->current) { ipp->prev = ipp->current; attr = ipp->current->next; } else { ipp->prev = NULL; attr = ipp->attrs; } for (; attr != NULL; ipp->prev = attr, attr = attr->next) { DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", (void *)attr, attr->name)); value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK); if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 && (value_tag == type || type == IPP_TAG_ZERO || name == parent || (value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) || (value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME))) { ipp->current = attr; if (name == parent && attr->value_tag == IPP_TAG_BEGIN_COLLECTION) { int i; /* Looping var */ for (i = 0; i < attr->num_values; i ++) { if ((childattr = ippFindAttribute(attr->values[i].collection, child, type)) != NULL) { attr->values[0].collection->curindex = i; return (childattr); } } } else return (attr); } } ipp->current = NULL; ipp->prev = NULL; ipp->atend = 1; return (NULL); } /* * 'ippFirstAttribute()' - Return the first attribute in the message. * * @since CUPS 1.6/macOS 10.8@ */ ipp_attribute_t * /* O - First attribute or @code NULL@ if none */ ippFirstAttribute(ipp_t *ipp) /* I - IPP message */ { /* * Range check input... */ if (!ipp) return (NULL); /* * Return the first attribute... */ return (ipp->current = ipp->attrs); } /* * 'ippGetBoolean()' - Get a boolean value for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Boolean value or 0 on error */ ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */ int element) /* I - Value number (0-based) */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_BOOLEAN || element < 0 || element >= attr->num_values) return (0); /* * Return the value... */ return (attr->values[element].boolean); } /* * 'ippGetCollection()' - Get a collection value for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ ipp_t * /* O - Collection value or @code NULL@ on error */ ippGetCollection( ipp_attribute_t *attr, /* I - IPP attribute */ int element) /* I - Value number (0-based) */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_BEGIN_COLLECTION || element < 0 || element >= attr->num_values) return (NULL); /* * Return the value... */ return (attr->values[element].collection); } /* * 'ippGetCount()' - Get the number of values in an attribute. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Number of values or 0 on error */ ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */ { /* * Range check input... */ if (!attr) return (0); /* * Return the number of values... */ return (attr->num_values); } /* * 'ippGetDate()' - Get a dateTime value for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ const ipp_uchar_t * /* O - dateTime value or @code NULL@ */ ippGetDate(ipp_attribute_t *attr, /* I - IPP attribute */ int element) /* I - Value number (0-based) */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_DATE || element < 0 || element >= attr->num_values) return (NULL); /* * Return the value... */ return (attr->values[element].date); } /* * 'ippGetGroupTag()' - Get the group associated with an attribute. * * @since CUPS 1.6/macOS 10.8@ */ ipp_tag_t /* O - Group tag or @code IPP_TAG_ZERO@ on error */ ippGetGroupTag(ipp_attribute_t *attr) /* I - IPP attribute */ { /* * Range check input... */ if (!attr) return (IPP_TAG_ZERO); /* * Return the group... */ return (attr->group_tag); } /* * 'ippGetInteger()' - Get the integer/enum value for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Value or 0 on error */ ippGetInteger(ipp_attribute_t *attr, /* I - IPP attribute */ int element) /* I - Value number (0-based) */ { /* * Range check input... */ if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) || element < 0 || element >= attr->num_values) return (0); /* * Return the value... */ return (attr->values[element].integer); } /* * 'ippGetName()' - Get the attribute name. * * @since CUPS 1.6/macOS 10.8@ */ const char * /* O - Attribute name or @code NULL@ for separators */ ippGetName(ipp_attribute_t *attr) /* I - IPP attribute */ { /* * Range check input... */ if (!attr) return (NULL); /* * Return the name... */ return (attr->name); } /* * 'ippGetOctetString()' - Get an octetString value from an IPP attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.7/macOS 10.9@ */ void * /* O - Pointer to octetString data */ ippGetOctetString( ipp_attribute_t *attr, /* I - IPP attribute */ int element, /* I - Value number (0-based) */ int *datalen) /* O - Length of octetString data */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_STRING || element < 0 || element >= attr->num_values) { if (datalen) *datalen = 0; return (NULL); } /* * Return the values... */ if (datalen) *datalen = attr->values[element].unknown.length; return (attr->values[element].unknown.data); } /* * 'ippGetOperation()' - Get the operation ID in an IPP message. * * @since CUPS 1.6/macOS 10.8@ */ ipp_op_t /* O - Operation ID or 0 on error */ ippGetOperation(ipp_t *ipp) /* I - IPP request message */ { /* * Range check input... */ if (!ipp) return ((ipp_op_t)0); /* * Return the value... */ return (ipp->request.op.operation_id); } /* * 'ippGetRange()' - Get a rangeOfInteger value from an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Lower value of range or 0 */ ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */ int element, /* I - Value number (0-based) */ int *uppervalue)/* O - Upper value of range */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_RANGE || element < 0 || element >= attr->num_values) { if (uppervalue) *uppervalue = 0; return (0); } /* * Return the values... */ if (uppervalue) *uppervalue = attr->values[element].range.upper; return (attr->values[element].range.lower); } /* * 'ippGetRequestId()' - Get the request ID from an IPP message. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Request ID or 0 on error */ ippGetRequestId(ipp_t *ipp) /* I - IPP message */ { /* * Range check input... */ if (!ipp) return (0); /* * Return the request ID... */ return (ipp->request.any.request_id); } /* * 'ippGetResolution()' - Get a resolution value for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Horizontal/cross feed resolution or 0 */ ippGetResolution( ipp_attribute_t *attr, /* I - IPP attribute */ int element, /* I - Value number (0-based) */ int *yres, /* O - Vertical/feed resolution */ ipp_res_t *units) /* O - Units for resolution */ { /* * Range check input... */ if (!attr || attr->value_tag != IPP_TAG_RESOLUTION || element < 0 || element >= attr->num_values) { if (yres) *yres = 0; if (units) *units = (ipp_res_t)0; return (0); } /* * Return the value... */ if (yres) *yres = attr->values[element].resolution.yres; if (units) *units = attr->values[element].resolution.units; return (attr->values[element].resolution.xres); } /* * 'ippGetState()' - Get the IPP message state. * * @since CUPS 1.6/macOS 10.8@ */ ipp_state_t /* O - IPP message state value */ ippGetState(ipp_t *ipp) /* I - IPP message */ { /* * Range check input... */ if (!ipp) return (IPP_STATE_IDLE); /* * Return the value... */ return (ipp->state); } /* * 'ippGetStatusCode()' - Get the status code from an IPP response or event message. * * @since CUPS 1.6/macOS 10.8@ */ ipp_status_t /* O - Status code in IPP message */ ippGetStatusCode(ipp_t *ipp) /* I - IPP response or event message */ { /* * Range check input... */ if (!ipp) return (IPP_STATUS_ERROR_INTERNAL); /* * Return the value... */ return (ipp->request.status.status_code); } /* * 'ippGetString()' - Get the string and optionally the language code for an attribute. * * The @code element@ parameter specifies which value to get from 0 to * @code ippGetCount(attr)@ - 1. * * @since CUPS 1.6/macOS 10.8@ */ const char * ippGetString(ipp_attribute_t *attr, /* I - IPP attribute */ int element, /* I - Value number (0-based) */ const char **language)/* O - Language code (@code NULL@ for don't care) */ { ipp_tag_t tag; /* Value tag */ /* * Range check input... */ tag = ippGetValueTag(attr); if (!attr || element < 0 || element >= attr->num_values || (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE))) return (NULL); /* * Return the value... */ if (language) *language = attr->values[element].string.language; return (attr->values[element].string.text); } /* * 'ippGetValueTag()' - Get the value tag for an attribute. * * @since CUPS 1.6/macOS 10.8@ */ ipp_tag_t /* O - Value tag or @code IPP_TAG_ZERO@ on error */ ippGetValueTag(ipp_attribute_t *attr) /* I - IPP attribute */ { /* * Range check input... */ if (!attr) return (IPP_TAG_ZERO); /* * Return the value... */ return (attr->value_tag & IPP_TAG_CUPS_MASK); } /* * 'ippGetVersion()' - Get the major and minor version number from an IPP message. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - Major version number or 0 on error */ ippGetVersion(ipp_t *ipp, /* I - IPP message */ int *minor) /* O - Minor version number or @code NULL@ for don't care */ { /* * Range check input... */ if (!ipp) { if (minor) *minor = 0; return (0); } /* * Return the value... */ if (minor) *minor = ipp->request.any.version[1]; return (ipp->request.any.version[0]); } /* * 'ippLength()' - Compute the length of an IPP message. */ size_t /* O - Size of IPP message */ ippLength(ipp_t *ipp) /* I - IPP message */ { return (ipp_length(ipp, 0)); } /* * 'ippNextAttribute()' - Return the next attribute in the message. * * @since CUPS 1.6/macOS 10.8@ */ ipp_attribute_t * /* O - Next attribute or @code NULL@ if none */ ippNextAttribute(ipp_t *ipp) /* I - IPP message */ { /* * Range check input... */ if (!ipp || !ipp->current) return (NULL); /* * Return the next attribute... */ return (ipp->current = ipp->current->next); } /* * 'ippNew()' - Allocate a new IPP message. */ ipp_t * /* O - New IPP message */ ippNew(void) { ipp_t *temp; /* New IPP message */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ DEBUG_puts("ippNew()"); if ((temp = (ipp_t *)calloc(1, sizeof(ipp_t))) != NULL) { /* * Set default version - usually 2.0... */ DEBUG_printf(("4debug_alloc: %p IPP message", (void *)temp)); if (cg->server_version == 0) _cupsSetDefaults(); temp->request.any.version[0] = (ipp_uchar_t)(cg->server_version / 10); temp->request.any.version[1] = (ipp_uchar_t)(cg->server_version % 10); temp->use = 1; } DEBUG_printf(("1ippNew: Returning %p", (void *)temp)); return (temp); } /* * 'ippNewRequest()' - Allocate a new IPP request message. * * The new request message is initialized with the "attributes-charset" and * "attributes-natural-language" attributes added. The * "attributes-natural-language" value is derived from the current locale. * * @since CUPS 1.2/macOS 10.5@ */ ipp_t * /* O - IPP request message */ ippNewRequest(ipp_op_t op) /* I - Operation code */ { ipp_t *request; /* IPP request message */ cups_lang_t *language; /* Current language localization */ static int request_id = 0; /* Current request ID */ static _cups_mutex_t request_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex for request ID */ DEBUG_printf(("ippNewRequest(op=%02x(%s))", op, ippOpString(op))); /* * Create a new IPP message... */ if ((request = ippNew()) == NULL) return (NULL); /* * Set the operation and request ID... */ _cupsMutexLock(&request_mutex); request->request.op.operation_id = op; request->request.op.request_id = ++request_id; _cupsMutexUnlock(&request_mutex); /* * Use UTF-8 as the character set... */ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8"); /* * Get the language from the current locale... */ language = cupsLangDefault(); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, language->language); /* * Return the new request... */ return (request); } /* * 'ippNewResponse()' - Allocate a new IPP response message. * * The new response message is initialized with the same "version-number", * "request-id", "attributes-charset", and "attributes-natural-language" as the * provided request message. If the "attributes-charset" or * "attributes-natural-language" attributes are missing from the request, * 'utf-8' and a value derived from the current locale are substituted, * respectively. * * @since CUPS 1.7/macOS 10.9@ */ ipp_t * /* O - IPP response message */ ippNewResponse(ipp_t *request) /* I - IPP request message */ { ipp_t *response; /* IPP response message */ ipp_attribute_t *attr; /* Current attribute */ /* * Range check input... */ if (!request) return (NULL); /* * Create a new IPP message... */ if ((response = ippNew()) == NULL) return (NULL); /* * Copy the request values over to the response... */ response->request.status.version[0] = request->request.op.version[0]; response->request.status.version[1] = request->request.op.version[1]; response->request.status.request_id = request->request.op.request_id; /* * The first attribute MUST be attributes-charset... */ attr = request->attrs; if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && attr->group_tag == IPP_TAG_OPERATION && attr->value_tag == IPP_TAG_CHARSET && attr->num_values == 1) { /* * Copy charset from request... */ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, attr->values[0].string.text); } else { /* * Use "utf-8" as the default... */ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8"); } /* * Then attributes-natural-language... */ if (attr) attr = attr->next; if (attr && attr->name && !strcmp(attr->name, "attributes-natural-language") && attr->group_tag == IPP_TAG_OPERATION && attr->value_tag == IPP_TAG_LANGUAGE && attr->num_values == 1) { /* * Copy language from request... */ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, attr->values[0].string.text); } else { /* * Use the language from the current locale... */ cups_lang_t *language = cupsLangDefault(); /* Current locale */ ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, language->language); } return (response); } /* * 'ippRead()' - Read data for an IPP message from a HTTP connection. */ ipp_state_t /* O - Current state */ ippRead(http_t *http, /* I - HTTP connection */ ipp_t *ipp) /* I - IPP data */ { DEBUG_printf(("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT, (void *)http, (void *)ipp, CUPS_LLCAST (http ? http->data_remaining : -1))); if (!http) return (IPP_STATE_ERROR); DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state, http->used)); return (ippReadIO(http, (ipp_iocb_t)ipp_read_http, http->blocking, NULL, ipp)); } /* * 'ippReadFile()' - Read data for an IPP message from a file. * * @since CUPS 1.1.19/macOS 10.3@ */ ipp_state_t /* O - Current state */ ippReadFile(int fd, /* I - HTTP data */ ipp_t *ipp) /* I - IPP data */ { DEBUG_printf(("ippReadFile(fd=%d, ipp=%p)", fd, (void *)ipp)); return (ippReadIO(&fd, (ipp_iocb_t)ipp_read_file, 1, NULL, ipp)); } /* * 'ippReadIO()' - Read data for an IPP message. * * @since CUPS 1.2/macOS 10.5@ */ ipp_state_t /* O - Current state */ ippReadIO(void *src, /* I - Data source */ ipp_iocb_t cb, /* I - Read callback function */ int blocking, /* I - Use blocking IO? */ ipp_t *parent, /* I - Parent request, if any */ ipp_t *ipp) /* I - IPP data */ { int n; /* Length of data */ unsigned char *buffer, /* Data buffer */ string[IPP_MAX_TEXT], /* Small string buffer */ *bufptr; /* Pointer into buffer */ ipp_attribute_t *attr; /* Current attribute */ ipp_tag_t tag; /* Current tag */ ipp_tag_t value_tag; /* Current value tag */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)src, (void *)cb, blocking, (void *)parent, (void *)ipp)); DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_STATE_ERROR)); if (!src || !ipp) return (IPP_STATE_ERROR); if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL) { DEBUG_puts("1ippReadIO: Unable to get read buffer."); return (IPP_STATE_ERROR); } switch (ipp->state) { case IPP_STATE_IDLE : ipp->state ++; /* Avoid common problem... */ case IPP_STATE_HEADER : if (parent == NULL) { /* * Get the request header... */ if ((*cb)(src, buffer, 8) < 8) { DEBUG_puts("1ippReadIO: Unable to read header."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } /* * Then copy the request header over... */ ipp->request.any.version[0] = buffer[0]; ipp->request.any.version[1] = buffer[1]; ipp->request.any.op_status = (buffer[2] << 8) | buffer[3]; ipp->request.any.request_id = (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) | buffer[7]; DEBUG_printf(("2ippReadIO: version=%d.%d", buffer[0], buffer[1])); DEBUG_printf(("2ippReadIO: op_status=%04x", ipp->request.any.op_status)); DEBUG_printf(("2ippReadIO: request_id=%d", ipp->request.any.request_id)); } ipp->state = IPP_STATE_ATTRIBUTE; ipp->current = NULL; ipp->curtag = IPP_TAG_ZERO; ipp->prev = ipp->last; /* * If blocking is disabled, stop here... */ if (!blocking) break; case IPP_STATE_ATTRIBUTE : for (;;) { if ((*cb)(src, buffer, 1) < 1) { DEBUG_puts("1ippReadIO: Callback returned EOF/error"); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev)); /* * Read this attribute... */ tag = (ipp_tag_t)buffer[0]; if (tag == IPP_TAG_EXTENSION) { /* * Read 32-bit "extension" tag... */ if ((*cb)(src, buffer, 4) < 1) { DEBUG_puts("1ippReadIO: Callback returned EOF/error"); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | buffer[3]); if (tag & IPP_TAG_CUPS_CONST) { /* * Fail if the high bit is set in the tag... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP extension tag larger than 0x7FFFFFFF."), 1); DEBUG_printf(("1ippReadIO: bad tag 0x%x.", tag)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } if (tag == IPP_TAG_END) { /* * No more attributes left... */ DEBUG_puts("2ippReadIO: IPP_TAG_END."); ipp->state = IPP_STATE_DATA; break; } else if (tag == IPP_TAG_ZERO || (tag == IPP_TAG_OPERATION && ipp->curtag != IPP_TAG_ZERO)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1); DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } else if (tag < IPP_TAG_UNSUPPORTED_VALUE) { /* * Group tag... Set the current group and continue... */ if (ipp->curtag == tag) ipp->prev = ippAddSeparator(ipp); else if (ipp->current) ipp->prev = ipp->current; ipp->curtag = tag; ipp->current = NULL; DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag, ippTagString(tag), (void *)ipp->prev)); continue; } DEBUG_printf(("2ippReadIO: value tag=%x(%s)", tag, ippTagString(tag))); /* * Get the name... */ if ((*cb)(src, buffer, 2) < 2) { DEBUG_puts("1ippReadIO: unable to read name length."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } n = (buffer[0] << 8) | buffer[1]; if (n >= IPP_BUF_SIZE) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP name larger than 32767 bytes."), 1); DEBUG_printf(("1ippReadIO: bad name length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippReadIO: name length=%d", n)); 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... */ if (ipp->current == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute has no name."), 1); DEBUG_puts("1ippReadIO: Attribute without name and no current."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } attr = ipp->current; value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK); /* * Make sure we aren't adding a new value of a different * type... */ if (value_tag == IPP_TAG_ZERO) { /* * Setting the value of a collection member... */ attr->value_tag = tag; } else if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG || (value_tag >= IPP_TAG_TEXT && value_tag <= IPP_TAG_MIMETYPE)) { /* * String values can sometimes come across in different * forms; accept sets of differing values... */ if (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) && tag != IPP_TAG_NOVALUE) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value " "tags."), 1); DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if (value_tag != tag) { DEBUG_printf(("1ippReadIO: Converting %s attribute from %s to %s.", attr->name, ippTagString(value_tag), ippTagString(tag))); ippSetValueTag(ipp, &attr, tag); } } else if (value_tag == IPP_TAG_INTEGER || value_tag == IPP_TAG_RANGE) { /* * Integer and rangeOfInteger values can sometimes be mixed; accept * sets of differing values... */ if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value " "tags."), 1); DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE) { /* * Convert integer values to rangeOfInteger values... */ DEBUG_printf(("1ippReadIO: Converting %s attribute to " "rangeOfInteger.", attr->name)); ippSetValueTag(ipp, &attr, IPP_TAG_RANGE); } } else if (value_tag != tag) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value " "tags."), 1); DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } /* * Finally, reallocate the attribute array as needed... */ if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL) { _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } else if (tag == IPP_TAG_MEMBERNAME) { /* * Name must be length 0! */ if (n) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1); DEBUG_puts("1ippReadIO: member name not empty."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if (ipp->current) ipp->prev = ipp->current; attr = ipp->current = ipp_add_attr(ipp, NULL, ipp->curtag, IPP_TAG_ZERO, 1); if (!attr) { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: unable to allocate attribute."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev)); value = attr->values; } else if (tag != IPP_TAG_END_COLLECTION) { /* * New attribute; read the name and add it... */ if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: unable to read name."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } buffer[n] = '\0'; if (ipp->current) ipp->prev = ipp->current; if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag, 1)) == NULL) { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: unable to allocate attribute."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, ipp->prev=%p", buffer, (void *)ipp->current, (void *)ipp->prev)); value = attr->values; } else { attr = NULL; value = NULL; } if ((*cb)(src, buffer, 2) < 2) { DEBUG_puts("1ippReadIO: unable to read value length."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } n = (buffer[0] << 8) | buffer[1]; DEBUG_printf(("2ippReadIO: value length=%d", n)); if (n >= IPP_BUF_SIZE) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP value larger than 32767 bytes."), 1); DEBUG_printf(("1ippReadIO: bad value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } switch (tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : if (n != 4) { if (tag == IPP_TAG_INTEGER) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP integer value not 4 bytes."), 1); else _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP enum value not 4 bytes."), 1); DEBUG_printf(("1ippReadIO: bad integer value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, buffer, 4) < 4) { DEBUG_puts("1ippReadIO: Unable to read integer value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | buffer[3]; if (attr->value_tag == IPP_TAG_RANGE) value->range.lower = value->range.upper = n; else value->integer = n; break; case IPP_TAG_BOOLEAN : if (n != 1) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."), 1); DEBUG_printf(("1ippReadIO: bad boolean value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, buffer, 1) < 1) { DEBUG_puts("1ippReadIO: Unable to read boolean value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } value->boolean = (char)buffer[0]; break; case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : /* * These value types are not supposed to have values, however * some vendors (Brother) do not implement IPP correctly and so * we need to map non-empty values to text... */ if (attr->value_tag == tag) { if (n == 0) break; attr->value_tag = IPP_TAG_TEXT; } case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_RESERVED_STRING : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : if (n > 0) { if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: unable to read string value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } buffer[n] = '\0'; value->string.text = _cupsStrAlloc((char *)buffer); DEBUG_printf(("2ippReadIO: value=\"%s\"", value->string.text)); break; case IPP_TAG_DATE : if (n != 11) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP date value not 11 bytes."), 1); DEBUG_printf(("1ippReadIO: bad date value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, value->date, 11) < 11) { DEBUG_puts("1ippReadIO: Unable to read date value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } break; case IPP_TAG_RESOLUTION : if (n != 9) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP resolution value not 9 bytes."), 1); DEBUG_printf(("1ippReadIO: bad resolution value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, buffer, 9) < 9) { DEBUG_puts("1ippReadIO: Unable to read resolution value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } value->resolution.xres = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | buffer[3]; value->resolution.yres = (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) | buffer[7]; value->resolution.units = (ipp_res_t)buffer[8]; break; case IPP_TAG_RANGE : if (n != 8) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP rangeOfInteger value not 8 bytes."), 1); DEBUG_printf(("1ippReadIO: bad rangeOfInteger value length " "%d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, buffer, 8) < 8) { DEBUG_puts("1ippReadIO: Unable to read range value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } value->range.lower = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | buffer[3]; value->range.upper = (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) | buffer[7]; break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : if (n < 4) { if (tag == IPP_TAG_TEXTLANG) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP textWithLanguage value less than " "minimum 4 bytes."), 1); else _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP nameWithLanguage value less than " "minimum 4 bytes."), 1); DEBUG_printf(("1ippReadIO: bad stringWithLanguage value " "length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read string w/language " "value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; /* * text-with-language and name-with-language are composite * values: * * language-length * language * text-length * text */ n = (bufptr[0] << 8) | bufptr[1]; if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || n >= (int)sizeof(string)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP language length overflows value."), 1); DEBUG_printf(("1ippReadIO: bad language value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } else if (n >= IPP_MAX_LANGUAGE) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP language length too large."), 1); DEBUG_printf(("1ippReadIO: bad language value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } memcpy(string, bufptr + 2, (size_t)n); string[n] = '\0'; value->string.language = _cupsStrAlloc((char *)string); bufptr += 2 + n; n = (bufptr[0] << 8) | bufptr[1]; if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP string length overflows value."), 1); DEBUG_printf(("1ippReadIO: bad string value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr[2 + n] = '\0'; value->string.text = _cupsStrAlloc((char *)bufptr + 2); break; case IPP_TAG_BEGIN_COLLECTION : /* * Oh, boy, here comes a collection value, so read it... */ value->collection = ippNew(); if (n > 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP begCollection value not 0 bytes."), 1); DEBUG_puts("1ippReadIO: begCollection tag with value length " "> 0."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_STATE_ERROR) { DEBUG_puts("1ippReadIO: Unable to read collection value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } break; case IPP_TAG_END_COLLECTION : _cupsBufferRelease((char *)buffer); if (n > 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP endCollection value not 0 bytes."), 1); DEBUG_puts("1ippReadIO: endCollection tag with value length " "> 0."); return (IPP_STATE_ERROR); } DEBUG_puts("1ippReadIO: endCollection tag..."); return (ipp->state = IPP_STATE_DATA); case IPP_TAG_MEMBERNAME : /* * The value the name of the member in the collection, which * we need to carry over... */ if (!attr) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName with no attribute."), 1); DEBUG_puts("1ippReadIO: Member name without attribute."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } else if (n == 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName value is empty."), 1); DEBUG_puts("1ippReadIO: Empty member name value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } else if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read member name value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } buffer[n] = '\0'; attr->name = _cupsStrAlloc((char *)buffer); /* * Since collection members are encoded differently than * regular attributes, make sure we don't start with an * empty value... */ attr->num_values --; DEBUG_printf(("2ippReadIO: member name=\"%s\"", attr->name)); break; case IPP_TAG_STRING : default : /* Other unsupported values */ if (tag == IPP_TAG_STRING && n > IPP_MAX_LENGTH) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP octetString length too large."), 1); DEBUG_printf(("1ippReadIO: bad octetString value length %d.", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } value->unknown.length = n; if (n > 0) { if ((value->unknown.data = malloc((size_t)n)) == NULL) { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: Unable to allocate value"); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((*cb)(src, value->unknown.data, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read unsupported value."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } else value->unknown.data = NULL; break; } /* * If blocking is disabled, stop here... */ if (!blocking) break; } break; case IPP_STATE_DATA : break; default : break; /* anti-compiler-warning-code */ } DEBUG_printf(("1ippReadIO: returning ipp->state=%d.", ipp->state)); _cupsBufferRelease((char *)buffer); return (ipp->state); } /* * 'ippSetBoolean()' - Set a boolean value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetBoolean(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ int boolvalue)/* I - Boolean value */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BOOLEAN || element < 0 || element > (*attr)->num_values) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) value->boolean = (char)boolvalue; return (value != NULL); } /* * 'ippSetCollection()' - Set a collection value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetCollection( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ ipp_t *colvalue) /* I - Collection value */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BEGIN_COLLECTION || element < 0 || element > (*attr)->num_values || !colvalue) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if (value->collection) ippDelete(value->collection); value->collection = colvalue; colvalue->use ++; } return (value != NULL); } /* * 'ippSetDate()' - Set a dateTime value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetDate(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ const ipp_uchar_t *datevalue)/* I - dateTime value */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_DATE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || !datevalue) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) memcpy(value->date, datevalue, sizeof(value->date)); return (value != NULL); } /* * 'ippSetGroupTag()' - Set the group tag of an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code group@ parameter specifies the IPP attribute group tag: none * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetGroupTag( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - Attribute */ ipp_tag_t group_tag) /* I - Group tag */ { /* * Range check input - group tag must be 0x01 to 0x0F, per RFC 8011... */ if (!ipp || !attr || !*attr || group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END || group_tag >= IPP_TAG_UNSUPPORTED_VALUE) return (0); /* * Set the group tag and return... */ (*attr)->group_tag = group_tag; return (1); } /* * 'ippSetInteger()' - Set an integer or enum value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetInteger(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ int intvalue) /* I - Integer/enum value */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_INTEGER && (*attr)->value_tag != IPP_TAG_ENUM && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if ((*attr)->value_tag != IPP_TAG_ENUM) (*attr)->value_tag = IPP_TAG_INTEGER; value->integer = intvalue; } return (value != NULL); } /* * 'ippSetName()' - Set the name of an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetName(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ const char *name) /* I - Attribute name */ { char *temp; /* Temporary name value */ /* * Range check input... */ if (!ipp || !attr || !*attr) return (0); /* * Set the value and return... */ if ((temp = _cupsStrAlloc(name)) != NULL) { if ((*attr)->name) _cupsStrFree((*attr)->name); (*attr)->name = temp; } return (temp != NULL); } /* * 'ippSetOctetString()' - Set an octetString value in an IPP attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ ippSetOctetString( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ const void *data, /* I - Pointer to octetString data */ int datalen) /* I - Length of octetString data */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_STRING && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || datalen < 0 || datalen > IPP_MAX_LENGTH) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST) { /* * Just copy the pointer... */ value->unknown.data = (void *)data; value->unknown.length = datalen; } else { /* * Copy the data... */ (*attr)->value_tag = IPP_TAG_STRING; if (value->unknown.data) { /* * Free previous data... */ free(value->unknown.data); value->unknown.data = NULL; value->unknown.length = 0; } if (datalen > 0) { void *temp; /* Temporary data pointer */ if ((temp = malloc((size_t)datalen)) != NULL) { memcpy(temp, data, (size_t)datalen); value->unknown.data = temp; value->unknown.length = datalen; } else return (0); } } } return (value != NULL); } /* * 'ippSetOperation()' - Set the operation ID in an IPP request message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetOperation(ipp_t *ipp, /* I - IPP request message */ ipp_op_t op) /* I - Operation ID */ { /* * Range check input... */ if (!ipp) return (0); /* * Set the operation and return... */ ipp->request.op.operation_id = op; return (1); } /* * 'ippSetRange()' - Set a rangeOfInteger value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetRange(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ int lowervalue, /* I - Lower bound for range */ int uppervalue) /* I - Upper bound for range */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RANGE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || lowervalue > uppervalue) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { (*attr)->value_tag = IPP_TAG_RANGE; value->range.lower = lowervalue; value->range.upper = uppervalue; } return (value != NULL); } /* * 'ippSetRequestId()' - Set the request ID in an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code request_id@ parameter must be greater than 0. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetRequestId(ipp_t *ipp, /* I - IPP message */ int request_id) /* I - Request ID */ { /* * Range check input; not checking request_id values since ipptool wants to send * invalid values for conformance testing and a bad request_id does not affect the * encoding of a message... */ if (!ipp) return (0); /* * Set the request ID and return... */ ipp->request.any.request_id = request_id; return (1); } /* * 'ippSetResolution()' - Set a resolution value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetResolution( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ ipp_res_t unitsvalue, /* I - Resolution units */ int xresvalue, /* I - Horizontal/cross feed resolution */ int yresvalue) /* I - Vertical/feed resolution */ { _ipp_value_t *value; /* Current value */ /* * Range check input... */ if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RESOLUTION && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || xresvalue <= 0 || yresvalue <= 0 || unitsvalue < IPP_RES_PER_INCH || unitsvalue > IPP_RES_PER_CM) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { (*attr)->value_tag = IPP_TAG_RESOLUTION; value->resolution.units = unitsvalue; value->resolution.xres = xresvalue; value->resolution.yres = yresvalue; } return (value != NULL); } /* * 'ippSetState()' - Set the current state of the IPP message. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetState(ipp_t *ipp, /* I - IPP message */ ipp_state_t state) /* I - IPP state value */ { /* * Range check input... */ if (!ipp) return (0); /* * Set the state and return... */ ipp->state = state; ipp->current = NULL; return (1); } /* * 'ippSetStatusCode()' - Set the status code in an IPP response or event message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetStatusCode(ipp_t *ipp, /* I - IPP response or event message */ ipp_status_t status) /* I - Status code */ { /* * Range check input... */ if (!ipp) return (0); /* * Set the status code and return... */ ipp->request.status.status_code = status; return (1); } /* * 'ippSetString()' - Set a string value in an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetString(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ const char *strvalue) /* I - String value */ { char *temp; /* Temporary string */ _ipp_value_t *value; /* Current value */ ipp_tag_t value_tag; /* Value tag */ /* * Range check input... */ if (attr && *attr) value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK; else value_tag = IPP_TAG_ZERO; if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || element < 0 || element > (*attr)->num_values || !strvalue) return (0); /* * Set the value and return... */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if (value_tag == IPP_TAG_NOVALUE || value_tag == IPP_TAG_UNKNOWN) (*attr)->value_tag = IPP_TAG_KEYWORD; if (element > 0) value->string.language = (*attr)->values[0].string.language; if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST) value->string.text = (char *)strvalue; else if ((temp = _cupsStrAlloc(strvalue)) != NULL) { if (value->string.text) _cupsStrFree(value->string.text); value->string.text = temp; } else return (0); } return (value != NULL); } /* * 'ippSetStringf()' - Set a formatted string value of an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * The @code format@ parameter uses formatting characters compatible with the * printf family of standard functions. Additional arguments follow it as * needed. The formatted string is truncated as needed to the maximum length of * the corresponding value type. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ ippSetStringf(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ const char *format, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { int ret; /* Return value */ va_list ap; /* Pointer to additional arguments */ va_start(ap, format); ret = ippSetStringfv(ipp, attr, element, format, ap); va_end(ap); return (ret); } /* * 'ippSetStringf()' - Set a formatted string value of an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * The @code element@ parameter specifies which value to set from 0 to * @code ippGetCount(attr)@. * * The @code format@ parameter uses formatting characters compatible with the * printf family of standard functions. Additional arguments follow it as * needed. The formatted string is truncated as needed to the maximum length of * the corresponding value type. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element, /* I - Value number (0-based) */ const char *format, /* I - Printf-style format string */ va_list ap) /* I - Pointer to additional arguments */ { ipp_tag_t value_tag; /* Value tag */ char buffer[IPP_MAX_TEXT + 4]; /* Formatted text string */ ssize_t bytes, /* Length of formatted value */ max_bytes; /* Maximum number of bytes for value */ /* * Range check input... */ if (attr && *attr) value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK; else value_tag = IPP_TAG_ZERO; if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || !format) return (0); /* * Format the string... */ if (!strcmp(format, "%s")) { /* * Optimize the simple case... */ const char *s = va_arg(ap, char *); if (!s) s = "(null)"; bytes = (ssize_t)strlen(s); strlcpy(buffer, s, sizeof(buffer)); } else { /* * Do a full formatting of the message... */ if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0) return (0); } /* * Limit the length of the string... */ switch (value_tag) { default : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : max_bytes = IPP_MAX_TEXT; break; case IPP_TAG_NAME : case IPP_TAG_NAMELANG : max_bytes = IPP_MAX_NAME; break; case IPP_TAG_CHARSET : max_bytes = IPP_MAX_CHARSET; break; case IPP_TAG_NOVALUE : case IPP_TAG_UNKNOWN : case IPP_TAG_KEYWORD : max_bytes = IPP_MAX_KEYWORD; break; case IPP_TAG_LANGUAGE : max_bytes = IPP_MAX_LANGUAGE; break; case IPP_TAG_MIMETYPE : max_bytes = IPP_MAX_MIMETYPE; break; case IPP_TAG_URI : max_bytes = IPP_MAX_URI; break; case IPP_TAG_URISCHEME : max_bytes = IPP_MAX_URISCHEME; break; } if (bytes >= max_bytes) { char *bufmax, /* Buffer at max_bytes */ *bufptr; /* Pointer into buffer */ bufptr = buffer + strlen(buffer) - 1; bufmax = buffer + max_bytes - 1; while (bufptr > bufmax) { if (*bufptr & 0x80) { while ((*bufptr & 0xc0) == 0x80 && bufptr > buffer) bufptr --; } bufptr --; } *bufptr = '\0'; } /* * Set the formatted string and return... */ return (ippSetString(ipp, attr, element, buffer)); } /* * 'ippSetValueTag()' - Set the value tag of an attribute. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The @code attr@ parameter may be modified as a result of setting the value. * * Integer (@code IPP_TAG_INTEGER@) values can be promoted to rangeOfInteger * (@code IPP_TAG_RANGE@) values, the various string tags can be promoted to name * (@code IPP_TAG_NAME@) or nameWithLanguage (@code IPP_TAG_NAMELANG@) values, text * (@code IPP_TAG_TEXT@) values can be promoted to textWithLanguage * (@code IPP_TAG_TEXTLANG@) values, and all values can be demoted to the various * out-of-band value tags such as no-value (@code IPP_TAG_NOVALUE@). All other changes * will be rejected. * * Promoting a string attribute to nameWithLanguage or textWithLanguage adds the language * code in the "attributes-natural-language" attribute or, if not present, the language * code for the current locale. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetValueTag( ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ ipp_tag_t value_tag) /* I - Value tag */ { int i; /* Looping var */ _ipp_value_t *value; /* Current value */ int integer; /* Current integer value */ cups_lang_t *language; /* Current language */ char code[32]; /* Language code */ ipp_tag_t temp_tag; /* Temporary value tag */ /* * Range check input... */ if (!ipp || !attr || !*attr) return (0); /* * If there is no change, return immediately... */ if (value_tag == (*attr)->value_tag) return (1); /* * Otherwise implement changes as needed... */ temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_CUPS_MASK); switch (value_tag) { case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : /* * Free any existing values... */ if ((*attr)->num_values > 0) ipp_free_values(*attr, 0, (*attr)->num_values); /* * Set out-of-band value... */ (*attr)->value_tag = value_tag; break; case IPP_TAG_RANGE : if (temp_tag != IPP_TAG_INTEGER) return (0); for (i = (*attr)->num_values, value = (*attr)->values; i > 0; i --, value ++) { integer = value->integer; value->range.lower = value->range.upper = integer; } (*attr)->value_tag = IPP_TAG_RANGE; break; case IPP_TAG_NAME : if (temp_tag != IPP_TAG_KEYWORD) return (0); (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST)); break; case IPP_TAG_NAMELANG : case IPP_TAG_TEXTLANG : 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) return (0); if (ipp->attrs && ipp->attrs->next && ipp->attrs->next->name && !strcmp(ipp->attrs->next->name, "attributes-natural-language") && (ipp->attrs->next->value_tag & IPP_TAG_CUPS_MASK) == IPP_TAG_LANGUAGE) { /* * Use the language code from the IPP message... */ (*attr)->values[0].string.language = _cupsStrAlloc(ipp->attrs->next->values[0].string.text); } else { /* * Otherwise, use the language code corresponding to the locale... */ language = cupsLangDefault(); (*attr)->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language->language, code, sizeof(code))); } for (i = (*attr)->num_values - 1, value = (*attr)->values + 1; i > 0; i --, value ++) value->string.language = (*attr)->values[0].string.language; if ((int)(*attr)->value_tag & IPP_TAG_CUPS_CONST) { /* * Make copies of all values... */ for (i = (*attr)->num_values, value = (*attr)->values; i > 0; i --, value ++) value->string.text = _cupsStrAlloc(value->string.text); } (*attr)->value_tag = IPP_TAG_NAMELANG; break; case IPP_TAG_KEYWORD : if (temp_tag == IPP_TAG_NAME || temp_tag == IPP_TAG_NAMELANG) break; /* Silently "allow" name -> keyword */ default : return (0); } return (1); } /* * 'ippSetVersion()' - Set the version number in an IPP message. * * The @code ipp@ parameter refers to an IPP message previously created using * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. * * The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ ippSetVersion(ipp_t *ipp, /* I - IPP message */ int major, /* I - Major version number (major.minor) */ int minor) /* I - Minor version number (major.minor) */ { /* * Range check input... */ if (!ipp || major < 0 || minor < 0) return (0); /* * Set the version number... */ ipp->request.any.version[0] = (ipp_uchar_t)major; ipp->request.any.version[1] = (ipp_uchar_t)minor; return (1); } /* * 'ippTimeToDate()' - Convert from time in seconds to RFC 2579 format. */ const ipp_uchar_t * /* O - RFC-2579 date/time data */ ippTimeToDate(time_t t) /* I - Time in seconds */ { struct tm unixdate; /* UNIX unixdate/time info */ ipp_uchar_t *date = _cupsGlobals()->ipp_date; /* RFC-2579 date/time data */ /* * RFC-2579 date/time format is: * * Byte(s) Description * ------- ----------- * 0-1 Year (0 to 65535) * 2 Month (1 to 12) * 3 Day (1 to 31) * 4 Hours (0 to 23) * 5 Minutes (0 to 59) * 6 Seconds (0 to 60, 60 = "leap second") * 7 Deciseconds (0 to 9) * 8 +/- UTC * 9 UTC hours (0 to 11) * 10 UTC minutes (0 to 59) */ gmtime_r(&t, &unixdate); unixdate.tm_year += 1900; date[0] = (ipp_uchar_t)(unixdate.tm_year >> 8); date[1] = (ipp_uchar_t)(unixdate.tm_year); date[2] = (ipp_uchar_t)(unixdate.tm_mon + 1); date[3] = (ipp_uchar_t)unixdate.tm_mday; date[4] = (ipp_uchar_t)unixdate.tm_hour; date[5] = (ipp_uchar_t)unixdate.tm_min; date[6] = (ipp_uchar_t)unixdate.tm_sec; date[7] = 0; date[8] = '+'; date[9] = 0; date[10] = 0; return (date); } /* * 'ippValidateAttribute()' - Validate the contents of an attribute. * * This function validates the contents of an attribute based on the name and * value tag. 1 is returned if the attribute is valid, 0 otherwise. On * failure, @link cupsLastErrorString@ is set to a human-readable message. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 if valid, 0 otherwise */ ippValidateAttribute( ipp_attribute_t *attr) /* I - Attribute */ { int i; /* Looping var */ char scheme[64], /* Scheme from URI */ userpass[256], /* Username/password from URI */ hostname[256], /* Hostname from URI */ resource[1024]; /* Resource from URI */ int port, /* Port number from URI */ uri_status; /* URI separation status */ const char *ptr; /* Pointer into string */ ipp_attribute_t *colattr; /* Collection attribute */ regex_t re; /* Regular expression */ ipp_uchar_t *date; /* Current date value */ /* * Skip separators. */ if (!attr->name) return (1); /* * Validate the attribute name. */ for (ptr = attr->name; *ptr; ptr ++) if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && *ptr != '_') break; if (*ptr || ptr == attr->name) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)."), attr->name); return (0); } if ((ptr - attr->name) > 255) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)."), attr->name, (int)(ptr - attr->name)); return (0); } switch (attr->value_tag) { case IPP_TAG_INTEGER : break; case IPP_TAG_BOOLEAN : for (i = 0; i < attr->num_values; i ++) { if (attr->values[i].boolean != 0 && attr->values[i].boolean != 1) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)."), attr->name, attr->values[i].boolean); return (0); } } break; case IPP_TAG_ENUM : for (i = 0; i < attr->num_values; i ++) { if (attr->values[i].integer < 1) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)."), attr->name, attr->values[i].integer); return (0); } } break; case IPP_TAG_STRING : for (i = 0; i < attr->num_values; i ++) { if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)."), attr->name, attr->values[i].unknown.length); return (0); } } break; case IPP_TAG_DATE : for (i = 0; i < attr->num_values; i ++) { date = attr->values[i].date; if (date[2] < 1 || date[2] > 12) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)."), attr->name, date[2]); return (0); } if (date[3] < 1 || date[3] > 31) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)."), attr->name, date[3]); return (0); } if (date[4] > 23) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)."), attr->name, date[4]); return (0); } if (date[5] > 59) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[5]); return (0); } if (date[6] > 60) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)."), attr->name, date[6]); return (0); } if (date[7] > 9) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)."), attr->name, date[7]); return (0); } if (date[8] != '-' && date[8] != '+') { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)."), attr->name, date[8]); return (0); } if (date[9] > 11) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)."), attr->name, date[9]); return (0); } if (date[10] > 59) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[10]); return (0); } } break; case IPP_TAG_RESOLUTION : for (i = 0; i < attr->num_values; i ++) { if (attr->values[i].resolution.xres <= 0) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown"); return (0); } if (attr->values[i].resolution.yres <= 0) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown"); return (0); } if (attr->values[i].resolution.units != IPP_RES_PER_INCH && attr->values[i].resolution.units != IPP_RES_PER_CM) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown"); return (0); } } break; case IPP_TAG_RANGE : for (i = 0; i < attr->num_values; i ++) { if (attr->values[i].range.lower > attr->values[i].range.upper) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)."), attr->name, attr->values[i].range.lower, attr->values[i].range.upper); return (0); } } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0; i < attr->num_values; i ++) { for (colattr = attr->values[i].collection->attrs; colattr; colattr = colattr->next) { if (!ippValidateAttribute(colattr)) return (0); } } break; case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : for (i = 0; i < attr->num_values; i ++) { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { if ((*ptr & 0xe0) == 0xc0) { if ((ptr[1] & 0xc0) != 0x80) break; ptr ++; } else if ((*ptr & 0xf0) == 0xe0) { if ((ptr[1] & 0xc0) != 0x80 || (ptr[2] & 0xc0) != 0x80) break; ptr += 2; } else if ((*ptr & 0xf8) == 0xf0) { if ((ptr[1] & 0xc0) != 0x80 || (ptr[2] & 0xc0) != 0x80 || (ptr[3] & 0xc0) != 0x80) break; ptr += 3; } else if (*ptr & 0x80) break; else if ((*ptr < ' ' && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') || *ptr == 0x7f) break; } if (*ptr) { if (*ptr < ' ' || *ptr == 0x7f) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)."), attr->name, attr->values[i].string.text); return (0); } else { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text); return (0); } } if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text)); return (0); } } break; case IPP_TAG_NAME : case IPP_TAG_NAMELANG : for (i = 0; i < attr->num_values; i ++) { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { if ((*ptr & 0xe0) == 0xc0) { if ((ptr[1] & 0xc0) != 0x80) break; ptr ++; } else if ((*ptr & 0xf0) == 0xe0) { if ((ptr[1] & 0xc0) != 0x80 || (ptr[2] & 0xc0) != 0x80) break; ptr += 2; } else if ((*ptr & 0xf8) == 0xf0) { if ((ptr[1] & 0xc0) != 0x80 || (ptr[2] & 0xc0) != 0x80 || (ptr[3] & 0xc0) != 0x80) break; ptr += 3; } else if (*ptr & 0x80) break; else if (*ptr < ' ' || *ptr == 0x7f) break; } if (*ptr) { if (*ptr < ' ' || *ptr == 0x7f) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)."), attr->name, attr->values[i].string.text); return (0); } else { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text); return (0); } } if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text)); return (0); } } break; case IPP_TAG_KEYWORD : for (i = 0; i < attr->num_values; i ++) { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && *ptr != '_') break; } if (*ptr || ptr == attr->values[i].string.text) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text); return (0); } if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text)); return (0); } } break; case IPP_TAG_URI : for (i = 0; i < attr->num_values; i ++) { uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); if (uri_status < HTTP_URI_STATUS_OK) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, httpURIStatusString(uri_status)); return (0); } if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text)); } } break; case IPP_TAG_URISCHEME : for (i = 0; i < attr->num_values; i ++) { ptr = attr->values[i].string.text; if (islower(*ptr & 255)) { for (ptr ++; *ptr; ptr ++) { if (!islower(*ptr & 255) && !isdigit(*ptr & 255) && *ptr != '+' && *ptr != '-' && *ptr != '.') break; } } if (*ptr || ptr == attr->values[i].string.text) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text); return (0); } if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text)); return (0); } } break; case IPP_TAG_CHARSET : for (i = 0; i < attr->num_values; i ++) { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { if (!isprint(*ptr & 255) || isupper(*ptr & 255) || isspace(*ptr & 255)) break; } if (*ptr || ptr == attr->values[i].string.text) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text); return (0); } if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text)); return (0); } } break; case IPP_TAG_LANGUAGE : /* * The following regular expression is derived from the ABNF for * language tags in RFC 4646. All I can say is that this is the * easiest way to check the values... */ if ((i = regcomp(&re, "^(" "(([a-z]{2,3}(-[a-z][a-z][a-z]){0,3})|[a-z]{4,8})" /* language */ "(-[a-z][a-z][a-z][a-z]){0,1}" /* script */ "(-([a-z][a-z]|[0-9][0-9][0-9])){0,1}" /* region */ "(-([a-z]{5,8}|[0-9][0-9][0-9]))*" /* variant */ "(-[a-wy-z](-[a-z0-9]{2,8})+)*" /* extension */ "(-x(-[a-z0-9]{1,8})+)*" /* privateuse */ "|" "x(-[a-z0-9]{1,8})+" /* privateuse */ "|" "[a-z]{1,3}(-[a-z][0-9]{2,8}){1,2}" /* grandfathered */ ")$", REG_NOSUB | REG_EXTENDED)) != 0) { char temp[256]; /* Temporary error string */ regerror(i, &re, temp, sizeof(temp)); ipp_set_error(IPP_STATUS_ERROR_INTERNAL, _("Unable to compile naturalLanguage regular expression: %s."), temp); return (0); } for (i = 0; i < attr->num_values; i ++) { if (regexec(&re, attr->values[i].string.text, 0, NULL, 0)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text); regfree(&re); return (0); } if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text)); regfree(&re); return (0); } } regfree(&re); break; case IPP_TAG_MIMETYPE : /* * The following regular expression is derived from the ABNF for * MIME media types in RFC 2045 and 4288. All I can say is that this is * the easiest way to check the values... */ if ((i = regcomp(&re, "^" "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* type-name */ "/" "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* subtype-name */ "(;[-a-zA-Z0-9!#$&.+^_]{1,127}=" /* parameter= */ "([-a-zA-Z0-9!#$&.+^_]{1,127}|\"[^\"]*\"))*" /* value */ "$", REG_NOSUB | REG_EXTENDED)) != 0) { char temp[256]; /* Temporary error string */ regerror(i, &re, temp, sizeof(temp)); ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("Unable to compile mimeMediaType regular expression: %s."), temp); return (0); } for (i = 0; i < attr->num_values; i ++) { if (regexec(&re, attr->values[i].string.text, 0, NULL, 0)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text); regfree(&re); return (0); } if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1)) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text)); regfree(&re); return (0); } } regfree(&re); break; default : break; } return (1); } /* * 'ippValidateAttributes()' - Validate all attributes in an IPP message. * * This function validates the contents of the IPP message, including each * attribute. Like @link ippValidateAttribute@, @link cupsLastErrorString@ is * set to a human-readable message on failure. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 if valid, 0 otherwise */ ippValidateAttributes(ipp_t *ipp) /* I - IPP message */ { ipp_attribute_t *attr; /* Current attribute */ if (!ipp) return (1); for (attr = ipp->attrs; attr; attr = attr->next) if (!ippValidateAttribute(attr)) return (0); return (1); } /* * 'ippWrite()' - Write data for an IPP message to a HTTP connection. */ ipp_state_t /* O - Current state */ ippWrite(http_t *http, /* I - HTTP connection */ ipp_t *ipp) /* I - IPP data */ { DEBUG_printf(("ippWrite(http=%p, ipp=%p)", (void *)http, (void *)ipp)); if (!http) return (IPP_STATE_ERROR); return (ippWriteIO(http, (ipp_iocb_t)httpWrite2, http->blocking, NULL, ipp)); } /* * 'ippWriteFile()' - Write data for an IPP message to a file. * * @since CUPS 1.1.19/macOS 10.3@ */ ipp_state_t /* O - Current state */ ippWriteFile(int fd, /* I - HTTP data */ ipp_t *ipp) /* I - IPP data */ { DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, (void *)ipp)); ipp->state = IPP_STATE_IDLE; return (ippWriteIO(&fd, (ipp_iocb_t)ipp_write_file, 1, NULL, ipp)); } /* * 'ippWriteIO()' - Write data for an IPP message. * * @since CUPS 1.2/macOS 10.5@ */ ipp_state_t /* O - Current state */ ippWriteIO(void *dst, /* I - Destination */ ipp_iocb_t cb, /* I - Write callback function */ int blocking, /* I - Use blocking IO? */ ipp_t *parent, /* I - Parent IPP message */ ipp_t *ipp) /* I - IPP data */ { int i; /* Looping var */ int n; /* Length of data */ unsigned char *buffer, /* Data buffer */ *bufptr; /* Pointer into buffer */ ipp_attribute_t *attr; /* Current attribute */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)dst, (void *)cb, blocking, (void *)parent, (void *)ipp)); if (!dst || !ipp) return (IPP_STATE_ERROR); if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL) { DEBUG_puts("1ippWriteIO: Unable to get write buffer"); return (IPP_STATE_ERROR); } switch (ipp->state) { case IPP_STATE_IDLE : ipp->state ++; /* Avoid common problem... */ case IPP_STATE_HEADER : if (parent == NULL) { /* * Send the request header: * * Version = 2 bytes * Operation/Status Code = 2 bytes * Request ID = 4 bytes * Total = 8 bytes */ bufptr = buffer; *bufptr++ = ipp->request.any.version[0]; *bufptr++ = ipp->request.any.version[1]; *bufptr++ = (ipp_uchar_t)(ipp->request.any.op_status >> 8); *bufptr++ = (ipp_uchar_t)ipp->request.any.op_status; *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 24); *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 16); *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 8); *bufptr++ = (ipp_uchar_t)ipp->request.any.request_id; DEBUG_printf(("2ippWriteIO: version=%d.%d", buffer[0], buffer[1])); DEBUG_printf(("2ippWriteIO: op_status=%04x", ipp->request.any.op_status)); DEBUG_printf(("2ippWriteIO: request_id=%d", ipp->request.any.request_id)); if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP header..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } /* * Reset the state engine to point to the first attribute * in the request/response, with no current group. */ ipp->state = IPP_STATE_ATTRIBUTE; ipp->current = ipp->attrs; ipp->curtag = IPP_TAG_ZERO; DEBUG_printf(("1ippWriteIO: ipp->current=%p", (void *)ipp->current)); /* * If blocking is disabled, stop here... */ if (!blocking) break; case IPP_STATE_ATTRIBUTE : while (ipp->current != NULL) { /* * Write this attribute... */ bufptr = buffer; attr = ipp->current; ipp->current = ipp->current->next; if (!parent) { if (ipp->curtag != attr->group_tag) { /* * Send a group tag byte... */ ipp->curtag = attr->group_tag; if (attr->group_tag == IPP_TAG_ZERO) continue; DEBUG_printf(("2ippWriteIO: wrote group tag=%x(%s)", attr->group_tag, ippTagString(attr->group_tag))); *bufptr++ = (ipp_uchar_t)attr->group_tag; } else if (attr->group_tag == IPP_TAG_ZERO) continue; } DEBUG_printf(("1ippWriteIO: %s (%s%s)", attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag))); /* * Write the attribute tag and name. * * The attribute name length does not include the trailing nul * character in the source string. * * Collection values (parent != NULL) are written differently... */ if (parent == NULL) { /* * Get the length of the attribute name, and make sure it won't * overflow the buffer... */ if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 8)) { DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } /* * Write the value tag, name length, and name string... */ DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag))); DEBUG_printf(("2ippWriteIO: writing name=%d,\"%s\"", n, attr->name)); if (attr->value_tag > 0xff) { *bufptr++ = IPP_TAG_EXTENSION; *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24); *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16); *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8); *bufptr++ = (ipp_uchar_t)attr->value_tag; } else *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; memcpy(bufptr, attr->name, (size_t)n); bufptr += n; } else { /* * Get the length of the attribute name, and make sure it won't * overflow the buffer... */ if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 12)) { DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } /* * Write the member name tag, name length, name string, value tag, * and empty name for the collection member attribute... */ DEBUG_printf(("2ippWriteIO: writing value tag=%x(memberName)", IPP_TAG_MEMBERNAME)); DEBUG_printf(("2ippWriteIO: writing name=%d,\"%s\"", n, attr->name)); DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag))); DEBUG_puts("2ippWriteIO: writing name=0,\"\""); *bufptr++ = IPP_TAG_MEMBERNAME; *bufptr++ = 0; *bufptr++ = 0; *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; memcpy(bufptr, attr->name, (size_t)n); bufptr += n; if (attr->value_tag > 0xff) { *bufptr++ = IPP_TAG_EXTENSION; *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24); *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16); *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8); *bufptr++ = (ipp_uchar_t)attr->value_tag; } else *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Now write the attribute value(s)... */ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : *bufptr++ = 0; *bufptr++ = 0; break; case IPP_TAG_INTEGER : case IPP_TAG_ENUM : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Integers and enumerations are both 4-byte signed * (twos-complement) values. * * Put the 2-byte length and 4-byte value into the buffer... */ *bufptr++ = 0; *bufptr++ = 4; *bufptr++ = (ipp_uchar_t)(value->integer >> 24); *bufptr++ = (ipp_uchar_t)(value->integer >> 16); *bufptr++ = (ipp_uchar_t)(value->integer >> 8); *bufptr++ = (ipp_uchar_t)value->integer; } break; case IPP_TAG_BOOLEAN : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Boolean values are 1-byte; 0 = false, 1 = true. * * Put the 2-byte length and 1-byte value into the buffer... */ *bufptr++ = 0; *bufptr++ = 1; *bufptr++ = (ipp_uchar_t)value->boolean; } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag))); DEBUG_printf(("2ippWriteIO: writing name=0,\"\"")); if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } if (value->string.text != NULL) n = (int)strlen(value->string.text); else n = 0; if (n > (IPP_BUF_SIZE - 2)) { DEBUG_printf(("1ippWriteIO: String too long (%d)", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippWriteIO: writing string=%d,\"%s\"", n, value->string.text)); if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } /* * All simple strings consist of the 2-byte length and * character data without the trailing nul normally found * in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH * bytes since the 2-byte length is a signed (twos-complement) * value. * * Put the 2-byte length and string characters in the buffer. */ *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; if (n > 0) { memcpy(bufptr, value->string.text, (size_t)n); bufptr += n; } } break; case IPP_TAG_DATE : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Date values consist of a 2-byte length and an * 11-byte date/time structure defined by RFC 1903. * * Put the 2-byte length and 11-byte date/time * structure in the buffer. */ *bufptr++ = 0; *bufptr++ = 11; memcpy(bufptr, value->date, 11); bufptr += 11; } break; case IPP_TAG_RESOLUTION : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Resolution values consist of a 2-byte length, * 4-byte horizontal resolution value, 4-byte vertical * resolution value, and a 1-byte units value. * * Put the 2-byte length and resolution value data * into the buffer. */ *bufptr++ = 0; *bufptr++ = 9; *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 24); *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 16); *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 8); *bufptr++ = (ipp_uchar_t)value->resolution.xres; *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 24); *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 16); *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 8); *bufptr++ = (ipp_uchar_t)value->resolution.yres; *bufptr++ = (ipp_uchar_t)value->resolution.units; } break; case IPP_TAG_RANGE : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Range values consist of a 2-byte length, * 4-byte lower value, and 4-byte upper value. * * Put the 2-byte length and range value data * into the buffer. */ *bufptr++ = 0; *bufptr++ = 8; *bufptr++ = (ipp_uchar_t)(value->range.lower >> 24); *bufptr++ = (ipp_uchar_t)(value->range.lower >> 16); *bufptr++ = (ipp_uchar_t)(value->range.lower >> 8); *bufptr++ = (ipp_uchar_t)value->range.lower; *bufptr++ = (ipp_uchar_t)(value->range.upper >> 24); *bufptr++ = (ipp_uchar_t)(value->range.upper >> 16); *bufptr++ = (ipp_uchar_t)(value->range.upper >> 8); *bufptr++ = (ipp_uchar_t)value->range.upper; } break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * textWithLanguage and nameWithLanguage values consist * of a 2-byte length for both strings and their * individual lengths, a 2-byte length for the * character string, the character string without the * trailing nul, a 2-byte length for the character * set string, and the character set string without * the trailing nul. */ n = 4; if (value->string.language != NULL) n += (int)strlen(value->string.language); if (value->string.text != NULL) n += (int)strlen(value->string.text); if (n > (IPP_BUF_SIZE - 2)) { DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value " "too long (%d)", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } /* Length of entire value */ *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; /* Length of language */ if (value->string.language != NULL) n = (int)strlen(value->string.language); else n = 0; *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; /* Language */ if (n > 0) { memcpy(bufptr, value->string.language, (size_t)n); bufptr += n; } /* Length of text */ if (value->string.text != NULL) n = (int)strlen(value->string.text); else n = 0; *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; /* Text */ if (n > 0) { memcpy(bufptr, value->string.text, (size_t)n); bufptr += n; } } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { /* * Collections are written with the begin-collection * tag first with a value of 0 length, followed by the * attributes in the collection, then the end-collection * value... */ if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * Write a data length of 0 and flush the buffer... */ *bufptr++ = 0; *bufptr++ = 0; if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; /* * Then write the collection attribute... */ value->collection->state = IPP_STATE_IDLE; if (ippWriteIO(dst, cb, 1, ipp, value->collection) == IPP_STATE_ERROR) { DEBUG_puts("1ippWriteIO: Unable to write collection value"); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } } break; default : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { /* * Arrays and sets are done by sending additional * values with a zero-length name... */ if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } /* * An unknown value might some new value that a * vendor has come up with. It consists of a * 2-byte length and the bytes in the unknown * value buffer. */ n = value->unknown.length; if (n > (IPP_BUF_SIZE - 2)) { DEBUG_printf(("1ippWriteIO: Data length too long (%d)", n)); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP " "attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; } /* Length of unknown value */ *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; /* Value */ if (n > 0) { memcpy(bufptr, value->unknown.data, (size_t)n); bufptr += n; } } break; } /* * Write the data out... */ if (bufptr > buffer) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } DEBUG_printf(("2ippWriteIO: wrote %d bytes", (int)(bufptr - buffer))); } /* * If blocking is disabled and we aren't at the end of the attribute * list, stop here... */ if (!blocking && ipp->current) break; } if (ipp->current == NULL) { /* * Done with all of the attributes; add the end-of-attributes * tag or end-collection attribute... */ if (parent == NULL) { buffer[0] = IPP_TAG_END; n = 1; } else { buffer[0] = IPP_TAG_END_COLLECTION; buffer[1] = 0; /* empty name */ buffer[2] = 0; buffer[3] = 0; /* empty value */ buffer[4] = 0; n = 5; } if ((*cb)(dst, buffer, (size_t)n) < 0) { DEBUG_puts("1ippWriteIO: Could not write IPP end-tag..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } ipp->state = IPP_STATE_DATA; } break; case IPP_STATE_DATA : break; default : break; /* anti-compiler-warning-code */ } _cupsBufferRelease((char *)buffer); return (ipp->state); } /* * 'ipp_add_attr()' - Add a new attribute to the message. */ static ipp_attribute_t * /* O - New attribute */ ipp_add_attr(ipp_t *ipp, /* I - IPP message */ const char *name, /* I - Attribute name or NULL */ ipp_tag_t group_tag, /* I - Group tag or IPP_TAG_ZERO */ ipp_tag_t value_tag, /* I - Value tag or IPP_TAG_ZERO */ int num_values) /* I - Number of values */ { int alloc_values; /* Number of values to allocate */ ipp_attribute_t *attr; /* New attribute */ DEBUG_printf(("4ipp_add_attr(ipp=%p, name=\"%s\", group_tag=0x%x, value_tag=0x%x, num_values=%d)", (void *)ipp, name, group_tag, value_tag, num_values)); /* * Range check input... */ if (!ipp || num_values < 0) return (NULL); /* * Allocate memory, rounding the allocation up as needed... */ if (num_values <= 1) alloc_values = 1; else alloc_values = (num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1); attr = calloc(sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t), 1); if (attr) { /* * Initialize attribute... */ DEBUG_printf(("4debug_alloc: %p %s %s%s (%d values)", (void *)attr, name, num_values > 1 ? "1setOf " : "", ippTagString(value_tag), num_values)); if (name) attr->name = _cupsStrAlloc(name); attr->group_tag = group_tag; attr->value_tag = value_tag; attr->num_values = num_values; /* * Add it to the end of the linked list... */ if (ipp->last) ipp->last->next = attr; else ipp->attrs = attr; ipp->prev = ipp->last; ipp->last = ipp->current = attr; } DEBUG_printf(("5ipp_add_attr: Returning %p", (void *)attr)); return (attr); } /* * 'ipp_free_values()' - Free attribute values. */ static void ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ int element,/* I - First value to free */ int count) /* I - Number of values to free */ { int i; /* Looping var */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("4ipp_free_values(attr=%p, element=%d, count=%d)", (void *)attr, element, count)); if (!(attr->value_tag & IPP_TAG_CUPS_CONST)) { /* * Free values as needed... */ switch (attr->value_tag) { case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : if (element == 0 && count == attr->num_values && attr->values[0].string.language) { _cupsStrFree(attr->values[0].string.language); attr->values[0].string.language = NULL; } /* Fall through to other string values */ case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_RESERVED_STRING : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : for (i = count, value = attr->values + element; i > 0; i --, value ++) { _cupsStrFree(value->string.text); value->string.text = NULL; } break; case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : case IPP_TAG_INTEGER : case IPP_TAG_ENUM : case IPP_TAG_BOOLEAN : case IPP_TAG_DATE : case IPP_TAG_RESOLUTION : case IPP_TAG_RANGE : break; case IPP_TAG_BEGIN_COLLECTION : for (i = count, value = attr->values + element; i > 0; i --, value ++) { ippDelete(value->collection); value->collection = NULL; } break; case IPP_TAG_STRING : default : for (i = count, value = attr->values + element; i > 0; i --, value ++) { if (value->unknown.data) { free(value->unknown.data); value->unknown.data = NULL; } } break; } } /* * If we are not freeing values from the end, move the remaining values up... */ if ((element + count) < attr->num_values) memmove(attr->values + element, attr->values + element + count, (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t)); attr->num_values -= count; } /* * 'ipp_get_code()' - Convert a C locale/charset name into an IPP language/charset code. * * This typically converts strings of the form "ll_CC", "ll-REGION", and "CHARSET_NUMBER" * to "ll-cc", "ll-region", and "charset-number", respectively. */ static char * /* O - Language code string */ ipp_get_code(const char *value, /* I - Locale/charset string */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of string buffer */ { char *bufptr, /* Pointer into buffer */ *bufend; /* End of buffer */ /* * Convert values to lowercase and change _ to - as needed... */ for (bufptr = buffer, bufend = buffer + bufsize - 1; *value && bufptr < bufend; value ++) if (*value == '_') *bufptr++ = '-'; else *bufptr++ = (char)_cups_tolower(*value); *bufptr = '\0'; /* * Return the converted string... */ return (buffer); } /* * 'ipp_lang_code()' - Convert a C locale name into an IPP language code. * * This typically converts strings of the form "ll_CC" and "ll-REGION" to "ll-cc" and * "ll-region", respectively. It also converts the "C" (POSIX) locale to "en". */ static char * /* O - Language code string */ ipp_lang_code(const char *locale, /* I - Locale string */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of string buffer */ { /* * Map POSIX ("C") locale to generic English, otherwise convert the locale string as-is. */ if (!_cups_strcasecmp(locale, "c")) { strlcpy(buffer, "en", bufsize); return (buffer); } else return (ipp_get_code(locale, buffer, bufsize)); } /* * 'ipp_length()' - Compute the length of an IPP message or collection value. */ static size_t /* O - Size of IPP message */ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ int collection) /* I - 1 if a collection, 0 otherwise */ { int i; /* Looping var */ size_t bytes; /* Number of bytes */ ipp_attribute_t *attr; /* Current attribute */ ipp_tag_t group; /* Current group */ _ipp_value_t *value; /* Current value */ DEBUG_printf(("3ipp_length(ipp=%p, collection=%d)", (void *)ipp, collection)); if (!ipp) { DEBUG_puts("4ipp_length: Returning 0 bytes"); return (0); } /* * Start with 8 bytes for the IPP message header... */ bytes = collection ? 0 : 8; /* * Then add the lengths of each attribute... */ group = IPP_TAG_ZERO; for (attr = ipp->attrs; attr != NULL; attr = attr->next) { if (attr->group_tag != group && !collection) { group = attr->group_tag; if (group == IPP_TAG_ZERO) continue; bytes ++; /* Group tag */ } if (!attr->name) continue; DEBUG_printf(("5ipp_length: attr->name=\"%s\", attr->num_values=%d, " "bytes=" CUPS_LLFMT, attr->name, attr->num_values, CUPS_LLCAST bytes)); if ((attr->value_tag & ~IPP_TAG_CUPS_CONST) < IPP_TAG_EXTENSION) bytes += (size_t)attr->num_values;/* Value tag for each value */ else bytes += (size_t)(5 * attr->num_values); /* Value tag for each value */ bytes += (size_t)(2 * attr->num_values); /* Name lengths */ bytes += strlen(attr->name); /* Name */ bytes += (size_t)(2 * attr->num_values); /* Value lengths */ if (collection) bytes += 5; /* Add membername overhead */ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { case IPP_TAG_UNSUPPORTED_VALUE : case IPP_TAG_DEFAULT : case IPP_TAG_UNKNOWN : case IPP_TAG_NOVALUE : case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : break; case IPP_TAG_INTEGER : case IPP_TAG_ENUM : bytes += (size_t)(4 * attr->num_values); break; case IPP_TAG_BOOLEAN : bytes += (size_t)attr->num_values; break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) if (value->string.text) bytes += strlen(value->string.text); break; case IPP_TAG_DATE : bytes += (size_t)(11 * attr->num_values); break; case IPP_TAG_RESOLUTION : bytes += (size_t)(9 * attr->num_values); break; case IPP_TAG_RANGE : bytes += (size_t)(8 * attr->num_values); break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : bytes += (size_t)(4 * attr->num_values); /* Charset + text length */ for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (value->string.language) bytes += strlen(value->string.language); if (value->string.text) bytes += strlen(value->string.text); } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) bytes += ipp_length(value->collection, 1); break; default : for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) bytes += (size_t)value->unknown.length; break; } } /* * Finally, add 1 byte for the "end of attributes" tag or 5 bytes * for the "end of collection" tag and return... */ if (collection) bytes += 5; else bytes ++; DEBUG_printf(("4ipp_length: Returning " CUPS_LLFMT " bytes", CUPS_LLCAST bytes)); return (bytes); } /* * 'ipp_read_http()' - Semi-blocking read on a HTTP connection... */ static ssize_t /* O - Number of bytes read */ ipp_read_http(http_t *http, /* I - Client connection */ ipp_uchar_t *buffer, /* O - Buffer for data */ size_t length) /* I - Total length */ { ssize_t tbytes, /* Total bytes read */ bytes; /* Bytes read this pass */ DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)", (void *)http, (void *)buffer, (int)length)); /* * Loop until all bytes are read... */ for (tbytes = 0, bytes = 0; tbytes < (int)length; tbytes += bytes, buffer += bytes) { DEBUG_printf(("9ipp_read_http: tbytes=" CUPS_LLFMT ", http->state=%d", CUPS_LLCAST tbytes, http->state)); if (http->state == HTTP_STATE_WAITING) break; if (http->used == 0 && !http->blocking) { /* * Wait up to 10 seconds for more data on non-blocking sockets... */ if (!httpWait(http, 10000)) { /* * Signal no data... */ bytes = -1; break; } } else if (http->used == 0 && http->timeout_value > 0) { /* * Wait up to timeout seconds for more data on blocking sockets... */ if (!httpWait(http, (int)(1000 * http->timeout_value))) { /* * Signal no data... */ bytes = -1; break; } } if ((bytes = httpRead2(http, (char *)buffer, length - (size_t)tbytes)) < 0) { #ifdef _WIN32 break; #else if (errno != EAGAIN && errno != EINTR) break; bytes = 0; #endif /* _WIN32 */ } else if (bytes == 0) break; } /* * Return the number of bytes read... */ if (tbytes == 0 && bytes < 0) tbytes = -1; DEBUG_printf(("8ipp_read_http: Returning " CUPS_LLFMT " bytes", CUPS_LLCAST tbytes)); return (tbytes); } /* * 'ipp_read_file()' - Read IPP data from a file. */ static ssize_t /* O - Number of bytes read */ ipp_read_file(int *fd, /* I - File descriptor */ ipp_uchar_t *buffer, /* O - Read buffer */ size_t length) /* I - Number of bytes to read */ { #ifdef _WIN32 return ((ssize_t)read(*fd, buffer, (unsigned)length)); #else return (read(*fd, buffer, length)); #endif /* _WIN32 */ } /* * 'ipp_set_error()' - Set a formatted, localized error string. */ static void ipp_set_error(ipp_status_t status, /* I - Status code */ const char *format, /* I - Printf-style error string */ ...) /* I - Additional arguments as needed */ { va_list ap; /* Pointer to additional args */ char buffer[2048]; /* Message buffer */ cups_lang_t *lang = cupsLangDefault(); /* Current language */ va_start(ap, format); vsnprintf(buffer, sizeof(buffer), _cupsLangString(lang, format), ap); va_end(ap); _cupsSetError(status, buffer, 0); } /* * 'ipp_set_value()' - Get the value element from an attribute, expanding it as * needed. */ static _ipp_value_t * /* O - IPP value element or NULL on error */ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element) /* I - Value number (0-based) */ { ipp_attribute_t *temp, /* New attribute pointer */ *current, /* Current attribute in list */ *prev; /* Previous attribute in list */ int alloc_values; /* Allocated values */ /* * If we are setting an existing value element, return it... */ temp = *attr; if (temp->num_values <= 1) alloc_values = 1; else alloc_values = (temp->num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1); if (element < alloc_values) { if (element >= temp->num_values) temp->num_values = element + 1; return (temp->values + element); } /* * Otherwise re-allocate the attribute - we allocate in groups of IPP_MAX_VALUE * values when num_values > 1. */ if (alloc_values < IPP_MAX_VALUES) alloc_values = IPP_MAX_VALUES; else alloc_values += IPP_MAX_VALUES; DEBUG_printf(("4ipp_set_value: Reallocating for up to %d values.", alloc_values)); /* * Reallocate memory... */ if ((temp = realloc(temp, sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t))) == NULL) { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("4ipp_set_value: Unable to resize attribute."); return (NULL); } /* * Zero the new memory... */ memset(temp->values + temp->num_values, 0, (size_t)(alloc_values - temp->num_values) * sizeof(_ipp_value_t)); if (temp != *attr) { /* * Reset pointers in the list... */ #ifndef __clang_analyzer__ DEBUG_printf(("4debug_free: %p %s", (void *)*attr, temp->name)); #endif /* !__clang_analyzer__ */ DEBUG_printf(("4debug_alloc: %p %s %s%s (%d)", (void *)temp, temp->name, temp->num_values > 1 ? "1setOf " : "", ippTagString(temp->value_tag), temp->num_values)); if (ipp->current == *attr && ipp->prev) { /* * Use current "previous" pointer... */ prev = ipp->prev; } else { /* * Find this attribute in the linked list... */ for (prev = NULL, current = ipp->attrs; current && current != *attr; prev = current, current = current->next); if (!current) { /* * This is a serious error! */ *attr = temp; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute is not a member of the message."), 1); DEBUG_puts("4ipp_set_value: Unable to find attribute in message."); return (NULL); } } if (prev) prev->next = temp; else ipp->attrs = temp; ipp->current = temp; ipp->prev = prev; if (ipp->last == *attr) ipp->last = temp; *attr = temp; } /* * Return the value element... */ if (element >= temp->num_values) temp->num_values = element + 1; return (temp->values + element); } /* * 'ipp_write_file()' - Write IPP data to a file. */ static ssize_t /* O - Number of bytes written */ ipp_write_file(int *fd, /* I - File descriptor */ ipp_uchar_t *buffer, /* I - Data to write */ size_t length) /* I - Number of bytes to write */ { #ifdef _WIN32 return ((ssize_t)write(*fd, buffer, (unsigned)length)); #else return (write(*fd, buffer, length)); #endif /* _WIN32 */ } cups-2.3.1/cups/tlscheck.c000664 000765 000024 00000054202 13574721672 015520 0ustar00mikestaff000000 000000 /* * TLS check program for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #ifndef HAVE_SSL int main(void) { puts("Sorry, no TLS support compiled in."); return (1); } #else /* * Local functions... */ static void usage(void); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ http_t *http; /* HTTP connection */ const char *server = NULL; /* Hostname from command-line */ int port = 0; /* Port number */ cups_array_t *creds; /* Server credentials */ char creds_str[2048]; /* Credentials string */ const char *cipherName = "UNKNOWN";/* Cipher suite name */ int dhBits = 0; /* Diffie-Hellman bits */ int tlsVersion = 0; /* TLS version number */ char uri[1024], /* Printer URI */ scheme[32], /* URI scheme */ host[256], /* Hostname */ userpass[256], /* Username/password */ resource[256]; /* Resource path */ int af = AF_UNSPEC, /* Address family */ tls_options = _HTTP_TLS_NONE, /* TLS options */ tls_min_version = _HTTP_TLS_1_0, tls_max_version = _HTTP_TLS_MAX, verbose = 0; /* Verbosity */ ipp_t *request, /* IPP Get-Printer-Attributes request */ *response; /* IPP Get-Printer-Attributes response */ ipp_attribute_t *attr; /* Current attribute */ const char *name; /* Attribute name */ char value[1024]; /* Attribute (string) value */ static const char * const pattrs[] = /* Requested attributes */ { "color-supported", "compression-supported", "document-format-supported", "pages-per-minute", "printer-location", "printer-make-and-model", "printer-state", "printer-state-reasons", "sides-supported", "uri-authentication-supported", "uri-security-supported" }; for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--dh")) { tls_options |= _HTTP_TLS_ALLOW_DH; } else if (!strcmp(argv[i], "--no-cbc")) { tls_options |= _HTTP_TLS_DENY_CBC; } else if (!strcmp(argv[i], "--no-tls10")) { tls_min_version = _HTTP_TLS_1_1; } else if (!strcmp(argv[i], "--tls10")) { tls_min_version = _HTTP_TLS_1_0; tls_max_version = _HTTP_TLS_1_0; } else if (!strcmp(argv[i], "--tls11")) { tls_min_version = _HTTP_TLS_1_1; tls_max_version = _HTTP_TLS_1_1; } else if (!strcmp(argv[i], "--tls12")) { tls_min_version = _HTTP_TLS_1_2; tls_max_version = _HTTP_TLS_1_2; } else if (!strcmp(argv[i], "--tls13")) { tls_min_version = _HTTP_TLS_1_3; tls_max_version = _HTTP_TLS_1_3; } else if (!strcmp(argv[i], "--rc4")) { tls_options |= _HTTP_TLS_ALLOW_RC4; } else if (!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v")) { verbose = 1; } else if (!strcmp(argv[i], "-4")) { af = AF_INET; } else if (!strcmp(argv[i], "-6")) { af = AF_INET6; } else if (argv[i][0] == '-') { printf("tlscheck: Unknown option '%s'.\n", argv[i]); usage(); } else if (!server) { if (!strncmp(argv[i], "ipps://", 7)) { httpSeparateURI(HTTP_URI_CODING_ALL, argv[i], scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)); server = host; } else { server = argv[i]; strlcpy(resource, "/ipp/print", sizeof(resource)); } } else if (!port && (argv[i][0] == '=' || isdigit(argv[i][0] & 255))) { if (argv[i][0] == '=') port = atoi(argv[i] + 1); else port = atoi(argv[i]); } else { printf("tlscheck: Unexpected argument '%s'.\n", argv[i]); usage(); } } if (!server) usage(); if (!port) port = 631; _httpTLSSetOptions(tls_options, tls_min_version, tls_max_version); http = httpConnect2(server, port, NULL, af, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL); if (!http) { printf("%s: ERROR (%s)\n", server, cupsLastErrorString()); return (1); } if (httpCopyCredentials(http, &creds)) { strlcpy(creds_str, "Unable to get server X.509 credentials.", sizeof(creds_str)); } else { httpCredentialsString(creds, creds_str, sizeof(creds_str)); httpFreeCredentials(creds); } #ifdef __APPLE__ SSLProtocol protocol; SSLCipherSuite cipher; char unknownCipherName[256]; int paramsNeeded = 0; const void *params; size_t paramsLen; OSStatus err; if ((err = SSLGetNegotiatedProtocolVersion(http->tls, &protocol)) != noErr) { printf("%s: ERROR (No protocol version - %d)\n", server, (int)err); httpClose(http); return (1); } switch (protocol) { default : tlsVersion = 0; break; case kSSLProtocol3 : tlsVersion = 30; break; case kTLSProtocol1 : tlsVersion = 10; break; case kTLSProtocol11 : tlsVersion = 11; break; case kTLSProtocol12 : tlsVersion = 12; break; } if ((err = SSLGetNegotiatedCipher(http->tls, &cipher)) != noErr) { printf("%s: ERROR (No cipher suite - %d)\n", server, (int)err); httpClose(http); return (1); } switch (cipher) { case TLS_NULL_WITH_NULL_NULL: cipherName = "TLS_NULL_WITH_NULL_NULL"; break; case TLS_RSA_WITH_NULL_MD5: cipherName = "TLS_RSA_WITH_NULL_MD5"; break; case TLS_RSA_WITH_NULL_SHA: cipherName = "TLS_RSA_WITH_NULL_SHA"; break; case TLS_RSA_WITH_RC4_128_MD5: cipherName = "TLS_RSA_WITH_RC4_128_MD5"; break; case TLS_RSA_WITH_RC4_128_SHA: cipherName = "TLS_RSA_WITH_RC4_128_SHA"; break; case TLS_RSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_RSA_WITH_3DES_EDE_CBC_SHA"; break; case TLS_RSA_WITH_NULL_SHA256: cipherName = "TLS_RSA_WITH_NULL_SHA256"; break; case TLS_RSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_RSA_WITH_AES_128_CBC_SHA256"; break; case TLS_RSA_WITH_AES_256_CBC_SHA256: cipherName = "TLS_RSA_WITH_AES_256_CBC_SHA256"; break; case TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_DSS_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DH_DSS_WITH_AES_256_CBC_SHA256: cipherName = "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_256_CBC_SHA256: cipherName = "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256: cipherName = "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: cipherName = "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_RC4_128_MD5: cipherName = "TLS_DH_anon_WITH_RC4_128_MD5"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DH_anon_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_256_CBC_SHA256: cipherName = "TLS_DH_anon_WITH_AES_256_CBC_SHA256"; paramsNeeded = 1; break; case TLS_PSK_WITH_RC4_128_SHA: cipherName = "TLS_PSK_WITH_RC4_128_SHA"; break; case TLS_PSK_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_PSK_WITH_3DES_EDE_CBC_SHA"; break; case TLS_PSK_WITH_AES_128_CBC_SHA: cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA"; break; case TLS_PSK_WITH_AES_256_CBC_SHA: cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA"; break; case TLS_DHE_PSK_WITH_RC4_128_SHA: cipherName = "TLS_DHE_PSK_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_AES_128_CBC_SHA: cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_AES_256_CBC_SHA: cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_RSA_PSK_WITH_RC4_128_SHA: cipherName = "TLS_RSA_PSK_WITH_RC4_128_SHA"; break; case TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"; break; case TLS_RSA_PSK_WITH_AES_128_CBC_SHA: cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"; break; case TLS_RSA_PSK_WITH_AES_256_CBC_SHA: cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"; break; case TLS_PSK_WITH_NULL_SHA: cipherName = "TLS_PSK_WITH_NULL_SHA"; break; case TLS_DHE_PSK_WITH_NULL_SHA: cipherName = "TLS_DHE_PSK_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_RSA_PSK_WITH_NULL_SHA: cipherName = "TLS_RSA_PSK_WITH_NULL_SHA"; break; case TLS_RSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_RSA_WITH_AES_128_GCM_SHA256"; break; case TLS_RSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_RSA_WITH_AES_256_GCM_SHA384"; break; case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_DH_DSS_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DH_DSS_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DH_anon_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DH_anon_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_PSK_WITH_AES_128_GCM_SHA256: cipherName = "TLS_PSK_WITH_AES_128_GCM_SHA256"; break; case TLS_PSK_WITH_AES_256_GCM_SHA384: cipherName = "TLS_PSK_WITH_AES_256_GCM_SHA384"; break; case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256: cipherName = "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384: cipherName = "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_RSA_PSK_WITH_AES_128_GCM_SHA256: cipherName = "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"; break; case TLS_RSA_PSK_WITH_AES_256_GCM_SHA384: cipherName = "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"; break; case TLS_PSK_WITH_AES_128_CBC_SHA256: cipherName = "TLS_PSK_WITH_AES_128_CBC_SHA256"; break; case TLS_PSK_WITH_AES_256_CBC_SHA384: cipherName = "TLS_PSK_WITH_AES_256_CBC_SHA384"; break; case TLS_PSK_WITH_NULL_SHA256: cipherName = "TLS_PSK_WITH_NULL_SHA256"; break; case TLS_PSK_WITH_NULL_SHA384: cipherName = "TLS_PSK_WITH_NULL_SHA384"; break; case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256: cipherName = "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384: cipherName = "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_NULL_SHA256: cipherName = "TLS_DHE_PSK_WITH_NULL_SHA256"; paramsNeeded = 1; break; case TLS_DHE_PSK_WITH_NULL_SHA384: cipherName = "TLS_DHE_PSK_WITH_NULL_SHA384"; paramsNeeded = 1; break; case TLS_RSA_PSK_WITH_AES_128_CBC_SHA256: cipherName = "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"; break; case TLS_RSA_PSK_WITH_AES_256_CBC_SHA384: cipherName = "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"; break; case TLS_RSA_PSK_WITH_NULL_SHA256: cipherName = "TLS_RSA_PSK_WITH_NULL_SHA256"; break; case TLS_RSA_PSK_WITH_NULL_SHA384: cipherName = "TLS_RSA_PSK_WITH_NULL_SHA384"; break; case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384: cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384: cipherName = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256: cipherName = "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384: cipherName = "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256: cipherName = "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384: cipherName = "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"; paramsNeeded = 1; break; case TLS_RSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_RSA_WITH_AES_128_CBC_SHA"; break; case TLS_DH_DSS_WITH_AES_128_CBC_SHA: cipherName = "TLS_DH_DSS_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_DH_RSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_128_CBC_SHA: cipherName = "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_128_CBC_SHA: cipherName = "TLS_DH_anon_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_RSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_RSA_WITH_AES_256_CBC_SHA"; break; case TLS_DH_DSS_WITH_AES_256_CBC_SHA: cipherName = "TLS_DH_DSS_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_RSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_DH_RSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_DSS_WITH_AES_256_CBC_SHA: cipherName = "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_DHE_RSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_DH_anon_WITH_AES_256_CBC_SHA: cipherName = "TLS_DH_anon_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_NULL_SHA: cipherName = "TLS_ECDH_ECDSA_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_RC4_128_SHA: cipherName = "TLS_ECDH_ECDSA_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_NULL_SHA: cipherName = "TLS_ECDHE_ECDSA_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA: cipherName = "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_NULL_SHA: cipherName = "TLS_ECDH_RSA_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_RC4_128_SHA: cipherName = "TLS_ECDH_RSA_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_NULL_SHA: cipherName = "TLS_ECDHE_RSA_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_RC4_128_SHA: cipherName = "TLS_ECDHE_RSA_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: cipherName = "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: cipherName = "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_anon_WITH_NULL_SHA: cipherName = "TLS_ECDH_anon_WITH_NULL_SHA"; paramsNeeded = 1; break; case TLS_ECDH_anon_WITH_RC4_128_SHA: cipherName = "TLS_ECDH_anon_WITH_RC4_128_SHA"; paramsNeeded = 1; break; case TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA: cipherName = "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_anon_WITH_AES_128_CBC_SHA: cipherName = "TLS_ECDH_anon_WITH_AES_128_CBC_SHA"; paramsNeeded = 1; break; case TLS_ECDH_anon_WITH_AES_256_CBC_SHA: cipherName = "TLS_ECDH_anon_WITH_AES_256_CBC_SHA"; paramsNeeded = 1; break; default : snprintf(unknownCipherName, sizeof(unknownCipherName), "UNKNOWN_%04X", cipher); cipherName = unknownCipherName; break; } if (cipher == TLS_RSA_WITH_RC4_128_MD5 || cipher == TLS_RSA_WITH_RC4_128_SHA) { printf("%s: ERROR (Printers MUST NOT negotiate RC4 cipher suites.)\n", server); httpClose(http); return (1); } if ((err = SSLGetDiffieHellmanParams(http->tls, ¶ms, ¶msLen)) != noErr && paramsNeeded) { printf("%s: ERROR (Unable to get Diffie-Hellman parameters - %d)\n", server, (int)err); httpClose(http); return (1); } if (paramsLen < 128 && paramsLen != 0) { printf("%s: ERROR (Diffie-Hellman parameters MUST be at least 2048 bits, but Printer uses only %d bits/%d bytes)\n", server, (int)paramsLen * 8, (int)paramsLen); httpClose(http); return (1); } dhBits = (int)paramsLen * 8; #endif /* __APPLE__ */ if (dhBits > 0) printf("%s: OK (TLS: %d.%d, %s, %d DH bits)\n", server, tlsVersion / 10, tlsVersion % 10, cipherName, dhBits); else printf("%s: OK (TLS: %d.%d, %s)\n", server, tlsVersion / 10, tlsVersion % 10, cipherName); printf(" %s\n", creds_str); if (verbose) { httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipps", NULL, host, port, resource); request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); response = cupsDoRequest(http, request, resource); for (attr = ippFirstAttribute(response); attr; attr = ippNextAttribute(response)) { if (ippGetGroupTag(attr) != IPP_TAG_PRINTER) continue; if ((name = ippGetName(attr)) == NULL) continue; ippAttributeString(attr, value, sizeof(value)); printf(" %s=%s\n", name, value); } ippDelete(response); puts(""); } httpClose(http); return (0); } /* * 'usage()' - Show program usage. */ static void usage(void) { puts("Usage: ./tlscheck [options] server [port]"); puts(" ./tlscheck [options] ipps://server[:port]/path"); puts(""); puts("Options:"); puts(" --dh Allow DH/DHE key exchange"); puts(" --no-cbc Disable CBC cipher suites"); puts(" --no-tls10 Disable TLS/1.0"); puts(" --rc4 Allow RC4 encryption"); puts(" --tls10 Only use TLS/1.0"); puts(" --tls11 Only use TLS/1.1"); puts(" --tls12 Only use TLS/1.2"); puts(" --tls13 Only use TLS/1.3"); puts(" --verbose Be verbose"); puts(" -4 Connect using IPv4 addresses only"); puts(" -6 Connect using IPv6 addresses only"); puts(" -v Be verbose"); puts(""); puts("The default port is 631."); exit(1); } #endif /* !HAVE_SSL */ cups-2.3.1/cups/backchannel.c000664 000765 000024 00000007467 13574721672 016164 0ustar00mikestaff000000 000000 /* * Backchannel functions for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups.h" #include "sidechannel.h" #include #ifdef _WIN32 # include # include #else # include #endif /* _WIN32 */ /* * Local functions... */ static void cups_setup(fd_set *set, struct timeval *tval, double timeout); /* * 'cupsBackChannelRead()' - Read data from the backchannel. * * Reads up to "bytes" bytes from the backchannel/backend. The "timeout" * parameter controls how many seconds to wait for the data - use 0.0 to * return immediately if there is no data, -1.0 to wait for data indefinitely. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Bytes read or -1 on error */ cupsBackChannelRead(char *buffer, /* I - Buffer to read into */ size_t bytes, /* I - Bytes to read */ double timeout) /* I - Timeout in seconds, typically 0.0 to poll */ { fd_set input; /* Input set */ struct timeval tval; /* Timeout value */ int status; /* Select status */ /* * Wait for input ready. */ do { cups_setup(&input, &tval, timeout); if (timeout < 0.0) status = select(4, &input, NULL, NULL, NULL); else status = select(4, &input, NULL, NULL, &tval); } while (status < 0 && errno != EINTR && errno != EAGAIN); if (status < 0) return (-1); /* Timeout! */ /* * Read bytes from the pipe... */ #ifdef _WIN32 return ((ssize_t)_read(3, buffer, (unsigned)bytes)); #else return (read(3, buffer, bytes)); #endif /* _WIN32 */ } /* * 'cupsBackChannelWrite()' - Write data to the backchannel. * * Writes "bytes" bytes to the backchannel/filter. The "timeout" parameter * controls how many seconds to wait for the data to be written - use * 0.0 to return immediately if the data cannot be written, -1.0 to wait * indefinitely. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Bytes written or -1 on error */ cupsBackChannelWrite( const char *buffer, /* I - Buffer to write */ size_t bytes, /* I - Bytes to write */ double timeout) /* I - Timeout in seconds, typically 1.0 */ { fd_set output; /* Output set */ struct timeval tval; /* Timeout value */ int status; /* Select status */ ssize_t count; /* Current bytes */ size_t total; /* Total bytes */ /* * Write all bytes... */ total = 0; while (total < bytes) { /* * Wait for write-ready... */ do { cups_setup(&output, &tval, timeout); if (timeout < 0.0) status = select(4, NULL, &output, NULL, NULL); else status = select(4, NULL, &output, NULL, &tval); } while (status < 0 && errno != EINTR && errno != EAGAIN); if (status <= 0) return (-1); /* Timeout! */ /* * Write bytes to the pipe... */ #ifdef _WIN32 count = (ssize_t)_write(3, buffer, (unsigned)(bytes - total)); #else count = write(3, buffer, bytes - total); #endif /* _WIN32 */ if (count < 0) { /* * Write error - abort on fatal errors... */ if (errno != EINTR && errno != EAGAIN) return (-1); } else { /* * Write succeeded, update buffer pointer and total count... */ buffer += count; total += (size_t)count; } } return ((ssize_t)bytes); } /* * 'cups_setup()' - Setup select() */ static void cups_setup(fd_set *set, /* I - Set for select() */ struct timeval *tval, /* I - Timer value */ double timeout) /* I - Timeout in seconds */ { tval->tv_sec = (int)timeout; tval->tv_usec = (int)(1000000.0 * (timeout - tval->tv_sec)); FD_ZERO(set); FD_SET(3, set); } cups-2.3.1/cups/libcups2.def000664 000765 000024 00000022341 13574721672 015756 0ustar00mikestaff000000 000000 LIBRARY libcups2 VERSION 2.14 EXPORTS _cupsArrayAddStrings _cupsArrayNewStrings _cupsBufferGet _cupsBufferRelease _cupsCharmapFlush _cupsCondBroadcast _cupsCondInit _cupsCondWait _cupsConnect _cupsConvertOptions _cupsCreateDest _cupsEncodeOption _cupsEncodingName _cupsFilePeekAhead _cupsGet1284Values _cupsGetDestResource _cupsGetDests _cupsGetPassword _cupsGlobalLock _cupsGlobalUnlock _cupsGlobals _cupsLangPrintError _cupsLangPrintf _cupsLangPuts _cupsLangString _cupsMessageFree _cupsMessageLoad _cupsMessageLookup _cupsMessageNew _cupsMessageSave _cupsMutexInit _cupsMutexLock _cupsMutexUnlock _cupsNextDelay _cupsRWInit _cupsRWLockRead _cupsRWLockWrite _cupsRWUnlock _cupsRasterAddError _cupsRasterClearError _cupsRasterColorSpaceString _cupsRasterDelete _cupsRasterErrorString _cupsRasterExecPS _cupsRasterInitPWGHeader _cupsRasterInterpretPPD _cupsRasterNew _cupsRasterReadHeader _cupsRasterReadPixels _cupsRasterWriteHeader _cupsRasterWritePixels _cupsSetDefaults _cupsSetError _cupsSetHTTPError _cupsSetLocale _cupsStrAlloc _cupsStrDate _cupsStrFlush _cupsStrFormatd _cupsStrFree _cupsStrRetain _cupsStrScand _cupsStrStatistics _cupsThreadCancel _cupsThreadCreate _cupsThreadDetach _cupsThreadWait _cupsUserDefault _cups_gettimeofday _cups_safe_vsnprintf _cups_snprintf _cups_strcasecmp _cups_strcpy _cups_strcpy _cups_strlcat _cups_strlcpy _cups_strncasecmp _cups_vsnprintf _httpAddrSetPort _httpCreateCredentials _httpDecodeURI _httpDisconnect _httpEncodeURI _httpFreeCredentials _httpResolveURI _httpSetDigestAuthString _httpStatus _httpTLSInitialize _httpTLSPending _httpTLSRead _httpTLSSetOptions _httpTLSStart _httpTLSStop _httpTLSWrite _httpUpdate _httpWait _ippCheckOptions _ippFileParse _ippFileReadToken _ippFindOption _ippVarsDeinit _ippVarsExpand _ippVarsGet _ippVarsInit _ippVarsPasswordCB _ippVarsSet _ppdCacheCreateWithFile _ppdCacheCreateWithPPD _ppdCacheDestroy _ppdCacheGetBin _ppdCacheGetFinishingOptions _ppdCacheGetFinishingValues _ppdCacheGetInputSlot _ppdCacheGetMediaType _ppdCacheGetOutputBin _ppdCacheGetPageSize _ppdCacheGetSize _ppdCacheGetSource _ppdCacheGetType _ppdCacheWriteFile _ppdCreateFromIPP _ppdFreeLanguages _ppdGetEncoding _ppdGetLanguages _ppdGlobals _ppdHashName _ppdLocalizedAttr _ppdNormalizeMakeAndModel _ppdOpen _ppdOpenFile _ppdParseOptions _pwgInputSlotForSource _pwgMediaNearSize _pwgMediaTable _pwgMediaTypeForType _pwgPageSizeForMedia cupsAddDest cupsAddDestMediaOptions cupsAddIntegerOption cupsAddOption cupsAdminCreateWindowsPPD cupsAdminExportSamba cupsAdminGetServerSettings cupsAdminSetServerSettings cupsArrayAdd cupsArrayClear cupsArrayCount cupsArrayCurrent cupsArrayDelete cupsArrayDup cupsArrayFind cupsArrayFirst cupsArrayGetIndex cupsArrayGetInsert cupsArrayIndex cupsArrayInsert cupsArrayLast cupsArrayNew cupsArrayNew2 cupsArrayNew3 cupsArrayNext cupsArrayPrev cupsArrayRemove cupsArrayRestore cupsArraySave cupsArrayUserData cupsCancelDestJob cupsCancelJob cupsCancelJob2 cupsCharsetToUTF8 cupsCheckDestSupported cupsCloseDestJob cupsConnectDest cupsCopyDest cupsCopyDestConflicts cupsCopyDestInfo cupsCreateDestJob cupsCreateJob cupsDirClose cupsDirOpen cupsDirRead cupsDirRewind cupsDoAuthentication cupsDoFileRequest cupsDoIORequest cupsDoRequest cupsEncodeOption cupsEncodeOptions cupsEncodeOptions2 cupsEncryption cupsEnumDests cupsFileClose cupsFileCompression cupsFileEOF cupsFileFind cupsFileFlush cupsFileGetChar cupsFileGetConf cupsFileGetLine cupsFileGets cupsFileLock cupsFileNumber cupsFileOpen cupsFileOpenFd cupsFilePeekChar cupsFilePrintf cupsFilePutChar cupsFilePutConf cupsFilePuts cupsFileRead cupsFileRewind cupsFileSeek cupsFileStderr cupsFileStdin cupsFileStdout cupsFileTell cupsFileUnlock cupsFileWrite cupsFindDestDefault cupsFindDestReady cupsFindDestSupported cupsFinishDestDocument cupsFinishDocument cupsFreeDestInfo cupsFreeDests cupsFreeJobs cupsFreeOptions cupsGetClasses cupsGetConflicts cupsGetDefault cupsGetDefault2 cupsGetDest cupsGetDestMediaByIndex cupsGetDestMediaByName cupsGetDestMediaBySize cupsGetDestMediaCount cupsGetDestMediaDefault cupsGetDestWithURI cupsGetDests cupsGetDests2 cupsGetDevices cupsGetFd cupsGetFile cupsGetIntegerOption cupsGetJobs cupsGetJobs2 cupsGetNamedDest cupsGetOption cupsGetPPD cupsGetPPD2 cupsGetPPD3 cupsGetPassword cupsGetPassword2 cupsGetPrinters cupsGetResponse cupsGetServerPPD cupsHashData cupsHashString cupsLangDefault cupsLangEncoding cupsLangFlush cupsLangFree cupsLangGet cupsLastError cupsLastErrorString cupsLocalizeDestMedia cupsLocalizeDestOption cupsLocalizeDestValue cupsMakeServerCredentials cupsMarkOptions cupsNotifySubject cupsNotifyText cupsParseOptions cupsPrintFile cupsPrintFile2 cupsPrintFiles cupsPrintFiles2 cupsPutFd cupsPutFile cupsRasterClose cupsRasterClose cupsRasterErrorString cupsRasterErrorString cupsRasterInitPWGHeader cupsRasterInitPWGHeader cupsRasterInterpretPPD cupsRasterInterpretPPD cupsRasterOpen cupsRasterOpen cupsRasterOpenIO cupsRasterOpenIO cupsRasterReadHeader cupsRasterReadHeader cupsRasterReadHeader2 cupsRasterReadHeader2 cupsRasterReadPixels cupsRasterReadPixels cupsRasterWriteHeader cupsRasterWriteHeader cupsRasterWriteHeader2 cupsRasterWriteHeader2 cupsRasterWritePixels cupsRasterWritePixels cupsReadResponseData cupsRemoveDest cupsRemoveOption cupsResolveConflicts cupsSendRequest cupsServer cupsSetClientCertCB cupsSetCredentials cupsSetDefaultDest cupsSetDests cupsSetDests2 cupsSetEncryption cupsSetPasswordCB cupsSetPasswordCB2 cupsSetServer cupsSetServerCertCB cupsSetServerCredentials cupsSetUser cupsSetUserAgent cupsStartDestDocument cupsStartDocument cupsTempFd cupsTempFile cupsTempFile2 cupsUTF32ToUTF8 cupsUTF8ToCharset cupsUTF8ToUTF32 cupsUser cupsUserAgent cupsWriteRequestData httpAcceptConnection httpAddCredential httpAddrAny httpAddrClose httpAddrConnect httpAddrConnect2 httpAddrCopyList httpAddrEqual httpAddrFamily httpAddrFreeList httpAddrGetList httpAddrLength httpAddrListen httpAddrLocalhost httpAddrLookup httpAddrPort httpAddrString httpAssembleURI httpAssembleURIf httpAssembleUUID httpBlocking httpCheck httpClearCookie httpClearFields httpClose httpCompareCredentials httpConnect httpConnect2 httpConnectEncrypt httpCopyCredentials httpCredentialsAreValidForName httpCredentialsGetExpiration httpCredentialsGetTrust httpCredentialsString httpDecode64 httpDecode64_2 httpDelete httpEncode64 httpEncode64_2 httpEncryption httpError httpFieldValue httpFlush httpFlushWrite httpFreeCredentials httpGet httpGetActivity httpGetAddress httpGetAuthString httpGetBlocking httpGetContentEncoding httpGetCookie httpGetDateString httpGetDateString2 httpGetDateTime httpGetEncryption httpGetExpect httpGetFd httpGetField httpGetHostByName httpGetHostname httpGetKeepAlive httpGetLength httpGetLength2 httpGetPending httpGetReady httpGetRemaining httpGetState httpGetStatus httpGetSubField httpGetSubField2 httpGetVersion httpGets httpHead httpInitialize httpIsChunked httpIsEncrypted httpLoadCredentials httpMD5 httpMD5Final httpMD5String httpOptions httpPeek httpPost httpPrintf httpPut httpRead httpRead2 httpReadRequest httpReconnect httpReconnect2 httpResolveHostname httpSaveCredentials httpSeparate httpSeparate2 httpSeparateURI httpSetAuthString httpSetCookie httpSetCredentials httpSetDefaultField httpSetExpect httpSetField httpSetKeepAlive httpSetLength httpSetTimeout httpShutdown httpStateString httpStatus httpTrace httpURIStatusString httpUpdate httpWait httpWrite httpWrite2 httpWriteResponse ippAddBoolean ippAddBooleans ippAddCollection ippAddCollections ippAddDate ippAddInteger ippAddIntegers ippAddOctetString ippAddOutOfBand ippAddRange ippAddRanges ippAddResolution ippAddResolutions ippAddSeparator ippAddString ippAddStringf ippAddStringfv ippAddStrings ippAttributeString ippContainsInteger ippContainsString ippCopyAttribute ippCopyAttributes ippCreateRequestedArray ippDateToTime ippDelete ippDeleteAttribute ippDeleteValues ippEnumString ippEnumValue ippErrorString ippErrorValue ippFindAttribute ippFindNextAttribute ippFirstAttribute ippGetBoolean ippGetCollection ippGetCount ippGetDate ippGetGroupTag ippGetInteger ippGetName ippGetOctetString ippGetOperation ippGetRange ippGetRequestId ippGetResolution ippGetState ippGetStatusCode ippGetString ippGetValueTag ippGetVersion ippLength ippNew ippNewRequest ippNewResponse ippNextAttribute ippOpString ippOpValue ippPort ippRead ippReadFile ippReadIO ippSetBoolean ippSetCollection ippSetDate ippSetGroupTag ippSetInteger ippSetName ippSetOctetString ippSetOperation ippSetPort ippSetRange ippSetRequestId ippSetResolution ippSetState ippSetStatusCode ippSetString ippSetStringf ippSetStringfv ippSetValueTag ippSetVersion ippStateString ippTagString ippTagValue ippTimeToDate ippValidateAttribute ippValidateAttributes ippWrite ippWriteFile ippWriteIO ppdClose ppdCollect ppdCollect2 ppdConflicts ppdEmit ppdEmitAfterOrder ppdEmitFd ppdEmitJCL ppdEmitJCLEnd ppdEmitString ppdErrorString ppdFindAttr ppdFindChoice ppdFindCustomOption ppdFindCustomParam ppdFindMarkedChoice ppdFindNextAttr ppdFindOption ppdFirstCustomParam ppdFirstOption ppdInstallableConflict ppdIsMarked ppdLastError ppdLocalize ppdLocalizeAttr ppdLocalizeIPPReason ppdLocalizeMarkerName ppdMarkDefaults ppdMarkOption ppdNextCustomParam ppdNextOption ppdOpen ppdOpen2 ppdOpenFd ppdOpenFile ppdPageLength ppdPageSize ppdPageSizeLimits ppdPageWidth ppdSetConformance pwgFormatSizeName pwgInitSize pwgMediaForLegacy pwgMediaForPPD pwgMediaForPWG pwgMediaForSize cups-2.3.1/cups/usersys.c000664 000765 000024 00000117437 13574721672 015447 0ustar00mikestaff000000 000000 /* * User, system, and password routines for CUPS. * * Copyright 2007-2019 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #ifdef _WIN32 # include #else # include # include # include #endif /* _WIN32 */ #ifdef __APPLE__ # include #endif /* __APPLE__ */ /* * Local constants... */ #ifdef __APPLE__ # if TARGET_OS_OSX # define kCUPSPrintingPrefs CFSTR("org.cups.PrintingPrefs") # define kPREFIX "" # else # define kCUPSPrintingPrefs CFSTR(".GlobalPreferences") # define kPREFIX "AirPrint" # endif /* TARGET_OS_OSX */ # define kDigestOptionsKey CFSTR(kPREFIX "DigestOptions") # define kUserKey CFSTR(kPREFIX "User") # define kUserAgentTokensKey CFSTR(kPREFIX "UserAgentTokens") # define kAllowAnyRootKey CFSTR(kPREFIX "AllowAnyRoot") # define kAllowExpiredCertsKey CFSTR(kPREFIX "AllowExpiredCerts") # define kEncryptionKey CFSTR(kPREFIX "Encryption") # define kGSSServiceNameKey CFSTR(kPREFIX "GSSServiceName") # define kSSLOptionsKey CFSTR(kPREFIX "SSLOptions") # define kTrustOnFirstUseKey CFSTR(kPREFIX "TrustOnFirstUse") # define kValidateCertsKey CFSTR(kPREFIX "ValidateCerts") /* Deprecated */ # define kAllowRC4 CFSTR(kPREFIX "AllowRC4") # define kAllowSSL3 CFSTR(kPREFIX "AllowSSL3") # define kAllowDH CFSTR(kPREFIX "AllowDH") #endif /* __APPLE__ */ #define _CUPS_PASSCHAR '*' /* Character that is echoed for password */ /* * Local types... */ typedef struct _cups_client_conf_s /**** client.conf config data ****/ { _cups_digestoptions_t digestoptions; /* DigestOptions values */ _cups_uatokens_t uatokens; /* UserAgentTokens values */ #ifdef HAVE_SSL int ssl_options, /* SSLOptions values */ ssl_min_version,/* Minimum SSL/TLS version */ ssl_max_version;/* Maximum SSL/TLS version */ #endif /* HAVE_SSL */ int trust_first, /* Trust on first use? */ any_root, /* Allow any (e.g., self-signed) root */ expired_certs, /* Allow expired certs */ validate_certs; /* Validate certificates */ http_encryption_t encryption; /* Encryption setting */ char user[65], /* User name */ server_name[256]; /* Server hostname */ #ifdef HAVE_GSSAPI char gss_service_name[32]; /* Kerberos service name */ #endif /* HAVE_GSSAPI */ } _cups_client_conf_t; /* * Local functions... */ #ifdef __APPLE__ static int cups_apple_get_boolean(CFStringRef key, int *value); static int cups_apple_get_string(CFStringRef key, char *value, size_t valsize); #endif /* __APPLE__ */ static int cups_boolean_value(const char *value); static void cups_finalize_client_conf(_cups_client_conf_t *cc); static void cups_init_client_conf(_cups_client_conf_t *cc); static void cups_read_client_conf(cups_file_t *fp, _cups_client_conf_t *cc); static void cups_set_default_ipp_port(_cups_globals_t *cg); static void cups_set_digestoptions(_cups_client_conf_t *cc, const char *value); static void cups_set_encryption(_cups_client_conf_t *cc, const char *value); #ifdef HAVE_GSSAPI static void cups_set_gss_service_name(_cups_client_conf_t *cc, const char *value); #endif /* HAVE_GSSAPI */ static void cups_set_server_name(_cups_client_conf_t *cc, const char *value); #ifdef HAVE_SSL static void cups_set_ssl_options(_cups_client_conf_t *cc, const char *value); #endif /* HAVE_SSL */ static void cups_set_uatokens(_cups_client_conf_t *cc, const char *value); static void cups_set_user(_cups_client_conf_t *cc, const char *value); /* * 'cupsEncryption()' - Get the current encryption settings. * * The default encryption setting comes from the CUPS_ENCRYPTION * environment variable, then the ~/.cups/client.conf file, and finally the * /etc/cups/client.conf file. If not set, the default is * @code HTTP_ENCRYPTION_IF_REQUESTED@. * * Note: The current encryption setting is tracked separately for each thread * in a program. Multi-threaded programs that override the setting via the * @link cupsSetEncryption@ function need to do so in each thread for the same * setting to be used. */ http_encryption_t /* O - Encryption settings */ cupsEncryption(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (cg->encryption == (http_encryption_t)-1) _cupsSetDefaults(); return (cg->encryption); } /* * 'cupsGetPassword()' - Get a password from the user. * * Uses the current password callback function. Returns @code NULL@ if the * user does not provide a password. * * Note: The current password callback function is tracked separately for each * thread in a program. Multi-threaded programs that override the setting via * the @link cupsSetPasswordCB@ or @link cupsSetPasswordCB2@ functions need to * do so in each thread for the same function to be used. * * @exclude all@ */ const char * /* O - Password */ cupsGetPassword(const char *prompt) /* I - Prompt string */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ return ((cg->password_cb)(prompt, NULL, NULL, NULL, cg->password_data)); } /* * 'cupsGetPassword2()' - Get a password from the user using the current * password callback. * * Uses the current password callback function. Returns @code NULL@ if the * user does not provide a password. * * Note: The current password callback function is tracked separately for each * thread in a program. Multi-threaded programs that override the setting via * the @link cupsSetPasswordCB2@ function need to do so in each thread for the * same function to be used. * * @since CUPS 1.4/macOS 10.6@ */ const char * /* O - Password */ cupsGetPassword2(const char *prompt, /* I - Prompt string */ http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *method, /* I - Request method ("GET", "POST", "PUT") */ const char *resource) /* I - Resource path */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (!http) http = _cupsConnect(); return ((cg->password_cb)(prompt, http, method, resource, cg->password_data)); } /* * 'cupsServer()' - Return the hostname/address of the current server. * * The default server comes from the CUPS_SERVER environment variable, then the * ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not * set, the default is the local system - either "localhost" or a domain socket * path. * * The returned value can be a fully-qualified hostname, a numeric IPv4 or IPv6 * address, or a domain socket pathname. * * Note: The current server is tracked separately for each thread in a program. * Multi-threaded programs that override the server via the * @link cupsSetServer@ function need to do so in each thread for the same * server to be used. */ const char * /* O - Server name */ cupsServer(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (!cg->server[0]) _cupsSetDefaults(); return (cg->server); } /* * 'cupsSetClientCertCB()' - Set the client certificate callback. * * Pass @code NULL@ to restore the default callback. * * Note: The current certificate callback is tracked separately for each thread * in a program. Multi-threaded programs that override the callback need to do * so in each thread for the same callback to be used. * * @since CUPS 1.5/macOS 10.7@ */ void cupsSetClientCertCB( cups_client_cert_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data pointer */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ cg->client_cert_cb = cb; cg->client_cert_data = user_data; } /* * 'cupsSetCredentials()' - Set the default credentials to be used for SSL/TLS * connections. * * Note: The default credentials are tracked separately for each thread in a * program. Multi-threaded programs that override the setting need to do so in * each thread for the same setting to be used. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - Status of call (0 = success) */ cupsSetCredentials( cups_array_t *credentials) /* I - Array of credentials */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (cupsArrayCount(credentials) < 1) return (-1); #ifdef HAVE_SSL _httpFreeCredentials(cg->tls_credentials); cg->tls_credentials = _httpCreateCredentials(credentials); #endif /* HAVE_SSL */ return (cg->tls_credentials ? 0 : -1); } /* * 'cupsSetEncryption()' - Set the encryption preference. * * The default encryption setting comes from the CUPS_ENCRYPTION * environment variable, then the ~/.cups/client.conf file, and finally the * /etc/cups/client.conf file. If not set, the default is * @code HTTP_ENCRYPTION_IF_REQUESTED@. * * Note: The current encryption setting is tracked separately for each thread * in a program. Multi-threaded programs that override the setting need to do * so in each thread for the same setting to be used. */ void cupsSetEncryption(http_encryption_t e) /* I - New encryption preference */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ cg->encryption = e; if (cg->http) httpEncryption(cg->http, e); } /* * 'cupsSetPasswordCB()' - Set the password callback for CUPS. * * Pass @code NULL@ to restore the default (console) password callback, which * reads the password from the console. Programs should call either this * function or @link cupsSetPasswordCB2@, as only one callback can be registered * by a program per thread. * * Note: The current password callback is tracked separately for each thread * in a program. Multi-threaded programs that override the callback need to do * so in each thread for the same callback to be used. * * @exclude all@ */ void cupsSetPasswordCB(cups_password_cb_t cb)/* I - Callback function */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (cb == (cups_password_cb_t)0) cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; else cg->password_cb = (cups_password_cb2_t)cb; cg->password_data = NULL; } /* * 'cupsSetPasswordCB2()' - Set the advanced password callback for CUPS. * * Pass @code NULL@ to restore the default (console) password callback, which * reads the password from the console. Programs should call either this * function or @link cupsSetPasswordCB2@, as only one callback can be registered * by a program per thread. * * Note: The current password callback is tracked separately for each thread * in a program. Multi-threaded programs that override the callback need to do * so in each thread for the same callback to be used. * * @since CUPS 1.4/macOS 10.6@ */ void cupsSetPasswordCB2( cups_password_cb2_t cb, /* I - Callback function */ void *user_data) /* I - User data pointer */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (cb == (cups_password_cb2_t)0) cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; else cg->password_cb = cb; cg->password_data = user_data; } /* * 'cupsSetServer()' - Set the default server name and port. * * The "server" string can be a fully-qualified hostname, a numeric * IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP * addresses can be optionally followed by a colon and port number to override * the default port 631, e.g. "hostname:8631". Pass @code NULL@ to restore the * default server name and port. * * Note: The current server is tracked separately for each thread in a program. * Multi-threaded programs that override the server need to do so in each * thread for the same server to be used. */ void cupsSetServer(const char *server) /* I - Server name */ { char *options, /* Options */ *port; /* Pointer to port */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (server) { strlcpy(cg->server, server, sizeof(cg->server)); if (cg->server[0] != '/' && (options = strrchr(cg->server, '/')) != NULL) { *options++ = '\0'; if (!strcmp(options, "version=1.0")) cg->server_version = 10; else if (!strcmp(options, "version=1.1")) cg->server_version = 11; else if (!strcmp(options, "version=2.0")) cg->server_version = 20; else if (!strcmp(options, "version=2.1")) cg->server_version = 21; else if (!strcmp(options, "version=2.2")) cg->server_version = 22; } else cg->server_version = 20; if (cg->server[0] != '/' && (port = strrchr(cg->server, ':')) != NULL && !strchr(port, ']') && isdigit(port[1] & 255)) { *port++ = '\0'; cg->ipp_port = atoi(port); } if (!cg->ipp_port) cups_set_default_ipp_port(cg); if (cg->server[0] == '/') strlcpy(cg->servername, "localhost", sizeof(cg->servername)); else strlcpy(cg->servername, cg->server, sizeof(cg->servername)); } else { cg->server[0] = '\0'; cg->servername[0] = '\0'; cg->server_version = 20; cg->ipp_port = 0; } if (cg->http) { httpClose(cg->http); cg->http = NULL; } } /* * 'cupsSetServerCertCB()' - Set the server certificate callback. * * Pass @code NULL@ to restore the default callback. * * Note: The current credentials callback is tracked separately for each thread * in a program. Multi-threaded programs that override the callback need to do * so in each thread for the same callback to be used. * * @since CUPS 1.5/macOS 10.7@ */ void cupsSetServerCertCB( cups_server_cert_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data pointer */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ cg->server_cert_cb = cb; cg->server_cert_data = user_data; } /* * 'cupsSetUser()' - Set the default user name. * * Pass @code NULL@ to restore the default user name. * * Note: The current user name is tracked separately for each thread in a * program. Multi-threaded programs that override the user name need to do so * in each thread for the same user name to be used. */ void cupsSetUser(const char *user) /* I - User name */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (user) strlcpy(cg->user, user, sizeof(cg->user)); else cg->user[0] = '\0'; } /* * 'cupsSetUserAgent()' - Set the default HTTP User-Agent string. * * Setting the string to NULL forces the default value containing the CUPS * version, IPP version, and operating system version and architecture. * * @since CUPS 1.7/macOS 10.9@ */ void cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@ */ { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ #ifdef _WIN32 SYSTEM_INFO sysinfo; /* System information */ OSVERSIONINFOA version; /* OS version info */ const char *machine; /* Hardware/machine name */ #elif defined(__APPLE__) struct utsname name; /* uname info */ char version[256]; /* macOS/iOS version */ size_t len; /* Length of value */ #else struct utsname name; /* uname info */ #endif /* _WIN32 */ if (user_agent) { strlcpy(cg->user_agent, user_agent, sizeof(cg->user_agent)); return; } if (cg->uatokens < _CUPS_UATOKENS_OS) { switch (cg->uatokens) { default : case _CUPS_UATOKENS_NONE : cg->user_agent[0] = '\0'; break; case _CUPS_UATOKENS_PRODUCT_ONLY : strlcpy(cg->user_agent, "CUPS IPP", sizeof(cg->user_agent)); break; case _CUPS_UATOKENS_MAJOR : snprintf(cg->user_agent, sizeof(cg->user_agent), "CUPS/%d IPP/2", CUPS_VERSION_MAJOR); break; case _CUPS_UATOKENS_MINOR : snprintf(cg->user_agent, sizeof(cg->user_agent), "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR); break; case _CUPS_UATOKENS_MINIMAL : strlcpy(cg->user_agent, CUPS_MINIMAL " IPP/2.1", sizeof(cg->user_agent)); break; } } #ifdef _WIN32 /* * Gather Windows version information for the User-Agent string... */ version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionExA(&version); GetNativeSystemInfo(&sysinfo); switch (sysinfo.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64 : machine = "amd64"; break; case PROCESSOR_ARCHITECTURE_ARM : machine = "arm"; break; case PROCESSOR_ARCHITECTURE_IA64 : machine = "ia64"; break; case PROCESSOR_ARCHITECTURE_INTEL : machine = "intel"; break; default : machine = "unknown"; break; } if (cg->uatokens == _CUPS_UATOKENS_OS) snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (Windows %d.%d) IPP/2.0", version.dwMajorVersion, version.dwMinorVersion); else snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0", version.dwMajorVersion, version.dwMinorVersion, machine); #elif defined(__APPLE__) /* * Gather macOS/iOS version information for the User-Agent string... */ uname(&name); len = sizeof(version) - 1; if (!sysctlbyname("kern.osproductversion", version, &len, NULL, 0)) version[len] = '\0'; else strlcpy(version, "unknown", sizeof(version)); # if TARGET_OS_OSX if (cg->uatokens == _CUPS_UATOKENS_OS) snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (macOS %s) IPP/2.0", version); else snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (macOS %s; %s) IPP/2.0", version, name.machine); # else if (cg->uatokens == _CUPS_UATOKENS_OS) snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (iOS %s) IPP/2.0", version); else snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (iOS %s; %s) IPP/2.0", version, name.machine); # endif /* TARGET_OS_OSX */ #else /* * Gather generic UNIX version information for the User-Agent string... */ uname(&name); if (cg->uatokens == _CUPS_UATOKENS_OS) snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (%s %s) IPP/2.0", name.sysname, name.release); else snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (%s %s; %s) IPP/2.0", name.sysname, name.release, name.machine); #endif /* _WIN32 */ } /* * 'cupsUser()' - Return the current user's name. * * Note: The current user name is tracked separately for each thread in a * program. Multi-threaded programs that override the user name with the * @link cupsSetUser@ function need to do so in each thread for the same user * name to be used. */ const char * /* O - User name */ cupsUser(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (!cg->user[0]) _cupsSetDefaults(); return (cg->user); } /* * 'cupsUserAgent()' - Return the default HTTP User-Agent string. * * @since CUPS 1.7/macOS 10.9@ */ const char * /* O - User-Agent string */ cupsUserAgent(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ if (!cg->user_agent[0]) cupsSetUserAgent(NULL); return (cg->user_agent); } /* * '_cupsGetPassword()' - Get a password from the user. */ const char * /* O - Password or @code NULL@ if none */ _cupsGetPassword(const char *prompt) /* I - Prompt string */ { #ifdef _WIN32 HANDLE tty; /* Console handle */ DWORD mode; /* Console mode */ char passch, /* Current key press */ *passptr, /* Pointer into password string */ *passend; /* End of password string */ DWORD passbytes; /* Bytes read */ _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ /* * Disable input echo and set raw input... */ if ((tty = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) return (NULL); if (!GetConsoleMode(tty, &mode)) return (NULL); if (!SetConsoleMode(tty, 0)) return (NULL); /* * Display the prompt... */ printf("%s ", prompt); fflush(stdout); /* * Read the password string from /dev/tty until we get interrupted or get a * carriage return or newline... */ passptr = cg->password; passend = cg->password + sizeof(cg->password) - 1; while (ReadFile(tty, &passch, 1, &passbytes, NULL)) { if (passch == 0x0A || passch == 0x0D) { /* * Enter/return... */ break; } else if (passch == 0x08 || passch == 0x7F) { /* * Backspace/delete (erase character)... */ if (passptr > cg->password) { passptr --; fputs("\010 \010", stdout); } else putchar(0x07); } else if (passch == 0x15) { /* * CTRL+U (erase line) */ if (passptr > cg->password) { while (passptr > cg->password) { passptr --; fputs("\010 \010", stdout); } } else putchar(0x07); } else if (passch == 0x03) { /* * CTRL+C... */ passptr = cg->password; break; } else if ((passch & 255) < 0x20 || passptr >= passend) putchar(0x07); else { *passptr++ = passch; putchar(_CUPS_PASSCHAR); } fflush(stdout); } putchar('\n'); fflush(stdout); /* * Cleanup... */ SetConsoleMode(tty, mode); /* * Return the proper value... */ if (passbytes == 1 && passptr > cg->password) { *passptr = '\0'; return (cg->password); } else { memset(cg->password, 0, sizeof(cg->password)); return (NULL); } #else int tty; /* /dev/tty - never read from stdin */ struct termios original, /* Original input mode */ noecho; /* No echo input mode */ char passch, /* Current key press */ *passptr, /* Pointer into password string */ *passend; /* End of password string */ ssize_t passbytes; /* Bytes read */ _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ /* * Disable input echo and set raw input... */ if ((tty = open("/dev/tty", O_RDONLY)) < 0) return (NULL); if (tcgetattr(tty, &original)) { close(tty); return (NULL); } noecho = original; noecho.c_lflag &= (tcflag_t)~(ICANON | ECHO | ECHOE | ISIG); noecho.c_cc[VMIN] = 1; noecho.c_cc[VTIME] = 0; if (tcsetattr(tty, TCSAFLUSH, &noecho)) { close(tty); return (NULL); } /* * Display the prompt... */ printf("%s ", prompt); fflush(stdout); /* * Read the password string from /dev/tty until we get interrupted or get a * carriage return or newline... */ passptr = cg->password; passend = cg->password + sizeof(cg->password) - 1; while ((passbytes = read(tty, &passch, 1)) == 1) { if (passch == noecho.c_cc[VEOL] || # ifdef VEOL2 passch == noecho.c_cc[VEOL2] || # endif /* VEOL2 */ passch == 0x0A || passch == 0x0D) { /* * Enter/return... */ break; } else if (passch == noecho.c_cc[VERASE] || passch == 0x08 || passch == 0x7F) { /* * Backspace/delete (erase character)... */ if (passptr > cg->password) { passptr --; fputs("\010 \010", stdout); } else putchar(0x07); } else if (passch == noecho.c_cc[VKILL]) { /* * CTRL+U (erase line) */ if (passptr > cg->password) { while (passptr > cg->password) { passptr --; fputs("\010 \010", stdout); } } else putchar(0x07); } else if (passch == noecho.c_cc[VINTR] || passch == noecho.c_cc[VQUIT] || passch == noecho.c_cc[VEOF]) { /* * CTRL+C, CTRL+D, or CTRL+Z... */ passptr = cg->password; break; } else if ((passch & 255) < 0x20 || passptr >= passend) putchar(0x07); else { *passptr++ = passch; putchar(_CUPS_PASSCHAR); } fflush(stdout); } putchar('\n'); fflush(stdout); /* * Cleanup... */ tcsetattr(tty, TCSAFLUSH, &original); close(tty); /* * Return the proper value... */ if (passbytes == 1 && passptr > cg->password) { *passptr = '\0'; return (cg->password); } else { memset(cg->password, 0, sizeof(cg->password)); return (NULL); } #endif /* _WIN32 */ } #ifdef HAVE_GSSAPI /* * '_cupsGSSServiceName()' - Get the GSS (Kerberos) service name. */ const char * _cupsGSSServiceName(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ if (!cg->gss_service_name[0]) _cupsSetDefaults(); return (cg->gss_service_name); } #endif /* HAVE_GSSAPI */ /* * '_cupsSetDefaults()' - Set the default server, port, and encryption. */ void _cupsSetDefaults(void) { cups_file_t *fp; /* File */ char filename[1024]; /* Filename */ _cups_client_conf_t cc; /* client.conf values */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_puts("_cupsSetDefaults()"); /* * Load initial client.conf values... */ cups_init_client_conf(&cc); /* * Read the /etc/cups/client.conf and ~/.cups/client.conf files, if * present. */ snprintf(filename, sizeof(filename), "%s/client.conf", cg->cups_serverroot); if ((fp = cupsFileOpen(filename, "r")) != NULL) { cups_read_client_conf(fp, &cc); cupsFileClose(fp); } if (cg->home) { /* * Look for ~/.cups/client.conf... */ snprintf(filename, sizeof(filename), "%s/.cups/client.conf", cg->home); if ((fp = cupsFileOpen(filename, "r")) != NULL) { cups_read_client_conf(fp, &cc); cupsFileClose(fp); } } /* * Finalize things so every client.conf value is set... */ cups_finalize_client_conf(&cc); cg->uatokens = cc.uatokens; if (cg->encryption == (http_encryption_t)-1) cg->encryption = cc.encryption; if (!cg->server[0] || !cg->ipp_port) cupsSetServer(cc.server_name); if (!cg->ipp_port) cups_set_default_ipp_port(cg); if (!cg->user[0]) strlcpy(cg->user, cc.user, sizeof(cg->user)); #ifdef HAVE_GSSAPI if (!cg->gss_service_name[0]) strlcpy(cg->gss_service_name, cc.gss_service_name, sizeof(cg->gss_service_name)); #endif /* HAVE_GSSAPI */ if (cg->trust_first < 0) cg->trust_first = cc.trust_first; if (cg->any_root < 0) cg->any_root = cc.any_root; if (cg->expired_certs < 0) cg->expired_certs = cc.expired_certs; if (cg->validate_certs < 0) cg->validate_certs = cc.validate_certs; #ifdef HAVE_SSL _httpTLSSetOptions(cc.ssl_options | _HTTP_TLS_SET_DEFAULT, cc.ssl_min_version, cc.ssl_max_version); #endif /* HAVE_SSL */ } #ifdef __APPLE__ /* * 'cups_apple_get_boolean()' - Get a boolean setting from the CUPS preferences. */ static int /* O - 1 if set, 0 otherwise */ cups_apple_get_boolean( CFStringRef key, /* I - Key (name) */ int *value) /* O - Boolean value */ { Boolean bval, /* Preference value */ bval_set; /* Value is set? */ bval = CFPreferencesGetAppBooleanValue(key, kCUPSPrintingPrefs, &bval_set); if (bval_set) *value = (int)bval; return ((int)bval_set); } /* * 'cups_apple_get_string()' - Get a string setting from the CUPS preferences. */ static int /* O - 1 if set, 0 otherwise */ cups_apple_get_string( CFStringRef key, /* I - Key (name) */ char *value, /* O - String value */ size_t valsize) /* I - Size of value buffer */ { CFStringRef sval; /* String value */ if ((sval = CFPreferencesCopyAppValue(key, kCUPSPrintingPrefs)) != NULL) { Boolean result = CFStringGetCString(sval, value, (CFIndex)valsize, kCFStringEncodingUTF8); CFRelease(sval); if (result) return (1); } return (0); } #endif /* __APPLE__ */ /* * 'cups_boolean_value()' - Convert a string to a boolean value. */ static int /* O - Boolean value */ cups_boolean_value(const char *value) /* I - String value */ { return (!_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "true")); } /* * 'cups_finalize_client_conf()' - Finalize client.conf values. */ static void cups_finalize_client_conf( _cups_client_conf_t *cc) /* I - client.conf values */ { const char *value; /* Environment variable */ if ((value = getenv("CUPS_TRUSTFIRST")) != NULL) cc->trust_first = cups_boolean_value(value); if ((value = getenv("CUPS_ANYROOT")) != NULL) cc->any_root = cups_boolean_value(value); if ((value = getenv("CUPS_ENCRYPTION")) != NULL) cups_set_encryption(cc, value); if ((value = getenv("CUPS_EXPIREDCERTS")) != NULL) cc->expired_certs = cups_boolean_value(value); #ifdef HAVE_GSSAPI if ((value = getenv("CUPS_GSSSERVICENAME")) != NULL) cups_set_gss_service_name(cc, value); #endif /* HAVE_GSSAPI */ if ((value = getenv("CUPS_SERVER")) != NULL) cups_set_server_name(cc, value); if ((value = getenv("CUPS_USER")) != NULL) cups_set_user(cc, value); if ((value = getenv("CUPS_VALIDATECERTS")) != NULL) cc->validate_certs = cups_boolean_value(value); /* * Then apply defaults for those values that haven't been set... */ if (cc->trust_first < 0) cc->trust_first = 1; if (cc->any_root < 0) cc->any_root = 1; if (cc->encryption == (http_encryption_t)-1) cc->encryption = HTTP_ENCRYPTION_IF_REQUESTED; if (cc->expired_certs < 0) cc->expired_certs = 0; #ifdef HAVE_GSSAPI if (!cc->gss_service_name[0]) cups_set_gss_service_name(cc, CUPS_DEFAULT_GSSSERVICENAME); #endif /* HAVE_GSSAPI */ if (!cc->server_name[0]) { /* * If we are compiled with domain socket support, only use the * domain socket if it exists and has the right permissions... */ #if defined(__APPLE__) && !TARGET_OS_OSX cups_set_server_name(cc, "/private/var/run/printd"); #else # ifdef CUPS_DEFAULT_DOMAINSOCKET if (!access(CUPS_DEFAULT_DOMAINSOCKET, R_OK)) cups_set_server_name(cc, CUPS_DEFAULT_DOMAINSOCKET); else # endif /* CUPS_DEFAULT_DOMAINSOCKET */ cups_set_server_name(cc, "localhost"); #endif /* __APPLE__ && !TARGET_OS_OSX */ } if (!cc->user[0]) { #ifdef _WIN32 /* * Get the current user name from the OS... */ DWORD size; /* Size of string */ size = sizeof(cc->user); if (!GetUserNameA(cc->user, &size)) #else /* * Try the USER environment variable as the default username... */ const char *envuser = getenv("USER"); /* Default username */ struct passwd *pw = NULL; /* Account information */ if (envuser) { /* * Validate USER matches the current UID, otherwise don't allow it to * override things... This makes sure that printing after doing su * or sudo records the correct username. */ if ((pw = getpwnam(envuser)) != NULL && pw->pw_uid != getuid()) pw = NULL; } if (!pw) pw = getpwuid(getuid()); if (pw) strlcpy(cc->user, pw->pw_name, sizeof(cc->user)); else #endif /* _WIN32 */ { /* * Use the default "unknown" user name... */ strlcpy(cc->user, "unknown", sizeof(cc->user)); } } if (cc->validate_certs < 0) cc->validate_certs = 0; } /* * 'cups_init_client_conf()' - Initialize client.conf values. */ static void cups_init_client_conf( _cups_client_conf_t *cc) /* I - client.conf values */ { /* * Clear all values to "not set"... */ memset(cc, 0, sizeof(_cups_client_conf_t)); cc->uatokens = _CUPS_UATOKENS_MINIMAL; #if defined(__APPLE__) && !TARGET_OS_OSX cups_set_user(cc, "mobile"); #endif /* __APPLE__ && !TARGET_OS_OSX */ #ifdef HAVE_SSL cc->ssl_min_version = _HTTP_TLS_1_0; cc->ssl_max_version = _HTTP_TLS_MAX; #endif /* HAVE_SSL */ cc->encryption = (http_encryption_t)-1; cc->trust_first = -1; cc->any_root = -1; cc->expired_certs = -1; cc->validate_certs = -1; /* * Load settings from the org.cups.PrintingPrefs plist (which trump * everything...) */ #if defined(__APPLE__) char sval[1024]; /* String value */ # ifdef HAVE_SSL int bval; /* Boolean value */ if (cups_apple_get_boolean(kAllowAnyRootKey, &bval)) cc->any_root = bval; if (cups_apple_get_boolean(kAllowExpiredCertsKey, &bval)) cc->expired_certs = bval; if (cups_apple_get_string(kEncryptionKey, sval, sizeof(sval))) cups_set_encryption(cc, sval); if (cups_apple_get_string(kSSLOptionsKey, sval, sizeof(sval))) { cups_set_ssl_options(cc, sval); } else { sval[0] = '\0'; if (cups_apple_get_boolean(kAllowRC4, &bval) && bval) strlcat(sval, " AllowRC4", sizeof(sval)); if (cups_apple_get_boolean(kAllowSSL3, &bval) && bval) strlcat(sval, " AllowSSL3", sizeof(sval)); if (cups_apple_get_boolean(kAllowDH, &bval) && bval) strlcat(sval, " AllowDH", sizeof(sval)); if (sval[0]) cups_set_ssl_options(cc, sval); } if (cups_apple_get_boolean(kTrustOnFirstUseKey, &bval)) cc->trust_first = bval; if (cups_apple_get_boolean(kValidateCertsKey, &bval)) cc->validate_certs = bval; # endif /* HAVE_SSL */ if (cups_apple_get_string(kDigestOptionsKey, sval, sizeof(sval))) cups_set_digestoptions(cc, sval); if (cups_apple_get_string(kUserKey, sval, sizeof(sval))) strlcpy(cc->user, sval, sizeof(cc->user)); if (cups_apple_get_string(kUserAgentTokensKey, sval, sizeof(sval))) cups_set_uatokens(cc, sval); #endif /* __APPLE__ */ } /* * 'cups_read_client_conf()' - Read a client.conf file. */ static void cups_read_client_conf( cups_file_t *fp, /* I - File to read */ _cups_client_conf_t *cc) /* I - client.conf values */ { int linenum; /* Current line number */ char line[1024], /* Line from file */ *value; /* Pointer into line */ /* * Read from the file... */ linenum = 0; while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { if (!_cups_strcasecmp(line, "DigestOptions") && value) cups_set_digestoptions(cc, value); else if (!_cups_strcasecmp(line, "Encryption") && value) cups_set_encryption(cc, value); #ifndef __APPLE__ /* * The ServerName directive is not supported on macOS due to app * sandboxing restrictions, i.e. not all apps request network access. */ else if (!_cups_strcasecmp(line, "ServerName") && value) cups_set_server_name(cc, value); #endif /* !__APPLE__ */ else if (!_cups_strcasecmp(line, "User") && value) cups_set_user(cc, value); else if (!_cups_strcasecmp(line, "UserAgentTokens") && value) cups_set_uatokens(cc, value); else if (!_cups_strcasecmp(line, "TrustOnFirstUse") && value) cc->trust_first = cups_boolean_value(value); else if (!_cups_strcasecmp(line, "AllowAnyRoot") && value) cc->any_root = cups_boolean_value(value); else if (!_cups_strcasecmp(line, "AllowExpiredCerts") && value) cc->expired_certs = cups_boolean_value(value); else if (!_cups_strcasecmp(line, "ValidateCerts") && value) cc->validate_certs = cups_boolean_value(value); #ifdef HAVE_GSSAPI else if (!_cups_strcasecmp(line, "GSSServiceName") && value) cups_set_gss_service_name(cc, value); #endif /* HAVE_GSSAPI */ #ifdef HAVE_SSL else if (!_cups_strcasecmp(line, "SSLOptions") && value) cups_set_ssl_options(cc, value); #endif /* HAVE_SSL */ } } /* * 'cups_set_default_ipp_port()' - Set the default IPP port value. */ static void cups_set_default_ipp_port( _cups_globals_t *cg) /* I - Global data */ { const char *ipp_port; /* IPP_PORT environment variable */ if ((ipp_port = getenv("IPP_PORT")) != NULL) { if ((cg->ipp_port = atoi(ipp_port)) <= 0) cg->ipp_port = CUPS_DEFAULT_IPP_PORT; } else cg->ipp_port = CUPS_DEFAULT_IPP_PORT; } /* * 'cups_set_digestoptions()' - Set the DigestOptions value. */ static void cups_set_digestoptions( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { if (!_cups_strcasecmp(value, "DenyMD5")) cc->digestoptions = _CUPS_DIGESTOPTIONS_DENYMD5; else if (!_cups_strcasecmp(value, "None")) cc->digestoptions = _CUPS_DIGESTOPTIONS_NONE; } /* * 'cups_set_encryption()' - Set the Encryption value. */ static void cups_set_encryption( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { if (!_cups_strcasecmp(value, "never")) cc->encryption = HTTP_ENCRYPTION_NEVER; else if (!_cups_strcasecmp(value, "always")) cc->encryption = HTTP_ENCRYPTION_ALWAYS; else if (!_cups_strcasecmp(value, "required")) cc->encryption = HTTP_ENCRYPTION_REQUIRED; else cc->encryption = HTTP_ENCRYPTION_IF_REQUESTED; } /* * 'cups_set_gss_service_name()' - Set the GSSServiceName value. */ #ifdef HAVE_GSSAPI static void cups_set_gss_service_name( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { strlcpy(cc->gss_service_name, value, sizeof(cc->gss_service_name)); } #endif /* HAVE_GSSAPI */ /* * 'cups_set_server_name()' - Set the ServerName value. */ static void cups_set_server_name( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { strlcpy(cc->server_name, value, sizeof(cc->server_name)); } /* * 'cups_set_ssl_options()' - Set the SSLOptions value. */ #ifdef HAVE_SSL static void cups_set_ssl_options( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { /* * SSLOptions [AllowRC4] [AllowSSL3] [AllowDH] [DenyTLS1.0] [None] */ int options = _HTTP_TLS_NONE, /* SSL/TLS options */ min_version = _HTTP_TLS_1_0, /* Minimum SSL/TLS version */ max_version = _HTTP_TLS_MAX; /* Maximum SSL/TLS version */ char temp[256], /* Copy of value */ *start, /* Start of option */ *end; /* End of option */ strlcpy(temp, value, sizeof(temp)); for (start = temp; *start; start = end) { /* * Find end of keyword... */ end = start; while (*end && !_cups_isspace(*end)) end ++; if (*end) *end++ = '\0'; /* * Compare... */ if (!_cups_strcasecmp(start, "AllowRC4")) options |= _HTTP_TLS_ALLOW_RC4; else if (!_cups_strcasecmp(start, "AllowSSL3")) min_version = _HTTP_TLS_SSL3; else if (!_cups_strcasecmp(start, "AllowDH")) options |= _HTTP_TLS_ALLOW_DH; else if (!_cups_strcasecmp(start, "DenyCBC")) options |= _HTTP_TLS_DENY_CBC; else if (!_cups_strcasecmp(start, "DenyTLS1.0")) min_version = _HTTP_TLS_1_1; else if (!_cups_strcasecmp(start, "MaxTLS1.0")) max_version = _HTTP_TLS_1_0; else if (!_cups_strcasecmp(start, "MaxTLS1.1")) max_version = _HTTP_TLS_1_1; else if (!_cups_strcasecmp(start, "MaxTLS1.2")) max_version = _HTTP_TLS_1_2; else if (!_cups_strcasecmp(start, "MaxTLS1.3")) max_version = _HTTP_TLS_1_3; else if (!_cups_strcasecmp(start, "MinTLS1.0")) min_version = _HTTP_TLS_1_0; else if (!_cups_strcasecmp(start, "MinTLS1.1")) min_version = _HTTP_TLS_1_1; else if (!_cups_strcasecmp(start, "MinTLS1.2")) min_version = _HTTP_TLS_1_2; else if (!_cups_strcasecmp(start, "MinTLS1.3")) min_version = _HTTP_TLS_1_3; else if (!_cups_strcasecmp(start, "None")) options = _HTTP_TLS_NONE; } cc->ssl_options = options; cc->ssl_max_version = max_version; cc->ssl_min_version = min_version; DEBUG_printf(("4cups_set_ssl_options(cc=%p, value=\"%s\") options=%x, min_version=%d, max_version=%d", (void *)cc, value, options, min_version, max_version)); } #endif /* HAVE_SSL */ /* * 'cups_set_uatokens()' - Set the UserAgentTokens value. */ static void cups_set_uatokens( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { int i; /* Looping var */ static const char * const uatokens[] =/* UserAgentTokens values */ { "NONE", "PRODUCTONLY", "MAJOR", "MINOR", "MINIMAL", "OS", "FULL" }; for (i = 0; i < (int)(sizeof(uatokens) / sizeof(uatokens[0])); i ++) { if (!_cups_strcasecmp(value, uatokens[i])) { cc->uatokens = (_cups_uatokens_t)i; return; } } } /* * 'cups_set_user()' - Set the User value. */ static void cups_set_user( _cups_client_conf_t *cc, /* I - client.conf values */ const char *value) /* I - Value */ { strlcpy(cc->user, value, sizeof(cc->user)); } cups-2.3.1/cups/ppd-custom.c000664 000765 000024 00000004153 13574721672 016013 0ustar00mikestaff000000 000000 /* * PPD custom option routines for CUPS. * * Copyright 2007-2015 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers. */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * 'ppdFindCustomOption()' - Find a custom option. * * @since CUPS 1.2/macOS 10.5@ */ ppd_coption_t * /* O - Custom option or NULL */ ppdFindCustomOption(ppd_file_t *ppd, /* I - PPD file */ const char *keyword)/* I - Custom option name */ { ppd_coption_t key; /* Custom option search key */ if (!ppd) return (NULL); strlcpy(key.keyword, keyword, sizeof(key.keyword)); return ((ppd_coption_t *)cupsArrayFind(ppd->coptions, &key)); } /* * 'ppdFindCustomParam()' - Find a parameter for a custom option. * * @since CUPS 1.2/macOS 10.5@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ ppdFindCustomParam(ppd_coption_t *opt, /* I - Custom option */ const char *name) /* I - Parameter name */ { ppd_cparam_t *param; /* Current custom parameter */ if (!opt) return (NULL); for (param = (ppd_cparam_t *)cupsArrayFirst(opt->params); param; param = (ppd_cparam_t *)cupsArrayNext(opt->params)) if (!_cups_strcasecmp(param->name, name)) break; return (param); } /* * 'ppdFirstCustomParam()' - Return the first parameter for a custom option. * * @since CUPS 1.2/macOS 10.5@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ ppdFirstCustomParam(ppd_coption_t *opt) /* I - Custom option */ { if (!opt) return (NULL); return ((ppd_cparam_t *)cupsArrayFirst(opt->params)); } /* * 'ppdNextCustomParam()' - Return the next parameter for a custom option. * * @since CUPS 1.2/macOS 10.5@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ ppdNextCustomParam(ppd_coption_t *opt) /* I - Custom option */ { if (!opt) return (NULL); return ((ppd_cparam_t *)cupsArrayNext(opt->params)); } cups-2.3.1/cups/backend.h000664 000765 000024 00000003073 13574721672 015314 0ustar00mikestaff000000 000000 /* * Backend definitions for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_BACKEND_H_ # define _CUPS_BACKEND_H_ /* * Include necessary headers... */ # include "versioning.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ enum cups_backend_e /**** Backend exit codes ****/ { CUPS_BACKEND_OK = 0, /* Job completed successfully */ CUPS_BACKEND_FAILED = 1, /* Job failed, use error-policy */ CUPS_BACKEND_AUTH_REQUIRED = 2, /* Job failed, authentication required */ CUPS_BACKEND_HOLD = 3, /* Job failed, hold job */ CUPS_BACKEND_STOP = 4, /* Job failed, stop queue */ CUPS_BACKEND_CANCEL = 5, /* Job failed, cancel job */ CUPS_BACKEND_RETRY = 6, /* Job failed, retry this job later */ CUPS_BACKEND_RETRY_CURRENT = 7 /* Job failed, retry this job immediately */ }; typedef enum cups_backend_e cups_backend_t; /**** Backend exit codes ****/ /* * Prototypes... */ extern const char *cupsBackendDeviceURI(char **argv) _CUPS_API_1_2; extern void cupsBackendReport(const char *device_scheme, const char *device_uri, const char *device_make_and_model, const char *device_info, const char *device_id, const char *device_location) _CUPS_API_1_4; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_BACKEND_H_ */ cups-2.3.1/cups/Makefile000664 000765 000024 00000037717 13574721672 015230 0ustar00mikestaff000000 000000 # # Library Makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2006 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs # # Object files... # COREOBJS = \ array.o \ auth.o \ debug.o \ dest.o \ dest-job.o \ dest-localization.o \ dest-options.o \ dir.o \ encode.o \ file.o \ getputfile.o \ globals.o \ hash.o \ http.o \ http-addr.o \ http-addrlist.o \ http-support.o \ ipp.o \ ipp-file.o \ ipp-vars.o \ ipp-support.o \ langprintf.o \ language.o \ md5.o \ md5passwd.o \ notify.o \ options.o \ pwg-media.o \ raster-error.o \ raster-stream.o \ raster-stubs.o \ request.o \ snprintf.o \ string.o \ tempfile.o \ thread.o \ tls.o \ transcode.o \ usersys.o \ util.o DRIVEROBJS = \ adminutil.o \ backchannel.o \ backend.o \ getdevices.o \ getifaddrs.o \ ppd.o \ ppd-attr.o \ ppd-cache.o \ ppd-conflicts.o \ ppd-custom.o \ ppd-emit.o \ ppd-localize.o \ ppd-mark.o \ ppd-page.o \ ppd-util.o \ raster-interpret.o \ raster-interstub.o \ sidechannel.o \ snmp.o LIBOBJS = \ $(LIBCUPSOBJS) IMAGEOBJS = \ raster-interstub.o \ raster-stubs.o TESTOBJS = \ rasterbench.o \ testadmin.o \ testarray.o \ testcache.o \ testclient.o \ testconflicts.o \ testcreds.o \ testcups.o \ testdest.o \ testfile.o \ testgetdests.o \ testhttp.o \ testi18n.o \ testipp.o \ testoptions.o \ testlang.o \ testppd.o \ testpwg.o \ testraster.o \ testsnmp.o \ testthreads.o \ tlscheck.o OBJS = \ $(LIBOBJS) \ $(IMAGEOBJS) \ $(TESTOBJS) # # Header files to install... # COREHEADERS = \ array.h \ cups.h \ dir.h \ file.h \ http.h \ ipp.h \ language.h \ pwg.h \ raster.h \ transcode.h \ versioning.h DRIVERHEADERS = \ adminutil.h \ backend.h \ ppd.h \ sidechannel.h HEADERS = \ $(LIBHEADERS) COREHEADERSPRIV = \ array-private.h \ cups-private.h \ debug-private.h \ file-private.h \ http-private.h \ ipp-private.h \ language-private.h \ pwg-private.h \ raster-private.h \ string-private.h \ thread-private.h DRIVERHEADERSPRIV = \ ppd-private.h \ snmp-private.h HEADERSPRIV = \ $(LIBHEADERSPRIV) # # Targets in this directory... # LIBTARGETS = \ $(LIBCUPSIMAGE) \ $(LIBCUPSSTATIC) \ $(LIBCUPS) \ libcupsimage.a UNITTARGETS = \ rasterbench \ testadmin \ testarray \ testcache \ testclient \ testconflicts \ testcreds \ testcups \ testdest \ testfile \ testgetdests \ testhttp \ testi18n \ testipp \ testlang \ testoptions \ testppd \ testpwg \ testraster \ testsnmp \ testthreads \ tlscheck TARGETS = \ $(LIBTARGETS) # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: $(LIBTARGETS) # # Make unit tests... # unittests: $(UNITTARGETS) # # Remove object and target files... # clean: $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) $(RM) libcups.so libcups.dylib $(RM) libcupsimage.so libcupsimage.dylib # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Run oclint to check code coverage... # oclint: oclint -o=oclint.html -html $(LIBOBJS:.o=.c) -- $(ALL_CFLAGS) # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: # # Install headers... # install-headers: echo Installing header files into $(INCLUDEDIR)/cups... $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups for file in $(HEADERS); do \ $(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \ done if test "x$(privateinclude)" != x; then \ echo Installing private header files into $(PRIVATEINCLUDE)...; \ $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ for file in $(HEADERSPRIV); do \ $(INSTALL_DATA) $$file $(PRIVATEINCLUDE)/$$file; \ done; \ fi # # Install libraries... # install-libs: $(LIBTARGETS) $(INSTALLSTATIC) echo Installing libraries in $(LIBDIR)... $(INSTALL_DIR) -m 755 $(LIBDIR) $(INSTALL_LIB) $(LIBCUPS) $(LIBDIR) if test $(LIBCUPS) = "libcups.so.2"; then \ $(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ $(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ fi if test $(LIBCUPS) = "libcups.2.dylib"; then \ $(RM) $(LIBDIR)/libcups.dylib; \ $(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \ fi -if test "x$(LIBCUPSIMAGE)" != x; then \ $(INSTALL_LIB) $(LIBCUPSIMAGE) $(LIBDIR); \ fi -if test "x$(LIBCUPSIMAGE)" = "xlibcupsimage.so.2"; then \ $(RM) $(LIBDIR)/`basename $(LIBCUPSIMAGE) .2`; \ $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/`basename $(LIBCUPSIMAGE) .2`; \ fi -if test "x$(LIBCUPSIMAGE)" = "xlibcupsimage.2.dylib"; then \ $(RM) $(LIBDIR)/libcupsimage.dylib; \ $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/libcupsimage.dylib; \ fi if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ cp $(LIBCUPS) $(SYMROOT); \ dsymutil $(SYMROOT)/$(LIBCUPS); \ if test "x$(LIBCUPSIMAGE)" != x; then \ cp $(LIBCUPSIMAGE) $(SYMROOT); \ dsymutil $(SYMROOT)/$(LIBCUPSIMAGE); \ fi; \ fi installstatic: $(INSTALL_DIR) -m 755 $(LIBDIR) $(INSTALL_LIB) -m 755 $(LIBCUPSSTATIC) $(LIBDIR) $(RANLIB) $(LIBDIR)/$(LIBCUPSSTATIC) $(CHMOD) 555 $(LIBDIR)/$(LIBCUPSSTATIC) $(INSTALL_LIB) -m 755 libcupsimage.a $(LIBDIR) $(RANLIB) $(LIBDIR)/libcupsimage.a $(CHMOD) 555 $(LIBDIR)/libcupsimage.a # # Uninstall object and target files... # uninstall: $(RM) $(LIBDIR)/libcups.2.dylib $(RM) $(LIBDIR)/libcups.a $(RM) $(LIBDIR)/libcups.dylib $(RM) $(LIBDIR)/libcups.so $(RM) $(LIBDIR)/libcups.so.2 $(RM) $(LIBDIR)/libcupsimage.2.dylib $(RM) $(LIBDIR)/libcupsimage.a $(RM) $(LIBDIR)/libcupsimage.dylib $(RM) $(LIBDIR)/libcupsimage.so $(RM) $(LIBDIR)/libcupsimage.so.2 -$(RMDIR) $(LIBDIR) for file in $(HEADERS); do \ $(RM) $(INCLUDEDIR)/cups/$$file; \ done -$(RMDIR) $(INCLUDEDIR)/cups if test "x$(privateinclude)" != x; then \ for file in $(HEADERSPRIV); do \ $(RM) $(PRIVATEINCLUDE)/cups/$$file; \ done $(RMDIR) $(PRIVATEINCLUDE)/cups; \ fi # # libcups.so.2 # libcups.so.2: $(LIBOBJS) echo Linking $@... $(DSO) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) $(RM) `basename $@ .2` $(LN) $@ `basename $@ .2` # # libcups.2.dylib # libcups.2.dylib: $(LIBOBJS) echo Linking $@... $(DSO) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ \ -install_name $(libdir)/$@ \ -current_version 2.14.0 \ -compatibility_version 2.0.0 \ $(LIBOBJS) $(LIBS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ $(RM) libcups.dylib $(LN) $@ libcups.dylib # # libcups.la # libcups.la: $(LIBOBJS) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \ -rpath $(LIBDIR) -version-info 2:14 $(LIBS) # # libcups.a # libcups.a: $(LIBOBJS) echo Archiving $@... $(RM) $@ $(AR) $(ARFLAGS) $@ $(LIBOBJS) $(RANLIB) $@ # # libcups2.def (Windows DLL exports file...) # libcups2.def: $(LIBOBJS) $(IMAGEOBJS) Makefile echo Generating $@... echo "LIBRARY libcups2" >libcups2.def echo "VERSION 2.14" >>libcups2.def echo "EXPORTS" >>libcups2.def (nm $(LIBOBJS) $(IMAGEOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}'; \ echo __cups_strcpy; echo __cups_strlcat; echo __cups_strlcpy; \ echo __cups_snprintf; echo __cups_vsnprintf; echo __cups_gettimeofday) | \ grep -v -E \ -e 'cups_debug|Apple|BackChannel|Backend|FileCheck|Filter|GSSService|SetNegotiate|SideChannel|SNMP' \ -e 'Block$$' | \ sed -e '1,$$s/^_//' | sort >>libcups2.def # # libcupsimage.so.2 # libcupsimage.so.2: $(IMAGEOBJS) libcups.so.2 echo Linking $@... $(DSO) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ $(IMAGEOBJS) $(LINKCUPS) $(RM) `basename $@ .2` $(LN) $@ `basename $@ .2` # # libcupsimage.2.dylib # libcupsimage.2.dylib: $(IMAGEOBJS) libcups.2.dylib echo Linking $@... $(DSO) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ \ -install_name $(libdir)/$@ \ -current_version 2.3.0 \ -compatibility_version 2.0.0 \ $(IMAGEOBJS) $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ $(RM) libcupsimage.dylib $(LN) $@ libcupsimage.dylib # # libcupsimage.la # libcupsimage.la: $(IMAGEOBJS) libcups.la echo Linking $@... $(DSO) $(ARCHFLAGS) $(ALL_DSOFLAGS) -o $@ $(IMAGEOBJS:.o=.lo) \ $(LINKCUPS) -rpath $(LIBDIR) -version-info 2:3 # # libcupsimage.a # libcupsimage.a: $(IMAGEOBJS) echo Archiving $@... $(RM) $@ $(AR) $(ARFLAGS) $@ $(IMAGEOBJS) $(RANLIB) $@ # # rasterbench (dependency on static CUPS library is intentional) # rasterbench: rasterbench.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rasterbench.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testadmin (dependency on static CUPS library is intentional) # testadmin: testadmin.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testadmin.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testarray (dependency on static CUPS library is intentional) # testarray: testarray.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testarray.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running array API tests... ./testarray # # testcache (dependency on static CUPS library is intentional) # testcache: testcache.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testcache.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testclient (dependency on static libraries is intentional) # testclient: testclient.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testclient.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testconflicts (dependency on static CUPS library is intentional) # testconflicts: testconflicts.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testconflicts.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testcreds (dependency on static CUPS library is intentional) # testcreds: testcreds.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testcreds.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testcups (dependency on static CUPS library is intentional) # testcups: testcups.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testcups.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testdest (dependency on static CUPS library is intentional) # testdest: testdest.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testdest.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testfile (dependency on static CUPS library is intentional) # testfile: testfile.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testfile.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running file API tests... ./testfile # # testgetdests (dependency on static CUPS library is intentional) # testgetdests: testgetdests.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testgetdests.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testhttp (dependency on static CUPS library is intentional) # testhttp: testhttp.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testhttp.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running HTTP API tests... ./testhttp # # testipp (dependency on static CUPS library is intentional) # testipp: testipp.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testipp.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running IPP API tests... ./testipp # # testi18n (dependency on static CUPS library is intentional) # testi18n: testi18n.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testi18n.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running internationalization API tests... ./testi18n # # testlang (dependency on static CUPS library is intentional) # testlang: testlang.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testlang.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Creating locale directory structure... $(RM) -r locale for po in ../locale/cups_*.po; do \ lang=`basename $$po .po | sed -e '1,$$s/^cups_//'`; \ $(MKDIR) locale/$$lang; \ $(LN) ../../$$po locale/$$lang; \ done echo Running language API tests... LOCALEDIR=locale ./testlang # # testoptions (dependency on static CUPS library is intentional) # testoptions: testoptions.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testoptions.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running option API tests... ./testoptions # # testppd (dependency on static CUPS library is intentional) # testppd: testppd.o $(LIBCUPSSTATIC) test.ppd test2.ppd echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testppd.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running PPD API tests... ./testppd # # testpwg (dependency on static CUPS library is intentional) # testpwg: testpwg.o $(LIBCUPSSTATIC) test.ppd echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testpwg.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running PWG API tests... ./testpwg test.ppd # # testraster (dependency on static CUPS library is intentional) # testraster: testraster.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testraster.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Running raster API tests... ./testraster # # testsnmp (dependency on static CUPS library is intentional) # testsnmp: testsnmp.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testsnmp.o $(LINKCUPSSTATIC) $(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) # tlscheck: tlscheck.o $(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ tlscheck.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Automatic API help files... # apihelp: echo Generating CUPS API help files... $(RM) cupspm.xml codedoc --section "Programming" --body cupspm.md \ cupspm.xml \ auth.c cups.h dest*.c encode.c http.h http*.c ipp.h ipp*.c \ options.c tls-darwin.c usersys.c util.c \ --coverimage cupspm.png \ --epub ../doc/help/cupspm.epub codedoc --section "Programming" --body cupspm.md \ cupspm.xml > ../doc/help/cupspm.html $(RM) cupspm.xml codedoc --section "Programming" --title "Administration APIs" \ --css ../doc/cups-printable.css \ --header api-admin.header --body api-admin.shtml \ adminutil.c adminutil.h getdevices.c >../doc/help/api-admin.html codedoc --section "Programming" --title "PPD API (DEPRECATED)" \ --css ../doc/cups-printable.css \ --header api-ppd.header --body api-ppd.shtml \ ppd.h ppd-*.c raster-interstub.c >../doc/help/api-ppd.html codedoc --section "Programming" --title "Raster API" \ --css ../doc/cups-printable.css \ --header api-raster.header --body api-raster.shtml \ ../cups/raster.h raster-stubs.c \ >../doc/help/api-raster.html codedoc --section "Programming" \ --title "Filter and Backend Programming" \ --css ../doc/cups-printable.css \ --header api-filter.header --body api-filter.shtml \ backchannel.c backend.h backend.c sidechannel.c sidechannel.h \ >../doc/help/api-filter.html # # Lines of code computation... # sloc: echo "libcups: \c" sloccount $(LIBOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}' echo "libcupsimage: \c" sloccount $(IMAGEOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}' # # Dependencies... # include Dependencies tls.o: tls-darwin.c tls-gnutls.c tls-sspi.c cups-2.3.1/cups/transcode.c000664 000765 000024 00000036144 13574721672 015707 0ustar00mikestaff000000 000000 /* * Transcoding support for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #ifdef HAVE_ICONV_H # include #endif /* HAVE_ICONV_H */ /* * Local globals... */ #ifdef HAVE_ICONV_H static _cups_mutex_t map_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex to control access to maps */ static iconv_t map_from_utf8 = (iconv_t)-1; /* Convert from UTF-8 to charset */ static iconv_t map_to_utf8 = (iconv_t)-1; /* Convert from charset to UTF-8 */ static cups_encoding_t map_encoding = CUPS_AUTO_ENCODING; /* Which charset is cached */ #endif /* HAVE_ICONV_H */ /* * '_cupsCharmapFlush()' - Flush all character set maps out of cache. */ void _cupsCharmapFlush(void) { #ifdef HAVE_ICONV_H if (map_from_utf8 != (iconv_t)-1) { iconv_close(map_from_utf8); map_from_utf8 = (iconv_t)-1; } if (map_to_utf8 != (iconv_t)-1) { iconv_close(map_to_utf8); map_to_utf8 = (iconv_t)-1; } map_encoding = CUPS_AUTO_ENCODING; #endif /* HAVE_ICONV_H */ } /* * 'cupsCharsetToUTF8()' - Convert legacy character set to UTF-8. */ int /* O - Count or -1 on error */ cupsCharsetToUTF8( cups_utf8_t *dest, /* O - Target string */ const char *src, /* I - Source string */ const int maxout, /* I - Max output */ const cups_encoding_t encoding) /* I - Encoding */ { cups_utf8_t *destptr; /* Pointer into UTF-8 buffer */ #ifdef HAVE_ICONV_H size_t srclen, /* Length of source string */ outBytesLeft; /* Bytes remaining in output buffer */ #endif /* HAVE_ICONV_H */ /* * Check for valid arguments... */ DEBUG_printf(("2cupsCharsetToUTF8(dest=%p, src=\"%s\", maxout=%d, encoding=%d)", (void *)dest, src, maxout, encoding)); if (!dest || !src || maxout < 1) { if (dest) *dest = '\0'; DEBUG_puts("3cupsCharsetToUTF8: Bad arguments, returning -1"); return (-1); } /* * Handle identity conversions... */ if (encoding == CUPS_UTF8 || encoding <= CUPS_US_ASCII || encoding >= CUPS_ENCODING_VBCS_END) { strlcpy((char *)dest, src, (size_t)maxout); return ((int)strlen((char *)dest)); } /* * Handle ISO-8859-1 to UTF-8 directly... */ destptr = dest; if (encoding == CUPS_ISO8859_1) { int ch; /* Character from string */ cups_utf8_t *destend; /* End of UTF-8 buffer */ destend = dest + maxout - 2; while (*src && destptr < destend) { ch = *src++ & 255; if (ch & 128) { *destptr++ = (cups_utf8_t)(0xc0 | (ch >> 6)); *destptr++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); } else *destptr++ = (cups_utf8_t)ch; } *destptr = '\0'; return ((int)(destptr - dest)); } /* * Convert input legacy charset to UTF-8... */ #ifdef HAVE_ICONV_H _cupsMutexLock(&map_mutex); if (map_encoding != encoding) { char toset[1024]; /* Destination character set */ _cupsCharmapFlush(); snprintf(toset, sizeof(toset), "%s//IGNORE", _cupsEncodingName(encoding)); map_encoding = encoding; map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8"); map_to_utf8 = iconv_open("UTF-8", toset); } if (map_to_utf8 != (iconv_t)-1) { char *altdestptr = (char *)dest; /* Silence bogus GCC type-punned */ srclen = strlen(src); outBytesLeft = (size_t)maxout - 1; iconv(map_to_utf8, (char **)&src, &srclen, &altdestptr, &outBytesLeft); *altdestptr = '\0'; _cupsMutexUnlock(&map_mutex); return ((int)(altdestptr - (char *)dest)); } _cupsMutexUnlock(&map_mutex); #endif /* HAVE_ICONV_H */ /* * No iconv() support, so error out... */ *destptr = '\0'; return (-1); } /* * 'cupsUTF8ToCharset()' - Convert UTF-8 to legacy character set. */ int /* O - Count or -1 on error */ cupsUTF8ToCharset( char *dest, /* O - Target string */ const cups_utf8_t *src, /* I - Source string */ const int maxout, /* I - Max output */ const cups_encoding_t encoding) /* I - Encoding */ { char *destptr; /* Pointer into destination */ #ifdef HAVE_ICONV_H size_t srclen, /* Length of source string */ outBytesLeft; /* Bytes remaining in output buffer */ #endif /* HAVE_ICONV_H */ /* * Check for valid arguments... */ if (!dest || !src || maxout < 1) { if (dest) *dest = '\0'; return (-1); } /* * Handle identity conversions... */ if (encoding == CUPS_UTF8 || encoding >= CUPS_ENCODING_VBCS_END) { strlcpy(dest, (char *)src, (size_t)maxout); return ((int)strlen(dest)); } /* * Handle UTF-8 to ISO-8859-1 directly... */ destptr = dest; if (encoding == CUPS_ISO8859_1 || encoding <= CUPS_US_ASCII) { int ch, /* Character from string */ maxch; /* Maximum character for charset */ char *destend; /* End of ISO-8859-1 buffer */ maxch = encoding == CUPS_ISO8859_1 ? 256 : 128; destend = dest + maxout - 1; while (*src && destptr < destend) { ch = *src++; if ((ch & 0xe0) == 0xc0) { ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f); if (ch < maxch) *destptr++ = (char)ch; else *destptr++ = '?'; } else if ((ch & 0xf0) == 0xe0 || (ch & 0xf8) == 0xf0) *destptr++ = '?'; else if (!(ch & 0x80)) *destptr++ = (char)ch; } *destptr = '\0'; return ((int)(destptr - dest)); } #ifdef HAVE_ICONV_H /* * Convert input UTF-8 to legacy charset... */ _cupsMutexLock(&map_mutex); if (map_encoding != encoding) { char toset[1024]; /* Destination character set */ _cupsCharmapFlush(); snprintf(toset, sizeof(toset), "%s//IGNORE", _cupsEncodingName(encoding)); map_encoding = encoding; map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8"); map_to_utf8 = iconv_open("UTF-8", toset); } if (map_from_utf8 != (iconv_t)-1) { char *altsrc = (char *)src; /* Silence bogus GCC type-punned */ srclen = strlen((char *)src); outBytesLeft = (size_t)maxout - 1; iconv(map_from_utf8, &altsrc, &srclen, &destptr, &outBytesLeft); *destptr = '\0'; _cupsMutexUnlock(&map_mutex); return ((int)(destptr - dest)); } _cupsMutexUnlock(&map_mutex); #endif /* HAVE_ICONV_H */ /* * No iconv() support, so error out... */ *destptr = '\0'; return (-1); } /* * 'cupsUTF8ToUTF32()' - Convert UTF-8 to UTF-32. * * 32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows... * * UTF-32 char UTF-8 char(s) * -------------------------------------------------- * 0 to 127 = 0xxxxxxx (US-ASCII) * 128 to 2047 = 110xxxxx 10yyyyyy * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz * > 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx * * UTF-32 prohibits chars beyond Plane 16 (> 0x10ffff) in UCS-4, * which would convert to five- or six-octet UTF-8 sequences... */ int /* O - Count or -1 on error */ cupsUTF8ToUTF32( cups_utf32_t *dest, /* O - Target string */ const cups_utf8_t *src, /* I - Source string */ const int maxout) /* I - Max output */ { int i; /* Looping variable */ cups_utf8_t ch; /* Character value */ cups_utf8_t next; /* Next character value */ cups_utf32_t ch32; /* UTF-32 character value */ /* * Check for valid arguments and clear output... */ DEBUG_printf(("2cupsUTF8ToUTF32(dest=%p, src=\"%s\", maxout=%d)", (void *)dest, src, maxout)); if (dest) *dest = 0; if (!dest || !src || maxout < 1 || maxout > CUPS_MAX_USTRING) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad arguments)"); return (-1); } /* * Convert input UTF-8 to output UTF-32... */ for (i = maxout - 1; *src && i > 0; i --) { ch = *src++; /* * Convert UTF-8 character(s) to UTF-32 character... */ if (!(ch & 0x80)) { /* * One-octet UTF-8 <= 127 (US-ASCII)... */ *dest++ = ch; DEBUG_printf(("4cupsUTF8ToUTF32: %02x => %08X", src[-1], ch)); continue; } else if ((ch & 0xe0) == 0xc0) { /* * Two-octet UTF-8 <= 2047 (Latin-x)... */ next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (cups_utf32_t)((ch & 0x1f) << 6) | (cups_utf32_t)(next & 0x3f); /* * Check for non-shortest form (invalid UTF-8)... */ if (ch32 < 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } *dest++ = ch32; DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x => %08X", src[-2], src[-1], (unsigned)ch32)); } else if ((ch & 0xf0) == 0xe0) { /* * Three-octet UTF-8 <= 65535 (Plane 0 - BMP)... */ next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (cups_utf32_t)((ch & 0x0f) << 6) | (cups_utf32_t)(next & 0x3f); next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f); /* * Check for non-shortest form (invalid UTF-8)... */ if (ch32 < 0x800) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } *dest++ = ch32; DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x %02x => %08X", src[-3], src[-2], src[-1], (unsigned)ch32)); } else if ((ch & 0xf8) == 0xf0) { /* * Four-octet UTF-8... */ next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (cups_utf32_t)((ch & 0x07) << 6) | (cups_utf32_t)(next & 0x3f); next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f); next = *src++; if ((next & 0xc0) != 0x80) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f); /* * Check for non-shortest form (invalid UTF-8)... */ if (ch32 < 0x10000) { DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } *dest++ = ch32; DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x %02x %02x => %08X", src[-4], src[-3], src[-2], src[-1], (unsigned)ch32)); } else { /* * More than 4-octet (invalid UTF-8 sequence)... */ DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); return (-1); } /* * Check for UTF-16 surrogate (illegal UTF-8)... */ if (ch32 >= 0xd800 && ch32 <= 0xdfff) return (-1); } *dest = 0; DEBUG_printf(("3cupsUTF8ToUTF32: Returning %d characters", maxout - 1 - i)); return (maxout - 1 - i); } /* * 'cupsUTF32ToUTF8()' - Convert UTF-32 to UTF-8. * * 32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows... * * UTF-32 char UTF-8 char(s) * -------------------------------------------------- * 0 to 127 = 0xxxxxxx (US-ASCII) * 128 to 2047 = 110xxxxx 10yyyyyy * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz * > 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx * * UTF-32 prohibits chars beyond Plane 16 (> 0x10ffff) in UCS-4, * which would convert to five- or six-octet UTF-8 sequences... */ int /* O - Count or -1 on error */ cupsUTF32ToUTF8( cups_utf8_t *dest, /* O - Target string */ const cups_utf32_t *src, /* I - Source string */ const int maxout) /* I - Max output */ { cups_utf8_t *start; /* Start of destination string */ int i; /* Looping variable */ int swap; /* Byte-swap input to output */ cups_utf32_t ch; /* Character value */ /* * Check for valid arguments and clear output... */ DEBUG_printf(("2cupsUTF32ToUTF8(dest=%p, src=%p, maxout=%d)", (void *)dest, (void *)src, maxout)); if (dest) *dest = '\0'; if (!dest || !src || maxout < 1) { DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (bad args)"); return (-1); } /* * Check for leading BOM in UTF-32 and inverted BOM... */ start = dest; swap = *src == 0xfffe0000; DEBUG_printf(("4cupsUTF32ToUTF8: swap=%d", swap)); if (*src == 0xfffe0000 || *src == 0xfeff) src ++; /* * Convert input UTF-32 to output UTF-8... */ for (i = maxout - 1; *src && i > 0;) { ch = *src++; /* * Byte swap input UTF-32, if necessary... * (only byte-swapping 24 of 32 bits) */ if (swap) ch = ((ch >> 24) | ((ch >> 8) & 0xff00) | ((ch << 8) & 0xff0000)); /* * Check for beyond Plane 16 (invalid UTF-32)... */ if (ch > 0x10ffff) { DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (character out of range)"); return (-1); } /* * Convert UTF-32 character to UTF-8 character(s)... */ if (ch < 0x80) { /* * One-octet UTF-8 <= 127 (US-ASCII)... */ *dest++ = (cups_utf8_t)ch; i --; DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x", (unsigned)ch, dest[-1])); } else if (ch < 0x800) { /* * Two-octet UTF-8 <= 2047 (Latin-x)... */ if (i < 2) { DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 2)"); return (-1); } *dest++ = (cups_utf8_t)(0xc0 | ((ch >> 6) & 0x1f)); *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); i -= 2; DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x", (unsigned)ch, dest[-2], dest[-1])); } else if (ch < 0x10000) { /* * Three-octet UTF-8 <= 65535 (Plane 0 - BMP)... */ if (i < 3) { DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 3)"); return (-1); } *dest++ = (cups_utf8_t)(0xe0 | ((ch >> 12) & 0x0f)); *dest++ = (cups_utf8_t)(0x80 | ((ch >> 6) & 0x3f)); *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); i -= 3; DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x %02x", (unsigned)ch, dest[-3], dest[-2], dest[-1])); } else { /* * Four-octet UTF-8... */ if (i < 4) { DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 4)"); return (-1); } *dest++ = (cups_utf8_t)(0xf0 | ((ch >> 18) & 0x07)); *dest++ = (cups_utf8_t)(0x80 | ((ch >> 12) & 0x3f)); *dest++ = (cups_utf8_t)(0x80 | ((ch >> 6) & 0x3f)); *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); i -= 4; DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x %02x %02x", (unsigned)ch, dest[-4], dest[-3], dest[-2], dest[-1])); } } *dest = '\0'; DEBUG_printf(("3cupsUTF32ToUTF8: Returning %d", (int)(dest - start))); return ((int)(dest - start)); } cups-2.3.1/cups/testpwg.c000664 000765 000024 00000032413 13574721672 015415 0ustar00mikestaff000000 000000 /* * PWG unit test program for CUPS. * * Copyright 2009-2016 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "ppd-private.h" #include "file-private.h" /* * Local functions... */ static int test_pagesize(_ppd_cache_t *pc, ppd_file_t *ppd, const char *ppdsize); static int test_ppd_cache(_ppd_cache_t *pc, ppd_file_t *ppd); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int status; /* Status of tests (0 = success, 1 = fail) */ const char *ppdfile; /* PPD filename */ ppd_file_t *ppd; /* PPD file */ _ppd_cache_t *pc; /* PPD cache and PWG mapping data */ const pwg_media_t *pwgmedia; /* PWG media size */ size_t i, /* Looping var */ num_media; /* Number of media sizes */ const pwg_media_t *mediatable; /* Media size table */ int dupmedia = 0; /* Duplicate media sizes? */ status = 0; if (argc < 2 || argc > 3) { puts("Usage: ./testpwg filename.ppd [jobfile]"); return (1); } ppdfile = argv[1]; printf("ppdOpenFile(%s): ", ppdfile); if ((ppd = ppdOpenFile(ppdfile)) == NULL) { ppd_status_t err; /* Last error in file */ int line; /* Line number in file */ err = ppdLastError(&line); printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); return (1); } else puts("PASS"); fputs("_ppdCacheCreateWithPPD(ppd): ", stdout); if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL) { puts("FAIL"); status ++; } else { puts("PASS"); status += test_ppd_cache(pc, ppd); if (argc == 3) { /* * Test PageSize mapping code. */ int fd; /* Job file descriptor */ const char *pagesize; /* PageSize value */ ipp_t *job; /* Job attributes */ ipp_attribute_t *media; /* Media attribute */ if ((fd = open(argv[2], O_RDONLY)) >= 0) { job = ippNew(); ippReadFile(fd, job); close(fd); if ((media = ippFindAttribute(job, "media", IPP_TAG_ZERO)) != NULL && media->value_tag != IPP_TAG_NAME && media->value_tag != IPP_TAG_KEYWORD) media = NULL; if (media) printf("_ppdCacheGetPageSize(media=%s): ", media->values[0].string.text); else fputs("_ppdCacheGetPageSize(media-col): ", stdout); fflush(stdout); if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL) { puts("FAIL (Not Found)"); status = 1; } else if (media && _cups_strcasecmp(pagesize, media->values[0].string.text)) { printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, media->values[0].string.text); status = 1; } else printf("PASS (%s)\n", pagesize); ippDelete(job); } else { perror(argv[2]); status = 1; } } /* * _ppdCacheDestroy should never fail... */ fputs("_ppdCacheDestroy(pc): ", stdout); _ppdCacheDestroy(pc); puts("PASS"); } fputs("pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout); if ((pwgmedia = pwgMediaForPWG("iso_a4_210x297mm")) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "iso_a4_210x297mm")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else if (pwgmedia->width != 21000 || pwgmedia->length != 29700) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else puts("PASS"); fputs("pwgMediaForPWG(\"roll_max_36.1025x3622.0472in\"): ", stdout); if ((pwgmedia = pwgMediaForPWG("roll_max_36.1025x3622.0472in")) == NULL) { puts("FAIL (not found)"); status ++; } else if (pwgmedia->width != 91700 || pwgmedia->length != 9199999) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length); fputs("pwgMediaForPWG(\"disc_test_10x100mm\"): ", stdout); if ((pwgmedia = pwgMediaForPWG("disc_test_10x100mm")) == NULL) { puts("FAIL (not found)"); status ++; } else if (pwgmedia->width != 10000 || pwgmedia->length != 10000) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length); fputs("pwgMediaForLegacy(\"na-letter\"): ", stdout); if ((pwgmedia = pwgMediaForLegacy("na-letter")) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "na_letter_8.5x11in")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else if (pwgmedia->width != 21590 || pwgmedia->length != 27940) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else puts("PASS"); fputs("pwgMediaForPPD(\"4x6\"): ", stdout); if ((pwgmedia = pwgMediaForPPD("4x6")) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "na_index-4x6_4x6in")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else if (pwgmedia->width != 10160 || pwgmedia->length != 15240) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else puts("PASS"); fputs("pwgMediaForPPD(\"10x15cm\"): ", stdout); if ((pwgmedia = pwgMediaForPPD("10x15cm")) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "om_100x150mm_100x150mm")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else if (pwgmedia->width != 10000 || pwgmedia->length != 15000) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else puts("PASS"); fputs("pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout); if ((pwgmedia = pwgMediaForPPD("Custom.10x15cm")) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "custom_10x15cm_100x150mm")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else if (pwgmedia->width != 10000 || pwgmedia->length != 15000) { printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); status ++; } else puts("PASS"); fputs("pwgMediaForSize(29700, 42000): ", stdout); if ((pwgmedia = pwgMediaForSize(29700, 42000)) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "iso_a3_297x420mm")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else puts("PASS"); fputs("pwgMediaForSize(9842, 19050): ", stdout); if ((pwgmedia = pwgMediaForSize(9842, 19050)) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "na_monarch_3.875x7.5in")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else printf("PASS (%s)\n", pwgmedia->pwg); fputs("pwgMediaForSize(9800, 19000): ", stdout); if ((pwgmedia = pwgMediaForSize(9800, 19000)) == NULL) { puts("FAIL (not found)"); status ++; } else if (strcmp(pwgmedia->pwg, "jpn_you6_98x190mm")) { printf("FAIL (%s)\n", pwgmedia->pwg); status ++; } else printf("PASS (%s)\n", pwgmedia->pwg); fputs("Duplicate size test: ", stdout); for (mediatable = _pwgMediaTable(&num_media); num_media > 1; num_media --, mediatable ++) { for (i = num_media - 1, pwgmedia = mediatable + 1; i > 0; i --, pwgmedia ++) { if (pwgmedia->width == mediatable->width && pwgmedia->length == mediatable->length) { if (!dupmedia) { dupmedia = 1; status ++; puts("FAIL"); } printf(" %s and %s have the same dimensions (%dx%d)\n", pwgmedia->pwg, mediatable->pwg, pwgmedia->width, pwgmedia->length); } } } if (!dupmedia) puts("PASS"); return (status); } /* * 'test_pagesize()' - Test the PWG mapping functions. */ static int /* O - 1 on failure, 0 on success */ test_pagesize(_ppd_cache_t *pc, /* I - PWG mapping data */ ppd_file_t *ppd, /* I - PPD file */ const char *ppdsize) /* I - PPD page size */ { int status = 0; /* Return status */ ipp_t *job; /* Job attributes */ const char *pagesize; /* PageSize value */ if (ppdPageSize(ppd, ppdsize)) { printf("_ppdCacheGetPageSize(keyword=%s): ", ppdsize); fflush(stdout); if ((pagesize = _ppdCacheGetPageSize(pc, NULL, ppdsize, NULL)) == NULL) { puts("FAIL (Not Found)"); status = 1; } else if (_cups_strcasecmp(pagesize, ppdsize)) { printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize); status = 1; } else puts("PASS"); job = ippNew(); ippAddString(job, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media", NULL, ppdsize); printf("_ppdCacheGetPageSize(media=%s): ", ppdsize); fflush(stdout); if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL) { puts("FAIL (Not Found)"); status = 1; } else if (_cups_strcasecmp(pagesize, ppdsize)) { printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize); status = 1; } else puts("PASS"); ippDelete(job); } return (status); } /* * 'test_ppd_cache()' - Test the PPD cache functions. */ static int /* O - 1 on failure, 0 on success */ test_ppd_cache(_ppd_cache_t *pc, /* I - PWG mapping data */ ppd_file_t *ppd) /* I - PPD file */ { int i, /* Looping var */ status = 0; /* Return status */ _ppd_cache_t *pc2; /* Loaded data */ pwg_size_t *size, /* Size from original */ *size2; /* Size from saved */ pwg_map_t *map, /* Map from original */ *map2; /* Map from saved */ /* * Verify that we can write and read back the same data... */ fputs("_ppdCacheWriteFile(test.pwg): ", stdout); if (!_ppdCacheWriteFile(pc, "test.pwg", NULL)) { puts("FAIL"); status ++; } else puts("PASS"); fputs("_ppdCacheCreateWithFile(test.pwg): ", stdout); if ((pc2 = _ppdCacheCreateWithFile("test.pwg", NULL)) == NULL) { puts("FAIL"); status ++; } else { // TODO: FINISH ADDING ALL VALUES IN STRUCTURE if (pc2->num_sizes != pc->num_sizes) { if (!status) puts("FAIL"); printf(" SAVED num_sizes=%d, ORIG num_sizes=%d\n", pc2->num_sizes, pc->num_sizes); status ++; } else { for (i = pc->num_sizes, size = pc->sizes, size2 = pc2->sizes; i > 0; i --, size ++, size2 ++) { if (strcmp(size2->map.pwg, size->map.pwg) || strcmp(size2->map.ppd, size->map.ppd) || size2->width != size->width || size2->length != size->length || size2->left != size->left || size2->bottom != size->bottom || size2->right != size->right || size2->top != size->top) { if (!status) puts("FAIL"); if (strcmp(size->map.pwg, size2->map.pwg)) printf(" SAVED size->map.pwg=\"%s\", ORIG " "size->map.pwg=\"%s\"\n", size2->map.pwg, size->map.pwg); if (strcmp(size2->map.ppd, size->map.ppd)) printf(" SAVED size->map.ppd=\"%s\", ORIG " "size->map.ppd=\"%s\"\n", size2->map.ppd, size->map.ppd); if (size2->width != size->width) printf(" SAVED size->width=%d, ORIG size->width=%d\n", size2->width, size->width); if (size2->length != size->length) printf(" SAVED size->length=%d, ORIG size->length=%d\n", size2->length, size->length); if (size2->left != size->left) printf(" SAVED size->left=%d, ORIG size->left=%d\n", size2->left, size->left); if (size2->bottom != size->bottom) printf(" SAVED size->bottom=%d, ORIG size->bottom=%d\n", size2->bottom, size->bottom); if (size2->right != size->right) printf(" SAVED size->right=%d, ORIG size->right=%d\n", size2->right, size->right); if (size2->top != size->top) printf(" SAVED size->top=%d, ORIG size->top=%d\n", size2->top, size->top); status ++; break; } } for (i = pc->num_sources, map = pc->sources, map2 = pc2->sources; i > 0; i --, map ++, map2 ++) { if (strcmp(map2->pwg, map->pwg) || strcmp(map2->ppd, map->ppd)) { if (!status) puts("FAIL"); if (strcmp(map->pwg, map2->pwg)) printf(" SAVED source->pwg=\"%s\", ORIG source->pwg=\"%s\"\n", map2->pwg, map->pwg); if (strcmp(map2->ppd, map->ppd)) printf(" SAVED source->ppd=\"%s\", ORIG source->ppd=\"%s\"\n", map2->ppd, map->ppd); status ++; break; } } for (i = pc->num_types, map = pc->types, map2 = pc2->types; i > 0; i --, map ++, map2 ++) { if (strcmp(map2->pwg, map->pwg) || strcmp(map2->ppd, map->ppd)) { if (!status) puts("FAIL"); if (strcmp(map->pwg, map2->pwg)) printf(" SAVED type->pwg=\"%s\", ORIG type->pwg=\"%s\"\n", map2->pwg, map->pwg); if (strcmp(map2->ppd, map->ppd)) printf(" SAVED type->ppd=\"%s\", ORIG type->ppd=\"%s\"\n", map2->ppd, map->ppd); status ++; break; } } } if (!status) puts("PASS"); _ppdCacheDestroy(pc2); } /* * Test PageSize mapping code... */ status += test_pagesize(pc, ppd, "Letter"); status += test_pagesize(pc, ppd, "na-letter"); status += test_pagesize(pc, ppd, "A4"); status += test_pagesize(pc, ppd, "iso-a4"); return (status); } cups-2.3.1/cups/md5passwd.c000664 000765 000024 00000005133 13574721672 015626 0ustar00mikestaff000000 000000 /* * MD5 password support for CUPS (deprecated). * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include "http-private.h" #include "string-private.h" /* * 'httpMD5()' - Compute the MD5 sum of the username:group:password. * * @deprecated@ */ char * /* O - MD5 sum */ httpMD5(const char *username, /* I - User name */ const char *realm, /* I - Realm name */ const char *passwd, /* I - Password string */ char md5[33]) /* O - MD5 string */ { unsigned char sum[16]; /* Sum data */ char line[256]; /* Line to sum */ /* * Compute the MD5 sum of the user name, group name, and password. */ snprintf(line, sizeof(line), "%s:%s:%s", username, realm, passwd); cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); /* * Return the sum... */ return ((char *)cupsHashString(sum, sizeof(sum), md5, 33)); } /* * 'httpMD5Final()' - Combine the MD5 sum of the username, group, and password * with the server-supplied nonce value, method, and * request-uri. * * @deprecated@ */ char * /* O - New sum */ httpMD5Final(const char *nonce, /* I - Server nonce value */ const char *method, /* I - METHOD (GET, POST, etc.) */ const char *resource, /* I - Resource path */ char md5[33]) /* IO - MD5 sum */ { unsigned char sum[16]; /* Sum data */ char line[1024]; /* Line of data */ char a2[33]; /* Hash of method and resource */ /* * First compute the MD5 sum of the method and resource... */ snprintf(line, sizeof(line), "%s:%s", method, resource); cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); cupsHashString(sum, sizeof(sum), a2, sizeof(a2)); /* * Then combine A1 (MD5 of username, realm, and password) with the nonce * and A2 (method + resource) values to get the final MD5 sum for the * request... */ snprintf(line, sizeof(line), "%s:%s:%s", md5, nonce, a2); cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); return ((char *)cupsHashString(sum, sizeof(sum), md5, 33)); } /* * 'httpMD5String()' - Convert an MD5 sum to a character string. * * @deprecated@ */ char * /* O - MD5 sum in hex */ httpMD5String(const unsigned char *sum, /* I - MD5 sum data */ char md5[33]) /* O - MD5 sum in hex */ { return ((char *)cupsHashString(sum, 16, md5, 33)); } cups-2.3.1/cups/testcache.c000664 000765 000024 00000004231 13574721672 015660 0ustar00mikestaff000000 000000 /* * PPD cache testing program for CUPS. * * Copyright 2009-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "ppd-private.h" #include "file-private.h" /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *ppdfile = NULL;/* PPD filename */ ppd_file_t *ppd; /* PPD file */ int num_options = 0;/* Number of options */ cups_option_t *options = NULL;/* Options */ _ppd_cache_t *pc; /* PPD cache and PWG mapping data */ int num_finishings, /* Number of finishing options */ finishings[20]; /* Finishing options */ ppd_choice_t *ppd_bin; /* OutputBin value */ const char *output_bin; /* output-bin value */ if (argc < 2) { puts("Usage: ./testcache filename.ppd [name=value ... name=value]"); return (1); } ppdfile = argv[1]; if ((ppd = ppdOpenFile(ppdfile)) == NULL) { ppd_status_t err; /* Last error in file */ int line; /* Line number in file */ err = ppdLastError(&line); fprintf(stderr, "Unable to open \"%s\": %s on line %d\n", ppdfile, ppdErrorString(err), line); return (1); } if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL) { fprintf(stderr, "Unable to create PPD cache from \"%s\".\n", ppdfile); return (1); } for (i = 2; i < argc; i ++) num_options = cupsParseOptions(argv[i], num_options, &options); ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); num_finishings = _ppdCacheGetFinishingValues(ppd, pc, (int)sizeof(finishings) / sizeof(finishings[0]), finishings); if (num_finishings > 0) { fputs("finishings=", stdout); for (i = 0; i < num_finishings; i ++) if (i) printf(",%d", finishings[i]); else printf("%d", finishings[i]); fputs("\n", stdout); } if ((ppd_bin = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL && (output_bin = _ppdCacheGetBin(pc, ppd_bin->choice)) != NULL) printf("output-bin=\"%s\"\n", output_bin); return (0); } cups-2.3.1/cups/getifaddrs-internal.h000664 000765 000024 00000005232 13574721672 017652 0ustar00mikestaff000000 000000 /* * getifaddrs definitions for CUPS. * * Copyright 2007-2018 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. */ #ifndef _CUPS_GETIFADDRS_INTERNAL_H_ # define _CUPS_GETIFADDRS_INTERNAL_H_ /* * Include necessary headers... */ # include "config.h" # ifdef _WIN32 # define _WINSOCK_DEPRECATED_NO_WARNINGS 1 # include # include # define CUPS_SOCAST (const char *) # else # include # include # include # define CUPS_SOCAST # endif /* _WIN32 */ # if defined(__APPLE__) && !defined(_SOCKLEN_T) /* * macOS 10.2.x does not define socklen_t, and in fact uses an int instead of * unsigned type for length values... */ typedef int socklen_t; # endif /* __APPLE__ && !_SOCKLEN_T */ # ifndef _WIN32 # include # include # ifdef HAVE_GETIFADDRS # include # else # include # ifdef HAVE_SYS_SOCKIO_H # include # endif /* HAVE_SYS_SOCKIO_H */ # endif /* HAVE_GETIFADDRS */ # endif /* !_WIN32 */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Some OS's don't have getifaddrs() and freeifaddrs()... */ # if !defined(_WIN32) && !defined(HAVE_GETIFADDRS) # ifdef ifa_dstaddr # undef ifa_dstaddr # endif /* ifa_dstaddr */ # ifndef ifr_netmask # define ifr_netmask ifr_addr # endif /* !ifr_netmask */ struct ifaddrs /**** Interface Structure ****/ { struct ifaddrs *ifa_next; /* Next interface in list */ char *ifa_name; /* Name of interface */ unsigned int ifa_flags; /* Flags (up, point-to-point, etc.) */ struct sockaddr *ifa_addr, /* Network address */ *ifa_netmask; /* Address mask */ union { struct sockaddr *ifu_broadaddr; /* Broadcast address of this interface. */ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address. */ } ifa_ifu; void *ifa_data; /* Interface statistics */ }; # ifndef ifa_broadaddr # define ifa_broadaddr ifa_ifu.ifu_broadaddr # endif /* !ifa_broadaddr */ # ifndef ifa_dstaddr # define ifa_dstaddr ifa_ifu.ifu_dstaddr # endif /* !ifa_dstaddr */ extern int _cups_getifaddrs(struct ifaddrs **addrs) _CUPS_PRIVATE; # define getifaddrs _cups_getifaddrs extern void _cups_freeifaddrs(struct ifaddrs *addrs) _CUPS_PRIVATE; # define freeifaddrs _cups_freeifaddrs # endif /* !_WIN32 && !HAVE_GETIFADDRS */ /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_GETIFADDRS_INTERNAL_H_ */ cups-2.3.1/cups/pwg.h000664 000765 000024 00000004034 13574721672 014520 0ustar00mikestaff000000 000000 /* * PWG media API definitions for CUPS. * * Copyright 2009-2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_PWG_H_ # define _CUPS_PWG_H_ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Macros... */ /* Convert from points to hundredths of millimeters */ # define PWG_FROM_POINTS(n) (int)(((n) * 2540 + 36) / 72) /* Convert from hundredths of millimeters to points */ # define PWG_TO_POINTS(n) ((n) * 72.0 / 2540.0) /* * Types and structures... */ typedef struct pwg_map_s /**** Map element - PPD to/from PWG @exclude all@ */ { char *pwg, /* PWG media keyword */ *ppd; /* PPD option keyword */ } pwg_map_t; typedef struct pwg_media_s /**** Common media size data ****/ { const char *pwg, /* PWG 5101.1 "self describing" name */ *legacy, /* IPP/ISO legacy name */ *ppd; /* Standard Adobe PPD name */ int width, /* Width in 2540ths */ length; /* Length in 2540ths */ } pwg_media_t; typedef struct pwg_size_s /**** Size element - PPD to/from PWG @exclude all@ */ { pwg_map_t map; /* Map element */ int width, /* Width in 2540ths */ length, /* Length in 2540ths */ left, /* Left margin in 2540ths */ bottom, /* Bottom margin in 2540ths */ right, /* Right margin in 2540ths */ top; /* Top margin in 2540ths */ } pwg_size_t; /* * Functions... */ extern int pwgFormatSizeName(char *keyword, size_t keysize, const char *prefix, const char *name, int width, int length, const char *units) _CUPS_API_1_7; extern int pwgInitSize(pwg_size_t *size, ipp_t *job, int *margins_set) _CUPS_API_1_7; extern pwg_media_t *pwgMediaForLegacy(const char *legacy) _CUPS_API_1_7; extern pwg_media_t *pwgMediaForPPD(const char *ppd) _CUPS_API_1_7; extern pwg_media_t *pwgMediaForPWG(const char *pwg) _CUPS_API_1_7; extern pwg_media_t *pwgMediaForSize(int width, int length) _CUPS_API_1_7; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_PWG_H_ */ cups-2.3.1/cups/testlang.c000664 000765 000024 00000022577 13574721672 015553 0ustar00mikestaff000000 000000 /* * Localization test program for CUPS. * * Usage: * * ./testlang [-l locale] [-p ppd] ["String to localize"] * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #ifdef __APPLE__ # include #endif /* __APPLE__ */ /* * Local functions... */ static int show_ppd(const char *filename); static int test_string(cups_lang_t *language, const char *msgid); static void usage(void); /* * 'main()' - Load the specified language and show the strings for yes and no. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *opt; /* Current option */ int errors = 0; /* Number of errors */ int dotests = 1; /* Do standard tests? */ cups_lang_t *language = NULL;/* Message catalog */ cups_lang_t *language2 = NULL; /* Message catalog (second time) */ struct lconv *loc; /* Locale data */ char buffer[1024]; /* String buffer */ double number; /* Number */ static const char * const tests[] = /* Test strings */ { "1", "-1", "3", "5.125" }; /* * Parse command-line... */ _cupsSetLocale(argv); for (i = 1; i < argc; i ++) { if (argv[i][0] == '-') { if (!strcmp(argv[i], "--help")) { usage(); } else { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'l' : i ++; if (i >= argc) { usage(); return (1); } language = cupsLangGet(argv[i]); language2 = cupsLangGet(argv[i]); setenv("LANG", argv[i], 1); setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); break; case 'p' : i ++; if (i >= argc) { usage(); return (1); } if (!language) { language = cupsLangDefault(); language2 = cupsLangDefault(); } dotests = 0; errors += show_ppd(argv[i]); break; default : usage(); return (1); } } } } else { if (!language) { language = cupsLangDefault(); language2 = cupsLangDefault(); } dotests = 0; errors += test_string(language, argv[i]); } } if (!language) { language = cupsLangDefault(); language2 = cupsLangDefault(); } if (language != language2) { errors ++; puts("**** ERROR: Language cache did not work! ****"); puts("First result from cupsLangGet:"); } printf("Language = \"%s\"\n", language->language); printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding)); if (dotests) { errors += test_string(language, "No"); errors += test_string(language, "Yes"); if (language != language2) { puts("Second result from cupsLangGet:"); printf("Language = \"%s\"\n", language2->language); printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding)); printf("No = \"%s\"\n", _cupsLangString(language2, "No")); printf("Yes = \"%s\"\n", _cupsLangString(language2, "Yes")); } loc = localeconv(); for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) { number = _cupsStrScand(tests[i], NULL, loc); printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number); _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer); if (strcmp(buffer, tests[i])) { errors ++; puts("**** ERROR: Bad formatted number! ****"); } } #ifdef __APPLE__ /* * Test all possible language IDs for compatibility with _cupsAppleLocale... */ CFIndex j, /* Looping var */ num_locales; /* Number of locales */ CFArrayRef locales; /* Locales */ CFStringRef locale_id, /* Current locale ID */ language_id; /* Current language ID */ char locale_str[256], /* Locale ID C string */ language_str[256], /* Language ID C string */ *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ size_t buflen; /* Length of POSIX locale */ # if TEST_COUNTRY_CODES CFIndex k, /* Looping var */ num_country_codes; /* Number of country codes */ CFArrayRef country_codes; /* Country codes */ CFStringRef country_code, /* Current country code */ temp_id; /* Temporary language ID */ char country_str[256]; /* Country code C string */ # endif /* TEST_COUNTRY_CODES */ locales = CFLocaleCopyAvailableLocaleIdentifiers(); num_locales = CFArrayGetCount(locales); # if TEST_COUNTRY_CODES country_codes = CFLocaleCopyISOCountryCodes(); num_country_codes = CFArrayGetCount(country_codes); # endif /* TEST_COUNTRY_CODES */ printf("%d locales are available:\n", (int)num_locales); for (j = 0; j < num_locales; j ++) { locale_id = CFArrayGetValueAtIndex(locales, j); language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) { printf("%d: FAIL (unable to get locale ID string)\n", (int)j + 1); errors ++; continue; } if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) { printf("%d %s: FAIL (unable to get language ID string)\n", (int)j + 1, locale_str); errors ++; continue; } if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) { printf("%d %s(%s): FAIL (unable to convert language ID string to POSIX locale)\n", (int)j + 1, locale_str, language_str); errors ++; continue; } if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) buflen = (size_t)(bufptr - buffer); else buflen = strlen(buffer); if ((language = cupsLangGet(buffer)) == NULL) { printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); errors ++; continue; } if (strncasecmp(language->language, buffer, buflen)) { printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\", got \"%s\")\n", (int)j + 1, locale_str, language_str, buffer, language->language); errors ++; continue; } printf("%d %s(%s): PASS (POSIX locale is \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); } CFRelease(locales); # if TEST_COUNTRY_CODES CFRelease(country_codes); # endif /* TEST_COUNTRY_CODES */ #endif /* __APPLE__ */ } if (errors == 0 && dotests) puts("ALL TESTS PASSED"); return (errors > 0); } /* * 'show_ppd()' - Show localized strings in a PPD file. */ static int /* O - Number of errors */ show_ppd(const char *filename) /* I - Filename */ { ppd_file_t *ppd; /* PPD file */ ppd_option_t *option; /* PageSize option */ ppd_choice_t *choice; /* PageSize/Letter choice */ char buffer[1024]; /* String buffer */ if ((ppd = ppdOpenFile(filename)) == NULL) { printf("Unable to open PPD file \"%s\".\n", filename); return (1); } ppdLocalize(ppd); if ((option = ppdFindOption(ppd, "PageSize")) == NULL) { puts("No PageSize option."); return (1); } else { printf("PageSize: %s\n", option->text); if ((choice = ppdFindChoice(option, "Letter")) == NULL) { puts("No Letter PageSize choice."); return (1); } else { printf("Letter: %s\n", choice->text); } } printf("media-empty: %s\n", ppdLocalizeIPPReason(ppd, "media-empty", NULL, buffer, sizeof(buffer))); ppdClose(ppd); return (0); } /* * 'test_string()' - Test the localization of a string. */ static int /* O - 1 on failure, 0 on success */ test_string(cups_lang_t *language, /* I - Language */ const char *msgid) /* I - Message */ { const char *msgstr; /* Localized string */ /* * Get the localized string and then see if we got what we expected. * * For the POSIX locale, the string pointers should be the same. * For any other locale, the string pointers should be different. */ msgstr = _cupsLangString(language, msgid); if (strcmp(language->language, "C") && msgid == msgstr) { printf("%-8s = \"%s\" (FAIL - no message catalog loaded)\n", msgid, msgstr); return (1); } else if (!strcmp(language->language, "C") && msgid != msgstr) { printf("%-8s = \"%s\" (FAIL - POSIX locale is localized)\n", msgid, msgstr); return (1); } printf("%-8s = \"%s\" (PASS)\n", msgid, msgstr); return (0); } /* * 'usage()' - Show program usage. */ static void usage(void) { puts("./testlang [-l locale] [-p ppd] [\"String to localize\"]"); } cups-2.3.1/cups/file.h000664 000765 000024 00000006501 13574721672 014643 0ustar00mikestaff000000 000000 /* * Public file definitions for CUPS. * * Since stdio files max out at 256 files on many systems, we have to * write similar functions without this limit. At the same time, using * our own file functions allows us to provide transparent support of * different line endings, gzip'd print files, PPD files, etc. * * Copyright © 2007-2018 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. */ #ifndef _CUPS_FILE_H_ # define _CUPS_FILE_H_ /* * Include necessary headers... */ # include "versioning.h" # include # include # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED /* Windows does not support the ssize_t type, so map it to off_t... */ typedef off_t ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * CUPS file definitions... */ # define CUPS_FILE_NONE 0 /* No compression */ # define CUPS_FILE_GZIP 1 /* GZIP compression */ /* * Types and structures... */ typedef struct _cups_file_s cups_file_t;/**** CUPS file type ****/ /* * Prototypes... */ extern int cupsFileClose(cups_file_t *fp) _CUPS_API_1_2; extern int cupsFileCompression(cups_file_t *fp) _CUPS_API_1_2; extern int cupsFileEOF(cups_file_t *fp) _CUPS_API_1_2; extern const char *cupsFileFind(const char *filename, const char *path, int executable, char *buffer, int bufsize) _CUPS_API_1_2; extern int cupsFileFlush(cups_file_t *fp) _CUPS_API_1_2; extern int cupsFileGetChar(cups_file_t *fp) _CUPS_API_1_2; extern char *cupsFileGetConf(cups_file_t *fp, char *buf, size_t buflen, char **value, int *linenum) _CUPS_API_1_2; extern size_t cupsFileGetLine(cups_file_t *fp, char *buf, size_t buflen) _CUPS_API_1_2; extern char *cupsFileGets(cups_file_t *fp, char *buf, size_t buflen) _CUPS_API_1_2; extern int cupsFileLock(cups_file_t *fp, int block) _CUPS_API_1_2; extern int cupsFileNumber(cups_file_t *fp) _CUPS_API_1_2; extern cups_file_t *cupsFileOpen(const char *filename, const char *mode) _CUPS_API_1_2; extern cups_file_t *cupsFileOpenFd(int fd, const char *mode) _CUPS_API_1_2; extern int cupsFilePeekChar(cups_file_t *fp) _CUPS_API_1_2; extern int cupsFilePrintf(cups_file_t *fp, const char *format, ...) _CUPS_FORMAT(2, 3) _CUPS_API_1_2; extern int cupsFilePutChar(cups_file_t *fp, int c) _CUPS_API_1_2; extern ssize_t cupsFilePutConf(cups_file_t *fp, const char *directive, const char *value) _CUPS_API_1_4; extern int cupsFilePuts(cups_file_t *fp, const char *s) _CUPS_API_1_2; extern ssize_t cupsFileRead(cups_file_t *fp, char *buf, size_t bytes) _CUPS_API_1_2; extern off_t cupsFileRewind(cups_file_t *fp) _CUPS_API_1_2; extern off_t cupsFileSeek(cups_file_t *fp, off_t pos) _CUPS_API_1_2; extern cups_file_t *cupsFileStderr(void) _CUPS_API_1_2; extern cups_file_t *cupsFileStdin(void) _CUPS_API_1_2; extern cups_file_t *cupsFileStdout(void) _CUPS_API_1_2; extern off_t cupsFileTell(cups_file_t *fp) _CUPS_API_1_2; extern int cupsFileUnlock(cups_file_t *fp) _CUPS_API_1_2; extern ssize_t cupsFileWrite(cups_file_t *fp, const char *buf, size_t bytes) _CUPS_API_1_2; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_FILE_H_ */ cups-2.3.1/cups/language.h000664 000765 000024 00000006164 13574721672 015514 0ustar00mikestaff000000 000000 /* * Multi-language support for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_LANGUAGE_H_ # define _CUPS_LANGUAGE_H_ /* * Include necessary headers... */ # include # include "array.h" # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Types... */ typedef enum cups_encoding_e /**** Language Encodings @exclude all@ ****/ { CUPS_AUTO_ENCODING = -1, /* Auto-detect the encoding @private@ */ CUPS_US_ASCII, /* US ASCII */ CUPS_ISO8859_1, /* ISO-8859-1 */ CUPS_ISO8859_2, /* ISO-8859-2 */ CUPS_ISO8859_3, /* ISO-8859-3 */ CUPS_ISO8859_4, /* ISO-8859-4 */ CUPS_ISO8859_5, /* ISO-8859-5 */ CUPS_ISO8859_6, /* ISO-8859-6 */ CUPS_ISO8859_7, /* ISO-8859-7 */ CUPS_ISO8859_8, /* ISO-8859-8 */ CUPS_ISO8859_9, /* ISO-8859-9 */ CUPS_ISO8859_10, /* ISO-8859-10 */ CUPS_UTF8, /* UTF-8 */ CUPS_ISO8859_13, /* ISO-8859-13 */ CUPS_ISO8859_14, /* ISO-8859-14 */ CUPS_ISO8859_15, /* ISO-8859-15 */ CUPS_WINDOWS_874, /* CP-874 */ CUPS_WINDOWS_1250, /* CP-1250 */ CUPS_WINDOWS_1251, /* CP-1251 */ CUPS_WINDOWS_1252, /* CP-1252 */ CUPS_WINDOWS_1253, /* CP-1253 */ CUPS_WINDOWS_1254, /* CP-1254 */ CUPS_WINDOWS_1255, /* CP-1255 */ CUPS_WINDOWS_1256, /* CP-1256 */ CUPS_WINDOWS_1257, /* CP-1257 */ CUPS_WINDOWS_1258, /* CP-1258 */ CUPS_KOI8_R, /* KOI-8-R */ CUPS_KOI8_U, /* KOI-8-U */ CUPS_ISO8859_11, /* ISO-8859-11 */ CUPS_ISO8859_16, /* ISO-8859-16 */ CUPS_MAC_ROMAN, /* MacRoman */ CUPS_ENCODING_SBCS_END = 63, /* End of single-byte encodings @private@ */ CUPS_WINDOWS_932, /* Japanese JIS X0208-1990 */ CUPS_WINDOWS_936, /* Simplified Chinese GB 2312-80 */ CUPS_WINDOWS_949, /* Korean KS C5601-1992 */ CUPS_WINDOWS_950, /* Traditional Chinese Big Five */ CUPS_WINDOWS_1361, /* Korean Johab */ CUPS_ENCODING_DBCS_END = 127, /* End of double-byte encodings @private@ */ CUPS_EUC_CN, /* EUC Simplified Chinese */ CUPS_EUC_JP, /* EUC Japanese */ CUPS_EUC_KR, /* EUC Korean */ CUPS_EUC_TW, /* EUC Traditional Chinese */ CUPS_JIS_X0213, /* JIS X0213 aka Shift JIS */ CUPS_ENCODING_VBCS_END = 191 /* End of variable-length encodings @private@ */ } cups_encoding_t; typedef struct cups_lang_s /**** Language Cache Structure ****/ { struct cups_lang_s *next; /* Next language in cache */ int used; /* Number of times this entry has been used. */ cups_encoding_t encoding; /* Text encoding */ char language[16]; /* Language/locale name */ cups_array_t *strings; /* Message strings @private@ */ } cups_lang_t; /* * Prototypes... */ extern cups_lang_t *cupsLangDefault(void) _CUPS_PUBLIC; extern const char *cupsLangEncoding(cups_lang_t *lang) _CUPS_PUBLIC; extern void cupsLangFlush(void) _CUPS_PUBLIC; extern void cupsLangFree(cups_lang_t *lang) _CUPS_PUBLIC; extern cups_lang_t *cupsLangGet(const char *language) _CUPS_PUBLIC; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_LANGUAGE_H_ */ cups-2.3.1/cups/testclient.c000664 000765 000024 00000071617 13574721672 016107 0ustar00mikestaff000000 000000 /* * Simulated client test program for CUPS. * * Copyright © 2017-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include /* * Constants... */ #define MAX_CLIENTS 16 /* Maximum number of client threads */ /* * Local types... */ typedef struct _client_data_s { const char *uri, /* Printer URI */ *hostname, /* Hostname */ *user, /* Username */ *resource; /* Resource path */ int port; /* Port number */ http_encryption_t encryption; /* Use encryption? */ const char *docfile, /* Document file */ *docformat; /* Document format */ int grayscale, /* Force grayscale? */ keepfile; /* Keep temporary file? */ ipp_pstate_t printer_state; /* Current printer state */ char printer_state_reasons[1024]; /* Current printer-state-reasons */ int job_id; /* Job ID for submitted job */ ipp_jstate_t job_state; /* Current job state */ char job_state_reasons[1024]; /* Current job-state-reasons */ } _client_data_t; /* * Local globals... */ static int client_count = 0; static _cups_mutex_t client_mutex = _CUPS_MUTEX_INITIALIZER; static int verbosity = 0; /* * Local functions... */ static const char *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format); static void *monitor_printer(_client_data_t *data); static void *run_client(_client_data_t *data); static void show_attributes(const char *title, int request, ipp_t *ipp); static void show_capabilities(ipp_t *response); static void usage(void); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *opt; /* Current option */ int num_clients = 0,/* Number of clients to simulate */ clients_started = 0; /* Number of clients that have been started */ char scheme[32], /* URI scheme */ userpass[256], /* Username:password */ hostname[256], /* Hostname */ resource[256]; /* Resource path */ _client_data_t data; /* Client data */ /* * Parse command-line options... */ if (argc == 1) return (0); memset(&data, 0, sizeof(data)); for (i = 1; i < argc; i ++) { if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'c' : /* -c num-clients */ if (num_clients) { puts("Number of clients can only be specified once."); usage(); return (1); } i ++; if (i >= argc) { puts("Expected client count after '-c'."); usage(); return (1); } if ((num_clients = atoi(argv[i])) < 1) { puts("Number of clients must be one or more."); usage(); return (1); } break; case 'd' : /* -d document-format */ if (data.docformat) { puts("Document format can only be specified once."); usage(); return (1); } i ++; if (i >= argc) { puts("Expected document format after '-d'."); usage(); return (1); } data.docformat = argv[i]; break; case 'f' : /* -f print-file */ if (data.docfile) { puts("Print file can only be specified once."); usage(); return (1); } i ++; if (i >= argc) { puts("Expected print file after '-f'."); usage(); return (1); } data.docfile = argv[i]; break; case 'g' : data.grayscale = 1; break; case 'k' : data.keepfile = 1; break; case 'v' : verbosity ++; break; default : printf("Unknown option '-%c'.\n", *opt); usage(); return (1); } } } else if (data.uri || (strncmp(argv[i], "ipp://", 6) && strncmp(argv[i], "ipps://", 7))) { printf("Unknown command-line argument '%s'.\n", argv[i]); usage(); return (1); } else data.uri = argv[i]; } /* * Make sure we have everything we need. */ if (!data.uri) { puts("Expected printer URI."); usage(); return (1); } if (num_clients < 1) num_clients = 1; /* * Connect to the printer... */ if (httpSeparateURI(HTTP_URI_CODING_ALL, data.uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &data.port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { printf("Bad printer URI '%s'.\n", data.uri); return (1); } if (!data.port) data.port = IPP_PORT; if (!strcmp(scheme, "https") || !strcmp(scheme, "ipps")) data.encryption = HTTP_ENCRYPTION_ALWAYS; else data.encryption = HTTP_ENCRYPTION_IF_REQUESTED; /* * Start the client threads... */ data.hostname = hostname; data.resource = resource; while (clients_started < num_clients) { _cupsMutexLock(&client_mutex); if (client_count < MAX_CLIENTS) { _cups_thread_t tid; /* New thread */ client_count ++; _cupsMutexUnlock(&client_mutex); tid = _cupsThreadCreate((_cups_thread_func_t)run_client, &data); _cupsThreadDetach(tid); } else { _cupsMutexUnlock(&client_mutex); sleep(1); } } while (client_count > 0) { _cupsMutexLock(&client_mutex); printf("%d RUNNING CLIENTS\n", client_count); _cupsMutexUnlock(&client_mutex); sleep(1); } return (0); } /* * 'make_raster_file()' - Create a temporary raster file. */ static const char * /* O - Print filename */ make_raster_file(ipp_t *response, /* I - Printer attributes */ int grayscale, /* I - Force grayscale? */ char *tempname, /* I - Temporary filename buffer */ size_t tempsize, /* I - Size of temp file buffer */ const char **format) /* O - Print format */ { int i, /* Looping var */ count; /* Number of values */ ipp_attribute_t *attr; /* Printer attribute */ const char *type = NULL; /* Raster type (colorspace + bits) */ pwg_media_t *media = NULL; /* Media size */ int xdpi = 0, /* Horizontal resolution */ ydpi = 0; /* Vertical resolution */ int fd; /* Temporary file */ cups_mode_t mode; /* Raster mode */ cups_raster_t *ras; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned char *line, /* Line of raster data */ *lineptr; /* Pointer into line */ unsigned y, /* Current position on page */ xcount, ycount, /* Current count for X and Y */ xrep, yrep, /* Repeat count for X and Y */ xoff, yoff, /* Offsets for X and Y */ yend; /* End Y value */ int temprow, /* Row in template */ tempcolor; /* Template color */ const char *template; /* Pointer into template */ const unsigned char *color; /* Current color */ static const unsigned char colors[][3] = { /* Colors for test */ { 191, 191, 191 }, { 127, 127, 127 }, { 63, 63, 63 }, { 0, 0, 0 }, { 255, 0, 0 }, { 255, 127, 0 }, { 255, 255, 0 }, { 127, 255, 0 }, { 0, 255, 0 }, { 0, 255, 127 }, { 0, 255, 255 }, { 0, 127, 255 }, { 0, 0, 255 }, { 127, 0, 255 }, { 255, 0, 255 } }; static const char * const templates[] = { /* Raster template */ " CCC U U PPPP SSS TTTTT EEEEE SSS TTTTT 000 1 222 333 4 55555 66 77777 888 999 ", "C C U U P P S S T E S S T 0 0 11 2 2 3 3 4 4 5 6 7 8 8 9 9 ", "C U U P P S T E S T 0 0 1 2 3 4 4 5 6 7 8 8 9 9 ", "C U U PPPP SSS ----- T EEEE SSS T 0 0 0 1 22 333 44444 555 6666 7 888 9999 ", "C U U P S T E S T 0 0 1 2 3 4 5 6 6 7 8 8 9 ", "C C U U P S S T E S S T 0 0 1 2 3 3 4 5 5 6 6 7 8 8 9 ", " CCC UUU P SSS T EEEEE SSS T 000 111 22222 333 4 555 666 7 888 99 ", " " }; /* * Figure out the output format... */ if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) == NULL) { puts("No supported document formats, aborting."); return (NULL); } if (*format) { if (!ippContainsString(attr, *format)) { printf("Printer does not support document-format '%s'.\n", *format); return (NULL); } if (!strcmp(*format, "image/urf")) mode = CUPS_RASTER_WRITE_APPLE; else if (!strcmp(*format, "image/pwg-raster")) mode = CUPS_RASTER_WRITE_PWG; else { printf("Unable to generate document-format '%s'.\n", *format); return (NULL); } } else if (ippContainsString(attr, "image/urf")) { /* * Apple Raster format... */ *format = "image/urf"; mode = CUPS_RASTER_WRITE_APPLE; } else if (ippContainsString(attr, "image/pwg-raster")) { /* * PWG Raster format... */ *format = "image/pwg-raster"; mode = CUPS_RASTER_WRITE_PWG; } else { /* * No supported raster format... */ puts("Printer does not support Apple or PWG raster files, aborting."); return (NULL); } /* * Figure out the the media, resolution, and color mode... */ if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL) { /* * Use default media... */ media = pwgMediaForPWG(ippGetString(attr, 0, NULL)); } else if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL) { /* * Use ready media... */ if (ippContainsString(attr, "na_letter_8.5x11in")) media = pwgMediaForPWG("na_letter_8.5x11in"); else if (ippContainsString(attr, "iso_a4_210x297mm")) media = pwgMediaForPWG("iso_a4_210x297mm"); else media = pwgMediaForPWG(ippGetString(attr, 0, NULL)); } else { puts("No default or ready media reported by printer, aborting."); return (NULL); } if (mode == CUPS_RASTER_WRITE_APPLE && (attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { const char *val = ippGetString(attr, i, NULL); if (!strncmp(val, "RS", 2)) xdpi = ydpi = atoi(val + 2); else if (!strncmp(val, "W8", 2) && !type) type = "sgray_8"; else if (!strncmp(val, "SRGB24", 6) && !grayscale) type = "srgb_8"; } } else if (mode == CUPS_RASTER_WRITE_PWG && (attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { int tempxdpi, tempydpi; ipp_res_t tempunits; tempxdpi = ippGetResolution(attr, 0, &tempydpi, &tempunits); if (i == 0 || tempxdpi < xdpi || tempydpi < ydpi) { xdpi = tempxdpi; ydpi = tempydpi; } } if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) != NULL) { if (!grayscale && ippContainsString(attr, "srgb_8")) type = "srgb_8"; else if (ippContainsString(attr, "sgray_8")) type = "sgray_8"; } } if (xdpi < 72 || ydpi < 72) { puts("No supported raster resolutions, aborting."); return (NULL); } if (!type) { puts("No supported color spaces or bit depths, aborting."); return (NULL); } /* * Make the raster context and details... */ if (!cupsRasterInitPWGHeader(&header, media, type, xdpi, ydpi, "one-sided", NULL)) { printf("Unable to initialize raster context: %s\n", cupsRasterErrorString()); return (NULL); } header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = 1; if (header.cupsWidth > (4 * header.HWResolution[0])) { xoff = header.HWResolution[0] / 2; yoff = header.HWResolution[1] / 2; } else { xoff = 0; yoff = 0; } xrep = (header.cupsWidth - 2 * xoff) / 140; yrep = xrep * header.HWResolution[1] / header.HWResolution[0]; yend = header.cupsHeight - yoff; /* * Prepare the raster file... */ if ((line = malloc(header.cupsBytesPerLine)) == NULL) { printf("Unable to allocate %u bytes for raster output: %s\n", header.cupsBytesPerLine, strerror(errno)); return (NULL); } if ((fd = cupsTempFd(tempname, (int)tempsize)) < 0) { printf("Unable to create temporary print file: %s\n", strerror(errno)); free(line); return (NULL); } if ((ras = cupsRasterOpen(fd, mode)) == NULL) { printf("Unable to open raster stream: %s\n", cupsRasterErrorString()); close(fd); free(line); return (NULL); } /* * Write a single page consisting of the template dots repeated over the page. */ cupsRasterWriteHeader2(ras, &header); memset(line, 0xff, header.cupsBytesPerLine); for (y = 0; y < yoff; y ++) cupsRasterWritePixels(ras, line, header.cupsBytesPerLine); for (temprow = 0, tempcolor = 0; y < yend;) { template = templates[temprow]; color = colors[tempcolor]; temprow ++; if (temprow >= (int)(sizeof(templates) / sizeof(templates[0]))) { temprow = 0; tempcolor ++; if (tempcolor >= (int)(sizeof(colors) / sizeof(colors[0]))) tempcolor = 0; else if (tempcolor > 3 && header.cupsColorSpace == CUPS_CSPACE_SW) tempcolor = 0; } memset(line, 0xff, header.cupsBytesPerLine); if (header.cupsColorSpace == CUPS_CSPACE_SW) { /* * Do grayscale output... */ for (lineptr = line + xoff; *template; template ++) { if (*template != ' ') { for (xcount = xrep; xcount > 0; xcount --) *lineptr++ = *color; } else { lineptr += xrep; } } } else { /* * Do color output... */ for (lineptr = line + 3 * xoff; *template; template ++) { if (*template != ' ') { for (xcount = xrep; xcount > 0; xcount --, lineptr += 3) memcpy(lineptr, color, 3); } else { lineptr += 3 * xrep; } } } for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) cupsRasterWritePixels(ras, line, header.cupsBytesPerLine); } memset(line, 0xff, header.cupsBytesPerLine); for (y = 0; y < header.cupsHeight; y ++) cupsRasterWritePixels(ras, line, header.cupsBytesPerLine); cupsRasterClose(ras); close(fd); printf("PRINT FILE: %s\n", tempname); return (tempname); } /* * 'monitor_printer()' - Monitor the job and printer states. */ static void * /* O - Thread exit code */ monitor_printer( _client_data_t *data) /* I - Client data */ { http_t *http; /* Connection to printer */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* Attribute in response */ ipp_pstate_t printer_state; /* Printer state */ char printer_state_reasons[1024]; /* Printer state reasons */ ipp_jstate_t job_state; /* Job state */ char job_state_reasons[1024];/* Printer state reasons */ static const char * const jattrs[] = /* Job attributes we want */ { "job-state", "job-state-reasons" }; static const char * const pattrs[] = /* Printer attributes we want */ { "printer-state", "printer-state-reasons" }; /* * Open a connection to the printer... */ http = httpConnect2(data->hostname, data->port, NULL, AF_UNSPEC, data->encryption, 1, 0, NULL); /* * Loop until the job is canceled, aborted, or completed. */ printer_state = (ipp_pstate_t)0; printer_state_reasons[0] = '\0'; job_state = (ipp_jstate_t)0; job_state_reasons[0] = '\0'; while (data->job_state < IPP_JSTATE_CANCELED) { /* * Reconnect to the printer as needed... */ if (httpGetFd(http) < 0) httpReconnect2(http, 30000, NULL); if (httpGetFd(http) >= 0) { /* * Connected, so check on the printer state... */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); response = cupsDoRequest(http, request, data->resource); if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) printer_state = (ipp_pstate_t)ippGetInteger(attr, 0); if ((attr = ippFindAttribute(response, "printer-state-reasons", IPP_TAG_KEYWORD)) != NULL) ippAttributeString(attr, printer_state_reasons, sizeof(printer_state_reasons)); if (printer_state != data->printer_state || strcmp(printer_state_reasons, data->printer_state_reasons)) { printf("PRINTER: %s (%s)\n", ippEnumString("printer-state", (int)printer_state), printer_state_reasons); data->printer_state = printer_state; strlcpy(data->printer_state_reasons, printer_state_reasons, sizeof(data->printer_state_reasons)); } ippDelete(response); if (data->job_id > 0) { /* * Check the status of the job itself... */ request = ippNewRequest(IPP_OP_GET_JOB_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", data->job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(jattrs) / sizeof(jattrs[0])), NULL, jattrs); response = cupsDoRequest(http, request, data->resource); if ((attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM)) != NULL) job_state = (ipp_jstate_t)ippGetInteger(attr, 0); if ((attr = ippFindAttribute(response, "job-state-reasons", IPP_TAG_KEYWORD)) != NULL) ippAttributeString(attr, job_state_reasons, sizeof(job_state_reasons)); if (job_state != data->job_state || strcmp(job_state_reasons, data->job_state_reasons)) { printf("JOB %d: %s (%s)\n", data->job_id, ippEnumString("job-state", (int)job_state), job_state_reasons); data->job_state = job_state; strlcpy(data->job_state_reasons, job_state_reasons, sizeof(data->job_state_reasons)); } ippDelete(response); } } if (data->job_state < IPP_JSTATE_CANCELED) { /* * Sleep for 5 seconds... */ sleep(5); } } /* * Cleanup and return... */ httpClose(http); printf("FINISHED MONITORING JOB %d\n", data->job_id); return (NULL); } /* * 'run_client()' - Run a client thread. */ static void * /* O - Thread exit code */ run_client( _client_data_t *data) /* I - Client data */ { _cups_thread_t monitor_id; /* Monitoring thread ID */ const char *name; /* Job name */ char tempfile[1024] = ""; /* Temporary file (if any) */ _client_data_t ldata; /* Local client data */ http_t *http; /* Connection to printer */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* Attribute in response */ static const char * const pattrs[] = /* Printer attributes we are interested in */ { "job-template", "printer-defaults", "printer-description", "media-col-database", "media-col-ready" }; ldata = *data; /* * Start monitoring the printer in the background... */ monitor_id = _cupsThreadCreate((_cups_thread_func_t)monitor_printer, &ldata); /* * Open a connection to the printer... */ http = httpConnect2(data->hostname, data->port, NULL, AF_UNSPEC, data->encryption, 1, 0, NULL); /* * Query printer status and capabilities... */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ldata.uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); response = cupsDoRequest(http, request, ldata.resource); if (verbosity) show_capabilities(response); /* * Now figure out what we will be printing... */ if (ldata.docfile) { /* * User specified a print file, figure out the format... */ const char *ext; /* Filename extension */ if ((ext = strrchr(ldata.docfile, '.')) != NULL) { /* * Guess the format from the extension... */ if (!strcmp(ext, ".jpg")) ldata.docformat = "image/jpeg"; else if (!strcmp(ext, ".pdf")) ldata.docformat = "application/pdf"; else if (!strcmp(ext, ".ps")) ldata.docformat = "application/postscript"; else if (!strcmp(ext, ".pwg")) ldata.docformat = "image/pwg-raster"; else if (!strcmp(ext, ".urf")) ldata.docformat = "image/urf"; else ldata.docformat = "application/octet-stream"; } else { /* * Tell the printer to auto-detect... */ ldata.docformat = "application/octet-stream"; } } else { /* * No file specified, make something to test with... */ if ((ldata.docfile = make_raster_file(response, ldata.grayscale, tempfile, sizeof(tempfile), &ldata.docformat)) == NULL) return ((void *)1); } ippDelete(response); /* * Create a job and wait for completion... */ request = ippNewRequest(IPP_OP_CREATE_JOB); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ldata.uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if ((name = strrchr(ldata.docfile, '/')) != NULL) name ++; else name = ldata.docfile; ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, name); if (verbosity) show_attributes("Create-Job request", 1, request); response = cupsDoRequest(http, request, ldata.resource); if (verbosity) show_attributes("Create-Job response", 0, response); if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) { printf("Unable to create print job: %s\n", cupsLastErrorString()); ldata.job_state = IPP_JSTATE_ABORTED; goto cleanup; } if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL) { puts("No job-id returned in Create-Job request."); ldata.job_state = IPP_JSTATE_ABORTED; goto cleanup; } ldata.job_id = ippGetInteger(attr, 0); printf("CREATED JOB %d, sending %s of type %s\n", ldata.job_id, ldata.docfile, ldata.docformat); ippDelete(response); request = ippNewRequest(IPP_OP_SEND_DOCUMENT); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ldata.uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", ldata.job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, ldata.docformat); ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); if (verbosity) show_attributes("Send-Document request", 1, request); response = cupsDoFileRequest(http, request, ldata.resource, ldata.docfile); if (verbosity) show_attributes("Send-Document response", 0, response); if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) { printf("Unable to print file: %s\n", cupsLastErrorString()); ldata.job_state = IPP_JSTATE_ABORTED; goto cleanup; } puts("WAITING FOR JOB TO COMPLETE"); while (ldata.job_state < IPP_JSTATE_CANCELED) sleep(1); /* * Cleanup after ourselves... */ cleanup: httpClose(http); if (tempfile[0] && !ldata.keepfile) unlink(tempfile); _cupsThreadWait(monitor_id); _cupsMutexLock(&client_mutex); client_count --; _cupsMutexUnlock(&client_mutex); return (NULL); } /* * 'show_attributes()' - Show attributes in a request or response. */ static void show_attributes(const char *title, /* I - Title */ int request, /* I - 1 for request, 0 for response */ ipp_t *ipp) /* I - IPP request/response */ { int minor, major = ippGetVersion(ipp, &minor); /* IPP version number */ ipp_tag_t group = IPP_TAG_ZERO; /* Current group tag */ ipp_attribute_t *attr; /* Current attribute */ const char *name; /* Attribute name */ char buffer[1024]; /* Value */ printf("%s:\n", title); printf(" version=%d.%d\n", major, minor); printf(" request-id=%d\n", ippGetRequestId(ipp)); if (!request) printf(" status-code=%s\n", ippErrorString(ippGetStatusCode(ipp))); for (attr = ippFirstAttribute(ipp); attr; attr = ippNextAttribute(ipp)) { if (group != ippGetGroupTag(attr)) { group = ippGetGroupTag(attr); if (group) printf(" %s:\n", ippTagString(group)); } if ((name = ippGetName(attr)) != NULL) { ippAttributeString(attr, buffer, sizeof(buffer)); printf(" %s(%s%s)=%s\n", name, ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr)), buffer); } } } /* * 'show_capabilities()' - Show printer capabilities. */ static void show_capabilities(ipp_t *response) /* I - Printer attributes */ { int i; /* Looping var */ ipp_attribute_t *attr; /* Attribute */ char buffer[1024]; /* Attribute value buffer */ static const char * const pattrs[] = /* Attributes we want to show */ { "copies-default", "copies-supported", "finishings-default", "finishings-ready", "finishings-supported", "media-default", "media-ready", "media-supported", "output-bin-default", "output-bin-supported", "print-color-mode-default", "print-color-mode-supported", "sides-default", "sides-supported", "document-format-default", "document-format-supported", "pwg-raster-document-resolution-supported", "pwg-raster-document-type-supported", "urf-supported" }; puts("CAPABILITIES:"); for (i = 0; i < (int)(sizeof(pattrs) / sizeof(pattrs[0])); i ++) { if ((attr = ippFindAttribute(response, pattrs[i], IPP_TAG_ZERO)) != NULL) { ippAttributeString(attr, buffer, sizeof(buffer)); printf(" %s=%s\n", pattrs[i], buffer); } } } /* * 'usage()' - Show program usage... */ static void usage(void) { puts("Usage: ./testclient printer-uri [options]"); puts("Options:"); puts(" -c num-clients Simulate multiple clients"); puts(" -d document-format Generate the specified format"); puts(" -f print-file Print the named file"); puts(" -g Force grayscale printing"); puts(" -k Keep temporary files"); puts(" -v Be more verbose"); } cups-2.3.1/cups/test2.ppd000664 000765 000024 00000021377 13574721672 015331 0ustar00mikestaff000000 000000 *PPD-Adobe: "4.3" *% *% Test PPD file #2 for CUPS. *% *% This file is used to test the CUPS PPD API functions and cannot be *% used with any known printers. Look on the CUPS web site for working PPD *% files. *% *% If you are a PPD file developer, consider using the PPD compiler (ppdc) *% to create your PPD files - not only will it save you time, it produces *% consistently high-quality files. *% *% Copyright (c) 2007-2018 by Apple Inc. *% Copyright (c) 2002-2006 by Easy Software Products. *% *% Licensed under Apache License v2.0. See the file "LICENSE" for more *% information. *FormatVersion: "4.3" *FileVersion: "2.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "TEST.PPD" *Manufacturer: "Apple" *Product: "(Test2)" *cupsVersion: 2.3 *ModelName: "Test2" *ShortNickName: "Test2" *NickName: "Test2 for CUPS" *PSVersion: "(3010.000) 0" *LanguageLevel: "3" *ColorDevice: True *DefaultColorSpace: RGB *FileSystem: False *Throughput: "1" *LandscapeOrientation: Plus90 *TTRasterizer: Type42 *% These constraints are used to test ppdConflicts() and cupsResolveConflicts() *cupsUIConstraints envelope: "*PageSize Letter *InputSlot Envelope" *cupsUIConstraints envelope: "*PageSize A4 *InputSlot Envelope" *cupsUIResolver envelope: "*InputSlot Manual *PageSize Env10" *cupsUIConstraints envphoto: "*PageSize Env10 *InputSlot Envelope *Quality Photo" *cupsUIResolver envphoto: "*Quality Normal" *% This constraint is used to test ppdInstallableConflict() *cupsUIConstraints: "*Duplex *InstalledDuplexer False" *% These constraints are used to test the loop detection code in cupsResolveConflicts() *cupsUIConstraints loop1: "*PageSize A4 *Quality Photo" *cupsUIResolver loop1: "*Quality Normal" *cupsUIConstraints loop2: "*PageSize A4 *Quality Normal" *cupsUIResolver loop2: "*Quality Photo" *% For PageSize, we have put all of the translations in-line... *OpenUI *PageSize/Page Size: PickOne *fr.Translation PageSize/French Page Size: "" *fr_CA.Translation PageSize/French Canadian Page Size: "" *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: Letter *PageSize Letter/US Letter: "PageSize=Letter" *fr.PageSize Letter/French US Letter: "" *fr_CA.PageSize Letter/French Canadian US Letter: "" *PageSize A4/A4: "PageSize=A4" *fr.PageSize A4/French A4: "" *fr_CA.PageSize A4/French Canadian A4: "" *PageSize Env10/#10 Envelope: "PageSize=Env10" *fr.PageSize Env10/French #10 Envelope: "" *fr_CA.PageSize Env10/French Canadian #10 Envelope: "" *CloseUI: *PageSize *% For PageRegion, we have separated the translations... *OpenUI *PageRegion/Page Region: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: Letter *PageRegion Letter/US Letter: "PageRegion=Letter" *PageRegion A4/A4: "PageRegion=A4" *PageRegion Env10/#10 Envelope: "PageRegion=Env10" *CloseUI: *PageRegion *fr.Translation PageRegion/French Page Region: "" *fr.PageRegion Letter/French US Letter: "" *fr.PageRegion A4/French A4: "" *fr.PageRegion Env10/French #10 Envelope: "" *fr_CA.Translation PageRegion/French Canadian Page Region: "" *fr_CA.PageRegion Letter/French Canadian US Letter: "" *fr_CA.PageRegion A4/French Canadian A4: "" *fr_CA.PageRegion Env10/French Canadian #10 Envelope: "" *DefaultImageableArea: Letter *ImageableArea Letter: "18 36 594 756" *ImageableArea A4: "18 36 577 806" *ImageableArea Env10: "18 36 279 648" *DefaultPaperDimension: Letter *PaperDimension Letter: "612 792" *PaperDimension A4: "595 842" *PaperDimension Env10: "297 684" *% Custom page size support *HWMargins: 0 0 0 0 *NonUIOrderDependency: 100 AnySetup *CustomPageSize True *CustomPageSize True/Custom Page Size: "PageSize=Custom" *ParamCustomPageSize Width: 1 points 36 1080 *ParamCustomPageSize Height: 2 points 36 86400 *ParamCustomPageSize WidthOffset/Width Offset: 3 points 0 0 *ParamCustomPageSize HeightOffset/Height Offset: 4 points 0 0 *ParamCustomPageSize Orientation: 5 int 0 0 *cupsMediaQualifier2: InputSlot *cupsMediaQualifier3: Quality *cupsMaxSize .Manual.: "1000 1000" *cupsMinSize .Manual.: "100 100" *cupsMinSize .Manual.Photo: "200 200" *cupsMinSize ..Photo: "300 300" *OpenUI *InputSlot/Input Slot: PickOne *OrderDependency: 20 AnySetup *InputSlot *DefaultInputSlot: Tray *InputSlot Tray/Tray: "InputSlot=Tray" *InputSlot Manual/Manual Feed: "InputSlot=Manual" *InputSlot Envelope/Envelope Feed: "InputSlot=Envelope" *CloseUI: *InputSlot *OpenUI *Quality/Output Mode: PickOne *OrderDependency: 20 AnySetup *Quality *DefaultQuality: Normal *Quality Draft: "Quality=Draft" *Quality Normal: "Quality=Normal" *Quality Photo: "Quality=Photo" *CloseUI: *Quality *OpenUI *Duplex/2-Sided Printing: PickOne *OrderDependency: 10 DocumentSetup *Duplex *DefaultDuplex: None *Duplex None/Off: "Duplex=None" *Duplex DuplexNoTumble/Long Edge: "Duplex=DuplexNoTumble" *Duplex DuplexTumble/Short Edge: "Duplex=DuplexTumble" *CloseUI: *Duplex *% Installable option... *OpenGroup: InstallableOptions/Installable Options *OpenUI InstalledDuplexer/Duplexer Installed: Boolean *DefaultInstalledDuplexer: False *InstalledDuplexer False: "" *InstalledDuplexer True: "" *CloseUI: *InstalledDuplexer *CloseGroup: InstallableOptions *% Custom options... *OpenGroup: Extended/Extended Options *OpenUI IntOption/Integer: PickOne *OrderDependency: 30 AnySetup *IntOption *DefaultIntOption: None *IntOption None: "" *IntOption 1: "IntOption=1" *IntOption 2: "IntOption=2" *IntOption 3: "IntOption=3" *CloseUI: *IntOption *CustomIntOption True/Custom Integer: "IntOption=Custom" *ParamCustomIntOption Integer: 1 int -100 100 *OpenUI StringOption/String: PickOne *OrderDependency: 40 AnySetup *StringOption *DefaultStringOption: None *StringOption None: "" *StringOption foo: "StringOption=foo" *StringOption bar: "StringOption=bar" *CloseUI: *StringOption *CustomStringOption True/Custom String: "StringOption=Custom" *ParamCustomStringOption String: 1 string 1 10 *CloseGroup: Extended *% IPP reasons for ppdLocalizeIPPReason tests *cupsIPPReason foo/Foo Reason: "http://foo/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/foo/bar.html" *End *fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long%20 text:Foo%20Reason http://foo/fr/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/fr/foo/bar.html" *End *zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201%20 text:Foo%20Reason http://foo/zh_TW/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/zh_TW/foo/bar.html" *End *zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202%20 text:Foo%20Reason http://foo/zh/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/zh/foo/bar.html" *End *% Marker names for ppdLocalizeMarkerName tests *cupsMarkerName cyan/Cyan Toner: "" *fr.cupsMarkerName cyan/La Toner Cyan: "" *zh_TW.cupsMarkerName cyan/Number 1 Cyan Toner: "" *zh.cupsMarkerName cyan/Number 2 Cyan Toner: "" *DefaultFont: Courier *Font AvantGarde-Book: Standard "(001.006S)" Standard ROM *Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM *Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM *Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM *Font Bookman-Demi: Standard "(001.004S)" Standard ROM *Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM *Font Bookman-Light: Standard "(001.004S)" Standard ROM *Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM *Font Courier: Standard "(002.004S)" Standard ROM *Font Courier-Bold: Standard "(002.004S)" Standard ROM *Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM *Font Courier-Oblique: Standard "(002.004S)" Standard ROM *Font Helvetica: Standard "(001.006S)" Standard ROM *Font Helvetica-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM *Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM *Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM *Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM *Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM *Font Palatino-Bold: Standard "(001.005S)" Standard ROM *Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM *Font Palatino-Italic: Standard "(001.005S)" Standard ROM *Font Palatino-Roman: Standard "(001.005S)" Standard ROM *Font Symbol: Special "(001.007S)" Special ROM *Font Times-Bold: Standard "(001.007S)" Standard ROM *Font Times-BoldItalic: Standard "(001.009S)" Standard ROM *Font Times-Italic: Standard "(001.007S)" Standard ROM *Font Times-Roman: Standard "(001.007S)" Standard ROM *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM cups-2.3.1/cups/sidechannel.c000664 000765 000024 00000041000 13574721672 016165 0ustar00mikestaff000000 000000 /* * Side-channel API code for CUPS. * * 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. */ /* * Include necessary headers... */ #include "sidechannel.h" #include "cups-private.h" #include "debug-internal.h" #ifdef _WIN32 # include #else # include # include # include #endif /* _WIN32 */ #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ /* * Buffer size for side-channel requests... */ #define _CUPS_SC_MAX_DATA 65535 #define _CUPS_SC_MAX_BUFFER 65540 /* * 'cupsSideChannelDoRequest()' - Send a side-channel command to a backend and wait for a response. * * This function is normally only called by filters, drivers, or port * monitors in order to communicate with the backend used by the current * printer. Programs must be prepared to handle timeout or "not * implemented" status codes, which indicate that the backend or device * do not support the specified side-channel command. * * The "datalen" parameter must be initialized to the size of the buffer * pointed to by the "data" parameter. cupsSideChannelDoRequest() will * update the value to contain the number of data bytes in the buffer. * * @since CUPS 1.3/macOS 10.5@ */ cups_sc_status_t /* O - Status of command */ cupsSideChannelDoRequest( cups_sc_command_t command, /* I - Command to send */ char *data, /* O - Response data buffer pointer */ int *datalen, /* IO - Size of data buffer on entry, number of bytes in buffer on return */ double timeout) /* I - Timeout in seconds */ { cups_sc_status_t status; /* Status of command */ cups_sc_command_t rcommand; /* Response command */ if (cupsSideChannelWrite(command, CUPS_SC_STATUS_NONE, NULL, 0, timeout)) return (CUPS_SC_STATUS_TIMEOUT); if (cupsSideChannelRead(&rcommand, &status, data, datalen, timeout)) return (CUPS_SC_STATUS_TIMEOUT); if (rcommand != command) return (CUPS_SC_STATUS_BAD_MESSAGE); return (status); } /* * 'cupsSideChannelRead()' - Read a side-channel message. * * This function is normally only called by backend programs to read * commands from a filter, driver, or port monitor program. The * caller must be prepared to handle incomplete or invalid messages * and return the corresponding status codes. * * The "datalen" parameter must be initialized to the size of the buffer * pointed to by the "data" parameter. cupsSideChannelDoRequest() will * update the value to contain the number of data bytes in the buffer. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsSideChannelRead( cups_sc_command_t *command, /* O - Command code */ cups_sc_status_t *status, /* O - Status code */ char *data, /* O - Data buffer pointer */ int *datalen, /* IO - Size of data buffer on entry, number of bytes in buffer on return */ double timeout) /* I - Timeout in seconds */ { char *buffer; /* Message buffer */ ssize_t bytes; /* Bytes read */ int templen; /* Data length from message */ int nfds; /* Number of file descriptors */ #ifdef HAVE_POLL struct pollfd pfd; /* Poll structure for poll() */ #else /* select() */ fd_set input_set; /* Input set for select() */ struct timeval stimeout; /* Timeout value for select() */ #endif /* HAVE_POLL */ DEBUG_printf(("cupsSideChannelRead(command=%p, status=%p, data=%p, " "datalen=%p(%d), timeout=%.3f)", command, status, data, datalen, datalen ? *datalen : -1, timeout)); /* * Range check input... */ if (!command || !status) return (-1); /* * See if we have pending data on the side-channel socket... */ #ifdef HAVE_POLL pfd.fd = CUPS_SC_FD; pfd.events = POLLIN; while ((nfds = poll(&pfd, 1, timeout < 0.0 ? -1 : (int)(timeout * 1000))) < 0 && (errno == EINTR || errno == EAGAIN)) ; #else /* select() */ FD_ZERO(&input_set); FD_SET(CUPS_SC_FD, &input_set); stimeout.tv_sec = (int)timeout; stimeout.tv_usec = (int)(timeout * 1000000) % 1000000; while ((nfds = select(CUPS_SC_FD + 1, &input_set, NULL, NULL, timeout < 0.0 ? NULL : &stimeout)) < 0 && (errno == EINTR || errno == EAGAIN)) ; #endif /* HAVE_POLL */ if (nfds < 1) { *command = CUPS_SC_CMD_NONE; *status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR; return (-1); } /* * Read a side-channel message for the format: * * Byte(s) Description * ------- ------------------------------------------- * 0 Command code * 1 Status code * 2-3 Data length (network byte order) * 4-N Data */ if ((buffer = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL) { *command = CUPS_SC_CMD_NONE; *status = CUPS_SC_STATUS_TOO_BIG; return (-1); } while ((bytes = read(CUPS_SC_FD, buffer, _CUPS_SC_MAX_BUFFER)) < 0) if (errno != EINTR && errno != EAGAIN) { DEBUG_printf(("1cupsSideChannelRead: Read error: %s", strerror(errno))); _cupsBufferRelease(buffer); *command = CUPS_SC_CMD_NONE; *status = CUPS_SC_STATUS_IO_ERROR; return (-1); } /* * Watch for EOF or too few bytes... */ if (bytes < 4) { DEBUG_printf(("1cupsSideChannelRead: Short read of " CUPS_LLFMT " bytes", CUPS_LLCAST bytes)); _cupsBufferRelease(buffer); *command = CUPS_SC_CMD_NONE; *status = CUPS_SC_STATUS_BAD_MESSAGE; return (-1); } /* * Validate the command code in the message... */ if (buffer[0] < CUPS_SC_CMD_SOFT_RESET || buffer[0] >= CUPS_SC_CMD_MAX) { DEBUG_printf(("1cupsSideChannelRead: Bad command %d!", buffer[0])); _cupsBufferRelease(buffer); *command = CUPS_SC_CMD_NONE; *status = CUPS_SC_STATUS_BAD_MESSAGE; return (-1); } *command = (cups_sc_command_t)buffer[0]; /* * Validate the data length in the message... */ templen = ((buffer[2] & 255) << 8) | (buffer[3] & 255); if (templen > 0 && (!data || !datalen)) { /* * Either the response is bigger than the provided buffer or the * response is bigger than we've read... */ *status = CUPS_SC_STATUS_TOO_BIG; } else if (!datalen || templen > *datalen || templen > (bytes - 4)) { /* * Either the response is bigger than the provided buffer or the * response is bigger than we've read... */ *status = CUPS_SC_STATUS_TOO_BIG; } else { /* * The response data will fit, copy it over and provide the actual * length... */ *status = (cups_sc_status_t)buffer[1]; *datalen = templen; memcpy(data, buffer + 4, (size_t)templen); } _cupsBufferRelease(buffer); DEBUG_printf(("1cupsSideChannelRead: Returning status=%d", *status)); return (0); } /* * 'cupsSideChannelSNMPGet()' - Query a SNMP OID's value. * * This function asks the backend to do a SNMP OID query on behalf of the * filter, port monitor, or backend using the default community name. * * "oid" contains a numeric OID consisting of integers separated by periods, * for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not * supported and must be converted to their numeric forms. * * On input, "data" and "datalen" provide the location and size of the * buffer to hold the OID value as a string. HEX-String (binary) values are * converted to hexadecimal strings representing the binary data, while * NULL-Value and unknown OID types are returned as the empty string. * The returned "datalen" does not include the trailing nul. * * @code CUPS_SC_STATUS_NOT_IMPLEMENTED@ is returned by backends that do not * support SNMP queries. @code CUPS_SC_STATUS_NO_RESPONSE@ is returned when * the printer does not respond to the SNMP query. * * @since CUPS 1.4/macOS 10.6@ */ cups_sc_status_t /* O - Query status */ cupsSideChannelSNMPGet( const char *oid, /* I - OID to query */ char *data, /* I - Buffer for OID value */ int *datalen, /* IO - Size of OID buffer on entry, size of value on return */ double timeout) /* I - Timeout in seconds */ { cups_sc_status_t status; /* Status of command */ cups_sc_command_t rcommand; /* Response command */ char *real_data; /* Real data buffer for response */ int real_datalen, /* Real length of data buffer */ real_oidlen; /* Length of returned OID string */ DEBUG_printf(("cupsSideChannelSNMPGet(oid=\"%s\", data=%p, datalen=%p(%d), " "timeout=%.3f)", oid, data, datalen, datalen ? *datalen : -1, timeout)); /* * Range check input... */ if (!oid || !*oid || !data || !datalen || *datalen < 2) return (CUPS_SC_STATUS_BAD_MESSAGE); *data = '\0'; /* * Send the request to the backend and wait for a response... */ if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET, CUPS_SC_STATUS_NONE, oid, (int)strlen(oid) + 1, timeout)) return (CUPS_SC_STATUS_TIMEOUT); if ((real_data = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL) return (CUPS_SC_STATUS_TOO_BIG); real_datalen = _CUPS_SC_MAX_BUFFER; if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen, timeout)) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_TIMEOUT); } if (rcommand != CUPS_SC_CMD_SNMP_GET) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_BAD_MESSAGE); } if (status == CUPS_SC_STATUS_OK) { /* * Parse the response of the form "oid\0value"... */ real_oidlen = (int)strlen(real_data) + 1; real_datalen -= real_oidlen; if ((real_datalen + 1) > *datalen) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_TOO_BIG); } memcpy(data, real_data + real_oidlen, (size_t)real_datalen); data[real_datalen] = '\0'; *datalen = real_datalen; } _cupsBufferRelease(real_data); return (status); } /* * 'cupsSideChannelSNMPWalk()' - Query multiple SNMP OID values. * * This function asks the backend to do multiple SNMP OID queries on behalf * of the filter, port monitor, or backend using the default community name. * All OIDs under the "parent" OID are queried and the results are sent to * the callback function you provide. * * "oid" contains a numeric OID consisting of integers separated by periods, * for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not * supported and must be converted to their numeric forms. * * "timeout" specifies the timeout for each OID query. The total amount of * time will depend on the number of OID values found and the time required * for each query. * * "cb" provides a function to call for every value that is found. "context" * is an application-defined pointer that is sent to the callback function * along with the OID and current data. The data passed to the callback is the * same as returned by @link cupsSideChannelSNMPGet@. * * @code CUPS_SC_STATUS_NOT_IMPLEMENTED@ is returned by backends that do not * support SNMP queries. @code CUPS_SC_STATUS_NO_RESPONSE@ is returned when * the printer does not respond to the first SNMP query. * * @since CUPS 1.4/macOS 10.6@ */ cups_sc_status_t /* O - Status of first query of @code CUPS_SC_STATUS_OK@ on success */ cupsSideChannelSNMPWalk( const char *oid, /* I - First numeric OID to query */ double timeout, /* I - Timeout for each query in seconds */ cups_sc_walk_func_t cb, /* I - Function to call with each value */ void *context) /* I - Application-defined pointer to send to callback */ { cups_sc_status_t status; /* Status of command */ cups_sc_command_t rcommand; /* Response command */ char *real_data; /* Real data buffer for response */ int real_datalen; /* Real length of data buffer */ size_t real_oidlen, /* Length of returned OID string */ oidlen; /* Length of first OID */ const char *current_oid; /* Current OID */ char last_oid[2048]; /* Last OID */ DEBUG_printf(("cupsSideChannelSNMPWalk(oid=\"%s\", timeout=%.3f, cb=%p, " "context=%p)", oid, timeout, cb, context)); /* * Range check input... */ if (!oid || !*oid || !cb) return (CUPS_SC_STATUS_BAD_MESSAGE); if ((real_data = _cupsBufferGet(_CUPS_SC_MAX_BUFFER)) == NULL) return (CUPS_SC_STATUS_TOO_BIG); /* * Loop until the OIDs don't match... */ current_oid = oid; oidlen = strlen(oid); last_oid[0] = '\0'; do { /* * Send the request to the backend and wait for a response... */ if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET_NEXT, CUPS_SC_STATUS_NONE, current_oid, (int)strlen(current_oid) + 1, timeout)) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_TIMEOUT); } real_datalen = _CUPS_SC_MAX_BUFFER; if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen, timeout)) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_TIMEOUT); } if (rcommand != CUPS_SC_CMD_SNMP_GET_NEXT) { _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_BAD_MESSAGE); } if (status == CUPS_SC_STATUS_OK) { /* * Parse the response of the form "oid\0value"... */ if (strncmp(real_data, oid, oidlen) || real_data[oidlen] != '.' || !strcmp(real_data, last_oid)) { /* * Done with this set of OIDs... */ _cupsBufferRelease(real_data); return (CUPS_SC_STATUS_OK); } if ((size_t)real_datalen < sizeof(real_data)) real_data[real_datalen] = '\0'; real_oidlen = strlen(real_data) + 1; real_datalen -= (int)real_oidlen; /* * Call the callback with the OID and data... */ (*cb)(real_data, real_data + real_oidlen, real_datalen, context); /* * Update the current OID... */ current_oid = real_data; strlcpy(last_oid, current_oid, sizeof(last_oid)); } } while (status == CUPS_SC_STATUS_OK); _cupsBufferRelease(real_data); return (status); } /* * 'cupsSideChannelWrite()' - Write a side-channel message. * * This function is normally only called by backend programs to send * responses to a filter, driver, or port monitor program. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsSideChannelWrite( cups_sc_command_t command, /* I - Command code */ cups_sc_status_t status, /* I - Status code */ const char *data, /* I - Data buffer pointer */ int datalen, /* I - Number of bytes of data */ double timeout) /* I - Timeout in seconds */ { char *buffer; /* Message buffer */ ssize_t bytes; /* Bytes written */ #ifdef HAVE_POLL struct pollfd pfd; /* Poll structure for poll() */ #else /* select() */ fd_set output_set; /* Output set for select() */ struct timeval stimeout; /* Timeout value for select() */ #endif /* HAVE_POLL */ /* * Range check input... */ if (command < CUPS_SC_CMD_SOFT_RESET || command >= CUPS_SC_CMD_MAX || datalen < 0 || datalen > _CUPS_SC_MAX_DATA || (datalen > 0 && !data)) return (-1); /* * See if we can safely write to the side-channel socket... */ #ifdef HAVE_POLL pfd.fd = CUPS_SC_FD; pfd.events = POLLOUT; if (timeout < 0.0) { if (poll(&pfd, 1, -1) < 1) return (-1); } else if (poll(&pfd, 1, (int)(timeout * 1000)) < 1) return (-1); #else /* select() */ FD_ZERO(&output_set); FD_SET(CUPS_SC_FD, &output_set); if (timeout < 0.0) { if (select(CUPS_SC_FD + 1, NULL, &output_set, NULL, NULL) < 1) return (-1); } else { stimeout.tv_sec = (int)timeout; stimeout.tv_usec = (int)(timeout * 1000000) % 1000000; if (select(CUPS_SC_FD + 1, NULL, &output_set, NULL, &stimeout) < 1) return (-1); } #endif /* HAVE_POLL */ /* * Write a side-channel message in the format: * * Byte(s) Description * ------- ------------------------------------------- * 0 Command code * 1 Status code * 2-3 Data length (network byte order) <= 16384 * 4-N Data */ if ((buffer = _cupsBufferGet((size_t)datalen + 4)) == NULL) return (-1); buffer[0] = (char)command; buffer[1] = (char)status; buffer[2] = (char)(datalen >> 8); buffer[3] = (char)(datalen & 255); bytes = 4; if (datalen > 0) { memcpy(buffer + 4, data, (size_t)datalen); bytes += datalen; } while (write(CUPS_SC_FD, buffer, (size_t)bytes) < 0) if (errno != EINTR && errno != EAGAIN) { _cupsBufferRelease(buffer); return (-1); } _cupsBufferRelease(buffer); return (0); } cups-2.3.1/cups/ppd-emit.c000664 000765 000024 00000071526 13574721672 015447 0ustar00mikestaff000000 000000 /* * PPD code emission routines for CUPS. * * 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include "ppd.h" #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ /* * Local functions... */ static int ppd_compare_cparams(ppd_cparam_t *a, ppd_cparam_t *b); static void ppd_handle_media(ppd_file_t *ppd); /* * Local globals... */ static const char ppd_custom_code[] = "pop pop pop\n" "<>setpagedevice\n"; /* * 'ppdCollect()' - Collect all marked options that reside in the specified * section. * * The choices array should be freed using @code free@ when you are * finished with it. */ int /* O - Number of options marked */ ppdCollect(ppd_file_t *ppd, /* I - PPD file data */ ppd_section_t section, /* I - Section to collect */ ppd_choice_t ***choices) /* O - Pointers to choices */ { return (ppdCollect2(ppd, section, 0.0, choices)); } /* * 'ppdCollect2()' - Collect all marked options that reside in the * specified section and minimum order. * * The choices array should be freed using @code free@ when you are * finished with it. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Number of options marked */ ppdCollect2(ppd_file_t *ppd, /* I - PPD file data */ ppd_section_t section, /* I - Section to collect */ float min_order, /* I - Minimum OrderDependency value */ ppd_choice_t ***choices) /* O - Pointers to choices */ { ppd_choice_t *c; /* Current choice */ ppd_section_t csection; /* Current section */ float corder; /* Current OrderDependency value */ int count; /* Number of choices collected */ ppd_choice_t **collect; /* Collected choices */ float *orders; /* Collected order values */ DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)", ppd, section, min_order, choices)); if (!ppd || !choices) { if (choices) *choices = NULL; return (0); } /* * Allocate memory for up to N selected choices... */ count = 0; if ((collect = calloc(sizeof(ppd_choice_t *), (size_t)cupsArrayCount(ppd->marked))) == NULL) { *choices = NULL; return (0); } if ((orders = calloc(sizeof(float), (size_t)cupsArrayCount(ppd->marked))) == NULL) { *choices = NULL; free(collect); return (0); } /* * Loop through all options and add choices as needed... */ for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); c; c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) { csection = c->option->section; corder = c->option->order; if (!strcmp(c->choice, "Custom")) { ppd_attr_t *attr; /* NonUIOrderDependency value */ float aorder; /* Order value */ char asection[17], /* Section name */ amain[PPD_MAX_NAME + 1], aoption[PPD_MAX_NAME]; /* *CustomFoo and True */ for (attr = ppdFindAttr(ppd, "NonUIOrderDependency", NULL); attr; attr = ppdFindNextAttr(ppd, "NonUIOrderDependency", NULL)) if (attr->value && sscanf(attr->value, "%f%16s%41s%40s", &aorder, asection, amain, aoption) == 4 && !strncmp(amain, "*Custom", 7) && !strcmp(amain + 7, c->option->keyword) && !strcmp(aoption, "True")) { /* * Use this NonUIOrderDependency... */ corder = aorder; if (!strcmp(asection, "DocumentSetup")) csection = PPD_ORDER_DOCUMENT; else if (!strcmp(asection, "ExitServer")) csection = PPD_ORDER_EXIT; else if (!strcmp(asection, "JCLSetup")) csection = PPD_ORDER_JCL; else if (!strcmp(asection, "PageSetup")) csection = PPD_ORDER_PAGE; else if (!strcmp(asection, "Prolog")) csection = PPD_ORDER_PROLOG; else csection = PPD_ORDER_ANY; break; } } if (csection == section && corder >= min_order) { collect[count] = c; orders[count] = corder; count ++; } } /* * If we have more than 1 marked choice, sort them... */ if (count > 1) { int i, j; /* Looping vars */ for (i = 0; i < (count - 1); i ++) for (j = i + 1; j < count; j ++) if (orders[i] > orders[j]) { c = collect[i]; corder = orders[i]; collect[i] = collect[j]; orders[i] = orders[j]; collect[j] = c; orders[j] = corder; } } free(orders); DEBUG_printf(("2ppdCollect2: %d marked choices...", count)); /* * Return the array and number of choices; if 0, free the array since * it isn't needed. */ if (count > 0) { *choices = collect; return (count); } else { *choices = NULL; free(collect); return (0); } } /* * 'ppdEmit()' - Emit code for marked options to a file. */ int /* O - 0 on success, -1 on failure */ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */ FILE *fp, /* I - File to write to */ ppd_section_t section) /* I - Section to write */ { return (ppdEmitAfterOrder(ppd, fp, section, 0, 0.0)); } /* * 'ppdEmitAfterOrder()' - Emit a subset of the code for marked options to a file. * * When "limit" is non-zero, this function only emits options whose * OrderDependency value is greater than or equal to "min_order". * * When "limit" is zero, this function is identical to ppdEmit(). * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on failure */ ppdEmitAfterOrder( ppd_file_t *ppd, /* I - PPD file record */ FILE *fp, /* I - File to write to */ ppd_section_t section, /* I - Section to write */ int limit, /* I - Non-zero to use min_order */ float min_order) /* I - Lowest OrderDependency */ { char *buffer; /* Option code */ int status; /* Return status */ /* * Range check input... */ if (!ppd || !fp) return (-1); /* * Get the string... */ buffer = ppdEmitString(ppd, section, limit ? min_order : 0.0f); /* * Write it as needed and return... */ if (buffer) { status = fputs(buffer, fp) < 0 ? -1 : 0; free(buffer); } else status = 0; return (status); } /* * 'ppdEmitFd()' - Emit code for marked options to a file. */ int /* O - 0 on success, -1 on failure */ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */ int fd, /* I - File to write to */ ppd_section_t section) /* I - Section to write */ { char *buffer, /* Option code */ *bufptr; /* Pointer into code */ size_t buflength; /* Length of option code */ ssize_t bytes; /* Bytes written */ int status; /* Return status */ /* * Range check input... */ if (!ppd || fd < 0) return (-1); /* * Get the string... */ buffer = ppdEmitString(ppd, section, 0.0); /* * Write it as needed and return... */ if (buffer) { buflength = strlen(buffer); bufptr = buffer; bytes = 0; while (buflength > 0) { #ifdef _WIN32 if ((bytes = (ssize_t)write(fd, bufptr, (unsigned)buflength)) < 0) #else if ((bytes = write(fd, bufptr, buflength)) < 0) #endif /* _WIN32 */ { if (errno == EAGAIN || errno == EINTR) continue; break; } buflength -= (size_t)bytes; bufptr += bytes; } status = bytes < 0 ? -1 : 0; free(buffer); } else status = 0; return (status); } /* * 'ppdEmitJCL()' - Emit code for JCL options to a file. */ int /* O - 0 on success, -1 on failure */ ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */ FILE *fp, /* I - File to write to */ int job_id, /* I - Job ID */ const char *user, /* I - Username */ const char *title) /* I - Title */ { char *ptr; /* Pointer into JCL string */ char temp[65], /* Local title string */ displaymsg[33]; /* Local display string */ /* * Range check the input... */ if (!ppd || !ppd->jcl_begin || !ppd->jcl_ps) return (0); /* * See if the printer supports HP PJL... */ if (!strncmp(ppd->jcl_begin, "\033%-12345X@", 10)) { /* * This printer uses HP PJL commands for output; filter the output * so that we only have a single "@PJL JOB" command in the header... * * To avoid bugs in the PJL implementation of certain vendors' products * (Xerox in particular), we add a dummy "@PJL" command at the beginning * of the PJL commands to initialize PJL processing. */ ppd_attr_t *charset; /* PJL charset */ ppd_attr_t *display; /* PJL display command */ if ((charset = ppdFindAttr(ppd, "cupsPJLCharset", NULL)) != NULL) { if (!charset->value || _cups_strcasecmp(charset->value, "UTF-8")) charset = NULL; } if ((display = ppdFindAttr(ppd, "cupsPJLDisplay", NULL)) != NULL) { if (!display->value) display = NULL; } fputs("\033%-12345X@PJL\n", fp); for (ptr = ppd->jcl_begin + 9; *ptr;) if (!strncmp(ptr, "@PJL JOB", 8)) { /* * Skip job command... */ for (;*ptr; ptr ++) if (*ptr == '\n') break; if (*ptr) ptr ++; } else { /* * Copy line... */ for (;*ptr; ptr ++) { putc(*ptr, fp); if (*ptr == '\n') break; } if (*ptr) ptr ++; } /* * Clean up the job title... */ if (!title) title = "Unknown"; if ((ptr = strrchr(title, '/')) != NULL) { /* * Only show basename of file path... */ title = ptr + 1; } if (!strncmp(title, "smbprn.", 7)) { /* * Skip leading smbprn.######## from Samba jobs... */ for (title += 7; *title && isdigit(*title & 255); title ++); while (_cups_isspace(*title)) title ++; if ((ptr = strstr(title, " - ")) != NULL) { /* * Skip application name in "Some Application - Title of job"... */ title = ptr + 3; } } /* * Replace double quotes with single quotes and UTF-8 characters with * question marks so that the title does not cause a PJL syntax error. */ strlcpy(temp, title, sizeof(temp)); for (ptr = temp; *ptr; ptr ++) if (*ptr == '\"') *ptr = '\''; else if (!charset && (*ptr & 128)) *ptr = '?'; /* * CUPS STR #3125: Long PJL JOB NAME causes problems with some printers * * Generate the display message, truncating at 32 characters + nul to avoid * issues with some printer's PJL implementations... */ if (!user) user = "anonymous"; snprintf(displaymsg, sizeof(displaymsg), "%d %s %s", job_id, user, temp); /* * Send PJL JOB and PJL RDYMSG commands before we enter PostScript mode... */ if (display && strcmp(display->value, "job")) fprintf(fp, "@PJL JOB NAME = \"%s\"\n", temp); else if (display && !strcmp(display->value, "rdymsg")) fprintf(fp, "@PJL RDYMSG DISPLAY = \"%s\"\n", displaymsg); else fprintf(fp, "@PJL JOB NAME = \"%s\" DISPLAY = \"%s\"\n", temp, displaymsg); /* * Replace double quotes with single quotes and UTF-8 characters with * question marks so that the user does not cause a PJL syntax error. */ strlcpy(temp, user, sizeof(temp)); for (ptr = temp; *ptr; ptr ++) if (*ptr == '\"') *ptr = '\''; else if (!charset && (*ptr & 128)) *ptr = '?'; fprintf(fp, "@PJL SET USERNAME = \"%s\"\n", temp); } else fputs(ppd->jcl_begin, fp); ppdEmit(ppd, fp, PPD_ORDER_JCL); fputs(ppd->jcl_ps, fp); return (0); } /* * 'ppdEmitJCLEnd()' - Emit JCLEnd code to a file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on failure */ ppdEmitJCLEnd(ppd_file_t *ppd, /* I - PPD file record */ FILE *fp) /* I - File to write to */ { /* * Range check the input... */ if (!ppd) return (0); if (!ppd->jcl_end) { if (ppd->num_filters == 0) putc(0x04, fp); return (0); } /* * See if the printer supports HP PJL... */ if (!strncmp(ppd->jcl_end, "\033%-12345X@", 10)) { /* * This printer uses HP PJL commands for output; filter the output * so that we only have a single "@PJL JOB" command in the header... * * To avoid bugs in the PJL implementation of certain vendors' products * (Xerox in particular), we add a dummy "@PJL" command at the beginning * of the PJL commands to initialize PJL processing. */ fputs("\033%-12345X@PJL\n", fp); fputs("@PJL RDYMSG DISPLAY = \"\"\n", fp); fputs(ppd->jcl_end + 9, fp); } else fputs(ppd->jcl_end, fp); return (0); } /* * 'ppdEmitString()' - Get a string containing the code for marked options. * * When "min_order" is greater than zero, this function only includes options * whose OrderDependency value is greater than or equal to "min_order". * Otherwise, all options in the specified section are included in the * returned string. * * The return string is allocated on the heap and should be freed using * @code free@ when you are done with it. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - String containing option code or @code NULL@ if there is no option code */ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */ ppd_section_t section, /* I - Section to write */ float min_order) /* I - Lowest OrderDependency */ { int i, j, /* Looping vars */ count; /* Number of choices */ ppd_choice_t **choices; /* Choices */ ppd_size_t *size; /* Custom page size */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ size_t bufsize; /* Size of string buffer needed */ char *buffer, /* String buffer */ *bufptr, /* Pointer into buffer */ *bufend; /* End of buffer */ struct lconv *loc; /* Locale data */ DEBUG_printf(("ppdEmitString(ppd=%p, section=%d, min_order=%f)", ppd, section, min_order)); /* * Range check input... */ if (!ppd) return (NULL); /* * Use PageSize or PageRegion as required... */ ppd_handle_media(ppd); /* * Collect the options we need to emit... */ if ((count = ppdCollect2(ppd, section, min_order, &choices)) == 0) return (NULL); /* * Count the number of bytes that are required to hold all of the * option code... */ for (i = 0, bufsize = 1; i < count; i ++) { if (section == PPD_ORDER_JCL) { if (!_cups_strcasecmp(choices[i]->choice, "Custom") && (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) != NULL) { /* * Add space to account for custom parameter substitution... */ for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) { switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_POINTS : case PPD_CUSTOM_REAL : case PPD_CUSTOM_INT : bufsize += 10; break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : if (cparam->current.custom_string) bufsize += strlen(cparam->current.custom_string); break; } } } } else if (section != PPD_ORDER_EXIT) { bufsize += 3; /* [{\n */ if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") || !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) && !_cups_strcasecmp(choices[i]->choice, "Custom")) { DEBUG_puts("2ppdEmitString: Custom size set!"); bufsize += 37; /* %%BeginFeature: *CustomPageSize True\n */ bufsize += 50; /* Five 9-digit numbers + newline */ } else if (!_cups_strcasecmp(choices[i]->choice, "Custom") && (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) != NULL) { bufsize += 23 + strlen(choices[i]->option->keyword) + 6; /* %%BeginFeature: *Customkeyword True\n */ for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) { switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_POINTS : case PPD_CUSTOM_REAL : case PPD_CUSTOM_INT : bufsize += 10; break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : bufsize += 3; if (cparam->current.custom_string) bufsize += 4 * strlen(cparam->current.custom_string); break; } } } else bufsize += 17 + strlen(choices[i]->option->keyword) + 1 + strlen(choices[i]->choice) + 1; /* %%BeginFeature: *keyword choice\n */ bufsize += 13; /* %%EndFeature\n */ bufsize += 22; /* } stopped cleartomark\n */ } if (choices[i]->code) bufsize += strlen(choices[i]->code) + 1; else bufsize += strlen(ppd_custom_code); } /* * Allocate memory... */ DEBUG_printf(("2ppdEmitString: Allocating %d bytes for string...", (int)bufsize)); if ((buffer = calloc(1, bufsize)) == NULL) { free(choices); return (NULL); } bufend = buffer + bufsize - 1; loc = localeconv(); /* * Copy the option code to the buffer... */ for (i = 0, bufptr = buffer; i < count; i ++, bufptr += strlen(bufptr)) if (section == PPD_ORDER_JCL) { if (!_cups_strcasecmp(choices[i]->choice, "Custom") && choices[i]->code && (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) != NULL) { /* * Handle substitutions in custom JCL options... */ char *cptr; /* Pointer into code */ int pnum; /* Parameter number */ for (cptr = choices[i]->code; *cptr && bufptr < bufend;) { if (*cptr == '\\') { cptr ++; if (isdigit(*cptr & 255)) { /* * Substitute parameter... */ pnum = *cptr++ - '0'; while (isdigit(*cptr & 255)) pnum = pnum * 10 + *cptr++ - '0'; for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) if (cparam->order == pnum) break; if (cparam) { switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_POINTS : case PPD_CUSTOM_REAL : bufptr = _cupsStrFormatd(bufptr, bufend, cparam->current.custom_real, loc); break; case PPD_CUSTOM_INT : snprintf(bufptr, (size_t)(bufend - bufptr), "%d", cparam->current.custom_int); bufptr += strlen(bufptr); break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : if (cparam->current.custom_string) { strlcpy(bufptr, cparam->current.custom_string, (size_t)(bufend - bufptr)); bufptr += strlen(bufptr); } break; } } } else if (*cptr) *bufptr++ = *cptr++; } else *bufptr++ = *cptr++; } } else if (choices[i]->code) { /* * Otherwise just copy the option code directly... */ strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1)); bufptr += strlen(bufptr); } } else if (section != PPD_ORDER_EXIT) { /* * Add wrapper commands to prevent printer errors for unsupported * options... */ strlcpy(bufptr, "[{\n", (size_t)(bufend - bufptr + 1)); bufptr += 3; /* * Send DSC comments with option... */ DEBUG_printf(("2ppdEmitString: Adding code for %s=%s...", choices[i]->option->keyword, choices[i]->choice)); if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") || !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) && !_cups_strcasecmp(choices[i]->choice, "Custom")) { /* * Variable size; write out standard size options, using the * parameter positions defined in the PPD file... */ ppd_attr_t *attr; /* PPD attribute */ int pos, /* Position of custom value */ orientation; /* Orientation to use */ float values[5]; /* Values for custom command */ strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n", (size_t)(bufend - bufptr + 1)); bufptr += 37; size = ppdPageSize(ppd, "Custom"); memset(values, 0, sizeof(values)); if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL) { pos = atoi(attr->value) - 1; if (pos < 0 || pos > 4) pos = 0; } else pos = 0; values[pos] = size->width; if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL) { pos = atoi(attr->value) - 1; if (pos < 0 || pos > 4) pos = 1; } else pos = 1; values[pos] = size->length; /* * According to the Adobe PPD specification, an orientation of 1 * will produce a print that comes out upside-down with the X * axis perpendicular to the direction of feed, which is exactly * what we want to be consistent with non-PS printers. * * We could also use an orientation of 3 to produce output that * comes out rightside-up (this is the default for many large format * printer PPDs), however for consistency we will stick with the * value 1. * * If we wanted to get fancy, we could use orientations of 0 or * 2 and swap the width and length, however we don't want to get * fancy, we just want it to work consistently. * * The orientation value is range limited by the Orientation * parameter definition, so certain non-PS printer drivers that * only support an Orientation of 0 will get the value 0 as * expected. */ orientation = 1; if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Orientation")) != NULL) { int min_orient, max_orient; /* Minimum and maximum orientations */ if (sscanf(attr->value, "%d%*s%d%d", &pos, &min_orient, &max_orient) != 3) pos = 4; else { pos --; if (pos < 0 || pos > 4) pos = 4; if (orientation > max_orient) orientation = max_orient; else if (orientation < min_orient) orientation = min_orient; } } else pos = 4; values[pos] = (float)orientation; for (pos = 0; pos < 5; pos ++) { bufptr = _cupsStrFormatd(bufptr, bufend, values[pos], loc); *bufptr++ = '\n'; } if (!choices[i]->code) { /* * This can happen with certain buggy PPD files that don't include * a CustomPageSize command sequence... We just use a generic * Level 2 command sequence... */ strlcpy(bufptr, ppd_custom_code, (size_t)(bufend - bufptr + 1)); bufptr += strlen(bufptr); } } else if (!_cups_strcasecmp(choices[i]->choice, "Custom") && (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) != NULL) { /* * Custom option... */ const char *s; /* Pointer into string value */ cups_array_t *params; /* Parameters in the correct output order */ params = cupsArrayNew((cups_array_func_t)ppd_compare_cparams, NULL); for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) cupsArrayAdd(params, cparam); snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *Custom%s True\n", coption->keyword); bufptr += strlen(bufptr); for (cparam = (ppd_cparam_t *)cupsArrayFirst(params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(params)) { switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_POINTS : case PPD_CUSTOM_REAL : bufptr = _cupsStrFormatd(bufptr, bufend, cparam->current.custom_real, loc); *bufptr++ = '\n'; break; case PPD_CUSTOM_INT : snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d\n", cparam->current.custom_int); bufptr += strlen(bufptr); break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : *bufptr++ = '('; if (cparam->current.custom_string) { for (s = cparam->current.custom_string; *s; s ++) { if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127) { snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *s & 255); bufptr += strlen(bufptr); } else *bufptr++ = *s; } } *bufptr++ = ')'; *bufptr++ = '\n'; break; } } cupsArrayDelete(params); } else { snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *%s %s\n", choices[i]->option->keyword, choices[i]->choice); bufptr += strlen(bufptr); } if (choices[i]->code && choices[i]->code[0]) { j = (int)strlen(choices[i]->code); memcpy(bufptr, choices[i]->code, (size_t)j); bufptr += j; if (choices[i]->code[j - 1] != '\n') *bufptr++ = '\n'; } strlcpy(bufptr, "%%EndFeature\n" "} stopped cleartomark\n", (size_t)(bufend - bufptr + 1)); bufptr += strlen(bufptr); DEBUG_printf(("2ppdEmitString: Offset in string is %d...", (int)(bufptr - buffer))); } else if (choices[i]->code) { strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1)); bufptr += strlen(bufptr); } /* * Nul-terminate, free, and return... */ *bufptr = '\0'; free(choices); return (buffer); } /* * 'ppd_compare_cparams()' - Compare the order of two custom parameters. */ static int /* O - Result of comparison */ ppd_compare_cparams(ppd_cparam_t *a, /* I - First parameter */ ppd_cparam_t *b) /* I - Second parameter */ { return (a->order - b->order); } /* * 'ppd_handle_media()' - Handle media selection... */ static void ppd_handle_media(ppd_file_t *ppd) /* I - PPD file */ { ppd_choice_t *manual_feed, /* ManualFeed choice, if any */ *input_slot; /* InputSlot choice, if any */ ppd_size_t *size; /* Current media size */ ppd_attr_t *rpr; /* RequiresPageRegion value */ /* * This function determines what page size code to use, if any, for the * current media size, InputSlot, and ManualFeed selections. * * We use the PageSize code if: * * 1. A custom media size is selected. * 2. ManualFeed and InputSlot are not selected (or do not exist). * 3. ManualFeed is selected but is False and InputSlot is not selected or * the selection has no code - the latter check done to support "auto" or * "printer default" InputSlot options. * * We use the PageRegion code if: * * 4. RequiresPageRegion does not exist and the PPD contains cupsFilter * keywords, indicating this is a CUPS-based driver. * 5. RequiresPageRegion exists for the selected InputSlot (or "All" for any * InputSlot or ManualFeed selection) and is True. * * If none of the 5 conditions are true, no page size code is used and we * unmark any existing PageSize or PageRegion choices. */ if ((size = ppdPageSize(ppd, NULL)) == NULL) return; manual_feed = ppdFindMarkedChoice(ppd, "ManualFeed"); input_slot = ppdFindMarkedChoice(ppd, "InputSlot"); if (input_slot != NULL) rpr = ppdFindAttr(ppd, "RequiresPageRegion", input_slot->choice); else rpr = NULL; if (!rpr) rpr = ppdFindAttr(ppd, "RequiresPageRegion", "All"); if (!_cups_strcasecmp(size->name, "Custom") || (!manual_feed && !input_slot) || (manual_feed && !_cups_strcasecmp(manual_feed->choice, "False") && (!input_slot || (input_slot->code && !input_slot->code[0]))) || (!rpr && ppd->num_filters > 0)) { /* * Use PageSize code... */ ppdMarkOption(ppd, "PageSize", size->name); } else if (rpr && rpr->value && !_cups_strcasecmp(rpr->value, "True")) { /* * Use PageRegion code... */ ppdMarkOption(ppd, "PageRegion", size->name); } else { /* * Do not use PageSize or PageRegion code... */ ppd_choice_t *page; /* PageSize/Region choice, if any */ if ((page = ppdFindMarkedChoice(ppd, "PageSize")) != NULL) { /* * Unmark PageSize... */ page->marked = 0; cupsArrayRemove(ppd->marked, page); } if ((page = ppdFindMarkedChoice(ppd, "PageRegion")) != NULL) { /* * Unmark PageRegion... */ page->marked = 0; cupsArrayRemove(ppd->marked, page); } } } cups-2.3.1/cups/raster.h000664 000765 000024 00000042615 13574721672 015232 0ustar00mikestaff000000 000000 /* * Raster file definitions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * This file is part of the CUPS Imaging library. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_RASTER_H_ # define _CUPS_RASTER_H_ /* * Include necessary headers... */ # include "cups.h" # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Every non-PostScript printer driver that supports raster images * should use the application/vnd.cups-raster image file format. * Since both the PostScript RIP (pstoraster, based on GNU/GPL * Ghostscript) and Image RIP (imagetoraster, located in the filter * directory) use it, using this format saves you a lot of work. * Also, the PostScript RIP passes any printer options that are in * a PS file to your driver this way as well... */ /* * Constants... */ # define CUPS_RASTER_SYNC 0x52615333 /* RaS3 */ # define CUPS_RASTER_REVSYNC 0x33536152 /* 3SaR */ # define CUPS_RASTER_SYNCv1 0x52615374 /* RaSt */ # define CUPS_RASTER_REVSYNCv1 0x74536152 /* tSaR */ # define CUPS_RASTER_SYNCv2 0x52615332 /* RaS2 */ # define CUPS_RASTER_REVSYNCv2 0x32536152 /* 2SaR */ # define CUPS_RASTER_SYNCapple 0x554E4952 /* UNIR */ # define CUPS_RASTER_REVSYNCapple 0x52494E55 /* RINU */ # define CUPS_RASTER_SYNC_PWG CUPS_RASTER_SYNCv2 /* * The following definition can be used to determine if the * colorimetric colorspaces (CIEXYZ, CIELAB, and ICCn) are * defined... */ # define CUPS_RASTER_HAVE_COLORIMETRIC 1 /* * The following definition can be used to determine if the * device colorspaces (DEVICEn) are defined... */ # define CUPS_RASTER_HAVE_DEVICE 1 /* * The following definition can be used to determine if PWG Raster is supported. */ # define CUPS_RASTER_HAVE_PWGRASTER 1 /* * The following definition can be used to determine if Apple Raster is * supported (beta). */ # define CUPS_RASTER_HAVE_APPLERASTER 1 /* * The following PWG 5102.4 definitions specify indices into the * cupsInteger[] array in the raster header. */ # define CUPS_RASTER_PWG_TotalPageCount 0 # define CUPS_RASTER_PWG_CrossFeedTransform 1 # define CUPS_RASTER_PWG_FeedTransform 2 # define CUPS_RASTER_PWG_ImageBoxLeft 3 # define CUPS_RASTER_PWG_ImageBoxTop 4 # define CUPS_RASTER_PWG_ImageBoxRight 5 # define CUPS_RASTER_PWG_ImageBoxBottom 6 # define CUPS_RASTER_PWG_AlternatePrimary 7 # define CUPS_RASTER_PWG_PrintQuality 8 # define CUPS_RASTER_PWG_VendorIdentifier 14 # define CUPS_RASTER_PWG_VendorLength 15 /* * Types... */ typedef enum cups_adv_e /**** AdvanceMedia attribute values ****/ { CUPS_ADVANCE_NONE = 0, /* Never advance the roll */ CUPS_ADVANCE_FILE = 1, /* Advance the roll after this file */ CUPS_ADVANCE_JOB = 2, /* Advance the roll after this job */ CUPS_ADVANCE_SET = 3, /* Advance the roll after this set */ CUPS_ADVANCE_PAGE = 4 /* Advance the roll after this page */ } cups_adv_t; typedef enum cups_bool_e /**** Boolean type ****/ { CUPS_FALSE = 0, /* Logical false */ CUPS_TRUE = 1 /* Logical true */ } cups_bool_t; typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/ { CUPS_CSPACE_W = 0, /* Luminance (DeviceGray, gamma 2.2 by default) */ CUPS_CSPACE_RGB = 1, /* Red, green, blue (DeviceRGB, sRGB by default) */ CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha (DeviceRGB, sRGB by default) */ CUPS_CSPACE_K = 3, /* Black (DeviceK) */ CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow (DeviceCMY) */ CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan @deprecated@ */ CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black (DeviceCMYK) */ CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black @deprecated@ */ CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow @deprecated@ */ CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, light-cyan, light-magenta @deprecated@ */ CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black @deprecated@ */ CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver @deprecated@ */ CUPS_CSPACE_WHITE = 12, /* White ink (as black) @deprecated@ */ CUPS_CSPACE_GOLD = 13, /* Gold foil @deprecated@ */ CUPS_CSPACE_SILVER = 14, /* Silver foil @deprecated@ */ CUPS_CSPACE_CIEXYZ = 15, /* CIE XYZ @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_CIELab = 16, /* CIE Lab @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white (DeviceRGB, sRGB by default) @since CUPS 1.2/macOS 10.5@ */ CUPS_CSPACE_SW = 18, /* Luminance (gamma 2.2) @since CUPS 1.4.5@ */ CUPS_CSPACE_SRGB = 19, /* Red, green, blue (sRGB) @since CUPS 1.4.5@ */ CUPS_CSPACE_ADOBERGB = 20, /* Red, green, blue (Adobe RGB) @since CUPS 1.4.5@ */ CUPS_CSPACE_ICC1 = 32, /* ICC-based, 1 color @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC2 = 33, /* ICC-based, 2 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC3 = 34, /* ICC-based, 3 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC4 = 35, /* ICC-based, 4 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC5 = 36, /* ICC-based, 5 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC6 = 37, /* ICC-based, 6 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC7 = 38, /* ICC-based, 7 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC8 = 39, /* ICC-based, 8 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICC9 = 40, /* ICC-based, 9 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCA = 41, /* ICC-based, 10 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCB = 42, /* ICC-based, 11 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCC = 43, /* ICC-based, 12 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCD = 44, /* ICC-based, 13 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCE = 45, /* ICC-based, 14 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_ICCF = 46, /* ICC-based, 15 colors @since CUPS 1.1.19/macOS 10.3@ */ CUPS_CSPACE_DEVICE1 = 48, /* DeviceN, 1 color @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE2 = 49, /* DeviceN, 2 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE3 = 50, /* DeviceN, 3 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE4 = 51, /* DeviceN, 4 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE5 = 52, /* DeviceN, 5 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE6 = 53, /* DeviceN, 6 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE7 = 54, /* DeviceN, 7 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE8 = 55, /* DeviceN, 8 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICE9 = 56, /* DeviceN, 9 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICEA = 57, /* DeviceN, 10 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICEB = 58, /* DeviceN, 11 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICEC = 59, /* DeviceN, 12 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICED = 60, /* DeviceN, 13 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICEE = 61, /* DeviceN, 14 colors @since CUPS 1.4.5@ */ CUPS_CSPACE_DEVICEF = 62 /* DeviceN, 15 colors @since CUPS 1.4.5@ */ } cups_cspace_t; typedef enum cups_cut_e /**** CutMedia attribute values ****/ { CUPS_CUT_NONE = 0, /* Never cut the roll */ CUPS_CUT_FILE = 1, /* Cut the roll after this file */ CUPS_CUT_JOB = 2, /* Cut the roll after this job */ CUPS_CUT_SET = 3, /* Cut the roll after this set */ CUPS_CUT_PAGE = 4 /* Cut the roll after this page */ } cups_cut_t; typedef enum cups_edge_e /**** LeadingEdge attribute values ****/ { CUPS_EDGE_TOP = 0, /* Leading edge is the top of the page */ CUPS_EDGE_RIGHT = 1, /* Leading edge is the right of the page */ CUPS_EDGE_BOTTOM = 2, /* Leading edge is the bottom of the page */ CUPS_EDGE_LEFT = 3 /* Leading edge is the left of the page */ } cups_edge_t; typedef enum cups_jog_e /**** Jog attribute values ****/ { CUPS_JOG_NONE = 0, /* Never move pages */ CUPS_JOG_FILE = 1, /* Move pages after this file */ CUPS_JOG_JOB = 2, /* Move pages after this job */ CUPS_JOG_SET = 3 /* Move pages after this set */ } cups_jog_t; enum cups_mode_e /**** cupsRasterOpen modes ****/ { CUPS_RASTER_READ = 0, /* Open stream for reading */ CUPS_RASTER_WRITE = 1, /* Open stream for writing */ CUPS_RASTER_WRITE_COMPRESSED = 2, /* Open stream for compressed writing @since CUPS 1.3/macOS 10.5@ */ CUPS_RASTER_WRITE_PWG = 3, /* Open stream for compressed writing in PWG Raster mode @since CUPS 1.5/macOS 10.7@ */ CUPS_RASTER_WRITE_APPLE = 4 /* Open stream for compressed writing in AppleRaster mode (beta) @private@ */ }; typedef enum cups_mode_e cups_mode_t; /**** cupsRasterOpen modes ****/ typedef enum cups_order_e /**** cupsColorOrder attribute values ****/ { CUPS_ORDER_CHUNKED = 0, /* CMYK CMYK CMYK ... */ CUPS_ORDER_BANDED = 1, /* CCC MMM YYY KKK ... */ CUPS_ORDER_PLANAR = 2 /* CCC ... MMM ... YYY ... KKK ... */ } cups_order_t; typedef enum cups_orient_e /**** Orientation attribute values ****/ { CUPS_ORIENT_0 = 0, /* Don't rotate the page */ CUPS_ORIENT_90 = 1, /* Rotate the page counter-clockwise */ CUPS_ORIENT_180 = 2, /* Turn the page upside down */ CUPS_ORIENT_270 = 3 /* Rotate the page clockwise */ } cups_orient_t; /* * The page header structure contains the standard PostScript page device * dictionary, along with some CUPS-specific parameters that are provided * by the RIPs... * * The API supports a "version 1" (from CUPS 1.0 and 1.1) and a "version 2" * (from CUPS 1.2 and higher) page header, for binary compatibility. */ typedef struct cups_page_header_s /**** Version 1 page header @deprecated@ ****/ { /**** Standard Page Device Dictionary String Values ****/ char MediaClass[64]; /* MediaClass string */ char MediaColor[64]; /* MediaColor string */ char MediaType[64]; /* MediaType string */ char OutputType[64]; /* OutputType string */ /**** Standard Page Device Dictionary Integer Values ****/ unsigned AdvanceDistance; /* AdvanceDistance value in points */ cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ cups_bool_t Collate; /* Collated copies value */ cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ cups_bool_t Duplex; /* Duplexed (double-sided) value */ unsigned HWResolution[2]; /* Resolution in dots-per-inch */ unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ cups_bool_t InsertSheet; /* InsertSheet value */ cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ unsigned Margins[2]; /* Lower-lefthand margins in points */ cups_bool_t ManualFeed; /* ManualFeed value */ unsigned MediaPosition; /* MediaPosition value */ unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ cups_bool_t MirrorPrint; /* MirrorPrint value */ cups_bool_t NegativePrint; /* NegativePrint value */ unsigned NumCopies; /* Number of copies to produce */ cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ cups_bool_t OutputFaceUp; /* OutputFaceUp value */ unsigned PageSize[2]; /* Width and length of page in points */ cups_bool_t Separations; /* Separations value */ cups_bool_t TraySwitch; /* TraySwitch value */ cups_bool_t Tumble; /* Tumble value */ /**** CUPS Page Device Dictionary Values ****/ unsigned cupsWidth; /* Width of page image in pixels */ unsigned cupsHeight; /* Height of page image in pixels */ unsigned cupsMediaType; /* Media type code */ unsigned cupsBitsPerColor; /* Number of bits for each color */ unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ unsigned cupsBytesPerLine; /* Number of bytes per line */ cups_order_t cupsColorOrder; /* Order of colors */ cups_cspace_t cupsColorSpace; /* True colorspace */ unsigned cupsCompression; /* Device compression to use */ unsigned cupsRowCount; /* Rows per band */ unsigned cupsRowFeed; /* Feed between bands */ unsigned cupsRowStep; /* Spacing between lines */ } cups_page_header_t; /**** New in CUPS 1.2 ****/ typedef struct cups_page_header2_s /**** Version 2 page header @since CUPS 1.2/macOS 10.5@ ****/ { /**** Standard Page Device Dictionary String Values ****/ char MediaClass[64]; /* MediaClass string */ char MediaColor[64]; /* MediaColor string */ char MediaType[64]; /* MediaType string */ char OutputType[64]; /* OutputType string */ /**** Standard Page Device Dictionary Integer Values ****/ unsigned AdvanceDistance; /* AdvanceDistance value in points */ cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ cups_bool_t Collate; /* Collated copies value */ cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ cups_bool_t Duplex; /* Duplexed (double-sided) value */ unsigned HWResolution[2]; /* Resolution in dots-per-inch */ unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ cups_bool_t InsertSheet; /* InsertSheet value */ cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ unsigned Margins[2]; /* Lower-lefthand margins in points */ cups_bool_t ManualFeed; /* ManualFeed value */ unsigned MediaPosition; /* MediaPosition value */ unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ cups_bool_t MirrorPrint; /* MirrorPrint value */ cups_bool_t NegativePrint; /* NegativePrint value */ unsigned NumCopies; /* Number of copies to produce */ cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ cups_bool_t OutputFaceUp; /* OutputFaceUp value */ unsigned PageSize[2]; /* Width and length of page in points */ cups_bool_t Separations; /* Separations value */ cups_bool_t TraySwitch; /* TraySwitch value */ cups_bool_t Tumble; /* Tumble value */ /**** CUPS Page Device Dictionary Values ****/ unsigned cupsWidth; /* Width of page image in pixels */ unsigned cupsHeight; /* Height of page image in pixels */ unsigned cupsMediaType; /* Media type code */ unsigned cupsBitsPerColor; /* Number of bits for each color */ unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ unsigned cupsBytesPerLine; /* Number of bytes per line */ cups_order_t cupsColorOrder; /* Order of colors */ cups_cspace_t cupsColorSpace; /* True colorspace */ unsigned cupsCompression; /* Device compression to use */ unsigned cupsRowCount; /* Rows per band */ unsigned cupsRowFeed; /* Feed between bands */ unsigned cupsRowStep; /* Spacing between lines */ /**** Version 2 Dictionary Values ****/ unsigned cupsNumColors; /* Number of color compoents @since CUPS 1.2/macOS 10.5@ */ float cupsBorderlessScalingFactor; /* Scaling that was applied to page data @since CUPS 1.2/macOS 10.5@ */ float cupsPageSize[2]; /* Floating point PageSize (scaling * * factor not applied) @since CUPS 1.2/macOS 10.5@ */ float cupsImagingBBox[4]; /* Floating point ImagingBoundingBox * (scaling factor not applied, left, * bottom, right, top) @since CUPS 1.2/macOS 10.5@ */ unsigned cupsInteger[16]; /* User-defined integer values @since CUPS 1.2/macOS 10.5@ */ float cupsReal[16]; /* User-defined floating-point values @since CUPS 1.2/macOS 10.5@ */ char cupsString[16][64]; /* User-defined string values @since CUPS 1.2/macOS 10.5@ */ char cupsMarkerType[64]; /* Ink/toner type @since CUPS 1.2/macOS 10.5@ */ char cupsRenderingIntent[64];/* Color rendering intent @since CUPS 1.2/macOS 10.5@ */ char cupsPageSizeName[64]; /* PageSize name @since CUPS 1.2/macOS 10.5@ */ } cups_page_header2_t; typedef struct _cups_raster_s cups_raster_t; /**** Raster stream data ****/ /**** New in CUPS 1.5 ****/ typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); /**** cupsRasterOpenIO callback function * * This function is specified when * creating a raster stream with * @link cupsRasterOpenIO@ and handles * generic reading and writing of raster * data. It must return -1 on error or * the number of bytes specified by * "length" on success. ****/ /* * Prototypes... */ extern void cupsRasterClose(cups_raster_t *r) _CUPS_PUBLIC; extern cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode) _CUPS_PUBLIC; extern unsigned cupsRasterReadHeader(cups_raster_t *r, cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterReadHeader2 instead.") _CUPS_PUBLIC; extern unsigned cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PUBLIC; extern unsigned cupsRasterWriteHeader(cups_raster_t *r, cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterWriteHeader2 instead.") _CUPS_PUBLIC; extern unsigned cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PUBLIC; /**** New in CUPS 1.2 ****/ extern unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_API_1_2; extern unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_API_1_2; /**** New in CUPS 1.3 ****/ extern const char *cupsRasterErrorString(void) _CUPS_API_1_3; /**** New in CUPS 1.5 ****/ extern cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode) _CUPS_API_1_5; /**** New in CUPS 2.2/macOS 10.12 ****/ extern int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back) _CUPS_API_2_2; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_RASTER_H_ */ cups-2.3.1/cups/string.c000664 000765 000024 00000035135 13574721672 015232 0ustar00mikestaff000000 000000 /* * String functions for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #define _CUPS_STRING_C_ #include "cups-private.h" #include "debug-internal.h" #include #include /* * Local globals... */ static _cups_mutex_t sp_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex to control access to pool */ static cups_array_t *stringpool = NULL; /* Global string pool */ /* * Local functions... */ static int compare_sp_items(_cups_sp_item_t *a, _cups_sp_item_t *b); /* * '_cupsStrAlloc()' - Allocate/reference a string. */ char * /* O - String pointer */ _cupsStrAlloc(const char *s) /* I - String */ { size_t slen; /* Length of string */ _cups_sp_item_t *item, /* String pool item */ *key; /* Search key */ /* * Range check input... */ if (!s) return (NULL); /* * Get the string pool... */ _cupsMutexLock(&sp_mutex); if (!stringpool) stringpool = cupsArrayNew((cups_array_func_t)compare_sp_items, NULL); if (!stringpool) { _cupsMutexUnlock(&sp_mutex); return (NULL); } /* * See if the string is already in the pool... */ key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL) { /* * Found it, return the cached string... */ item->ref_count ++; #ifdef DEBUG_GUARDS DEBUG_printf(("5_cupsStrAlloc: Using string %p(%s) for \"%s\", guard=%08x, " "ref_count=%d", item, item->str, s, item->guard, item->ref_count)); if (item->guard != _CUPS_STR_GUARD) abort(); #endif /* DEBUG_GUARDS */ _cupsMutexUnlock(&sp_mutex); return (item->str); } /* * Not found, so allocate a new one... */ slen = strlen(s); item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + slen); if (!item) { _cupsMutexUnlock(&sp_mutex); return (NULL); } item->ref_count = 1; memcpy(item->str, s, slen + 1); #ifdef DEBUG_GUARDS item->guard = _CUPS_STR_GUARD; DEBUG_printf(("5_cupsStrAlloc: Created string %p(%s) for \"%s\", guard=%08x, " "ref_count=%d", item, item->str, s, item->guard, item->ref_count)); #endif /* DEBUG_GUARDS */ /* * Add the string to the pool and return it... */ cupsArrayAdd(stringpool, item); _cupsMutexUnlock(&sp_mutex); return (item->str); } /* * '_cupsStrDate()' - Return a localized date for a given time value. * * This function works around the locale encoding issues of strftime... */ char * /* O - Buffer */ _cupsStrDate(char *buf, /* I - Buffer */ size_t bufsize, /* I - Size of buffer */ time_t timeval) /* I - Time value */ { struct tm date; /* Local date/time */ char temp[1024]; /* Temporary buffer */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); localtime_r(&timeval, &date); if (cg->lang_default->encoding != CUPS_UTF8) { strftime(temp, sizeof(temp), "%c", &date); cupsCharsetToUTF8((cups_utf8_t *)buf, temp, (int)bufsize, cg->lang_default->encoding); } else strftime(buf, bufsize, "%c", &date); return (buf); } /* * '_cupsStrFlush()' - Flush the string pool. */ void _cupsStrFlush(void) { _cups_sp_item_t *item; /* Current item */ DEBUG_printf(("4_cupsStrFlush: %d strings in array", cupsArrayCount(stringpool))); _cupsMutexLock(&sp_mutex); for (item = (_cups_sp_item_t *)cupsArrayFirst(stringpool); item; item = (_cups_sp_item_t *)cupsArrayNext(stringpool)) free(item); cupsArrayDelete(stringpool); stringpool = NULL; _cupsMutexUnlock(&sp_mutex); } /* * '_cupsStrFormatd()' - Format a floating-point number. */ char * /* O - Pointer to end of string */ _cupsStrFormatd(char *buf, /* I - String */ char *bufend, /* I - End of string buffer */ double number, /* I - Number to format */ struct lconv *loc) /* I - Locale data */ { char *bufptr, /* Pointer into buffer */ temp[1024], /* Temporary string */ *tempdec, /* Pointer to decimal point */ *tempptr; /* Pointer into temporary string */ const char *dec; /* Decimal point */ int declen; /* Length of decimal point */ /* * Format the number using the "%.12f" format and then eliminate * unnecessary trailing 0's. */ snprintf(temp, sizeof(temp), "%.12f", number); for (tempptr = temp + strlen(temp) - 1; tempptr > temp && *tempptr == '0'; *tempptr-- = '\0'); /* * Next, find the decimal point... */ if (loc && loc->decimal_point) { dec = loc->decimal_point; declen = (int)strlen(dec); } else { dec = "."; declen = 1; } if (declen == 1) tempdec = strchr(temp, *dec); else tempdec = strstr(temp, dec); /* * Copy everything up to the decimal point... */ if (tempdec) { for (tempptr = temp, bufptr = buf; tempptr < tempdec && bufptr < bufend; *bufptr++ = *tempptr++); tempptr += declen; if (*tempptr && bufptr < bufend) { *bufptr++ = '.'; while (*tempptr && bufptr < bufend) *bufptr++ = *tempptr++; } *bufptr = '\0'; } else { strlcpy(buf, temp, (size_t)(bufend - buf + 1)); bufptr = buf + strlen(buf); } return (bufptr); } /* * '_cupsStrFree()' - Free/dereference a string. */ void _cupsStrFree(const char *s) /* I - String to free */ { _cups_sp_item_t *item, /* String pool item */ *key; /* Search key */ /* * Range check input... */ if (!s) return; /* * Check the string pool... * * We don't need to lock the mutex yet, as we only want to know if * the stringpool is initialized. The rest of the code will still * work if it is initialized before we lock... */ if (!stringpool) return; /* * See if the string is already in the pool... */ _cupsMutexLock(&sp_mutex); key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL && item == key) { /* * Found it, dereference... */ #ifdef DEBUG_GUARDS if (key->guard != _CUPS_STR_GUARD) { DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, ref_count=%d", key, key->str, key->guard, key->ref_count)); abort(); } #endif /* DEBUG_GUARDS */ item->ref_count --; if (!item->ref_count) { /* * Remove and free... */ cupsArrayRemove(stringpool, item); free(item); } } _cupsMutexUnlock(&sp_mutex); } /* * '_cupsStrRetain()' - Increment the reference count of a string. * * Note: This function does not verify that the passed pointer is in the * string pool, so any calls to it MUST know they are passing in a * good pointer. */ char * /* O - Pointer to string */ _cupsStrRetain(const char *s) /* I - String to retain */ { _cups_sp_item_t *item; /* Pointer to string pool item */ if (s) { item = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); #ifdef DEBUG_GUARDS if (item->guard != _CUPS_STR_GUARD) { DEBUG_printf(("5_cupsStrRetain: Retaining string %p(%s), guard=%08x, " "ref_count=%d", item, s, item->guard, item->ref_count)); abort(); } #endif /* DEBUG_GUARDS */ _cupsMutexLock(&sp_mutex); item->ref_count ++; _cupsMutexUnlock(&sp_mutex); } return ((char *)s); } /* * '_cupsStrScand()' - Scan a string for a floating-point number. * * This function handles the locale-specific BS so that a decimal * point is always the period (".")... */ double /* O - Number */ _cupsStrScand(const char *buf, /* I - Pointer to number */ char **bufptr, /* O - New pointer or NULL on error */ struct lconv *loc) /* I - Locale data */ { char temp[1024], /* Temporary buffer */ *tempptr; /* Pointer into temporary buffer */ /* * Range check input... */ if (!buf) return (0.0); /* * Skip leading whitespace... */ while (_cups_isspace(*buf)) buf ++; /* * Copy leading sign, numbers, period, and then numbers... */ tempptr = temp; if (*buf == '-' || *buf == '+') *tempptr++ = *buf++; while (isdigit(*buf & 255)) if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = *buf++; else { if (bufptr) *bufptr = NULL; return (0.0); } if (*buf == '.') { /* * Read fractional portion of number... */ buf ++; if (loc && loc->decimal_point) { strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (size_t)(tempptr - temp)); tempptr += strlen(tempptr); } else if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = '.'; else { if (bufptr) *bufptr = NULL; return (0.0); } while (isdigit(*buf & 255)) if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = *buf++; else { if (bufptr) *bufptr = NULL; return (0.0); } } if (*buf == 'e' || *buf == 'E') { /* * Read exponent... */ if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = *buf++; else { if (bufptr) *bufptr = NULL; return (0.0); } if (*buf == '+' || *buf == '-') { if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = *buf++; else { if (bufptr) *bufptr = NULL; return (0.0); } } while (isdigit(*buf & 255)) if (tempptr < (temp + sizeof(temp) - 1)) *tempptr++ = *buf++; else { if (bufptr) *bufptr = NULL; return (0.0); } } /* * Nul-terminate the temporary string and return the value... */ if (bufptr) *bufptr = (char *)buf; *tempptr = '\0'; return (strtod(temp, NULL)); } /* * '_cupsStrStatistics()' - Return allocation statistics for string pool. */ size_t /* O - Number of strings */ _cupsStrStatistics(size_t *alloc_bytes, /* O - Allocated bytes */ size_t *total_bytes) /* O - Total string bytes */ { size_t count, /* Number of strings */ abytes, /* Allocated string bytes */ tbytes, /* Total string bytes */ len; /* Length of string */ _cups_sp_item_t *item; /* Current item */ /* * Loop through strings in pool, counting everything up... */ _cupsMutexLock(&sp_mutex); for (count = 0, abytes = 0, tbytes = 0, item = (_cups_sp_item_t *)cupsArrayFirst(stringpool); item; item = (_cups_sp_item_t *)cupsArrayNext(stringpool)) { /* * Count allocated memory, using a 64-bit aligned buffer as a basis. */ count += item->ref_count; len = (strlen(item->str) + 8) & (size_t)~7; abytes += sizeof(_cups_sp_item_t) + len; tbytes += item->ref_count * len; } _cupsMutexUnlock(&sp_mutex); /* * Return values... */ if (alloc_bytes) *alloc_bytes = abytes; if (total_bytes) *total_bytes = tbytes; return (count); } /* * '_cups_strcpy()' - Copy a string allowing for overlapping strings. */ void _cups_strcpy(char *dst, /* I - Destination string */ const char *src) /* I - Source string */ { while (*src) *dst++ = *src++; *dst = '\0'; } /* * '_cups_strdup()' - Duplicate a string. */ #ifndef HAVE_STRDUP char * /* O - New string pointer */ _cups_strdup(const char *s) /* I - String to duplicate */ { char *t; /* New string pointer */ size_t slen; /* Length of string */ if (!s) return (NULL); slen = strlen(s); if ((t = malloc(slen + 1)) == NULL) return (NULL); return (memcpy(t, s, slen + 1)); } #endif /* !HAVE_STRDUP */ /* * '_cups_strcasecmp()' - Do a case-insensitive comparison. */ int /* O - Result of comparison (-1, 0, or 1) */ _cups_strcasecmp(const char *s, /* I - First string */ const char *t) /* I - Second string */ { while (*s != '\0' && *t != '\0') { if (_cups_tolower(*s) < _cups_tolower(*t)) return (-1); else if (_cups_tolower(*s) > _cups_tolower(*t)) return (1); s ++; t ++; } if (*s == '\0' && *t == '\0') return (0); else if (*s != '\0') return (1); else return (-1); } /* * '_cups_strncasecmp()' - Do a case-insensitive comparison on up to N chars. */ int /* O - Result of comparison (-1, 0, or 1) */ _cups_strncasecmp(const char *s, /* I - First string */ const char *t, /* I - Second string */ size_t n) /* I - Maximum number of characters to compare */ { while (*s != '\0' && *t != '\0' && n > 0) { if (_cups_tolower(*s) < _cups_tolower(*t)) return (-1); else if (_cups_tolower(*s) > _cups_tolower(*t)) return (1); s ++; t ++; n --; } if (n == 0) return (0); else if (*s == '\0' && *t == '\0') return (0); else if (*s != '\0') return (1); else return (-1); } #ifndef HAVE_STRLCAT /* * '_cups_strlcat()' - Safely concatenate two strings. */ size_t /* O - Length of string */ _cups_strlcat(char *dst, /* O - Destination string */ const char *src, /* I - Source string */ size_t size) /* I - Size of destination string buffer */ { size_t srclen; /* Length of source string */ size_t dstlen; /* Length of destination string */ /* * Figure out how much room is left... */ dstlen = strlen(dst); if (size < (dstlen + 1)) return (dstlen); /* No room, return immediately... */ size -= dstlen + 1; /* * Figure out how much room is needed... */ srclen = strlen(src); /* * Copy the appropriate amount... */ if (srclen > size) srclen = size; memmove(dst + dstlen, src, srclen); dst[dstlen + srclen] = '\0'; return (dstlen + srclen); } #endif /* !HAVE_STRLCAT */ #ifndef HAVE_STRLCPY /* * '_cups_strlcpy()' - Safely copy two strings. */ size_t /* O - Length of string */ _cups_strlcpy(char *dst, /* O - Destination string */ const char *src, /* I - Source string */ size_t size) /* I - Size of destination string buffer */ { size_t srclen; /* Length of source string */ /* * Figure out how much room is needed... */ size --; srclen = strlen(src); /* * Copy the appropriate amount... */ if (srclen > size) srclen = size; memmove(dst, src, srclen); dst[srclen] = '\0'; return (srclen); } #endif /* !HAVE_STRLCPY */ /* * 'compare_sp_items()' - Compare two string pool items... */ static int /* O - Result of comparison */ compare_sp_items(_cups_sp_item_t *a, /* I - First item */ _cups_sp_item_t *b) /* I - Second item */ { return (strcmp(a->str, b->str)); } cups-2.3.1/cups/Dependencies000664 000765 000024 00000062721 13574721672 016072 0ustar00mikestaff000000 000000 array.o: array.c ../cups/cups.h file.h versioning.h ipp.h http.h array.h \ language.h pwg.h string-private.h ../config.h ../cups/versioning.h \ debug-internal.h debug-private.h array-private.h ../cups/array.h auth.o: auth.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 \ 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 debug.o: debug.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 \ 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 dest.o: dest.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 \ 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 dest-job.o: dest-job.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 \ 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 dest-localization.o: dest-localization.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 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 dest-options.o: dest-options.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 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 dir.o: dir.c string-private.h ../config.h ../cups/versioning.h \ debug-internal.h debug-private.h dir.h versioning.h encode.o: encode.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 \ 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 file.o: file.c file-private.h 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 \ 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 getputfile.o: getputfile.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 \ 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 globals.o: globals.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h hash.o: hash.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h http.o: http.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 \ 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 http-addr.o: http-addr.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 \ 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 http-addrlist.o: http-addrlist.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 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 http-support.o: http-support.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 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 ipp.o: ipp.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 \ 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 ipp-file.o: ipp-file.c ipp-private.h ../cups/cups.h file.h versioning.h \ ipp.h http.h array.h language.h pwg.h string-private.h ../config.h \ ../cups/versioning.h debug-internal.h debug-private.h ipp-vars.o: ipp-vars.c ../cups/cups.h file.h versioning.h ipp.h http.h \ array.h language.h pwg.h ipp-private.h string-private.h ../config.h \ ../cups/versioning.h debug-internal.h debug-private.h ipp-support.o: ipp-support.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 \ 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 langprintf.o: langprintf.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 \ 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 language.o: language.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 \ 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 md5.o: md5.c md5-internal.h ../cups/versioning.h string-private.h \ ../config.h md5passwd.o: md5passwd.c ../cups/cups.h file.h versioning.h ipp.h http.h \ array.h language.h pwg.h http-private.h ../config.h ../cups/language.h \ ../cups/http.h ipp-private.h string-private.h ../cups/versioning.h notify.o: notify.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 \ 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 options.o: options.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 \ 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 pwg-media.o: pwg-media.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 \ 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 raster-error.o: raster-error.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 pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ raster-private.h raster.h cups.h ../cups/debug-private.h \ ../cups/string-private.h debug-internal.h debug-private.h raster-stream.o: raster-stream.c raster-private.h raster.h cups.h file.h \ versioning.h ipp.h http.h array.h language.h pwg.h ../cups/cups.h \ ../cups/debug-private.h ../cups/versioning.h ../cups/string-private.h \ ../config.h debug-internal.h debug-private.h raster-stubs.o: raster-stubs.c raster-private.h raster.h cups.h file.h \ versioning.h ipp.h http.h array.h language.h pwg.h ../cups/cups.h \ ../cups/debug-private.h ../cups/versioning.h ../cups/string-private.h \ ../config.h request.o: request.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 \ 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 snprintf.o: snprintf.c string-private.h ../config.h ../cups/versioning.h string.o: string.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 \ 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 tempfile.o: tempfile.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 \ 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 thread.o: thread.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h tls.o: tls.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 \ 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 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 \ 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 usersys.o: usersys.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 \ 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 util.o: util.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 \ 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 adminutil.o: adminutil.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 \ 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 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 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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ backend.h ppd.h cups.h raster.h getdevices.o: getdevices.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 \ 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 adminutil.h cups.h getifaddrs.o: getifaddrs.c getifaddrs-internal.h ../config.h ppd.o: ppd.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-attr.o: ppd-attr.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-cache.o: ppd-cache.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-conflicts.o: ppd-conflicts.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 pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-custom.o: ppd-custom.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-emit.o: ppd-emit.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 \ 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 ppd.h cups.h raster.h ppd-localize.o: ppd-localize.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 pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-mark.o: ppd-mark.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h ppd-page.o: ppd-page.c string-private.h ../config.h ../cups/versioning.h \ debug-internal.h debug-private.h ppd.h cups.h file.h versioning.h \ ipp.h http.h array.h language.h pwg.h raster.h ppd-util.o: ppd-util.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h debug-internal.h \ debug-private.h raster-interpret.o: raster-interpret.c ../cups/raster-private.h raster.h \ cups.h file.h versioning.h ipp.h http.h array.h language.h pwg.h \ ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h \ ../cups/string-private.h ../config.h ../cups/ppd-private.h \ ../cups/ppd.h pwg-private.h debug-internal.h debug-private.h raster-interstub.o: raster-interstub.c ../cups/ppd-private.h \ ../cups/cups.h file.h versioning.h ipp.h http.h array.h language.h \ pwg.h ../cups/ppd.h cups.h raster.h pwg-private.h sidechannel.o: sidechannel.c sidechannel.h versioning.h cups-private.h \ string-private.h ../config.h ../cups/versioning.h array-private.h \ ../cups/array.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 snmp.o: snmp.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 \ 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 debug-internal.h debug-private.h raster-interstub.o: raster-interstub.c ../cups/ppd-private.h \ ../cups/cups.h file.h versioning.h ipp.h http.h array.h language.h \ pwg.h ../cups/ppd.h cups.h raster.h pwg-private.h raster-stubs.o: raster-stubs.c raster-private.h raster.h cups.h file.h \ versioning.h ipp.h http.h array.h language.h pwg.h ../cups/cups.h \ ../cups/debug-private.h ../cups/versioning.h ../cups/string-private.h \ ../config.h rasterbench.o: rasterbench.c ../config.h ../cups/raster.h cups.h file.h \ versioning.h ipp.h http.h array.h language.h pwg.h testadmin.o: testadmin.c adminutil.h cups.h file.h versioning.h ipp.h \ http.h array.h language.h pwg.h string-private.h ../config.h \ ../cups/versioning.h testarray.o: testarray.c string-private.h ../config.h \ ../cups/versioning.h debug-private.h array-private.h ../cups/array.h \ versioning.h dir.h testcache.o: testcache.c ppd-private.h ../cups/cups.h file.h versioning.h \ ipp.h http.h array.h language.h pwg.h ../cups/ppd.h cups.h raster.h \ pwg-private.h file-private.h cups-private.h string-private.h \ ../config.h ../cups/versioning.h array-private.h ../cups/array.h \ ipp-private.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h thread-private.h testclient.o: testclient.c ../config.h ../cups/cups.h file.h versioning.h \ ipp.h http.h array.h language.h pwg.h ../cups/raster.h cups.h \ ../cups/string-private.h ../cups/versioning.h ../cups/thread-private.h testconflicts.o: testconflicts.c cups.h file.h versioning.h ipp.h http.h \ array.h language.h pwg.h ppd.h raster.h string-private.h ../config.h \ ../cups/versioning.h testcreds.o: testcreds.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h testcups.o: testcups.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd.h cups.h raster.h testdest.o: testdest.c cups.h file.h versioning.h ipp.h http.h array.h \ language.h pwg.h testfile.o: testfile.c string-private.h ../config.h ../cups/versioning.h \ debug-private.h file.h versioning.h testgetdests.o: testgetdests.c cups.h file.h versioning.h ipp.h http.h \ array.h language.h pwg.h testhttp.o: testhttp.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h testi18n.o: testi18n.c string-private.h ../config.h ../cups/versioning.h \ language-private.h ../cups/transcode.h language.h array.h versioning.h testipp.o: testipp.c file.h versioning.h string-private.h ../config.h \ ../cups/versioning.h ipp-private.h ../cups/cups.h ipp.h http.h array.h \ language.h pwg.h testoptions.o: testoptions.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h testlang.o: testlang.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h testppd.o: testppd.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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h \ ppd-private.h ../cups/ppd.h cups.h raster.h raster-private.h \ ../cups/debug-private.h ../cups/string-private.h testpwg.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h \ ipp.h http.h array.h language.h pwg.h ../cups/ppd.h cups.h raster.h \ pwg-private.h file-private.h cups-private.h string-private.h \ ../config.h ../cups/versioning.h array-private.h ../cups/array.h \ ipp-private.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h thread-private.h testraster.o: testraster.c ../cups/raster-private.h raster.h cups.h \ file.h versioning.h ipp.h http.h array.h language.h pwg.h \ ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h \ ../cups/string-private.h ../config.h testsnmp.o: testsnmp.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 \ 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 \ pwg.h http-private.h ../cups/language.h ../cups/http.h \ language-private.h ../cups/transcode.h pwg-private.h thread-private.h cups-2.3.1/cups/dest.c000664 000765 000024 00000361444 13574721672 014670 0ustar00mikestaff000000 000000 /* * User-defined destination (and option) support for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #ifdef HAVE_NOTIFY_H # include #endif /* HAVE_NOTIFY_H */ #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ #ifdef HAVE_DNSSD # include #endif /* HAVE_DNSSD */ #ifdef HAVE_AVAHI # include # include # include # include # include # include #define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX #endif /* HAVE_AVAHI */ /* * Constants... */ #ifdef __APPLE__ # if HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME # include # define _CUPS_LOCATION_DEFAULTS 1 # endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ # define kCUPSPrintingPrefs CFSTR("org.cups.PrintingPrefs") # define kDefaultPaperIDKey CFSTR("DefaultPaperID") # define kLastUsedPrintersKey CFSTR("LastUsedPrinters") # define kLocationNetworkKey CFSTR("Network") # define kLocationPrinterIDKey CFSTR("PrinterID") # define kUseLastPrinter CFSTR("UseLastPrinter") #endif /* __APPLE__ */ #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) # define _CUPS_DNSSD_GET_DESTS 250 /* Milliseconds for cupsGetDests */ # define _CUPS_DNSSD_MAXTIME 50 /* Milliseconds for maximum quantum of time */ #else # define _CUPS_DNSSD_GET_DESTS 0 /* Milliseconds for cupsGetDests */ #endif /* HAVE_DNSSD || HAVE_AVAHI */ /* * Types... */ #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) typedef enum _cups_dnssd_state_e /* Enumerated device state */ { _CUPS_DNSSD_NEW, _CUPS_DNSSD_QUERY, _CUPS_DNSSD_PENDING, _CUPS_DNSSD_ACTIVE, _CUPS_DNSSD_INCOMPATIBLE, _CUPS_DNSSD_ERROR } _cups_dnssd_state_t; typedef struct _cups_dnssd_data_s /* Enumeration data */ { # ifdef HAVE_DNSSD DNSServiceRef main_ref; /* Main service reference */ # else /* HAVE_AVAHI */ AvahiSimplePoll *simple_poll; /* Polling interface */ AvahiClient *client; /* Client information */ int got_data; /* Did we get data? */ int browsers; /* How many browsers are running? */ # endif /* HAVE_DNSSD */ cups_dest_cb_t cb; /* Callback */ void *user_data; /* User data pointer */ cups_ptype_t type, /* Printer type filter */ mask; /* Printer type mask */ cups_array_t *devices; /* Devices found so far */ int num_dests; /* Number of lpoptions destinations */ cups_dest_t *dests; /* lpoptions destinations */ char def_name[1024], /* Default printer name, if any */ *def_instance; /* Default printer instance, if any */ } _cups_dnssd_data_t; typedef struct _cups_dnssd_device_s /* Enumerated device */ { _cups_dnssd_state_t state; /* State of device listing */ # ifdef HAVE_DNSSD DNSServiceRef ref; /* Service reference for query */ # else /* HAVE_AVAHI */ AvahiRecordBrowser *ref; /* Browser for query */ # endif /* HAVE_DNSSD */ char *fullName, /* Full name */ *regtype, /* Registration type */ *domain; /* Domain name */ cups_ptype_t type; /* Device registration type */ cups_dest_t dest; /* Destination record */ } _cups_dnssd_device_t; typedef struct _cups_dnssd_resolve_s /* Data for resolving URI */ { int *cancel; /* Pointer to "cancel" variable */ struct timeval end_time; /* Ending time */ } _cups_dnssd_resolve_t; #endif /* HAVE_DNSSD */ typedef struct _cups_getdata_s { int num_dests; /* Number of destinations */ cups_dest_t *dests; /* Destinations */ char def_name[1024], /* Default printer name, if any */ *def_instance; /* Default printer instance, if any */ } _cups_getdata_t; typedef struct _cups_namedata_s { const char *name; /* Named destination */ cups_dest_t *dest; /* Destination */ } _cups_namedata_t; /* * Local functions... */ #if _CUPS_LOCATION_DEFAULTS static CFArrayRef appleCopyLocations(void); static CFStringRef appleCopyNetwork(void); #endif /* _CUPS_LOCATION_DEFAULTS */ #ifdef __APPLE__ static char *appleGetPaperSize(char *name, size_t namesize); #endif /* __APPLE__ */ #if _CUPS_LOCATION_DEFAULTS static CFStringRef appleGetPrinter(CFArrayRef locations, CFStringRef network, CFIndex *locindex); #endif /* _CUPS_LOCATION_DEFAULTS */ static cups_dest_t *cups_add_dest(const char *name, const char *instance, int *num_dests, cups_dest_t **dests); #ifdef __BLOCKS__ static int cups_block_cb(cups_dest_block_t block, unsigned flags, cups_dest_t *dest); #endif /* __BLOCKS__ */ static int cups_compare_dests(cups_dest_t *a, cups_dest_t *b); #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) # ifdef HAVE_DNSSD static void cups_dnssd_browse_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context); # else /* HAVE_AVAHI */ static void cups_dnssd_browse_cb(AvahiServiceBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *serviceName, const char *regtype, const char *replyDomain, AvahiLookupResultFlags flags, void *context); static void cups_dnssd_client_cb(AvahiClient *client, AvahiClientState state, void *context); # endif /* HAVE_DNSSD */ static int cups_dnssd_compare_devices(_cups_dnssd_device_t *a, _cups_dnssd_device_t *b); static void cups_dnssd_free_device(_cups_dnssd_device_t *device, _cups_dnssd_data_t *data); static _cups_dnssd_device_t * cups_dnssd_get_device(_cups_dnssd_data_t *data, const char *serviceName, const char *regtype, const char *replyDomain); # ifdef HAVE_DNSSD static void cups_dnssd_query_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullName, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context); # else /* HAVE_AVAHI */ static int cups_dnssd_poll_cb(struct pollfd *pollfds, unsigned int num_pollfds, int timeout, void *context); static void cups_dnssd_query_cb(AvahiRecordBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, uint16_t rrclass, uint16_t rrtype, const void *rdata, size_t rdlen, AvahiLookupResultFlags flags, void *context); # endif /* HAVE_DNSSD */ static const char *cups_dnssd_resolve(cups_dest_t *dest, const char *uri, int msec, int *cancel, cups_dest_cb_t cb, void *user_data); static int cups_dnssd_resolve_cb(void *context); static void cups_dnssd_unquote(char *dst, const char *src, size_t dstsize); static int cups_elapsed(struct timeval *t); #endif /* HAVE_DNSSD || HAVE_AVAHI */ static int cups_enum_dests(http_t *http, unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data); static int cups_find_dest(const char *name, const char *instance, int num_dests, cups_dest_t *dests, int prev, int *rdiff); static int cups_get_cb(_cups_getdata_t *data, unsigned flags, cups_dest_t *dest); static char *cups_get_default(const char *filename, char *namebuf, size_t namesize, const char **instance); static int cups_get_dests(const char *filename, const char *match_name, const char *match_inst, int load_all, int user_default_set, int num_dests, cups_dest_t **dests); static char *cups_make_string(ipp_attribute_t *attr, char *buffer, size_t bufsize); static int cups_name_cb(_cups_namedata_t *data, unsigned flags, cups_dest_t *dest); static void cups_queue_name(char *name, const char *serviceName, size_t namesize); /* * 'cupsAddDest()' - Add a destination to the list of destinations. * * This function cannot be used to add a new class or printer queue, * it only adds a new container of saved options for the named * destination or instance. * * If the named destination already exists, the destination list is * returned unchanged. Adding a new instance of a destination creates * a copy of that destination's options. * * Use the @link cupsSaveDests@ function to save the updated list of * destinations to the user's lpoptions file. */ int /* O - New number of destinations */ cupsAddDest(const char *name, /* I - Destination name */ const char *instance, /* I - Instance name or @code NULL@ for none/primary */ int num_dests, /* I - Number of destinations */ cups_dest_t **dests) /* IO - Destinations */ { int i; /* Looping var */ cups_dest_t *dest; /* Destination pointer */ cups_dest_t *parent = NULL; /* Parent destination */ cups_option_t *doption, /* Current destination option */ *poption; /* Current parent option */ if (!name || !dests) return (0); if (!cupsGetDest(name, instance, num_dests, *dests)) { if (instance && !cupsGetDest(name, NULL, num_dests, *dests)) return (num_dests); if ((dest = cups_add_dest(name, instance, &num_dests, dests)) == NULL) return (num_dests); /* * Find the base dest again now the array has been realloc'd. */ parent = cupsGetDest(name, NULL, num_dests, *dests); if (instance && parent && parent->num_options > 0) { /* * Copy options from parent... */ dest->options = calloc(sizeof(cups_option_t), (size_t)parent->num_options); if (dest->options) { dest->num_options = parent->num_options; for (i = dest->num_options, doption = dest->options, poption = parent->options; i > 0; i --, doption ++, poption ++) { doption->name = _cupsStrRetain(poption->name); doption->value = _cupsStrRetain(poption->value); } } } } return (num_dests); } #ifdef __APPLE__ /* * '_cupsAppleCopyDefaultPaperID()' - Get the default paper ID. */ CFStringRef /* O - Default paper ID */ _cupsAppleCopyDefaultPaperID(void) { return (CFPreferencesCopyAppValue(kDefaultPaperIDKey, kCUPSPrintingPrefs)); } /* * '_cupsAppleCopyDefaultPrinter()' - Get the default printer at this location. */ CFStringRef /* O - Default printer name */ _cupsAppleCopyDefaultPrinter(void) { # if _CUPS_LOCATION_DEFAULTS CFStringRef network; /* Network location */ CFArrayRef locations; /* Location array */ CFStringRef locprinter; /* Current printer */ /* * Use location-based defaults only if "use last printer" is selected in the * system preferences... */ if (!_cupsAppleGetUseLastPrinter()) { DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Not using last printer as " "default."); return (NULL); } /* * Get the current location... */ if ((network = appleCopyNetwork()) == NULL) { DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Unable to get current " "network."); return (NULL); } /* * Lookup the network in the preferences... */ if ((locations = appleCopyLocations()) == NULL) { /* * Missing or bad location array, so no location-based default... */ DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Missing or bad last used " "printer array."); CFRelease(network); return (NULL); } DEBUG_printf(("1_cupsAppleCopyDefaultPrinter: Got locations, %d entries.", (int)CFArrayGetCount(locations))); if ((locprinter = appleGetPrinter(locations, network, NULL)) != NULL) CFRetain(locprinter); CFRelease(network); CFRelease(locations); return (locprinter); # else return (NULL); # endif /* _CUPS_LOCATION_DEFAULTS */ } /* * '_cupsAppleGetUseLastPrinter()' - Get whether to use the last used printer. */ int /* O - 1 to use last printer, 0 otherwise */ _cupsAppleGetUseLastPrinter(void) { Boolean uselast, /* Use last printer preference value */ uselast_set; /* Valid is set? */ if (getenv("CUPS_DISABLE_APPLE_DEFAULT")) return (0); uselast = CFPreferencesGetAppBooleanValue(kUseLastPrinter, kCUPSPrintingPrefs, &uselast_set); if (!uselast_set) return (1); else return (uselast); } /* * '_cupsAppleSetDefaultPaperID()' - Set the default paper id. */ void _cupsAppleSetDefaultPaperID( CFStringRef name) /* I - New paper ID */ { CFPreferencesSetAppValue(kDefaultPaperIDKey, name, kCUPSPrintingPrefs); CFPreferencesAppSynchronize(kCUPSPrintingPrefs); # ifdef HAVE_NOTIFY_POST notify_post("com.apple.printerPrefsChange"); # endif /* HAVE_NOTIFY_POST */ } /* * '_cupsAppleSetDefaultPrinter()' - Set the default printer for this location. */ void _cupsAppleSetDefaultPrinter( CFStringRef name) /* I - Default printer/class name */ { # if _CUPS_LOCATION_DEFAULTS CFStringRef network; /* Current network */ CFArrayRef locations; /* Old locations array */ CFIndex locindex; /* Index in locations array */ CFStringRef locprinter; /* Current printer */ CFMutableArrayRef newlocations; /* New locations array */ CFMutableDictionaryRef newlocation; /* New location */ /* * Get the current location... */ if ((network = appleCopyNetwork()) == NULL) { DEBUG_puts("1_cupsAppleSetDefaultPrinter: Unable to get current network..."); return; } /* * Lookup the network in the preferences... */ if ((locations = appleCopyLocations()) != NULL) locprinter = appleGetPrinter(locations, network, &locindex); else { locprinter = NULL; locindex = -1; } if (!locprinter || CFStringCompare(locprinter, name, 0) != kCFCompareEqualTo) { /* * Need to change the locations array... */ if (locations) { newlocations = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, locations); if (locprinter) CFArrayRemoveValueAtIndex(newlocations, locindex); } else newlocations = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); newlocation = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (newlocation && newlocations) { /* * Put the new location at the front of the array... */ CFDictionaryAddValue(newlocation, kLocationNetworkKey, network); CFDictionaryAddValue(newlocation, kLocationPrinterIDKey, name); CFArrayInsertValueAtIndex(newlocations, 0, newlocation); /* * Limit the number of locations to 10... */ while (CFArrayGetCount(newlocations) > 10) CFArrayRemoveValueAtIndex(newlocations, 10); /* * Push the changes out... */ CFPreferencesSetAppValue(kLastUsedPrintersKey, newlocations, kCUPSPrintingPrefs); CFPreferencesAppSynchronize(kCUPSPrintingPrefs); # ifdef HAVE_NOTIFY_POST notify_post("com.apple.printerPrefsChange"); # endif /* HAVE_NOTIFY_POST */ } if (newlocations) CFRelease(newlocations); if (newlocation) CFRelease(newlocation); } if (locations) CFRelease(locations); CFRelease(network); # else (void)name; # endif /* _CUPS_LOCATION_DEFAULTS */ } /* * '_cupsAppleSetUseLastPrinter()' - Set whether to use the last used printer. */ void _cupsAppleSetUseLastPrinter( int uselast) /* O - 1 to use last printer, 0 otherwise */ { CFPreferencesSetAppValue(kUseLastPrinter, uselast ? kCFBooleanTrue : kCFBooleanFalse, kCUPSPrintingPrefs); CFPreferencesAppSynchronize(kCUPSPrintingPrefs); # ifdef HAVE_NOTIFY_POST notify_post("com.apple.printerPrefsChange"); # endif /* HAVE_NOTIFY_POST */ } #endif /* __APPLE__ */ /* * 'cupsConnectDest()' - Open a connection to the destination. * * Connect to the destination, returning a new @code http_t@ connection object * and optionally the resource path to use for the destination. These calls * will block until a connection is made, the timeout expires, the integer * pointed to by "cancel" is non-zero, or the callback function (or block) * returns 0. The caller is responsible for calling @link httpClose@ on the * returned connection. * * Starting with CUPS 2.2.4, the caller can pass @code CUPS_DEST_FLAGS_DEVICE@ * for the "flags" argument to connect directly to the device associated with * the destination. Otherwise, the connection is made to the CUPS scheduler * associated with the destination. * * @since CUPS 1.6/macOS 10.8@ */ http_t * /* O - Connection to destination or @code NULL@ */ cupsConnectDest( cups_dest_t *dest, /* I - Destination */ unsigned flags, /* I - Connection flags */ int msec, /* I - Timeout in milliseconds */ int *cancel, /* I - Pointer to "cancel" variable */ char *resource, /* I - Resource buffer */ size_t resourcesize, /* I - Size of resource buffer */ cups_dest_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data pointer */ { const char *uri; /* Printer URI */ char scheme[32], /* URI scheme */ userpass[256], /* Username and password (unused) */ hostname[256], /* Hostname */ tempresource[1024]; /* Temporary resource buffer */ int port; /* Port number */ char portstr[16]; /* Port number string */ http_encryption_t encryption; /* Encryption to use */ http_addrlist_t *addrlist; /* Address list for server */ http_t *http; /* Connection to server */ DEBUG_printf(("cupsConnectDest(dest=%p, flags=0x%x, msec=%d, cancel=%p(%d), resource=\"%s\", resourcesize=" CUPS_LLFMT ", cb=%p, user_data=%p)", (void *)dest, flags, msec, (void *)cancel, cancel ? *cancel : -1, resource, CUPS_LLCAST resourcesize, (void *)cb, user_data)); /* * Range check input... */ if (!dest) { if (resource) *resource = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } if (!resource || resourcesize < 1) { resource = tempresource; resourcesize = sizeof(tempresource); } /* * Grab the printer URI... */ if (flags & CUPS_DEST_FLAGS_DEVICE) { if ((uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL) { #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) if (strstr(uri, "._tcp")) uri = cups_dnssd_resolve(dest, uri, msec, cancel, cb, user_data); #endif /* HAVE_DNSSD || HAVE_AVAHI */ } } else if ((uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options)) == NULL) { if ((uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL) { #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) if (strstr(uri, "._tcp")) uri = cups_dnssd_resolve(dest, uri, msec, cancel, cb, user_data); #endif /* HAVE_DNSSD || HAVE_AVAHI */ } if (uri) uri = _cupsCreateDest(dest->name, cupsGetOption("printer-info", dest->num_options, dest->options), NULL, uri, tempresource, sizeof(tempresource)); if (uri) { dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &dest->options); uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); } } if (!uri) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR, dest); return (NULL); } if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1); if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR, dest); return (NULL); } /* * Lookup the address for the server... */ if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_RESOLVING, dest); snprintf(portstr, sizeof(portstr), "%d", port); if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portstr)) == NULL) { if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR, dest); return (NULL); } if (cancel && *cancel) { httpAddrFreeList(addrlist); if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CANCELED, dest); return (NULL); } /* * Create the HTTP object pointing to the server referenced by the URI... */ if (!strcmp(scheme, "ipps") || port == 443) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = HTTP_ENCRYPTION_IF_REQUESTED; http = httpConnect2(hostname, port, addrlist, AF_UNSPEC, encryption, 1, 0, NULL); httpAddrFreeList(addrlist); /* * Connect if requested... */ if (flags & CUPS_DEST_FLAGS_UNCONNECTED) { if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED, dest); } else { if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CONNECTING, dest); if (!httpReconnect2(http, msec, cancel) && cb) { if (cancel && *cancel) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_CONNECTING, dest); else (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR, dest); } else if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest); } return (http); } #ifdef __BLOCKS__ /* * 'cupsConnectDestBlock()' - Open a connection to the destination. * * Connect to the destination, returning a new @code http_t@ connection object * and optionally the resource path to use for the destination. These calls * will block until a connection is made, the timeout expires, the integer * pointed to by "cancel" is non-zero, or the block returns 0. The caller is * responsible for calling @link httpClose@ on the returned connection. * * Starting with CUPS 2.2.4, the caller can pass @code CUPS_DEST_FLAGS_DEVICE@ * for the "flags" argument to connect directly to the device associated with * the destination. Otherwise, the connection is made to the CUPS scheduler * associated with the destination. * * @since CUPS 1.6/macOS 10.8@ @exclude all@ */ http_t * /* O - Connection to destination or @code NULL@ */ cupsConnectDestBlock( cups_dest_t *dest, /* I - Destination */ unsigned flags, /* I - Connection flags */ int msec, /* I - Timeout in milliseconds */ int *cancel, /* I - Pointer to "cancel" variable */ char *resource, /* I - Resource buffer */ size_t resourcesize, /* I - Size of resource buffer */ cups_dest_block_t block) /* I - Callback block */ { return (cupsConnectDest(dest, flags, msec, cancel, resource, resourcesize, (cups_dest_cb_t)cups_block_cb, (void *)block)); } #endif /* __BLOCKS__ */ /* * 'cupsCopyDest()' - Copy a destination. * * Make a copy of the destination to an array of destinations (or just a single * copy) - for use with the cupsEnumDests* functions. The caller is responsible * for calling cupsFreeDests() on the returned object(s). * * @since CUPS 1.6/macOS 10.8@ */ int /* O - New number of destinations */ cupsCopyDest(cups_dest_t *dest, /* I - Destination to copy */ int num_dests, /* I - Number of destinations */ cups_dest_t **dests) /* IO - Destination array */ { int i; /* Looping var */ cups_dest_t *new_dest; /* New destination pointer */ cups_option_t *new_option, /* Current destination option */ *option; /* Current parent option */ /* * Range check input... */ if (!dest || num_dests < 0 || !dests) return (num_dests); /* * See if the destination already exists... */ if ((new_dest = cupsGetDest(dest->name, dest->instance, num_dests, *dests)) != NULL) { /* * Protect against copying destination to itself... */ if (new_dest == dest) return (num_dests); /* * Otherwise, free the options... */ cupsFreeOptions(new_dest->num_options, new_dest->options); new_dest->num_options = 0; new_dest->options = NULL; } else new_dest = cups_add_dest(dest->name, dest->instance, &num_dests, dests); if (new_dest) { new_dest->is_default = dest->is_default; if ((new_dest->options = calloc(sizeof(cups_option_t), (size_t)dest->num_options)) == NULL) return (cupsRemoveDest(dest->name, dest->instance, num_dests, dests)); new_dest->num_options = dest->num_options; for (i = dest->num_options, option = dest->options, new_option = new_dest->options; i > 0; i --, option ++, new_option ++) { new_option->name = _cupsStrRetain(option->name); new_option->value = _cupsStrRetain(option->value); } } return (num_dests); } /* * '_cupsCreateDest()' - Create a local (temporary) queue. */ char * /* O - Printer URI or @code NULL@ on error */ _cupsCreateDest(const char *name, /* I - Printer name */ const char *info, /* I - Printer description of @code NULL@ */ const char *device_id, /* I - 1284 Device ID or @code NULL@ */ const char *device_uri, /* I - Device URI */ char *uri, /* I - Printer URI buffer */ size_t urisize) /* I - Size of URI buffer */ { http_t *http; /* Connection to server */ ipp_t *request, /* CUPS-Create-Local-Printer request */ *response; /* CUPS-Create-Local-Printer response */ ipp_attribute_t *attr; /* printer-uri-supported attribute */ ipp_pstate_t state = IPP_PSTATE_STOPPED; /* printer-state value */ if (!name || !device_uri || !uri || urisize < 32) return (NULL); if ((http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL)) == NULL) return (NULL); request = ippNewRequest(IPP_OP_CUPS_CREATE_LOCAL_PRINTER); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/"); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL, device_uri); ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name); if (info) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, info); if (device_id) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); response = cupsDoRequest(http, request, "/"); if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) strlcpy(uri, ippGetString(attr, 0, NULL), urisize); else { ippDelete(response); httpClose(http); return (NULL); } if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) state = (ipp_pstate_t)ippGetInteger(attr, 0); while (state == IPP_PSTATE_STOPPED && cupsLastError() == IPP_STATUS_OK) { sleep(1); ippDelete(response); request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "printer-state"); response = cupsDoRequest(http, request, "/"); if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) state = (ipp_pstate_t)ippGetInteger(attr, 0); } ippDelete(response); httpClose(http); return (uri); } /* * 'cupsEnumDests()' - Enumerate available destinations with a callback function. * * Destinations are enumerated from one or more sources. The callback function * receives the @code user_data@ pointer and the destination pointer which can * be used as input to the @link cupsCopyDest@ function. The function must * return 1 to continue enumeration or 0 to stop. * * The @code type@ and @code mask@ arguments allow the caller to filter the * destinations that are enumerated. Passing 0 for both will enumerate all * printers. The constant @code CUPS_PRINTER_DISCOVERED@ is used to filter on * destinations that are available but have not yet been added locally. * * Enumeration happens on the current thread and does not return until all * destinations have been enumerated or the callback function returns 0. * * Note: The callback function will likely receive multiple updates for the same * destinations - it is up to the caller to suppress any duplicate destinations. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on success, 0 on failure */ cupsEnumDests( unsigned flags, /* I - Enumeration flags */ int msec, /* I - Timeout in milliseconds, -1 for indefinite */ int *cancel, /* I - Pointer to "cancel" variable */ cups_ptype_t type, /* I - Printer type bits */ cups_ptype_t mask, /* I - Mask for printer type bits */ cups_dest_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data */ { return (cups_enum_dests(CUPS_HTTP_DEFAULT, flags, msec, cancel, type, mask, cb, user_data)); } # ifdef __BLOCKS__ /* * 'cupsEnumDestsBlock()' - Enumerate available destinations with a block. * * Destinations are enumerated from one or more sources. The block receives the * @code user_data@ pointer and the destination pointer which can be used as * input to the @link cupsCopyDest@ function. The block must return 1 to * continue enumeration or 0 to stop. * * The @code type@ and @code mask@ arguments allow the caller to filter the * destinations that are enumerated. Passing 0 for both will enumerate all * printers. The constant @code CUPS_PRINTER_DISCOVERED@ is used to filter on * destinations that are available but have not yet been added locally. * * Enumeration happens on the current thread and does not return until all * destinations have been enumerated or the block returns 0. * * Note: The block will likely receive multiple updates for the same * destinations - it is up to the caller to suppress any duplicate destinations. * * @since CUPS 1.6/macOS 10.8@ @exclude all@ */ int /* O - 1 on success, 0 on failure */ cupsEnumDestsBlock( unsigned flags, /* I - Enumeration flags */ int timeout, /* I - Timeout in milliseconds, 0 for indefinite */ int *cancel, /* I - Pointer to "cancel" variable */ cups_ptype_t type, /* I - Printer type bits */ cups_ptype_t mask, /* I - Mask for printer type bits */ cups_dest_block_t block) /* I - Block */ { return (cupsEnumDests(flags, timeout, cancel, type, mask, (cups_dest_cb_t)cups_block_cb, (void *)block)); } # endif /* __BLOCKS__ */ /* * 'cupsFreeDests()' - Free the memory used by the list of destinations. */ void cupsFreeDests(int num_dests, /* I - Number of destinations */ cups_dest_t *dests) /* I - Destinations */ { int i; /* Looping var */ cups_dest_t *dest; /* Current destination */ if (num_dests == 0 || dests == NULL) return; for (i = num_dests, dest = dests; i > 0; i --, dest ++) { _cupsStrFree(dest->name); _cupsStrFree(dest->instance); cupsFreeOptions(dest->num_options, dest->options); } free(dests); } /* * 'cupsGetDest()' - Get the named destination from the list. * * Use the @link cupsEnumDests@ or @link cupsGetDests2@ functions to get a * list of supported destinations for the current user. */ cups_dest_t * /* O - Destination pointer or @code NULL@ */ cupsGetDest(const char *name, /* I - Destination name or @code NULL@ for the default destination */ const char *instance, /* I - Instance name or @code NULL@ */ int num_dests, /* I - Number of destinations */ cups_dest_t *dests) /* I - Destinations */ { int diff, /* Result of comparison */ match; /* Matching index */ if (num_dests <= 0 || !dests) return (NULL); if (!name) { /* * NULL name for default printer. */ while (num_dests > 0) { if (dests->is_default) return (dests); num_dests --; dests ++; } } else { /* * Lookup name and optionally the instance... */ match = cups_find_dest(name, instance, num_dests, dests, -1, &diff); if (!diff) return (dests + match); } return (NULL); } /* * '_cupsGetDestResource()' - Get the resource path and URI for a destination. */ const char * /* O - URI */ _cupsGetDestResource( cups_dest_t *dest, /* I - Destination */ unsigned flags, /* I - Destination flags */ char *resource, /* I - Resource buffer */ size_t resourcesize) /* I - Size of resource buffer */ { const char *uri, /* URI */ *device_uri, /* Device URI */ *printer_uri; /* Printer URI */ char scheme[32], /* URI scheme */ userpass[256], /* Username and password (unused) */ hostname[256]; /* Hostname */ int port; /* Port number */ DEBUG_printf(("_cupsGetDestResource(dest=%p(%s), flags=%u, resource=%p, resourcesize=%d)", (void *)dest, dest->name, flags, (void *)resource, (int)resourcesize)); /* * Range check input... */ if (!dest || !resource || resourcesize < 1) { if (resource) *resource = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Grab the printer and device URIs... */ device_uri = cupsGetOption("device-uri", dest->num_options, dest->options); printer_uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); DEBUG_printf(("1_cupsGetDestResource: device-uri=\"%s\", printer-uri-supported=\"%s\".", device_uri, printer_uri)); #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) if (((flags & CUPS_DEST_FLAGS_DEVICE) || !printer_uri) && strstr(device_uri, "._tcp")) { if ((device_uri = cups_dnssd_resolve(dest, device_uri, 5000, NULL, NULL, NULL)) != NULL) { DEBUG_printf(("1_cupsGetDestResource: Resolved device-uri=\"%s\".", device_uri)); } else { DEBUG_puts("1_cupsGetDestResource: Unable to resolve device."); if (resource) *resource = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); return (NULL); } } #endif /* HAVE_DNSSD || HAVE_AVAHI */ if (flags & CUPS_DEST_FLAGS_DEVICE) { uri = device_uri; } else if (printer_uri) { uri = printer_uri; } else { uri = _cupsCreateDest(dest->name, cupsGetOption("printer-info", dest->num_options, dest->options), NULL, device_uri, resource, resourcesize); if (uri) { DEBUG_printf(("1_cupsGetDestResource: Local printer-uri-supported=\"%s\"", uri)); dest->num_options = cupsAddOption("printer-uri-supported", uri, dest->num_options, &dest->options); uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options); } } if (!uri) { DEBUG_puts("1_cupsGetDestResource: No printer-uri-supported or device-uri found."); if (resource) *resource = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); return (NULL); } else if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad URI."), 1); return (NULL); } DEBUG_printf(("1_cupsGetDestResource: resource=\"%s\"", resource)); return (uri); } /* * 'cupsGetDestWithURI()' - Get a destination associated with a URI. * * "name" is the desired name for the printer. If @code NULL@, a name will be * created using the URI. * * "uri" is the "ipp" or "ipps" URI for the printer. * * @since CUPS 2.0/macOS 10.10@ */ cups_dest_t * /* O - Destination or @code NULL@ */ cupsGetDestWithURI(const char *name, /* I - Desired printer name or @code NULL@ */ const char *uri) /* I - URI for the printer */ { cups_dest_t *dest; /* New destination */ char temp[1024], /* Temporary string */ scheme[256], /* Scheme from URI */ userpass[256], /* Username:password from URI */ hostname[256], /* Hostname from URI */ resource[1024], /* Resource path from URI */ *ptr; /* Pointer into string */ const char *info; /* printer-info string */ int port; /* Port number from URI */ /* * Range check input... */ if (!uri) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK || (strncmp(uri, "ipp://", 6) && strncmp(uri, "ipps://", 7))) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1); return (NULL); } if (name) { info = name; } else { /* * Create the name from the URI... */ if (strstr(hostname, "._tcp")) { /* * Use the service instance name... */ if ((ptr = strstr(hostname, "._")) != NULL) *ptr = '\0'; cups_queue_name(temp, hostname, sizeof(temp)); name = temp; info = hostname; } else if (!strncmp(resource, "/classes/", 9)) { snprintf(temp, sizeof(temp), "%s @ %s", resource + 9, hostname); name = resource + 9; info = temp; } else if (!strncmp(resource, "/printers/", 10)) { snprintf(temp, sizeof(temp), "%s @ %s", resource + 10, hostname); name = resource + 10; info = temp; } else if (!strncmp(resource, "/ipp/print/", 11)) { snprintf(temp, sizeof(temp), "%s @ %s", resource + 11, hostname); name = resource + 11; info = temp; } else { name = hostname; info = hostname; } } /* * Create the destination... */ if ((dest = calloc(1, sizeof(cups_dest_t))) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } dest->name = _cupsStrAlloc(name); dest->num_options = cupsAddOption("device-uri", uri, dest->num_options, &(dest->options)); dest->num_options = cupsAddOption("printer-info", info, dest->num_options, &(dest->options)); return (dest); } /* * '_cupsGetDests()' - Get destinations from a server. * * "op" is IPP_OP_CUPS_GET_PRINTERS to get a full list, IPP_OP_CUPS_GET_DEFAULT * to get the system-wide default printer, or IPP_OP_GET_PRINTER_ATTRIBUTES for * a known printer. * * "name" is the name of an existing printer and is only used when "op" is * IPP_OP_GET_PRINTER_ATTRIBUTES. * * "dest" is initialized to point to the array of destinations. * * 0 is returned if there are no printers, no default printer, or the named * printer does not exist, respectively. * * Free the memory used by the destination array using the @link cupsFreeDests@ * function. * * Note: On macOS this function also gets the default paper from the system * preferences (~/L/P/org.cups.PrintingPrefs.plist) and includes it in the * options array for each destination that supports it. */ int /* O - Number of destinations */ _cupsGetDests(http_t *http, /* I - Connection to server or * @code CUPS_HTTP_DEFAULT@ */ ipp_op_t op, /* I - IPP operation */ const char *name, /* I - Name of destination */ cups_dest_t **dests, /* IO - Destinations */ cups_ptype_t type, /* I - Printer type bits */ cups_ptype_t mask) /* I - Printer type mask */ { int num_dests = 0; /* Number of destinations */ cups_dest_t *dest; /* Current destination */ ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ const char *printer_name; /* printer-name attribute */ char uri[1024]; /* printer-uri value */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ #ifdef __APPLE__ char media_default[41]; /* Default paper size */ #endif /* __APPLE__ */ char optname[1024], /* Option name */ value[2048], /* Option value */ *ptr; /* Pointer into name/value */ static const char * const pattrs[] = /* Attributes we're interested in */ { "auth-info-required", "device-uri", "job-sheets-default", "marker-change-time", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", "marker-names", "marker-types", #ifdef __APPLE__ "media-supported", #endif /* __APPLE__ */ "printer-commands", "printer-defaults", "printer-info", "printer-is-accepting-jobs", "printer-is-shared", "printer-is-temporary", "printer-location", "printer-make-and-model", "printer-mandatory-job-attributes", "printer-name", "printer-state", "printer-state-change-time", "printer-state-reasons", "printer-type", "printer-uri-supported" }; DEBUG_printf(("_cupsGetDests(http=%p, op=%x(%s), name=\"%s\", dests=%p, type=%x, mask=%x)", (void *)http, op, ippOpString(op), name, (void *)dests, type, mask)); #ifdef __APPLE__ /* * Get the default paper size... */ appleGetPaperSize(media_default, sizeof(media_default)); DEBUG_printf(("1_cupsGetDests: Default media is '%s'.", media_default)); #endif /* __APPLE__ */ /* * Build a IPP_OP_CUPS_GET_PRINTERS or IPP_OP_GET_PRINTER_ATTRIBUTES request, which * require the following attributes: * * attributes-charset * attributes-natural-language * requesting-user-name * printer-uri [for IPP_OP_GET_PRINTER_ATTRIBUTES] */ request = ippNewRequest(op); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), NULL, pattrs); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (name && op != IPP_OP_CUPS_GET_DEFAULT) { httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", ippPort(), "/printers/%s", name); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); } else if (mask) { ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", (int)type); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", (int)mask); } /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { for (attr = response->attrs; attr != NULL; attr = attr->next) { /* * Skip leading attributes until we hit a printer... */ while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) attr = attr->next; if (attr == NULL) break; /* * Pull the needed attributes from this printer... */ printer_name = NULL; num_options = 0; options = NULL; for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) { if (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM && attr->value_tag != IPP_TAG_BOOLEAN && attr->value_tag != IPP_TAG_TEXT && attr->value_tag != IPP_TAG_TEXTLANG && attr->value_tag != IPP_TAG_NAME && attr->value_tag != IPP_TAG_NAMELANG && attr->value_tag != IPP_TAG_KEYWORD && attr->value_tag != IPP_TAG_RANGE && attr->value_tag != IPP_TAG_URI) continue; if (!strcmp(attr->name, "auth-info-required") || !strcmp(attr->name, "device-uri") || !strcmp(attr->name, "marker-change-time") || !strcmp(attr->name, "marker-colors") || !strcmp(attr->name, "marker-high-levels") || !strcmp(attr->name, "marker-levels") || !strcmp(attr->name, "marker-low-levels") || !strcmp(attr->name, "marker-message") || !strcmp(attr->name, "marker-names") || !strcmp(attr->name, "marker-types") || !strcmp(attr->name, "printer-commands") || !strcmp(attr->name, "printer-info") || !strcmp(attr->name, "printer-is-shared") || !strcmp(attr->name, "printer-is-temporary") || !strcmp(attr->name, "printer-make-and-model") || !strcmp(attr->name, "printer-mandatory-job-attributes") || !strcmp(attr->name, "printer-state") || !strcmp(attr->name, "printer-state-change-time") || !strcmp(attr->name, "printer-type") || !strcmp(attr->name, "printer-is-accepting-jobs") || !strcmp(attr->name, "printer-location") || !strcmp(attr->name, "printer-state-reasons") || !strcmp(attr->name, "printer-uri-supported")) { /* * Add a printer description attribute... */ num_options = cupsAddOption(attr->name, cups_make_string(attr, value, sizeof(value)), num_options, &options); } #ifdef __APPLE__ else if (!strcmp(attr->name, "media-supported") && media_default[0]) { /* * See if we can set a default media size... */ int i; /* Looping var */ for (i = 0; i < attr->num_values; i ++) if (!_cups_strcasecmp(media_default, attr->values[i].string.text)) { DEBUG_printf(("1_cupsGetDests: Setting media to '%s'.", media_default)); num_options = cupsAddOption("media", media_default, num_options, &options); break; } } #endif /* __APPLE__ */ else if (!strcmp(attr->name, "printer-name") && attr->value_tag == IPP_TAG_NAME) printer_name = attr->values[0].string.text; else if (strncmp(attr->name, "notify-", 7) && strncmp(attr->name, "print-quality-", 14) && (attr->value_tag == IPP_TAG_BOOLEAN || attr->value_tag == IPP_TAG_ENUM || attr->value_tag == IPP_TAG_INTEGER || attr->value_tag == IPP_TAG_KEYWORD || attr->value_tag == IPP_TAG_NAME || attr->value_tag == IPP_TAG_RANGE) && (ptr = strstr(attr->name, "-default")) != NULL) { /* * Add a default option... */ strlcpy(optname, attr->name, sizeof(optname)); optname[ptr - attr->name] = '\0'; if (_cups_strcasecmp(optname, "media") || !cupsGetOption("media", num_options, options)) num_options = cupsAddOption(optname, cups_make_string(attr, value, sizeof(value)), num_options, &options); } } /* * See if we have everything needed... */ if (!printer_name) { cupsFreeOptions(num_options, options); if (attr == NULL) break; else continue; } if ((dest = cups_add_dest(printer_name, NULL, &num_dests, dests)) != NULL) { dest->num_options = num_options; dest->options = options; } else cupsFreeOptions(num_options, options); if (attr == NULL) break; } ippDelete(response); } /* * Return the count... */ return (num_dests); } /* * 'cupsGetDests()' - Get the list of destinations from the default server. * * Starting with CUPS 1.2, the returned list of destinations include the * "printer-info", "printer-is-accepting-jobs", "printer-is-shared", * "printer-make-and-model", "printer-state", "printer-state-change-time", * "printer-state-reasons", "printer-type", and "printer-uri-supported" * attributes as options. * * CUPS 1.4 adds the "marker-change-time", "marker-colors", * "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", * "marker-names", "marker-types", and "printer-commands" attributes as options. * * CUPS 2.2 adds accessible IPP printers to the list of destinations that can * be used. The "printer-uri-supported" option will be present for those IPP * printers that have been recently used. * * Use the @link cupsFreeDests@ function to free the destination list and * the @link cupsGetDest@ function to find a particular destination. * * @exclude all@ */ int /* O - Number of destinations */ cupsGetDests(cups_dest_t **dests) /* O - Destinations */ { return (cupsGetDests2(CUPS_HTTP_DEFAULT, dests)); } /* * 'cupsGetDests2()' - Get the list of destinations from the specified server. * * Starting with CUPS 1.2, the returned list of destinations include the * "printer-info", "printer-is-accepting-jobs", "printer-is-shared", * "printer-make-and-model", "printer-state", "printer-state-change-time", * "printer-state-reasons", "printer-type", and "printer-uri-supported" * attributes as options. * * CUPS 1.4 adds the "marker-change-time", "marker-colors", * "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", * "marker-names", "marker-types", and "printer-commands" attributes as options. * * CUPS 2.2 adds accessible IPP printers to the list of destinations that can * be used. The "printer-uri-supported" option will be present for those IPP * printers that have been recently used. * * Use the @link cupsFreeDests@ function to free the destination list and * the @link cupsGetDest@ function to find a particular destination. * * @since CUPS 1.1.21/macOS 10.4@ */ int /* O - Number of destinations */ cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ cups_dest_t **dests) /* O - Destinations */ { _cups_getdata_t data; /* Enumeration data */ DEBUG_printf(("cupsGetDests2(http=%p, dests=%p)", (void *)http, (void *)dests)); /* * Range check the input... */ if (!dests) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad NULL dests pointer"), 1); DEBUG_puts("1cupsGetDests2: NULL dests pointer, returning 0."); return (0); } /* * Connect to the server as needed... */ if (!http) { if ((http = _cupsConnect()) == NULL) { *dests = NULL; return (0); } } /* * Grab the printers and classes... */ data.num_dests = 0; data.dests = NULL; if (!httpAddrLocalhost(httpGetAddress(http))) { /* * When talking to a remote cupsd, just enumerate printers on the remote * cupsd. */ cups_enum_dests(http, 0, _CUPS_DNSSD_GET_DESTS, NULL, 0, CUPS_PRINTER_DISCOVERED, (cups_dest_cb_t)cups_get_cb, &data); } else { /* * When talking to a local cupsd, enumerate both local printers and ones we * can find on the network... */ cups_enum_dests(http, 0, _CUPS_DNSSD_GET_DESTS, NULL, 0, 0, (cups_dest_cb_t)cups_get_cb, &data); } /* * Return the number of destinations... */ *dests = data.dests; if (data.num_dests > 0) _cupsSetError(IPP_STATUS_OK, NULL, 0); DEBUG_printf(("1cupsGetDests2: Returning %d destinations.", data.num_dests)); return (data.num_dests); } /* * 'cupsGetNamedDest()' - Get options for the named destination. * * This function is optimized for retrieving a single destination and should * be used instead of @link cupsGetDests2@ and @link cupsGetDest@ when you * either know the name of the destination or want to print to the default * destination. If @code NULL@ is returned, the destination does not exist or * there is no default destination. * * If "http" is @code CUPS_HTTP_DEFAULT@, the connection to the default print * server will be used. * * If "name" is @code NULL@, the default printer for the current user will be * returned. * * The returned destination must be freed using @link cupsFreeDests@ with a * "num_dests" value of 1. * * @since CUPS 1.4/macOS 10.6@ */ cups_dest_t * /* O - Destination or @code NULL@ */ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ const char *name, /* I - Destination name or @code NULL@ for the default destination */ const char *instance) /* I - Instance name or @code NULL@ */ { const char *dest_name; /* Working destination name */ cups_dest_t *dest; /* Destination */ char filename[1024], /* Path to lpoptions */ defname[256]; /* Default printer name */ int set_as_default = 0; /* Set returned destination as default */ ipp_op_t op = IPP_OP_GET_PRINTER_ATTRIBUTES; /* IPP operation to get server ops */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_printf(("cupsGetNamedDest(http=%p, name=\"%s\", instance=\"%s\")", (void *)http, name, instance)); /* * If "name" is NULL, find the default destination... */ dest_name = name; if (!dest_name) { set_as_default = 1; dest_name = _cupsUserDefault(defname, sizeof(defname)); if (dest_name) { char *ptr; /* Temporary pointer... */ if ((ptr = strchr(defname, '/')) != NULL) { *ptr++ = '\0'; instance = ptr; } else instance = NULL; } else if (cg->home) { /* * No default in the environment, try the user's lpoptions files... */ snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); dest_name = cups_get_default(filename, defname, sizeof(defname), &instance); if (dest_name) set_as_default = 2; } if (!dest_name) { /* * Still not there? Try the system lpoptions file... */ snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); dest_name = cups_get_default(filename, defname, sizeof(defname), &instance); if (dest_name) set_as_default = 3; } if (!dest_name) { /* * No locally-set default destination, ask the server... */ op = IPP_OP_CUPS_GET_DEFAULT; set_as_default = 4; DEBUG_puts("1cupsGetNamedDest: Asking server for default printer..."); } else DEBUG_printf(("1cupsGetNamedDest: Using name=\"%s\"...", name)); } /* * Get the printer's attributes... */ if (!_cupsGetDests(http, op, dest_name, &dest, 0, 0)) { if (name) { _cups_namedata_t data; /* Callback data */ DEBUG_puts("1cupsGetNamedDest: No queue found for printer, looking on network..."); data.name = name; data.dest = NULL; cupsEnumDests(0, 1000, NULL, 0, 0, (cups_dest_cb_t)cups_name_cb, &data); if (!data.dest) return (NULL); dest = data.dest; } else { switch (set_as_default) { default : break; case 1 : /* Set from env vars */ if (getenv("LPDEST")) _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("LPDEST environment variable names default destination that does not exist."), 1); else if (getenv("PRINTER")) _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("PRINTER environment variable names default destination that does not exist."), 1); else _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); break; case 2 : /* Set from ~/.cups/lpoptions */ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("~/.cups/lpoptions file names default destination that does not exist."), 1); break; case 3 : /* Set from /etc/cups/lpoptions */ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("/etc/cups/lpoptions file names default destination that does not exist."), 1); break; case 4 : /* Set from server */ _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("No default destination."), 1); break; } return (NULL); } } DEBUG_printf(("1cupsGetNamedDest: Got dest=%p", (void *)dest)); if (instance) dest->instance = _cupsStrAlloc(instance); if (set_as_default) dest->is_default = 1; /* * Then add local options... */ snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); cups_get_dests(filename, dest_name, instance, 0, 1, 1, &dest); if (cg->home) { snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); cups_get_dests(filename, dest_name, instance, 0, 1, 1, &dest); } /* * Return the result... */ return (dest); } /* * 'cupsRemoveDest()' - Remove a destination from the destination list. * * Removing a destination/instance does not delete the class or printer * queue, merely the lpoptions for that destination/instance. Use the * @link cupsSetDests@ or @link cupsSetDests2@ functions to save the new * options for the user. * * @since CUPS 1.3/macOS 10.5@ */ int /* O - New number of destinations */ cupsRemoveDest(const char *name, /* I - Destination name */ const char *instance, /* I - Instance name or @code NULL@ */ int num_dests, /* I - Number of destinations */ cups_dest_t **dests) /* IO - Destinations */ { int i; /* Index into destinations */ cups_dest_t *dest; /* Pointer to destination */ /* * Find the destination... */ if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL) return (num_dests); /* * Free memory... */ _cupsStrFree(dest->name); _cupsStrFree(dest->instance); cupsFreeOptions(dest->num_options, dest->options); /* * Remove the destination from the array... */ num_dests --; i = (int)(dest - *dests); if (i < num_dests) memmove(dest, dest + 1, (size_t)(num_dests - i) * sizeof(cups_dest_t)); return (num_dests); } /* * 'cupsSetDefaultDest()' - Set the default destination. * * @since CUPS 1.3/macOS 10.5@ */ void cupsSetDefaultDest( const char *name, /* I - Destination name */ const char *instance, /* I - Instance name or @code NULL@ */ int num_dests, /* I - Number of destinations */ cups_dest_t *dests) /* I - Destinations */ { int i; /* Looping var */ cups_dest_t *dest; /* Current destination */ /* * Range check input... */ if (!name || num_dests <= 0 || !dests) return; /* * Loop through the array and set the "is_default" flag for the matching * destination... */ for (i = num_dests, dest = dests; i > 0; i --, dest ++) dest->is_default = !_cups_strcasecmp(name, dest->name) && ((!instance && !dest->instance) || (instance && dest->instance && !_cups_strcasecmp(instance, dest->instance))); } /* * 'cupsSetDests()' - Save the list of destinations for the default server. * * This function saves the destinations to /etc/cups/lpoptions when run * as root and ~/.cups/lpoptions when run as a normal user. * * @exclude all@ */ void cupsSetDests(int num_dests, /* I - Number of destinations */ cups_dest_t *dests) /* I - Destinations */ { cupsSetDests2(CUPS_HTTP_DEFAULT, num_dests, dests); } /* * 'cupsSetDests2()' - Save the list of destinations for the specified server. * * This function saves the destinations to /etc/cups/lpoptions when run * as root and ~/.cups/lpoptions when run as a normal user. * * @since CUPS 1.1.21/macOS 10.4@ */ int /* O - 0 on success, -1 on error */ cupsSetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int num_dests, /* I - Number of destinations */ cups_dest_t *dests) /* I - Destinations */ { int i, j; /* Looping vars */ int wrote; /* Wrote definition? */ cups_dest_t *dest; /* Current destination */ cups_option_t *option; /* Current option */ _ipp_option_t *match; /* Matching attribute for option */ FILE *fp; /* File pointer */ char filename[1024]; /* lpoptions file */ int num_temps; /* Number of temporary destinations */ cups_dest_t *temps = NULL, /* Temporary destinations */ *temp; /* Current temporary dest */ const char *val; /* Value of temporary option */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * Range check the input... */ if (!num_dests || !dests) return (-1); /* * Get the server destinations... */ num_temps = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, &temps, 0, 0); if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) { cupsFreeDests(num_temps, temps); return (-1); } /* * Figure out which file to write to... */ snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); if (cg->home) { /* * Create ~/.cups subdirectory... */ snprintf(filename, sizeof(filename), "%s/.cups", cg->home); if (access(filename, 0)) mkdir(filename, 0700); snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); } /* * Try to open the file... */ if ((fp = fopen(filename, "w")) == NULL) { cupsFreeDests(num_temps, temps); return (-1); } #ifndef _WIN32 /* * Set the permissions to 0644 when saving to the /etc/cups/lpoptions * file... */ if (!getuid()) fchmod(fileno(fp), 0644); #endif /* !_WIN32 */ /* * Write each printer; each line looks like: * * Dest name[/instance] options * Default name[/instance] options */ for (i = num_dests, dest = dests; i > 0; i --, dest ++) if (dest->instance != NULL || dest->num_options != 0 || dest->is_default) { if (dest->is_default) { fprintf(fp, "Default %s", dest->name); if (dest->instance) fprintf(fp, "/%s", dest->instance); wrote = 1; } else wrote = 0; temp = cupsGetDest(dest->name, NULL, num_temps, temps); for (j = dest->num_options, option = dest->options; j > 0; j --, option ++) { /* * See if this option is a printer attribute; if so, skip it... */ if ((match = _ippFindOption(option->name)) != NULL && match->group_tag == IPP_TAG_PRINTER) continue; /* * See if the server options match these; if so, don't write 'em. */ if (temp && (val = cupsGetOption(option->name, temp->num_options, temp->options)) != NULL && !_cups_strcasecmp(val, option->value)) continue; /* * Options don't match, write to the file... */ if (!wrote) { fprintf(fp, "Dest %s", dest->name); if (dest->instance) fprintf(fp, "/%s", dest->instance); wrote = 1; } if (option->value[0]) { if (strchr(option->value, ' ') || strchr(option->value, '\\') || strchr(option->value, '\"') || strchr(option->value, '\'')) { /* * Quote the value... */ fprintf(fp, " %s=\"", option->name); for (val = option->value; *val; val ++) { if (strchr("\"\'\\", *val)) putc('\\', fp); putc(*val, fp); } putc('\"', fp); } else { /* * Store the literal value... */ fprintf(fp, " %s=%s", option->name, option->value); } } else fprintf(fp, " %s", option->name); } if (wrote) fputs("\n", fp); } /* * Free the temporary destinations and close the file... */ cupsFreeDests(num_temps, temps); fclose(fp); #ifdef __APPLE__ /* * Set the default printer for this location - this allows command-line * and GUI applications to share the same default destination... */ if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL) { CFStringRef name = CFStringCreateWithCString(kCFAllocatorDefault, dest->name, kCFStringEncodingUTF8); /* Default printer name */ if (name) { _cupsAppleSetDefaultPrinter(name); CFRelease(name); } } #endif /* __APPLE__ */ #ifdef HAVE_NOTIFY_POST /* * Send a notification so that macOS applications can know about the * change, too. */ notify_post("com.apple.printerListChange"); #endif /* HAVE_NOTIFY_POST */ return (0); } /* * '_cupsUserDefault()' - Get the user default printer from environment * variables and location information. */ char * /* O - Default printer or NULL */ _cupsUserDefault(char *name, /* I - Name buffer */ size_t namesize) /* I - Size of name buffer */ { const char *env; /* LPDEST or PRINTER env variable */ #ifdef __APPLE__ CFStringRef locprinter; /* Last printer as this location */ #endif /* __APPLE__ */ if ((env = getenv("LPDEST")) == NULL) if ((env = getenv("PRINTER")) != NULL && !strcmp(env, "lp")) env = NULL; if (env) { strlcpy(name, env, namesize); return (name); } #ifdef __APPLE__ /* * Use location-based defaults if "use last printer" is selected in the * system preferences... */ if (!getenv("CUPS_NO_APPLE_DEFAULT") && (locprinter = _cupsAppleCopyDefaultPrinter()) != NULL) { CFStringGetCString(locprinter, name, (CFIndex)namesize, kCFStringEncodingUTF8); CFRelease(locprinter); } else name[0] = '\0'; DEBUG_printf(("1_cupsUserDefault: Returning \"%s\".", name)); return (*name ? name : NULL); #else /* * No location-based defaults on this platform... */ name[0] = '\0'; return (NULL); #endif /* __APPLE__ */ } #if _CUPS_LOCATION_DEFAULTS /* * 'appleCopyLocations()' - Copy the location history array. */ static CFArrayRef /* O - Location array or NULL */ appleCopyLocations(void) { CFArrayRef locations; /* Location array */ /* * Look up the location array in the preferences... */ if ((locations = CFPreferencesCopyAppValue(kLastUsedPrintersKey, kCUPSPrintingPrefs)) == NULL) return (NULL); if (CFGetTypeID(locations) != CFArrayGetTypeID()) { CFRelease(locations); return (NULL); } return (locations); } /* * 'appleCopyNetwork()' - Get the network ID for the current location. */ static CFStringRef /* O - Network ID */ appleCopyNetwork(void) { SCDynamicStoreRef dynamicStore; /* System configuration data */ CFStringRef key; /* Current network configuration key */ CFDictionaryRef ip_dict; /* Network configuration data */ CFStringRef network = NULL; /* Current network ID */ if ((dynamicStore = SCDynamicStoreCreate(NULL, CFSTR("libcups"), NULL, NULL)) != NULL) { /* * First use the IPv6 router address, if available, since that will generally * be a globally-unique link-local address. */ if ((key = SCDynamicStoreKeyCreateNetworkGlobalEntity( NULL, kSCDynamicStoreDomainState, kSCEntNetIPv6)) != NULL) { if ((ip_dict = SCDynamicStoreCopyValue(dynamicStore, key)) != NULL) { if ((network = CFDictionaryGetValue(ip_dict, kSCPropNetIPv6Router)) != NULL) CFRetain(network); CFRelease(ip_dict); } CFRelease(key); } /* * If that doesn't work, try the IPv4 router address. This isn't as unique * and will likely be a 10.x.y.z or 192.168.y.z address... */ if (!network) { if ((key = SCDynamicStoreKeyCreateNetworkGlobalEntity( NULL, kSCDynamicStoreDomainState, kSCEntNetIPv4)) != NULL) { if ((ip_dict = SCDynamicStoreCopyValue(dynamicStore, key)) != NULL) { if ((network = CFDictionaryGetValue(ip_dict, kSCPropNetIPv4Router)) != NULL) CFRetain(network); CFRelease(ip_dict); } CFRelease(key); } } CFRelease(dynamicStore); } return (network); } #endif /* _CUPS_LOCATION_DEFAULTS */ #ifdef __APPLE__ /* * 'appleGetPaperSize()' - Get the default paper size. */ static char * /* O - Default paper size */ appleGetPaperSize(char *name, /* I - Paper size name buffer */ size_t namesize) /* I - Size of buffer */ { CFStringRef defaultPaperID; /* Default paper ID */ pwg_media_t *pwgmedia; /* PWG media size */ defaultPaperID = _cupsAppleCopyDefaultPaperID(); if (!defaultPaperID || CFGetTypeID(defaultPaperID) != CFStringGetTypeID() || !CFStringGetCString(defaultPaperID, name, (CFIndex)namesize, kCFStringEncodingUTF8)) name[0] = '\0'; else if ((pwgmedia = pwgMediaForLegacy(name)) != NULL) strlcpy(name, pwgmedia->pwg, namesize); if (defaultPaperID) CFRelease(defaultPaperID); return (name); } #endif /* __APPLE__ */ #if _CUPS_LOCATION_DEFAULTS /* * 'appleGetPrinter()' - Get a printer from the history array. */ static CFStringRef /* O - Printer name or NULL */ appleGetPrinter(CFArrayRef locations, /* I - Location array */ CFStringRef network, /* I - Network name */ CFIndex *locindex) /* O - Index in array */ { CFIndex i, /* Looping var */ count; /* Number of locations */ CFDictionaryRef location; /* Current location */ CFStringRef locnetwork, /* Current network */ locprinter; /* Current printer */ for (i = 0, count = CFArrayGetCount(locations); i < count; i ++) if ((location = CFArrayGetValueAtIndex(locations, i)) != NULL && CFGetTypeID(location) == CFDictionaryGetTypeID()) { if ((locnetwork = CFDictionaryGetValue(location, kLocationNetworkKey)) != NULL && CFGetTypeID(locnetwork) == CFStringGetTypeID() && CFStringCompare(network, locnetwork, 0) == kCFCompareEqualTo && (locprinter = CFDictionaryGetValue(location, kLocationPrinterIDKey)) != NULL && CFGetTypeID(locprinter) == CFStringGetTypeID()) { if (locindex) *locindex = i; return (locprinter); } } return (NULL); } #endif /* _CUPS_LOCATION_DEFAULTS */ /* * 'cups_add_dest()' - Add a destination to the array. * * Unlike cupsAddDest(), this function does not check for duplicates. */ static cups_dest_t * /* O - New destination */ cups_add_dest(const char *name, /* I - Name of destination */ const char *instance, /* I - Instance or NULL */ int *num_dests, /* IO - Number of destinations */ cups_dest_t **dests) /* IO - Destinations */ { int insert, /* Insertion point */ diff; /* Result of comparison */ cups_dest_t *dest; /* Destination pointer */ /* * Add new destination... */ if (*num_dests == 0) dest = malloc(sizeof(cups_dest_t)); else dest = realloc(*dests, sizeof(cups_dest_t) * (size_t)(*num_dests + 1)); if (!dest) return (NULL); *dests = dest; /* * Find where to insert the destination... */ if (*num_dests == 0) insert = 0; else { insert = cups_find_dest(name, instance, *num_dests, *dests, *num_dests - 1, &diff); if (diff > 0) insert ++; } /* * Move the array elements as needed... */ if (insert < *num_dests) memmove(*dests + insert + 1, *dests + insert, (size_t)(*num_dests - insert) * sizeof(cups_dest_t)); (*num_dests) ++; /* * Initialize the destination... */ dest = *dests + insert; dest->name = _cupsStrAlloc(name); dest->instance = _cupsStrAlloc(instance); dest->is_default = 0; dest->num_options = 0; dest->options = (cups_option_t *)0; return (dest); } # ifdef __BLOCKS__ /* * 'cups_block_cb()' - Enumeration callback for block API. */ static int /* O - 1 to continue, 0 to stop */ cups_block_cb( cups_dest_block_t block, /* I - Block */ unsigned flags, /* I - Destination flags */ cups_dest_t *dest) /* I - Destination */ { return ((block)(flags, dest)); } # endif /* __BLOCKS__ */ /* * 'cups_compare_dests()' - Compare two destinations. */ static int /* O - Result of comparison */ cups_compare_dests(cups_dest_t *a, /* I - First destination */ cups_dest_t *b) /* I - Second destination */ { int diff; /* Difference */ if ((diff = _cups_strcasecmp(a->name, b->name)) != 0) return (diff); else if (a->instance && b->instance) return (_cups_strcasecmp(a->instance, b->instance)); else return ((a->instance && !b->instance) - (!a->instance && b->instance)); } #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) # ifdef HAVE_DNSSD /* * 'cups_dnssd_browse_cb()' - Browse for printers. */ static void cups_dnssd_browse_cb( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Option flags */ uint32_t interfaceIndex, /* I - Interface number */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *serviceName, /* I - Name of service/device */ const char *regtype, /* I - Type of service */ const char *replyDomain, /* I - Service domain */ void *context) /* I - Enumeration data */ { _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context; /* Enumeration data */ DEBUG_printf(("5cups_dnssd_browse_cb(sdRef=%p, flags=%x, interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", regtype=\"%s\", replyDomain=\"%s\", context=%p)", (void *)sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, context)); /* * Don't do anything on error... */ if (errorCode != kDNSServiceErr_NoError) return; /* * Get the device... */ cups_dnssd_get_device(data, serviceName, regtype, replyDomain); } # else /* HAVE_AVAHI */ /* * 'cups_dnssd_browse_cb()' - Browse for printers. */ static void cups_dnssd_browse_cb( AvahiServiceBrowser *browser, /* I - Browser */ AvahiIfIndex interface, /* I - Interface index (unused) */ AvahiProtocol protocol, /* I - Network protocol (unused) */ AvahiBrowserEvent event, /* I - What happened */ const char *name, /* I - Service name */ const char *type, /* I - Registration type */ const char *domain, /* I - Domain */ AvahiLookupResultFlags flags, /* I - Flags */ void *context) /* I - Devices array */ { #ifdef DEBUG AvahiClient *client = avahi_service_browser_get_client(browser); /* Client information */ #endif /* DEBUG */ _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context; /* Enumeration data */ (void)interface; (void)protocol; (void)context; DEBUG_printf(("cups_dnssd_browse_cb(..., name=\"%s\", type=\"%s\", domain=\"%s\", ...);", name, type, domain)); switch (event) { case AVAHI_BROWSER_FAILURE: DEBUG_printf(("cups_dnssd_browse_cb: %s", avahi_strerror(avahi_client_errno(client)))); avahi_simple_poll_quit(data->simple_poll); break; case AVAHI_BROWSER_NEW: /* * This object is new on the network. */ cups_dnssd_get_device(data, name, type, domain); break; case AVAHI_BROWSER_REMOVE : case AVAHI_BROWSER_CACHE_EXHAUSTED : break; case AVAHI_BROWSER_ALL_FOR_NOW : DEBUG_puts("cups_dnssd_browse_cb: ALL_FOR_NOW"); data->browsers --; break; } } /* * 'cups_dnssd_client_cb()' - Avahi client callback function. */ static void cups_dnssd_client_cb( AvahiClient *client, /* I - Client information (unused) */ AvahiClientState state, /* I - Current state */ void *context) /* I - User data (unused) */ { _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context; /* Enumeration data */ (void)client; DEBUG_printf(("cups_dnssd_client_cb(client=%p, state=%d, context=%p)", client, state, context)); /* * If the connection drops, quit. */ if (state == AVAHI_CLIENT_FAILURE) { DEBUG_puts("cups_dnssd_client_cb: Avahi connection failed."); avahi_simple_poll_quit(data->simple_poll); } } # endif /* HAVE_DNSSD */ /* * 'cups_dnssd_compare_device()' - Compare two devices. */ static int /* O - Result of comparison */ cups_dnssd_compare_devices( _cups_dnssd_device_t *a, /* I - First device */ _cups_dnssd_device_t *b) /* I - Second device */ { return (strcmp(a->dest.name, b->dest.name)); } /* * 'cups_dnssd_free_device()' - Free the memory used by a device. */ static void cups_dnssd_free_device( _cups_dnssd_device_t *device, /* I - Device */ _cups_dnssd_data_t *data) /* I - Enumeration data */ { DEBUG_printf(("5cups_dnssd_free_device(device=%p(%s), data=%p)", (void *)device, device->dest.name, (void *)data)); # ifdef HAVE_DNSSD if (device->ref) DNSServiceRefDeallocate(device->ref); # else /* HAVE_AVAHI */ if (device->ref) avahi_record_browser_free(device->ref); # endif /* HAVE_DNSSD */ _cupsStrFree(device->domain); _cupsStrFree(device->fullName); _cupsStrFree(device->regtype); _cupsStrFree(device->dest.name); cupsFreeOptions(device->dest.num_options, device->dest.options); free(device); } /* * 'cups_dnssd_get_device()' - Lookup a device and create it as needed. */ static _cups_dnssd_device_t * /* O - Device */ cups_dnssd_get_device( _cups_dnssd_data_t *data, /* I - Enumeration data */ const char *serviceName, /* I - Service name */ const char *regtype, /* I - Registration type */ const char *replyDomain) /* I - Domain name */ { _cups_dnssd_device_t key, /* Search key */ *device; /* Device */ char fullName[kDNSServiceMaxDomainName], /* Full name for query */ name[128]; /* Queue name */ DEBUG_printf(("5cups_dnssd_get_device(data=%p, serviceName=\"%s\", regtype=\"%s\", replyDomain=\"%s\")", (void *)data, serviceName, regtype, replyDomain)); /* * See if this is an existing device... */ cups_queue_name(name, serviceName, sizeof(name)); key.dest.name = name; if ((device = cupsArrayFind(data->devices, &key)) != NULL) { /* * Yes, see if we need to do anything with this... */ int update = 0; /* Non-zero if we need to update */ if (!_cups_strcasecmp(replyDomain, "local.") && _cups_strcasecmp(device->domain, replyDomain)) { /* * Update the "global" listing to use the .local domain name instead. */ _cupsStrFree(device->domain); device->domain = _cupsStrAlloc(replyDomain); DEBUG_printf(("6cups_dnssd_get_device: Updating '%s' to use local " "domain.", device->dest.name)); update = 1; } if (!_cups_strcasecmp(regtype, "_ipps._tcp") && _cups_strcasecmp(device->regtype, regtype)) { /* * Prefer IPPS over IPP. */ _cupsStrFree(device->regtype); device->regtype = _cupsStrAlloc(regtype); DEBUG_printf(("6cups_dnssd_get_device: Updating '%s' to use IPPS.", device->dest.name)); update = 1; } if (!update) { DEBUG_printf(("6cups_dnssd_get_device: No changes to '%s'.", device->dest.name)); return (device); } } else { /* * No, add the device... */ DEBUG_printf(("6cups_dnssd_get_device: Adding '%s' for %s with domain " "'%s'.", serviceName, !strcmp(regtype, "_ipps._tcp") ? "IPPS" : "IPP", replyDomain)); device = calloc(sizeof(_cups_dnssd_device_t), 1); device->dest.name = _cupsStrAlloc(name); device->domain = _cupsStrAlloc(replyDomain); device->regtype = _cupsStrAlloc(regtype); device->dest.num_options = cupsAddOption("printer-info", serviceName, 0, &device->dest.options); cupsArrayAdd(data->devices, device); } /* * Set the "full name" of this service, which is used for queries... */ # ifdef HAVE_DNSSD DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); # else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); # endif /* HAVE_DNSSD */ _cupsStrFree(device->fullName); device->fullName = _cupsStrAlloc(fullName); if (device->ref) { # ifdef HAVE_DNSSD DNSServiceRefDeallocate(device->ref); # else /* HAVE_AVAHI */ avahi_record_browser_free(device->ref); # endif /* HAVE_DNSSD */ device->ref = 0; } if (device->state == _CUPS_DNSSD_ACTIVE) { DEBUG_printf(("6cups_dnssd_get_device: Remove callback for \"%s\".", device->dest.name)); (*data->cb)(data->user_data, CUPS_DEST_FLAGS_REMOVED, &device->dest); device->state = _CUPS_DNSSD_NEW; } return (device); } # ifdef HAVE_AVAHI /* * 'cups_dnssd_poll_cb()' - Wait for input on the specified file descriptors. * * Note: This function is needed because avahi_simple_poll_iterate is broken * and always uses a timeout of 0 (!) milliseconds. * (https://github.com/lathiat/avahi/issues/127) * * @private@ */ static int /* O - Number of file descriptors matching */ cups_dnssd_poll_cb( struct pollfd *pollfds, /* I - File descriptors */ unsigned int num_pollfds, /* I - Number of file descriptors */ int timeout, /* I - Timeout in milliseconds (unused) */ void *context) /* I - User data (unused) */ { _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context; /* Enumeration data */ int val; /* Return value */ DEBUG_printf(("cups_dnssd_poll_cb(pollfds=%p, num_pollfds=%d, timeout=%d, context=%p)", pollfds, num_pollfds, timeout, context)); (void)timeout; val = poll(pollfds, num_pollfds, _CUPS_DNSSD_MAXTIME); DEBUG_printf(("cups_dnssd_poll_cb: poll() returned %d", val)); if (val < 0) { DEBUG_printf(("cups_dnssd_poll_cb: %s", strerror(errno))); } else if (val > 0) { data->got_data = 1; } return (val); } # endif /* HAVE_AVAHI */ /* * 'cups_dnssd_query_cb()' - Process query data. */ static void cups_dnssd_query_cb( # ifdef HAVE_DNSSD DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Data flags */ uint32_t interfaceIndex, /* I - Interface */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *fullName, /* I - Full service name */ uint16_t rrtype, /* I - Record type */ uint16_t rrclass, /* I - Record class */ uint16_t rdlen, /* I - Length of record data */ const void *rdata, /* I - Record data */ uint32_t ttl, /* I - Time-to-live */ # else /* HAVE_AVAHI */ AvahiRecordBrowser *browser, /* I - Record browser */ AvahiIfIndex interfaceIndex, /* I - Interface index (unused) */ AvahiProtocol protocol, /* I - Network protocol (unused) */ AvahiBrowserEvent event, /* I - What happened? */ const char *fullName, /* I - Service name */ uint16_t rrclass, /* I - Record class */ uint16_t rrtype, /* I - Record type */ const void *rdata, /* I - TXT record */ size_t rdlen, /* I - Length of TXT record */ AvahiLookupResultFlags flags, /* I - Flags */ # endif /* HAVE_DNSSD */ void *context) /* I - Enumeration data */ { # if defined(DEBUG) && defined(HAVE_AVAHI) AvahiClient *client = avahi_record_browser_get_client(browser); /* Client information */ # endif /* DEBUG && HAVE_AVAHI */ _cups_dnssd_data_t *data = (_cups_dnssd_data_t *)context; /* Enumeration data */ char serviceName[256],/* Service name */ name[128], /* Queue name */ *ptr; /* Pointer into string */ _cups_dnssd_device_t dkey, /* Search key */ *device; /* Device */ # ifdef HAVE_DNSSD DEBUG_printf(("5cups_dnssd_query_cb(sdRef=%p, flags=%x, interfaceIndex=%d, errorCode=%d, fullName=\"%s\", rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, context=%p)", (void *)sdRef, flags, interfaceIndex, errorCode, fullName, rrtype, rrclass, rdlen, rdata, ttl, context)); /* * Only process "add" data... */ if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) return; # else /* HAVE_AVAHI */ DEBUG_printf(("cups_dnssd_query_cb(browser=%p, interfaceIndex=%d, protocol=%d, event=%d, fullName=\"%s\", rrclass=%u, rrtype=%u, rdata=%p, rdlen=%u, flags=%x, context=%p)", browser, interfaceIndex, protocol, event, fullName, rrclass, rrtype, rdata, (unsigned)rdlen, flags, context)); /* * Only process "add" data... */ if (event != AVAHI_BROWSER_NEW) { if (event == AVAHI_BROWSER_FAILURE) DEBUG_printf(("cups_dnssd_query_cb: %s", avahi_strerror(avahi_client_errno(client)))); return; } # endif /* HAVE_DNSSD */ /* * Lookup the service in the devices array. */ cups_dnssd_unquote(serviceName, fullName, sizeof(serviceName)); if ((ptr = strstr(serviceName, "._")) != NULL) *ptr = '\0'; cups_queue_name(name, serviceName, sizeof(name)); dkey.dest.name = name; if ((device = cupsArrayFind(data->devices, &dkey)) != NULL && device->state == _CUPS_DNSSD_NEW) { /* * Found it, pull out the make and model from the TXT record and save it... */ const uint8_t *txt, /* Pointer into data */ *txtnext, /* Next key/value pair */ *txtend; /* End of entire TXT record */ uint8_t txtlen; /* Length of current key/value pair */ char key[256], /* Key string */ value[256], /* Value string */ make_and_model[512], /* Manufacturer and model */ model[256], /* Model */ uriname[1024], /* Name for URI */ uri[1024]; /* Printer URI */ cups_ptype_t type = CUPS_PRINTER_DISCOVERED | CUPS_PRINTER_BW; /* Printer type */ int saw_printer_type = 0; /* Did we see a printer-type key? */ device->state = _CUPS_DNSSD_PENDING; make_and_model[0] = '\0'; strlcpy(model, "Unknown", sizeof(model)); for (txt = rdata, txtend = txt + rdlen; txt < txtend; txt = txtnext) { /* * Read a key/value pair starting with an 8-bit length. Since the * length is 8 bits and the size of the key/value buffers is 256, we * don't need to check for overflow... */ txtlen = *txt++; if (!txtlen || (txt + txtlen) > txtend) break; txtnext = txt + txtlen; for (ptr = key; txt < txtnext && *txt != '='; txt ++) *ptr++ = (char)*txt; *ptr = '\0'; if (txt < txtnext && *txt == '=') { txt ++; if (txt < txtnext) memcpy(value, txt, (size_t)(txtnext - txt)); value[txtnext - txt] = '\0'; DEBUG_printf(("6cups_dnssd_query_cb: %s=%s", key, value)); } else { DEBUG_printf(("6cups_dnssd_query_cb: '%s' with no value.", key)); continue; } if (!_cups_strcasecmp(key, "usb_MFG") || !_cups_strcasecmp(key, "usb_MANU") || !_cups_strcasecmp(key, "usb_MANUFACTURER")) strlcpy(make_and_model, value, sizeof(make_and_model)); else if (!_cups_strcasecmp(key, "usb_MDL") || !_cups_strcasecmp(key, "usb_MODEL")) strlcpy(model, value, sizeof(model)); else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript")) { if (value[0] == '(') { /* * Strip parenthesis... */ if ((ptr = value + strlen(value) - 1) > value && *ptr == ')') *ptr = '\0'; strlcpy(model, value + 1, sizeof(model)); } else strlcpy(model, value, sizeof(model)); } else if (!_cups_strcasecmp(key, "ty")) { strlcpy(model, value, sizeof(model)); if ((ptr = strchr(model, ',')) != NULL) *ptr = '\0'; } else if (!_cups_strcasecmp(key, "note")) device->dest.num_options = cupsAddOption("printer-location", value, device->dest.num_options, &device->dest.options); else if (!_cups_strcasecmp(key, "pdl")) { /* * Look for PDF-capable printers; only PDF-capable printers are shown. */ const char *start, *next; /* Pointer into value */ int have_pdf = 0, /* Have PDF? */ have_raster = 0;/* Have raster format support? */ for (start = value; start && *start; start = next) { if (!_cups_strncasecmp(start, "application/pdf", 15) && (!start[15] || start[15] == ',')) { have_pdf = 1; break; } else if ((!_cups_strncasecmp(start, "image/pwg-raster", 16) && (!start[16] || start[16] == ',')) || (!_cups_strncasecmp(start, "image/urf", 9) && (!start[9] || start[9] == ','))) { have_raster = 1; break; } if ((next = strchr(start, ',')) != NULL) next ++; } if (!have_pdf && !have_raster) device->state = _CUPS_DNSSD_INCOMPATIBLE; } else if (!_cups_strcasecmp(key, "printer-type")) { /* * Value is either NNNN or 0xXXXX */ saw_printer_type = 1; type = (cups_ptype_t)strtol(value, NULL, 0) | CUPS_PRINTER_DISCOVERED; } else if (!saw_printer_type) { if (!_cups_strcasecmp(key, "air") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_AUTHENTICATED; else if (!_cups_strcasecmp(key, "bind") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_BIND; else if (!_cups_strcasecmp(key, "collate") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_COLLATE; else if (!_cups_strcasecmp(key, "color") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_COLOR; else if (!_cups_strcasecmp(key, "copies") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_COPIES; else if (!_cups_strcasecmp(key, "duplex") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_DUPLEX; else if (!_cups_strcasecmp(key, "fax") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_MFP; else if (!_cups_strcasecmp(key, "papercustom") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_VARIABLE; else if (!_cups_strcasecmp(key, "papermax")) { if (!_cups_strcasecmp(value, "legal-a4")) type |= CUPS_PRINTER_SMALL; else if (!_cups_strcasecmp(value, "isoc-a2")) type |= CUPS_PRINTER_MEDIUM; else if (!_cups_strcasecmp(value, ">isoc-a2")) type |= CUPS_PRINTER_LARGE; } else if (!_cups_strcasecmp(key, "punch") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_PUNCH; else if (!_cups_strcasecmp(key, "scan") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_MFP; else if (!_cups_strcasecmp(key, "sort") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_SORT; else if (!_cups_strcasecmp(key, "staple") && !_cups_strcasecmp(value, "t")) type |= CUPS_PRINTER_STAPLE; } } /* * Save the printer-xxx values... */ if (make_and_model[0]) { strlcat(make_and_model, " ", sizeof(make_and_model)); strlcat(make_and_model, model, sizeof(make_and_model)); device->dest.num_options = cupsAddOption("printer-make-and-model", make_and_model, device->dest.num_options, &device->dest.options); } else device->dest.num_options = cupsAddOption("printer-make-and-model", model, device->dest.num_options, &device->dest.options); device->type = type; snprintf(value, sizeof(value), "%u", type); device->dest.num_options = cupsAddOption("printer-type", value, device->dest.num_options, &device->dest.options); /* * Save the URI... */ cups_dnssd_unquote(uriname, device->fullName, sizeof(uriname)); httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), !strcmp(device->regtype, "_ipps._tcp") ? "ipps" : "ipp", NULL, uriname, 0, saw_printer_type ? "/cups" : "/"); DEBUG_printf(("6cups_dnssd_query: device-uri=\"%s\"", uri)); device->dest.num_options = cupsAddOption("device-uri", uri, device->dest.num_options, &device->dest.options); } else DEBUG_printf(("6cups_dnssd_query: Ignoring TXT record for '%s'.", fullName)); } /* * 'cups_dnssd_resolve()' - Resolve a Bonjour printer URI. */ static const char * /* O - Resolved URI or NULL */ cups_dnssd_resolve( cups_dest_t *dest, /* I - Destination */ const char *uri, /* I - Current printer URI */ int msec, /* I - Time in milliseconds */ int *cancel, /* I - Pointer to "cancel" variable */ cups_dest_cb_t cb, /* I - Callback */ void *user_data) /* I - User data for callback */ { char tempuri[1024]; /* Temporary URI buffer */ _cups_dnssd_resolve_t resolve; /* Resolve data */ /* * Resolve the URI... */ resolve.cancel = cancel; gettimeofday(&resolve.end_time, NULL); if (msec > 0) { resolve.end_time.tv_sec += msec / 1000; resolve.end_time.tv_usec += (msec % 1000) * 1000; while (resolve.end_time.tv_usec >= 1000000) { resolve.end_time.tv_sec ++; resolve.end_time.tv_usec -= 1000000; } } else resolve.end_time.tv_sec += 75; if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_RESOLVING, dest); if ((uri = _httpResolveURI(uri, tempuri, sizeof(tempuri), _HTTP_RESOLVE_DEFAULT, cups_dnssd_resolve_cb, &resolve)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to resolve printer-uri."), 1); if (cb) (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR, dest); return (NULL); } /* * Save the resolved URI... */ dest->num_options = cupsAddOption("device-uri", uri, dest->num_options, &dest->options); return (cupsGetOption("device-uri", dest->num_options, dest->options)); } /* * 'cups_dnssd_resolve_cb()' - See if we should continue resolving. */ static int /* O - 1 to continue, 0 to stop */ cups_dnssd_resolve_cb(void *context) /* I - Resolve data */ { _cups_dnssd_resolve_t *resolve = (_cups_dnssd_resolve_t *)context; /* Resolve data */ struct timeval curtime; /* Current time */ /* * If the cancel variable is set, return immediately. */ if (resolve->cancel && *(resolve->cancel)) { DEBUG_puts("4cups_dnssd_resolve_cb: Canceled."); return (0); } /* * Otherwise check the end time... */ gettimeofday(&curtime, NULL); DEBUG_printf(("4cups_dnssd_resolve_cb: curtime=%d.%06d, end_time=%d.%06d", (int)curtime.tv_sec, (int)curtime.tv_usec, (int)resolve->end_time.tv_sec, (int)resolve->end_time.tv_usec)); return (curtime.tv_sec < resolve->end_time.tv_sec || (curtime.tv_sec == resolve->end_time.tv_sec && curtime.tv_usec < resolve->end_time.tv_usec)); } /* * 'cups_dnssd_unquote()' - Unquote a name string. */ static void cups_dnssd_unquote(char *dst, /* I - Destination buffer */ const char *src, /* I - Source string */ size_t dstsize) /* I - Size of destination buffer */ { char *dstend = dst + dstsize - 1; /* End of destination buffer */ while (*src && dst < dstend) { if (*src == '\\') { src ++; if (isdigit(src[0] & 255) && isdigit(src[1] & 255) && isdigit(src[2] & 255)) { *dst++ = ((((src[0] - '0') * 10) + src[1] - '0') * 10) + src[2] - '0'; src += 3; } else *dst++ = *src++; } else *dst++ = *src ++; } *dst = '\0'; } #endif /* HAVE_DNSSD */ #if defined(HAVE_AVAHI) || defined(HAVE_DNSSD) /* * 'cups_elapsed()' - Return the elapsed time in milliseconds. */ static int /* O - Elapsed time in milliseconds */ cups_elapsed(struct timeval *t) /* IO - Previous time */ { int msecs; /* Milliseconds */ struct timeval nt; /* New time */ gettimeofday(&nt, NULL); msecs = (int)(1000 * (nt.tv_sec - t->tv_sec) + (nt.tv_usec - t->tv_usec) / 1000); *t = nt; return (msecs); } #endif /* HAVE_AVAHI || HAVE_DNSSD */ /* * 'cups_enum_dests()' - Enumerate destinations from a specific server. */ static int /* O - 1 on success, 0 on failure */ cups_enum_dests( http_t *http, /* I - Connection to scheduler */ unsigned flags, /* I - Enumeration flags */ int msec, /* I - Timeout in milliseconds, -1 for indefinite */ int *cancel, /* I - Pointer to "cancel" variable */ cups_ptype_t type, /* I - Printer type bits */ cups_ptype_t mask, /* I - Mask for printer type bits */ cups_dest_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data */ { int i, j, /* Looping vars */ num_dests; /* Number of destinations */ cups_dest_t *dests = NULL, /* Destinations */ *dest; /* Current destination */ cups_option_t *option; /* Current option */ const char *user_default; /* Default printer from environment */ #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) int count, /* Number of queries started */ completed, /* Number of completed queries */ remaining; /* Remainder of timeout */ struct timeval curtime; /* Current time */ _cups_dnssd_data_t data; /* Data for callback */ _cups_dnssd_device_t *device; /* Current device */ # ifdef HAVE_DNSSD int nfds, /* Number of files responded */ main_fd; /* File descriptor for lookups */ DNSServiceRef ipp_ref = NULL; /* IPP browser */ # ifdef HAVE_SSL DNSServiceRef ipps_ref = NULL; /* IPPS browser */ # endif /* HAVE_SSL */ # ifdef HAVE_POLL struct pollfd pfd; /* Polling data */ # else fd_set input; /* Input set for select() */ struct timeval timeout; /* Timeout for select() */ # endif /* HAVE_POLL */ # else /* HAVE_AVAHI */ int error; /* Error value */ AvahiServiceBrowser *ipp_ref = NULL; /* IPP browser */ # ifdef HAVE_SSL AvahiServiceBrowser *ipps_ref = NULL; /* IPPS browser */ # endif /* HAVE_SSL */ # endif /* HAVE_DNSSD */ #else _cups_getdata_t data; /* Data for callback */ #endif /* HAVE_DNSSD || HAVE_AVAHI */ char filename[1024]; /* Local lpoptions file */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_printf(("cups_enum_dests(flags=%x, msec=%d, cancel=%p, type=%x, mask=%x, cb=%p, user_data=%p)", flags, msec, (void *)cancel, type, mask, (void *)cb, (void *)user_data)); /* * Range check input... */ (void)flags; if (!cb) { DEBUG_puts("1cups_enum_dests: No callback, returning 0."); return (0); } /* * Load the /etc/cups/lpoptions and ~/.cups/lpoptions files... */ memset(&data, 0, sizeof(data)); user_default = _cupsUserDefault(data.def_name, sizeof(data.def_name)); snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests); if (cg->home) { snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests); } if (!user_default && (dest = cupsGetDest(NULL, NULL, data.num_dests, data.dests)) != NULL) { /* * Use an lpoptions default printer... */ if (dest->instance) snprintf(data.def_name, sizeof(data.def_name), "%s/%s", dest->name, dest->instance); else strlcpy(data.def_name, dest->name, sizeof(data.def_name)); } else { const char *default_printer; /* Server default printer */ if ((default_printer = cupsGetDefault2(http)) != NULL) strlcpy(data.def_name, default_printer, sizeof(data.def_name)); } if (data.def_name[0]) { /* * Separate printer and instance name... */ if ((data.def_instance = strchr(data.def_name, '/')) != NULL) *data.def_instance++ = '\0'; } DEBUG_printf(("1cups_enum_dests: def_name=\"%s\", def_instance=\"%s\"", data.def_name, data.def_instance)); /* * Get ready to enumerate... */ #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) data.type = type; data.mask = mask; data.cb = cb; data.user_data = user_data; data.devices = cupsArrayNew3((cups_array_func_t)cups_dnssd_compare_devices, NULL, NULL, 0, NULL, (cups_afree_func_t)cups_dnssd_free_device); #endif /* HAVE_DNSSD || HAVE_AVAHI */ if (!(mask & CUPS_PRINTER_DISCOVERED) || !(type & CUPS_PRINTER_DISCOVERED)) { /* * Get the list of local printers and pass them to the callback function... */ num_dests = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, &dests, type, mask); if (data.def_name[0]) { /* * Lookup the named default printer and instance and make it the default... */ if ((dest = cupsGetDest(data.def_name, data.def_instance, num_dests, dests)) != NULL) { DEBUG_printf(("1cups_enum_dests: Setting is_default on \"%s/%s\".", dest->name, dest->instance)); dest->is_default = 1; } } for (i = num_dests, dest = dests; i > 0 && (!cancel || !*cancel); i --, dest ++) { cups_dest_t *user_dest; /* Destination from lpoptions */ #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) const char *device_uri; /* Device URI */ #endif /* HAVE_DNSSD || HAVE_AVAHI */ if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL) { /* * Apply user defaults to this destination... */ for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++) dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options); } if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, dest)) break; #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) if (!dest->instance && (device_uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL && !strncmp(device_uri, "dnssd://", 8)) { /* * Add existing queue using service name, etc. so we don't list it again... */ char scheme[32], /* URI scheme */ userpass[32], /* Username:password */ serviceName[256], /* Service name (host field) */ resource[256], /* Resource (options) */ *regtype, /* Registration type */ *replyDomain; /* Registration domain */ int port; /* Port number (not used) */ if (httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), serviceName, sizeof(serviceName), &port, resource, sizeof(resource)) >= HTTP_URI_STATUS_OK) { if ((regtype = strstr(serviceName, "._ipp")) != NULL) { *regtype++ = '\0'; if ((replyDomain = strstr(regtype, "._tcp.")) != NULL) { replyDomain[5] = '\0'; replyDomain += 6; if ((device = cups_dnssd_get_device(&data, serviceName, regtype, replyDomain)) != NULL) device->state = _CUPS_DNSSD_ACTIVE; } } } } #endif /* HAVE_DNSSD || HAVE_AVAHI */ } cupsFreeDests(num_dests, dests); if (i > 0 || msec == 0) goto enum_finished; } /* * Return early if the caller doesn't want to do discovery... */ if ((mask & CUPS_PRINTER_DISCOVERED) && !(type & CUPS_PRINTER_DISCOVERED)) goto enum_finished; #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) /* * Get Bonjour-shared printers... */ gettimeofday(&curtime, NULL); # ifdef HAVE_DNSSD if (DNSServiceCreateConnection(&data.main_ref) != kDNSServiceErr_NoError) { DEBUG_puts("1cups_enum_dests: Unable to create service browser, returning 0."); cupsFreeDests(data.num_dests, data.dests); return (0); } main_fd = DNSServiceRefSockFD(data.main_ref); ipp_ref = data.main_ref; if (DNSServiceBrowse(&ipp_ref, kDNSServiceFlagsShareConnection, 0, "_ipp._tcp", NULL, (DNSServiceBrowseReply)cups_dnssd_browse_cb, &data) != kDNSServiceErr_NoError) { DEBUG_puts("1cups_enum_dests: Unable to create IPP browser, returning 0."); DNSServiceRefDeallocate(data.main_ref); cupsFreeDests(data.num_dests, data.dests); return (0); } # ifdef HAVE_SSL ipps_ref = data.main_ref; if (DNSServiceBrowse(&ipps_ref, kDNSServiceFlagsShareConnection, 0, "_ipps._tcp", NULL, (DNSServiceBrowseReply)cups_dnssd_browse_cb, &data) != kDNSServiceErr_NoError) { DEBUG_puts("1cups_enum_dests: Unable to create IPPS browser, returning 0."); DNSServiceRefDeallocate(data.main_ref); cupsFreeDests(data.num_dests, data.dests); return (0); } # endif /* HAVE_SSL */ # else /* HAVE_AVAHI */ if ((data.simple_poll = avahi_simple_poll_new()) == NULL) { DEBUG_puts("1cups_enum_dests: Unable to create Avahi poll, returning 0."); cupsFreeDests(data.num_dests, data.dests); return (0); } avahi_simple_poll_set_func(data.simple_poll, cups_dnssd_poll_cb, &data); data.client = avahi_client_new(avahi_simple_poll_get(data.simple_poll), 0, cups_dnssd_client_cb, &data, &error); if (!data.client) { DEBUG_puts("1cups_enum_dests: Unable to create Avahi client, returning 0."); avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); return (0); } data.browsers = 1; if ((ipp_ref = avahi_service_browser_new(data.client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_ipp._tcp", NULL, 0, cups_dnssd_browse_cb, &data)) == NULL) { DEBUG_puts("1cups_enum_dests: Unable to create Avahi IPP browser, returning 0."); avahi_client_free(data.client); avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); return (0); } # ifdef HAVE_SSL data.browsers ++; if ((ipps_ref = avahi_service_browser_new(data.client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_ipps._tcp", NULL, 0, cups_dnssd_browse_cb, &data)) == NULL) { DEBUG_puts("1cups_enum_dests: Unable to create Avahi IPPS browser, returning 0."); avahi_service_browser_free(ipp_ref); avahi_client_free(data.client); avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); return (0); } # endif /* HAVE_SSL */ # endif /* HAVE_DNSSD */ if (msec < 0) remaining = INT_MAX; else remaining = msec; while (remaining > 0 && (!cancel || !*cancel)) { /* * Check for input... */ DEBUG_printf(("1cups_enum_dests: remaining=%d", remaining)); cups_elapsed(&curtime); # ifdef HAVE_DNSSD # ifdef HAVE_POLL pfd.fd = main_fd; pfd.events = POLLIN; nfds = poll(&pfd, 1, remaining > _CUPS_DNSSD_MAXTIME ? _CUPS_DNSSD_MAXTIME : remaining); # else FD_ZERO(&input); FD_SET(main_fd, &input); timeout.tv_sec = 0; timeout.tv_usec = 1000 * (remaining > _CUPS_DNSSD_MAXTIME ? _CUPS_DNSSD_MAXTIME : remaining); nfds = select(main_fd + 1, &input, NULL, NULL, &timeout); # endif /* HAVE_POLL */ if (nfds > 0) DNSServiceProcessResult(data.main_ref); else if (nfds < 0 && errno != EINTR && errno != EAGAIN) break; # else /* HAVE_AVAHI */ data.got_data = 0; if ((error = avahi_simple_poll_iterate(data.simple_poll, _CUPS_DNSSD_MAXTIME)) > 0) { /* * We've been told to exit the loop. Perhaps the connection to * Avahi failed. */ break; } DEBUG_printf(("1cups_enum_dests: got_data=%d", data.got_data)); # endif /* HAVE_DNSSD */ remaining -= cups_elapsed(&curtime); for (device = (_cups_dnssd_device_t *)cupsArrayFirst(data.devices), count = 0, completed = 0; device; device = (_cups_dnssd_device_t *)cupsArrayNext(data.devices)) { if (device->ref) count ++; if (device->state == _CUPS_DNSSD_ACTIVE) completed ++; if (!device->ref && device->state == _CUPS_DNSSD_NEW) { DEBUG_printf(("1cups_enum_dests: Querying '%s'.", device->fullName)); # ifdef HAVE_DNSSD device->ref = data.main_ref; if (DNSServiceQueryRecord(&(device->ref), kDNSServiceFlagsShareConnection, 0, device->fullName, kDNSServiceType_TXT, kDNSServiceClass_IN, (DNSServiceQueryRecordReply)cups_dnssd_query_cb, &data) == kDNSServiceErr_NoError) { count ++; } else { device->ref = 0; device->state = _CUPS_DNSSD_ERROR; DEBUG_puts("1cups_enum_dests: Query failed."); } # else /* HAVE_AVAHI */ if ((device->ref = avahi_record_browser_new(data.client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, device->fullName, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT, 0, cups_dnssd_query_cb, &data)) != NULL) { DEBUG_printf(("1cups_enum_dests: Query ref=%p", device->ref)); count ++; } else { device->state = _CUPS_DNSSD_ERROR; DEBUG_printf(("1cups_enum_dests: Query failed: %s", avahi_strerror(avahi_client_errno(data.client)))); } # endif /* HAVE_DNSSD */ } else if (device->ref && device->state == _CUPS_DNSSD_PENDING) { completed ++; DEBUG_printf(("1cups_enum_dests: Query for \"%s\" is complete.", device->fullName)); if ((device->type & mask) == type) { cups_dest_t *user_dest; /* Destination from lpoptions */ dest = &device->dest; if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL) { /* * Apply user defaults to this destination... */ for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++) dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options); } if (!strcasecmp(dest->name, data.def_name) && !data.def_instance) { DEBUG_printf(("1cups_enum_dests: Setting is_default on discovered \"%s\".", dest->name)); dest->is_default = 1; } DEBUG_printf(("1cups_enum_dests: Add callback for \"%s\".", device->dest.name)); if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest)) { remaining = -1; break; } } device->state = _CUPS_DNSSD_ACTIVE; } } # ifdef HAVE_AVAHI DEBUG_printf(("1cups_enum_dests: remaining=%d, browsers=%d, completed=%d, count=%d, devices count=%d", remaining, data.browsers, completed, count, cupsArrayCount(data.devices))); if (data.browsers == 0 && completed == cupsArrayCount(data.devices)) break; # else DEBUG_printf(("1cups_enum_dests: remaining=%d, completed=%d, count=%d, devices count=%d", remaining, completed, count, cupsArrayCount(data.devices))); if (completed == cupsArrayCount(data.devices)) break; # endif /* HAVE_AVAHI */ } #endif /* HAVE_DNSSD || HAVE_AVAHI */ /* * Return... */ enum_finished: cupsFreeDests(data.num_dests, data.dests); #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) cupsArrayDelete(data.devices); # ifdef HAVE_DNSSD if (ipp_ref) DNSServiceRefDeallocate(ipp_ref); # ifdef HAVE_SSL if (ipps_ref) DNSServiceRefDeallocate(ipps_ref); # endif /* HAVE_SSL */ if (data.main_ref) DNSServiceRefDeallocate(data.main_ref); # else /* HAVE_AVAHI */ if (ipp_ref) avahi_service_browser_free(ipp_ref); # ifdef HAVE_SSL if (ipps_ref) avahi_service_browser_free(ipps_ref); # endif /* HAVE_SSL */ if (data.client) avahi_client_free(data.client); if (data.simple_poll) avahi_simple_poll_free(data.simple_poll); # endif /* HAVE_DNSSD */ #endif /* HAVE_DNSSD || HAVE_AVAHI */ DEBUG_puts("1cups_enum_dests: Returning 1."); return (1); } /* * 'cups_find_dest()' - Find a destination using a binary search. */ static int /* O - Index of match */ cups_find_dest(const char *name, /* I - Destination name */ const char *instance, /* I - Instance or NULL */ int num_dests, /* I - Number of destinations */ cups_dest_t *dests, /* I - Destinations */ int prev, /* I - Previous index */ int *rdiff) /* O - Difference of match */ { int left, /* Low mark for binary search */ right, /* High mark for binary search */ current, /* Current index */ diff; /* Result of comparison */ cups_dest_t key; /* Search key */ key.name = (char *)name; key.instance = (char *)instance; if (prev >= 0) { /* * Start search on either side of previous... */ if ((diff = cups_compare_dests(&key, dests + prev)) == 0 || (diff < 0 && prev == 0) || (diff > 0 && prev == (num_dests - 1))) { *rdiff = diff; return (prev); } else if (diff < 0) { /* * Start with previous on right side... */ left = 0; right = prev; } else { /* * Start wih previous on left side... */ left = prev; right = num_dests - 1; } } else { /* * Start search in the middle... */ left = 0; right = num_dests - 1; } do { current = (left + right) / 2; diff = cups_compare_dests(&key, dests + current); if (diff == 0) break; else if (diff < 0) right = current; else left = current; } while ((right - left) > 1); if (diff != 0) { /* * Check the last 1 or 2 elements... */ if ((diff = cups_compare_dests(&key, dests + left)) <= 0) current = left; else { diff = cups_compare_dests(&key, dests + right); current = right; } } /* * Return the closest destination and the difference... */ *rdiff = diff; return (current); } /* * 'cups_get_cb()' - Collect enumerated destinations. */ static int /* O - 1 to continue, 0 to stop */ cups_get_cb(_cups_getdata_t *data, /* I - Data from cupsGetDests */ unsigned flags, /* I - Enumeration flags */ cups_dest_t *dest) /* I - Destination */ { if (flags & CUPS_DEST_FLAGS_REMOVED) { /* * Remove destination from array... */ data->num_dests = cupsRemoveDest(dest->name, dest->instance, data->num_dests, &data->dests); } else { /* * Add destination to array... */ data->num_dests = cupsCopyDest(dest, data->num_dests, &data->dests); } return (1); } /* * 'cups_get_default()' - Get the default destination from an lpoptions file. */ static char * /* O - Default destination or NULL */ cups_get_default(const char *filename, /* I - File to read */ char *namebuf, /* I - Name buffer */ size_t namesize, /* I - Size of name buffer */ const char **instance) /* I - Instance */ { cups_file_t *fp; /* lpoptions file */ char line[8192], /* Line from file */ *value, /* Value for line */ *nameptr; /* Pointer into name */ int linenum; /* Current line */ *namebuf = '\0'; if ((fp = cupsFileOpen(filename, "r")) != NULL) { linenum = 0; while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { if (!_cups_strcasecmp(line, "default") && value) { strlcpy(namebuf, value, namesize); if ((nameptr = strchr(namebuf, ' ')) != NULL) *nameptr = '\0'; if ((nameptr = strchr(namebuf, '\t')) != NULL) *nameptr = '\0'; if ((nameptr = strchr(namebuf, '/')) != NULL) *nameptr++ = '\0'; *instance = nameptr; break; } } cupsFileClose(fp); } return (*namebuf ? namebuf : NULL); } /* * 'cups_get_dests()' - Get destinations from a file. */ static int /* O - Number of destinations */ cups_get_dests( const char *filename, /* I - File to read from */ const char *match_name, /* I - Destination name we want */ const char *match_inst, /* I - Instance name we want */ int load_all, /* I - Load all saved destinations? */ int user_default_set, /* I - User default printer set? */ int num_dests, /* I - Number of destinations */ cups_dest_t **dests) /* IO - Destinations */ { int i; /* Looping var */ cups_dest_t *dest; /* Current destination */ cups_file_t *fp; /* File pointer */ char line[8192], /* Line from file */ *lineptr, /* Pointer into line */ *name, /* Name of destination/option */ *instance; /* Instance of destination */ int linenum; /* Current line number */ DEBUG_printf(("7cups_get_dests(filename=\"%s\", match_name=\"%s\", match_inst=\"%s\", load_all=%d, user_default_set=%d, num_dests=%d, dests=%p)", filename, match_name, match_inst, load_all, user_default_set, num_dests, (void *)dests)); /* * Try to open the file... */ if ((fp = cupsFileOpen(filename, "r")) == NULL) return (num_dests); /* * Read each printer; each line looks like: * * Dest name[/instance] options * Default name[/instance] options */ linenum = 0; while (cupsFileGetConf(fp, line, sizeof(line), &lineptr, &linenum)) { /* * See what type of line it is... */ DEBUG_printf(("9cups_get_dests: linenum=%d line=\"%s\" lineptr=\"%s\"", linenum, line, lineptr)); if ((_cups_strcasecmp(line, "dest") && _cups_strcasecmp(line, "default")) || !lineptr) { DEBUG_puts("9cups_get_dests: Not a dest or default line..."); continue; } name = lineptr; /* * Search for an instance... */ while (!isspace(*lineptr & 255) && *lineptr && *lineptr != '/') lineptr ++; if (*lineptr == '/') { /* * Found an instance... */ *lineptr++ = '\0'; instance = lineptr; /* * Search for an instance... */ while (!isspace(*lineptr & 255) && *lineptr) lineptr ++; } else instance = NULL; if (*lineptr) *lineptr++ = '\0'; DEBUG_printf(("9cups_get_dests: name=\"%s\", instance=\"%s\"", name, instance)); /* * Match and/or ignore missing destinations... */ if (match_name) { if (_cups_strcasecmp(name, match_name) || (!instance && match_inst) || (instance && !match_inst) || (instance && _cups_strcasecmp(instance, match_inst))) continue; dest = *dests; } else if (!load_all && cupsGetDest(name, NULL, num_dests, *dests) == NULL) { DEBUG_puts("9cups_get_dests: Not found!"); continue; } else { /* * Add the destination... */ num_dests = cupsAddDest(name, instance, num_dests, dests); if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL) { /* * Out of memory! */ DEBUG_puts("9cups_get_dests: Out of memory!"); break; } } /* * Add options until we hit the end of the line... */ dest->num_options = cupsParseOptions(lineptr, dest->num_options, &(dest->options)); /* * If we found what we were looking for, stop now... */ if (match_name) break; /* * Set this as default if needed... */ if (!user_default_set && !_cups_strcasecmp(line, "default")) { DEBUG_puts("9cups_get_dests: Setting as default..."); for (i = 0; i < num_dests; i ++) (*dests)[i].is_default = 0; dest->is_default = 1; } } /* * Close the file and return... */ cupsFileClose(fp); return (num_dests); } /* * 'cups_make_string()' - Make a comma-separated string of values from an IPP * attribute. */ static char * /* O - New string */ cups_make_string( ipp_attribute_t *attr, /* I - Attribute to convert */ char *buffer, /* I - Buffer */ size_t bufsize) /* I - Size of buffer */ { int i; /* Looping var */ char *ptr, /* Pointer into buffer */ *end, /* Pointer to end of buffer */ *valptr; /* Pointer into string attribute */ /* * Return quickly if we have a single string value... */ if (attr->num_values == 1 && attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM && attr->value_tag != IPP_TAG_BOOLEAN && attr->value_tag != IPP_TAG_RANGE) return (attr->values[0].string.text); /* * Copy the values to the string, separating with commas and escaping strings * as needed... */ end = buffer + bufsize - 1; for (i = 0, ptr = buffer; i < attr->num_values && ptr < end; i ++) { if (i) *ptr++ = ','; switch (attr->value_tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : snprintf(ptr, (size_t)(end - ptr + 1), "%d", attr->values[i].integer); break; case IPP_TAG_BOOLEAN : if (attr->values[i].boolean) strlcpy(ptr, "true", (size_t)(end - ptr + 1)); else strlcpy(ptr, "false", (size_t)(end - ptr + 1)); break; case IPP_TAG_RANGE : if (attr->values[i].range.lower == attr->values[i].range.upper) snprintf(ptr, (size_t)(end - ptr + 1), "%d", attr->values[i].range.lower); else snprintf(ptr, (size_t)(end - ptr + 1), "%d-%d", attr->values[i].range.lower, attr->values[i].range.upper); break; default : for (valptr = attr->values[i].string.text; *valptr && ptr < end;) { if (strchr(" \t\n\\\'\"", *valptr)) { if (ptr >= (end - 1)) break; *ptr++ = '\\'; } *ptr++ = *valptr++; } *ptr = '\0'; break; } ptr += strlen(ptr); } *ptr = '\0'; return (buffer); } /* * 'cups_name_cb()' - Find an enumerated destination. */ static int /* O - 1 to continue, 0 to stop */ cups_name_cb(_cups_namedata_t *data, /* I - Data from cupsGetNamedDest */ unsigned flags, /* I - Enumeration flags */ cups_dest_t *dest) /* I - Destination */ { DEBUG_printf(("2cups_name_cb(data=%p(%s), flags=%x, dest=%p(%s)", (void *)data, data->name, flags, (void *)dest, dest->name)); if (!(flags & CUPS_DEST_FLAGS_REMOVED) && !dest->instance && !strcasecmp(data->name, dest->name)) { /* * Copy destination and stop enumeration... */ cupsCopyDest(dest, 0, &data->dest); return (0); } return (1); } /* * 'cups_queue_name()' - Create a local queue name based on the service name. */ static void cups_queue_name( char *name, /* I - Name buffer */ const char *serviceName, /* I - Service name */ size_t namesize) /* I - Size of name buffer */ { const char *ptr; /* Pointer into serviceName */ char *nameptr; /* Pointer into name */ for (nameptr = name, ptr = serviceName; *ptr && nameptr < (name + namesize - 1); ptr ++) { /* * Sanitize the printer name... */ if (_cups_isalnum(*ptr)) *nameptr++ = *ptr; else if (nameptr == name || nameptr[-1] != '_') *nameptr++ = '_'; } *nameptr = '\0'; } cups-2.3.1/cups/ppd.c000664 000765 000024 00000237427 13574721672 014517 0ustar00mikestaff000000 000000 /* * PPD file routines for CUPS. * * 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers. */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * Definitions... */ #define PPD_KEYWORD 1 /* Line contained a keyword */ #define PPD_OPTION 2 /* Line contained an option name */ #define PPD_TEXT 4 /* Line contained human-readable text */ #define PPD_STRING 8 /* Line contained a string or code */ #define PPD_HASHSIZE 512 /* Size of hash */ /* * Line buffer structure... */ typedef struct _ppd_line_s { char *buffer; /* Pointer to buffer */ size_t bufsize; /* Size of the buffer */ } _ppd_line_t; /* * Local globals... */ static _cups_threadkey_t ppd_globals_key = _CUPS_THREADKEY_INITIALIZER; /* Thread local storage key */ #ifdef HAVE_PTHREAD_H static pthread_once_t ppd_globals_key_once = PTHREAD_ONCE_INIT; /* One-time initialization object */ #endif /* HAVE_PTHREAD_H */ /* * Local functions... */ static ppd_attr_t *ppd_add_attr(ppd_file_t *ppd, const char *name, const char *spec, const char *text, const char *value); static ppd_choice_t *ppd_add_choice(ppd_option_t *option, const char *name); static ppd_size_t *ppd_add_size(ppd_file_t *ppd, const char *name); static int ppd_compare_attrs(ppd_attr_t *a, ppd_attr_t *b); static int ppd_compare_choices(ppd_choice_t *a, ppd_choice_t *b); static int ppd_compare_coptions(ppd_coption_t *a, ppd_coption_t *b); static int ppd_compare_options(ppd_option_t *a, ppd_option_t *b); static int ppd_decode(char *string); static void ppd_free_filters(ppd_file_t *ppd); static void ppd_free_group(ppd_group_t *group); static void ppd_free_option(ppd_option_t *option); static ppd_coption_t *ppd_get_coption(ppd_file_t *ppd, const char *name); static ppd_cparam_t *ppd_get_cparam(ppd_coption_t *opt, const char *param, const char *text); static ppd_group_t *ppd_get_group(ppd_file_t *ppd, const char *name, const char *text, _ppd_globals_t *pg, cups_encoding_t encoding); static ppd_option_t *ppd_get_option(ppd_group_t *group, const char *name); static _ppd_globals_t *ppd_globals_alloc(void); #if defined(HAVE_PTHREAD_H) || defined(_WIN32) static void ppd_globals_free(_ppd_globals_t *g); #endif /* HAVE_PTHREAD_H || _WIN32 */ #ifdef HAVE_PTHREAD_H static void ppd_globals_init(void); #endif /* HAVE_PTHREAD_H */ static int ppd_hash_option(ppd_option_t *option); static int ppd_read(cups_file_t *fp, _ppd_line_t *line, char *keyword, char *option, char *text, char **string, int ignoreblank, _ppd_globals_t *pg); static int ppd_update_filters(ppd_file_t *ppd, _ppd_globals_t *pg); /* * 'ppdClose()' - Free all memory used by the PPD file. */ void ppdClose(ppd_file_t *ppd) /* I - PPD file record */ { int i; /* Looping var */ ppd_group_t *group; /* Current group */ char **font; /* Current font */ ppd_attr_t **attr; /* Current attribute */ ppd_coption_t *coption; /* Current custom option */ ppd_cparam_t *cparam; /* Current custom parameter */ /* * Range check arguments... */ if (!ppd) return; /* * Free all strings at the top level... */ free(ppd->lang_encoding); free(ppd->nickname); free(ppd->patches); free(ppd->jcl_begin); free(ppd->jcl_end); free(ppd->jcl_ps); /* * Free any UI groups, subgroups, and options... */ if (ppd->num_groups > 0) { for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) ppd_free_group(group); free(ppd->groups); } cupsArrayDelete(ppd->options); cupsArrayDelete(ppd->marked); /* * Free any page sizes... */ if (ppd->num_sizes > 0) free(ppd->sizes); /* * Free any constraints... */ if (ppd->num_consts > 0) free(ppd->consts); /* * Free any filters... */ ppd_free_filters(ppd); /* * Free any fonts... */ if (ppd->num_fonts > 0) { for (i = ppd->num_fonts, font = ppd->fonts; i > 0; i --, font ++) free(*font); free(ppd->fonts); } /* * Free any profiles... */ if (ppd->num_profiles > 0) free(ppd->profiles); /* * Free any attributes... */ if (ppd->num_attrs > 0) { for (i = ppd->num_attrs, attr = ppd->attrs; i > 0; i --, attr ++) { free((*attr)->value); free(*attr); } free(ppd->attrs); } cupsArrayDelete(ppd->sorted_attrs); /* * Free custom options... */ for (coption = (ppd_coption_t *)cupsArrayFirst(ppd->coptions); coption; coption = (ppd_coption_t *)cupsArrayNext(ppd->coptions)) { for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) { switch (cparam->type) { case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : free(cparam->current.custom_string); break; default : break; } free(cparam); } cupsArrayDelete(coption->params); free(coption); } cupsArrayDelete(ppd->coptions); /* * Free constraints... */ if (ppd->cups_uiconstraints) { _ppd_cups_uiconsts_t *consts; /* Current constraints */ for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(ppd->cups_uiconstraints); consts; consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(ppd->cups_uiconstraints)) { free(consts->constraints); free(consts); } cupsArrayDelete(ppd->cups_uiconstraints); } /* * Free any PPD cache/mapping data... */ if (ppd->cache) _ppdCacheDestroy(ppd->cache); /* * Free the whole record... */ free(ppd); } /* * 'ppdErrorString()' - Returns the text associated with a status. * * @since CUPS 1.1.19/macOS 10.3@ */ const char * /* O - Status string */ ppdErrorString(ppd_status_t status) /* I - PPD status */ { static const char * const messages[] =/* Status messages */ { _("OK"), _("Unable to open PPD file"), _("NULL PPD file pointer"), _("Memory allocation error"), _("Missing PPD-Adobe-4.x header"), _("Missing value string"), _("Internal error"), _("Bad OpenGroup"), _("OpenGroup without a CloseGroup first"), _("Bad OpenUI/JCLOpenUI"), _("OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"), _("Bad OrderDependency"), _("Bad UIConstraints"), _("Missing asterisk in column 1"), _("Line longer than the maximum allowed (255 characters)"), _("Illegal control character"), _("Illegal main keyword string"), _("Illegal option keyword string"), _("Illegal translation string"), _("Illegal whitespace character"), _("Bad custom parameter"), _("Missing option keyword"), _("Bad value string"), _("Missing CloseGroup"), _("Bad CloseUI/JCLCloseUI"), _("Missing CloseUI/JCLCloseUI") }; if (status < PPD_OK || status >= PPD_MAX_STATUS) return (_cupsLangString(cupsLangDefault(), _("Unknown"))); else return (_cupsLangString(cupsLangDefault(), messages[status])); } /* * '_ppdGetEncoding()' - Get the CUPS encoding value for the given * LanguageEncoding. */ cups_encoding_t /* O - CUPS encoding value */ _ppdGetEncoding(const char *name) /* I - LanguageEncoding string */ { if (!_cups_strcasecmp(name, "ISOLatin1")) return (CUPS_ISO8859_1); else if (!_cups_strcasecmp(name, "ISOLatin2")) return (CUPS_ISO8859_2); else if (!_cups_strcasecmp(name, "ISOLatin5")) return (CUPS_ISO8859_5); else if (!_cups_strcasecmp(name, "JIS83-RKSJ")) return (CUPS_JIS_X0213); else if (!_cups_strcasecmp(name, "MacStandard")) return (CUPS_MAC_ROMAN); else if (!_cups_strcasecmp(name, "WindowsANSI")) return (CUPS_WINDOWS_1252); else return (CUPS_UTF8); } /* * '_ppdGlobals()' - Return a pointer to thread local storage */ _ppd_globals_t * /* O - Pointer to global data */ _ppdGlobals(void) { _ppd_globals_t *pg; /* Pointer to global data */ #ifdef HAVE_PTHREAD_H /* * Initialize the global data exactly once... */ pthread_once(&ppd_globals_key_once, ppd_globals_init); #endif /* HAVE_PTHREAD_H */ /* * See if we have allocated the data yet... */ if ((pg = (_ppd_globals_t *)_cupsThreadGetData(ppd_globals_key)) == NULL) { /* * No, allocate memory as set the pointer for the key... */ if ((pg = ppd_globals_alloc()) != NULL) _cupsThreadSetData(ppd_globals_key, pg); } /* * Return the pointer to the data... */ return (pg); } /* * 'ppdLastError()' - Return the status from the last ppdOpen*(). * * @since CUPS 1.1.19/macOS 10.3@ */ ppd_status_t /* O - Status code */ ppdLastError(int *line) /* O - Line number */ { _ppd_globals_t *pg = _ppdGlobals(); /* Global data */ if (line) *line = pg->ppd_line; return (pg->ppd_status); } /* * '_ppdOpen()' - Read a PPD file into memory. * * @since CUPS 1.2/macOS 10.5@ */ ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ _ppdOpen( cups_file_t *fp, /* I - File to read from */ _ppd_localization_t localization) /* I - Localization to load */ { int i, j, k; /* Looping vars */ _ppd_line_t line; /* Line buffer */ ppd_file_t *ppd; /* PPD file record */ ppd_group_t *group, /* Current group */ *subgroup; /* Current sub-group */ ppd_option_t *option; /* Current option */ ppd_choice_t *choice; /* Current choice */ ppd_const_t *constraint; /* Current constraint */ ppd_size_t *size; /* Current page size */ int mask; /* Line data mask */ char keyword[PPD_MAX_NAME], /* Keyword from file */ name[PPD_MAX_NAME], /* Option from file */ text[PPD_MAX_LINE], /* Human-readable text from file */ *string, /* Code/text from file */ *sptr, /* Pointer into string */ *temp, /* Temporary string pointer */ **tempfonts; /* Temporary fonts pointer */ float order; /* Order dependency number */ ppd_section_t section; /* Order dependency section */ ppd_profile_t *profile; /* Pointer to color profile */ char **filter; /* Pointer to filter */ struct lconv *loc; /* Locale data */ int ui_keyword; /* Is this line a UI keyword? */ cups_lang_t *lang; /* Language data */ cups_encoding_t encoding; /* Encoding of PPD file */ _ppd_globals_t *pg = _ppdGlobals(); /* Global data */ char custom_name[PPD_MAX_NAME]; /* CustomFoo attribute name */ ppd_attr_t *custom_attr; /* CustomFoo attribute */ char ll[7], /* Base language + '.' */ ll_CC[7]; /* Language w/country + '.' */ size_t ll_len = 0, /* Base language length */ ll_CC_len = 0; /* Language w/country length */ static const char * const ui_keywords[] = { #ifdef CUPS_USE_FULL_UI_KEYWORDS_LIST /* * Adobe defines some 41 keywords as "UI", meaning that they are * user interface elements and that they should be treated as such * even if the PPD creator doesn't use Open/CloseUI around them. * * Since this can cause previously invisible options to appear and * confuse users, the default is to only treat the PageSize and * PageRegion keywords this way. */ /* Boolean keywords */ "BlackSubstitution", "Booklet", "Collate", "ManualFeed", "MirrorPrint", "NegativePrint", "Sorter", "TraySwitch", /* PickOne keywords */ "AdvanceMedia", "BindColor", "BindEdge", "BindType", "BindWhen", "BitsPerPixel", "ColorModel", "CutMedia", "Duplex", "FoldType", "FoldWhen", "InputSlot", "JCLFrameBufferSize", "JCLResolution", "Jog", "MediaColor", "MediaType", "MediaWeight", "OutputBin", "OutputMode", "OutputOrder", "PageRegion", "PageSize", "Resolution", "Separations", "Signature", "Slipsheet", "Smoothing", "StapleLocation", "StapleOrientation", "StapleWhen", "StapleX", "StapleY" #else /* !CUPS_USE_FULL_UI_KEYWORDS_LIST */ "PageRegion", "PageSize" #endif /* CUPS_USE_FULL_UI_KEYWORDS_LIST */ }; static const char * const color_keywords[] = /* Keywords associated with color profiles */ { ".cupsICCProfile", ".ColorModel", }; DEBUG_printf(("_ppdOpen(fp=%p)", fp)); /* * Default to "OK" status... */ pg->ppd_status = PPD_OK; pg->ppd_line = 0; /* * Range check input... */ if (fp == NULL) { pg->ppd_status = PPD_NULL_FILE; return (NULL); } /* * If only loading a single localization set up the strings to match... */ if (localization == _PPD_LOCALIZATION_DEFAULT) { if ((lang = cupsLangDefault()) == NULL) return (NULL); snprintf(ll_CC, sizeof(ll_CC), "%s.", lang->language); /* * * * * Need to use a different base language for some locales... */ if (!strcmp(lang->language, "zh_HK")) { /* Traditional Chinese + variants */ strlcpy(ll_CC, "zh_TW.", sizeof(ll_CC)); strlcpy(ll, "zh_", sizeof(ll)); } else if (!strncmp(lang->language, "zh", 2)) strlcpy(ll, "zh_", sizeof(ll)); /* Any Chinese variant */ else if (!strncmp(lang->language, "jp", 2)) { /* Any Japanese variant */ strlcpy(ll_CC, "ja", sizeof(ll_CC)); strlcpy(ll, "jp", sizeof(ll)); } else if (!strncmp(lang->language, "nb", 2) || !strncmp(lang->language, "no", 2)) { /* Any Norwegian variant */ strlcpy(ll_CC, "nb", sizeof(ll_CC)); strlcpy(ll, "no", sizeof(ll)); } else snprintf(ll, sizeof(ll), "%2.2s.", lang->language); ll_CC_len = strlen(ll_CC); ll_len = strlen(ll); DEBUG_printf(("2_ppdOpen: Loading localizations matching \"%s\" and \"%s\"", ll_CC, ll)); } /* * Grab the first line and make sure it reads '*PPD-Adobe: "major.minor"'... */ line.buffer = NULL; line.bufsize = 0; mask = ppd_read(fp, &line, keyword, name, text, &string, 0, pg); DEBUG_printf(("2_ppdOpen: mask=%x, keyword=\"%s\"...", mask, keyword)); if (mask == 0 || strcmp(keyword, "PPD-Adobe") || string == NULL || string[0] != '4') { /* * Either this is not a PPD file, or it is not a 4.x PPD file. */ if (pg->ppd_status == PPD_OK) pg->ppd_status = PPD_MISSING_PPDADOBE4; free(string); free(line.buffer); return (NULL); } DEBUG_printf(("2_ppdOpen: keyword=%s, string=%p", keyword, string)); /* * Allocate memory for the PPD file record... */ if ((ppd = calloc(1, sizeof(ppd_file_t))) == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; free(string); free(line.buffer); return (NULL); } free(string); string = NULL; ppd->language_level = 2; ppd->color_device = 0; ppd->colorspace = PPD_CS_N; ppd->landscape = -90; ppd->coptions = cupsArrayNew((cups_array_func_t)ppd_compare_coptions, NULL); /* * Read lines from the PPD file and add them to the file record... */ group = NULL; subgroup = NULL; option = NULL; choice = NULL; ui_keyword = 0; encoding = CUPS_ISO8859_1; loc = localeconv(); while ((mask = ppd_read(fp, &line, keyword, name, text, &string, 1, pg)) != 0) { DEBUG_printf(("2_ppdOpen: mask=%x, keyword=\"%s\", name=\"%s\", " "text=\"%s\", string=%d chars...", mask, keyword, name, text, string ? (int)strlen(string) : 0)); if (strncmp(keyword, "Default", 7) && !string && pg->ppd_conform != PPD_CONFORM_RELAXED) { /* * Need a string value! */ pg->ppd_status = PPD_MISSING_VALUE; goto error; } else if (!string) continue; /* * Certain main keywords (as defined by the PPD spec) may be used * without the usual OpenUI/CloseUI stuff. Presumably this is just * so that Adobe wouldn't completely break compatibility with PPD * files prior to v4.0 of the spec, but it is hopelessly * inconsistent... Catch these main keywords and automatically * create the corresponding option, as needed... */ if (ui_keyword) { /* * Previous line was a UI keyword... */ option = NULL; ui_keyword = 0; } /* * If we are filtering out keyword localizations, see if this line needs to * be used... */ if (localization != _PPD_LOCALIZATION_ALL && (temp = strchr(keyword, '.')) != NULL && ((temp - keyword) == 2 || (temp - keyword) == 5) && _cups_isalpha(keyword[0]) && _cups_isalpha(keyword[1]) && (keyword[2] == '.' || (keyword[2] == '_' && _cups_isalpha(keyword[3]) && _cups_isalpha(keyword[4]) && keyword[5] == '.'))) { if (localization == _PPD_LOCALIZATION_NONE || (localization == _PPD_LOCALIZATION_DEFAULT && strncmp(ll_CC, keyword, ll_CC_len) && 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) { /* * Only load localizations for the color profile related keywords... */ for (i = 0; i < (int)(sizeof(color_keywords) / sizeof(color_keywords[0])); i ++) { if (!_cups_strcasecmp(temp, color_keywords[i])) break; } if (i >= (int)(sizeof(color_keywords) / sizeof(color_keywords[0]))) { DEBUG_printf(("2_ppdOpen: Ignoring localization: \"%s\"\n", keyword)); free(string); string = NULL; continue; } } } if (option == NULL && (mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) == (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) { for (i = 0; i < (int)(sizeof(ui_keywords) / sizeof(ui_keywords[0])); i ++) if (!strcmp(keyword, ui_keywords[i])) break; if (i < (int)(sizeof(ui_keywords) / sizeof(ui_keywords[0]))) { /* * Create the option in the appropriate group... */ ui_keyword = 1; DEBUG_printf(("2_ppdOpen: FOUND ADOBE UI KEYWORD %s WITHOUT OPENUI!", keyword)); if (!group) { if ((group = ppd_get_group(ppd, "General", _("General"), pg, encoding)) == NULL) goto error; DEBUG_printf(("2_ppdOpen: Adding to group %s...", group->text)); option = ppd_get_option(group, keyword); group = NULL; } else option = ppd_get_option(group, keyword); if (option == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } /* * Now fill in the initial information for the option... */ if (!strncmp(keyword, "JCL", 3)) option->section = PPD_ORDER_JCL; else option->section = PPD_ORDER_ANY; option->order = 10.0f; if (i < 8) option->ui = PPD_UI_BOOLEAN; else option->ui = PPD_UI_PICKONE; for (j = 0; j < ppd->num_attrs; j ++) if (!strncmp(ppd->attrs[j]->name, "Default", 7) && !strcmp(ppd->attrs[j]->name + 7, keyword) && ppd->attrs[j]->value) { DEBUG_printf(("2_ppdOpen: Setting Default%s to %s via attribute...", option->keyword, ppd->attrs[j]->value)); strlcpy(option->defchoice, ppd->attrs[j]->value, sizeof(option->defchoice)); break; } if (!strcmp(keyword, "PageSize")) strlcpy(option->text, _("Media Size"), sizeof(option->text)); else if (!strcmp(keyword, "MediaType")) strlcpy(option->text, _("Media Type"), sizeof(option->text)); else if (!strcmp(keyword, "InputSlot")) strlcpy(option->text, _("Media Source"), sizeof(option->text)); else if (!strcmp(keyword, "ColorModel")) strlcpy(option->text, _("Output Mode"), sizeof(option->text)); else if (!strcmp(keyword, "Resolution")) strlcpy(option->text, _("Resolution"), sizeof(option->text)); else strlcpy(option->text, keyword, sizeof(option->text)); } } if (!strcmp(keyword, "LanguageLevel")) ppd->language_level = atoi(string); else if (!strcmp(keyword, "LanguageEncoding")) { /* * Say all PPD files are UTF-8, since we convert to UTF-8... */ ppd->lang_encoding = strdup("UTF-8"); encoding = _ppdGetEncoding(string); } else if (!strcmp(keyword, "LanguageVersion")) ppd->lang_version = string; else if (!strcmp(keyword, "Manufacturer")) ppd->manufacturer = string; else if (!strcmp(keyword, "ModelName")) ppd->modelname = string; else if (!strcmp(keyword, "Protocols")) ppd->protocols = string; else if (!strcmp(keyword, "PCFileName")) ppd->pcfilename = string; else if (!strcmp(keyword, "NickName")) { if (encoding != CUPS_UTF8) { cups_utf8_t utf8[256]; /* UTF-8 version of NickName */ cupsCharsetToUTF8(utf8, string, sizeof(utf8), encoding); ppd->nickname = strdup((char *)utf8); } else ppd->nickname = strdup(string); } else if (!strcmp(keyword, "Product")) ppd->product = string; else if (!strcmp(keyword, "ShortNickName")) ppd->shortnickname = string; else if (!strcmp(keyword, "TTRasterizer")) ppd->ttrasterizer = string; else if (!strcmp(keyword, "JCLBegin")) { ppd->jcl_begin = strdup(string); ppd_decode(ppd->jcl_begin); /* Decode quoted string */ } else if (!strcmp(keyword, "JCLEnd")) { ppd->jcl_end = strdup(string); ppd_decode(ppd->jcl_end); /* Decode quoted string */ } else if (!strcmp(keyword, "JCLToPSInterpreter")) { ppd->jcl_ps = strdup(string); ppd_decode(ppd->jcl_ps); /* Decode quoted string */ } else if (!strcmp(keyword, "AccurateScreensSupport")) ppd->accurate_screens = !strcmp(string, "True"); else if (!strcmp(keyword, "ColorDevice")) ppd->color_device = !strcmp(string, "True"); else if (!strcmp(keyword, "ContoneOnly")) ppd->contone_only = !strcmp(string, "True"); else if (!strcmp(keyword, "cupsFlipDuplex")) ppd->flip_duplex = !strcmp(string, "True"); else if (!strcmp(keyword, "cupsManualCopies")) ppd->manual_copies = !strcmp(string, "True"); else if (!strcmp(keyword, "cupsModelNumber")) ppd->model_number = atoi(string); else if (!strcmp(keyword, "cupsColorProfile")) { if (ppd->num_profiles == 0) profile = malloc(sizeof(ppd_profile_t)); else profile = realloc(ppd->profiles, sizeof(ppd_profile_t) * (size_t)(ppd->num_profiles + 1)); if (!profile) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } ppd->profiles = profile; profile += ppd->num_profiles; ppd->num_profiles ++; memset(profile, 0, sizeof(ppd_profile_t)); strlcpy(profile->resolution, name, sizeof(profile->resolution)); strlcpy(profile->media_type, text, sizeof(profile->media_type)); profile->density = (float)_cupsStrScand(string, &sptr, loc); profile->gamma = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[0][0] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[0][1] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[0][2] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[1][0] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[1][1] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[1][2] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[2][0] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[2][1] = (float)_cupsStrScand(sptr, &sptr, loc); profile->matrix[2][2] = (float)_cupsStrScand(sptr, &sptr, loc); } else if (!strcmp(keyword, "cupsFilter")) { if (ppd->num_filters == 0) filter = malloc(sizeof(char *)); else filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1)); if (filter == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } ppd->filters = filter; filter += ppd->num_filters; ppd->num_filters ++; /* * Make a copy of the filter string... */ *filter = strdup(string); } else if (!strcmp(keyword, "Throughput")) ppd->throughput = atoi(string); else if (!strcmp(keyword, "Font")) { /* * Add this font to the list of available fonts... */ if (ppd->num_fonts == 0) tempfonts = (char **)malloc(sizeof(char *)); else tempfonts = (char **)realloc(ppd->fonts, sizeof(char *) * (size_t)(ppd->num_fonts + 1)); if (tempfonts == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } ppd->fonts = tempfonts; ppd->fonts[ppd->num_fonts] = strdup(name); ppd->num_fonts ++; } else if (!strncmp(keyword, "ParamCustom", 11)) { ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ int corder; /* Order number */ char ctype[33], /* Data type */ cminimum[65], /* Minimum value */ cmaximum[65]; /* Maximum value */ /* * Get the custom option and parameter... */ if ((coption = ppd_get_coption(ppd, keyword + 11)) == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } if ((cparam = ppd_get_cparam(coption, name, text)) == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } if (cparam->type != PPD_CUSTOM_UNKNOWN) { pg->ppd_status = PPD_BAD_CUSTOM_PARAM; goto error; } /* * Get the parameter data... */ if (!string || sscanf(string, "%d%32s%64s%64s", &corder, ctype, cminimum, cmaximum) != 4) { pg->ppd_status = PPD_BAD_CUSTOM_PARAM; goto error; } cparam->order = corder; if (!strcmp(ctype, "curve")) { cparam->type = PPD_CUSTOM_CURVE; cparam->minimum.custom_curve = (float)_cupsStrScand(cminimum, NULL, loc); cparam->maximum.custom_curve = (float)_cupsStrScand(cmaximum, NULL, loc); } else if (!strcmp(ctype, "int")) { cparam->type = PPD_CUSTOM_INT; cparam->minimum.custom_int = atoi(cminimum); cparam->maximum.custom_int = atoi(cmaximum); } else if (!strcmp(ctype, "invcurve")) { cparam->type = PPD_CUSTOM_INVCURVE; cparam->minimum.custom_invcurve = (float)_cupsStrScand(cminimum, NULL, loc); cparam->maximum.custom_invcurve = (float)_cupsStrScand(cmaximum, NULL, loc); } else if (!strcmp(ctype, "passcode")) { cparam->type = PPD_CUSTOM_PASSCODE; cparam->minimum.custom_passcode = atoi(cminimum); cparam->maximum.custom_passcode = atoi(cmaximum); } else if (!strcmp(ctype, "password")) { cparam->type = PPD_CUSTOM_PASSWORD; cparam->minimum.custom_password = atoi(cminimum); cparam->maximum.custom_password = atoi(cmaximum); } else if (!strcmp(ctype, "points")) { cparam->type = PPD_CUSTOM_POINTS; cparam->minimum.custom_points = (float)_cupsStrScand(cminimum, NULL, loc); cparam->maximum.custom_points = (float)_cupsStrScand(cmaximum, NULL, loc); } else if (!strcmp(ctype, "real")) { cparam->type = PPD_CUSTOM_REAL; cparam->minimum.custom_real = (float)_cupsStrScand(cminimum, NULL, loc); cparam->maximum.custom_real = (float)_cupsStrScand(cmaximum, NULL, loc); } else if (!strcmp(ctype, "string")) { cparam->type = PPD_CUSTOM_STRING; cparam->minimum.custom_string = atoi(cminimum); cparam->maximum.custom_string = atoi(cmaximum); } else { pg->ppd_status = PPD_BAD_CUSTOM_PARAM; goto error; } /* * Now special-case for CustomPageSize... */ if (!strcmp(coption->keyword, "PageSize")) { if (!strcmp(name, "Width")) { ppd->custom_min[0] = cparam->minimum.custom_points; ppd->custom_max[0] = cparam->maximum.custom_points; } else if (!strcmp(name, "Height")) { ppd->custom_min[1] = cparam->minimum.custom_points; ppd->custom_max[1] = cparam->maximum.custom_points; } } } else if (!strcmp(keyword, "HWMargins")) { for (i = 0, sptr = string; i < 4; i ++) ppd->custom_margins[i] = (float)_cupsStrScand(sptr, &sptr, loc); } else if (!strncmp(keyword, "Custom", 6) && !strcmp(name, "True") && !option) { ppd_option_t *custom_option; /* Custom option */ DEBUG_puts("2_ppdOpen: Processing Custom option..."); /* * Get the option and custom option... */ if (!ppd_get_coption(ppd, keyword + 6)) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } if (option && !_cups_strcasecmp(option->keyword, keyword + 6)) custom_option = option; else custom_option = ppdFindOption(ppd, keyword + 6); if (custom_option) { /* * Add the "custom" option... */ if ((choice = ppdFindChoice(custom_option, "Custom")) == NULL) if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL) { DEBUG_puts("1_ppdOpen: Unable to add Custom choice!"); pg->ppd_status = PPD_ALLOC_ERROR; goto error; } strlcpy(choice->text, text[0] ? text : _("Custom"), sizeof(choice->text)); choice->code = strdup(string); if (custom_option->section == PPD_ORDER_JCL) ppd_decode(choice->code); } /* * Now process custom page sizes specially... */ if (!strcmp(keyword, "CustomPageSize")) { /* * Add a "Custom" page size entry... */ ppd->variable_sizes = 1; ppd_add_size(ppd, "Custom"); if (option && !_cups_strcasecmp(option->keyword, "PageRegion")) custom_option = option; else custom_option = ppdFindOption(ppd, "PageRegion"); if (custom_option) { if ((choice = ppdFindChoice(custom_option, "Custom")) == NULL) if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL) { DEBUG_puts("1_ppdOpen: Unable to add Custom choice!"); pg->ppd_status = PPD_ALLOC_ERROR; goto error; } strlcpy(choice->text, text[0] ? text : _("Custom"), sizeof(choice->text)); } } } else if (!strcmp(keyword, "LandscapeOrientation")) { if (!strcmp(string, "Minus90")) ppd->landscape = -90; else if (!strcmp(string, "Plus90")) ppd->landscape = 90; } else if (!strcmp(keyword, "Emulators") && string && ppd->num_emulations == 0) { /* * Issue #5562: Samsung printer drivers incorrectly use Emulators keyword * to configure themselves * * The Emulators keyword was loaded but never used by anything in CUPS, * and has no valid purpose in CUPS. The old code was removed due to a * memory leak (Issue #5475), so the following (new) code supports a single * name for the Emulators keyword, allowing these drivers to work until we * remove PPD and driver support entirely in a future version of CUPS. */ ppd->num_emulations = 1; ppd->emulations = calloc(1, sizeof(ppd_emul_t)); strlcpy(ppd->emulations[0].name, string, sizeof(ppd->emulations[0].name)); } else if (!strcmp(keyword, "JobPatchFile")) { /* * CUPS STR #3421: Check for "*JobPatchFile: int: string" */ if (isdigit(*string & 255)) { for (sptr = string + 1; isdigit(*sptr & 255); sptr ++); if (*sptr == ':') { /* * Found "*JobPatchFile: int: string"... */ pg->ppd_status = PPD_BAD_VALUE; goto error; } } if (!name[0] && pg->ppd_conform == PPD_CONFORM_STRICT) { /* * Found "*JobPatchFile: string"... */ pg->ppd_status = PPD_MISSING_OPTION_KEYWORD; goto error; } if (ppd->patches == NULL) ppd->patches = strdup(string); else { temp = realloc(ppd->patches, strlen(ppd->patches) + strlen(string) + 1); if (temp == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } ppd->patches = temp; memcpy(ppd->patches + strlen(ppd->patches), string, strlen(string) + 1); } } else if (!strcmp(keyword, "OpenUI")) { /* * Don't allow nesting of options... */ if (option && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_NESTED_OPEN_UI; goto error; } /* * Add an option record to the current sub-group, group, or file... */ DEBUG_printf(("2_ppdOpen: name=\"%s\" (%d)", name, (int)strlen(name))); if (name[0] == '*') _cups_strcpy(name, name + 1); /* Eliminate leading asterisk */ for (i = (int)strlen(name) - 1; i > 0 && _cups_isspace(name[i]); i --) name[i] = '\0'; /* Eliminate trailing spaces */ DEBUG_printf(("2_ppdOpen: OpenUI of %s in group %s...", name, group ? group->text : "(null)")); if (subgroup != NULL) option = ppd_get_option(subgroup, name); else if (group == NULL) { if ((group = ppd_get_group(ppd, "General", _("General"), pg, encoding)) == NULL) goto error; DEBUG_printf(("2_ppdOpen: Adding to group %s...", group->text)); option = ppd_get_option(group, name); group = NULL; } else option = ppd_get_option(group, name); if (option == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } /* * Now fill in the initial information for the option... */ if (string && !strcmp(string, "PickMany")) option->ui = PPD_UI_PICKMANY; else if (string && !strcmp(string, "Boolean")) option->ui = PPD_UI_BOOLEAN; else if (string && !strcmp(string, "PickOne")) option->ui = PPD_UI_PICKONE; else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_OPEN_UI; goto error; } else option->ui = PPD_UI_PICKONE; for (j = 0; j < ppd->num_attrs; j ++) if (!strncmp(ppd->attrs[j]->name, "Default", 7) && !strcmp(ppd->attrs[j]->name + 7, name) && ppd->attrs[j]->value) { DEBUG_printf(("2_ppdOpen: Setting Default%s to %s via attribute...", option->keyword, ppd->attrs[j]->value)); strlcpy(option->defchoice, ppd->attrs[j]->value, sizeof(option->defchoice)); break; } if (text[0]) cupsCharsetToUTF8((cups_utf8_t *)option->text, text, sizeof(option->text), encoding); else { if (!strcmp(name, "PageSize")) strlcpy(option->text, _("Media Size"), sizeof(option->text)); else if (!strcmp(name, "MediaType")) strlcpy(option->text, _("Media Type"), sizeof(option->text)); else if (!strcmp(name, "InputSlot")) strlcpy(option->text, _("Media Source"), sizeof(option->text)); else if (!strcmp(name, "ColorModel")) strlcpy(option->text, _("Output Mode"), sizeof(option->text)); else if (!strcmp(name, "Resolution")) strlcpy(option->text, _("Resolution"), sizeof(option->text)); else strlcpy(option->text, name, sizeof(option->text)); } option->section = PPD_ORDER_ANY; free(string); string = NULL; /* * Add a custom option choice if we have already seen a CustomFoo * attribute... */ if (!_cups_strcasecmp(name, "PageRegion")) strlcpy(custom_name, "CustomPageSize", sizeof(custom_name)); else snprintf(custom_name, sizeof(custom_name), "Custom%s", name); if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL) { if ((choice = ppdFindChoice(option, "Custom")) == NULL) if ((choice = ppd_add_choice(option, "Custom")) == NULL) { DEBUG_puts("1_ppdOpen: Unable to add Custom choice!"); pg->ppd_status = PPD_ALLOC_ERROR; goto error; } strlcpy(choice->text, custom_attr->text[0] ? custom_attr->text : _("Custom"), sizeof(choice->text)); choice->code = strdup(custom_attr->value); } } else if (!strcmp(keyword, "JCLOpenUI")) { /* * Don't allow nesting of options... */ if (option && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_NESTED_OPEN_UI; goto error; } /* * Find the JCL group, and add if needed... */ group = ppd_get_group(ppd, "JCL", _("JCL"), pg, encoding); if (group == NULL) goto error; /* * Add an option record to the current JCLs... */ if (name[0] == '*') _cups_strcpy(name, name + 1); option = ppd_get_option(group, name); if (option == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } /* * Now fill in the initial information for the option... */ if (string && !strcmp(string, "PickMany")) option->ui = PPD_UI_PICKMANY; else if (string && !strcmp(string, "Boolean")) option->ui = PPD_UI_BOOLEAN; else if (string && !strcmp(string, "PickOne")) option->ui = PPD_UI_PICKONE; else { pg->ppd_status = PPD_BAD_OPEN_UI; goto error; } for (j = 0; j < ppd->num_attrs; j ++) if (!strncmp(ppd->attrs[j]->name, "Default", 7) && !strcmp(ppd->attrs[j]->name + 7, name) && ppd->attrs[j]->value) { DEBUG_printf(("2_ppdOpen: Setting Default%s to %s via attribute...", option->keyword, ppd->attrs[j]->value)); strlcpy(option->defchoice, ppd->attrs[j]->value, sizeof(option->defchoice)); break; } if (text[0]) cupsCharsetToUTF8((cups_utf8_t *)option->text, text, sizeof(option->text), encoding); else strlcpy(option->text, name, sizeof(option->text)); option->section = PPD_ORDER_JCL; group = NULL; free(string); string = NULL; /* * Add a custom option choice if we have already seen a CustomFoo * attribute... */ snprintf(custom_name, sizeof(custom_name), "Custom%s", name); if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL) { if ((choice = ppd_add_choice(option, "Custom")) == NULL) { DEBUG_puts("1_ppdOpen: Unable to add Custom choice!"); pg->ppd_status = PPD_ALLOC_ERROR; goto error; } strlcpy(choice->text, custom_attr->text[0] ? custom_attr->text : _("Custom"), sizeof(choice->text)); choice->code = strdup(custom_attr->value); } } else if (!strcmp(keyword, "CloseUI")) { if ((!option || option->section == PPD_ORDER_JCL) && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_CLOSE_UI; goto error; } option = NULL; free(string); string = NULL; } else if (!strcmp(keyword, "JCLCloseUI")) { if ((!option || option->section != PPD_ORDER_JCL) && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_CLOSE_UI; goto error; } option = NULL; free(string); string = NULL; } else if (!strcmp(keyword, "OpenGroup")) { /* * Open a new group... */ if (group != NULL) { pg->ppd_status = PPD_NESTED_OPEN_GROUP; goto error; } if (!string) { pg->ppd_status = PPD_BAD_OPEN_GROUP; goto error; } /* * Separate the group name from the text (name/text)... */ if ((sptr = strchr(string, '/')) != NULL) *sptr++ = '\0'; else sptr = string; /* * Fix up the text... */ ppd_decode(sptr); /* * Find/add the group... */ group = ppd_get_group(ppd, string, sptr, pg, encoding); if (group == NULL) goto error; free(string); string = NULL; } else if (!strcmp(keyword, "CloseGroup")) { group = NULL; free(string); string = NULL; } else if (!strcmp(keyword, "OrderDependency")) { order = (float)_cupsStrScand(string, &sptr, loc); if (!sptr || sscanf(sptr, "%40s%40s", name, keyword) != 2) { pg->ppd_status = PPD_BAD_ORDER_DEPENDENCY; goto error; } if (keyword[0] == '*') _cups_strcpy(keyword, keyword + 1); if (!strcmp(name, "ExitServer")) section = PPD_ORDER_EXIT; else if (!strcmp(name, "Prolog")) section = PPD_ORDER_PROLOG; else if (!strcmp(name, "DocumentSetup")) section = PPD_ORDER_DOCUMENT; else if (!strcmp(name, "PageSetup")) section = PPD_ORDER_PAGE; else if (!strcmp(name, "JCLSetup")) section = PPD_ORDER_JCL; else section = PPD_ORDER_ANY; if (option == NULL) { ppd_group_t *gtemp; /* * Only valid for Non-UI options... */ for (i = ppd->num_groups, gtemp = ppd->groups; i > 0; i --, gtemp ++) if (gtemp->text[0] == '\0') break; if (i > 0) for (i = 0; i < gtemp->num_options; i ++) if (!strcmp(keyword, gtemp->options[i].keyword)) { gtemp->options[i].section = section; gtemp->options[i].order = order; break; } } else { option->section = section; option->order = order; } free(string); string = NULL; } else if (!strncmp(keyword, "Default", 7)) { if (string == NULL) continue; /* * Drop UI text, if any, from value... */ if (strchr(string, '/') != NULL) *strchr(string, '/') = '\0'; /* * Assign the default value as appropriate... */ if (!strcmp(keyword, "DefaultColorSpace")) { /* * Set default colorspace... */ if (!strcmp(string, "CMY")) ppd->colorspace = PPD_CS_CMY; else if (!strcmp(string, "CMYK")) ppd->colorspace = PPD_CS_CMYK; else if (!strcmp(string, "RGB")) ppd->colorspace = PPD_CS_RGB; else if (!strcmp(string, "RGBK")) ppd->colorspace = PPD_CS_RGBK; else if (!strcmp(string, "N")) ppd->colorspace = PPD_CS_N; else ppd->colorspace = PPD_CS_GRAY; } else if (option && !strcmp(keyword + 7, option->keyword)) { /* * Set the default as part of the current option... */ DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string)); strlcpy(option->defchoice, string, sizeof(option->defchoice)); DEBUG_printf(("2_ppdOpen: %s is now %s...", keyword, option->defchoice)); } else { /* * Lookup option and set if it has been defined... */ ppd_option_t *toption; /* Temporary option */ if ((toption = ppdFindOption(ppd, keyword + 7)) != NULL) { DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string)); strlcpy(toption->defchoice, string, sizeof(toption->defchoice)); } } } else if (!strcmp(keyword, "UIConstraints") || !strcmp(keyword, "NonUIConstraints")) { if (!string) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (ppd->num_consts == 0) constraint = calloc(2, sizeof(ppd_const_t)); else constraint = realloc(ppd->consts, (size_t)(ppd->num_consts + 2) * sizeof(ppd_const_t)); if (constraint == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } ppd->consts = constraint; constraint += ppd->num_consts; ppd->num_consts ++; switch (sscanf(string, "%40s%40s%40s%40s", constraint->option1, constraint->choice1, constraint->option2, constraint->choice2)) { case 0 : /* Error */ case 1 : /* Error */ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; case 2 : /* Two options... */ /* * Check for broken constraints like "* Option"... */ if (pg->ppd_conform == PPD_CONFORM_STRICT && (!strcmp(constraint->option1, "*") || !strcmp(constraint->choice1, "*"))) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } /* * The following strcpy's are safe, as optionN and * choiceN are all the same size (size defined by PPD spec...) */ if (constraint->option1[0] == '*') _cups_strcpy(constraint->option1, constraint->option1 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (constraint->choice1[0] == '*') _cups_strcpy(constraint->option2, constraint->choice1 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } constraint->choice1[0] = '\0'; constraint->choice2[0] = '\0'; break; case 3 : /* Two options, one choice... */ /* * Check for broken constraints like "* Option"... */ if (pg->ppd_conform == PPD_CONFORM_STRICT && (!strcmp(constraint->option1, "*") || !strcmp(constraint->choice1, "*") || !strcmp(constraint->option2, "*"))) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } /* * The following _cups_strcpy's are safe, as optionN and * choiceN are all the same size (size defined by PPD spec...) */ if (constraint->option1[0] == '*') _cups_strcpy(constraint->option1, constraint->option1 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (constraint->choice1[0] == '*') { if (pg->ppd_conform == PPD_CONFORM_STRICT && constraint->option2[0] == '*') { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } _cups_strcpy(constraint->choice2, constraint->option2); _cups_strcpy(constraint->option2, constraint->choice1 + 1); constraint->choice1[0] = '\0'; } else { if (constraint->option2[0] == '*') _cups_strcpy(constraint->option2, constraint->option2 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } constraint->choice2[0] = '\0'; } break; case 4 : /* Two options, two choices... */ /* * Check for broken constraints like "* Option"... */ if (pg->ppd_conform == PPD_CONFORM_STRICT && (!strcmp(constraint->option1, "*") || !strcmp(constraint->choice1, "*") || !strcmp(constraint->option2, "*") || !strcmp(constraint->choice2, "*"))) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (constraint->option1[0] == '*') _cups_strcpy(constraint->option1, constraint->option1 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (pg->ppd_conform == PPD_CONFORM_STRICT && constraint->choice1[0] == '*') { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (constraint->option2[0] == '*') _cups_strcpy(constraint->option2, constraint->option2 + 1); else if (pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } if (pg->ppd_conform == PPD_CONFORM_STRICT && constraint->choice2[0] == '*') { pg->ppd_status = PPD_BAD_UI_CONSTRAINTS; goto error; } break; } /* * Don't add this one as an attribute... */ free(string); string = NULL; } 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); if (size == NULL) { /* * Unable to add or find size! */ pg->ppd_status = PPD_ALLOC_ERROR; goto error; } size->width = (float)_cupsStrScand(string, &sptr, loc); size->length = (float)_cupsStrScand(sptr, NULL, loc); free(string); string = NULL; } 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); if (size == NULL) { /* * Unable to add or find size! */ pg->ppd_status = PPD_ALLOC_ERROR; goto error; } size->left = (float)_cupsStrScand(string, &sptr, loc); size->bottom = (float)_cupsStrScand(sptr, &sptr, loc); size->right = (float)_cupsStrScand(sptr, &sptr, loc); size->top = (float)_cupsStrScand(sptr, NULL, loc); free(string); string = NULL; } else if (option != NULL && (mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) == (PPD_KEYWORD | PPD_OPTION | PPD_STRING) && !strcmp(keyword, option->keyword)) { 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")) { /* * Add a page size... */ if (ppdPageSize(ppd, name) == NULL) ppd_add_size(ppd, name); } /* * Add the option choice... */ if ((choice = ppd_add_choice(option, name)) == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; goto error; } if (text[0]) cupsCharsetToUTF8((cups_utf8_t *)choice->text, text, sizeof(choice->text), encoding); else if (!strcmp(name, "True")) strlcpy(choice->text, _("Yes"), sizeof(choice->text)); else if (!strcmp(name, "False")) strlcpy(choice->text, _("No"), sizeof(choice->text)); else strlcpy(choice->text, name, sizeof(choice->text)); if (option->section == PPD_ORDER_JCL) ppd_decode(string); /* Decode quoted string */ choice->code = string; string = NULL; /* Don't add as an attribute below */ } /* * Add remaining lines with keywords and string values as attributes... */ if (string && (mask & (PPD_KEYWORD | PPD_STRING)) == (PPD_KEYWORD | PPD_STRING)) ppd_add_attr(ppd, keyword, name, text, string); else free(string); } /* * Check for a missing CloseUI/JCLCloseUI... */ if (option && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_MISSING_CLOSE_UI; goto error; } /* * Check for a missing CloseGroup... */ if (group && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_MISSING_CLOSE_GROUP; goto error; } free(line.buffer); /* * Reset language preferences... */ #ifdef DEBUG if (!cupsFileEOF(fp)) DEBUG_printf(("1_ppdOpen: Premature EOF at %lu...\n", (unsigned long)cupsFileTell(fp))); #endif /* DEBUG */ if (pg->ppd_status != PPD_OK) { /* * Had an error reading the PPD file, cannot continue! */ ppdClose(ppd); return (NULL); } /* * Update the filters array as needed... */ if (!ppd_update_filters(ppd, pg)) { ppdClose(ppd); return (NULL); } /* * Create the sorted options array and set the option back-pointer for * each choice and custom option... */ ppd->options = cupsArrayNew2((cups_array_func_t)ppd_compare_options, NULL, (cups_ahash_func_t)ppd_hash_option, PPD_HASHSIZE); for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) { for (j = group->num_options, option = group->options; j > 0; j --, option ++) { ppd_coption_t *coption; /* Custom option */ cupsArrayAdd(ppd->options, option); for (k = 0; k < option->num_choices; k ++) option->choices[k].option = option; if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL) coption->option = option; } } /* * Create an array to track the marked choices... */ ppd->marked = cupsArrayNew((cups_array_func_t)ppd_compare_choices, NULL); /* * Return the PPD file structure... */ return (ppd); /* * Common exit point for errors to save code size... */ error: free(string); free(line.buffer); ppdClose(ppd); return (NULL); } /* * 'ppdOpen()' - Read a PPD file into memory. */ ppd_file_t * /* O - PPD file record */ ppdOpen(FILE *fp) /* I - File to read from */ { ppd_file_t *ppd; /* PPD file record */ cups_file_t *cf; /* CUPS file */ /* * Reopen the stdio file as a CUPS file... */ if ((cf = cupsFileOpenFd(fileno(fp), "r")) == NULL) return (NULL); /* * Load the PPD file using the newer API... */ ppd = _ppdOpen(cf, _PPD_LOCALIZATION_DEFAULT); /* * Close the CUPS file and return the PPD... */ cupsFileClose(cf); return (ppd); } /* * 'ppdOpen2()' - Read a PPD file into memory. * * @since CUPS 1.2/macOS 10.5@ */ ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ ppdOpen2(cups_file_t *fp) /* I - File to read from */ { return _ppdOpen(fp, _PPD_LOCALIZATION_DEFAULT); } /* * 'ppdOpenFd()' - Read a PPD file into memory. */ ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ ppdOpenFd(int fd) /* I - File to read from */ { cups_file_t *fp; /* CUPS file pointer */ ppd_file_t *ppd; /* PPD file record */ _ppd_globals_t *pg = _ppdGlobals(); /* Global data */ /* * Set the line number to 0... */ pg->ppd_line = 0; /* * Range check input... */ if (fd < 0) { pg->ppd_status = PPD_NULL_FILE; return (NULL); } /* * Try to open the file and parse it... */ if ((fp = cupsFileOpenFd(fd, "r")) != NULL) { ppd = ppdOpen2(fp); cupsFileClose(fp); } else { pg->ppd_status = PPD_FILE_OPEN_ERROR; ppd = NULL; } return (ppd); } /* * '_ppdOpenFile()' - Read a PPD file into memory. */ ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ _ppdOpenFile(const char *filename, /* I - File to read from */ _ppd_localization_t localization) /* I - Localization to load */ { cups_file_t *fp; /* File pointer */ ppd_file_t *ppd; /* PPD file record */ _ppd_globals_t *pg = _ppdGlobals(); /* Global data */ /* * Set the line number to 0... */ pg->ppd_line = 0; /* * Range check input... */ if (filename == NULL) { pg->ppd_status = PPD_NULL_FILE; return (NULL); } /* * Try to open the file and parse it... */ if ((fp = cupsFileOpen(filename, "r")) != NULL) { ppd = _ppdOpen(fp, localization); cupsFileClose(fp); } else { pg->ppd_status = PPD_FILE_OPEN_ERROR; ppd = NULL; } return (ppd); } /* * 'ppdOpenFile()' - Read a PPD file into memory. */ ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ ppdOpenFile(const char *filename) /* I - File to read from */ { return _ppdOpenFile(filename, _PPD_LOCALIZATION_DEFAULT); } /* * 'ppdSetConformance()' - Set the conformance level for PPD files. * * @since CUPS 1.1.20/macOS 10.4@ */ void ppdSetConformance(ppd_conform_t c) /* I - Conformance level */ { _ppd_globals_t *pg = _ppdGlobals(); /* Global data */ pg->ppd_conform = c; } /* * 'ppd_add_attr()' - Add an attribute to the PPD data. */ static ppd_attr_t * /* O - New attribute */ ppd_add_attr(ppd_file_t *ppd, /* I - PPD file data */ const char *name, /* I - Attribute name */ const char *spec, /* I - Specifier string, if any */ const char *text, /* I - Text string, if any */ const char *value) /* I - Value of attribute */ { ppd_attr_t **ptr, /* New array */ *temp; /* New attribute */ /* * Range check input... */ if (ppd == NULL || name == NULL || spec == NULL) return (NULL); /* * Create the array as needed... */ if (!ppd->sorted_attrs) ppd->sorted_attrs = cupsArrayNew((cups_array_func_t)ppd_compare_attrs, NULL); /* * Allocate memory for the new attribute... */ if (ppd->num_attrs == 0) ptr = malloc(sizeof(ppd_attr_t *)); else ptr = realloc(ppd->attrs, (size_t)(ppd->num_attrs + 1) * sizeof(ppd_attr_t *)); if (ptr == NULL) return (NULL); ppd->attrs = ptr; ptr += ppd->num_attrs; if ((temp = calloc(1, sizeof(ppd_attr_t))) == NULL) return (NULL); *ptr = temp; ppd->num_attrs ++; /* * Copy data over... */ strlcpy(temp->name, name, sizeof(temp->name)); strlcpy(temp->spec, spec, sizeof(temp->spec)); strlcpy(temp->text, text, sizeof(temp->text)); temp->value = (char *)value; /* * Add the attribute to the sorted array... */ cupsArrayAdd(ppd->sorted_attrs, temp); /* * Return the attribute... */ return (temp); } /* * 'ppd_add_choice()' - Add a choice to an option. */ static ppd_choice_t * /* O - Named choice */ ppd_add_choice(ppd_option_t *option, /* I - Option */ const char *name) /* I - Name of choice */ { ppd_choice_t *choice; /* Choice */ if (option->num_choices == 0) choice = malloc(sizeof(ppd_choice_t)); else choice = realloc(option->choices, sizeof(ppd_choice_t) * (size_t)(option->num_choices + 1)); if (choice == NULL) return (NULL); option->choices = choice; choice += option->num_choices; option->num_choices ++; memset(choice, 0, sizeof(ppd_choice_t)); strlcpy(choice->choice, name, sizeof(choice->choice)); return (choice); } /* * 'ppd_add_size()' - Add a page size. */ static ppd_size_t * /* O - Named size */ ppd_add_size(ppd_file_t *ppd, /* I - PPD file */ const char *name) /* I - Name of size */ { ppd_size_t *size; /* Size */ if (ppd->num_sizes == 0) size = malloc(sizeof(ppd_size_t)); else size = realloc(ppd->sizes, sizeof(ppd_size_t) * (size_t)(ppd->num_sizes + 1)); if (size == NULL) return (NULL); ppd->sizes = size; size += ppd->num_sizes; ppd->num_sizes ++; memset(size, 0, sizeof(ppd_size_t)); strlcpy(size->name, name, sizeof(size->name)); return (size); } /* * 'ppd_compare_attrs()' - Compare two attributes. */ static int /* O - Result of comparison */ ppd_compare_attrs(ppd_attr_t *a, /* I - First attribute */ ppd_attr_t *b) /* I - Second attribute */ { return (_cups_strcasecmp(a->name, b->name)); } /* * 'ppd_compare_choices()' - Compare two choices... */ static int /* O - Result of comparison */ ppd_compare_choices(ppd_choice_t *a, /* I - First choice */ ppd_choice_t *b) /* I - Second choice */ { return (strcmp(a->option->keyword, b->option->keyword)); } /* * 'ppd_compare_coptions()' - Compare two custom options. */ static int /* O - Result of comparison */ ppd_compare_coptions(ppd_coption_t *a, /* I - First option */ ppd_coption_t *b) /* I - Second option */ { return (_cups_strcasecmp(a->keyword, b->keyword)); } /* * 'ppd_compare_options()' - Compare two options. */ static int /* O - Result of comparison */ ppd_compare_options(ppd_option_t *a, /* I - First option */ ppd_option_t *b) /* I - Second option */ { return (_cups_strcasecmp(a->keyword, b->keyword)); } /* * 'ppd_decode()' - Decode a string value... */ static int /* O - Length of decoded string */ ppd_decode(char *string) /* I - String to decode */ { char *inptr, /* Input pointer */ *outptr; /* Output pointer */ inptr = string; outptr = string; while (*inptr != '\0') if (*inptr == '<' && isxdigit(inptr[1] & 255)) { /* * Convert hex to 8-bit values... */ inptr ++; while (isxdigit(*inptr & 255)) { if (_cups_isalpha(*inptr)) *outptr = (char)((tolower(*inptr) - 'a' + 10) << 4); else *outptr = (char)((*inptr - '0') << 4); inptr ++; if (!isxdigit(*inptr & 255)) break; if (_cups_isalpha(*inptr)) *outptr |= (char)(tolower(*inptr) - 'a' + 10); else *outptr |= (char)(*inptr - '0'); inptr ++; outptr ++; } while (*inptr != '>' && *inptr != '\0') inptr ++; while (*inptr == '>') inptr ++; } else *outptr++ = *inptr++; *outptr = '\0'; return ((int)(outptr - string)); } /* * 'ppd_free_filters()' - Free the filters array. */ static void ppd_free_filters(ppd_file_t *ppd) /* I - PPD file */ { int i; /* Looping var */ char **filter; /* Current filter */ if (ppd->num_filters > 0) { for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++) free(*filter); free(ppd->filters); ppd->num_filters = 0; ppd->filters = NULL; } } /* * 'ppd_free_group()' - Free a single UI group. */ static void ppd_free_group(ppd_group_t *group) /* I - Group to free */ { int i; /* Looping var */ ppd_option_t *option; /* Current option */ ppd_group_t *subgroup; /* Current sub-group */ if (group->num_options > 0) { for (i = group->num_options, option = group->options; i > 0; i --, option ++) ppd_free_option(option); free(group->options); } if (group->num_subgroups > 0) { for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; i --, subgroup ++) ppd_free_group(subgroup); free(group->subgroups); } } /* * 'ppd_free_option()' - Free a single option. */ static void ppd_free_option(ppd_option_t *option) /* I - Option to free */ { int i; /* Looping var */ ppd_choice_t *choice; /* Current choice */ if (option->num_choices > 0) { for (i = option->num_choices, choice = option->choices; i > 0; i --, choice ++) { free(choice->code); } free(option->choices); } } /* * 'ppd_get_coption()' - Get a custom option record. */ static ppd_coption_t * /* O - Custom option... */ ppd_get_coption(ppd_file_t *ppd, /* I - PPD file */ const char *name) /* I - Name of option */ { ppd_coption_t *copt; /* New custom option */ /* * See if the option already exists... */ if ((copt = ppdFindCustomOption(ppd, name)) != NULL) return (copt); /* * Not found, so create the custom option record... */ if ((copt = calloc(1, sizeof(ppd_coption_t))) == NULL) return (NULL); strlcpy(copt->keyword, name, sizeof(copt->keyword)); copt->params = cupsArrayNew((cups_array_func_t)NULL, NULL); cupsArrayAdd(ppd->coptions, copt); /* * Return the new record... */ return (copt); } /* * 'ppd_get_cparam()' - Get a custom parameter record. */ static ppd_cparam_t * /* O - Extended option... */ ppd_get_cparam(ppd_coption_t *opt, /* I - PPD file */ const char *param, /* I - Name of parameter */ const char *text) /* I - Human-readable text */ { ppd_cparam_t *cparam; /* New custom parameter */ /* * See if the parameter already exists... */ if ((cparam = ppdFindCustomParam(opt, param)) != NULL) return (cparam); /* * Not found, so create the custom parameter record... */ 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)); /* * Add this record to the array... */ cupsArrayAdd(opt->params, cparam); /* * Return the new record... */ return (cparam); } /* * 'ppd_get_group()' - Find or create the named group as needed. */ static ppd_group_t * /* O - Named group */ ppd_get_group(ppd_file_t *ppd, /* I - PPD file */ const char *name, /* I - Name of group */ const char *text, /* I - Text for group */ _ppd_globals_t *pg, /* I - Global data */ cups_encoding_t encoding) /* I - Encoding of text */ { int i; /* Looping var */ ppd_group_t *group; /* Group */ DEBUG_printf(("7ppd_get_group(ppd=%p, name=\"%s\", text=\"%s\", cg=%p)", ppd, name, text, pg)); for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) if (!strcmp(group->name, name)) break; if (i == 0) { DEBUG_printf(("8ppd_get_group: Adding group %s...", name)); if (pg->ppd_conform == PPD_CONFORM_STRICT && strlen(text) >= sizeof(group->text)) { pg->ppd_status = PPD_ILLEGAL_TRANSLATION; return (NULL); } if (ppd->num_groups == 0) group = malloc(sizeof(ppd_group_t)); else group = realloc(ppd->groups, (size_t)(ppd->num_groups + 1) * sizeof(ppd_group_t)); if (group == NULL) { pg->ppd_status = PPD_ALLOC_ERROR; return (NULL); } ppd->groups = group; group += ppd->num_groups; ppd->num_groups ++; memset(group, 0, sizeof(ppd_group_t)); strlcpy(group->name, name, sizeof(group->name)); cupsCharsetToUTF8((cups_utf8_t *)group->text, text, sizeof(group->text), encoding); } return (group); } /* * 'ppd_get_option()' - Find or create the named option as needed. */ static ppd_option_t * /* O - Named option */ ppd_get_option(ppd_group_t *group, /* I - Group */ const char *name) /* I - Name of option */ { int i; /* Looping var */ ppd_option_t *option; /* Option */ DEBUG_printf(("7ppd_get_option(group=%p(\"%s\"), name=\"%s\")", group, group->name, name)); for (i = group->num_options, option = group->options; i > 0; i --, option ++) if (!strcmp(option->keyword, name)) break; if (i == 0) { if (group->num_options == 0) option = malloc(sizeof(ppd_option_t)); else option = realloc(group->options, (size_t)(group->num_options + 1) * sizeof(ppd_option_t)); if (option == NULL) return (NULL); group->options = option; option += group->num_options; group->num_options ++; memset(option, 0, sizeof(ppd_option_t)); strlcpy(option->keyword, name, sizeof(option->keyword)); } return (option); } /* * 'ppd_globals_alloc()' - Allocate and initialize global data. */ static _ppd_globals_t * /* O - Pointer to global data */ ppd_globals_alloc(void) { return ((_ppd_globals_t *)calloc(1, sizeof(_ppd_globals_t))); } /* * 'ppd_globals_free()' - Free global data. */ #if defined(HAVE_PTHREAD_H) || defined(_WIN32) static void ppd_globals_free(_ppd_globals_t *pg) /* I - Pointer to global data */ { free(pg); } #endif /* HAVE_PTHREAD_H || _WIN32 */ #ifdef HAVE_PTHREAD_H /* * 'ppd_globals_init()' - Initialize per-thread globals... */ static void ppd_globals_init(void) { /* * Register the global data for this thread... */ pthread_key_create(&ppd_globals_key, (void (*)(void *))ppd_globals_free); } #endif /* HAVE_PTHREAD_H */ /* * 'ppd_hash_option()' - Generate a hash of the option name... */ static int /* O - Hash index */ ppd_hash_option(ppd_option_t *option) /* I - Option */ { int hash = 0; /* Hash index */ const char *k; /* Pointer into keyword */ for (hash = option->keyword[0], k = option->keyword + 1; *k;) hash = 33 * hash + *k++; return (hash & 511); } /* * 'ppd_read()' - Read a line from a PPD file, skipping comment lines as * necessary. */ static int /* O - Bitmask of fields read */ ppd_read(cups_file_t *fp, /* I - File to read from */ _ppd_line_t *line, /* I - Line buffer */ char *keyword, /* O - Keyword from line */ char *option, /* O - Option from line */ char *text, /* O - Human-readable text from line */ char **string, /* O - Code/string data */ int ignoreblank, /* I - Ignore blank lines? */ _ppd_globals_t *pg) /* I - Global data */ { int ch, /* Character from file */ col, /* Column in line */ colon, /* Colon seen? */ endquote, /* Waiting for an end quote */ mask, /* Mask to be returned */ startline, /* Start line */ textlen; /* Length of text */ char *keyptr, /* Keyword pointer */ *optptr, /* Option pointer */ *textptr, /* Text pointer */ *strptr, /* Pointer into string */ *lineptr; /* Current position in line buffer */ /* * Now loop until we have a valid line... */ *string = NULL; col = 0; startline = pg->ppd_line + 1; if (!line->buffer) { line->bufsize = 1024; line->buffer = malloc(1024); if (!line->buffer) return (0); } do { /* * Read the line... */ lineptr = line->buffer; endquote = 0; colon = 0; while ((ch = cupsFileGetChar(fp)) != EOF) { if (lineptr >= (line->buffer + line->bufsize - 1)) { /* * Expand the line buffer... */ char *temp; /* Temporary line pointer */ line->bufsize += 1024; if (line->bufsize > 262144) { /* * Don't allow lines longer than 256k! */ pg->ppd_line = startline; pg->ppd_status = PPD_LINE_TOO_LONG; return (0); } temp = realloc(line->buffer, line->bufsize); if (!temp) { pg->ppd_line = startline; pg->ppd_status = PPD_LINE_TOO_LONG; return (0); } lineptr = temp + (lineptr - line->buffer); line->buffer = temp; } if (ch == '\r' || ch == '\n') { /* * Line feed or carriage return... */ pg->ppd_line ++; col = 0; if (ch == '\r') { /* * Check for a trailing line feed... */ if ((ch = cupsFilePeekChar(fp)) == EOF) { ch = '\n'; break; } if (ch == 0x0a) cupsFileGetChar(fp); } if (lineptr == line->buffer && ignoreblank) continue; /* Skip blank lines */ ch = '\n'; if (!endquote) /* Continue for multi-line text */ break; *lineptr++ = '\n'; } else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT) { /* * Other control characters... */ pg->ppd_line = startline; pg->ppd_status = PPD_ILLEGAL_CHARACTER; return (0); } else if (ch != 0x1a) { /* * Any other character... */ *lineptr++ = (char)ch; col ++; if (col > (PPD_MAX_LINE - 1)) { /* * Line is too long... */ pg->ppd_line = startline; pg->ppd_status = PPD_LINE_TOO_LONG; return (0); } if (ch == ':' && strncmp(line->buffer, "*%", 2) != 0) colon = 1; if (ch == '\"' && colon) endquote = !endquote; } } if (endquote) { /* * Didn't finish this quoted string... */ while ((ch = cupsFileGetChar(fp)) != EOF) if (ch == '\"') break; else if (ch == '\r' || ch == '\n') { pg->ppd_line ++; col = 0; if (ch == '\r') { /* * Check for a trailing line feed... */ if ((ch = cupsFilePeekChar(fp)) == EOF) break; if (ch == 0x0a) cupsFileGetChar(fp); } } else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT) { /* * Other control characters... */ pg->ppd_line = startline; pg->ppd_status = PPD_ILLEGAL_CHARACTER; return (0); } else if (ch != 0x1a) { col ++; if (col > (PPD_MAX_LINE - 1)) { /* * Line is too long... */ pg->ppd_line = startline; pg->ppd_status = PPD_LINE_TOO_LONG; return (0); } } } if (ch != '\n') { /* * Didn't finish this line... */ while ((ch = cupsFileGetChar(fp)) != EOF) if (ch == '\r' || ch == '\n') { /* * Line feed or carriage return... */ pg->ppd_line ++; col = 0; if (ch == '\r') { /* * Check for a trailing line feed... */ if ((ch = cupsFilePeekChar(fp)) == EOF) break; if (ch == 0x0a) cupsFileGetChar(fp); } break; } else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT) { /* * Other control characters... */ pg->ppd_line = startline; pg->ppd_status = PPD_ILLEGAL_CHARACTER; return (0); } else if (ch != 0x1a) { col ++; if (col > (PPD_MAX_LINE - 1)) { /* * Line is too long... */ pg->ppd_line = startline; pg->ppd_status = PPD_LINE_TOO_LONG; return (0); } } } if (lineptr > line->buffer && lineptr[-1] == '\n') lineptr --; *lineptr = '\0'; DEBUG_printf(("9ppd_read: LINE=\"%s\"", line->buffer)); /* * The dynamically created PPDs for older style macOS * drivers include a large blob of data inserted as comments * at the end of the file. As an optimization we can stop * reading the PPD when we get to the start of this data. */ if (!strcmp(line->buffer, "*%APLWORKSET START")) return (0); if (ch == EOF && lineptr == line->buffer) return (0); /* * Now parse it... */ mask = 0; lineptr = line->buffer + 1; keyword[0] = '\0'; option[0] = '\0'; text[0] = '\0'; *string = NULL; if ((!line->buffer[0] || /* Blank line */ !strncmp(line->buffer, "*%", 2) || /* Comment line */ !strcmp(line->buffer, "*End")) && /* End of multi-line string */ ignoreblank) /* Ignore these? */ { startline = pg->ppd_line + 1; continue; } if (!strcmp(line->buffer, "*")) /* (Bad) comment line */ { if (pg->ppd_conform == PPD_CONFORM_RELAXED) { startline = pg->ppd_line + 1; continue; } else { pg->ppd_line = startline; pg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD; return (0); } } if (line->buffer[0] != '*') /* All lines start with an asterisk */ { /* * Allow lines consisting of just whitespace... */ for (lineptr = line->buffer; *lineptr; lineptr ++) if (*lineptr && !_cups_isspace(*lineptr)) break; if (*lineptr) { pg->ppd_status = PPD_MISSING_ASTERISK; return (0); } else if (ignoreblank) continue; else return (0); } /* * Get a keyword... */ keyptr = keyword; while (*lineptr && *lineptr != ':' && !_cups_isspace(*lineptr)) { if (*lineptr <= ' ' || *lineptr > 126 || *lineptr == '/' || (keyptr - keyword) >= (PPD_MAX_NAME - 1)) { pg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD; return (0); } *keyptr++ = *lineptr++; } *keyptr = '\0'; if (!strcmp(keyword, "End")) continue; mask |= PPD_KEYWORD; if (_cups_isspace(*lineptr)) { /* * Get an option name... */ while (_cups_isspace(*lineptr)) lineptr ++; optptr = option; while (*lineptr && !_cups_isspace(*lineptr) && *lineptr != ':' && *lineptr != '/') { if (*lineptr <= ' ' || *lineptr > 126 || (optptr - option) >= (PPD_MAX_NAME - 1)) { pg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD; return (0); } *optptr++ = *lineptr++; } *optptr = '\0'; if (_cups_isspace(*lineptr) && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_ILLEGAL_WHITESPACE; return (0); } while (_cups_isspace(*lineptr)) lineptr ++; mask |= PPD_OPTION; if (*lineptr == '/') { /* * Get human-readable text... */ lineptr ++; textptr = text; while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':') { if (((unsigned char)*lineptr < ' ' && *lineptr != '\t') || (textptr - text) >= (PPD_MAX_LINE - 1)) { pg->ppd_status = PPD_ILLEGAL_TRANSLATION; return (0); } *textptr++ = *lineptr++; } *textptr = '\0'; textlen = ppd_decode(text); if (textlen > PPD_MAX_TEXT && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_ILLEGAL_TRANSLATION; return (0); } mask |= PPD_TEXT; } } if (_cups_isspace(*lineptr) && pg->ppd_conform == PPD_CONFORM_STRICT) { pg->ppd_status = PPD_ILLEGAL_WHITESPACE; return (0); } while (_cups_isspace(*lineptr)) lineptr ++; if (*lineptr == ':') { /* * Get string after triming leading and trailing whitespace... */ lineptr ++; while (_cups_isspace(*lineptr)) lineptr ++; strptr = lineptr + strlen(lineptr) - 1; while (strptr >= lineptr && _cups_isspace(*strptr)) *strptr-- = '\0'; if (*strptr == '\"') { /* * Quoted string by itself, remove quotes... */ *strptr = '\0'; lineptr ++; } *string = strdup(lineptr); mask |= PPD_STRING; } } while (mask == 0); return (mask); } /* * 'ppd_update_filters()' - Update the filters array as needed. * * This function re-populates the filters array with cupsFilter2 entries that * have been stripped of the destination MIME media types and any maxsize hints. * * (All for backwards-compatibility) */ static int /* O - 1 on success, 0 on failure */ ppd_update_filters(ppd_file_t *ppd, /* I - PPD file */ _ppd_globals_t *pg) /* I - Global data */ { ppd_attr_t *attr; /* Current cupsFilter2 value */ char srcsuper[16], /* Source MIME media type */ srctype[256], dstsuper[16], /* Destination MIME media type */ dsttype[256], program[1024], /* Command to run */ *ptr, /* Pointer into command to run */ buffer[1024], /* Re-written cupsFilter value */ **filter; /* Current filter */ int cost; /* Cost of filter */ DEBUG_printf(("4ppd_update_filters(ppd=%p, cg=%p)", ppd, pg)); /* * See if we have any cupsFilter2 lines... */ if ((attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) == NULL) { DEBUG_puts("5ppd_update_filters: No cupsFilter2 keywords present."); return (1); } /* * Yes, free the cupsFilter-defined filters and re-build... */ ppd_free_filters(ppd); do { /* * Parse the cupsFilter2 string: * * src/type dst/type cost program * src/type dst/type cost maxsize(n) program */ DEBUG_printf(("5ppd_update_filters: cupsFilter2=\"%s\"", attr->value)); if (sscanf(attr->value, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", srcsuper, srctype, dstsuper, dsttype, &cost, program) != 6) { DEBUG_puts("5ppd_update_filters: Bad cupsFilter2 line."); pg->ppd_status = PPD_BAD_VALUE; return (0); } DEBUG_printf(("5ppd_update_filters: srcsuper=\"%s\", srctype=\"%s\", " "dstsuper=\"%s\", dsttype=\"%s\", cost=%d, program=\"%s\"", srcsuper, srctype, dstsuper, dsttype, cost, program)); if (!strncmp(program, "maxsize(", 8) && (ptr = strchr(program + 8, ')')) != NULL) { DEBUG_puts("5ppd_update_filters: Found maxsize(nnn)."); ptr ++; while (_cups_isspace(*ptr)) ptr ++; _cups_strcpy(program, ptr); DEBUG_printf(("5ppd_update_filters: New program=\"%s\"", program)); } /* * Convert to cupsFilter format: * * src/type cost program */ snprintf(buffer, sizeof(buffer), "%s/%s %d %s", srcsuper, srctype, cost, program); DEBUG_printf(("5ppd_update_filters: Adding \"%s\".", buffer)); /* * Add a cupsFilter-compatible string to the filters array. */ if (ppd->num_filters == 0) filter = malloc(sizeof(char *)); else filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1)); if (filter == NULL) { DEBUG_puts("5ppd_update_filters: Out of memory."); pg->ppd_status = PPD_ALLOC_ERROR; return (0); } ppd->filters = filter; filter += ppd->num_filters; ppd->num_filters ++; *filter = strdup(buffer); } while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); DEBUG_puts("5ppd_update_filters: Completed OK."); return (1); } cups-2.3.1/cups/debug-internal.h000664 000765 000024 00000003710 13574721672 016623 0ustar00mikestaff000000 000000 /* * Internal debugging macros for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_DEBUG_INTERNAL_H_ # define _CUPS_DEBUG_INTERNAL_H_ /* * Include necessary headers... */ # include "debug-private.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * The debug macros are used if you compile with DEBUG defined. * * Usage: * * DEBUG_puts("string") * DEBUG_printf(("format string", arg, arg, ...)); * * Note the extra parenthesis around the DEBUG_printf macro... * * Newlines are not required on the end of messages, as both add one when * writing the output. * * If the first character is a digit, then it represents the "log level" of the * message from 0 to 9. The default level is 1. The following defines the * current levels we use: * * 0 = public APIs, other than value accessor functions * 1 = return values for public APIs * 2 = public value accessor APIs, progress for public APIs * 3 = return values for value accessor APIs * 4 = private APIs, progress for value accessor APIs * 5 = return values for private APIs * 6 = progress for private APIs * 7 = static functions * 8 = return values for static functions * 9 = progress for static functions */ # ifdef DEBUG # define DEBUG_puts(x) _cups_debug_puts(x) # define DEBUG_printf(x) _cups_debug_printf x # else # define DEBUG_puts(x) # define DEBUG_printf(x) # endif /* DEBUG */ /* * Prototypes... */ # ifdef DEBUG extern int _cups_debug_fd _CUPS_INTERNAL; extern int _cups_debug_level _CUPS_INTERNAL; extern void _cups_debug_printf(const char *format, ...) _CUPS_FORMAT(1,2) _CUPS_INTERNAL; extern void _cups_debug_puts(const char *s) _CUPS_INTERNAL; # endif /* DEBUG */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_DEBUG_INTERNAL_H_ */ cups-2.3.1/cups/dest-job.c000664 000765 000024 00000026630 13574721672 015433 0ustar00mikestaff000000 000000 /* * Destination job support for CUPS. * * Copyright 2012-2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * 'cupsCancelDestJob()' - Cancel a job on a destination. * * The "job_id" is the number returned by cupsCreateDestJob. * * Returns @code IPP_STATUS_OK@ on success and * @code IPP_STATUS_ERROR_NOT_AUTHORIZED@ or * @code IPP_STATUS_ERROR_FORBIDDEN@ on failure. * * @since CUPS 1.6/macOS 10.8@ */ ipp_status_t /* O - Status of cancel operation */ cupsCancelDestJob(http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ int job_id) /* I - Job ID */ { cups_dinfo_t *info; /* Destination information */ if ((info = cupsCopyDestInfo(http, dest)) != NULL) { ipp_t *request; /* Cancel-Job request */ request = ippNewRequest(IPP_OP_CANCEL_JOB); ippSetVersion(request, info->version / 10, info->version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, info->uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippDelete(cupsDoRequest(http, request, info->resource)); cupsFreeDestInfo(info); } return (cupsLastError()); } /* * 'cupsCloseDestJob()' - Close a job and start printing. * * Use when the last call to cupsStartDocument passed 0 for "last_document". * "job_id" is the job ID returned by cupsCreateDestJob. Returns @code IPP_STATUS_OK@ * on success. * * @since CUPS 1.6/macOS 10.8@ */ ipp_status_t /* O - IPP status code */ cupsCloseDestJob( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *info, /* I - Destination information */ int job_id) /* I - Job ID */ { int i; /* Looping var */ ipp_t *request = NULL;/* Close-Job/Send-Document request */ ipp_attribute_t *attr; /* operations-supported attribute */ DEBUG_printf(("cupsCloseDestJob(http=%p, dest=%p(%s/%s), info=%p, job_id=%d)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, job_id)); /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !info || job_id <= 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); DEBUG_puts("1cupsCloseDestJob: Bad arguments."); return (IPP_STATUS_ERROR_INTERNAL); } /* * Build a Close-Job or empty Send-Document request... */ if ((attr = ippFindAttribute(info->attrs, "operations-supported", IPP_TAG_ENUM)) != NULL) { for (i = 0; i < attr->num_values; i ++) if (attr->values[i].integer == IPP_OP_CLOSE_JOB) { request = ippNewRequest(IPP_OP_CLOSE_JOB); break; } } if (!request) request = ippNewRequest(IPP_OP_SEND_DOCUMENT); if (!request) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0); DEBUG_puts("1cupsCloseDestJob: Unable to create Close-Job/Send-Document " "request."); return (IPP_STATUS_ERROR_INTERNAL); } ippSetVersion(request, info->version / 10, info->version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, info->uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (ippGetOperation(request) == IPP_OP_SEND_DOCUMENT) ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); /* * Send the request and return the status... */ ippDelete(cupsDoRequest(http, request, info->resource)); DEBUG_printf(("1cupsCloseDestJob: %s (%s)", ippErrorString(cupsLastError()), cupsLastErrorString())); return (cupsLastError()); } /* * 'cupsCreateDestJob()' - Create a job on a destination. * * Returns @code IPP_STATUS_OK@ or @code IPP_STATUS_OK_SUBST@ on success, saving the job ID * in the variable pointed to by "job_id". * * @since CUPS 1.6/macOS 10.8@ */ ipp_status_t /* O - IPP status code */ cupsCreateDestJob( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *info, /* I - Destination information */ int *job_id, /* O - Job ID or 0 on error */ const char *title, /* I - Job name */ int num_options, /* I - Number of job options */ cups_option_t *options) /* I - Job options */ { ipp_t *request, /* Create-Job request */ *response; /* Create-Job response */ ipp_attribute_t *attr; /* job-id attribute */ DEBUG_printf(("cupsCreateDestJob(http=%p, dest=%p(%s/%s), info=%p, " "job_id=%p, title=\"%s\", num_options=%d, options=%p)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, (void *)job_id, title, num_options, (void *)options)); /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (job_id) *job_id = 0; if (!http || !dest || !info || !job_id) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); DEBUG_puts("1cupsCreateDestJob: Bad arguments."); return (IPP_STATUS_ERROR_INTERNAL); } /* * Build a Create-Job request... */ if ((request = ippNewRequest(IPP_OP_CREATE_JOB)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0); DEBUG_puts("1cupsCreateDestJob: Unable to create Create-Job request."); return (IPP_STATUS_ERROR_INTERNAL); } ippSetVersion(request, info->version / 10, info->version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, info->uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (title) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, title); cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB); cupsEncodeOptions2(request, num_options, options, IPP_TAG_SUBSCRIPTION); /* * Send the request and get the job-id... */ response = cupsDoRequest(http, request, info->resource); if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) { *job_id = attr->values[0].integer; DEBUG_printf(("1cupsCreateDestJob: job-id=%d", *job_id)); } ippDelete(response); /* * Return the status code from the Create-Job request... */ DEBUG_printf(("1cupsCreateDestJob: %s (%s)", ippErrorString(cupsLastError()), cupsLastErrorString())); return (cupsLastError()); } /* * 'cupsFinishDestDocument()' - Finish the current document. * * Returns @code IPP_STATUS_OK@ or @code IPP_STATUS_OK_SUBST@ on success. * * @since CUPS 1.6/macOS 10.8@ */ ipp_status_t /* O - Status of document submission */ cupsFinishDestDocument( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *info) /* I - Destination information */ { DEBUG_printf(("cupsFinishDestDocument(http=%p, dest=%p(%s/%s), info=%p)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info)); /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !info) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); DEBUG_puts("1cupsFinishDestDocument: Bad arguments."); return (IPP_STATUS_ERROR_INTERNAL); } /* * Get the response at the end of the document and return it... */ ippDelete(cupsGetResponse(http, info->resource)); DEBUG_printf(("1cupsFinishDestDocument: %s (%s)", ippErrorString(cupsLastError()), cupsLastErrorString())); return (cupsLastError()); } /* * 'cupsStartDestDocument()' - Start a new document. * * "job_id" is the job ID returned by cupsCreateDestJob. "docname" is the name * of the document/file being printed, "format" is the MIME media type for the * document (see CUPS_FORMAT_xxx constants), and "num_options" and "options" * are the options do be applied to the document. "last_document" should be 1 * if this is the last document to be submitted in the job. Returns * @code HTTP_CONTINUE@ on success. * * @since CUPS 1.6/macOS 10.8@ */ http_status_t /* O - Status of document creation */ cupsStartDestDocument( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *info, /* I - Destination information */ int job_id, /* I - Job ID */ const char *docname, /* I - Document name */ const char *format, /* I - Document format */ int num_options, /* I - Number of document options */ cups_option_t *options, /* I - Document options */ int last_document) /* I - 1 if this is the last document */ { ipp_t *request; /* Send-Document request */ http_status_t status; /* HTTP status */ DEBUG_printf(("cupsStartDestDocument(http=%p, dest=%p(%s/%s), info=%p, job_id=%d, docname=\"%s\", format=\"%s\", num_options=%d, options=%p, last_document=%d)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, job_id, docname, format, num_options, (void *)options, last_document)); /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !info || job_id <= 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); DEBUG_puts("1cupsStartDestDocument: Bad arguments."); return (HTTP_STATUS_ERROR); } /* * Create a Send-Document request... */ if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0); DEBUG_puts("1cupsStartDestDocument: Unable to create Send-Document " "request."); return (HTTP_STATUS_ERROR); } ippSetVersion(request, info->version / 10, info->version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, info->uri); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); if (docname) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "document-name", NULL, docname); if (format) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format); ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last_document); cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); cupsEncodeOptions2(request, num_options, options, IPP_TAG_DOCUMENT); /* * Send and delete the request, then return the status... */ status = cupsSendRequest(http, request, info->resource, CUPS_LENGTH_VARIABLE); ippDelete(request); return (status); } cups-2.3.1/cups/raster-stubs.c000664 000765 000024 00000023136 13574721672 016360 0ustar00mikestaff000000 000000 /* * Imaging library stubs for CUPS. * * Copyright © 2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "raster-private.h" /* * These stubs wrap the real functions in libcups - this allows one library to * provide all of the CUPS API functions while still supporting the old split * library organization... */ /* * Local functions... */ static ssize_t cups_read_fd(void *ctx, unsigned char *buf, size_t bytes); static ssize_t cups_write_fd(void *ctx, unsigned char *buf, size_t bytes); /* * 'cupsRasterClose()' - Close a raster stream. * * The file descriptor associated with the raster stream must be closed * separately as needed. */ void cupsRasterClose(cups_raster_t *r) /* I - Stream to close */ { _cupsRasterDelete(r); } /* * 'cupsRasterErrorString()' - Return the last error from a raster function. * * If there are no recent errors, `NULL` is returned. * * @since CUPS 1.3/macOS 10.5@ */ const char * /* O - Last error or `NULL` */ cupsRasterErrorString(void) { return (_cupsRasterErrorString()); } /* * 'cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output. * * The "media" argument specifies the media to use. * * The "type" argument specifies a "pwg-raster-document-type-supported" value * that controls the color space and bit depth of the raster data. * * The "xres" and "yres" arguments specify the raster resolution in dots per * inch. * * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value * to apply for the back side of a page. Pass @code NULL@ for the front side. * * @since CUPS 2.2/macOS 10.12@ */ int /* O - 1 on success, 0 on failure */ cupsRasterInitPWGHeader( cups_page_header2_t *h, /* I - Page header */ pwg_media_t *media, /* I - PWG media information */ const char *type, /* I - PWG raster type string */ int xdpi, /* I - Cross-feed direction (horizontal) resolution */ int ydpi, /* I - Feed direction (vertical) resolution */ const char *sides, /* I - IPP "sides" option value */ const char *sheet_back) /* I - Transform for back side or @code NULL@ for none */ { return (_cupsRasterInitPWGHeader(h, media, type, xdpi, ydpi, sides, sheet_back)); } /* * 'cupsRasterOpen()' - Open a raster stream using a file descriptor. * * This function associates a raster stream with the given file descriptor. * For most printer driver filters, "fd" will be 0 (stdin). For most raster * image processor (RIP) filters that generate raster data, "fd" will be 1 * (stdout). * * When writing raster data, the @code CUPS_RASTER_WRITE@, * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can * be used - compressed and PWG output is generally 25-50% smaller but adds a * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ cupsRasterOpen(int fd, /* I - File descriptor */ cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, @code CUPS_RASTER_WRITE@, @code CUPS_RASTER_WRITE_COMPRESSED@, or @code CUPS_RASTER_WRITE_PWG@ */ { if (mode == CUPS_RASTER_READ) return (_cupsRasterNew(cups_read_fd, (void *)((intptr_t)fd), mode)); else return (_cupsRasterNew(cups_write_fd, (void *)((intptr_t)fd), mode)); } /* * 'cupsRasterOpenIO()' - Open a raster stream using a callback function. * * This function associates a raster stream with the given callback function and * context pointer. * * When writing raster data, the @code CUPS_RASTER_WRITE@, * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can * be used - compressed and PWG output is generally 25-50% smaller but adds a * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ cupsRasterOpenIO( cups_raster_iocb_t iocb, /* I - Read/write callback */ void *ctx, /* I - Context pointer for callback */ cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, @code CUPS_RASTER_WRITE@, @code CUPS_RASTER_WRITE_COMPRESSED@, or @code CUPS_RASTER_WRITE_PWG@ */ { return (_cupsRasterNew(iocb, ctx, mode)); } /* * 'cupsRasterReadHeader()' - Read a raster page header and store it in a * version 1 page header structure. * * This function is deprecated. Use @link cupsRasterReadHeader2@ instead. * * Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset * of the version 2 page header data. This function handles reading version 2 * page headers and copying only the version 1 data into the provided buffer. * * @deprecated@ */ unsigned /* O - 1 on success, 0 on failure/end-of-file */ cupsRasterReadHeader( cups_raster_t *r, /* I - Raster stream */ cups_page_header_t *h) /* I - Pointer to header data */ { /* * Get the raster header... */ if (!_cupsRasterReadHeader(r)) { memset(h, 0, sizeof(cups_page_header_t)); return (0); } /* * Copy the header to the user-supplied buffer... */ memcpy(h, &(r->header), sizeof(cups_page_header_t)); return (1); } /* * 'cupsRasterReadHeader2()' - Read a raster page header and store it in a * version 2 page header structure. * * @since CUPS 1.2/macOS 10.5@ */ unsigned /* O - 1 on success, 0 on failure/end-of-file */ cupsRasterReadHeader2( cups_raster_t *r, /* I - Raster stream */ cups_page_header2_t *h) /* I - Pointer to header data */ { /* * Get the raster header... */ if (!_cupsRasterReadHeader(r)) { memset(h, 0, sizeof(cups_page_header2_t)); return (0); } /* * Copy the header to the user-supplied buffer... */ memcpy(h, &(r->header), sizeof(cups_page_header2_t)); return (1); } /* * 'cupsRasterReadPixels()' - Read raster pixels. * * For best performance, filters should read one or more whole lines. * The "cupsBytesPerLine" value from the page header can be used to allocate * the line buffer and as the number of bytes to read. */ unsigned /* O - Number of bytes read */ cupsRasterReadPixels( cups_raster_t *r, /* I - Raster stream */ unsigned char *p, /* I - Pointer to pixel buffer */ unsigned len) /* I - Number of bytes to read */ { return (_cupsRasterReadPixels(r, p, len)); } /* * 'cupsRasterWriteHeader()' - Write a raster page header from a version 1 page * header structure. * * This function is deprecated. Use @link cupsRasterWriteHeader2@ instead. * * @deprecated@ */ unsigned /* O - 1 on success, 0 on failure */ cupsRasterWriteHeader( cups_raster_t *r, /* I - Raster stream */ cups_page_header_t *h) /* I - Raster page header */ { if (r == NULL || r->mode == CUPS_RASTER_READ) return (0); /* * Make a copy of the header and write using the private function... */ memset(&(r->header), 0, sizeof(r->header)); memcpy(&(r->header), h, sizeof(cups_page_header_t)); return (_cupsRasterWriteHeader(r)); } /* * 'cupsRasterWriteHeader2()' - Write a raster page header from a version 2 * page header structure. * * The page header can be initialized using @link cupsRasterInitPWGHeader@. * * @since CUPS 1.2/macOS 10.5@ */ unsigned /* O - 1 on success, 0 on failure */ cupsRasterWriteHeader2( cups_raster_t *r, /* I - Raster stream */ cups_page_header2_t *h) /* I - Raster page header */ { if (r == NULL || r->mode == CUPS_RASTER_READ) return (0); /* * Make a copy of the header, and compute the number of raster * lines in the page image... */ memcpy(&(r->header), h, sizeof(cups_page_header2_t)); return (_cupsRasterWriteHeader(r)); } /* * 'cupsRasterWritePixels()' - Write raster pixels. * * For best performance, filters should write one or more whole lines. * The "cupsBytesPerLine" value from the page header can be used to allocate * the line buffer and as the number of bytes to write. */ unsigned /* O - Number of bytes written */ cupsRasterWritePixels( cups_raster_t *r, /* I - Raster stream */ unsigned char *p, /* I - Bytes to write */ unsigned len) /* I - Number of bytes to write */ { return (_cupsRasterWritePixels(r, p, len)); } /* * 'cups_read_fd()' - Read bytes from a file. */ static ssize_t /* O - Bytes read or -1 */ cups_read_fd(void *ctx, /* I - File descriptor as pointer */ unsigned char *buf, /* I - Buffer for read */ size_t bytes) /* I - Maximum number of bytes to read */ { int fd = (int)((intptr_t)ctx); /* File descriptor */ ssize_t count; /* Number of bytes read */ #ifdef _WIN32 /* Sigh */ while ((count = read(fd, buf, (unsigned)bytes)) < 0) #else while ((count = read(fd, buf, bytes)) < 0) #endif /* _WIN32 */ if (errno != EINTR && errno != EAGAIN) return (-1); return (count); } /* * 'cups_write_fd()' - Write bytes to a file. */ static ssize_t /* O - Bytes written or -1 */ cups_write_fd(void *ctx, /* I - File descriptor pointer */ unsigned char *buf, /* I - Bytes to write */ size_t bytes) /* I - Number of bytes to write */ { int fd = (int)((intptr_t)ctx); /* File descriptor */ ssize_t count; /* Number of bytes written */ #ifdef _WIN32 /* Sigh */ while ((count = write(fd, buf, (unsigned)bytes)) < 0) #else while ((count = write(fd, buf, bytes)) < 0) #endif /* _WIN32 */ if (errno != EINTR && errno != EAGAIN) return (-1); return (count); } cups-2.3.1/cups/cupspm.md000664 000765 000024 00000114206 13574721672 015406 0ustar00mikestaff000000 000000 --- title: CUPS Programming Manual author: Michael R Sweet copyright: Copyright © 2007-2019 by Apple Inc. All Rights Reserved. version: 2.3.1 ... > Please [file issues on Github](https://github.com/apple/cups/issues) to > provide feedback on this document. # Introduction CUPS provides the "cups" library to talk to the different parts of CUPS and with Internet Printing Protocol (IPP) printers. The "cups" library functions are accessed by including the `` header. CUPS is based on the Internet Printing Protocol ("IPP"), 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 `http_t`. The `CUPS_HTTP_DEFAULT` constant can be used when you want to talk to the CUPS scheduler. ## Guidelines When writing software (other than printer drivers) that uses the "cups" library: - Do not use undocumented or deprecated APIs, - Do not rely on pre-configured printers, - Do not assume that printers support specific features or formats, and - Do not rely on implementation details (PPDs, etc.) 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 ("print four copies, two-sided on A4 media, and staple each copy") and have the printing system manage the printer communication and format conversion needed. 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. > **Note:** > > 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 > [CUPS.org](https://www.cups.org/documentation.html) for more information. ## Terms Used in This Document A *Destination* is a printer or print queue that accepts print jobs. A *Print Job* is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A *Document* is a file (JPEG image, PDF file, etc.) suitable for printing. An *Option* controls some aspect of printing, such as the media used. *Media* is the sheets or roll that is printed on. An *Attribute* is an option encoded for an Internet Printing Protocol (IPP) request. ## Compiling Programs That Use the CUPS API 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. The following simple program lists the available destinations: #include #include int print_dest(void *user_data, unsigned flags, cups_dest_t *dest) { if (dest->instance) printf("%s/%s\n", dest->name, dest->instance); else puts(dest->name); return (1); } int main(void) { cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, print_dest, NULL); return (0); } ### Compiling with Xcode In Xcode, choose *New Project...* from the *File* menu (or press SHIFT+CMD+N), then select the *Command Line Tool* under the macOS Application project type. Click *Next* and enter a name for the project, for example "firstcups". Click *Next* and choose a project directory. The click *Next* to create the project. In the project window, click on the *Build Phases* group and expand the *Link Binary with Libraries* section. Click *+*, type "libcups" to show the library, and then double-click on `libcups.tbd`. Finally, click on the `main.c` file in the sidebar and copy the example program to the file. Build and run (CMD+R) to see the list of destinations. ### Compiling with GCC From the command-line, create a file called `simple.c` 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: gcc -o simple `cups-config --cflags` simple.c `cups-config --libs` ./simple The `cups-config` command provides the compiler flags (`cups-config --cflags`) and libraries (`cups-config --libs`) needed for the local system. # Working with Destinations Destinations, which in CUPS represent individual printers or classes (collections or pools) of printers, are represented by the `cups_dest_t` structure which includes the name \(`name`), instance \(`instance`, saved options/settings), whether the destination is the default for the user \(`is_default`), and the options and basic information associated with that destination \(`num_options` and `options`). 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. ## Finding Available Destinations The `cupsEnumDests` function finds all of the available destinations: int cupsEnumDests(unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data) The `flags` argument specifies enumeration options, which at present must be `CUPS_DEST_FLAGS_NONE`. The `msec` argument specifies the maximum amount of time that should be used for enumeration in milliseconds - interactive applications should keep this value to 5000 or less when run on the main thread. The `cancel` 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 `NULL` if not needed. The `type` and `mask` arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's "printer-type" value is masked by the `mask` value and compared to the `type` value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass `CUPS_PRINTER_LOCAL` for the `type` argument and `CUPS_PRINTER_DISCOVERED` for the `mask` argument. The following constants can be used for filtering: - `CUPS_PRINTER_CLASS`: A collection of destinations. - `CUPS_PRINTER_FAX`: A facsimile device. - `CUPS_PRINTER_LOCAL`: A local printer or class. This constant has the value 0 (no bits set) and is only used for the `type` argument and is paired with the `CUPS_PRINTER_REMOTE` or `CUPS_PRINTER_DISCOVERED` constant passed in the `mask` argument. - `CUPS_PRINTER_REMOTE`: A remote (shared) printer or class. - `CUPS_PRINTER_DISCOVERED`: An available network printer or class. - `CUPS_PRINTER_BW`: Can do B&W printing. - `CUPS_PRINTER_COLOR`: Can do color printing. - `CUPS_PRINTER_DUPLEX`: Can do two-sided printing. - `CUPS_PRINTER_STAPLE`: Can staple output. - `CUPS_PRINTER_COLLATE`: Can quickly collate copies. - `CUPS_PRINTER_PUNCH`: Can punch output. - `CUPS_PRINTER_COVER`: Can cover output. - `CUPS_PRINTER_BIND`: Can bind output. - `CUPS_PRINTER_SORT`: Can sort output (mailboxes, etc.) - `CUPS_PRINTER_SMALL`: Can print on Letter/Legal/A4-size media. - `CUPS_PRINTER_MEDIUM`: Can print on Tabloid/B/C/A3/A2-size media. - `CUPS_PRINTER_LARGE`: Can print on D/E/A1/A0-size media. - `CUPS_PRINTER_VARIABLE`: Can print on rolls and custom-size media. The `cb` argument specifies a function to call for every destination that is found: typedef int (*cups_dest_cb_t)(void *user_data, unsigned flags, cups_dest_t *dest); The callback function receives a copy of the `user_data` argument along with a bitfield \(`flags`) and the destination that was found. The `flags` argument can have any of the following constant (bit) values set: - `CUPS_DEST_FLAGS_MORE`: There are more destinations coming. - `CUPS_DEST_FLAGS_REMOVED`: The destination has gone away and should be removed from the list of destinations a user can select. - `CUPS_DEST_FLAGS_ERROR`: An error occurred. The reason for the error can be found by calling the `cupsLastError` and/or `cupsLastErrorString` functions. The callback function returns 0 to stop enumeration or 1 to continue. > **Note:** > > The callback function will likely be called multiple times for the > same destination, so it is up to the caller to suppress any duplicate > destinations. The following example shows how to use `cupsEnumDests` to get a filtered array of destinations: typedef struct { int num_dests; cups_dest_t *dests; } my_user_data_t; int my_dest_cb(my_user_data_t *user_data, unsigned flags, cups_dest_t *dest) { if (flags & CUPS_DEST_FLAGS_REMOVED) { /* * Remove destination from array... */ user_data->num_dests = cupsRemoveDest(dest->name, dest->instance, user_data->num_dests, &(user_data->dests)); } else { /* * Add destination to array... */ user_data->num_dests = cupsCopyDest(dest, user_data->num_dests, &(user_data->dests)); } return (1); } int my_get_dests(cups_ptype_t type, cups_ptype_t mask, cups_dest_t **dests) { my_user_data_t user_data = { 0, NULL }; if (!cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, type, mask, (cups_dest_cb_t)my_dest_cb, &user_data)) { /* * An error occurred, free all of the destinations and * return... */ cupsFreeDests(user_data.num_dests, user_dasta.dests); *dests = NULL; return (0); } /* * Return the destination array... */ *dests = user_data.dests; return (user_data.num_dests); } ## Basic Destination Information The `num_options` and `options` members of the `cups_dest_t` 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: - "auth-info-required": The type of authentication required for printing to this destination: "none", "username,password", "domain,username,password", or "negotiate" (Kerberos). - "printer-info": The human-readable description of the destination such as "My Laser Printer". - "printer-is-accepting-jobs": "true" if the destination is accepting new jobs, "false" otherwise. - "printer-is-shared": "true" if the destination is being shared with other computers, "false" otherwise. - "printer-location": The human-readable location of the destination such as "Lab 4". - "printer-make-and-model": The human-readable make and model of the destination such as "ExampleCorp LaserPrinter 4000 Series". - "printer-state": "3" if the destination is idle, "4" if the destination is printing a job, and "5" if the destination is stopped. - "printer-state-change-time": The UNIX time when the destination entered the current state. - "printer-state-reasons": Additional comma-delimited state keywords for the destination such as "media-tray-empty-error" and "toner-low-warning". - "printer-type": The `cups_ptype_t` value associated with the destination. - "printer-uri-supported": The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer. Use the `cupsGetOption` function to retrieve the value. For example, the following code gets the make and model of a destination: const char *model = cupsGetOption("printer-make-and-model", dest->num_options, dest->options); ## Detailed Destination Information Once a destination has been chosen, the `cupsCopyDestInfo` function can be used to gather detailed information about the destination: cups_dinfo_t * cupsCopyDestInfo(http_t *http, cups_dest_t *dest); The `http` argument specifies a connection to the CUPS scheduler and is typically the constant `CUPS_HTTP_DEFAULT`. The `dest` argument specifies the destination to query. The `cups_dinfo_t` 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. ### Getting Supported Options and Values The `cupsCheckDestSupported` function can be used to test whether a particular option or option and value is supported: int cupsCheckDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option, const char *value); The `option` argument specifies the name of the option to check. The following constants can be used to check the various standard options: - `CUPS_COPIES`: Controls the number of copies that are produced. - `CUPS_FINISHINGS`: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding. - `CUPS_MEDIA`: Controls the media size that is used, typically one of the following: `CUPS_MEDIA_3X5`, `CUPS_MEDIA_4X6`, `CUPS_MEDIA_5X7`, `CUPS_MEDIA_8X10`, `CUPS_MEDIA_A3`, `CUPS_MEDIA_A4`, `CUPS_MEDIA_A5`, `CUPS_MEDIA_A6`, `CUPS_MEDIA_ENV10`, `CUPS_MEDIA_ENVDL`, `CUPS_MEDIA_LEGAL`, `CUPS_MEDIA_LETTER`, `CUPS_MEDIA_PHOTO_L`, `CUPS_MEDIA_SUPERBA3`, or `CUPS_MEDIA_TABLOID`. - `CUPS_MEDIA_SOURCE`: Controls where the media is pulled from, typically either `CUPS_MEDIA_SOURCE_AUTO` or `CUPS_MEDIA_SOURCE_MANUAL`. - `CUPS_MEDIA_TYPE`: Controls the type of media that is used, typically one of the following: `CUPS_MEDIA_TYPE_AUTO`, `CUPS_MEDIA_TYPE_ENVELOPE`, `CUPS_MEDIA_TYPE_LABELS`, `CUPS_MEDIA_TYPE_LETTERHEAD`, `CUPS_MEDIA_TYPE_PHOTO`, `CUPS_MEDIA_TYPE_PHOTO_GLOSSY`, `CUPS_MEDIA_TYPE_PHOTO_MATTE`, `CUPS_MEDIA_TYPE_PLAIN`, or `CUPS_MEDIA_TYPE_TRANSPARENCY`. - `CUPS_NUMBER_UP`: Controls the number of document pages that are placed on each media side. - `CUPS_ORIENTATION`: Controls the orientation of document pages placed on the media: `CUPS_ORIENTATION_PORTRAIT` or `CUPS_ORIENTATION_LANDSCAPE`. - `CUPS_PRINT_COLOR_MODE`: Controls whether the output is in color \(`CUPS_PRINT_COLOR_MODE_COLOR`), grayscale \(`CUPS_PRINT_COLOR_MODE_MONOCHROME`), or either \(`CUPS_PRINT_COLOR_MODE_AUTO`). - `CUPS_PRINT_QUALITY`: Controls the generate quality of the output: `CUPS_PRINT_QUALITY_DRAFT`, `CUPS_PRINT_QUALITY_NORMAL`, or `CUPS_PRINT_QUALITY_HIGH`. - `CUPS_SIDES`: Controls whether prints are placed on one or both sides of the media: `CUPS_SIDES_ONE_SIDED`, `CUPS_SIDES_TWO_SIDED_PORTRAIT`, or `CUPS_SIDES_TWO_SIDED_LANDSCAPE`. If the `value` argument is `NULL`, the `cupsCheckDestSupported` function returns whether the option is supported by the destination. Otherwise, the function returns whether the specified value of the option is supported. The `cupsFindDestSupported` function returns the IPP attribute containing the supported values for a given option: ipp_attribute_t * cupsFindDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option); For example, the following code prints the supported finishing processes for a destination, if any, to the standard output: cups_dinfo_t *info = cupsCopyDestInfo(CUPS_HTTP_DEFAULT, dest); if (cupsCheckDestSupported(CUPS_HTTP_DEFAULT, dest, info, CUPS_FINISHINGS, NULL)) { ipp_attribute_t *finishings = cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info, CUPS_FINISHINGS); int i, count = ippGetCount(finishings); puts("finishings supported:"); for (i = 0; i < count; i ++) printf(" %d\n", ippGetInteger(finishings, i)); } else puts("finishings not supported."); The "job-creation-attributes" option can be queried to get a list of supported options. For example, the following code prints the list of supported options to the standard output: ipp_attribute_t *attrs = cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info, "job-creation-attributes"); int i, count = ippGetCount(attrs); for (i = 0; i < count; i ++) puts(ippGetString(attrs, i, NULL)); ### Getting Default Values There are two sets of default values - user defaults that are available via the `num_options` and `options` members of the `cups_dest_t` structure, and destination defaults that available via the `cups_dinfo_t` structure and the `cupsFindDestDefault` function which returns the IPP attribute containing the default value(s) for a given option: ipp_attribute_t * cupsFindDestDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option); The user defaults from `cupsGetOption` should always take preference over the destination defaults. For example, the following code prints the default finishings value(s) to the standard output: const char *def_value = cupsGetOption(CUPS_FINISHINGS, dest->num_options, dest->options); ipp_attribute_t *def_attr = cupsFindDestDefault(CUPS_HTTP_DEFAULT, dest, info, CUPS_FINISHINGS); if (def_value != NULL) { printf("Default finishings: %s\n", def_value); } else { int i, count = ippGetCount(def_attr); printf("Default finishings: %d", ippGetInteger(def_attr, 0)); for (i = 1; i < count; i ++) printf(",%d", ippGetInteger(def_attr, i)); putchar('\n'); } ### Getting Ready (Loaded) Values 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. The `cupsFindDestReady` function finds the IPP attribute containing the ready values for a given option: ipp_attribute_t * cupsFindDestReady(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option); For example, the following code lists the ready finishing processes: ipp_attribute_t *ready_finishings = cupsFindDestReady(CUPS_HTTP_DEFAULT, dest, info, CUPS_FINISHINGS); if (ready_finishings != NULL) { int i, count = ippGetCount(ready_finishings); puts("finishings ready:"); for (i = 0; i < count; i ++) printf(" %d\n", ippGetInteger(ready_finishings, i)); } else puts("no finishings are ready."); ### Media Size Options CUPS provides functions for querying the dimensions and margins for each of the supported media size options. The `cups_size_t` structure is used to describe a media size: typedef struct cups_size_s { char media[128]; int width, length; int bottom, left, right, top; } cups_size_t; The `width` and `length` members specify the dimensions of the media in hundredths of millimeters (1/2540th of an inch). The `bottom`, `left`, `right`, and `top` members specify the margins of the printable area, also in hundredths of millimeters. The `cupsGetDestMediaByName` and `cupsGetDestMediaBySize` functions lookup the media size information using a standard media size name or dimensions in hundredths of millimeters: int cupsGetDestMediaByName(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *media, unsigned flags, cups_size_t *size); int cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int width, int length, unsigned flags, cups_size_t *size); The `media`, `width`, and `length` arguments specify the size to lookup. The `flags` argument specifies a bitfield controlling various lookup options: - `CUPS_MEDIA_FLAGS_DEFAULT`: Find the closest size supported by the printer. - `CUPS_MEDIA_FLAGS_BORDERLESS`: Find a borderless size. - `CUPS_MEDIA_FLAGS_DUPLEX`: Find a size compatible with two-sided printing. - `CUPS_MEDIA_FLAGS_EXACT`: Find an exact match for the size. - `CUPS_MEDIA_FLAGS_READY`: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the "ready" media. If a matching size is found for the destination, the size information is stored in the structure pointed to by the `size` argument and 1 is returned. Otherwise 0 is returned. For example, the following code prints the margins for two-sided printing on US Letter media: cups_size_t size; if (cupsGetDestMediaByName(CUPS_HTTP_DEFAULT, dest, info, CUPS_MEDIA_LETTER, CUPS_MEDIA_FLAGS_DUPLEX, &size)) { puts("Margins for duplex US Letter:"); printf(" Bottom: %.2fin\n", size.bottom / 2540.0); printf(" Left: %.2fin\n", size.left / 2540.0); printf(" Right: %.2fin\n", size.right / 2540.0); printf(" Top: %.2fin\n", size.top / 2540.0); } else puts("Margins for duplex US Letter are not available."); You can also enumerate all of the sizes that match a given `flags` value using the `cupsGetDestMediaByIndex` and `cupsGetDestMediaCount` functions: int cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int n, unsigned flags, cups_size_t *size); int cupsGetDestMediaCount(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags); For example, the following code prints the list of ready media and corresponding margins: cups_size_t size; int i; int count = cupsGetDestMediaCount(CUPS_HTTP_DEFAULT, dest, info, CUPS_MEDIA_FLAGS_READY); for (i = 0; i < count; i ++) { if (cupsGetDestMediaByIndex(CUPS_HTTP_DEFAULT, dest, info, i, CUPS_MEDIA_FLAGS_READY, &size)) { printf("%s:\n", size.name); printf(" Width: %.2fin\n", size.width / 2540.0); printf(" Length: %.2fin\n", size.length / 2540.0); printf(" Bottom: %.2fin\n", size.bottom / 2540.0); printf(" Left: %.2fin\n", size.left / 2540.0); printf(" Right: %.2fin\n", size.right / 2540.0); printf(" Top: %.2fin\n", size.top / 2540.0); } } Finally, the `cupsGetDestMediaDefault` function returns the default media size: int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size); ### Localizing Options and Values CUPS provides three functions to get localized, human-readable strings in the user's current locale for options and values: `cupsLocalizeDestMedia`, `cupsLocalizeDestOption`, and `cupsLocalizeDestValue`: const char * cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, unsigned flags, cups_size_t *size); const char * cupsLocalizeDestOption(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option); const char * cupsLocalizeDestValue(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, const char *option, const char *value); ## Submitting a Print Job Once you are ready to submit a print job, you create a job using the `cupsCreateDestJob` function: ipp_status_t cupsCreateDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int *job_id, const char *title, int num_options, cups_option_t *options); The `title` argument specifies a name for the print job such as "My Document". The `num_options` and `options` arguments specify the options for the print job which are allocated using the `cupsAddOption` function. When successful, the job's numeric identifier is stored in the integer pointed to by the `job_id` argument and `IPP_STATUS_OK` is returned. Otherwise, an IPP error status is returned. For example, the following code creates a new job that will print 42 copies of a two-sided US Letter document: int job_id = 0; int num_options = 0; cups_option_t *options = NULL; num_options = cupsAddOption(CUPS_COPIES, "42", num_options, &options); num_options = cupsAddOption(CUPS_MEDIA, CUPS_MEDIA_LETTER, num_options, &options); num_options = cupsAddOption(CUPS_SIDES, CUPS_SIDES_TWO_SIDED_PORTRAIT, num_options, &options); if (cupsCreateDestJob(CUPS_HTTP_DEFAULT, dest, info, &job_id, "My Document", num_options, options) == IPP_STATUS_OK) printf("Created job: %d\n", job_id); else printf("Unable to create job: %s\n", cupsLastErrorString()); Once the job is created, you submit documents for the job using the `cupsStartDestDocument`, `cupsWriteRequestData`, and `cupsFinishDestDocument` functions: http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id, const char *docname, const char *format, int num_options, cups_option_t *options, int last_document); http_status_t cupsWriteRequestData(http_t *http, const char *buffer, size_t length); ipp_status_t cupsFinishDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info); The `docname` argument specifies the name of the document, typically the original filename. The `format` argument specifies the MIME media type of the document, including the following constants: - `CUPS_FORMAT_JPEG`: "image/jpeg" - `CUPS_FORMAT_PDF`: "application/pdf" - `CUPS_FORMAT_POSTSCRIPT`: "application/postscript" - `CUPS_FORMAT_TEXT`: "text/plain" The `num_options` and `options` arguments specify per-document print options, which at present must be 0 and `NULL`. The `last_document` argument specifies whether this is the last document in the job. For example, the following code submits a PDF file to the job that was just created: FILE *fp = fopen("filename.pdf", "rb"); size_t bytes; char buffer[65536]; if (cupsStartDestDocument(CUPS_HTTP_DEFAULT, dest, info, job_id, "filename.pdf", 0, NULL, 1) == HTTP_STATUS_CONTINUE) { while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes) != HTTP_STATUS_CONTINUE) break; if (cupsFinishDestDocument(CUPS_HTTP_DEFAULT, dest, info) == IPP_STATUS_OK) puts("Document send succeeded."); else printf("Document send failed: %s\n", cupsLastErrorString()); } fclose(fp); # Sending IPP Requests 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. ## Connecting to the Scheduler or Printer The connection to the scheduler or printer is represented by the HTTP connection type `http_t`. The `cupsConnectDest` function connects to the scheduler or printer associated with the destination: http_t * cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec, int *cancel, char *resource, size_t resourcesize, cups_dest_cb_t cb, void *user_data); The `dest` argument specifies the destination to connect to. The `flags` argument specifies whether you want to connect to the scheduler (`CUPS_DEST_FLAGS_NONE`) or device/printer (`CUPS_DEST_FLAGS_DEVICE`) associated with the destination. The `msec` argument specifies how long you are willing to wait for the connection to be established in milliseconds. Specify a value of `-1` to wait indefinitely. The `cancel` argument specifies the address of an integer variable that can be set to a non-zero value to cancel the connection. Specify a value of `NULL` to not provide a cancel variable. The `resource` and `resourcesize` arguments specify the address and size of a character string array to hold the path to use when sending an IPP request. The `cb` and `user_data` arguments specify a destination callback function that returns 1 to continue connecting or 0 to stop. The destination callback work the same way as the one used for the `cupsEnumDests` function. On success, a HTTP connection is returned that can be used to send IPP requests and get IPP responses. For example, the following code connects to the printer associated with a destination with a 30 second timeout: char resource[256]; http_t *http = cupsConnectDest(dest, CUPS_DEST_FLAGS_DEVICE, 30000, NULL, resource, sizeof(resource), NULL, NULL); ## Creating an IPP Request IPP requests are represented by the IPP message type `ipp_t` and each IPP attribute in the request is representing using the type `ipp_attribute_t`. Each IPP request includes an operation code (`IPP_OP_CREATE_JOB`, `IPP_OP_GET_PRINTER_ATTRIBUTES`, etc.) and a 32-bit integer identifier. The `ippNewRequest` function creates a new IPP request: ipp_t * ippNewRequest(ipp_op_t op); The `op` argument specifies the IPP operation code for the request. For example, the following code creates an IPP Get-Printer-Attributes request: ipp_t *request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); The request identifier is automatically set to a unique value for the current process. Each IPP request starts with two IPP attributes, "attributes-charset" and "attributes-natural-language", followed by IPP attribute(s) that specify the target of the operation. The `ippNewRequest` automatically adds the correct "attributes-charset" and "attributes-natural-language" attributes, but you must add the target attribute(s). For example, the following code adds the "printer-uri" attribute to the IPP Get-Printer-Attributes request to specify which printer is being queried: const char *printer_uri = cupsGetOption("device-uri", dest->num_options, dest->options); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer_uri); > **Note:** > > If we wanted to query the scheduler instead of the device, we would look > up the "printer-uri-supported" option instead of the "device-uri" value. The `ippAddString` function adds the "printer-uri" attribute the the IPP request. The `IPP_TAG_OPERATION` argument specifies that the attribute is part of the operation. The `IPP_TAG_URI` argument specifies that the value is a Universal Resource Identifier (URI) string. The `NULL` argument specifies there is no language (English, French, Japanese, etc.) associated with the string, and the `printer_uri` argument specifies the string value. The IPP Get-Printer-Attributes request also supports an IPP attribute called "requested-attributes" that lists the attributes and values you are interested in. For example, the following code requests the printer state attributes: static const char * const requested_attributes[] = { "printer-state", "printer-state-message", "printer-state-reasons" }; ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", 3, NULL, requested_attributes); The `ippAddStrings` function adds an attribute with one or more strings, in this case three. The `IPP_TAG_KEYWORD` argument specifies that the strings are keyword values, which are used for attribute names. All strings use the same language (`NULL`), and the attribute will contain the three strings in the array `requested_attributes`. CUPS provides many functions to adding attributes of different types: - `ippAddBoolean` adds a boolean (`IPP_TAG_BOOLEAN`) attribute with one value. - `ippAddInteger` adds an enum (`IPP_TAG_ENUM`) or integer (`IPP_TAG_INTEGER`) attribute with one value. - `ippAddIntegers` adds an enum or integer attribute with one or more values. - `ippAddOctetString` adds an octetString attribute with one value. - `ippAddOutOfBand` adds a admin-defined (`IPP_TAG_ADMINDEFINE`), default (`IPP_TAG_DEFAULT`), delete-attribute (`IPP_TAG_DELETEATTR`), no-value (`IPP_TAG_NOVALUE`), not-settable (`IPP_TAG_NOTSETTABLE`), unknown (`IPP_TAG_UNKNOWN`), or unsupported (`IPP_TAG_UNSUPPORTED_VALUE`) out-of-band attribute. - `ippAddRange` adds a rangeOfInteger attribute with one range. - `ippAddRanges` adds a rangeOfInteger attribute with one or more ranges. - `ippAddResolution` adds a resolution attribute with one resolution. - `ippAddResolutions` adds a resolution attribute with one or more resolutions. - `ippAddString` adds a charset (`IPP_TAG_CHARSET`), keyword (`IPP_TAG_KEYWORD`), mimeMediaType (`IPP_TAG_MIMETYPE`), name (`IPP_TAG_NAME` and `IPP_TAG_NAMELANG`), naturalLanguage (`IPP_TAG_NATURAL_LANGUAGE`), text (`IPP_TAG_TEXT` and `IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), or uriScheme (`IPP_TAG_URISCHEME`) attribute with one value. - `ippAddStrings` adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values. ## Sending the IPP Request Once you have created the IPP request, you can send it using the `cupsDoRequest` function. For example, the following code sends the IPP Get-Printer-Attributes request to the destination and saves the response: ipp_t *response = cupsDoRequest(http, request, resource); For requests like Send-Document that include a file, the `cupsDoFileRequest` function should be used: ipp_t *response = cupsDoFileRequest(http, request, resource, filename); Both `cupsDoRequest` and `cupsDoFileRequest` free the IPP request. If a valid IPP response is received, it is stored in a new IPP message (`ipp_t`) and returned to the caller. Otherwise `NULL` is returned. The status from the most recent request can be queried using the `cupsLastError` function, for example: if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST) { /* request failed */ } A human-readable error message is also available using the `cupsLastErrorString` function: if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST) { /* request failed */ printf("Request failed: %s\n", cupsLastErrorString()); } ## Processing the IPP Response Each response to an IPP request is also an IPP message (`ipp_t`) with its own IPP attributes (`ipp_attribute_t`) that includes a status code (`IPP_STATUS_OK`, `IPP_STATUS_ERROR_BAD_REQUEST`, etc.) and the corresponding 32-bit integer identifier from the request. For example, the following code finds the printer state attributes and prints their values: ipp_attribute_t *attr; if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) { printf("printer-state=%s\n", ippEnumString("printer-state", ippGetInteger(attr, 0))); } else puts("printer-state=unknown"); if ((attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT)) != NULL) { printf("printer-state-message=\"%s\"\n", ippGetString(attr, 0, NULL))); } if ((attr = ippFindAttribute(response, "printer-state-reasons", IPP_TAG_KEYWORD)) != NULL) { int i, count = ippGetCount(attr); puts("printer-state-reasons="); for (i = 0; i < count; i ++) printf(" %s\n", ippGetString(attr, i, NULL))); } The `ippGetCount` function returns the number of values in an attribute. The `ippGetInteger` and `ippGetString` functions return a single integer or string value from an attribute. The `ippEnumString` function converts a enum value to its keyword (string) equivalent. Once you are done using the IPP response message, free it using the `ippDelete` function: ippDelete(response); ## Authentication CUPS normally handles authentication through the console. GUI applications should set a password callback using the `cupsSetPasswordCB2` function: void cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data); The password callback will be called when needed and is responsible for setting the current user name using `cupsSetUser` and returning a string: const char * cups_password_cb2(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data); The `prompt` argument is a string from CUPS that should be displayed to the user. The `http` argument is the connection hosting the request that is being authenticated. The password callback can call the `httpGetField` and `httpGetSubField` functions to look for additional details concerning the authentication challenge. The `method` argument specifies the HTTP method used for the request and is typically "POST". The `resource` argument specifies the path used for the request. The `user_data` argument provides the user data pointer from the `cupsSetPasswordCB2` call. cups-2.3.1/cups/hash.c000664 000765 000024 00000017206 13574721672 014646 0ustar00mikestaff000000 000000 /* * Hashing function for CUPS. * * Copyright © 2015-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #ifdef __APPLE__ # include #elif defined(HAVE_GNUTLS) # include # include "md5-internal.h" #else # include "md5-internal.h" #endif /* __APPLE__ */ /* * 'cupsHashData()' - Perform a hash function on the given data. * * The "algorithm" argument can be any of the registered, non-deprecated IPP * hash algorithms for the "job-password-encryption" attribute, including * "sha" for SHA-1, "sha-256" for SHA2-256, etc. * * The "hash" argument points to a buffer of "hashsize" bytes and should be at * least 64 bytes in length for all of the supported algorithms. * * The returned hash is binary data. * * @since CUPS 2.2/macOS 10.12@ */ ssize_t /* O - Size of hash or -1 on error */ cupsHashData(const char *algorithm, /* I - Algorithm name */ const void *data, /* I - Data to hash */ size_t datalen, /* I - Length of data to hash */ unsigned char *hash, /* I - Hash buffer */ size_t hashsize) /* I - Size of hash buffer */ { if (!algorithm || !data || datalen == 0 || !hash || hashsize == 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad arguments to function"), 1); return (-1); } #ifdef __APPLE__ if (!strcmp(algorithm, "md5")) { /* * MD5 (deprecated but widely used...) */ CC_MD5_CTX ctx; /* MD5 context */ if (hashsize < CC_MD5_DIGEST_LENGTH) goto too_small; CC_MD5_Init(&ctx); CC_MD5_Update(&ctx, data, (CC_LONG)datalen); CC_MD5_Final(hash, &ctx); return (CC_MD5_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha")) { /* * SHA-1... */ CC_SHA1_CTX ctx; /* SHA-1 context */ if (hashsize < CC_SHA1_DIGEST_LENGTH) goto too_small; CC_SHA1_Init(&ctx); CC_SHA1_Update(&ctx, data, (CC_LONG)datalen); CC_SHA1_Final(hash, &ctx); return (CC_SHA1_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-224")) { CC_SHA256_CTX ctx; /* SHA-224 context */ if (hashsize < CC_SHA224_DIGEST_LENGTH) goto too_small; CC_SHA224_Init(&ctx); CC_SHA224_Update(&ctx, data, (CC_LONG)datalen); CC_SHA224_Final(hash, &ctx); return (CC_SHA224_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-256")) { CC_SHA256_CTX ctx; /* SHA-256 context */ if (hashsize < CC_SHA256_DIGEST_LENGTH) goto too_small; CC_SHA256_Init(&ctx); CC_SHA256_Update(&ctx, data, (CC_LONG)datalen); CC_SHA256_Final(hash, &ctx); return (CC_SHA256_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-384")) { CC_SHA512_CTX ctx; /* SHA-384 context */ if (hashsize < CC_SHA384_DIGEST_LENGTH) goto too_small; CC_SHA384_Init(&ctx); CC_SHA384_Update(&ctx, data, (CC_LONG)datalen); CC_SHA384_Final(hash, &ctx); return (CC_SHA384_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-512")) { CC_SHA512_CTX ctx; /* SHA-512 context */ if (hashsize < CC_SHA512_DIGEST_LENGTH) goto too_small; CC_SHA512_Init(&ctx); CC_SHA512_Update(&ctx, data, (CC_LONG)datalen); CC_SHA512_Final(hash, &ctx); return (CC_SHA512_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-512_224")) { CC_SHA512_CTX ctx; /* SHA-512 context */ unsigned char temp[CC_SHA512_DIGEST_LENGTH]; /* SHA-512 hash */ /* * SHA2-512 truncated to 224 bits (28 bytes)... */ if (hashsize < CC_SHA224_DIGEST_LENGTH) goto too_small; CC_SHA512_Init(&ctx); CC_SHA512_Update(&ctx, data, (CC_LONG)datalen); CC_SHA512_Final(temp, &ctx); memcpy(hash, temp, CC_SHA224_DIGEST_LENGTH); return (CC_SHA224_DIGEST_LENGTH); } else if (!strcmp(algorithm, "sha2-512_256")) { CC_SHA512_CTX ctx; /* SHA-512 context */ unsigned char temp[CC_SHA512_DIGEST_LENGTH]; /* SHA-512 hash */ /* * SHA2-512 truncated to 256 bits (32 bytes)... */ if (hashsize < CC_SHA256_DIGEST_LENGTH) goto too_small; CC_SHA512_Init(&ctx); CC_SHA512_Update(&ctx, data, (CC_LONG)datalen); CC_SHA512_Final(temp, &ctx); memcpy(hash, temp, CC_SHA256_DIGEST_LENGTH); return (CC_SHA256_DIGEST_LENGTH); } #elif defined(HAVE_GNUTLS) gnutls_digest_algorithm_t alg = GNUTLS_DIG_UNKNOWN; /* Algorithm */ unsigned char temp[64]; /* Temporary hash buffer */ size_t tempsize = 0; /* Truncate to this size? */ if (!strcmp(algorithm, "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")) alg = GNUTLS_DIG_SHA224; else if (!strcmp(algorithm, "sha2-256")) alg = GNUTLS_DIG_SHA256; else if (!strcmp(algorithm, "sha2-384")) alg = GNUTLS_DIG_SHA384; else if (!strcmp(algorithm, "sha2-512")) alg = GNUTLS_DIG_SHA512; else if (!strcmp(algorithm, "sha2-512_224")) { alg = GNUTLS_DIG_SHA512; tempsize = 28; } else if (!strcmp(algorithm, "sha2-512_256")) { alg = GNUTLS_DIG_SHA512; tempsize = 32; } if (alg != GNUTLS_DIG_UNKNOWN) { if (tempsize > 0) { /* * Truncate result to tempsize bytes... */ if (hashsize < tempsize) goto too_small; gnutls_hash_fast(alg, data, datalen, temp); memcpy(hash, temp, tempsize); return ((ssize_t)tempsize); } if (hashsize < gnutls_hash_get_len(alg)) goto too_small; gnutls_hash_fast(alg, data, datalen, hash); return ((ssize_t)gnutls_hash_get_len(alg)); } #else /* * No hash support beyond MD5 without CommonCrypto or GNU TLS... */ if (!strcmp(algorithm, "md5")) { _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 (hashsize < 64) goto too_small; #endif /* __APPLE__ */ /* * Unknown hash algorithm... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown hash algorithm."), 1); return (-1); /* * We get here if the buffer is too small. */ too_small: _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Hash buffer too small."), 1); return (-1); } /* * 'cupsHashString()' - Format a hash value as a hexadecimal string. * * The passed buffer must be at least 2 * hashsize + 1 characters in length. * * @since CUPS 2.2.7@ */ const char * /* O - Formatted string */ cupsHashString( const unsigned char *hash, /* I - Hash */ size_t hashsize, /* I - Size of hash */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of string buffer */ { char *bufptr = buffer; /* Pointer into buffer */ static const char *hex = "0123456789abcdef"; /* Hex characters (lowercase!) */ /* * Range check input... */ if (!hash || hashsize < 1 || !buffer || bufsize < (2 * hashsize + 1)) { if (buffer) *buffer = '\0'; return (NULL); } /* * Loop until we've converted the whole hash... */ while (hashsize > 0) { *bufptr++ = hex[*hash >> 4]; *bufptr++ = hex[*hash & 15]; hash ++; hashsize --; } *bufptr = '\0'; return (buffer); } cups-2.3.1/cups/encode.c000664 000765 000024 00000070773 13574721672 015170 0ustar00mikestaff000000 000000 /* * Option encoding routines for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * Local list of option names, the value tags they should use, and the list of * supported operations... * * **** THIS LIST MUST BE SORTED BY ATTRIBUTE NAME **** */ static const ipp_op_t ipp_job_creation[] = { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, IPP_OP_VALIDATE_JOB, IPP_OP_CREATE_JOB, IPP_OP_HOLD_JOB, IPP_OP_SET_JOB_ATTRIBUTES, IPP_OP_CUPS_NONE }; static const ipp_op_t ipp_doc_creation[] = { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, IPP_OP_SEND_DOCUMENT, IPP_OP_SEND_URI, IPP_OP_SET_JOB_ATTRIBUTES, IPP_OP_SET_DOCUMENT_ATTRIBUTES, IPP_OP_CUPS_NONE }; static const ipp_op_t ipp_sub_creation[] = { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, IPP_OP_CREATE_JOB, IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, IPP_OP_CREATE_JOB_SUBSCRIPTIONS, IPP_OP_CUPS_NONE }; static const ipp_op_t ipp_all_print[] = { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, IPP_OP_VALIDATE_JOB, IPP_OP_CREATE_JOB, IPP_OP_SEND_DOCUMENT, IPP_OP_SEND_URI, IPP_OP_CUPS_NONE }; static const ipp_op_t ipp_set_printer[] = { IPP_OP_SET_PRINTER_ATTRIBUTES, IPP_OP_CUPS_ADD_MODIFY_PRINTER, IPP_OP_CUPS_ADD_MODIFY_CLASS, IPP_OP_CUPS_NONE }; static const ipp_op_t cups_schemes[] = { IPP_OP_CUPS_GET_DEVICES, IPP_OP_CUPS_GET_PPDS, IPP_OP_CUPS_NONE }; static const ipp_op_t cups_get_ppds[] = { IPP_OP_CUPS_GET_PPDS, IPP_OP_CUPS_NONE }; static const ipp_op_t cups_ppd_name[] = { IPP_OP_CUPS_ADD_MODIFY_PRINTER, IPP_OP_CUPS_GET_PPD, IPP_OP_CUPS_NONE }; static const _ipp_option_t ipp_options[] = { { 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB }, { 1, "auth-info-default", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION, IPP_TAG_ZERO, ipp_doc_creation }, { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "date-time-at-completed",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */ { 0, "date-time-at-creation", IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */ { 0, "date-time-at-processing",IPP_TAG_DATE, IPP_TAG_ZERO }, /* never send as option */ { 0, "device-uri", IPP_TAG_URI, IPP_TAG_PRINTER }, { 1, "document-copies", IPP_TAG_RANGE, IPP_TAG_JOB, IPP_TAG_DOCUMENT, ipp_doc_creation }, { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION, IPP_TAG_ZERO, ipp_doc_creation }, { 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER }, { 1, "document-numbers", IPP_TAG_RANGE, IPP_TAG_JOB, IPP_TAG_DOCUMENT, ipp_all_print }, { 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_schemes }, { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 1, "finishings-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 1, "finishings-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER }, { 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, { 0, "fit-to-page", IPP_TAG_BOOLEAN, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "fit-to-page-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "include-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_schemes }, { 0, "ipp-attribute-fidelity", IPP_TAG_BOOLEAN, IPP_TAG_OPERATION }, { 0, "job-account-id", IPP_TAG_NAME, IPP_TAG_JOB }, { 0, "job-account-id-default",IPP_TAG_NAME, IPP_TAG_PRINTER }, { 0, "job-accounting-user-id", IPP_TAG_NAME, IPP_TAG_JOB }, { 0, "job-accounting-user-id-default", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 0, "job-authorization-uri", IPP_TAG_URI, IPP_TAG_OPERATION }, { 0, "job-cancel-after", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "job-cancel-after-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "job-hold-until", IPP_TAG_KEYWORD, IPP_TAG_JOB }, { 0, "job-hold-until-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "job-id", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-impressions", IPP_TAG_INTEGER, IPP_TAG_OPERATION }, { 0, "job-impressions-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "job-k-octets", IPP_TAG_INTEGER, IPP_TAG_OPERATION }, { 0, "job-k-octets-completed",IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-media-sheets", IPP_TAG_INTEGER, IPP_TAG_OPERATION }, { 0, "job-media-sheets-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-name", IPP_TAG_NAME, IPP_TAG_OPERATION, IPP_TAG_JOB }, { 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "job-pages", IPP_TAG_INTEGER, IPP_TAG_OPERATION }, { 0, "job-pages-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-password", IPP_TAG_STRING, IPP_TAG_OPERATION, IPP_TAG_ZERO, ipp_job_creation }, { 0, "job-password-encryption", IPP_TAG_KEYWORD, IPP_TAG_OPERATION, IPP_TAG_ZERO, ipp_job_creation }, { 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "job-priority-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "job-sheets", IPP_TAG_NAME, IPP_TAG_JOB }, { 1, "job-sheets-default", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 0, "job-state", IPP_TAG_ENUM, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-state-message", IPP_TAG_TEXT, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_ZERO }, /* never send as option */ { 0, "job-uuid", IPP_TAG_URI, IPP_TAG_JOB }, { 0, "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 1, "marker-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "marker-colors", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 1, "marker-high-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "marker-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "marker-low-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "marker-message", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 1, "marker-names", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 1, "marker-types", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-bottom-margin", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER }, { 0, "media-color", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 1, "media-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "media-key", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-left-margin", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-right-margin", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-size", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-size-name", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-source", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-top-margin", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "media-type", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "multiple-document-handling", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "multiple-document-handling-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION }, { 1, "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION }, { 1, "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION }, { 0, "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION }, { 0, "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION }, { 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION }, { 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION }, { 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION }, { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "number-up-layout", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "number-up-layout-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, { 0, "output-bin", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "output-bin-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 1, "overrides", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "page-delivery", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "page-delivery-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "pages", IPP_TAG_RANGE, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 0, "ppd-device-id", IPP_TAG_TEXT, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-make", IPP_TAG_TEXT, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-make-and-model", IPP_TAG_TEXT, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-model-number", IPP_TAG_INTEGER, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_ppd_name }, { 0, "ppd-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-product", IPP_TAG_TEXT, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-psversion", IPP_TAG_TEXT, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppd-type", IPP_TAG_KEYWORD, IPP_TAG_OPERATION, IPP_TAG_ZERO, cups_get_ppds }, { 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "print-color-mode", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "print-color-mode-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "print-content-optimize", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "print-content-optimize-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, { 0, "print-rendering-intent", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "print-rendering-intent-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "print-scaling", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "print-scaling-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 1, "printer-alert", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 1, "printer-alert-description", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 1, "printer-commands", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 1, "printer-finisher", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 1, "printer-finisher-description", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 1, "printer-finisher-supplies", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 1, "printer-finisher-supplies-description", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 0, "printer-geo-location", IPP_TAG_URI, IPP_TAG_PRINTER }, { 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 1, "printer-input-tray", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "printer-is-temporary", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER }, { 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 1, "printer-output-tray", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "printer-resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER }, { 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER }, { 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 1, "printer-supply", IPP_TAG_STRING, IPP_TAG_PRINTER }, { 1, "printer-supply-description", IPP_TAG_TEXT, IPP_TAG_PRINTER }, { 0, "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER }, { 0, "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION }, { 1, "printer-uri-supported", IPP_TAG_URI, IPP_TAG_PRINTER }, { 0, "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION }, { 1, "requested-attributes", IPP_TAG_NAME, IPP_TAG_OPERATION }, { 1, "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 1, "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER }, { 0, "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB }, { 0, "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER }, { 0, "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB }, { 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, { 0, "time-at-completed", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "time-at-creation", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "time-at-processing", IPP_TAG_INTEGER, IPP_TAG_ZERO }, /* never send as option */ { 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, { 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, { 0, "x-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT }, { 0, "y-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB, IPP_TAG_DOCUMENT } }; /* * Local functions... */ static int compare_ipp_options(_ipp_option_t *a, _ipp_option_t *b); /* * '_cupsEncodeOption()' - Encode a single option as an IPP attribute. */ ipp_attribute_t * /* O - New attribute or @code NULL@ on error */ _cupsEncodeOption( ipp_t *ipp, /* I - IPP request/response/collection */ ipp_tag_t group_tag, /* I - Group tag */ _ipp_option_t *map, /* I - Option mapping, if any */ const char *name, /* I - Attribute name */ const char *value) /* I - Value */ { int i, /* Looping var */ count; /* Number of values */ char *s, /* Pointer into option value */ *val, /* Pointer to option value */ *copy, /* Copy of option value */ *sep, /* Option separator */ quote; /* Quote character */ ipp_attribute_t *attr; /* IPP attribute */ ipp_tag_t value_tag; /* IPP value tag */ ipp_t *collection; /* Collection value */ int num_cols; /* Number of collection values */ cups_option_t *cols; /* Collection values */ DEBUG_printf(("_cupsEncodeOption(ipp=%p(%s), group=%s, map=%p, name=\"%s\", value=\"%s\")", (void *)ipp, ipp ? ippOpString(ippGetOperation(ipp)) : "", ippTagString(group_tag), (void *)map, name, value)); /* * Figure out the attribute syntax for encoding... */ if (!map) map = _ippFindOption(name); if (map) value_tag = map->value_tag; else if (!_cups_strcasecmp(value, "true") || !_cups_strcasecmp(value, "false")) value_tag = IPP_TAG_BOOLEAN; else if (value[0] == '{') value_tag = IPP_TAG_BEGIN_COLLECTION; else value_tag = IPP_TAG_NAME; /* * Count the number of values... */ if (map && map->multivalue) { for (count = 1, sep = (char *)value, quote = 0; *sep; sep ++) { if (*sep == quote) quote = 0; else if (!quote && (*sep == '\'' || *sep == '\"')) { /* * Skip quoted option value... */ quote = *sep; } else if (*sep == ',' && !quote) count ++; else if (*sep == '\\' && sep[1]) sep ++; } } else count = 1; DEBUG_printf(("2_cupsEncodeOption: value_tag=%s, count=%d", ippTagString(value_tag), count)); /* * Allocate memory for the attribute values... */ if ((attr = ippAddStrings(ipp, group_tag, value_tag, name, count, NULL, NULL)) == NULL) { /* * Ran out of memory! */ DEBUG_puts("1_cupsEncodeOption: Ran out of memory for attributes."); return (NULL); } if (count > 1) { /* * Make a copy of the value we can fiddle with... */ if ((copy = strdup(value)) == NULL) { /* * Ran out of memory! */ DEBUG_puts("1_cupsEncodeOption: Ran out of memory for value copy."); ippDeleteAttribute(ipp, attr); return (NULL); } val = copy; } else { /* * Since we have a single value, use the value directly... */ val = (char *)value; copy = NULL; } /* * Scan the value string for values... */ for (i = 0, sep = val; i < count; val = sep, i ++) { /* * Find the end of this value and mark it if needed... */ if (count > 1) { for (quote = 0; *sep; sep ++) { if (*sep == quote) { /* * Finish quoted value... */ quote = 0; } else if (!quote && (*sep == '\'' || *sep == '\"')) { /* * Handle quoted option value... */ quote = *sep; } else if (*sep == ',') break; else if (*sep == '\\' && sep[1]) { /* * Skip quoted character... */ memmove(sep, sep + 1, strlen(sep)); } } if (*sep == ',') *sep++ = '\0'; } /* * Copy the option value(s) over as needed by the type... */ switch (attr->value_tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : /* * Integer/enumeration value... */ ippSetInteger(ipp, &attr, i, (int)strtol(val, &s, 10)); break; case IPP_TAG_BOOLEAN : if (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || !_cups_strcasecmp(val, "yes")) { /* * Boolean value - true... */ ippSetBoolean(ipp, &attr, i, 1); } else { /* * Boolean value - false... */ ippSetBoolean(ipp, &attr, i, 0); } break; case IPP_TAG_RANGE : { /* * Range... */ int lower, upper; /* Lower and upper ranges... */ if (*val == '-') { lower = 1; s = val; } else lower = (int)strtol(val, &s, 10); if (*s == '-') { if (s[1]) upper = (int)strtol(s + 1, NULL, 10); else upper = 2147483647; } else upper = lower; ippSetRange(ipp, &attr, i, lower, upper); } break; case IPP_TAG_RESOLUTION : { /* * Resolution... */ int xres, yres; /* Resolution values */ ipp_res_t units; /* Resolution units */ xres = (int)strtol(val, &s, 10); if (*s == 'x') yres = (int)strtol(s + 1, &s, 10); else yres = xres; if (!_cups_strcasecmp(s, "dpc") || !_cups_strcasecmp(s, "dpcm")) units = IPP_RES_PER_CM; else units = IPP_RES_PER_INCH; ippSetResolution(ipp, &attr, i, units, xres, yres); } break; case IPP_TAG_STRING : /* * octetString */ ippSetOctetString(ipp, &attr, i, val, (int)strlen(val)); break; case IPP_TAG_BEGIN_COLLECTION : /* * Collection value */ num_cols = cupsParseOptions(val, 0, &cols); if ((collection = ippNew()) == NULL) { cupsFreeOptions(num_cols, cols); if (copy) free(copy); ippDeleteAttribute(ipp, attr); return (NULL); } ippSetCollection(ipp, &attr, i, collection); cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB); cupsFreeOptions(num_cols, cols); break; default : ippSetString(ipp, &attr, i, val); break; } } if (copy) free(copy); return (attr); } /* * 'cupsEncodeOption()' - Encode a single option into an IPP attribute. * * @since CUPS 2.3/macOS 10.14@ */ ipp_attribute_t * /* O - New attribute or @code NULL@ on error */ cupsEncodeOption(ipp_t *ipp, /* I - IPP request/response */ ipp_tag_t group_tag, /* I - Attribute group */ const char *name, /* I - Option name */ const char *value) /* I - Option string value */ { return (_cupsEncodeOption(ipp, group_tag, _ippFindOption(name), name, value)); } /* * 'cupsEncodeOptions()' - Encode printer options into IPP attributes. * * This function adds operation, job, and then subscription attributes, * in that order. Use the @link cupsEncodeOptions2@ function to add attributes * for a single group. */ void cupsEncodeOptions(ipp_t *ipp, /* I - IPP request/response */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)", (void *)ipp, num_options, (void *)options)); /* * Add the options in the proper groups & order... */ cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_OPERATION); cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_JOB); cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_SUBSCRIPTION); } /* * 'cupsEncodeOptions2()' - Encode printer options into IPP attributes for a group. * * This function only adds attributes for a single group. Call this * function multiple times for each group, or use @link cupsEncodeOptions@ * to add the standard groups. * * @since CUPS 1.2/macOS 10.5@ */ void cupsEncodeOptions2( ipp_t *ipp, /* I - IPP request/response */ int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ ipp_tag_t group_tag) /* I - Group to encode */ { int i; /* Looping var */ char *val; /* Pointer to option value */ cups_option_t *option; /* Current option */ ipp_op_t op; /* Operation for this request */ const ipp_op_t *ops; /* List of allowed operations */ DEBUG_printf(("cupsEncodeOptions2(ipp=%p(%s), num_options=%d, options=%p, group_tag=%x)", (void *)ipp, ipp ? ippOpString(ippGetOperation(ipp)) : "", num_options, (void *)options, group_tag)); /* * Range check input... */ if (!ipp || num_options < 1 || !options) return; /* * Do special handling for the document-format/raw options... */ op = ippGetOperation(ipp); if (group_tag == IPP_TAG_OPERATION && (op == IPP_OP_PRINT_JOB || op == IPP_OP_PRINT_URI || op == IPP_OP_SEND_DOCUMENT || op == IPP_OP_SEND_URI)) { /* * Handle the document format stuff first... */ if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL) ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, val); else if (cupsGetOption("raw", num_options, options)) ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "application/vnd.cups-raw"); else ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "application/octet-stream"); } /* * Then loop through the options... */ for (i = num_options, option = options; i > 0; i --, option ++) { _ipp_option_t *match; /* Matching attribute */ /* * Skip document format options that are handled above... */ if (!_cups_strcasecmp(option->name, "raw") || !_cups_strcasecmp(option->name, "document-format") || !option->name[0]) continue; /* * Figure out the proper value and group tags for this option... */ if ((match = _ippFindOption(option->name)) != NULL) { if (match->group_tag != group_tag && match->alt_group_tag != group_tag) continue; if (match->operations) ops = match->operations; else if (group_tag == IPP_TAG_JOB) ops = ipp_job_creation; else if (group_tag == IPP_TAG_DOCUMENT) ops = ipp_doc_creation; else if (group_tag == IPP_TAG_SUBSCRIPTION) ops = ipp_sub_creation; else if (group_tag == IPP_TAG_PRINTER) ops = ipp_set_printer; else { DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name)); continue; } } else { int namelen; /* Length of name */ namelen = (int)strlen(option->name); if (namelen < 10 || (strcmp(option->name + namelen - 8, "-default") && strcmp(option->name + namelen - 10, "-supported"))) { if (group_tag != IPP_TAG_JOB && group_tag != IPP_TAG_DOCUMENT) { DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name)); continue; } } else if (group_tag != IPP_TAG_PRINTER) { DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name)); continue; } if (group_tag == IPP_TAG_JOB) ops = ipp_job_creation; else if (group_tag == IPP_TAG_DOCUMENT) ops = ipp_doc_creation; else ops = ipp_set_printer; } /* * Verify that we send this attribute for this operation... */ while (*ops != IPP_OP_CUPS_NONE) if (op == *ops) break; else ops ++; if (*ops == IPP_OP_CUPS_NONE && op != IPP_OP_CUPS_NONE) { DEBUG_printf(("2cupsEncodeOptions2: Skipping \"%s\".", option->name)); continue; } _cupsEncodeOption(ipp, group_tag, match, option->name, option->value); } } #ifdef DEBUG /* * '_ippCheckOptions()' - Validate that the option array is sorted properly. */ const char * /* O - First out-of-order option or NULL */ _ippCheckOptions(void) { int i; /* Looping var */ for (i = 0; i < (int)(sizeof(ipp_options) / sizeof(ipp_options[0]) - 1); i ++) if (strcmp(ipp_options[i].name, ipp_options[i + 1].name) >= 0) return (ipp_options[i + 1].name); return (NULL); } #endif /* DEBUG */ /* * '_ippFindOption()' - Find the attribute information for an option. */ _ipp_option_t * /* O - Attribute information */ _ippFindOption(const char *name) /* I - Option/attribute name */ { _ipp_option_t key; /* Search key */ /* * Lookup the proper value and group tags for this option... */ key.name = name; return ((_ipp_option_t *)bsearch(&key, ipp_options, sizeof(ipp_options) / sizeof(ipp_options[0]), sizeof(ipp_options[0]), (int (*)(const void *, const void *)) compare_ipp_options)); } /* * 'compare_ipp_options()' - Compare two IPP options. */ static int /* O - Result of comparison */ compare_ipp_options(_ipp_option_t *a, /* I - First option */ _ipp_option_t *b) /* I - Second option */ { return (strcmp(a->name, b->name)); } cups-2.3.1/cups/dir.c000664 000765 000024 00000016367 13574721672 014510 0ustar00mikestaff000000 000000 /* * Directory routines for CUPS. * * This set of APIs abstracts enumeration of directory entries. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2005 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "string-private.h" #include "debug-internal.h" #include "dir.h" /* * Windows implementation... */ #ifdef _WIN32 # include /* * Types and structures... */ struct _cups_dir_s /**** Directory data structure ****/ { char directory[1024]; /* Directory filename */ HANDLE dir; /* Directory handle */ cups_dentry_t entry; /* Directory entry */ }; /* * '_cups_dir_time()' - Convert a FILETIME value to a UNIX time value. */ time_t /* O - UNIX time */ _cups_dir_time(FILETIME ft) /* I - File time */ { ULONGLONG val; /* File time in 0.1 usecs */ /* * Convert file time (1/10 microseconds since Jan 1, 1601) to UNIX * time (seconds since Jan 1, 1970). There are 11,644,732,800 seconds * between them... */ val = ft.dwLowDateTime + ((ULONGLONG)ft.dwHighDateTime << 32); return ((time_t)(val / 10000000 - 11644732800)); } /* * 'cupsDirClose()' - Close a directory. * * @since CUPS 1.2/macOS 10.5@ */ void cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */ { /* * Range check input... */ if (!dp) return; /* * Close an open directory handle... */ if (dp->dir != INVALID_HANDLE_VALUE) FindClose(dp->dir); /* * Free memory used... */ free(dp); } /* * 'cupsDirOpen()' - Open a directory. * * @since CUPS 1.2/macOS 10.5@ */ cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */ cupsDirOpen(const char *directory) /* I - Directory name */ { cups_dir_t *dp; /* Directory */ /* * Range check input... */ if (!directory) return (NULL); /* * Allocate memory for the directory structure... */ dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t)); if (!dp) return (NULL); /* * Copy the directory name for later use... */ dp->dir = INVALID_HANDLE_VALUE; strlcpy(dp->directory, directory, sizeof(dp->directory)); /* * Return the new directory structure... */ return (dp); } /* * 'cupsDirRead()' - Read the next directory entry. * * @since CUPS 1.2/macOS 10.5@ */ cups_dentry_t * /* O - Directory entry or @code NULL@ if there are no more */ cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */ { WIN32_FIND_DATAA entry; /* Directory entry data */ /* * Range check input... */ if (!dp) return (NULL); /* * See if we have already started finding files... */ if (dp->dir == INVALID_HANDLE_VALUE) { /* * No, find the first file... */ dp->dir = FindFirstFileA(dp->directory, &entry); if (dp->dir == INVALID_HANDLE_VALUE) return (NULL); } else if (!FindNextFileA(dp->dir, &entry)) return (NULL); /* * Copy the name over and convert the file information... */ strlcpy(dp->entry.filename, entry.cFileName, sizeof(dp->entry.filename)); if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) dp->entry.fileinfo.st_mode = 0755 | S_IFDIR; else dp->entry.fileinfo.st_mode = 0644; dp->entry.fileinfo.st_atime = _cups_dir_time(entry.ftLastAccessTime); dp->entry.fileinfo.st_ctime = _cups_dir_time(entry.ftCreationTime); dp->entry.fileinfo.st_mtime = _cups_dir_time(entry.ftLastWriteTime); dp->entry.fileinfo.st_size = entry.nFileSizeLow + ((unsigned long long)entry.nFileSizeHigh << 32); /* * Return the entry... */ return (&(dp->entry)); } /* * 'cupsDirRewind()' - Rewind to the start of the directory. * * @since CUPS 1.2/macOS 10.5@ */ void cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */ { /* * Range check input... */ if (!dp) return; /* * Close an open directory handle... */ if (dp->dir != INVALID_HANDLE_VALUE) { FindClose(dp->dir); dp->dir = INVALID_HANDLE_VALUE; } } #else /* * POSIX implementation... */ # include # include /* * Types and structures... */ struct _cups_dir_s /**** Directory data structure ****/ { char directory[1024]; /* Directory filename */ DIR *dir; /* Directory file */ cups_dentry_t entry; /* Directory entry */ }; /* * 'cupsDirClose()' - Close a directory. * * @since CUPS 1.2/macOS 10.5@ */ void cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */ { DEBUG_printf(("cupsDirClose(dp=%p)", (void *)dp)); /* * Range check input... */ if (!dp) return; /* * Close the directory and free memory... */ closedir(dp->dir); free(dp); } /* * 'cupsDirOpen()' - Open a directory. * * @since CUPS 1.2/macOS 10.5@ */ cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */ cupsDirOpen(const char *directory) /* I - Directory name */ { cups_dir_t *dp; /* Directory */ DEBUG_printf(("cupsDirOpen(directory=\"%s\")", directory)); /* * Range check input... */ if (!directory) return (NULL); /* * Allocate memory for the directory structure... */ dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t)); if (!dp) return (NULL); /* * Open the directory... */ dp->dir = opendir(directory); if (!dp->dir) { free(dp); return (NULL); } /* * Copy the directory name for later use... */ strlcpy(dp->directory, directory, sizeof(dp->directory)); /* * Return the new directory structure... */ return (dp); } /* * 'cupsDirRead()' - Read the next directory entry. * * @since CUPS 1.2/macOS 10.5@ */ cups_dentry_t * /* O - Directory entry or @code NULL@ when there are no more */ cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */ { struct dirent *entry; /* Pointer to entry */ char filename[1024]; /* Full filename */ DEBUG_printf(("2cupsDirRead(dp=%p)", (void *)dp)); /* * Range check input... */ if (!dp) return (NULL); /* * Try reading an entry that is not "." or ".."... */ for (;;) { /* * Read the next entry... */ if ((entry = readdir(dp->dir)) == NULL) { DEBUG_puts("3cupsDirRead: readdir() returned a NULL pointer!"); return (NULL); } DEBUG_printf(("4cupsDirRead: readdir() returned \"%s\"...", entry->d_name)); /* * Skip "." and ".."... */ if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) continue; /* * Copy the name over and get the file information... */ strlcpy(dp->entry.filename, entry->d_name, sizeof(dp->entry.filename)); snprintf(filename, sizeof(filename), "%s/%s", dp->directory, entry->d_name); if (stat(filename, &(dp->entry.fileinfo))) { DEBUG_printf(("3cupsDirRead: stat() failed for \"%s\" - %s...", filename, strerror(errno))); continue; } /* * Return the entry... */ return (&(dp->entry)); } } /* * 'cupsDirRewind()' - Rewind to the start of the directory. * * @since CUPS 1.2/macOS 10.5@ */ void cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */ { DEBUG_printf(("cupsDirRewind(dp=%p)", (void *)dp)); /* * Range check input... */ if (!dp) return; /* * Rewind the directory... */ rewinddir(dp->dir); } #endif /* _WIN32 */ cups-2.3.1/cups/api-ppd.shtml000664 000765 000024 00000021456 13574721672 016164 0ustar00mikestaff000000 000000

Overview

Note:

The PPD API was deprecated in CUPS 1.6/macOS 10.8. Please use the new Job Ticket APIs in the CUPS Programming Manual documentation. These functions will be removed in a future release of CUPS.

The CUPS PPD API provides read-only access the data in PostScript Printer Description ("PPD") files which are used for all printers with a driver. With it you can obtain the data necessary to display printer options to users, mark option choices and check for conflicting choices, and output marked choices in PostScript output. The ppd_file_t structure contains all of the information in a PPD file.

Note:

The CUPS PPD API uses the terms "option" and "choice" instead of the Adobe terms "MainKeyword" and "OptionKeyword" to refer to specific printer options and features. CUPS also treats option ("MainKeyword") and choice ("OptionKeyword") values as case-insensitive strings, so option "InputSlot" and choice "Upper" are equivalent to "inputslot" and "upper", respectively.

Loading a PPD File

The ppdOpenFile function "opens" a PPD file and loads it into memory. For example, the following code opens the current printer's PPD file in a CUPS filter:

#include <cups/ppd.h>

ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));

The return value is a pointer to a new ppd_file_t structure or NULL if the PPD file does not exist or cannot be loaded. The ppdClose function frees the memory used by the structure:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdClose(ppd);

Once closed, pointers to the ppd_file_t structure and any data in it will no longer be valid.

Options and Groups

PPD files support multiple options, which are stored in arrays of ppd_option_t and ppd_choice_t structures.

Each option in turn is associated with a group stored in a ppd_group_t structure. Groups can be specified in the PPD file; if an option is not associated with a group then it is put in an automatically-generated "General" group. Groups can also have sub-groups, however CUPS currently ignores sub-groups because of past abuses of this functionality.

Option choices are selected by marking them using one of three functions. The first is ppdMarkDefaults which selects all of the default options in the PPD file:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdMarkDefaults(ppd);

The second is ppdMarkOption which selects a single option choice in the PPD file. For example, the following code selects the upper paper tray:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdMarkOption(ppd, "InputSlot", "Upper");

The last function is cupsMarkOptions which selects multiple option choices in the PPD file from an array of CUPS options, mapping IPP attributes like "media" and "sides" to their corresponding PPD options. You typically use this function in a print filter with cupsParseOptions and ppdMarkDefaults to select all of the option choices needed for the job, for example:

#include <cups/ppd.h>

ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
cups_option_t *options = NULL;
int num_options = cupsParseOptions(argv[5], 0, &options);

ppdMarkDefaults(ppd);
cupsMarkOptions(ppd, num_options, options);
cupsFreeOptions(num_options, options);

Constraints

PPD files support specification of conflict conditions, called constraints, between different options. Constraints are stored in an array of ppd_const_t structures which specify the options and choices that conflict with each other. The ppdConflicts function tells you how many of the selected options are incompatible. Since constraints are normally specified in pairs, the returned value is typically an even number.

Page Sizes

Page sizes are special options which have physical dimensions and margins associated with them. The size information is stored in ppd_size_t structures and is available by looking up the named size with the ppdPageSize function. The page size and margins are returned in units called points; there are 72 points per inch. If you pass NULL for the size, the currently selected size is returned:

#include <cups/ppd.h>

ppd_file_t *ppd;
ppd_size_t *size = ppdPageSize(ppd, NULL);

Besides the standard page sizes listed in a PPD file, some printers support variable or custom page sizes. Custom page sizes are supported if the variables_sizes member of the ppd_file_t structure is non-zero. The custom_min, custom_max, and custom_margins members of the ppd_file_t structure define the limits of the printable area. To get the resulting media size, use a page size string of the form "Custom.widthxlength", where "width" and "length" are in points. Custom page size names can also be specified in inches ("Custom.widthxheightin"), centimeters ("Custom.widthxheightcm"), or millimeters ("Custom.widthxheightmm"):

#include <cups/ppd.h>

ppd_file_t *ppd;

/* Get an 576x720 point custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.576x720");

/* Get an 8x10 inch custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.8x10in");

/* Get a 100x200 millimeter custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.100x200mm");

/* Get a 12.7x34.5 centimeter custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.12.7x34.5cm");

If the PPD does not support variable page sizes, the ppdPageSize function will return NULL.

Attributes

Every PPD file is composed of one or more attributes. Most of these attributes are used to define groups, options, choices, and page sizes, however several informational attributes may be present which you can access in your program or filter. Attributes normally look like one of the following examples in a PPD file:

*name: "value"
*name spec: "value"
*name spec/text: "value"

The ppdFindAttr and ppdFindNextAttr functions find the first and next instances, respectively, of the named attribute with the given "spec" string and return a ppd_attr_t structure. If you provide a NULL specifier string, all attributes with the given name will be returned. For example, the following code lists all of the Product attributes in a PPD file:

#include <cups/ppd.h>

ppd_file_t *ppd;
ppd_attr_t *attr;

for (attr = ppdFindAttr(ppd, "Product", NULL);
     attr != NULL;
     attr = ppdFindNextAttr(ppd, "Product", NULL))
  puts(attr->value);
cups-2.3.1/cups/ppd-cache.c000664 000765 000024 00000476103 13574721672 015554 0ustar00mikestaff000000 000000 /* * PPD cache implementation for CUPS. * * Copyright © 2010-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" #include /* * Macro to test for two almost-equal PWG measurements. */ #define _PWG_EQUIVALENT(x, y) (abs((x)-(y)) < 2) /* * Local functions... */ static int cups_get_url(http_t **http, const char *url, char *name, size_t namesize); static void pwg_add_finishing(cups_array_t *finishings, ipp_finishings_t template, const char *name, const char *value); static void pwg_add_message(cups_array_t *a, const char *msg, const char *str); static int pwg_compare_finishings(_pwg_finishings_t *a, _pwg_finishings_t *b); static int pwg_compare_sizes(cups_size_t *a, cups_size_t *b); static cups_size_t *pwg_copy_size(cups_size_t *size); static void pwg_free_finishings(_pwg_finishings_t *f); static void pwg_ppdize_name(const char *ipp, char *name, size_t namesize); static void pwg_ppdize_resolution(ipp_attribute_t *attr, int element, int *xres, int *yres, char *name, size_t namesize); static void pwg_unppdize_name(const char *ppd, char *name, size_t namesize, const char *dashchars); /* * '_cupsConvertOptions()' - Convert printer options to standard IPP attributes. * * This functions converts PPD and CUPS-specific options to their standard IPP * attributes and values and adds them to the specified IPP request. */ int /* O - New number of copies */ _cupsConvertOptions( ipp_t *request, /* I - IPP request */ ppd_file_t *ppd, /* I - PPD file */ _ppd_cache_t *pc, /* I - PPD cache info */ ipp_attribute_t *media_col_sup, /* I - media-col-supported values */ ipp_attribute_t *doc_handling_sup, /* I - multiple-document-handling-supported values */ ipp_attribute_t *print_color_mode_sup, /* I - Printer supports print-color-mode */ const char *user, /* I - User info */ const char *format, /* I - document-format value */ int copies, /* I - Number of copies */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { int i; /* Looping var */ const char *keyword, /* PWG keyword */ *password; /* Password string */ pwg_size_t *size; /* PWG media size */ ipp_t *media_col, /* media-col value */ *media_size; /* media-size value */ const char *media_source, /* media-source value */ *media_type, /* media-type value */ *collate_str, /* multiple-document-handling value */ *color_attr_name, /* Supported color attribute */ *mandatory, /* Mandatory attributes */ *finishing_template; /* Finishing template */ int num_finishings = 0, /* Number of finishing values */ finishings[10]; /* Finishing enum values */ ppd_choice_t *choice; /* Marked choice */ int finishings_copies = copies; /* Number of copies for finishings */ /* * Send standard IPP attributes... */ if (pc->password && (password = cupsGetOption("job-password", num_options, options)) != NULL && ippGetOperation(request) != IPP_OP_VALIDATE_JOB) { ipp_attribute_t *attr = NULL; /* job-password attribute */ if ((keyword = cupsGetOption("job-password-encryption", num_options, options)) == NULL) keyword = "none"; if (!strcmp(keyword, "none")) { /* * Add plain-text job-password... */ attr = ippAddOctetString(request, IPP_TAG_OPERATION, "job-password", password, (int)strlen(password)); } else { /* * Add hashed job-password... */ unsigned char hash[64]; /* Hash of password */ ssize_t hashlen; /* Length of hash */ if ((hashlen = cupsHashData(keyword, password, strlen(password), hash, sizeof(hash))) > 0) attr = ippAddOctetString(request, IPP_TAG_OPERATION, "job-password", hash, (int)hashlen); } if (attr) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "job-password-encryption", NULL, keyword); } if (pc->account_id) { if ((keyword = cupsGetOption("job-account-id", num_options, options)) == NULL) keyword = cupsGetOption("job-billing", num_options, options); if (keyword) ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-account-id", NULL, keyword); } if (pc->accounting_user_id) { if ((keyword = cupsGetOption("job-accounting-user-id", num_options, options)) == NULL) keyword = user; if (keyword) ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-accounting-user-id", NULL, keyword); } for (mandatory = (const char *)cupsArrayFirst(pc->mandatory); mandatory; mandatory = (const char *)cupsArrayNext(pc->mandatory)) { if (strcmp(mandatory, "copies") && strcmp(mandatory, "destination-uris") && strcmp(mandatory, "finishings") && strcmp(mandatory, "finishings-col") && strcmp(mandatory, "finishing-template") && strcmp(mandatory, "job-account-id") && strcmp(mandatory, "job-accounting-user-id") && strcmp(mandatory, "job-password") && strcmp(mandatory, "job-password-encryption") && strcmp(mandatory, "media") && strncmp(mandatory, "media-col", 9) && strcmp(mandatory, "multiple-document-handling") && strcmp(mandatory, "output-bin") && strcmp(mandatory, "print-color-mode") && strcmp(mandatory, "print-quality") && strcmp(mandatory, "sides") && (keyword = cupsGetOption(mandatory, num_options, options)) != NULL) { _ipp_option_t *opt = _ippFindOption(mandatory); /* Option type */ ipp_tag_t value_tag = opt ? opt->value_tag : IPP_TAG_NAME; /* Value type */ switch (value_tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : ippAddInteger(request, IPP_TAG_JOB, value_tag, mandatory, atoi(keyword)); break; case IPP_TAG_BOOLEAN : ippAddBoolean(request, IPP_TAG_JOB, mandatory, !_cups_strcasecmp(keyword, "true")); break; case IPP_TAG_RANGE : { int lower, upper; /* Range */ if (sscanf(keyword, "%d-%d", &lower, &upper) != 2) lower = upper = atoi(keyword); ippAddRange(request, IPP_TAG_JOB, mandatory, lower, upper); } break; case IPP_TAG_STRING : ippAddOctetString(request, IPP_TAG_JOB, mandatory, keyword, (int)strlen(keyword)); break; default : if (!strcmp(mandatory, "print-color-mode") && !strcmp(keyword, "monochrome")) { if (ippContainsString(print_color_mode_sup, "auto-monochrome")) keyword = "auto-monochrome"; else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome")) keyword = "process-monochrome"; } ippAddString(request, IPP_TAG_JOB, value_tag, mandatory, NULL, keyword); break; } } } if ((keyword = cupsGetOption("PageSize", num_options, options)) == NULL) keyword = cupsGetOption("media", num_options, options); media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot", num_options, options)); media_type = _ppdCacheGetType(pc, cupsGetOption("MediaType", num_options, options)); size = _ppdCacheGetSize(pc, keyword); if (size || media_source || media_type) { /* * Add a media-col value... */ media_col = ippNew(); if (size) { media_size = ippNew(); ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", size->width); ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", size->length); ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size); } for (i = 0; i < media_col_sup->num_values; i ++) { if (size && !strcmp(media_col_sup->values[i].string.text, "media-left-margin")) ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-left-margin", size->left); else if (size && !strcmp(media_col_sup->values[i].string.text, "media-bottom-margin")) ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-bottom-margin", size->bottom); else if (size && !strcmp(media_col_sup->values[i].string.text, "media-right-margin")) ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-right-margin", size->right); else if (size && !strcmp(media_col_sup->values[i].string.text, "media-top-margin")) ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, "media-top-margin", size->top); else if (media_source && !strcmp(media_col_sup->values[i].string.text, "media-source")) ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, "media-source", NULL, media_source); else if (media_type && !strcmp(media_col_sup->values[i].string.text, "media-type")) ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, "media-type", NULL, media_type); } ippAddCollection(request, IPP_TAG_JOB, "media-col", media_col); } if ((keyword = cupsGetOption("output-bin", num_options, options)) == NULL) { if ((choice = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL) keyword = _ppdCacheGetBin(pc, choice->choice); } if (keyword) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin", NULL, keyword); color_attr_name = print_color_mode_sup ? "print-color-mode" : "output-mode"; if ((keyword = cupsGetOption("print-color-mode", num_options, options)) == NULL) { if ((choice = ppdFindMarkedChoice(ppd, "ColorModel")) != NULL) { if (!_cups_strcasecmp(choice->choice, "Gray")) keyword = "monochrome"; else keyword = "color"; } } if (keyword && !strcmp(keyword, "monochrome")) { if (ippContainsString(print_color_mode_sup, "auto-monochrome")) keyword = "auto-monochrome"; else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome")) keyword = "process-monochrome"; } if (keyword) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, color_attr_name, NULL, keyword); if ((keyword = cupsGetOption("print-quality", num_options, options)) != NULL) ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", atoi(keyword)); else if ((choice = ppdFindMarkedChoice(ppd, "cupsPrintQuality")) != NULL) { if (!_cups_strcasecmp(choice->choice, "draft")) ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_DRAFT); else if (!_cups_strcasecmp(choice->choice, "normal")) ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_NORMAL); else if (!_cups_strcasecmp(choice->choice, "high")) ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_HIGH); } if ((keyword = cupsGetOption("sides", num_options, options)) != NULL) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, keyword); else if (pc->sides_option && (choice = ppdFindMarkedChoice(ppd, pc->sides_option)) != NULL) { if (pc->sides_1sided && !_cups_strcasecmp(choice->choice, pc->sides_1sided)) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "one-sided"); else if (pc->sides_2sided_long && !_cups_strcasecmp(choice->choice, pc->sides_2sided_long)) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "two-sided-long-edge"); else if (pc->sides_2sided_short && !_cups_strcasecmp(choice->choice, pc->sides_2sided_short)) ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "two-sided-short-edge"); } /* * Copies... */ if ((keyword = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) { if (strstr(keyword, "uncollated")) keyword = "false"; else keyword = "true"; } else if ((keyword = cupsGetOption("collate", num_options, options)) == NULL) keyword = "true"; if (format) { if (!_cups_strcasecmp(format, "image/gif") || !_cups_strcasecmp(format, "image/jp2") || !_cups_strcasecmp(format, "image/jpeg") || !_cups_strcasecmp(format, "image/png") || !_cups_strcasecmp(format, "image/tiff") || !_cups_strncasecmp(format, "image/x-", 8)) { /* * Collation makes no sense for single page image formats... */ keyword = "false"; } else if (!_cups_strncasecmp(format, "image/", 6) || !_cups_strcasecmp(format, "application/vnd.cups-raster")) { /* * Multi-page image formats will have copies applied by the upstream * filters... */ copies = 1; } } if (doc_handling_sup) { if (!_cups_strcasecmp(keyword, "true")) collate_str = "separate-documents-collated-copies"; else collate_str = "separate-documents-uncollated-copies"; for (i = 0; i < doc_handling_sup->num_values; i ++) { if (!strcmp(doc_handling_sup->values[i].string.text, collate_str)) { ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "multiple-document-handling", NULL, collate_str); break; } } if (i >= doc_handling_sup->num_values) copies = 1; } /* * Map finishing options... */ if ((finishing_template = cupsGetOption("cupsFinishingTemplate", num_options, options)) == NULL) finishing_template = cupsGetOption("finishing-template", num_options, options); if (finishing_template && strcmp(finishing_template, "none")) { ipp_t *fin_col = ippNew(); /* finishings-col value */ ippAddString(fin_col, IPP_TAG_JOB, IPP_TAG_KEYWORD, "finishing-template", NULL, finishing_template); ippAddCollection(request, IPP_TAG_JOB, "finishings-col", fin_col); ippDelete(fin_col); if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL) { /* * Send job-pages-per-set attribute to apply finishings correctly... */ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies); } } else { num_finishings = _ppdCacheGetFinishingValues(ppd, pc, (int)(sizeof(finishings) / sizeof(finishings[0])), finishings); if (num_finishings > 0) { ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings); if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL) { /* * Send job-pages-per-set attribute to apply finishings correctly... */ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies); } } } return (copies); } /* * '_ppdCacheCreateWithFile()' - Create PPD cache and mapping data from a * written file. * * Use the @link _ppdCacheWriteFile@ function to write PWG mapping data to a * file. */ _ppd_cache_t * /* O - PPD cache and mapping data */ _ppdCacheCreateWithFile( const char *filename, /* I - File to read */ ipp_t **attrs) /* IO - IPP attributes, if any */ { cups_file_t *fp; /* File */ _ppd_cache_t *pc; /* PWG mapping data */ pwg_size_t *size; /* Current size */ pwg_map_t *map; /* Current map */ _pwg_finishings_t *finishings; /* Current finishings option */ int linenum, /* Current line number */ num_bins, /* Number of bins in file */ num_sizes, /* Number of sizes in file */ num_sources, /* Number of sources in file */ num_types; /* Number of types in file */ char line[2048], /* Current line */ *value, /* Pointer to value in line */ *valueptr, /* Pointer into value */ pwg_keyword[128], /* PWG keyword */ ppd_keyword[PPD_MAX_NAME]; /* PPD keyword */ _pwg_print_color_mode_t print_color_mode; /* Print color mode for preset */ _pwg_print_quality_t print_quality; /* Print quality for preset */ DEBUG_printf(("_ppdCacheCreateWithFile(filename=\"%s\")", filename)); /* * Range check input... */ if (attrs) *attrs = NULL; if (!filename) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Open the file... */ if ((fp = cupsFileOpen(filename, "r")) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } /* * Read the first line and make sure it has "#CUPS-PPD-CACHE-version" in it... */ if (!cupsFileGets(fp, line, sizeof(line))) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); DEBUG_puts("_ppdCacheCreateWithFile: Unable to read first line."); cupsFileClose(fp); return (NULL); } if (strncmp(line, "#CUPS-PPD-CACHE-", 16)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); DEBUG_printf(("_ppdCacheCreateWithFile: Wrong first line \"%s\".", line)); cupsFileClose(fp); return (NULL); } if (atoi(line + 16) != _PPD_CACHE_VERSION) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Out of date PPD cache file."), 1); DEBUG_printf(("_ppdCacheCreateWithFile: Cache file has version %s, " "expected %d.", line + 16, _PPD_CACHE_VERSION)); cupsFileClose(fp); return (NULL); } /* * Allocate the mapping data structure... */ if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); DEBUG_puts("_ppdCacheCreateWithFile: Unable to allocate _ppd_cache_t."); goto create_error; } pc->max_copies = 9999; /* * Read the file... */ linenum = 0; num_bins = 0; num_sizes = 0; num_sources = 0; num_types = 0; while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { DEBUG_printf(("_ppdCacheCreateWithFile: line=\"%s\", value=\"%s\", " "linenum=%d", line, value, linenum)); if (!value) { DEBUG_printf(("_ppdCacheCreateWithFile: Missing value on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } else if (!_cups_strcasecmp(line, "Filter")) { if (!pc->filters) pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); cupsArrayAdd(pc->filters, value); } else if (!_cups_strcasecmp(line, "PreFilter")) { if (!pc->prefilters) pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); cupsArrayAdd(pc->prefilters, value); } else if (!_cups_strcasecmp(line, "Product")) { pc->product = strdup(value); } else if (!_cups_strcasecmp(line, "SingleFile")) { pc->single_file = !_cups_strcasecmp(value, "true"); } else if (!_cups_strcasecmp(line, "IPP")) { off_t pos = cupsFileTell(fp), /* Position in file */ length = strtol(value, NULL, 10); /* Length of IPP attributes */ if (attrs && *attrs) { DEBUG_puts("_ppdCacheCreateWithFile: IPP listed multiple times."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } else if (length <= 0) { DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP length."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (attrs) { /* * Read IPP attributes into the provided variable... */ *attrs = ippNew(); if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, *attrs) != IPP_STATE_DATA) { DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } } else { /* * Skip the IPP data entirely... */ cupsFileSeek(fp, pos + length); } if (cupsFileTell(fp) != (pos + length)) { DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } } else if (!_cups_strcasecmp(line, "NumBins")) { if (num_bins > 0) { DEBUG_puts("_ppdCacheCreateWithFile: NumBins listed multiple times."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((num_bins = atoi(value)) <= 0 || num_bins > 65536) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumBins value %d on line " "%d.", num_sizes, linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((pc->bins = calloc((size_t)num_bins, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d bins.", num_sizes)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); goto create_error; } } else if (!_cups_strcasecmp(line, "Bin")) { if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad Bin on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (pc->num_bins >= num_bins) { DEBUG_printf(("_ppdCacheCreateWithFile: Too many Bin's on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } map = pc->bins + pc->num_bins; map->pwg = strdup(pwg_keyword); map->ppd = strdup(ppd_keyword); pc->num_bins ++; } else if (!_cups_strcasecmp(line, "NumSizes")) { if (num_sizes > 0) { DEBUG_puts("_ppdCacheCreateWithFile: NumSizes listed multiple times."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((num_sizes = atoi(value)) < 0 || num_sizes > 65536) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSizes value %d on line " "%d.", num_sizes, linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (num_sizes > 0) { if ((pc->sizes = calloc((size_t)num_sizes, sizeof(pwg_size_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sizes.", num_sizes)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); goto create_error; } } } else if (!_cups_strcasecmp(line, "Size")) { if (pc->num_sizes >= num_sizes) { DEBUG_printf(("_ppdCacheCreateWithFile: Too many Size's on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } size = pc->sizes + pc->num_sizes; if (sscanf(value, "%127s%40s%d%d%d%d%d%d", pwg_keyword, ppd_keyword, &(size->width), &(size->length), &(size->left), &(size->bottom), &(size->right), &(size->top)) != 8) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad Size on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } size->map.pwg = strdup(pwg_keyword); size->map.ppd = strdup(ppd_keyword); pc->num_sizes ++; } else if (!_cups_strcasecmp(line, "CustomSize")) { if (pc->custom_max_width > 0) { DEBUG_printf(("_ppdCacheCreateWithFile: Too many CustomSize's on line " "%d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (sscanf(value, "%d%d%d%d%d%d%d%d", &(pc->custom_max_width), &(pc->custom_max_length), &(pc->custom_min_width), &(pc->custom_min_length), &(pc->custom_size.left), &(pc->custom_size.bottom), &(pc->custom_size.right), &(pc->custom_size.top)) != 8) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad CustomSize on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max", pc->custom_max_width, pc->custom_max_length, NULL); pc->custom_max_keyword = strdup(pwg_keyword); pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min", pc->custom_min_width, pc->custom_min_length, NULL); pc->custom_min_keyword = strdup(pwg_keyword); } else if (!_cups_strcasecmp(line, "SourceOption")) { pc->source_option = strdup(value); } else if (!_cups_strcasecmp(line, "NumSources")) { if (num_sources > 0) { DEBUG_puts("_ppdCacheCreateWithFile: NumSources listed multiple " "times."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((num_sources = atoi(value)) <= 0 || num_sources > 65536) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSources value %d on " "line %d.", num_sources, linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((pc->sources = calloc((size_t)num_sources, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sources.", num_sources)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); goto create_error; } } else if (!_cups_strcasecmp(line, "Source")) { if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad Source on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (pc->num_sources >= num_sources) { DEBUG_printf(("_ppdCacheCreateWithFile: Too many Source's on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } map = pc->sources + pc->num_sources; map->pwg = strdup(pwg_keyword); map->ppd = strdup(ppd_keyword); pc->num_sources ++; } else if (!_cups_strcasecmp(line, "NumTypes")) { if (num_types > 0) { DEBUG_puts("_ppdCacheCreateWithFile: NumTypes listed multiple times."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((num_types = atoi(value)) <= 0 || num_types > 65536) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumTypes value %d on " "line %d.", num_types, linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if ((pc->types = calloc((size_t)num_types, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d types.", num_types)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); goto create_error; } } else if (!_cups_strcasecmp(line, "Type")) { if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad Type on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (pc->num_types >= num_types) { DEBUG_printf(("_ppdCacheCreateWithFile: Too many Type's on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } map = pc->types + pc->num_types; map->pwg = strdup(pwg_keyword); map->ppd = strdup(ppd_keyword); pc->num_types ++; } else if (!_cups_strcasecmp(line, "Preset")) { /* * Preset output-mode print-quality name=value ... */ print_color_mode = (_pwg_print_color_mode_t)strtol(value, &valueptr, 10); print_quality = (_pwg_print_quality_t)strtol(valueptr, &valueptr, 10); if (print_color_mode < _PWG_PRINT_COLOR_MODE_MONOCHROME || print_color_mode >= _PWG_PRINT_COLOR_MODE_MAX || print_quality < _PWG_PRINT_QUALITY_DRAFT || print_quality >= _PWG_PRINT_QUALITY_MAX || valueptr == value || !*valueptr) { DEBUG_printf(("_ppdCacheCreateWithFile: Bad Preset on line %d.", linenum)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } pc->num_presets[print_color_mode][print_quality] = cupsParseOptions(valueptr, 0, pc->presets[print_color_mode] + print_quality); } else if (!_cups_strcasecmp(line, "SidesOption")) pc->sides_option = strdup(value); else if (!_cups_strcasecmp(line, "Sides1Sided")) pc->sides_1sided = strdup(value); else if (!_cups_strcasecmp(line, "Sides2SidedLong")) pc->sides_2sided_long = strdup(value); else if (!_cups_strcasecmp(line, "Sides2SidedShort")) pc->sides_2sided_short = strdup(value); else if (!_cups_strcasecmp(line, "Finishings")) { if (!pc->finishings) pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_finishings); if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL) goto create_error; finishings->value = (ipp_finishings_t)strtol(value, &valueptr, 10); finishings->num_options = cupsParseOptions(valueptr, 0, &(finishings->options)); cupsArrayAdd(pc->finishings, finishings); } else if (!_cups_strcasecmp(line, "FinishingTemplate")) { if (!pc->templates) pc->templates = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); cupsArrayAdd(pc->templates, value); } else if (!_cups_strcasecmp(line, "MaxCopies")) pc->max_copies = atoi(value); else if (!_cups_strcasecmp(line, "ChargeInfoURI")) pc->charge_info_uri = strdup(value); else if (!_cups_strcasecmp(line, "JobAccountId")) pc->account_id = !_cups_strcasecmp(value, "true"); else if (!_cups_strcasecmp(line, "JobAccountingUserId")) pc->accounting_user_id = !_cups_strcasecmp(value, "true"); else if (!_cups_strcasecmp(line, "JobPassword")) pc->password = strdup(value); else if (!_cups_strcasecmp(line, "Mandatory")) { if (pc->mandatory) _cupsArrayAddStrings(pc->mandatory, value, ' '); else pc->mandatory = _cupsArrayNewStrings(value, ' '); } else if (!_cups_strcasecmp(line, "SupportFile")) { if (!pc->support_files) pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); cupsArrayAdd(pc->support_files, value); } else { DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line, linenum)); } } if (pc->num_sizes < num_sizes) { DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sizes (%d < %d).", pc->num_sizes, num_sizes)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (pc->num_sources < num_sources) { DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sources (%d < %d).", pc->num_sources, num_sources)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } if (pc->num_types < num_types) { DEBUG_printf(("_ppdCacheCreateWithFile: Not enough types (%d < %d).", pc->num_types, num_types)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1); goto create_error; } cupsFileClose(fp); return (pc); /* * If we get here the file was bad - free any data and return... */ create_error: cupsFileClose(fp); _ppdCacheDestroy(pc); if (attrs) { ippDelete(*attrs); *attrs = NULL; } return (NULL); } /* * '_ppdCacheCreateWithPPD()' - Create PWG mapping data from a PPD file. */ _ppd_cache_t * /* O - PPD cache and mapping data */ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */ { int i, j, k; /* Looping vars */ _ppd_cache_t *pc; /* PWG mapping data */ ppd_option_t *input_slot, /* InputSlot option */ *media_type, /* MediaType option */ *output_bin, /* OutputBin option */ *color_model, /* ColorModel option */ *duplex, /* Duplex option */ *ppd_option; /* Other PPD option */ ppd_choice_t *choice; /* Current InputSlot/MediaType */ pwg_map_t *map; /* Current source/type map */ ppd_attr_t *ppd_attr; /* Current PPD preset attribute */ int num_options; /* Number of preset options and props */ cups_option_t *options; /* Preset options and properties */ ppd_size_t *ppd_size; /* Current PPD size */ pwg_size_t *pwg_size; /* Current PWG size */ char pwg_keyword[3 + PPD_MAX_NAME + 1 + 12 + 1 + 12 + 3], /* PWG keyword string */ ppd_name[PPD_MAX_NAME]; /* Normalized PPD name */ const char *pwg_name; /* Standard PWG media name */ pwg_media_t *pwg_media; /* PWG media data */ _pwg_print_color_mode_t pwg_print_color_mode; /* print-color-mode index */ _pwg_print_quality_t pwg_print_quality; /* print-quality index */ int similar; /* Are the old and new size similar? */ pwg_size_t *old_size; /* Current old size */ int old_imageable, /* Old imageable length in 2540ths */ old_borderless, /* Old borderless state */ old_known_pwg; /* Old PWG name is well-known */ int new_width, /* New width in 2540ths */ new_length, /* New length in 2540ths */ new_left, /* New left margin in 2540ths */ new_bottom, /* New bottom margin in 2540ths */ new_right, /* New right margin in 2540ths */ new_top, /* New top margin in 2540ths */ new_imageable, /* New imageable length in 2540ths */ new_borderless, /* New borderless state */ new_known_pwg; /* New PWG name is well-known */ pwg_size_t *new_size; /* New size to add, if any */ const char *filter; /* Current filter */ _pwg_finishings_t *finishings; /* Current finishings value */ char msg_id[256]; /* Message identifier */ DEBUG_printf(("_ppdCacheCreateWithPPD(ppd=%p)", ppd)); /* * Range check input... */ if (!ppd) return (NULL); /* * Allocate memory... */ if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL) { DEBUG_puts("_ppdCacheCreateWithPPD: Unable to allocate _ppd_cache_t."); goto create_error; } pc->strings = _cupsMessageNew(NULL); /* * Copy and convert size data... */ if (ppd->num_sizes > 0) { if ((pc->sizes = calloc((size_t)ppd->num_sizes, sizeof(pwg_size_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " "pwg_size_t's.", ppd->num_sizes)); goto create_error; } for (i = ppd->num_sizes, pwg_size = pc->sizes, ppd_size = ppd->sizes; i > 0; i --, ppd_size ++) { /* * Don't copy over custom size... */ if (!_cups_strcasecmp(ppd_size->name, "Custom")) continue; /* * Convert the PPD size name to the corresponding PWG keyword name. */ if ((pwg_media = pwgMediaForSize(PWG_FROM_POINTS(ppd_size->width), PWG_FROM_POINTS(ppd_size->length))) != NULL) { /* * Standard name, do we have conflicts? */ for (j = 0; j < pc->num_sizes; j ++) if (!strcmp(pc->sizes[j].map.pwg, pwg_media->pwg)) { pwg_media = NULL; break; } } if (pwg_media) { /* * Standard name and no conflicts, use it! */ pwg_name = pwg_media->pwg; new_known_pwg = 1; } else { /* * Not a standard name; convert it to a PWG vendor name of the form: * * pp_lowerppd_WIDTHxHEIGHTuu */ pwg_name = pwg_keyword; new_known_pwg = 0; pwg_unppdize_name(ppd_size->name, ppd_name, sizeof(ppd_name), "_."); pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name, PWG_FROM_POINTS(ppd_size->width), PWG_FROM_POINTS(ppd_size->length), NULL); } /* * If we have a similar paper with non-zero margins then we only want to * keep it if it has a larger imageable area length. The NULL check is for * dimensions that are <= 0... */ if ((pwg_media = _pwgMediaNearSize(PWG_FROM_POINTS(ppd_size->width), PWG_FROM_POINTS(ppd_size->length), 0)) == NULL) continue; new_width = pwg_media->width; new_length = pwg_media->length; new_left = PWG_FROM_POINTS(ppd_size->left); new_bottom = PWG_FROM_POINTS(ppd_size->bottom); new_right = PWG_FROM_POINTS(ppd_size->width - ppd_size->right); new_top = PWG_FROM_POINTS(ppd_size->length - ppd_size->top); new_imageable = new_length - new_top - new_bottom; new_borderless = new_bottom == 0 && new_top == 0 && new_left == 0 && new_right == 0; for (k = pc->num_sizes, similar = 0, old_size = pc->sizes, new_size = NULL; k > 0 && !similar; k --, old_size ++) { old_imageable = old_size->length - old_size->top - old_size->bottom; old_borderless = old_size->left == 0 && old_size->bottom == 0 && old_size->right == 0 && old_size->top == 0; old_known_pwg = strncmp(old_size->map.pwg, "oe_", 3) && strncmp(old_size->map.pwg, "om_", 3); similar = old_borderless == new_borderless && _PWG_EQUIVALENT(old_size->width, new_width) && _PWG_EQUIVALENT(old_size->length, new_length); if (similar && (new_known_pwg || (!old_known_pwg && new_imageable > old_imageable))) { /* * The new paper has a larger imageable area so it could replace * the older paper. Regardless of the imageable area, we always * prefer the size with a well-known PWG name. */ new_size = old_size; free(old_size->map.ppd); free(old_size->map.pwg); } } if (!similar) { /* * The paper was unique enough to deserve its own entry so add it to the * end. */ new_size = pwg_size ++; pc->num_sizes ++; } if (new_size) { /* * Save this size... */ new_size->map.ppd = strdup(ppd_size->name); new_size->map.pwg = strdup(pwg_name); new_size->width = new_width; new_size->length = new_length; new_size->left = new_left; new_size->bottom = new_bottom; new_size->right = new_right; new_size->top = new_top; } } } if (ppd->variable_sizes) { /* * Generate custom size data... */ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max", PWG_FROM_POINTS(ppd->custom_max[0]), PWG_FROM_POINTS(ppd->custom_max[1]), NULL); pc->custom_max_keyword = strdup(pwg_keyword); pc->custom_max_width = PWG_FROM_POINTS(ppd->custom_max[0]); pc->custom_max_length = PWG_FROM_POINTS(ppd->custom_max[1]); pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min", PWG_FROM_POINTS(ppd->custom_min[0]), PWG_FROM_POINTS(ppd->custom_min[1]), NULL); pc->custom_min_keyword = strdup(pwg_keyword); pc->custom_min_width = PWG_FROM_POINTS(ppd->custom_min[0]); pc->custom_min_length = PWG_FROM_POINTS(ppd->custom_min[1]); pc->custom_size.left = PWG_FROM_POINTS(ppd->custom_margins[0]); pc->custom_size.bottom = PWG_FROM_POINTS(ppd->custom_margins[1]); pc->custom_size.right = PWG_FROM_POINTS(ppd->custom_margins[2]); pc->custom_size.top = PWG_FROM_POINTS(ppd->custom_margins[3]); } /* * Copy and convert InputSlot data... */ if ((input_slot = ppdFindOption(ppd, "InputSlot")) == NULL) input_slot = ppdFindOption(ppd, "HPPaperSource"); if (input_slot) { pc->source_option = strdup(input_slot->keyword); if ((pc->sources = calloc((size_t)input_slot->num_choices, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " "pwg_map_t's for InputSlot.", input_slot->num_choices)); goto create_error; } pc->num_sources = input_slot->num_choices; for (i = input_slot->num_choices, choice = input_slot->choices, map = pc->sources; i > 0; i --, choice ++, map ++) { if (!_cups_strncasecmp(choice->choice, "Auto", 4) || !_cups_strcasecmp(choice->choice, "Default")) pwg_name = "auto"; else if (!_cups_strcasecmp(choice->choice, "Cassette")) pwg_name = "main"; else if (!_cups_strcasecmp(choice->choice, "PhotoTray")) pwg_name = "photo"; else if (!_cups_strcasecmp(choice->choice, "CDTray")) pwg_name = "disc"; else if (!_cups_strncasecmp(choice->choice, "Multipurpose", 12) || !_cups_strcasecmp(choice->choice, "MP") || !_cups_strcasecmp(choice->choice, "MPTray")) pwg_name = "by-pass-tray"; else if (!_cups_strcasecmp(choice->choice, "LargeCapacity")) pwg_name = "large-capacity"; else if (!_cups_strncasecmp(choice->choice, "Lower", 5)) pwg_name = "bottom"; else if (!_cups_strncasecmp(choice->choice, "Middle", 6)) pwg_name = "middle"; else if (!_cups_strncasecmp(choice->choice, "Upper", 5)) pwg_name = "top"; else if (!_cups_strncasecmp(choice->choice, "Side", 4)) pwg_name = "side"; else if (!_cups_strcasecmp(choice->choice, "Roll")) pwg_name = "main-roll"; else { /* * Convert PPD name to lowercase... */ pwg_name = pwg_keyword; pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword), "_"); } map->pwg = strdup(pwg_name); map->ppd = strdup(choice->choice); /* * Add localized text for PWG keyword to message catalog... */ snprintf(msg_id, sizeof(msg_id), "media-source.%s", pwg_name); pwg_add_message(pc->strings, msg_id, choice->text); } } /* * Copy and convert MediaType data... */ if ((media_type = ppdFindOption(ppd, "MediaType")) != NULL) { if ((pc->types = calloc((size_t)media_type->num_choices, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " "pwg_map_t's for MediaType.", media_type->num_choices)); goto create_error; } pc->num_types = media_type->num_choices; for (i = media_type->num_choices, choice = media_type->choices, map = pc->types; i > 0; i --, choice ++, map ++) { if (!_cups_strncasecmp(choice->choice, "Auto", 4) || !_cups_strcasecmp(choice->choice, "Any") || !_cups_strcasecmp(choice->choice, "Default")) pwg_name = "auto"; else if (!_cups_strncasecmp(choice->choice, "Card", 4)) pwg_name = "cardstock"; else if (!_cups_strncasecmp(choice->choice, "Env", 3)) pwg_name = "envelope"; else if (!_cups_strncasecmp(choice->choice, "Gloss", 5)) pwg_name = "photographic-glossy"; else if (!_cups_strcasecmp(choice->choice, "HighGloss")) pwg_name = "photographic-high-gloss"; else if (!_cups_strcasecmp(choice->choice, "Matte")) pwg_name = "photographic-matte"; else if (!_cups_strncasecmp(choice->choice, "Plain", 5)) pwg_name = "stationery"; else if (!_cups_strncasecmp(choice->choice, "Coated", 6)) pwg_name = "stationery-coated"; else if (!_cups_strcasecmp(choice->choice, "Inkjet")) pwg_name = "stationery-inkjet"; else if (!_cups_strcasecmp(choice->choice, "Letterhead")) pwg_name = "stationery-letterhead"; else if (!_cups_strncasecmp(choice->choice, "Preprint", 8)) pwg_name = "stationery-preprinted"; else if (!_cups_strcasecmp(choice->choice, "Recycled")) pwg_name = "stationery-recycled"; else if (!_cups_strncasecmp(choice->choice, "Transparen", 10)) pwg_name = "transparency"; else { /* * Convert PPD name to lowercase... */ pwg_name = pwg_keyword; pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword), "_"); } map->pwg = strdup(pwg_name); map->ppd = strdup(choice->choice); /* * Add localized text for PWG keyword to message catalog... */ snprintf(msg_id, sizeof(msg_id), "media-type.%s", pwg_name); pwg_add_message(pc->strings, msg_id, choice->text); } } /* * Copy and convert OutputBin data... */ if ((output_bin = ppdFindOption(ppd, "OutputBin")) != NULL) { if ((pc->bins = calloc((size_t)output_bin->num_choices, sizeof(pwg_map_t))) == NULL) { DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " "pwg_map_t's for OutputBin.", output_bin->num_choices)); goto create_error; } pc->num_bins = output_bin->num_choices; for (i = output_bin->num_choices, choice = output_bin->choices, map = pc->bins; i > 0; i --, choice ++, map ++) { pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword), "_"); map->pwg = strdup(pwg_keyword); map->ppd = strdup(choice->choice); /* * Add localized text for PWG keyword to message catalog... */ snprintf(msg_id, sizeof(msg_id), "output-bin.%s", pwg_keyword); pwg_add_message(pc->strings, msg_id, choice->text); } } if ((ppd_attr = ppdFindAttr(ppd, "APPrinterPreset", NULL)) != NULL) { /* * Copy and convert APPrinterPreset (output-mode + print-quality) data... */ const char *quality, /* com.apple.print.preset.quality value */ *output_mode, /* com.apple.print.preset.output-mode value */ *color_model_val, /* ColorModel choice */ *graphicsType, /* com.apple.print.preset.graphicsType value */ *media_front_coating; /* com.apple.print.preset.media-front-coating value */ do { /* * Add localized text for PWG keyword to message catalog... */ snprintf(msg_id, sizeof(msg_id), "preset-name.%s", ppd_attr->spec); pwg_add_message(pc->strings, msg_id, ppd_attr->text); /* * Get the options for this preset... */ num_options = _ppdParseOptions(ppd_attr->value, 0, &options, _PPD_PARSE_ALL); if ((quality = cupsGetOption("com.apple.print.preset.quality", num_options, options)) != NULL) { /* * Get the print-quality for this preset... */ if (!strcmp(quality, "low")) pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT; else if (!strcmp(quality, "high")) pwg_print_quality = _PWG_PRINT_QUALITY_HIGH; else pwg_print_quality = _PWG_PRINT_QUALITY_NORMAL; /* * Ignore graphicsType "Photo" presets that are not high quality. */ graphicsType = cupsGetOption("com.apple.print.preset.graphicsType", num_options, options); if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && graphicsType && !strcmp(graphicsType, "Photo")) continue; /* * Ignore presets for normal and draft quality where the coating * isn't "none" or "autodetect". */ media_front_coating = cupsGetOption( "com.apple.print.preset.media-front-coating", num_options, options); if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && media_front_coating && strcmp(media_front_coating, "none") && strcmp(media_front_coating, "autodetect")) continue; /* * Get the output mode for this preset... */ output_mode = cupsGetOption("com.apple.print.preset.output-mode", num_options, options); color_model_val = cupsGetOption("ColorModel", num_options, options); if (output_mode) { if (!strcmp(output_mode, "monochrome")) pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME; else pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; } else if (color_model_val) { if (!_cups_strcasecmp(color_model_val, "Gray")) pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME; else pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; } else pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; /* * Save the options for this combination as needed... */ if (!pc->num_presets[pwg_print_color_mode][pwg_print_quality]) pc->num_presets[pwg_print_color_mode][pwg_print_quality] = _ppdParseOptions(ppd_attr->value, 0, pc->presets[pwg_print_color_mode] + pwg_print_quality, _PPD_PARSE_OPTIONS); } cupsFreeOptions(num_options, options); } while ((ppd_attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) != NULL); } if (!pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_DRAFT] && !pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_NORMAL] && !pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_HIGH]) { /* * Try adding some common color options to create grayscale presets. These * are listed in order of popularity... */ const char *color_option = NULL, /* Color control option */ *gray_choice = NULL; /* Choice to select grayscale */ if ((color_model = ppdFindOption(ppd, "ColorModel")) != NULL && ppdFindChoice(color_model, "Gray")) { color_option = "ColorModel"; gray_choice = "Gray"; } else if ((color_model = ppdFindOption(ppd, "HPColorMode")) != NULL && ppdFindChoice(color_model, "grayscale")) { color_option = "HPColorMode"; gray_choice = "grayscale"; } else if ((color_model = ppdFindOption(ppd, "BRMonoColor")) != NULL && ppdFindChoice(color_model, "Mono")) { color_option = "BRMonoColor"; gray_choice = "Mono"; } else if ((color_model = ppdFindOption(ppd, "CNIJSGrayScale")) != NULL && ppdFindChoice(color_model, "1")) { color_option = "CNIJSGrayScale"; gray_choice = "1"; } else if ((color_model = ppdFindOption(ppd, "HPColorAsGray")) != NULL && ppdFindChoice(color_model, "True")) { color_option = "HPColorAsGray"; gray_choice = "True"; } if (color_option && gray_choice) { /* * Copy and convert ColorModel (output-mode) data... */ cups_option_t *coption, /* Color option */ *moption; /* Monochrome option */ for (pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT; pwg_print_quality < _PWG_PRINT_QUALITY_MAX; pwg_print_quality ++) { if (pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR][pwg_print_quality]) { /* * Copy the color options... */ num_options = pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR] [pwg_print_quality]; options = calloc(sizeof(cups_option_t), (size_t)num_options); if (options) { for (i = num_options, moption = options, coption = pc->presets[_PWG_PRINT_COLOR_MODE_COLOR] [pwg_print_quality]; i > 0; i --, moption ++, coption ++) { moption->name = _cupsStrRetain(coption->name); moption->value = _cupsStrRetain(coption->value); } pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = num_options; pc->presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = options; } } else if (pwg_print_quality != _PWG_PRINT_QUALITY_NORMAL) continue; /* * Add the grayscale option to the preset... */ pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = cupsAddOption(color_option, gray_choice, pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME] [pwg_print_quality], pc->presets[_PWG_PRINT_COLOR_MODE_MONOCHROME] + pwg_print_quality); } } } /* * Copy and convert Duplex (sides) data... */ if ((duplex = ppdFindOption(ppd, "Duplex")) == NULL) if ((duplex = ppdFindOption(ppd, "JCLDuplex")) == NULL) if ((duplex = ppdFindOption(ppd, "EFDuplex")) == NULL) if ((duplex = ppdFindOption(ppd, "EFDuplexing")) == NULL) duplex = ppdFindOption(ppd, "KD03Duplex"); if (duplex) { pc->sides_option = strdup(duplex->keyword); for (i = duplex->num_choices, choice = duplex->choices; i > 0; i --, choice ++) { if ((!_cups_strcasecmp(choice->choice, "None") || !_cups_strcasecmp(choice->choice, "False")) && !pc->sides_1sided) pc->sides_1sided = strdup(choice->choice); else if ((!_cups_strcasecmp(choice->choice, "DuplexNoTumble") || !_cups_strcasecmp(choice->choice, "LongEdge") || !_cups_strcasecmp(choice->choice, "Top")) && !pc->sides_2sided_long) pc->sides_2sided_long = strdup(choice->choice); else if ((!_cups_strcasecmp(choice->choice, "DuplexTumble") || !_cups_strcasecmp(choice->choice, "ShortEdge") || !_cups_strcasecmp(choice->choice, "Bottom")) && !pc->sides_2sided_short) pc->sides_2sided_short = strdup(choice->choice); } } /* * Copy filters and pre-filters... */ pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); cupsArrayAdd(pc->filters, "application/vnd.cups-raw application/octet-stream 0 -"); if ((ppd_attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) != NULL) { do { cupsArrayAdd(pc->filters, ppd_attr->value); } while ((ppd_attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); } else if (ppd->num_filters > 0) { for (i = 0; i < ppd->num_filters; i ++) cupsArrayAdd(pc->filters, ppd->filters[i]); } else cupsArrayAdd(pc->filters, "application/vnd.cups-postscript 0 -"); /* * See if we have a command filter... */ for (filter = (const char *)cupsArrayFirst(pc->filters); filter; filter = (const char *)cupsArrayNext(pc->filters)) if (!_cups_strncasecmp(filter, "application/vnd.cups-command", 28) && _cups_isspace(filter[28])) break; if (!filter && ((ppd_attr = ppdFindAttr(ppd, "cupsCommands", NULL)) == NULL || _cups_strcasecmp(ppd_attr->value, "none"))) { /* * No command filter and no cupsCommands keyword telling us not to use one. * See if this is a PostScript printer, and if so add a PostScript command * filter... */ for (filter = (const char *)cupsArrayFirst(pc->filters); filter; filter = (const char *)cupsArrayNext(pc->filters)) if (!_cups_strncasecmp(filter, "application/vnd.cups-postscript", 31) && _cups_isspace(filter[31])) break; if (filter) cupsArrayAdd(pc->filters, "application/vnd.cups-command application/postscript 100 " "commandtops"); } if ((ppd_attr = ppdFindAttr(ppd, "cupsPreFilter", NULL)) != NULL) { pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); do { cupsArrayAdd(pc->prefilters, ppd_attr->value); } while ((ppd_attr = ppdFindNextAttr(ppd, "cupsPreFilter", NULL)) != NULL); } if ((ppd_attr = ppdFindAttr(ppd, "cupsSingleFile", NULL)) != NULL) pc->single_file = !_cups_strcasecmp(ppd_attr->value, "true"); /* * Copy the product string, if any... */ if (ppd->product) pc->product = strdup(ppd->product); /* * Copy finishings mapping data... */ if ((ppd_attr = ppdFindAttr(ppd, "cupsIPPFinishings", NULL)) != NULL) { /* * Have proper vendor mapping of IPP finishings values to PPD options... */ pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_finishings); do { if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL) goto create_error; finishings->value = (ipp_finishings_t)atoi(ppd_attr->spec); finishings->num_options = _ppdParseOptions(ppd_attr->value, 0, &(finishings->options), _PPD_PARSE_OPTIONS); cupsArrayAdd(pc->finishings, finishings); } while ((ppd_attr = ppdFindNextAttr(ppd, "cupsIPPFinishings", NULL)) != NULL); } else { /* * No IPP mapping data, try to map common/standard PPD keywords... */ pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_finishings); if ((ppd_option = ppdFindOption(ppd, "StapleLocation")) != NULL) { /* * Add staple finishings... */ if (ppdFindChoice(ppd_option, "SinglePortrait")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_STAPLE_TOP_LEFT, "StapleLocation", "SinglePortrait"); if (ppdFindChoice(ppd_option, "UpperLeft")) /* Ricoh extension */ pwg_add_finishing(pc->finishings, IPP_FINISHINGS_STAPLE_TOP_LEFT, "StapleLocation", "UpperLeft"); if (ppdFindChoice(ppd_option, "UpperRight")) /* Ricoh extension */ pwg_add_finishing(pc->finishings, IPP_FINISHINGS_STAPLE_TOP_RIGHT, "StapleLocation", "UpperRight"); if (ppdFindChoice(ppd_option, "SingleLandscape")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, "StapleLocation", "SingleLandscape"); if (ppdFindChoice(ppd_option, "DualLandscape")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_STAPLE_DUAL_LEFT, "StapleLocation", "DualLandscape"); } if ((ppd_option = ppdFindOption(ppd, "RIPunch")) != NULL) { /* * Add (Ricoh) punch finishings... */ if (ppdFindChoice(ppd_option, "Left2")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_DUAL_LEFT, "RIPunch", "Left2"); if (ppdFindChoice(ppd_option, "Left3")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_TRIPLE_LEFT, "RIPunch", "Left3"); if (ppdFindChoice(ppd_option, "Left4")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_QUAD_LEFT, "RIPunch", "Left4"); if (ppdFindChoice(ppd_option, "Right2")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_DUAL_RIGHT, "RIPunch", "Right2"); if (ppdFindChoice(ppd_option, "Right3")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT, "RIPunch", "Right3"); if (ppdFindChoice(ppd_option, "Right4")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_QUAD_RIGHT, "RIPunch", "Right4"); if (ppdFindChoice(ppd_option, "Upper2")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_DUAL_TOP, "RIPunch", "Upper2"); if (ppdFindChoice(ppd_option, "Upper3")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_TRIPLE_TOP, "RIPunch", "Upper3"); if (ppdFindChoice(ppd_option, "Upper4")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_PUNCH_QUAD_TOP, "RIPunch", "Upper4"); } if ((ppd_option = ppdFindOption(ppd, "BindEdge")) != NULL) { /* * Add bind finishings... */ if (ppdFindChoice(ppd_option, "Left")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_BIND_LEFT, "BindEdge", "Left"); if (ppdFindChoice(ppd_option, "Right")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_BIND_RIGHT, "BindEdge", "Right"); if (ppdFindChoice(ppd_option, "Top")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_BIND_TOP, "BindEdge", "Top"); if (ppdFindChoice(ppd_option, "Bottom")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_BIND_BOTTOM, "BindEdge", "Bottom"); } if ((ppd_option = ppdFindOption(ppd, "FoldType")) != NULL) { /* * Add (Adobe) fold finishings... */ if (ppdFindChoice(ppd_option, "ZFold")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_Z, "FoldType", "ZFold"); if (ppdFindChoice(ppd_option, "Saddle")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_HALF, "FoldType", "Saddle"); if (ppdFindChoice(ppd_option, "DoubleGate")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_DOUBLE_GATE, "FoldType", "DoubleGate"); if (ppdFindChoice(ppd_option, "LeftGate")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_LEFT_GATE, "FoldType", "LeftGate"); if (ppdFindChoice(ppd_option, "RightGate")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_RIGHT_GATE, "FoldType", "RightGate"); if (ppdFindChoice(ppd_option, "Letter")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_LETTER, "FoldType", "Letter"); if (ppdFindChoice(ppd_option, "XFold")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_POSTER, "FoldType", "XFold"); } if ((ppd_option = ppdFindOption(ppd, "RIFoldType")) != NULL) { /* * Add (Ricoh) fold finishings... */ if (ppdFindChoice(ppd_option, "OutsideTwoFold")) pwg_add_finishing(pc->finishings, IPP_FINISHINGS_FOLD_LETTER, "RIFoldType", "OutsideTwoFold"); } if (cupsArrayCount(pc->finishings) == 0) { cupsArrayDelete(pc->finishings); pc->finishings = NULL; } } if ((ppd_option = ppdFindOption(ppd, "cupsFinishingTemplate")) != NULL) { pc->templates = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); for (choice = ppd_option->choices, i = ppd_option->num_choices; i > 0; choice ++, i --) { cupsArrayAdd(pc->templates, (void *)choice->choice); /* * Add localized text for PWG keyword to message catalog... */ snprintf(msg_id, sizeof(msg_id), "finishing-template.%s", choice->choice); pwg_add_message(pc->strings, msg_id, choice->text); } } /* * Max copies... */ if ((ppd_attr = ppdFindAttr(ppd, "cupsMaxCopies", NULL)) != NULL) pc->max_copies = atoi(ppd_attr->value); else if (ppd->manual_copies) pc->max_copies = 1; else pc->max_copies = 9999; /* * cupsChargeInfoURI, cupsJobAccountId, cupsJobAccountingUserId, * cupsJobPassword, and cupsMandatory. */ if ((ppd_attr = ppdFindAttr(ppd, "cupsChargeInfoURI", NULL)) != NULL) pc->charge_info_uri = strdup(ppd_attr->value); if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountId", NULL)) != NULL) pc->account_id = !_cups_strcasecmp(ppd_attr->value, "true"); if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountingUserId", NULL)) != NULL) pc->accounting_user_id = !_cups_strcasecmp(ppd_attr->value, "true"); if ((ppd_attr = ppdFindAttr(ppd, "cupsJobPassword", NULL)) != NULL) pc->password = strdup(ppd_attr->value); if ((ppd_attr = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL) pc->mandatory = _cupsArrayNewStrings(ppd_attr->value, ' '); /* * Support files... */ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); for (ppd_attr = ppdFindAttr(ppd, "cupsICCProfile", NULL); ppd_attr; ppd_attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL)) cupsArrayAdd(pc->support_files, ppd_attr->value); if ((ppd_attr = ppdFindAttr(ppd, "APPrinterIconPath", NULL)) != NULL) cupsArrayAdd(pc->support_files, ppd_attr->value); /* * Return the cache data... */ return (pc); /* * If we get here we need to destroy the PWG mapping data and return NULL... */ create_error: _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Out of memory."), 1); _ppdCacheDestroy(pc); return (NULL); } /* * '_ppdCacheDestroy()' - Free all memory used for PWG mapping data. */ void _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */ { int i; /* Looping var */ pwg_map_t *map; /* Current map */ pwg_size_t *size; /* Current size */ /* * Range check input... */ if (!pc) return; /* * Free memory as needed... */ if (pc->bins) { for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++) { free(map->pwg); free(map->ppd); } free(pc->bins); } if (pc->sizes) { for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) { free(size->map.pwg); free(size->map.ppd); } free(pc->sizes); } free(pc->source_option); if (pc->sources) { for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++) { free(map->pwg); free(map->ppd); } free(pc->sources); } if (pc->types) { for (i = pc->num_types, map = pc->types; i > 0; i --, map ++) { free(map->pwg); free(map->ppd); } free(pc->types); } free(pc->custom_max_keyword); free(pc->custom_min_keyword); free(pc->product); cupsArrayDelete(pc->filters); cupsArrayDelete(pc->prefilters); cupsArrayDelete(pc->finishings); free(pc->charge_info_uri); free(pc->password); cupsArrayDelete(pc->mandatory); cupsArrayDelete(pc->support_files); cupsArrayDelete(pc->strings); free(pc); } /* * '_ppdCacheGetBin()' - Get the PWG output-bin keyword associated with a PPD * OutputBin. */ const char * /* O - output-bin or NULL */ _ppdCacheGetBin( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *output_bin) /* I - PPD OutputBin string */ { int i; /* Looping var */ /* * Range check input... */ if (!pc || !output_bin) return (NULL); /* * Look up the OutputBin string... */ for (i = 0; i < pc->num_bins; i ++) if (!_cups_strcasecmp(output_bin, pc->bins[i].ppd)) return (pc->bins[i].pwg); return (NULL); } /* * '_ppdCacheGetFinishingOptions()' - Get PPD finishing options for the given * IPP finishings value(s). */ int /* O - New number of options */ _ppdCacheGetFinishingOptions( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ ipp_t *job, /* I - Job attributes or NULL */ ipp_finishings_t value, /* I - IPP finishings value of IPP_FINISHINGS_NONE */ int num_options, /* I - Number of options */ cups_option_t **options) /* IO - Options */ { int i; /* Looping var */ _pwg_finishings_t *f, /* PWG finishings options */ key; /* Search key */ ipp_attribute_t *attr; /* Finishings attribute */ cups_option_t *option; /* Current finishings option */ /* * Range check input... */ if (!pc || cupsArrayCount(pc->finishings) == 0 || !options || (!job && value == IPP_FINISHINGS_NONE)) return (num_options); /* * Apply finishing options... */ if (job && (attr = ippFindAttribute(job, "finishings", IPP_TAG_ENUM)) != NULL) { int num_values = ippGetCount(attr); /* Number of values */ for (i = 0; i < num_values; i ++) { key.value = (ipp_finishings_t)ippGetInteger(attr, i); if ((f = cupsArrayFind(pc->finishings, &key)) != NULL) { int j; /* Another looping var */ for (j = f->num_options, option = f->options; j > 0; j --, option ++) num_options = cupsAddOption(option->name, option->value, num_options, options); } } } else if (value != IPP_FINISHINGS_NONE) { key.value = value; if ((f = cupsArrayFind(pc->finishings, &key)) != NULL) { int j; /* Another looping var */ for (j = f->num_options, option = f->options; j > 0; j --, option ++) num_options = cupsAddOption(option->name, option->value, num_options, options); } } return (num_options); } /* * '_ppdCacheGetFinishingValues()' - Get IPP finishings value(s) from the given * PPD options. */ int /* O - Number of finishings values */ _ppdCacheGetFinishingValues( ppd_file_t *ppd, /* I - Marked PPD file */ _ppd_cache_t *pc, /* I - PPD cache and mapping data */ int max_values, /* I - Maximum number of finishings values */ int *values) /* O - Finishings values */ { int i, /* Looping var */ num_values = 0; /* Number of values */ _pwg_finishings_t *f; /* Current finishings option */ cups_option_t *option; /* Current option */ ppd_choice_t *choice; /* Marked PPD choice */ /* * Range check input... */ DEBUG_printf(("_ppdCacheGetFinishingValues(ppd=%p, pc=%p, max_values=%d, values=%p)", ppd, pc, max_values, values)); if (!ppd || !pc || max_values < 1 || !values) { DEBUG_puts("_ppdCacheGetFinishingValues: Bad arguments, returning 0."); return (0); } else if (!pc->finishings) { DEBUG_puts("_ppdCacheGetFinishingValues: No finishings support, returning 0."); return (0); } /* * Go through the finishings options and see what is set... */ for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); f; f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) { DEBUG_printf(("_ppdCacheGetFinishingValues: Checking %d (%s)", (int)f->value, ippEnumString("finishings", (int)f->value))); for (i = f->num_options, option = f->options; i > 0; i --, option ++) { DEBUG_printf(("_ppdCacheGetFinishingValues: %s=%s?", option->name, option->value)); if ((choice = ppdFindMarkedChoice(ppd, option->name)) == NULL || _cups_strcasecmp(option->value, choice->choice)) { DEBUG_puts("_ppdCacheGetFinishingValues: NO"); break; } } if (i == 0) { DEBUG_printf(("_ppdCacheGetFinishingValues: Adding %d (%s)", (int)f->value, ippEnumString("finishings", (int)f->value))); values[num_values ++] = (int)f->value; if (num_values >= max_values) break; } } if (num_values == 0) { /* * Always have at least "finishings" = 'none'... */ DEBUG_puts("_ppdCacheGetFinishingValues: Adding 3 (none)."); values[0] = IPP_FINISHINGS_NONE; num_values ++; } DEBUG_printf(("_ppdCacheGetFinishingValues: Returning %d.", num_values)); return (num_values); } /* * '_ppdCacheGetInputSlot()' - Get the PPD InputSlot associated with the job * attributes or a keyword string. */ const char * /* O - PPD InputSlot or NULL */ _ppdCacheGetInputSlot( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ ipp_t *job, /* I - Job attributes or NULL */ const char *keyword) /* I - Keyword string or NULL */ { /* * Range check input... */ if (!pc || pc->num_sources == 0 || (!job && !keyword)) return (NULL); if (job && !keyword) { /* * Lookup the media-col attribute and any media-source found there... */ ipp_attribute_t *media_col, /* media-col attribute */ *media_source; /* media-source attribute */ pwg_size_t size; /* Dimensional size */ int margins_set; /* Were the margins set? */ media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION); if (media_col && (media_source = ippFindAttribute(ippGetCollection(media_col, 0), "media-source", IPP_TAG_KEYWORD)) != NULL) { /* * Use the media-source value from media-col... */ keyword = ippGetString(media_source, 0, NULL); } else if (pwgInitSize(&size, job, &margins_set)) { /* * For media <= 5x7, look for a photo tray... */ if (size.width <= (5 * 2540) && size.length <= (7 * 2540)) keyword = "photo"; } } if (keyword) { int i; /* Looping var */ for (i = 0; i < pc->num_sources; i ++) if (!_cups_strcasecmp(keyword, pc->sources[i].pwg)) return (pc->sources[i].ppd); } return (NULL); } /* * '_ppdCacheGetMediaType()' - Get the PPD MediaType associated with the job * attributes or a keyword string. */ const char * /* O - PPD MediaType or NULL */ _ppdCacheGetMediaType( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ ipp_t *job, /* I - Job attributes or NULL */ const char *keyword) /* I - Keyword string or NULL */ { /* * Range check input... */ if (!pc || pc->num_types == 0 || (!job && !keyword)) return (NULL); if (job && !keyword) { /* * Lookup the media-col attribute and any media-source found there... */ ipp_attribute_t *media_col, /* media-col attribute */ *media_type; /* media-type attribute */ media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION); if (media_col) { if ((media_type = ippFindAttribute(media_col->values[0].collection, "media-type", IPP_TAG_KEYWORD)) == NULL) media_type = ippFindAttribute(media_col->values[0].collection, "media-type", IPP_TAG_NAME); if (media_type) keyword = media_type->values[0].string.text; } } if (keyword) { int i; /* Looping var */ for (i = 0; i < pc->num_types; i ++) if (!_cups_strcasecmp(keyword, pc->types[i].pwg)) return (pc->types[i].ppd); } return (NULL); } /* * '_ppdCacheGetOutputBin()' - Get the PPD OutputBin associated with the keyword * string. */ const char * /* O - PPD OutputBin or NULL */ _ppdCacheGetOutputBin( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *output_bin) /* I - Keyword string */ { int i; /* Looping var */ /* * Range check input... */ if (!pc || !output_bin) return (NULL); /* * Look up the OutputBin string... */ for (i = 0; i < pc->num_bins; i ++) if (!_cups_strcasecmp(output_bin, pc->bins[i].pwg)) return (pc->bins[i].ppd); return (NULL); } /* * '_ppdCacheGetPageSize()' - Get the PPD PageSize associated with the job * attributes or a keyword string. */ const char * /* O - PPD PageSize or NULL */ _ppdCacheGetPageSize( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ ipp_t *job, /* I - Job attributes or NULL */ const char *keyword, /* I - Keyword string or NULL */ int *exact) /* O - 1 if exact match, 0 otherwise */ { int i; /* Looping var */ pwg_size_t *size, /* Current size */ *closest, /* Closest size */ jobsize; /* Size data from job */ int margins_set, /* Were the margins set? */ dwidth, /* Difference in width */ dlength, /* Difference in length */ dleft, /* Difference in left margins */ dright, /* Difference in right margins */ dbottom, /* Difference in bottom margins */ dtop, /* Difference in top margins */ dmin, /* Minimum difference */ dclosest; /* Closest difference */ const char *ppd_name; /* PPD media name */ DEBUG_printf(("_ppdCacheGetPageSize(pc=%p, job=%p, keyword=\"%s\", exact=%p)", pc, job, keyword, exact)); /* * Range check input... */ if (!pc || (!job && !keyword)) return (NULL); if (exact) *exact = 0; ppd_name = keyword; if (job) { /* * Try getting the PPD media name from the job attributes... */ ipp_attribute_t *attr; /* Job attribute */ if ((attr = ippFindAttribute(job, "PageSize", IPP_TAG_ZERO)) == NULL) if ((attr = ippFindAttribute(job, "PageRegion", IPP_TAG_ZERO)) == NULL) attr = ippFindAttribute(job, "media", IPP_TAG_ZERO); #ifdef DEBUG if (attr) DEBUG_printf(("1_ppdCacheGetPageSize: Found attribute %s (%s)", attr->name, ippTagString(attr->value_tag))); else DEBUG_puts("1_ppdCacheGetPageSize: Did not find media attribute."); #endif /* DEBUG */ if (attr && (attr->value_tag == IPP_TAG_NAME || attr->value_tag == IPP_TAG_KEYWORD)) ppd_name = attr->values[0].string.text; } DEBUG_printf(("1_ppdCacheGetPageSize: ppd_name=\"%s\"", ppd_name)); if (ppd_name) { /* * Try looking up the named PPD size first... */ for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) { DEBUG_printf(("2_ppdCacheGetPageSize: size[%d]=[\"%s\" \"%s\"]", (int)(size - pc->sizes), size->map.pwg, size->map.ppd)); if (!_cups_strcasecmp(ppd_name, size->map.ppd) || !_cups_strcasecmp(ppd_name, size->map.pwg)) { if (exact) *exact = 1; DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\"", ppd_name)); return (size->map.ppd); } } } if (job && !keyword) { /* * Get the size using media-col or media, with the preference being * media-col. */ if (!pwgInitSize(&jobsize, job, &margins_set)) return (NULL); } else { /* * Get the size using a media keyword... */ pwg_media_t *media; /* Media definition */ if ((media = pwgMediaForPWG(keyword)) == NULL) if ((media = pwgMediaForLegacy(keyword)) == NULL) if ((media = pwgMediaForPPD(keyword)) == NULL) return (NULL); jobsize.width = media->width; jobsize.length = media->length; margins_set = 0; } /* * Now that we have the dimensions and possibly the margins, look at the * available sizes and find the match... */ closest = NULL; dclosest = 999999999; if (!ppd_name || _cups_strncasecmp(ppd_name, "Custom.", 7) || _cups_strncasecmp(ppd_name, "custom_", 7)) { for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) { /* * Adobe uses a size matching algorithm with an epsilon of 5 points, which * is just about 176/2540ths... */ dwidth = size->width - jobsize.width; dlength = size->length - jobsize.length; if (dwidth <= -176 || dwidth >= 176 || dlength <= -176 || dlength >= 176) continue; if (margins_set) { /* * Use a tighter epsilon of 1 point (35/2540ths) for margins... */ dleft = size->left - jobsize.left; dright = size->right - jobsize.right; dtop = size->top - jobsize.top; dbottom = size->bottom - jobsize.bottom; if (dleft <= -35 || dleft >= 35 || dright <= -35 || dright >= 35 || dtop <= -35 || dtop >= 35 || dbottom <= -35 || dbottom >= 35) { dleft = dleft < 0 ? -dleft : dleft; dright = dright < 0 ? -dright : dright; dbottom = dbottom < 0 ? -dbottom : dbottom; dtop = dtop < 0 ? -dtop : dtop; dmin = dleft + dright + dbottom + dtop; if (dmin < dclosest) { dclosest = dmin; closest = size; } continue; } } if (exact) *exact = 1; DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\"", size->map.ppd)); return (size->map.ppd); } } if (closest) { DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\" (closest)", closest->map.ppd)); return (closest->map.ppd); } /* * If we get here we need to check for custom page size support... */ if (jobsize.width >= pc->custom_min_width && jobsize.width <= pc->custom_max_width && jobsize.length >= pc->custom_min_length && jobsize.length <= pc->custom_max_length) { /* * In range, format as Custom.WWWWxLLLL (points). */ snprintf(pc->custom_ppd_size, sizeof(pc->custom_ppd_size), "Custom.%dx%d", (int)PWG_TO_POINTS(jobsize.width), (int)PWG_TO_POINTS(jobsize.length)); if (margins_set && exact) { dleft = pc->custom_size.left - jobsize.left; dright = pc->custom_size.right - jobsize.right; dtop = pc->custom_size.top - jobsize.top; dbottom = pc->custom_size.bottom - jobsize.bottom; if (dleft > -35 && dleft < 35 && dright > -35 && dright < 35 && dtop > -35 && dtop < 35 && dbottom > -35 && dbottom < 35) *exact = 1; } else if (exact) *exact = 1; DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\" (custom)", pc->custom_ppd_size)); return (pc->custom_ppd_size); } /* * No custom page size support or the size is out of range - return NULL. */ DEBUG_puts("1_ppdCacheGetPageSize: Returning NULL"); return (NULL); } /* * '_ppdCacheGetSize()' - Get the PWG size associated with a PPD PageSize. */ pwg_size_t * /* O - PWG size or NULL */ _ppdCacheGetSize( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *page_size) /* I - PPD PageSize */ { int i; /* Looping var */ pwg_media_t *media; /* Media */ pwg_size_t *size; /* Current size */ /* * Range check input... */ if (!pc || !page_size) return (NULL); if (!_cups_strncasecmp(page_size, "Custom.", 7)) { /* * Custom size; size name can be one of the following: * * Custom.WIDTHxLENGTHin - Size in inches * Custom.WIDTHxLENGTHft - Size in feet * Custom.WIDTHxLENGTHcm - Size in centimeters * Custom.WIDTHxLENGTHmm - Size in millimeters * Custom.WIDTHxLENGTHm - Size in meters * Custom.WIDTHxLENGTH[pt] - Size in points */ double w, l; /* Width and length of page */ char *ptr; /* Pointer into PageSize */ struct lconv *loc; /* Locale data */ loc = localeconv(); w = (float)_cupsStrScand(page_size + 7, &ptr, loc); if (!ptr || *ptr != 'x') return (NULL); l = (float)_cupsStrScand(ptr + 1, &ptr, loc); if (!ptr) return (NULL); if (!_cups_strcasecmp(ptr, "in")) { w *= 2540.0; l *= 2540.0; } else if (!_cups_strcasecmp(ptr, "ft")) { w *= 12.0 * 2540.0; l *= 12.0 * 2540.0; } else if (!_cups_strcasecmp(ptr, "mm")) { w *= 100.0; l *= 100.0; } else if (!_cups_strcasecmp(ptr, "cm")) { w *= 1000.0; l *= 1000.0; } else if (!_cups_strcasecmp(ptr, "m")) { w *= 100000.0; l *= 100000.0; } else { w *= 2540.0 / 72.0; l *= 2540.0 / 72.0; } pc->custom_size.width = (int)w; pc->custom_size.length = (int)l; return (&(pc->custom_size)); } /* * Not a custom size - look it up... */ for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) if (!_cups_strcasecmp(page_size, size->map.ppd) || !_cups_strcasecmp(page_size, size->map.pwg)) return (size); /* * Look up standard sizes... */ if ((media = pwgMediaForPPD(page_size)) == NULL) if ((media = pwgMediaForLegacy(page_size)) == NULL) media = pwgMediaForPWG(page_size); if (media) { pc->custom_size.width = media->width; pc->custom_size.length = media->length; return (&(pc->custom_size)); } return (NULL); } /* * '_ppdCacheGetSource()' - Get the PWG media-source associated with a PPD * InputSlot. */ const char * /* O - PWG media-source keyword */ _ppdCacheGetSource( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *input_slot) /* I - PPD InputSlot */ { int i; /* Looping var */ pwg_map_t *source; /* Current source */ /* * Range check input... */ if (!pc || !input_slot) return (NULL); for (i = pc->num_sources, source = pc->sources; i > 0; i --, source ++) if (!_cups_strcasecmp(input_slot, source->ppd)) return (source->pwg); return (NULL); } /* * '_ppdCacheGetType()' - Get the PWG media-type associated with a PPD * MediaType. */ const char * /* O - PWG media-type keyword */ _ppdCacheGetType( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *media_type) /* I - PPD MediaType */ { int i; /* Looping var */ pwg_map_t *type; /* Current type */ /* * Range check input... */ if (!pc || !media_type) return (NULL); for (i = pc->num_types, type = pc->types; i > 0; i --, type ++) if (!_cups_strcasecmp(media_type, type->ppd)) return (type->pwg); return (NULL); } /* * '_ppdCacheWriteFile()' - Write PWG mapping data to a file. */ int /* O - 1 on success, 0 on failure */ _ppdCacheWriteFile( _ppd_cache_t *pc, /* I - PPD cache and mapping data */ const char *filename, /* I - File to write */ ipp_t *attrs) /* I - Attributes to write, if any */ { int i, j, k; /* Looping vars */ cups_file_t *fp; /* Output file */ pwg_size_t *size; /* Current size */ pwg_map_t *map; /* Current map */ _pwg_finishings_t *f; /* Current finishing option */ cups_option_t *option; /* Current option */ const char *value; /* String value */ char newfile[1024]; /* New filename */ /* * Range check input... */ if (!pc || !filename) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Open the file and write with compression... */ snprintf(newfile, sizeof(newfile), "%s.N", filename); if ((fp = cupsFileOpen(newfile, "w9")) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (0); } /* * Standard header... */ cupsFilePrintf(fp, "#CUPS-PPD-CACHE-%d\n", _PPD_CACHE_VERSION); /* * Output bins... */ if (pc->num_bins > 0) { cupsFilePrintf(fp, "NumBins %d\n", pc->num_bins); for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++) cupsFilePrintf(fp, "Bin %s %s\n", map->pwg, map->ppd); } /* * Media sizes... */ cupsFilePrintf(fp, "NumSizes %d\n", pc->num_sizes); for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) cupsFilePrintf(fp, "Size %s %s %d %d %d %d %d %d\n", size->map.pwg, size->map.ppd, size->width, size->length, size->left, size->bottom, size->right, size->top); if (pc->custom_max_width > 0) cupsFilePrintf(fp, "CustomSize %d %d %d %d %d %d %d %d\n", pc->custom_max_width, pc->custom_max_length, pc->custom_min_width, pc->custom_min_length, pc->custom_size.left, pc->custom_size.bottom, pc->custom_size.right, pc->custom_size.top); /* * Media sources... */ if (pc->source_option) cupsFilePrintf(fp, "SourceOption %s\n", pc->source_option); if (pc->num_sources > 0) { cupsFilePrintf(fp, "NumSources %d\n", pc->num_sources); for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++) cupsFilePrintf(fp, "Source %s %s\n", map->pwg, map->ppd); } /* * Media types... */ if (pc->num_types > 0) { cupsFilePrintf(fp, "NumTypes %d\n", pc->num_types); for (i = pc->num_types, map = pc->types; i > 0; i --, map ++) cupsFilePrintf(fp, "Type %s %s\n", map->pwg, map->ppd); } /* * Presets... */ for (i = _PWG_PRINT_COLOR_MODE_MONOCHROME; i < _PWG_PRINT_COLOR_MODE_MAX; i ++) for (j = _PWG_PRINT_QUALITY_DRAFT; j < _PWG_PRINT_QUALITY_MAX; j ++) if (pc->num_presets[i][j]) { cupsFilePrintf(fp, "Preset %d %d", i, j); for (k = pc->num_presets[i][j], option = pc->presets[i][j]; k > 0; k --, option ++) cupsFilePrintf(fp, " %s=%s", option->name, option->value); cupsFilePutChar(fp, '\n'); } /* * Duplex/sides... */ if (pc->sides_option) cupsFilePrintf(fp, "SidesOption %s\n", pc->sides_option); if (pc->sides_1sided) cupsFilePrintf(fp, "Sides1Sided %s\n", pc->sides_1sided); if (pc->sides_2sided_long) cupsFilePrintf(fp, "Sides2SidedLong %s\n", pc->sides_2sided_long); if (pc->sides_2sided_short) cupsFilePrintf(fp, "Sides2SidedShort %s\n", pc->sides_2sided_short); /* * Product, cupsFilter, cupsFilter2, and cupsPreFilter... */ if (pc->product) cupsFilePutConf(fp, "Product", pc->product); for (value = (const char *)cupsArrayFirst(pc->filters); value; value = (const char *)cupsArrayNext(pc->filters)) cupsFilePutConf(fp, "Filter", value); for (value = (const char *)cupsArrayFirst(pc->prefilters); value; value = (const char *)cupsArrayNext(pc->prefilters)) cupsFilePutConf(fp, "PreFilter", value); cupsFilePrintf(fp, "SingleFile %s\n", pc->single_file ? "true" : "false"); /* * Finishing options... */ for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); f; f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) { cupsFilePrintf(fp, "Finishings %d", f->value); for (i = f->num_options, option = f->options; i > 0; i --, option ++) cupsFilePrintf(fp, " %s=%s", option->name, option->value); cupsFilePutChar(fp, '\n'); } for (value = (const char *)cupsArrayFirst(pc->templates); value; value = (const char *)cupsArrayNext(pc->templates)) cupsFilePutConf(fp, "FinishingTemplate", value); /* * Max copies... */ cupsFilePrintf(fp, "MaxCopies %d\n", pc->max_copies); /* * Accounting/quota/PIN/managed printing values... */ if (pc->charge_info_uri) cupsFilePutConf(fp, "ChargeInfoURI", pc->charge_info_uri); cupsFilePrintf(fp, "JobAccountId %s\n", pc->account_id ? "true" : "false"); cupsFilePrintf(fp, "JobAccountingUserId %s\n", pc->accounting_user_id ? "true" : "false"); if (pc->password) cupsFilePutConf(fp, "JobPassword", pc->password); for (value = (char *)cupsArrayFirst(pc->mandatory); value; value = (char *)cupsArrayNext(pc->mandatory)) cupsFilePutConf(fp, "Mandatory", value); /* * Support files... */ for (value = (char *)cupsArrayFirst(pc->support_files); value; value = (char *)cupsArrayNext(pc->support_files)) cupsFilePutConf(fp, "SupportFile", value); /* * IPP attributes, if any... */ if (attrs) { cupsFilePrintf(fp, "IPP " CUPS_LLFMT "\n", CUPS_LLCAST ippLength(attrs)); attrs->state = IPP_STATE_IDLE; ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, attrs); } /* * Close and return... */ if (cupsFileClose(fp)) { unlink(newfile); return (0); } unlink(filename); return (!rename(newfile, filename)); } /* * '_ppdCreateFromIPP()' - Create a PPD file describing the capabilities * of an IPP printer. */ char * /* O - PPD filename or @code NULL@ on error */ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ size_t bufsize, /* I - Size of filename buffer */ ipp_t *response) /* I - Get-Printer-Attributes response */ { cups_file_t *fp; /* PPD file */ cups_array_t *sizes; /* Media sizes supported by printer */ cups_size_t *size; /* Current media size */ ipp_attribute_t *attr, /* xxx-supported */ *defattr, /* xxx-default */ *quality, /* print-quality-supported */ *x_dim, *y_dim; /* Media dimensions */ ipp_t *media_col, /* Media collection */ *media_size; /* Media size collection */ char make[256], /* Make and model */ *model, /* Model name */ ppdname[PPD_MAX_NAME]; /* PPD keyword */ int i, j, /* Looping vars */ count, /* Number of values */ bottom, /* Largest bottom margin */ left, /* Largest left margin */ right, /* Largest right margin */ top, /* Largest top margin */ max_length = 0, /* Maximum custom size */ max_width = 0, min_length = INT_MAX, /* Minimum custom size */ min_width = INT_MAX, is_apple = 0, /* Does the printer support Apple raster? */ is_pdf = 0, /* Does the printer support PDF? */ is_pwg = 0; /* Does the printer support PWG Raster? */ pwg_media_t *pwg; /* PWG media size */ int xres, yres; /* Resolution values */ int resolutions[1000]; /* Array of resolution indices */ char msgid[256]; /* Message identifier (attr.value) */ const char *keyword, /* Keyword value */ *msgstr; /* Localized string */ cups_lang_t *lang = cupsLangDefault(); /* Localization info */ cups_array_t *strings = NULL;/* Printer strings file */ struct lconv *loc = localeconv(); /* Locale data */ cups_array_t *fin_options = NULL; /* Finishing options */ /* * Range check input... */ if (buffer) *buffer = '\0'; if (!buffer || bufsize < 1) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } if (!response) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No IPP attributes."), 1); return (NULL); } /* * Open a temporary file for the PPD... */ if ((fp = cupsTempFile2(buffer, (int)bufsize)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } /* * Standard stuff for PPD file... */ cupsFilePuts(fp, "*PPD-Adobe: \"4.3\"\n"); cupsFilePuts(fp, "*FormatVersion: \"4.3\"\n"); cupsFilePrintf(fp, "*FileVersion: \"%d.%d\"\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR); cupsFilePuts(fp, "*LanguageVersion: English\n"); cupsFilePuts(fp, "*LanguageEncoding: ISOLatin1\n"); cupsFilePuts(fp, "*PSVersion: \"(3010.000) 0\"\n"); cupsFilePuts(fp, "*LanguageLevel: \"3\"\n"); cupsFilePuts(fp, "*FileSystem: False\n"); cupsFilePuts(fp, "*PCFileName: \"ippeve.ppd\"\n"); if ((attr = ippFindAttribute(response, "printer-make-and-model", IPP_TAG_TEXT)) != NULL) strlcpy(make, ippGetString(attr, 0, NULL), sizeof(make)); else strlcpy(make, "Unknown Printer", sizeof(make)); if (!_cups_strncasecmp(make, "Hewlett Packard ", 16) || !_cups_strncasecmp(make, "Hewlett-Packard ", 16)) { model = make + 16; strlcpy(make, "HP", sizeof(make)); } else if ((model = strchr(make, ' ')) != NULL) *model++ = '\0'; else model = make; cupsFilePrintf(fp, "*Manufacturer: \"%s\"\n", make); cupsFilePrintf(fp, "*ModelName: \"%s\"\n", model); cupsFilePrintf(fp, "*Product: \"(%s)\"\n", model); cupsFilePrintf(fp, "*NickName: \"%s - IPP Everywhere\"\n", model); cupsFilePrintf(fp, "*ShortNickName: \"%s - IPP Everywhere\"\n", model); if ((attr = ippFindAttribute(response, "color-supported", IPP_TAG_BOOLEAN)) != NULL && ippGetBoolean(attr, 0)) cupsFilePuts(fp, "*ColorDevice: True\n"); else cupsFilePuts(fp, "*ColorDevice: False\n"); cupsFilePrintf(fp, "*cupsVersion: %d.%d\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR); cupsFilePuts(fp, "*cupsSNMPSupplies: False\n"); cupsFilePrintf(fp, "*cupsLanguages: \"%s\"\n", lang->language); if ((attr = ippFindAttribute(response, "printer-more-info", IPP_TAG_URI)) != NULL) cupsFilePrintf(fp, "*APSupplies: \"%s\"\n", ippGetString(attr, 0, NULL)); if ((attr = ippFindAttribute(response, "printer-charge-info-uri", IPP_TAG_URI)) != NULL) cupsFilePrintf(fp, "*cupsChargeInfoURI: \"%s\"\n", ippGetString(attr, 0, NULL)); if ((attr = ippFindAttribute(response, "printer-strings-uri", IPP_TAG_URI)) != NULL) { http_t *http = NULL; /* Connection to printer */ char stringsfile[1024]; /* Temporary strings file */ if (cups_get_url(&http, ippGetString(attr, 0, NULL), stringsfile, sizeof(stringsfile))) { cupsFilePrintf(fp, "*cupsStringsURI: \"%s\"\n", ippGetString(attr, 0, NULL)); strings = _cupsMessageLoad(stringsfile, _CUPS_MESSAGE_STRINGS | _CUPS_MESSAGE_UNQUOTE); unlink(stringsfile); } if (http) httpClose(http); } /* * Accounting... */ if (ippGetBoolean(ippFindAttribute(response, "job-account-id-supported", IPP_TAG_BOOLEAN), 0)) cupsFilePuts(fp, "*cupsJobAccountId: True\n"); if (ippGetBoolean(ippFindAttribute(response, "job-accounting-user-id-supported", IPP_TAG_BOOLEAN), 0)) cupsFilePuts(fp, "*cupsJobAccountingUserId: True\n"); /* * Password/PIN printing... */ if ((attr = ippFindAttribute(response, "job-password-supported", IPP_TAG_INTEGER)) != NULL) { char pattern[33]; /* Password pattern */ int maxlen = ippGetInteger(attr, 0); /* Maximum length */ const char *repertoire = ippGetString(ippFindAttribute(response, "job-password-repertoire-configured", IPP_TAG_KEYWORD), 0, NULL); /* Type of password */ if (maxlen > (int)(sizeof(pattern) - 1)) maxlen = (int)sizeof(pattern) - 1; if (!repertoire || !strcmp(repertoire, "iana_us-ascii_digits")) memset(pattern, '1', (size_t)maxlen); else if (!strcmp(repertoire, "iana_us-ascii_letters")) memset(pattern, 'A', (size_t)maxlen); else if (!strcmp(repertoire, "iana_us-ascii_complex")) memset(pattern, 'C', (size_t)maxlen); else if (!strcmp(repertoire, "iana_us-ascii_any")) memset(pattern, '.', (size_t)maxlen); else if (!strcmp(repertoire, "iana_utf-8_digits")) memset(pattern, 'N', (size_t)maxlen); else if (!strcmp(repertoire, "iana_utf-8_letters")) memset(pattern, 'U', (size_t)maxlen); else memset(pattern, '*', (size_t)maxlen); pattern[maxlen] = '\0'; cupsFilePrintf(fp, "*cupsJobPassword: \"%s\"\n", pattern); } /* * Filters... */ if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL) { is_apple = ippContainsString(attr, "image/urf"); is_pdf = ippContainsString(attr, "application/pdf"); is_pwg = ippContainsString(attr, "image/pwg-raster") && !is_apple; if (ippContainsString(attr, "image/jpeg")) cupsFilePuts(fp, "*cupsFilter2: \"image/jpeg image/jpeg 0 -\"\n"); if (ippContainsString(attr, "image/png")) cupsFilePuts(fp, "*cupsFilter2: \"image/png image/png 0 -\"\n"); if (is_pdf) { /* * Don't locally filter PDF content when printing to a CUPS shared * printer, otherwise the options will be applied twice... */ if (ippContainsString(attr, "application/vnd.cups-pdf")) cupsFilePuts(fp, "*cupsFilter2: \"application/pdf application/pdf 0 -\"\n"); else cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n"); } else cupsFilePuts(fp, "*cupsManualCopies: true\n"); if (is_apple) cupsFilePuts(fp, "*cupsFilter2: \"image/urf image/urf 100 -\"\n"); if (is_pwg) cupsFilePuts(fp, "*cupsFilter2: \"image/pwg-raster image/pwg-raster 100 -\"\n"); } if (!is_apple && !is_pdf && !is_pwg) goto bad_ppd; /* * PageSize/PageRegion/ImageableArea/PaperDimension */ if ((attr = ippFindAttribute(response, "media-bottom-margin-supported", IPP_TAG_INTEGER)) != NULL) { for (i = 1, bottom = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++) if (ippGetInteger(attr, i) > bottom) bottom = ippGetInteger(attr, i); } else bottom = 1270; if ((attr = ippFindAttribute(response, "media-left-margin-supported", IPP_TAG_INTEGER)) != NULL) { for (i = 1, left = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++) if (ippGetInteger(attr, i) > left) left = ippGetInteger(attr, i); } else left = 635; if ((attr = ippFindAttribute(response, "media-right-margin-supported", IPP_TAG_INTEGER)) != NULL) { for (i = 1, right = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++) if (ippGetInteger(attr, i) > right) right = ippGetInteger(attr, i); } else right = 635; if ((attr = ippFindAttribute(response, "media-top-margin-supported", IPP_TAG_INTEGER)) != NULL) { for (i = 1, top = ippGetInteger(attr, 0), count = ippGetCount(attr); i < count; i ++) if (ippGetInteger(attr, i) > top) top = ippGetInteger(attr, i); } else top = 1270; if ((defattr = ippFindAttribute(response, "media-col-default", IPP_TAG_BEGIN_COLLECTION)) != NULL) { if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL) { media_size = ippGetCollection(attr, 0); x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER); y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER); if (x_dim && y_dim && (pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0))) != NULL) strlcpy(ppdname, pwg->ppd, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); } else strlcpy(ppdname, "Unknown", sizeof(ppdname)); } else if ((pwg = pwgMediaForPWG(ippGetString(ippFindAttribute(response, "media-default", IPP_TAG_ZERO), 0, NULL))) != NULL) strlcpy(ppdname, pwg->ppd, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); sizes = cupsArrayNew3((cups_array_func_t)pwg_compare_sizes, NULL, NULL, 0, (cups_acopy_func_t)pwg_copy_size, (cups_afree_func_t)free); if ((attr = ippFindAttribute(response, "media-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { cups_size_t temp; /* Current size */ ipp_attribute_t *margin; /* media-xxx-margin attribute */ media_col = ippGetCollection(attr, i); media_size = ippGetCollection(ippFindAttribute(media_col, "media-size", IPP_TAG_BEGIN_COLLECTION), 0); x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_ZERO); y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_ZERO); pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0)); if (pwg) { temp.width = pwg->width; temp.length = pwg->length; if ((margin = ippFindAttribute(media_col, "media-bottom-margin", IPP_TAG_INTEGER)) != NULL) temp.bottom = ippGetInteger(margin, 0); else temp.bottom = bottom; if ((margin = ippFindAttribute(media_col, "media-left-margin", IPP_TAG_INTEGER)) != NULL) temp.left = ippGetInteger(margin, 0); else temp.left = left; if ((margin = ippFindAttribute(media_col, "media-right-margin", IPP_TAG_INTEGER)) != NULL) temp.right = ippGetInteger(margin, 0); else temp.right = right; if ((margin = ippFindAttribute(media_col, "media-top-margin", IPP_TAG_INTEGER)) != NULL) temp.top = ippGetInteger(margin, 0); else temp.top = top; if (temp.bottom == 0 && temp.left == 0 && temp.right == 0 && temp.top == 0) snprintf(temp.media, sizeof(temp.media), "%s.Borderless", pwg->ppd); else strlcpy(temp.media, pwg->ppd, sizeof(temp.media)); if (!cupsArrayFind(sizes, &temp)) cupsArrayAdd(sizes, &temp); } else if (ippGetValueTag(x_dim) == IPP_TAG_RANGE || ippGetValueTag(y_dim) == IPP_TAG_RANGE) { /* * Custom size - record the min/max values... */ int lower, upper; /* Range values */ if (ippGetValueTag(x_dim) == IPP_TAG_RANGE) lower = ippGetRange(x_dim, 0, &upper); else lower = upper = ippGetInteger(x_dim, 0); if (lower < min_width) min_width = lower; if (upper > max_width) max_width = upper; if (ippGetValueTag(y_dim) == IPP_TAG_RANGE) lower = ippGetRange(y_dim, 0, &upper); else lower = upper = ippGetInteger(y_dim, 0); if (lower < min_length) min_length = lower; if (upper > max_length) max_length = upper; } } if ((max_width == 0 || max_length == 0) && (attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { /* * Some printers don't list custom size support in media-col-database... */ for (i = 0, count = ippGetCount(attr); i < count; i ++) { media_size = ippGetCollection(attr, i); x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_ZERO); y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_ZERO); if (ippGetValueTag(x_dim) == IPP_TAG_RANGE || ippGetValueTag(y_dim) == IPP_TAG_RANGE) { /* * Custom size - record the min/max values... */ int lower, upper; /* Range values */ if (ippGetValueTag(x_dim) == IPP_TAG_RANGE) lower = ippGetRange(x_dim, 0, &upper); else lower = upper = ippGetInteger(x_dim, 0); if (lower < min_width) min_width = lower; if (upper > max_width) max_width = upper; if (ippGetValueTag(y_dim) == IPP_TAG_RANGE) lower = ippGetRange(y_dim, 0, &upper); else lower = upper = ippGetInteger(y_dim, 0); if (lower < min_length) min_length = lower; if (upper > max_length) max_length = upper; } } } } else if ((attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { cups_size_t temp; /* Current size */ media_size = ippGetCollection(attr, i); x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_ZERO); y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_ZERO); pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0)); if (pwg) { temp.width = pwg->width; temp.length = pwg->length; temp.bottom = bottom; temp.left = left; temp.right = right; temp.top = top; if (temp.bottom == 0 && temp.left == 0 && temp.right == 0 && temp.top == 0) snprintf(temp.media, sizeof(temp.media), "%s.Borderless", pwg->ppd); else strlcpy(temp.media, pwg->ppd, sizeof(temp.media)); if (!cupsArrayFind(sizes, &temp)) cupsArrayAdd(sizes, &temp); } else if (ippGetValueTag(x_dim) == IPP_TAG_RANGE || ippGetValueTag(y_dim) == IPP_TAG_RANGE) { /* * Custom size - record the min/max values... */ int lower, upper; /* Range values */ if (ippGetValueTag(x_dim) == IPP_TAG_RANGE) lower = ippGetRange(x_dim, 0, &upper); else lower = upper = ippGetInteger(x_dim, 0); if (lower < min_width) min_width = lower; if (upper > max_width) max_width = upper; if (ippGetValueTag(y_dim) == IPP_TAG_RANGE) lower = ippGetRange(y_dim, 0, &upper); else lower = upper = ippGetInteger(y_dim, 0); if (lower < min_length) min_length = lower; if (upper > max_length) max_length = upper; } } } else if ((attr = ippFindAttribute(response, "media-supported", IPP_TAG_ZERO)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { const char *pwg_size = ippGetString(attr, i, NULL); /* PWG size name */ cups_size_t temp; /* Current size */ if ((pwg = pwgMediaForPWG(pwg_size)) != NULL) { if (strstr(pwg_size, "_max_") || strstr(pwg_size, "_max.")) { if (pwg->width > max_width) max_width = pwg->width; if (pwg->length > max_length) max_length = pwg->length; } else if (strstr(pwg_size, "_min_") || strstr(pwg_size, "_min.")) { if (pwg->width < min_width) min_width = pwg->width; if (pwg->length < min_length) min_length = pwg->length; } else { temp.width = pwg->width; temp.length = pwg->length; temp.bottom = bottom; temp.left = left; temp.right = right; temp.top = top; if (temp.bottom == 0 && temp.left == 0 && temp.right == 0 && temp.top == 0) snprintf(temp.media, sizeof(temp.media), "%s.Borderless", pwg->ppd); else strlcpy(temp.media, pwg->ppd, sizeof(temp.media)); if (!cupsArrayFind(sizes, &temp)) cupsArrayAdd(sizes, &temp); } } } } if (cupsArrayCount(sizes) > 0) { /* * List all of the standard sizes... */ char tleft[256], /* Left string */ tbottom[256], /* Bottom string */ tright[256], /* Right string */ ttop[256], /* Top string */ twidth[256], /* Width string */ tlength[256]; /* Length string */ cupsFilePrintf(fp, "*OpenUI *PageSize: PickOne\n" "*OrderDependency: 10 AnySetup *PageSize\n" "*DefaultPageSize: %s\n", ppdname); for (size = (cups_size_t *)cupsArrayFirst(sizes); size; size = (cups_size_t *)cupsArrayNext(sizes)) { _cupsStrFormatd(twidth, twidth + sizeof(twidth), size->width * 72.0 / 2540.0, loc); _cupsStrFormatd(tlength, tlength + sizeof(tlength), size->length * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*PageSize %s: \"<>setpagedevice\"\n", size->media, twidth, tlength); } cupsFilePuts(fp, "*CloseUI: *PageSize\n"); cupsFilePrintf(fp, "*OpenUI *PageRegion: PickOne\n" "*OrderDependency: 10 AnySetup *PageRegion\n" "*DefaultPageRegion: %s\n", ppdname); for (size = (cups_size_t *)cupsArrayFirst(sizes); size; size = (cups_size_t *)cupsArrayNext(sizes)) { _cupsStrFormatd(twidth, twidth + sizeof(twidth), size->width * 72.0 / 2540.0, loc); _cupsStrFormatd(tlength, tlength + sizeof(tlength), size->length * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*PageRegion %s: \"<>setpagedevice\"\n", size->media, twidth, tlength); } cupsFilePuts(fp, "*CloseUI: *PageRegion\n"); cupsFilePrintf(fp, "*DefaultImageableArea: %s\n" "*DefaultPaperDimension: %s\n", ppdname, ppdname); for (size = (cups_size_t *)cupsArrayFirst(sizes); size; size = (cups_size_t *)cupsArrayNext(sizes)) { _cupsStrFormatd(tleft, tleft + sizeof(tleft), size->left * 72.0 / 2540.0, loc); _cupsStrFormatd(tbottom, tbottom + sizeof(tbottom), size->bottom * 72.0 / 2540.0, loc); _cupsStrFormatd(tright, tright + sizeof(tright), (size->width - size->right) * 72.0 / 2540.0, loc); _cupsStrFormatd(ttop, ttop + sizeof(ttop), (size->length - size->top) * 72.0 / 2540.0, loc); _cupsStrFormatd(twidth, twidth + sizeof(twidth), size->width * 72.0 / 2540.0, loc); _cupsStrFormatd(tlength, tlength + sizeof(tlength), size->length * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*ImageableArea %s: \"%s %s %s %s\"\n", size->media, tleft, tbottom, tright, ttop); cupsFilePrintf(fp, "*PaperDimension %s: \"%s %s\"\n", size->media, twidth, tlength); } cupsArrayDelete(sizes); /* * Custom size support... */ if (max_width > 0 && min_width < INT_MAX && max_length > 0 && min_length < INT_MAX) { char tmax[256], tmin[256]; /* Min/max values */ _cupsStrFormatd(tleft, tleft + sizeof(tleft), left * 72.0 / 2540.0, loc); _cupsStrFormatd(tbottom, tbottom + sizeof(tbottom), bottom * 72.0 / 2540.0, loc); _cupsStrFormatd(tright, tright + sizeof(tright), right * 72.0 / 2540.0, loc); _cupsStrFormatd(ttop, ttop + sizeof(ttop), top * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*HWMargins: \"%s %s %s %s\"\n", tleft, tbottom, tright, ttop); _cupsStrFormatd(tmax, tmax + sizeof(tmax), max_width * 72.0 / 2540.0, loc); _cupsStrFormatd(tmin, tmin + sizeof(tmin), min_width * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*ParamCustomPageSize Width: 1 points %s %s\n", tmin, tmax); _cupsStrFormatd(tmax, tmax + sizeof(tmax), max_length * 72.0 / 2540.0, loc); _cupsStrFormatd(tmin, tmin + sizeof(tmin), min_length * 72.0 / 2540.0, loc); cupsFilePrintf(fp, "*ParamCustomPageSize Height: 2 points %s %s\n", tmin, tmax); cupsFilePuts(fp, "*ParamCustomPageSize WidthOffset: 3 points 0 0\n"); cupsFilePuts(fp, "*ParamCustomPageSize HeightOffset: 4 points 0 0\n"); cupsFilePuts(fp, "*ParamCustomPageSize Orientation: 5 int 0 3\n"); cupsFilePuts(fp, "*CustomPageSize True: \"pop pop pop <>setpagedevice\"\n"); } } else { cupsArrayDelete(sizes); goto bad_ppd; } /* * InputSlot... */ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_ZERO)) != NULL) pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { static const char * const sources[] = { /* Standard "media-source" strings */ "auto", "main", "alternate", "large-capacity", "manual", "envelope", "disc", "photo", "hagaki", "main-roll", "alternate-roll", "top", "middle", "bottom", "side", "left", "right", "center", "rear", "by-pass-tray", "tray-1", "tray-2", "tray-3", "tray-4", "tray-5", "tray-6", "tray-7", "tray-8", "tray-9", "tray-10", "tray-11", "tray-12", "tray-13", "tray-14", "tray-15", "tray-16", "tray-17", "tray-18", "tray-19", "tray-20", "roll-1", "roll-2", "roll-3", "roll-4", "roll-5", "roll-6", "roll-7", "roll-8", "roll-9", "roll-10" }; cupsFilePrintf(fp, "*OpenUI *InputSlot: PickOne\n" "*OrderDependency: 10 AnySetup *InputSlot\n" "*DefaultInputSlot: %s\n", ppdname); for (i = 0, count = ippGetCount(attr); i < count; i ++) { keyword = ippGetString(attr, i, NULL); pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++) if (!strcmp(sources[j], keyword)) { snprintf(msgid, sizeof(msgid), "media-source.%s", keyword); cupsFilePrintf(fp, "*InputSlot %s: \"<>setpagedevice\"\n", ppdname, j); cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, _cupsLangString(lang, msgid)); break; } } cupsFilePuts(fp, "*CloseUI: *InputSlot\n"); } /* * MediaType... */ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-type", IPP_TAG_ZERO)) != NULL) pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); if ((attr = ippFindAttribute(response, "media-type-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { cupsFilePrintf(fp, "*OpenUI *MediaType: PickOne\n" "*OrderDependency: 10 AnySetup *MediaType\n" "*DefaultMediaType: %s\n", ppdname); for (i = 0; i < count; i ++) { keyword = ippGetString(attr, i, NULL); pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); snprintf(msgid, sizeof(msgid), "media-type.%s", keyword); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; cupsFilePrintf(fp, "*MediaType %s: \"<>setpagedevice\"\n", ppdname, ppdname); cupsFilePrintf(fp, "*%s.MediaType %s/%s: \"\"\n", lang->language, ppdname, msgstr); } cupsFilePuts(fp, "*CloseUI: *MediaType\n"); } /* * ColorModel... */ if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) == NULL) if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL) if ((attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD)) == NULL) attr = ippFindAttribute(response, "output-mode-supported", IPP_TAG_KEYWORD); if (attr) { int wrote_color = 0; const char *default_color = NULL; /* Default */ for (i = 0, count = ippGetCount(attr); i < count; i ++) { keyword = ippGetString(attr, i, NULL); #define PRINTF_COLORMODEL if (!wrote_color) { cupsFilePrintf(fp, "*OpenUI *ColorModel: PickOne\n*OrderDependency: 10 AnySetup *ColorModel\n*%s.Translation ColorModel/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Color Mode"))); wrote_color = 1; } #define PRINTF_COLOROPTION(name,text,cspace,bpp) { cupsFilePrintf(fp, "*ColorModel %s: \"<>setpagedevice\"\n", name, cspace, bpp); cupsFilePrintf(fp, "*%s.ColorModel %s/%s: \"\"\n", lang->language, name, _cupsLangString(lang, text)); } if (!strcasecmp(keyword, "black_1") || !strcmp(keyword, "bi-level") || !strcmp(keyword, "process-bi-level")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("FastGray", _("Fast Grayscale"), CUPS_CSPACE_K, 1) if (!default_color) default_color = "FastGray"; } else if (!strcasecmp(keyword, "sgray_8") || !strcmp(keyword, "W8") || !strcmp(keyword, "monochrome") || !strcmp(keyword, "process-monochrome")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("Gray", _("Grayscale"), CUPS_CSPACE_SW, 8) if (!default_color || !strcmp(default_color, "FastGray")) default_color = "Gray"; } else if (!strcasecmp(keyword, "sgray_16") || !strcmp(keyword, "W8-16")) { PRINTF_COLORMODEL if (!strcmp(keyword, "W8-16")) { PRINTF_COLOROPTION("Gray", _("Grayscale"), CUPS_CSPACE_SW, 8) if (!default_color || !strcmp(default_color, "FastGray")) default_color = "Gray"; } PRINTF_COLOROPTION("Gray16", _("Deep Gray"), CUPS_CSPACE_SW, 16) } else if (!strcasecmp(keyword, "srgb_8") || !strncmp(keyword, "SRGB24", 7) || !strcmp(keyword, "color")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("RGB", _("Color"), CUPS_CSPACE_SRGB, 8) default_color = "RGB"; } else if (!strcasecmp(keyword, "adobe-rgb_16") || !strcmp(keyword, "ADOBERGB48") || !strcmp(keyword, "ADOBERGB24-48")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("AdobeRGB", _("Deep Color"), CUPS_CSPACE_ADOBERGB, 16) if (!default_color) default_color = "AdobeRGB"; } else if ((!strcasecmp(keyword, "adobe-rgb_8") && !ippContainsString(attr, "adobe-rgb_16")) || !strcmp(keyword, "ADOBERGB24")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("AdobeRGB", _("Deep Color"), CUPS_CSPACE_ADOBERGB, 8) if (!default_color) default_color = "AdobeRGB"; } else if ((!strcasecmp(keyword, "black_8") && !ippContainsString(attr, "black_16")) || !strcmp(keyword, "DEVW8")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("DeviceGray", _("Device Gray"), CUPS_CSPACE_W, 8) } else if (!strcasecmp(keyword, "black_16") || !strcmp(keyword, "DEVW16") || !strcmp(keyword, "DEVW8-16")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("DeviceGray", _("Device Gray"), CUPS_CSPACE_W, 16) } else if ((!strcasecmp(keyword, "cmyk_8") && !ippContainsString(attr, "cmyk_16")) || !strcmp(keyword, "DEVCMYK32")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("CMYK", _("Device CMYK"), CUPS_CSPACE_CMYK, 8) } else if (!strcasecmp(keyword, "cmyk_16") || !strcmp(keyword, "DEVCMYK32-64") || !strcmp(keyword, "DEVCMYK64")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("CMYK", _("Device CMYK"), CUPS_CSPACE_CMYK, 16) } else if ((!strcasecmp(keyword, "rgb_8") && ippContainsString(attr, "rgb_16")) || !strcmp(keyword, "DEVRGB24")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("DeviceRGB", _("Device RGB"), CUPS_CSPACE_RGB, 8) } else if (!strcasecmp(keyword, "rgb_16") || !strcmp(keyword, "DEVRGB24-48") || !strcmp(keyword, "DEVRGB48")) { PRINTF_COLORMODEL PRINTF_COLOROPTION("DeviceRGB", _("Device RGB"), CUPS_CSPACE_RGB, 16) } } if (default_color) cupsFilePrintf(fp, "*DefaultColorModel: %s\n", default_color); if (wrote_color) cupsFilePuts(fp, "*CloseUI: *ColorModel\n"); } /* * Duplex... */ if ((attr = ippFindAttribute(response, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippContainsString(attr, "two-sided-long-edge")) { cupsFilePrintf(fp, "*OpenUI *Duplex: PickOne\n" "*OrderDependency: 10 AnySetup *Duplex\n" "*%s.Translation Duplex/%s: \"\"\n" "*DefaultDuplex: None\n" "*Duplex None: \"<>setpagedevice\"\n" "*%s.Duplex None/%s: \"\"\n" "*Duplex DuplexNoTumble: \"<>setpagedevice\"\n" "*%s.Duplex DuplexNoTumble/%s: \"\"\n" "*Duplex DuplexTumble: \"<>setpagedevice\"\n" "*%s.Duplex DuplexTumble/%s: \"\"\n" "*CloseUI: *Duplex\n", lang->language, _cupsLangString(lang, _("2-Sided Printing")), lang->language, _cupsLangString(lang, _("Off (1-Sided)")), lang->language, _cupsLangString(lang, _("Long-Edge (Portrait)")), lang->language, _cupsLangString(lang, _("Short-Edge (Landscape)"))); if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { const char *dm = ippGetString(attr, i, NULL); /* DM value */ if (!_cups_strcasecmp(dm, "DM1")) { cupsFilePuts(fp, "*cupsBackSide: Normal\n"); break; } else if (!_cups_strcasecmp(dm, "DM2")) { cupsFilePuts(fp, "*cupsBackSide: Flipped\n"); break; } else if (!_cups_strcasecmp(dm, "DM3")) { cupsFilePuts(fp, "*cupsBackSide: Rotated\n"); break; } else if (!_cups_strcasecmp(dm, "DM4")) { cupsFilePuts(fp, "*cupsBackSide: ManualTumble\n"); break; } } } else if ((attr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL) { keyword = ippGetString(attr, 0, NULL); if (!strcmp(keyword, "flipped")) cupsFilePuts(fp, "*cupsBackSide: Flipped\n"); else if (!strcmp(keyword, "manual-tumble")) cupsFilePuts(fp, "*cupsBackSide: ManualTumble\n"); else if (!strcmp(keyword, "normal")) cupsFilePuts(fp, "*cupsBackSide: Normal\n"); else cupsFilePuts(fp, "*cupsBackSide: Rotated\n"); } } /* * Output bin... */ if ((attr = ippFindAttribute(response, "output-bin-default", IPP_TAG_ZERO)) != NULL) pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { ipp_attribute_t *trays = ippFindAttribute(response, "printer-output-tray", IPP_TAG_STRING); /* printer-output-tray attribute, if any */ const char *tray_ptr; /* printer-output-tray value */ int tray_len; /* Len of printer-output-tray value */ char tray[IPP_MAX_OCTETSTRING]; /* printer-output-tray string value */ cupsFilePrintf(fp, "*OpenUI *OutputBin: PickOne\n" "*OrderDependency: 10 AnySetup *OutputBin\n" "*DefaultOutputBin: %s\n", ppdname); if (!strcmp(ppdname, "FaceUp")) cupsFilePuts(fp, "*DefaultOutputOrder: Reverse\n"); else cupsFilePuts(fp, "*DefaultOutputOrder: Normal\n"); for (i = 0; i < count; i ++) { keyword = ippGetString(attr, i, NULL); pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); snprintf(msgid, sizeof(msgid), "output-bin.%s", keyword); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; cupsFilePrintf(fp, "*OutputBin %s: \"\"\n", ppdname); cupsFilePrintf(fp, "*%s.OutputBin %s/%s: \"\"\n", lang->language, ppdname, msgstr); if ((tray_ptr = ippGetOctetString(trays, i, &tray_len)) != NULL) { if (tray_len >= (int)sizeof(tray)) tray_len = (int)sizeof(tray) - 1; memcpy(tray, tray_ptr, (size_t)tray_len); tray[tray_len] = '\0'; if (strstr(tray, "stackingorder=lastToFirst;")) cupsFilePrintf(fp, "*PageStackOrder %s: Reverse\n", ppdname); else cupsFilePrintf(fp, "*PageStackOrder %s: Normal\n", ppdname); } else if (!strcmp(ppdname, "FaceUp")) cupsFilePrintf(fp, "*PageStackOrder %s: Reverse\n", ppdname); else cupsFilePrintf(fp, "*PageStackOrder %s: Normal\n", ppdname); } cupsFilePuts(fp, "*CloseUI: *OutputBin\n"); } /* * Finishing options... */ if ((attr = ippFindAttribute(response, "finishings-supported", IPP_TAG_ENUM)) != NULL) { int value; /* Enum value */ const char *ppd_keyword; /* PPD keyword for enum */ cups_array_t *names; /* Names we've added */ static const char * const base_keywords[] = { /* Base STD 92 keywords */ NULL, /* none */ "SingleAuto", /* staple */ "SingleAuto", /* punch */ NULL, /* cover */ "BindAuto", /* bind */ "SaddleStitch", /* saddle-stitch */ "EdgeStitchAuto", /* edge-stitch */ "Auto", /* fold */ NULL, /* trim */ NULL, /* bale */ NULL, /* booklet-maker */ NULL, /* jog-offset */ NULL, /* coat */ NULL /* laminate */ }; count = ippGetCount(attr); names = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); fin_options = cupsArrayNew((cups_array_func_t)strcmp, NULL); /* * Staple/Bind/Stitch */ for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strncmp(keyword, "staple-", 7) || !strncmp(keyword, "bind-", 5) || !strncmp(keyword, "edge-stitch-", 12) || !strcmp(keyword, "saddle-stitch")) break; } if (i < count) { static const char * const staple_keywords[] = { /* StapleLocation keywords */ "SinglePortrait", "SingleRevLandscape", "SingleLandscape", "SingleRevPortrait", "EdgeStitchPortrait", "EdgeStitchLandscape", "EdgeStitchRevPortrait", "EdgeStitchRevLandscape", "DualPortrait", "DualLandscape", "DualRevPortrait", "DualRevLandscape", "TriplePortrait", "TripleLandscape", "TripleRevPortrait", "TripleRevLandscape" }; static const char * const bind_keywords[] = { /* StapleLocation binding keywords */ "BindPortrait", "BindLandscape", "BindRevPortrait", "BindRevLandscape" }; cupsArrayAdd(fin_options, "*StapleLocation"); cupsFilePuts(fp, "*OpenUI *StapleLocation: PickOne\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *StapleLocation\n"); cupsFilePrintf(fp, "*%s.Translation StapleLocation/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Staple"))); cupsFilePuts(fp, "*DefaultStapleLocation: None\n"); cupsFilePuts(fp, "*StapleLocation None: \"\"\n"); cupsFilePrintf(fp, "*%s.StapleLocation None/%s: \"\"\n", lang->language, _cupsLangString(lang, _("None"))); for (; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (strncmp(keyword, "staple-", 7) && strncmp(keyword, "bind-", 5) && strncmp(keyword, "edge-stitch-", 12) && strcmp(keyword, "saddle-stitch")) continue; if (cupsArrayFind(names, (char *)keyword)) continue; /* Already did this finishing template */ cupsArrayAdd(names, (char *)keyword); snprintf(msgid, sizeof(msgid), "finishings.%d", value); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; if (value >= IPP_FINISHINGS_NONE && value <= IPP_FINISHINGS_LAMINATE) ppd_keyword = base_keywords[value - IPP_FINISHINGS_NONE]; else if (value >= IPP_FINISHINGS_STAPLE_TOP_LEFT && value <= IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM) ppd_keyword = staple_keywords[value - IPP_FINISHINGS_STAPLE_TOP_LEFT]; else if (value >= IPP_FINISHINGS_BIND_LEFT && value <= IPP_FINISHINGS_BIND_BOTTOM) ppd_keyword = bind_keywords[value - IPP_FINISHINGS_BIND_LEFT]; else ppd_keyword = NULL; if (!ppd_keyword) continue; cupsFilePrintf(fp, "*StapleLocation %s: \"\"\n", ppd_keyword); cupsFilePrintf(fp, "*%s.StapleLocation %s/%s: \"\"\n", lang->language, ppd_keyword, msgstr); cupsFilePrintf(fp, "*cupsIPPFinishings %d/%s: \"*StapleLocation %s\"\n", value, keyword, ppd_keyword); } cupsFilePuts(fp, "*CloseUI: *StapleLocation\n"); } /* * Fold */ for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strncmp(keyword, "cups-fold-", 10) || !strcmp(keyword, "fold") || !strncmp(keyword, "fold-", 5)) break; } if (i < count) { static const char * const fold_keywords[] = { /* FoldType keywords */ "Accordion", "DoubleGate", "Gate", "Half", "HalfZ", "LeftGate", "Letter", "Parallel", "XFold", "RightGate", "ZFold", "EngineeringZ" }; cupsArrayAdd(fin_options, "*FoldType"); cupsFilePuts(fp, "*OpenUI *FoldType: PickOne\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *FoldType\n"); cupsFilePrintf(fp, "*%s.Translation FoldType/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Fold"))); cupsFilePuts(fp, "*DefaultFoldType: None\n"); cupsFilePuts(fp, "*FoldType None: \"\"\n"); cupsFilePrintf(fp, "*%s.FoldType None/%s: \"\"\n", lang->language, _cupsLangString(lang, _("None"))); for (; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strncmp(keyword, "cups-fold-", 10)) keyword += 5; else if (strcmp(keyword, "fold") && strncmp(keyword, "fold-", 5)) continue; if (cupsArrayFind(names, (char *)keyword)) continue; /* Already did this finishing template */ cupsArrayAdd(names, (char *)keyword); snprintf(msgid, sizeof(msgid), "finishings.%d", value); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; if (value >= IPP_FINISHINGS_NONE && value <= IPP_FINISHINGS_LAMINATE) ppd_keyword = base_keywords[value - IPP_FINISHINGS_NONE]; else if (value >= IPP_FINISHINGS_FOLD_ACCORDION && value <= IPP_FINISHINGS_FOLD_ENGINEERING_Z) ppd_keyword = fold_keywords[value - IPP_FINISHINGS_FOLD_ACCORDION]; else if (value >= IPP_FINISHINGS_CUPS_FOLD_ACCORDION && value <= IPP_FINISHINGS_CUPS_FOLD_Z) ppd_keyword = fold_keywords[value - IPP_FINISHINGS_CUPS_FOLD_ACCORDION]; else ppd_keyword = NULL; if (!ppd_keyword) continue; cupsFilePrintf(fp, "*FoldType %s: \"\"\n", ppd_keyword); cupsFilePrintf(fp, "*%s.FoldType %s/%s: \"\"\n", lang->language, ppd_keyword, msgstr); cupsFilePrintf(fp, "*cupsIPPFinishings %d/%s: \"*FoldType %s\"\n", value, keyword, ppd_keyword); } cupsFilePuts(fp, "*CloseUI: *FoldType\n"); } /* * Punch */ for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strncmp(keyword, "cups-punch-", 11) || !strncmp(keyword, "punch-", 6)) break; } if (i < count) { static const char * const punch_keywords[] = { /* PunchMedia keywords */ "SinglePortrait", "SingleRevLandscape", "SingleLandscape", "SingleRevPortrait", "DualPortrait", "DualLandscape", "DualRevPortrait", "DualRevLandscape", "TriplePortrait", "TripleLandscape", "TripleRevPortrait", "TripleRevLandscape", "QuadPortrait", "QuadLandscape", "QuadRevPortrait", "QuadRevLandscape", "MultiplePortrait", "MultipleLandscape", "MultipleRevPortrait", "MultipleRevLandscape" }; cupsArrayAdd(fin_options, "*PunchMedia"); cupsFilePuts(fp, "*OpenUI *PunchMedia: PickOne\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *PunchMedia\n"); cupsFilePrintf(fp, "*%s.Translation PunchMedia/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Punch"))); cupsFilePuts(fp, "*DefaultPunchMedia: None\n"); cupsFilePuts(fp, "*PunchMedia None: \"\"\n"); cupsFilePrintf(fp, "*%s.PunchMedia None/%s: \"\"\n", lang->language, _cupsLangString(lang, _("None"))); for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strncmp(keyword, "cups-punch-", 11)) keyword += 5; else if (strncmp(keyword, "punch-", 6)) continue; if (cupsArrayFind(names, (char *)keyword)) continue; /* Already did this finishing template */ cupsArrayAdd(names, (char *)keyword); snprintf(msgid, sizeof(msgid), "finishings.%d", value); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; if (value >= IPP_FINISHINGS_NONE && value <= IPP_FINISHINGS_LAMINATE) ppd_keyword = base_keywords[value - IPP_FINISHINGS_NONE]; else if (value >= IPP_FINISHINGS_PUNCH_TOP_LEFT && value <= IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM) ppd_keyword = punch_keywords[value - IPP_FINISHINGS_PUNCH_TOP_LEFT]; else if (value >= IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT && value <= IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM) ppd_keyword = punch_keywords[value - IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT]; else ppd_keyword = NULL; if (!ppd_keyword) continue; cupsFilePrintf(fp, "*PunchMedia %s: \"\"\n", ppd_keyword); cupsFilePrintf(fp, "*%s.PunchMedia %s/%s: \"\"\n", lang->language, ppd_keyword, msgstr); cupsFilePrintf(fp, "*cupsIPPFinishings %d/%s: \"*PunchMedia %s\"\n", value, keyword, ppd_keyword); } cupsFilePuts(fp, "*CloseUI: *PunchMedia\n"); } /* * Booklet */ if (ippContainsInteger(attr, IPP_FINISHINGS_BOOKLET_MAKER)) { cupsArrayAdd(fin_options, "*Booklet"); cupsFilePuts(fp, "*OpenUI *Booklet: Boolean\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *Booklet\n"); cupsFilePrintf(fp, "*%s.Translation Booklet/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Booklet"))); cupsFilePuts(fp, "*DefaultBooklet: False\n"); cupsFilePuts(fp, "*Booklet False: \"\"\n"); cupsFilePuts(fp, "*Booklet True: \"\"\n"); cupsFilePrintf(fp, "*cupsIPPFinishings %d/booklet-maker: \"*Booklet True\"\n", IPP_FINISHINGS_BOOKLET_MAKER); cupsFilePuts(fp, "*CloseUI: *Booklet\n"); } /* * CutMedia */ for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (!strcmp(keyword, "trim") || !strncmp(keyword, "trim-", 5)) break; } if (i < count) { static const char * const trim_keywords[] = { /* CutMedia keywords */ "EndOfPage", "EndOfDoc", "EndOfSet", "EndOfJob" }; cupsArrayAdd(fin_options, "*CutMedia"); cupsFilePuts(fp, "*OpenUI *CutMedia: PickOne\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *CutMedia\n"); cupsFilePrintf(fp, "*%s.Translation CutMedia/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Cut"))); cupsFilePuts(fp, "*DefaultCutMedia: None\n"); cupsFilePuts(fp, "*CutMedia None: \"\"\n"); cupsFilePrintf(fp, "*%s.CutMedia None/%s: \"\"\n", lang->language, _cupsLangString(lang, _("None"))); for (i = 0; i < count; i ++) { value = ippGetInteger(attr, i); keyword = ippEnumString("finishings", value); if (strcmp(keyword, "trim") && strncmp(keyword, "trim-", 5)) continue; if (cupsArrayFind(names, (char *)keyword)) continue; /* Already did this finishing template */ cupsArrayAdd(names, (char *)keyword); snprintf(msgid, sizeof(msgid), "finishings.%d", value); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; if (value == IPP_FINISHINGS_TRIM) ppd_keyword = "Auto"; else ppd_keyword = trim_keywords[value - IPP_FINISHINGS_TRIM_AFTER_PAGES]; cupsFilePrintf(fp, "*CutMedia %s: \"\"\n", ppd_keyword); cupsFilePrintf(fp, "*%s.CutMedia %s/%s: \"\"\n", lang->language, ppd_keyword, msgstr); cupsFilePrintf(fp, "*cupsIPPFinishings %d/%s: \"*CutMedia %s\"\n", value, keyword, ppd_keyword); } cupsFilePuts(fp, "*CloseUI: *CutMedia\n"); } cupsArrayDelete(names); } if ((attr = ippFindAttribute(response, "finishings-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) { ipp_t *finishing_col; /* Current finishing collection */ ipp_attribute_t *finishing_attr; /* Current finishing member attribute */ cups_array_t *templates; /* Finishing templates */ cupsFilePuts(fp, "*OpenUI *cupsFinishingTemplate: PickOne\n"); cupsFilePuts(fp, "*OrderDependency: 10 AnySetup *cupsFinishingTemplate\n"); cupsFilePrintf(fp, "*%s.Translation cupsFinishingTemplate/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Finishing Preset"))); cupsFilePuts(fp, "*DefaultcupsFinishingTemplate: none\n"); cupsFilePuts(fp, "*cupsFinishingTemplate none: \"\"\n"); cupsFilePrintf(fp, "*%s.cupsFinishingTemplate none/%s: \"\"\n", lang->language, _cupsLangString(lang, _("None"))); templates = cupsArrayNew((cups_array_func_t)strcmp, NULL); count = ippGetCount(attr); for (i = 0; i < count; i ++) { finishing_col = ippGetCollection(attr, i); keyword = ippGetString(ippFindAttribute(finishing_col, "finishing-template", IPP_TAG_ZERO), 0, NULL); if (!keyword || cupsArrayFind(templates, (void *)keyword)) continue; if (!strcmp(keyword, "none")) continue; cupsArrayAdd(templates, (void *)keyword); snprintf(msgid, sizeof(msgid), "finishing-template.%s", keyword); if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) msgstr = keyword; cupsFilePrintf(fp, "*cupsFinishingTemplate %s: \"\n", keyword); for (finishing_attr = ippFirstAttribute(finishing_col); finishing_attr; finishing_attr = ippNextAttribute(finishing_col)) { if (ippGetValueTag(finishing_attr) == IPP_TAG_BEGIN_COLLECTION) { const char *name = ippGetName(finishing_attr); /* Member attribute name */ if (strcmp(name, "media-size")) cupsFilePrintf(fp, "%% %s\n", name); } } cupsFilePuts(fp, "\"\n"); cupsFilePrintf(fp, "*%s.cupsFinishingTemplate %s/%s: \"\"\n", lang->language, keyword, msgstr); cupsFilePuts(fp, "*End\n"); } cupsFilePuts(fp, "*CloseUI: *cupsFinishingTemplate\n"); if (cupsArrayCount(fin_options)) { const char *fin_option; /* Current finishing option */ cupsFilePuts(fp, "*cupsUIConstraint finishing-template: \"*cupsFinishingTemplate"); for (fin_option = (const char *)cupsArrayFirst(fin_options); fin_option; fin_option = (const char *)cupsArrayNext(fin_options)) cupsFilePrintf(fp, " %s", fin_option); cupsFilePuts(fp, "\"\n"); cupsFilePuts(fp, "*cupsUIResolver finishing-template: \"*cupsFinishingTemplate None"); for (fin_option = (const char *)cupsArrayFirst(fin_options); fin_option; fin_option = (const char *)cupsArrayNext(fin_options)) cupsFilePrintf(fp, " %s None", fin_option); cupsFilePuts(fp, "\"\n"); } cupsArrayDelete(templates); } cupsArrayDelete(fin_options); /* * cupsPrintQuality and DefaultResolution... */ quality = ippFindAttribute(response, "print-quality-supported", IPP_TAG_ENUM); if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) { int lowdpi = 0, hidpi = 0; /* Lower and higher resolution */ for (i = 0, count = ippGetCount(attr); i < count; i ++) { const char *rs = ippGetString(attr, i, NULL); /* RS value */ if (_cups_strncasecmp(rs, "RS", 2)) continue; lowdpi = atoi(rs + 2); if ((rs = strrchr(rs, '-')) != NULL) hidpi = atoi(rs + 1); else hidpi = lowdpi; break; } if (lowdpi == 0) { /* * Invalid "urf-supported" value... */ goto bad_ppd; } else { /* * Generate print qualities based on low and high DPIs... */ cupsFilePrintf(fp, "*DefaultResolution: %ddpi\n", lowdpi); cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" "*%s.Translation cupsPrintQuality/%s: \"\"\n" "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); if ((lowdpi & 1) == 0) cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi / 2, lang->language, _cupsLangString(lang, _("Draft"))); else if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Draft"))); cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Normal"))); if (hidpi > lowdpi || ippContainsInteger(quality, IPP_QUALITY_HIGH)) cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", hidpi, hidpi, lang->language, _cupsLangString(lang, _("High"))); cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); } } else if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) { /* * Make a sorted list of resolutions. */ count = ippGetCount(attr); if (count > (int)(sizeof(resolutions) / sizeof(resolutions[0]))) count = (int)(sizeof(resolutions) / sizeof(resolutions[0])); resolutions[0] = 0; /* Not in loop to silence Clang static analyzer... */ for (i = 1; i < count; i ++) resolutions[i] = i; for (i = 0; i < (count - 1); i ++) { for (j = i + 1; j < count; j ++) { int ix, iy, /* First X and Y resolution */ jx, jy, /* Second X and Y resolution */ temp; /* Swap variable */ ipp_res_t units; /* Resolution units */ ix = ippGetResolution(attr, resolutions[i], &iy, &units); jx = ippGetResolution(attr, resolutions[j], &jy, &units); if (ix > jx || (ix == jx && iy > jy)) { /* * Swap these two resolutions... */ temp = resolutions[i]; resolutions[i] = resolutions[j]; resolutions[j] = temp; } } } /* * Generate print quality options... */ pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, ppdname, sizeof(ppdname)); cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" "*%s.Translation cupsPrintQuality/%s: \"\"\n" "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); if (count > 2 || ippContainsInteger(quality, IPP_QUALITY_DRAFT)) { pwg_ppdize_resolution(attr, resolutions[0], &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n", xres, yres); cupsFilePrintf(fp, "*%s.cupsPrintQuality Draft/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Draft"))); } pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n", xres, yres); cupsFilePrintf(fp, "*%s.cupsPrintQuality Normal/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Normal"))); if (count > 1 || ippContainsInteger(quality, IPP_QUALITY_HIGH)) { pwg_ppdize_resolution(attr, resolutions[count - 1], &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n", xres, yres); cupsFilePrintf(fp, "*%s.cupsPrintQuality High/%s: \"\"\n", lang->language, _cupsLangString(lang, _("High"))); } cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); } else if (is_apple || is_pwg) goto bad_ppd; else { if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL) { pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname)); } else { xres = yres = 300; strlcpy(ppdname, "300dpi", sizeof(ppdname)); } cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" "*%s.Translation cupsPrintQuality/%s: \"\"\n" "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Draft"))); cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Normal"))); if (ippContainsInteger(quality, IPP_QUALITY_HIGH)) cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("High"))); cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); } /* * Presets... */ if ((attr = ippFindAttribute(response, "job-presets-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { ipp_t *preset = ippGetCollection(attr, i); /* Preset collection */ const char *preset_name = ippGetString(ippFindAttribute(preset, "preset-name", IPP_TAG_ZERO), 0, NULL), /* Preset name */ *localized_name; /* Localized preset name */ ipp_attribute_t *member; /* Member attribute in preset */ const char *member_name; /* Member attribute name */ char member_value[256]; /* Member attribute value */ if (!preset || !preset_name) continue; cupsFilePrintf(fp, "*APPrinterPreset %s: \"\n", preset_name); for (member = ippFirstAttribute(preset); member; member = ippNextAttribute(preset)) { member_name = ippGetName(member); if (!member_name || !strcmp(member_name, "preset-name")) continue; if (!strcmp(member_name, "finishings")) { for (i = 0, count = ippGetCount(member); i < count; i ++) { const char *option = NULL; /* PPD option name */ keyword = ippEnumString("finishings", ippGetInteger(member, i)); if (!strcmp(keyword, "booklet-maker")) { option = "Booklet"; keyword = "True"; } else if (!strncmp(keyword, "fold-", 5)) option = "FoldType"; else if (!strncmp(keyword, "punch-", 6)) option = "PunchMedia"; else if (!strncmp(keyword, "bind-", 5) || !strncmp(keyword, "edge-stitch-", 12) || !strcmp(keyword, "saddle-stitch") || !strncmp(keyword, "staple-", 7)) option = "StapleLocation"; if (option && keyword) cupsFilePrintf(fp, "*%s %s\n", option, keyword); } } else if (!strcmp(member_name, "finishings-col")) { ipp_t *fin_col; /* finishings-col value */ for (i = 0, count = ippGetCount(member); i < count; i ++) { fin_col = ippGetCollection(member, i); if ((keyword = ippGetString(ippFindAttribute(fin_col, "finishing-template", IPP_TAG_ZERO), 0, NULL)) != NULL) cupsFilePrintf(fp, "*cupsFinishingTemplate %s\n", keyword); } } else if (!strcmp(member_name, "media")) { /* * Map media to PageSize... */ if ((pwg = pwgMediaForPWG(ippGetString(member, 0, NULL))) != NULL && pwg->ppd) cupsFilePrintf(fp, "*PageSize %s\n", pwg->ppd); } else if (!strcmp(member_name, "media-col")) { media_col = ippGetCollection(member, 0); if ((media_size = ippGetCollection(ippFindAttribute(media_col, "media-size", IPP_TAG_BEGIN_COLLECTION), 0)) != NULL) { x_dim = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER); y_dim = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER); if ((pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0))) != NULL && pwg->ppd) cupsFilePrintf(fp, "*PageSize %s\n", pwg->ppd); } if ((keyword = ippGetString(ippFindAttribute(media_col, "media-source", IPP_TAG_ZERO), 0, NULL)) != NULL) { pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); cupsFilePrintf(fp, "*InputSlot %s\n", keyword); } if ((keyword = ippGetString(ippFindAttribute(media_col, "media-type", IPP_TAG_ZERO), 0, NULL)) != NULL) { pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); cupsFilePrintf(fp, "*MediaType %s\n", keyword); } } else if (!strcmp(member_name, "print-quality")) { /* * Map print-quality to cupsPrintQuality... */ int qval = ippGetInteger(member, 0); /* print-quality value */ static const char * const qualities[] = { "Draft", "Normal", "High" }; /* cupsPrintQuality values */ if (qval >= IPP_QUALITY_DRAFT && qval <= IPP_QUALITY_HIGH) cupsFilePrintf(fp, "*cupsPrintQuality %s\n", qualities[qval - IPP_QUALITY_DRAFT]); } else if (!strcmp(member_name, "output-bin")) { pwg_ppdize_name(ippGetString(member, 0, NULL), ppdname, sizeof(ppdname)); cupsFilePrintf(fp, "*OutputBin %s\n", ppdname); } else if (!strcmp(member_name, "sides")) { keyword = ippGetString(member, 0, NULL); if (keyword && !strcmp(keyword, "one-sided")) cupsFilePuts(fp, "*Duplex None\n"); else if (keyword && !strcmp(keyword, "two-sided-long-edge")) cupsFilePuts(fp, "*Duplex DuplexNoTumble\n"); else if (keyword && !strcmp(keyword, "two-sided-short-edge")) cupsFilePuts(fp, "*Duplex DuplexTumble\n"); } else { /* * Add attribute name and value as-is... */ ippAttributeString(member, member_value, sizeof(member_value)); cupsFilePrintf(fp, "*%s %s\n", member_name, member_value); } } cupsFilePuts(fp, "\"\n*End\n"); if ((localized_name = _cupsMessageLookup(strings, preset_name)) != preset_name) cupsFilePrintf(fp, "*%s.APPrinterPreset %s/%s: \"\"\n", lang->language, preset_name, localized_name); } } /* * Close up and return... */ cupsFileClose(fp); return (buffer); /* * If we get here then there was a problem creating the PPD... */ bad_ppd: cupsFileClose(fp); unlink(buffer); *buffer = '\0'; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Printer does not support required IPP attributes or document formats."), 1); return (NULL); } /* * '_pwgInputSlotForSource()' - Get the InputSlot name for the given PWG * media-source. */ const char * /* O - InputSlot name */ _pwgInputSlotForSource( const char *media_source, /* I - PWG media-source */ char *name, /* I - Name buffer */ size_t namesize) /* I - Size of name buffer */ { /* * Range check input... */ if (!media_source || !name || namesize < PPD_MAX_NAME) return (NULL); if (_cups_strcasecmp(media_source, "main")) strlcpy(name, "Cassette", namesize); else if (_cups_strcasecmp(media_source, "alternate")) strlcpy(name, "Multipurpose", namesize); else if (_cups_strcasecmp(media_source, "large-capacity")) strlcpy(name, "LargeCapacity", namesize); else if (_cups_strcasecmp(media_source, "bottom")) strlcpy(name, "Lower", namesize); else if (_cups_strcasecmp(media_source, "middle")) strlcpy(name, "Middle", namesize); else if (_cups_strcasecmp(media_source, "top")) strlcpy(name, "Upper", namesize); else if (_cups_strcasecmp(media_source, "rear")) strlcpy(name, "Rear", namesize); else if (_cups_strcasecmp(media_source, "side")) strlcpy(name, "Side", namesize); else if (_cups_strcasecmp(media_source, "envelope")) strlcpy(name, "Envelope", namesize); else if (_cups_strcasecmp(media_source, "main-roll")) strlcpy(name, "Roll", namesize); else if (_cups_strcasecmp(media_source, "alternate-roll")) strlcpy(name, "Roll2", namesize); else pwg_ppdize_name(media_source, name, namesize); return (name); } /* * '_pwgMediaTypeForType()' - Get the MediaType name for the given PWG * media-type. */ const char * /* O - MediaType name */ _pwgMediaTypeForType( const char *media_type, /* I - PWG media-type */ char *name, /* I - Name buffer */ size_t namesize) /* I - Size of name buffer */ { /* * Range check input... */ if (!media_type || !name || namesize < PPD_MAX_NAME) return (NULL); if (_cups_strcasecmp(media_type, "auto")) strlcpy(name, "Auto", namesize); else if (_cups_strcasecmp(media_type, "cardstock")) strlcpy(name, "Cardstock", namesize); else if (_cups_strcasecmp(media_type, "envelope")) strlcpy(name, "Envelope", namesize); else if (_cups_strcasecmp(media_type, "photographic-glossy")) strlcpy(name, "Glossy", namesize); else if (_cups_strcasecmp(media_type, "photographic-high-gloss")) strlcpy(name, "HighGloss", namesize); else if (_cups_strcasecmp(media_type, "photographic-matte")) strlcpy(name, "Matte", namesize); else if (_cups_strcasecmp(media_type, "stationery")) strlcpy(name, "Plain", namesize); else if (_cups_strcasecmp(media_type, "stationery-coated")) strlcpy(name, "Coated", namesize); else if (_cups_strcasecmp(media_type, "stationery-inkjet")) strlcpy(name, "Inkjet", namesize); else if (_cups_strcasecmp(media_type, "stationery-letterhead")) strlcpy(name, "Letterhead", namesize); else if (_cups_strcasecmp(media_type, "stationery-preprinted")) strlcpy(name, "Preprinted", namesize); else if (_cups_strcasecmp(media_type, "transparency")) strlcpy(name, "Transparency", namesize); else pwg_ppdize_name(media_type, name, namesize); return (name); } /* * '_pwgPageSizeForMedia()' - Get the PageSize name for the given media. */ const char * /* O - PageSize name */ _pwgPageSizeForMedia( pwg_media_t *media, /* I - Media */ char *name, /* I - PageSize name buffer */ size_t namesize) /* I - Size of name buffer */ { const char *sizeptr, /* Pointer to size in PWG name */ *dimptr; /* Pointer to dimensions in PWG name */ /* * Range check input... */ if (!media || !name || namesize < PPD_MAX_NAME) return (NULL); /* * Copy or generate a PageSize name... */ if (media->ppd) { /* * Use a standard Adobe name... */ strlcpy(name, media->ppd, namesize); } else if (!media->pwg || !strncmp(media->pwg, "custom_", 7) || (sizeptr = strchr(media->pwg, '_')) == NULL || (dimptr = strchr(sizeptr + 1, '_')) == NULL || (size_t)(dimptr - sizeptr) > namesize) { /* * Use a name of the form "wNNNhNNN"... */ snprintf(name, namesize, "w%dh%d", (int)PWG_TO_POINTS(media->width), (int)PWG_TO_POINTS(media->length)); } else { /* * Copy the size name from class_sizename_dimensions... */ memcpy(name, sizeptr + 1, (size_t)(dimptr - sizeptr - 1)); name[dimptr - sizeptr - 1] = '\0'; } return (name); } /* * 'cups_get_url()' - Get a copy of the file at the given URL. */ static int /* O - 1 on success, 0 on failure */ cups_get_url(http_t **http, /* IO - Current HTTP connection */ const char *url, /* I - URL to get */ char *name, /* I - Temporary filename */ size_t namesize) /* I - Size of temporary filename buffer */ { char scheme[32], /* URL scheme */ userpass[256], /* URL username:password */ host[256], /* URL host */ curhost[256], /* Current host */ resource[256]; /* URL resource */ int port; /* URL port */ http_encryption_t encryption; /* Type of encryption to use */ http_status_t status; /* Status of GET request */ int fd; /* Temporary file */ if (httpSeparateURI(HTTP_URI_CODING_ALL, url, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) return (0); if (port == 443 || !strcmp(scheme, "https")) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = HTTP_ENCRYPTION_IF_REQUESTED; if (!*http || strcasecmp(host, httpGetHostname(*http, curhost, sizeof(curhost))) || httpAddrPort(httpGetAddress(*http)) != port) { httpClose(*http); *http = httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 5000, NULL); } if (!*http) return (0); if ((fd = cupsTempFd(name, (int)namesize)) < 0) return (0); status = cupsGetFd(*http, resource, fd); close(fd); if (status != HTTP_STATUS_OK) { unlink(name); *name = '\0'; return (0); } return (1); } /* * 'pwg_add_finishing()' - Add a finishings value. */ static void pwg_add_finishing( cups_array_t *finishings, /* I - Finishings array */ ipp_finishings_t template, /* I - Finishing template */ const char *name, /* I - PPD option */ const char *value) /* I - PPD choice */ { _pwg_finishings_t *f; /* New finishings value */ if ((f = (_pwg_finishings_t *)calloc(1, sizeof(_pwg_finishings_t))) != NULL) { f->value = template; f->num_options = cupsAddOption(name, value, 0, &f->options); cupsArrayAdd(finishings, f); } } /* * 'pwg_add_message()' - Add a message to the PPD cached strings. */ static void pwg_add_message(cups_array_t *a, /* I - Message catalog */ const char *msg, /* I - Message identifier */ const char *str) /* I - Localized string */ { _cups_message_t *m; /* New message */ if ((m = calloc(1, sizeof(_cups_message_t))) != NULL) { m->msg = strdup(msg); m->str = strdup(str); cupsArrayAdd(a, m); } } /* * 'pwg_compare_finishings()' - Compare two finishings values. */ static int /* O - Result of comparison */ pwg_compare_finishings( _pwg_finishings_t *a, /* I - First finishings value */ _pwg_finishings_t *b) /* I - Second finishings value */ { return ((int)b->value - (int)a->value); } /* * 'pwg_compare_sizes()' - Compare two media sizes... */ static int /* O - Result of comparison */ pwg_compare_sizes(cups_size_t *a, /* I - First media size */ cups_size_t *b) /* I - Second media size */ { return (strcmp(a->media, b->media)); } /* * 'pwg_copy_size()' - Copy a media size. */ static cups_size_t * /* O - New media size */ pwg_copy_size(cups_size_t *size) /* I - Media size to copy */ { cups_size_t *newsize = (cups_size_t *)calloc(1, sizeof(cups_size_t)); /* New media size */ if (newsize) memcpy(newsize, size, sizeof(cups_size_t)); return (newsize); } /* * 'pwg_free_finishings()' - Free a finishings value. */ static void pwg_free_finishings( _pwg_finishings_t *f) /* I - Finishings value */ { cupsFreeOptions(f->num_options, f->options); free(f); } /* * 'pwg_ppdize_name()' - Convert an IPP keyword to a PPD keyword. */ static void pwg_ppdize_name(const char *ipp, /* I - IPP keyword */ char *name, /* I - Name buffer */ size_t namesize) /* I - Size of name buffer */ { char *ptr, /* Pointer into name buffer */ *end; /* End of name buffer */ if (!ipp) { *name = '\0'; return; } *name = (char)toupper(*ipp++); for (ptr = name + 1, end = name + namesize - 1; *ipp && ptr < end;) { if (*ipp == '-' && _cups_isalnum(ipp[1])) { ipp ++; *ptr++ = (char)toupper(*ipp++ & 255); } else *ptr++ = *ipp++; } *ptr = '\0'; } /* * 'pwg_ppdize_resolution()' - Convert PWG resolution values to PPD values. */ static void pwg_ppdize_resolution( ipp_attribute_t *attr, /* I - Attribute to convert */ int element, /* I - Element to convert */ int *xres, /* O - X resolution in DPI */ int *yres, /* O - Y resolution in DPI */ char *name, /* I - Name buffer */ size_t namesize) /* I - Size of name buffer */ { ipp_res_t units; /* Units for resolution */ *xres = ippGetResolution(attr, element, yres, &units); if (units == IPP_RES_PER_CM) { *xres = (int)(*xres * 2.54); *yres = (int)(*yres * 2.54); } if (name && namesize > 4) { if (*xres == *yres) snprintf(name, namesize, "%ddpi", *xres); else snprintf(name, namesize, "%dx%ddpi", *xres, *yres); } } /* * 'pwg_unppdize_name()' - Convert a PPD keyword to a lowercase IPP keyword. */ static void pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ char *name, /* I - Name buffer */ size_t namesize, /* I - Size of name buffer */ const char *dashchars)/* I - Characters to be replaced by dashes */ { char *ptr, /* Pointer into name buffer */ *end; /* End of name buffer */ if (_cups_islower(*ppd)) { /* * Already lowercase name, use as-is? */ const char *ppdptr; /* Pointer into PPD keyword */ for (ppdptr = ppd + 1; *ppdptr; ppdptr ++) if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr)) break; if (!*ppdptr) { strlcpy(name, ppd, namesize); return; } } for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++) { if (_cups_isalnum(*ppd) || *ppd == '-') *ptr++ = (char)tolower(*ppd & 255); else if (strchr(dashchars, *ppd)) *ptr++ = '-'; else *ptr++ = *ppd; if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) && _cups_isupper(ppd[1]) && ptr < end) *ptr++ = '-'; else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255)) *ptr++ = '-'; } *ptr = '\0'; } cups-2.3.1/cups/raster-interpret.c000664 000765 000024 00000120770 13574721672 017236 0ustar00mikestaff000000 000000 /* * PPD command interpreter for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1993-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include "debug-internal.h" /* * Stack values for the PostScript mini-interpreter... */ typedef enum { CUPS_PS_NAME, CUPS_PS_NUMBER, CUPS_PS_STRING, CUPS_PS_BOOLEAN, CUPS_PS_NULL, CUPS_PS_START_ARRAY, CUPS_PS_END_ARRAY, CUPS_PS_START_DICT, CUPS_PS_END_DICT, CUPS_PS_START_PROC, CUPS_PS_END_PROC, CUPS_PS_CLEARTOMARK, CUPS_PS_COPY, CUPS_PS_DUP, CUPS_PS_INDEX, CUPS_PS_POP, CUPS_PS_ROLL, CUPS_PS_SETPAGEDEVICE, CUPS_PS_STOPPED, CUPS_PS_OTHER } _cups_ps_type_t; typedef struct { _cups_ps_type_t type; /* Object type */ union { int boolean; /* Boolean value */ char name[64]; /* Name value */ double number; /* Number value */ char other[64]; /* Other operator */ char string[64]; /* Sring value */ } value; /* Value */ } _cups_ps_obj_t; typedef struct { int num_objs, /* Number of objects on stack */ alloc_objs; /* Number of allocated objects */ _cups_ps_obj_t *objs; /* Objects in stack */ } _cups_ps_stack_t; /* * Local functions... */ static int cleartomark_stack(_cups_ps_stack_t *st); static int copy_stack(_cups_ps_stack_t *st, int count); static void delete_stack(_cups_ps_stack_t *st); static void error_object(_cups_ps_obj_t *obj); static void error_stack(_cups_ps_stack_t *st, const char *title); static _cups_ps_obj_t *index_stack(_cups_ps_stack_t *st, int n); static _cups_ps_stack_t *new_stack(void); static _cups_ps_obj_t *pop_stack(_cups_ps_stack_t *st); static _cups_ps_obj_t *push_stack(_cups_ps_stack_t *st, _cups_ps_obj_t *obj); static int roll_stack(_cups_ps_stack_t *st, int c, int s); static _cups_ps_obj_t *scan_ps(_cups_ps_stack_t *st, char **ptr); static int setpagedevice(_cups_ps_stack_t *st, cups_page_header2_t *h, int *preferred_bits); #ifdef DEBUG static void DEBUG_object(const char *prefix, _cups_ps_obj_t *obj); static void DEBUG_stack(const char *prefix, _cups_ps_stack_t *st); #endif /* DEBUG */ /* * '_cupsRasterInterpretPPD()' - Interpret PPD commands to create a page header. * * This function is used by raster image processing (RIP) filters like * cgpdftoraster and imagetoraster when writing CUPS raster data for a page. * It is not used by raster printer driver filters which only read CUPS * raster data. * * * @code cupsRasterInterpretPPD@ does not mark the options in the PPD using * the "num_options" and "options" arguments. Instead, mark the options with * @code cupsMarkOptions@ and @code ppdMarkOption@ prior to calling it - * this allows for per-page options without manipulating the options array. * * The "func" argument specifies an optional callback function that is * called prior to the computation of the final raster data. The function * can make changes to the @link cups_page_header2_t@ data as needed to use a * supported raster format and then returns 0 on success and -1 if the * requested attributes cannot be supported. * * * @code cupsRasterInterpretPPD@ supports a subset of the PostScript language. * Currently only the @code [@, @code ]@, @code <<@, @code >>@, @code {@, * @code }@, @code cleartomark@, @code copy@, @code dup@, @code index@, * @code pop@, @code roll@, @code setpagedevice@, and @code stopped@ operators * are supported. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on failure */ _cupsRasterInterpretPPD( cups_page_header2_t *h, /* O - Page header to create */ ppd_file_t *ppd, /* I - PPD file */ int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ cups_interpret_cb_t func) /* I - Optional page header callback (@code NULL@ for none) */ { int status; /* Cummulative status */ char *code; /* Code to run */ const char *val; /* Option value */ ppd_size_t *size; /* Current size */ float left, /* Left position */ bottom, /* Bottom position */ right, /* Right position */ top, /* Top position */ temp1, temp2; /* Temporary variables for swapping */ int preferred_bits; /* Preferred bits per color */ /* * Range check input... */ _cupsRasterClearError(); if (!h) { _cupsRasterAddError("Page header cannot be NULL!\n"); return (-1); } /* * Reset the page header to the defaults... */ memset(h, 0, sizeof(cups_page_header2_t)); h->NumCopies = 1; h->PageSize[0] = 612; h->PageSize[1] = 792; h->HWResolution[0] = 100; h->HWResolution[1] = 100; h->cupsBitsPerColor = 1; h->cupsColorOrder = CUPS_ORDER_CHUNKED; h->cupsColorSpace = CUPS_CSPACE_K; h->cupsBorderlessScalingFactor = 1.0f; h->cupsPageSize[0] = 612.0f; h->cupsPageSize[1] = 792.0f; h->cupsImagingBBox[0] = 0.0f; h->cupsImagingBBox[1] = 0.0f; h->cupsImagingBBox[2] = 612.0f; h->cupsImagingBBox[3] = 792.0f; strlcpy(h->cupsPageSizeName, "Letter", sizeof(h->cupsPageSizeName)); #ifdef __APPLE__ /* * cupsInteger0 is also used for the total page count on macOS; set an * uncommon default value so we can tell if the driver is using cupsInteger0. */ h->cupsInteger[0] = 0x80000000; #endif /* __APPLE__ */ /* * Apply patches and options to the page header... */ status = 0; preferred_bits = 0; if (ppd) { /* * Apply any patch code (used to override the defaults...) */ if (ppd->patches) status |= _cupsRasterExecPS(h, &preferred_bits, ppd->patches); /* * Then apply printer options in the proper order... */ if ((code = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, 0.0)) != NULL) { status |= _cupsRasterExecPS(h, &preferred_bits, code); free(code); } if ((code = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL) { status |= _cupsRasterExecPS(h, &preferred_bits, code); free(code); } if ((code = ppdEmitString(ppd, PPD_ORDER_PROLOG, 0.0)) != NULL) { status |= _cupsRasterExecPS(h, &preferred_bits, code); free(code); } if ((code = ppdEmitString(ppd, PPD_ORDER_PAGE, 0.0)) != NULL) { status |= _cupsRasterExecPS(h, &preferred_bits, code); free(code); } } /* * Allow option override for page scaling... */ if ((val = cupsGetOption("cupsBorderlessScalingFactor", num_options, options)) != NULL) { double sc = atof(val); /* Scale factor */ if (sc >= 0.1 && sc <= 2.0) h->cupsBorderlessScalingFactor = (float)sc; } /* * Get the margins for the current size... */ if ((size = ppdPageSize(ppd, NULL)) != NULL) { /* * Use the margins from the PPD file... */ left = size->left; bottom = size->bottom; right = size->right; top = size->top; strlcpy(h->cupsPageSizeName, size->name, sizeof(h->cupsPageSizeName)); h->cupsPageSize[0] = size->width; h->cupsPageSize[1] = size->length; } else { /* * Use the default margins... */ left = 0.0f; bottom = 0.0f; right = 612.0f; top = 792.0f; } /* * Handle orientation... */ switch (h->Orientation) { case CUPS_ORIENT_0 : default : /* Do nothing */ break; case CUPS_ORIENT_90 : temp1 = h->cupsPageSize[0]; h->cupsPageSize[0] = h->cupsPageSize[1]; h->cupsPageSize[1] = temp1; temp1 = left; temp2 = right; left = h->cupsPageSize[0] - top; right = h->cupsPageSize[0] - bottom; bottom = h->cupsPageSize[1] - temp1; top = h->cupsPageSize[1] - temp2; break; case CUPS_ORIENT_180 : temp1 = left; temp2 = bottom; left = h->cupsPageSize[0] - right; right = h->cupsPageSize[0] - temp1; bottom = h->cupsPageSize[1] - top; top = h->cupsPageSize[1] - temp2; break; case CUPS_ORIENT_270 : temp1 = h->cupsPageSize[0]; h->cupsPageSize[0] = h->cupsPageSize[1]; h->cupsPageSize[1] = temp1; temp1 = left; temp2 = right; left = bottom; right = top; bottom = h->cupsPageSize[1] - temp2; top = h->cupsPageSize[1] - temp1; break; } if (left > right) { temp1 = left; left = right; right = temp1; } if (bottom > top) { temp1 = bottom; bottom = top; top = temp1; } h->PageSize[0] = (unsigned)(h->cupsPageSize[0] * h->cupsBorderlessScalingFactor); h->PageSize[1] = (unsigned)(h->cupsPageSize[1] * h->cupsBorderlessScalingFactor); h->Margins[0] = (unsigned)(left * h->cupsBorderlessScalingFactor); h->Margins[1] = (unsigned)(bottom * h->cupsBorderlessScalingFactor); h->ImagingBoundingBox[0] = (unsigned)(left * h->cupsBorderlessScalingFactor); h->ImagingBoundingBox[1] = (unsigned)(bottom * h->cupsBorderlessScalingFactor); h->ImagingBoundingBox[2] = (unsigned)(right * h->cupsBorderlessScalingFactor); h->ImagingBoundingBox[3] = (unsigned)(top * h->cupsBorderlessScalingFactor); h->cupsImagingBBox[0] = (float)left; h->cupsImagingBBox[1] = (float)bottom; h->cupsImagingBBox[2] = (float)right; h->cupsImagingBBox[3] = (float)top; /* * Use the callback to validate the page header... */ if (func && (*func)(h, preferred_bits)) { _cupsRasterAddError("Page header callback returned error.\n"); return (-1); } /* * Check parameters... */ if (!h->HWResolution[0] || !h->HWResolution[1] || !h->PageSize[0] || !h->PageSize[1] || (h->cupsBitsPerColor != 1 && h->cupsBitsPerColor != 2 && h->cupsBitsPerColor != 4 && h->cupsBitsPerColor != 8 && h->cupsBitsPerColor != 16) || h->cupsBorderlessScalingFactor < 0.1 || h->cupsBorderlessScalingFactor > 2.0) { _cupsRasterAddError("Page header uses unsupported values.\n"); return (-1); } /* * Compute the bitmap parameters... */ h->cupsWidth = (unsigned)((right - left) * h->cupsBorderlessScalingFactor * h->HWResolution[0] / 72.0f + 0.5f); h->cupsHeight = (unsigned)((top - bottom) * h->cupsBorderlessScalingFactor * h->HWResolution[1] / 72.0f + 0.5f); switch (h->cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_K : case CUPS_CSPACE_WHITE : case CUPS_CSPACE_GOLD : case CUPS_CSPACE_SILVER : case CUPS_CSPACE_SW : h->cupsNumColors = 1; h->cupsBitsPerPixel = h->cupsBitsPerColor; break; default : /* * Ensure that colorimetric colorspaces use at least 8 bits per * component... */ if (h->cupsColorSpace >= CUPS_CSPACE_CIEXYZ && h->cupsBitsPerColor < 8) h->cupsBitsPerColor = 8; /* * Figure out the number of bits per pixel... */ if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) { if (h->cupsBitsPerColor >= 8) h->cupsBitsPerPixel = h->cupsBitsPerColor * 3; else h->cupsBitsPerPixel = h->cupsBitsPerColor * 4; } else h->cupsBitsPerPixel = h->cupsBitsPerColor; h->cupsNumColors = 3; break; case CUPS_CSPACE_KCMYcm : if (h->cupsBitsPerColor == 1) { if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) h->cupsBitsPerPixel = 8; else h->cupsBitsPerPixel = 1; h->cupsNumColors = 6; break; } /* * Fall through to CMYK code... */ case CUPS_CSPACE_RGBA : case CUPS_CSPACE_RGBW : case CUPS_CSPACE_CMYK : case CUPS_CSPACE_YMCK : case CUPS_CSPACE_KCMY : case CUPS_CSPACE_GMCK : case CUPS_CSPACE_GMCS : if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) h->cupsBitsPerPixel = h->cupsBitsPerColor * 4; else h->cupsBitsPerPixel = h->cupsBitsPerColor; h->cupsNumColors = 4; break; case CUPS_CSPACE_DEVICE1 : case CUPS_CSPACE_DEVICE2 : case CUPS_CSPACE_DEVICE3 : case CUPS_CSPACE_DEVICE4 : case CUPS_CSPACE_DEVICE5 : case CUPS_CSPACE_DEVICE6 : case CUPS_CSPACE_DEVICE7 : case CUPS_CSPACE_DEVICE8 : case CUPS_CSPACE_DEVICE9 : case CUPS_CSPACE_DEVICEA : case CUPS_CSPACE_DEVICEB : case CUPS_CSPACE_DEVICEC : case CUPS_CSPACE_DEVICED : case CUPS_CSPACE_DEVICEE : case CUPS_CSPACE_DEVICEF : h->cupsNumColors = h->cupsColorSpace - CUPS_CSPACE_DEVICE1 + 1; if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) h->cupsBitsPerPixel = h->cupsBitsPerColor * h->cupsNumColors; else h->cupsBitsPerPixel = h->cupsBitsPerColor; break; } h->cupsBytesPerLine = (h->cupsBitsPerPixel * h->cupsWidth + 7) / 8; if (h->cupsColorOrder == CUPS_ORDER_BANDED) h->cupsBytesPerLine *= h->cupsNumColors; return (status); } /* * '_cupsRasterExecPS()' - Execute PostScript code to initialize a page header. */ int /* O - 0 on success, -1 on error */ _cupsRasterExecPS( cups_page_header2_t *h, /* O - Page header */ int *preferred_bits,/* O - Preferred bits per color */ const char *code) /* I - PS code to execute */ { int error = 0; /* Error condition? */ _cups_ps_stack_t *st; /* PostScript value stack */ _cups_ps_obj_t *obj; /* Object from top of stack */ char *codecopy, /* Copy of code */ *codeptr; /* Pointer into copy of code */ DEBUG_printf(("_cupsRasterExecPS(h=%p, preferred_bits=%p, code=\"%s\")\n", h, preferred_bits, code)); /* * Copy the PostScript code and create a stack... */ if ((codecopy = strdup(code)) == NULL) { _cupsRasterAddError("Unable to duplicate code string.\n"); return (-1); } if ((st = new_stack()) == NULL) { _cupsRasterAddError("Unable to create stack.\n"); free(codecopy); return (-1); } /* * Parse the PS string until we run out of data... */ codeptr = codecopy; while ((obj = scan_ps(st, &codeptr)) != NULL) { #ifdef DEBUG DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)", st->num_objs)); DEBUG_object("_cupsRasterExecPS", obj); #endif /* DEBUG */ switch (obj->type) { default : /* Do nothing for regular values */ break; case CUPS_PS_CLEARTOMARK : pop_stack(st); if (cleartomark_stack(st)) _cupsRasterAddError("cleartomark: Stack underflow.\n"); #ifdef DEBUG DEBUG_puts("1_cupsRasterExecPS: dup"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ break; case CUPS_PS_COPY : pop_stack(st); if ((obj = pop_stack(st)) != NULL) { copy_stack(st, (int)obj->value.number); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: copy"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ } break; case CUPS_PS_DUP : pop_stack(st); copy_stack(st, 1); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: dup"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ break; case CUPS_PS_INDEX : pop_stack(st); if ((obj = pop_stack(st)) != NULL) { index_stack(st, (int)obj->value.number); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: index"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ } break; case CUPS_PS_POP : pop_stack(st); pop_stack(st); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: pop"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ break; case CUPS_PS_ROLL : pop_stack(st); if ((obj = pop_stack(st)) != NULL) { int c; /* Count */ c = (int)obj->value.number; if ((obj = pop_stack(st)) != NULL) { roll_stack(st, (int)obj->value.number, c); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: roll"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ } } break; case CUPS_PS_SETPAGEDEVICE : pop_stack(st); setpagedevice(st, h, preferred_bits); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: setpagedevice"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ break; case CUPS_PS_START_PROC : case CUPS_PS_END_PROC : case CUPS_PS_STOPPED : pop_stack(st); break; case CUPS_PS_OTHER : _cupsRasterAddError("Unknown operator \"%s\".\n", obj->value.other); error = 1; DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\".", obj->value.other)); break; } if (error) break; } /* * Cleanup... */ free(codecopy); if (st->num_objs > 0) { error_stack(st, "Stack not empty:"); #ifdef DEBUG DEBUG_puts("_cupsRasterExecPS: Stack not empty"); DEBUG_stack("_cupsRasterExecPS", st); #endif /* DEBUG */ delete_stack(st); return (-1); } delete_stack(st); /* * Return success... */ return (0); } /* * 'cleartomark_stack()' - Clear to the last mark ([) on the stack. */ static int /* O - 0 on success, -1 on error */ cleartomark_stack(_cups_ps_stack_t *st) /* I - Stack */ { _cups_ps_obj_t *obj; /* Current object on stack */ while ((obj = pop_stack(st)) != NULL) if (obj->type == CUPS_PS_START_ARRAY) break; return (obj ? 0 : -1); } /* * 'copy_stack()' - Copy the top N stack objects. */ static int /* O - 0 on success, -1 on error */ copy_stack(_cups_ps_stack_t *st, /* I - Stack */ int c) /* I - Number of objects to copy */ { int n; /* Index */ if (c < 0) return (-1); else if (c == 0) return (0); if ((n = st->num_objs - c) < 0) return (-1); while (c > 0) { if (!push_stack(st, st->objs + n)) return (-1); n ++; c --; } return (0); } /* * 'delete_stack()' - Free memory used by a stack. */ static void delete_stack(_cups_ps_stack_t *st) /* I - Stack */ { free(st->objs); free(st); } /* * 'error_object()' - Add an object's value to the current error message. */ static void error_object(_cups_ps_obj_t *obj) /* I - Object to add */ { switch (obj->type) { case CUPS_PS_NAME : _cupsRasterAddError(" /%s", obj->value.name); break; case CUPS_PS_NUMBER : _cupsRasterAddError(" %g", obj->value.number); break; case CUPS_PS_STRING : _cupsRasterAddError(" (%s)", obj->value.string); break; case CUPS_PS_BOOLEAN : if (obj->value.boolean) _cupsRasterAddError(" true"); else _cupsRasterAddError(" false"); break; case CUPS_PS_NULL : _cupsRasterAddError(" null"); break; case CUPS_PS_START_ARRAY : _cupsRasterAddError(" ["); break; case CUPS_PS_END_ARRAY : _cupsRasterAddError(" ]"); break; case CUPS_PS_START_DICT : _cupsRasterAddError(" <<"); break; case CUPS_PS_END_DICT : _cupsRasterAddError(" >>"); break; case CUPS_PS_START_PROC : _cupsRasterAddError(" {"); break; case CUPS_PS_END_PROC : _cupsRasterAddError(" }"); break; case CUPS_PS_COPY : _cupsRasterAddError(" --copy--"); break; case CUPS_PS_CLEARTOMARK : _cupsRasterAddError(" --cleartomark--"); break; case CUPS_PS_DUP : _cupsRasterAddError(" --dup--"); break; case CUPS_PS_INDEX : _cupsRasterAddError(" --index--"); break; case CUPS_PS_POP : _cupsRasterAddError(" --pop--"); break; case CUPS_PS_ROLL : _cupsRasterAddError(" --roll--"); break; case CUPS_PS_SETPAGEDEVICE : _cupsRasterAddError(" --setpagedevice--"); break; case CUPS_PS_STOPPED : _cupsRasterAddError(" --stopped--"); break; case CUPS_PS_OTHER : _cupsRasterAddError(" --%s--", obj->value.other); break; } } /* * 'error_stack()' - Add a stack to the current error message... */ static void error_stack(_cups_ps_stack_t *st, /* I - Stack */ const char *title) /* I - Title string */ { int c; /* Looping var */ _cups_ps_obj_t *obj; /* Current object on stack */ _cupsRasterAddError("%s", title); for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++) error_object(obj); _cupsRasterAddError("\n"); } /* * 'index_stack()' - Copy the Nth value on the stack. */ static _cups_ps_obj_t * /* O - New object */ index_stack(_cups_ps_stack_t *st, /* I - Stack */ int n) /* I - Object index */ { if (n < 0 || (n = st->num_objs - n - 1) < 0) return (NULL); return (push_stack(st, st->objs + n)); } /* * 'new_stack()' - Create a new stack. */ static _cups_ps_stack_t * /* O - New stack */ new_stack(void) { _cups_ps_stack_t *st; /* New stack */ if ((st = calloc(1, sizeof(_cups_ps_stack_t))) == NULL) return (NULL); st->alloc_objs = 32; if ((st->objs = calloc(32, sizeof(_cups_ps_obj_t))) == NULL) { free(st); return (NULL); } else return (st); } /* * 'pop_stock()' - Pop the top object off the stack. */ static _cups_ps_obj_t * /* O - Object */ pop_stack(_cups_ps_stack_t *st) /* I - Stack */ { if (st->num_objs > 0) { st->num_objs --; return (st->objs + st->num_objs); } else return (NULL); } /* * 'push_stack()' - Push an object on the stack. */ static _cups_ps_obj_t * /* O - New object */ push_stack(_cups_ps_stack_t *st, /* I - Stack */ _cups_ps_obj_t *obj) /* I - Object */ { _cups_ps_obj_t *temp; /* New object */ if (st->num_objs >= st->alloc_objs) { st->alloc_objs += 32; if ((temp = realloc(st->objs, (size_t)st->alloc_objs * sizeof(_cups_ps_obj_t))) == NULL) return (NULL); st->objs = temp; memset(temp + st->num_objs, 0, 32 * sizeof(_cups_ps_obj_t)); } temp = st->objs + st->num_objs; st->num_objs ++; memcpy(temp, obj, sizeof(_cups_ps_obj_t)); return (temp); } /* * 'roll_stack()' - Rotate stack objects. */ static int /* O - 0 on success, -1 on error */ roll_stack(_cups_ps_stack_t *st, /* I - Stack */ int c, /* I - Number of objects */ int s) /* I - Amount to shift */ { _cups_ps_obj_t *temp; /* Temporary array of objects */ int n; /* Index into array */ DEBUG_printf(("3roll_stack(st=%p, s=%d, c=%d)", st, s, c)); /* * Range check input... */ if (c < 0) return (-1); else if (c == 0) return (0); if ((n = st->num_objs - c) < 0) return (-1); s %= c; if (s == 0) return (0); /* * Copy N objects and move things around... */ if (s < 0) { /* * Shift down... */ s = -s; if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL) return (-1); memcpy(temp, st->objs + n, (size_t)s * sizeof(_cups_ps_obj_t)); memmove(st->objs + n, st->objs + n + s, (size_t)(c - s) * sizeof(_cups_ps_obj_t)); memcpy(st->objs + n + c - s, temp, (size_t)s * sizeof(_cups_ps_obj_t)); } else { /* * Shift up... */ if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL) return (-1); memcpy(temp, st->objs + n + c - s, (size_t)s * sizeof(_cups_ps_obj_t)); memmove(st->objs + n + s, st->objs + n, (size_t)(c - s) * sizeof(_cups_ps_obj_t)); memcpy(st->objs + n, temp, (size_t)s * sizeof(_cups_ps_obj_t)); } free(temp); return (0); } /* * 'scan_ps()' - Scan a string for the next PS object. */ static _cups_ps_obj_t * /* O - New object or NULL on EOF */ scan_ps(_cups_ps_stack_t *st, /* I - Stack */ char **ptr) /* IO - String pointer */ { _cups_ps_obj_t obj; /* Current object */ char *start, /* Start of object */ *cur, /* Current position */ *valptr, /* Pointer into value string */ *valend; /* End of value string */ int parens; /* Parenthesis nesting level */ /* * Skip leading whitespace... */ for (cur = *ptr; *cur; cur ++) { if (*cur == '%') { /* * Comment, skip to end of line... */ for (cur ++; *cur && *cur != '\n' && *cur != '\r'; cur ++); if (!*cur) cur --; } else if (!isspace(*cur & 255)) break; } if (!*cur) { *ptr = NULL; return (NULL); } /* * See what we have... */ memset(&obj, 0, sizeof(obj)); switch (*cur) { case '(' : /* (string) */ obj.type = CUPS_PS_STRING; start = cur; for (cur ++, parens = 1, valptr = obj.value.string, valend = obj.value.string + sizeof(obj.value.string) - 1; *cur; cur ++) { if (*cur == ')' && parens == 1) break; if (*cur == '(') parens ++; else if (*cur == ')') parens --; if (valptr >= valend) { *ptr = start; return (NULL); } if (*cur == '\\') { /* * Decode escaped character... */ cur ++; if (*cur == 'b') *valptr++ = '\b'; else if (*cur == 'f') *valptr++ = '\f'; else if (*cur == 'n') *valptr++ = '\n'; else if (*cur == 'r') *valptr++ = '\r'; else if (*cur == 't') *valptr++ = '\t'; else if (*cur >= '0' && *cur <= '7') { int ch = *cur - '0'; if (cur[1] >= '0' && cur[1] <= '7') { cur ++; ch = (ch << 3) + *cur - '0'; } if (cur[1] >= '0' && cur[1] <= '7') { cur ++; ch = (ch << 3) + *cur - '0'; } *valptr++ = (char)ch; } else if (*cur == '\r') { if (cur[1] == '\n') cur ++; } else if (*cur != '\n') *valptr++ = *cur; } else *valptr++ = *cur; } if (*cur != ')') { *ptr = start; return (NULL); } cur ++; break; case '[' : /* Start array */ obj.type = CUPS_PS_START_ARRAY; cur ++; break; case ']' : /* End array */ obj.type = CUPS_PS_END_ARRAY; cur ++; break; case '<' : /* Start dictionary or hex string */ if (cur[1] == '<') { obj.type = CUPS_PS_START_DICT; cur += 2; } else { obj.type = CUPS_PS_STRING; start = cur; for (cur ++, valptr = obj.value.string, valend = obj.value.string + sizeof(obj.value.string) - 1; *cur; cur ++) { int ch; /* Current character */ if (*cur == '>') break; else if (valptr >= valend || !isxdigit(*cur & 255)) { *ptr = start; return (NULL); } if (*cur >= '0' && *cur <= '9') ch = (*cur - '0') << 4; else ch = (tolower(*cur) - 'a' + 10) << 4; if (isxdigit(cur[1] & 255)) { cur ++; if (*cur >= '0' && *cur <= '9') ch |= *cur - '0'; else ch |= tolower(*cur) - 'a' + 10; } *valptr++ = (char)ch; } if (*cur != '>') { *ptr = start; return (NULL); } cur ++; } break; case '>' : /* End dictionary? */ if (cur[1] == '>') { obj.type = CUPS_PS_END_DICT; cur += 2; } else { obj.type = CUPS_PS_OTHER; obj.value.other[0] = *cur; cur ++; } break; case '{' : /* Start procedure */ obj.type = CUPS_PS_START_PROC; cur ++; break; case '}' : /* End procedure */ obj.type = CUPS_PS_END_PROC; cur ++; break; case '-' : /* Possible number */ case '+' : if (!isdigit(cur[1] & 255) && cur[1] != '.') { obj.type = CUPS_PS_OTHER; obj.value.other[0] = *cur; cur ++; break; } case '0' : /* Number */ case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : case '.' : obj.type = CUPS_PS_NUMBER; start = cur; for (cur ++; *cur; cur ++) if (!isdigit(*cur & 255)) break; if (*cur == '#') { /* * Integer with radix... */ obj.value.number = strtol(cur + 1, &cur, atoi(start)); break; } else if (strchr(".Ee()<>[]{}/%", *cur) || isspace(*cur & 255)) { /* * Integer or real number... */ obj.value.number = _cupsStrScand(start, &cur, localeconv()); break; } else cur = start; default : /* Operator/variable name */ start = cur; if (*cur == '/') { obj.type = CUPS_PS_NAME; valptr = obj.value.name; valend = obj.value.name + sizeof(obj.value.name) - 1; cur ++; } else { obj.type = CUPS_PS_OTHER; valptr = obj.value.other; valend = obj.value.other + sizeof(obj.value.other) - 1; } while (*cur) { if (strchr("()<>[]{}/%", *cur) || isspace(*cur & 255)) break; else if (valptr < valend) *valptr++ = *cur++; else { *ptr = start; return (NULL); } } if (obj.type == CUPS_PS_OTHER) { if (!strcmp(obj.value.other, "true")) { obj.type = CUPS_PS_BOOLEAN; obj.value.boolean = 1; } else if (!strcmp(obj.value.other, "false")) { obj.type = CUPS_PS_BOOLEAN; obj.value.boolean = 0; } else if (!strcmp(obj.value.other, "null")) obj.type = CUPS_PS_NULL; else if (!strcmp(obj.value.other, "cleartomark")) obj.type = CUPS_PS_CLEARTOMARK; else if (!strcmp(obj.value.other, "copy")) obj.type = CUPS_PS_COPY; else if (!strcmp(obj.value.other, "dup")) obj.type = CUPS_PS_DUP; else if (!strcmp(obj.value.other, "index")) obj.type = CUPS_PS_INDEX; else if (!strcmp(obj.value.other, "pop")) obj.type = CUPS_PS_POP; else if (!strcmp(obj.value.other, "roll")) obj.type = CUPS_PS_ROLL; else if (!strcmp(obj.value.other, "setpagedevice")) obj.type = CUPS_PS_SETPAGEDEVICE; else if (!strcmp(obj.value.other, "stopped")) obj.type = CUPS_PS_STOPPED; } break; } /* * Save the current position in the string and return the new object... */ *ptr = cur; return (push_stack(st, &obj)); } /* * 'setpagedevice()' - Simulate the PostScript setpagedevice operator. */ static int /* O - 0 on success, -1 on error */ setpagedevice( _cups_ps_stack_t *st, /* I - Stack */ cups_page_header2_t *h, /* O - Page header */ int *preferred_bits)/* O - Preferred bits per color */ { int i; /* Index into array */ _cups_ps_obj_t *obj, /* Current object */ *end; /* End of dictionary */ const char *name; /* Attribute name */ /* * Make sure we have a dictionary on the stack... */ if (st->num_objs == 0) return (-1); obj = end = st->objs + st->num_objs - 1; if (obj->type != CUPS_PS_END_DICT) return (-1); obj --; while (obj > st->objs) { if (obj->type == CUPS_PS_START_DICT) break; obj --; } if (obj < st->objs) return (-1); /* * Found the start of the dictionary, empty the stack to this point... */ st->num_objs = (int)(obj - st->objs); /* * Now pull /name and value pairs from the dictionary... */ DEBUG_puts("3setpagedevice: Dictionary:"); for (obj ++; obj < end; obj ++) { /* * Grab the name... */ if (obj->type != CUPS_PS_NAME) return (-1); name = obj->value.name; obj ++; #ifdef DEBUG DEBUG_printf(("4setpagedevice: /%s ", name)); DEBUG_object("setpagedevice", obj); #endif /* DEBUG */ /* * Then grab the value... */ if (!strcmp(name, "MediaClass") && obj->type == CUPS_PS_STRING) strlcpy(h->MediaClass, obj->value.string, sizeof(h->MediaClass)); else if (!strcmp(name, "MediaColor") && obj->type == CUPS_PS_STRING) strlcpy(h->MediaColor, obj->value.string, sizeof(h->MediaColor)); else if (!strcmp(name, "MediaType") && obj->type == CUPS_PS_STRING) strlcpy(h->MediaType, obj->value.string, sizeof(h->MediaType)); else if (!strcmp(name, "OutputType") && obj->type == CUPS_PS_STRING) strlcpy(h->OutputType, obj->value.string, sizeof(h->OutputType)); else if (!strcmp(name, "AdvanceDistance") && obj->type == CUPS_PS_NUMBER) h->AdvanceDistance = (unsigned)obj->value.number; else if (!strcmp(name, "AdvanceMedia") && obj->type == CUPS_PS_NUMBER) h->AdvanceMedia = (unsigned)obj->value.number; else if (!strcmp(name, "Collate") && obj->type == CUPS_PS_BOOLEAN) h->Collate = (unsigned)obj->value.boolean; else if (!strcmp(name, "CutMedia") && obj->type == CUPS_PS_NUMBER) h->CutMedia = (cups_cut_t)(unsigned)obj->value.number; else if (!strcmp(name, "Duplex") && obj->type == CUPS_PS_BOOLEAN) h->Duplex = (unsigned)obj->value.boolean; else if (!strcmp(name, "HWResolution") && obj->type == CUPS_PS_START_ARRAY) { if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER && obj[3].type == CUPS_PS_END_ARRAY) { h->HWResolution[0] = (unsigned)obj[1].value.number; h->HWResolution[1] = (unsigned)obj[2].value.number; obj += 3; } else return (-1); } else if (!strcmp(name, "InsertSheet") && obj->type == CUPS_PS_BOOLEAN) h->InsertSheet = (unsigned)obj->value.boolean; else if (!strcmp(name, "Jog") && obj->type == CUPS_PS_NUMBER) h->Jog = (unsigned)obj->value.number; else if (!strcmp(name, "LeadingEdge") && obj->type == CUPS_PS_NUMBER) h->LeadingEdge = (unsigned)obj->value.number; else if (!strcmp(name, "ManualFeed") && obj->type == CUPS_PS_BOOLEAN) h->ManualFeed = (unsigned)obj->value.boolean; else if ((!strcmp(name, "cupsMediaPosition") || !strcmp(name, "MediaPosition")) && obj->type == CUPS_PS_NUMBER) { /* * cupsMediaPosition is supported for backwards compatibility only. * We added it back in the Ghostscript 5.50 days to work around a * bug in Ghostscript WRT handling of MediaPosition and setpagedevice. * * All new development should set MediaPosition... */ h->MediaPosition = (unsigned)obj->value.number; } else if (!strcmp(name, "MediaWeight") && obj->type == CUPS_PS_NUMBER) h->MediaWeight = (unsigned)obj->value.number; else if (!strcmp(name, "MirrorPrint") && obj->type == CUPS_PS_BOOLEAN) h->MirrorPrint = (unsigned)obj->value.boolean; else if (!strcmp(name, "NegativePrint") && obj->type == CUPS_PS_BOOLEAN) h->NegativePrint = (unsigned)obj->value.boolean; else if (!strcmp(name, "NumCopies") && obj->type == CUPS_PS_NUMBER) h->NumCopies = (unsigned)obj->value.number; else if (!strcmp(name, "Orientation") && obj->type == CUPS_PS_NUMBER) h->Orientation = (unsigned)obj->value.number; else if (!strcmp(name, "OutputFaceUp") && obj->type == CUPS_PS_BOOLEAN) h->OutputFaceUp = (unsigned)obj->value.boolean; else if (!strcmp(name, "PageSize") && obj->type == CUPS_PS_START_ARRAY) { if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER && obj[3].type == CUPS_PS_END_ARRAY) { h->cupsPageSize[0] = (float)obj[1].value.number; h->cupsPageSize[1] = (float)obj[2].value.number; h->PageSize[0] = (unsigned)obj[1].value.number; h->PageSize[1] = (unsigned)obj[2].value.number; obj += 3; } else return (-1); } else if (!strcmp(name, "Separations") && obj->type == CUPS_PS_BOOLEAN) h->Separations = (unsigned)obj->value.boolean; else if (!strcmp(name, "TraySwitch") && obj->type == CUPS_PS_BOOLEAN) h->TraySwitch = (unsigned)obj->value.boolean; else if (!strcmp(name, "Tumble") && obj->type == CUPS_PS_BOOLEAN) h->Tumble = (unsigned)obj->value.boolean; else if (!strcmp(name, "cupsMediaType") && obj->type == CUPS_PS_NUMBER) h->cupsMediaType = (unsigned)obj->value.number; else if (!strcmp(name, "cupsBitsPerColor") && obj->type == CUPS_PS_NUMBER) h->cupsBitsPerColor = (unsigned)obj->value.number; else if (!strcmp(name, "cupsPreferredBitsPerColor") && obj->type == CUPS_PS_NUMBER) *preferred_bits = (int)obj->value.number; else if (!strcmp(name, "cupsColorOrder") && obj->type == CUPS_PS_NUMBER) h->cupsColorOrder = (cups_order_t)(unsigned)obj->value.number; else if (!strcmp(name, "cupsColorSpace") && obj->type == CUPS_PS_NUMBER) h->cupsColorSpace = (cups_cspace_t)(unsigned)obj->value.number; else if (!strcmp(name, "cupsCompression") && obj->type == CUPS_PS_NUMBER) h->cupsCompression = (unsigned)obj->value.number; else if (!strcmp(name, "cupsRowCount") && obj->type == CUPS_PS_NUMBER) h->cupsRowCount = (unsigned)obj->value.number; else if (!strcmp(name, "cupsRowFeed") && obj->type == CUPS_PS_NUMBER) h->cupsRowFeed = (unsigned)obj->value.number; else if (!strcmp(name, "cupsRowStep") && obj->type == CUPS_PS_NUMBER) h->cupsRowStep = (unsigned)obj->value.number; else if (!strcmp(name, "cupsBorderlessScalingFactor") && obj->type == CUPS_PS_NUMBER) h->cupsBorderlessScalingFactor = (float)obj->value.number; else if (!strncmp(name, "cupsInteger", 11) && obj->type == CUPS_PS_NUMBER) { if ((i = atoi(name + 11)) < 0 || i > 15) return (-1); h->cupsInteger[i] = (unsigned)obj->value.number; } else if (!strncmp(name, "cupsReal", 8) && obj->type == CUPS_PS_NUMBER) { if ((i = atoi(name + 8)) < 0 || i > 15) return (-1); h->cupsReal[i] = (float)obj->value.number; } else if (!strncmp(name, "cupsString", 10) && obj->type == CUPS_PS_STRING) { if ((i = atoi(name + 10)) < 0 || i > 15) return (-1); strlcpy(h->cupsString[i], obj->value.string, sizeof(h->cupsString[i])); } else if (!strcmp(name, "cupsMarkerType") && obj->type == CUPS_PS_STRING) strlcpy(h->cupsMarkerType, obj->value.string, sizeof(h->cupsMarkerType)); else if (!strcmp(name, "cupsPageSizeName") && obj->type == CUPS_PS_STRING) strlcpy(h->cupsPageSizeName, obj->value.string, sizeof(h->cupsPageSizeName)); else if (!strcmp(name, "cupsRenderingIntent") && obj->type == CUPS_PS_STRING) strlcpy(h->cupsRenderingIntent, obj->value.string, sizeof(h->cupsRenderingIntent)); else { /* * Ignore unknown name+value... */ DEBUG_printf(("4setpagedevice: Unknown name (\"%s\") or value...\n", name)); while (obj[1].type != CUPS_PS_NAME && obj < end) obj ++; } } return (0); } #ifdef DEBUG /* * 'DEBUG_object()' - Print an object's value... */ static void DEBUG_object(const char *prefix, /* I - Prefix string */ _cups_ps_obj_t *obj) /* I - Object to print */ { switch (obj->type) { case CUPS_PS_NAME : DEBUG_printf(("4%s: /%s\n", prefix, obj->value.name)); break; case CUPS_PS_NUMBER : DEBUG_printf(("4%s: %g\n", prefix, obj->value.number)); break; case CUPS_PS_STRING : DEBUG_printf(("4%s: (%s)\n", prefix, obj->value.string)); break; case CUPS_PS_BOOLEAN : if (obj->value.boolean) DEBUG_printf(("4%s: true", prefix)); else DEBUG_printf(("4%s: false", prefix)); break; case CUPS_PS_NULL : DEBUG_printf(("4%s: null", prefix)); break; case CUPS_PS_START_ARRAY : DEBUG_printf(("4%s: [", prefix)); break; case CUPS_PS_END_ARRAY : DEBUG_printf(("4%s: ]", prefix)); break; case CUPS_PS_START_DICT : DEBUG_printf(("4%s: <<", prefix)); break; case CUPS_PS_END_DICT : DEBUG_printf(("4%s: >>", prefix)); break; case CUPS_PS_START_PROC : DEBUG_printf(("4%s: {", prefix)); break; case CUPS_PS_END_PROC : DEBUG_printf(("4%s: }", prefix)); break; case CUPS_PS_CLEARTOMARK : DEBUG_printf(("4%s: --cleartomark--", prefix)); break; case CUPS_PS_COPY : DEBUG_printf(("4%s: --copy--", prefix)); break; case CUPS_PS_DUP : DEBUG_printf(("4%s: --dup--", prefix)); break; case CUPS_PS_INDEX : DEBUG_printf(("4%s: --index--", prefix)); break; case CUPS_PS_POP : DEBUG_printf(("4%s: --pop--", prefix)); break; case CUPS_PS_ROLL : DEBUG_printf(("4%s: --roll--", prefix)); break; case CUPS_PS_SETPAGEDEVICE : DEBUG_printf(("4%s: --setpagedevice--", prefix)); break; case CUPS_PS_STOPPED : DEBUG_printf(("4%s: --stopped--", prefix)); break; case CUPS_PS_OTHER : DEBUG_printf(("4%s: --%s--", prefix, obj->value.other)); break; } } /* * 'DEBUG_stack()' - Print a stack... */ static void DEBUG_stack(const char *prefix, /* I - Prefix string */ _cups_ps_stack_t *st) /* I - Stack */ { int c; /* Looping var */ _cups_ps_obj_t *obj; /* Current object on stack */ for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++) DEBUG_object(prefix, obj); } #endif /* DEBUG */ cups-2.3.1/cups/versioning.h000664 000765 000024 00000025210 13574721672 016105 0ustar00mikestaff000000 000000 /* * API versioning definitions for CUPS. * * Copyright © 2007-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_VERSIONING_H_ # define _CUPS_VERSIONING_H_ /* * This header defines several macros that add compiler-specific attributes for * functions: * * - _CUPS_API_major_minor[_patch]: Specifies when an API became available by * CUPS version. * - _CUPS_DEPRECATED: Function is deprecated with no replacement. * - _CUPS_DEPRECATED_MSG("message"): Function is deprecated and has a * replacement. * - _CUPS_FORMAT(format-index, additional-args-index): Function has a * printf-style format argument followed by zero or more additional * arguments. Indices start at 1. * - _CUPS_INTERNAL: Function is internal with no replacement API. * - _CUPS_INTERNAL_MSG("msg"): Function is internal - use specified API * instead. * - _CUPS_NONNULL((arg list)): Specifies the comma-separated argument indices * are assumed non-NULL. Indices start at 1. * - _CUPS_NORETURN: Specifies the function does not return. * - _CUPS_PRIVATE: Specifies the function is private to CUPS. * - _CUPS_PUBLIC: Specifies the function is public API. */ /* * Determine which compiler is being used and what annotation features are * available... */ # ifdef __APPLE__ # include # endif /* __APPLE__ */ # ifdef __has_extension /* Clang */ # define _CUPS_HAS_DEPRECATED # define _CUPS_HAS_FORMAT # define _CUPS_HAS_NORETURN # define _CUPS_HAS_VISIBILITY # if __has_extension(attribute_deprecated_with_message) # define _CUPS_HAS_DEPRECATED_WITH_MESSAGE # endif # if __has_extension(attribute_unavailable_with_message) # define _CUPS_HAS_UNAVAILABLE_WITH_MESSAGE # endif # elif defined(__GNUC__) /* GCC and compatible */ # if __GNUC__ >= 3 /* GCC 3.0 or higher */ # define _CUPS_HAS_DEPRECATED # define _CUPS_HAS_FORMAT # define _CUPS_HAS_NORETURN # define _CUPS_HAS_VISIBILITY # endif /* __GNUC__ >= 3 */ # if __GNUC__ >= 5 /* GCC 5.x */ # define _CUPS_HAS_DEPRECATED_WITH_MESSAGE # elif __GNUC__ == 4 && __GNUC_MINOR__ >= 5 /* GCC 4.5 or higher */ # define _CUPS_HAS_DEPRECATED_WITH_MESSAGE # endif /* __GNUC__ >= 5 */ # elif defined(_WIN32) # define __attribute__(...) # endif /* __has_extension */ /* * Define _CUPS_INTERNAL, _CUPS_PRIVATE, and _CUPS_PUBLIC visibilty macros for * internal/private/public functions... */ # ifdef _CUPS_HAS_VISIBILITY # define _CUPS_INTERNAL __attribute__ ((visibility("hidden"))) # define _CUPS_PRIVATE __attribute__ ((visibility("default"))) # define _CUPS_PUBLIC __attribute__ ((visibility("default"))) # elif defined(_WIN32) && defined(LIBCUPS2_EXPORTS) && 0 # define _CUPS_INTERNAL # define _CUPS_PRIVATE __declspec(dllexport) # define _CUPS_PUBLIC __declspec(dllexport) # else # define _CUPS_INTERNAL # define _CUPS_PRIVATE # define _CUPS_PUBLIC # endif /* _CUPS_HAS_VISIBILITY */ /* * Define _CUPS_API_major_minor[_patch] availability macros for CUPS. * * Note: Using any of the _CUPS_API macros automatically adds _CUPS_PUBLIC. */ # if defined(__APPLE__) && !defined(_CUPS_SOURCE) && TARGET_OS_OSX /* * On Apple operating systems, the _CUPS_API_* constants are defined using the * API_ macros in . * * On iOS, we don't actually have libcups available directly, but the supplied * libcups_static target in the Xcode project supports building on iOS 11.0 and * later. */ # define _CUPS_API_1_1_19 API_AVAILABLE(macos(10.3), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_1_20 API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_1_21 API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_2 API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_3 API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_4 API_AVAILABLE(macos(10.6), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_5 API_AVAILABLE(macos(10.7), ios(11.0)) _CUPS_PUBLIC # define _CUPS_API_1_6 API_AVAILABLE(macos(10.8), ios(11.0)) _CUPS_PUBLIC # 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(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 # define _CUPS_API_1_1_21 _CUPS_PUBLIC # define _CUPS_API_1_2 _CUPS_PUBLIC # define _CUPS_API_1_3 _CUPS_PUBLIC # define _CUPS_API_1_4 _CUPS_PUBLIC # define _CUPS_API_1_5 _CUPS_PUBLIC # define _CUPS_API_1_6 _CUPS_PUBLIC # define _CUPS_API_1_7 _CUPS_PUBLIC # define _CUPS_API_2_0 _CUPS_PUBLIC # define _CUPS_API_2_2 _CUPS_PUBLIC # define _CUPS_API_2_2_4 _CUPS_PUBLIC # define _CUPS_API_2_2_7 _CUPS_PUBLIC # define _CUPS_API_2_3 _CUPS_PUBLIC # endif /* __APPLE__ && !_CUPS_SOURCE */ /* * Define _CUPS_DEPRECATED and _CUPS_INTERNAL macros to mark old APIs as * "deprecated" or "unavailable" with messages so you get warnings/errors are * compile-time... * * Note: Using any of the _CUPS_DEPRECATED macros automatically adds * _CUPS_PUBLIC. */ # if !defined(_CUPS_HAS_DEPRECATED) || (defined(_CUPS_SOURCE) && !defined(_CUPS_NO_DEPRECATED)) /* * Don't mark functions deprecated if the compiler doesn't support it * or we are building CUPS source that doesn't care. */ # define _CUPS_DEPRECATED _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) _CUPS_PUBLIC # elif defined(__APPLE__) && defined(_CUPS_NO_DEPRECATED) /* * Compiler supports the unavailable attribute, so use it when the code * wants to exclude the use of deprecated API. */ # define _CUPS_DEPRECATED __attribute__ ((unavailable)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC # elif defined(__APPLE__) /* * Just mark things as deprecated... */ # define _CUPS_DEPRECATED __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC # elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE) && defined(_CUPS_NO_DEPRECATED) /* * Compiler supports the unavailable attribute, so use it when the code * wants to exclude the use of deprecated API. */ # define _CUPS_DEPRECATED __attribute__ ((unavailable)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # else /* * Compiler supports the deprecated attribute, so use it. */ # define _CUPS_DEPRECATED __attribute__ ((deprecated)) _CUPS_PUBLIC # ifdef _CUPS_HAS_DEPRECATED_WITH_MESSAGE # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # else # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_2_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_6_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_1_7_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_2_2_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # endif /* _CUPS_HAS_DEPRECATED_WITH_MESSAGE */ # endif /* !_CUPS_HAS_DEPRECATED || (_CUPS_SOURCE && !_CUPS_NO_DEPRECATED) */ /* * Define _CUPS_FORMAT macro for printf-style functions... */ # ifdef _CUPS_HAS_FORMAT # define _CUPS_FORMAT(a,b) __attribute__ ((__format__(__printf__, a,b))) # else # define _CUPS_FORMAT(a,b) # endif /* _CUPS_HAS_FORMAT */ /* * Define _CUPS_INTERNAL_MSG macro for private APIs that have (historical) * public visibility. * * Note: Using the _CUPS_INTERNAL_MSG macro automatically adds _CUPS_PUBLIC. */ # ifdef _CUPS_SOURCE # define _CUPS_INTERNAL_MSG(m) _CUPS_PUBLIC # elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE) # define _CUPS_INTERNAL_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC # elif defined(_CUPS_HAS_DEPRECATED_WITH_MESSAGE) # define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC # else # define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated)) _CUPS_PUBLIC # endif /* _CUPS_SOURCE */ /* * Define _CUPS_NONNULL macro for functions that don't expect non-null * arguments... */ # ifdef _CUPS_HAS_NONNULL # define _CUPS_NONNULL(...) __attribute__ ((nonnull(__VA_ARGS__))) # else # define _CUPS_NONNULL(...) # endif /* _CUPS_HAS_FORMAT */ /* * Define _CUPS_NORETURN macro for functions that don't return. */ # ifdef _CUPS_HAS_NORETURN # define _CUPS_NORETURN __attribute__ ((noreturn)) # else # define _CUPS_NORETURN # endif /* _CUPS_HAS_NORETURN */ #endif /* !_CUPS_VERSIONING_H_ */ cups-2.3.1/cups/http-addr.c000664 000765 000024 00000052224 13574721672 015611 0ustar00mikestaff000000 000000 /* * HTTP address routines for CUPS. * * Copyright 2007-2019 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #ifdef HAVE_RESOLV_H # include #endif /* HAVE_RESOLV_H */ #ifdef __APPLE__ # include # ifdef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME # include # endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ #endif /* __APPLE__ */ /* * 'httpAddrAny()' - Check for the "any" address. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 if "any", 0 otherwise */ httpAddrAny(const http_addr_t *addr) /* I - Address to check */ { if (!addr) return (0); #ifdef AF_INET6 if (addr->addr.sa_family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED(&(addr->ipv6.sin6_addr))) return (1); #endif /* AF_INET6 */ if (addr->addr.sa_family == AF_INET && ntohl(addr->ipv4.sin_addr.s_addr) == 0x00000000) return (1); return (0); } /* * 'httpAddrClose()' - Close a socket created by @link httpAddrConnect@ or * @link httpAddrListen@. * * Pass @code NULL@ for sockets created with @link httpAddrConnect2@ and the * listen address for sockets created with @link httpAddrListen@. This function * ensures that domain sockets are removed when closed. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on failure */ httpAddrClose(http_addr_t *addr, /* I - Listen address or @code NULL@ */ int fd) /* I - Socket file descriptor */ { #ifdef _WIN32 if (closesocket(fd)) #else if (close(fd)) #endif /* _WIN32 */ return (-1); #ifdef AF_LOCAL if (addr && addr->addr.sa_family == AF_LOCAL) return (unlink(addr->un.sun_path)); #endif /* AF_LOCAL */ return (0); } /* * 'httpAddrEqual()' - Compare two addresses. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 if equal, 0 if not */ httpAddrEqual(const http_addr_t *addr1, /* I - First address */ const http_addr_t *addr2) /* I - Second address */ { if (!addr1 && !addr2) return (1); if (!addr1 || !addr2) return (0); if (addr1->addr.sa_family != addr2->addr.sa_family) return (0); #ifdef AF_LOCAL if (addr1->addr.sa_family == AF_LOCAL) return (!strcmp(addr1->un.sun_path, addr2->un.sun_path)); #endif /* AF_LOCAL */ #ifdef AF_INET6 if (addr1->addr.sa_family == AF_INET6) return (!memcmp(&(addr1->ipv6.sin6_addr), &(addr2->ipv6.sin6_addr), 16)); #endif /* AF_INET6 */ return (addr1->ipv4.sin_addr.s_addr == addr2->ipv4.sin_addr.s_addr); } /* * 'httpAddrLength()' - Return the length of the address in bytes. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Length in bytes */ httpAddrLength(const http_addr_t *addr) /* I - Address */ { if (!addr) return (0); #ifdef AF_INET6 if (addr->addr.sa_family == AF_INET6) return (sizeof(addr->ipv6)); else #endif /* AF_INET6 */ #ifdef AF_LOCAL if (addr->addr.sa_family == AF_LOCAL) return ((int)(offsetof(struct sockaddr_un, sun_path) + strlen(addr->un.sun_path) + 1)); else #endif /* AF_LOCAL */ if (addr->addr.sa_family == AF_INET) return (sizeof(addr->ipv4)); else return (0); } /* * 'httpAddrListen()' - Create a listening socket bound to the specified * address and port. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - Socket or -1 on error */ httpAddrListen(http_addr_t *addr, /* I - Address to bind to */ int port) /* I - Port number to bind to */ { int fd = -1, /* Socket */ val, /* Socket value */ status; /* Bind status */ /* * Range check input... */ if (!addr || port < 0) return (-1); /* * Create the socket and set options... */ if ((fd = socket(addr->addr.sa_family, SOCK_STREAM, 0)) < 0) { _cupsSetHTTPError(HTTP_STATUS_ERROR); return (-1); } val = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val)); #ifdef IPV6_V6ONLY if (addr->addr.sa_family == AF_INET6) setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, CUPS_SOCAST &val, sizeof(val)); #endif /* IPV6_V6ONLY */ /* * Bind the socket... */ #ifdef AF_LOCAL if (addr->addr.sa_family == AF_LOCAL) { mode_t mask; /* Umask setting */ /* * Remove any existing domain socket file... */ unlink(addr->un.sun_path); /* * Save the current umask and set it to 0 so that all users can access * the domain socket... */ mask = umask(0); /* * Bind the domain socket... */ status = bind(fd, (struct sockaddr *)addr, (socklen_t)httpAddrLength(addr)); /* * Restore the umask and fix permissions... */ umask(mask); chmod(addr->un.sun_path, 0140777); } else #endif /* AF_LOCAL */ { _httpAddrSetPort(addr, port); status = bind(fd, (struct sockaddr *)addr, (socklen_t)httpAddrLength(addr)); } if (status) { _cupsSetHTTPError(HTTP_STATUS_ERROR); close(fd); return (-1); } /* * Listen... */ if (listen(fd, 5)) { _cupsSetHTTPError(HTTP_STATUS_ERROR); close(fd); return (-1); } /* * Close on exec... */ #ifndef _WIN32 fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); #endif /* !_WIN32 */ #ifdef SO_NOSIGPIPE /* * Disable SIGPIPE for this socket. */ val = 1; setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val)); #endif /* SO_NOSIGPIPE */ return (fd); } /* * 'httpAddrLocalhost()' - Check for the local loopback address. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 if local host, 0 otherwise */ httpAddrLocalhost( const http_addr_t *addr) /* I - Address to check */ { if (!addr) return (1); #ifdef AF_INET6 if (addr->addr.sa_family == AF_INET6 && IN6_IS_ADDR_LOOPBACK(&(addr->ipv6.sin6_addr))) return (1); #endif /* AF_INET6 */ #ifdef AF_LOCAL if (addr->addr.sa_family == AF_LOCAL) return (1); #endif /* AF_LOCAL */ if (addr->addr.sa_family == AF_INET && (ntohl(addr->ipv4.sin_addr.s_addr) & 0xff000000) == 0x7f000000) return (1); return (0); } /* * 'httpAddrLookup()' - Lookup the hostname associated with the address. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Host name */ httpAddrLookup( const http_addr_t *addr, /* I - Address to lookup */ char *name, /* I - Host name buffer */ int namelen) /* I - Size of name buffer */ { _cups_globals_t *cg = _cupsGlobals(); /* Global data */ DEBUG_printf(("httpAddrLookup(addr=%p, name=%p, namelen=%d)", (void *)addr, (void *)name, namelen)); /* * Range check input... */ if (!addr || !name || namelen <= 2) { if (name && namelen >= 1) *name = '\0'; return (NULL); } #ifdef AF_LOCAL if (addr->addr.sa_family == AF_LOCAL) { strlcpy(name, addr->un.sun_path, (size_t)namelen); return (name); } #endif /* AF_LOCAL */ /* * Optimize lookups for localhost/loopback addresses... */ if (httpAddrLocalhost(addr)) { strlcpy(name, "localhost", (size_t)namelen); return (name); } #ifdef HAVE_RES_INIT /* * STR #2920: Initialize resolver after failure in cups-polld * * If the previous lookup failed, re-initialize the resolver to prevent * temporary network errors from persisting. This *should* be handled by * the resolver libraries, but apparently the glibc folks do not agree. * * We set a flag at the end of this function if we encounter an error that * requires reinitialization of the resolver functions. We then call * res_init() if the flag is set on the next call here or in httpAddrLookup(). */ if (cg->need_res_init) { res_init(); cg->need_res_init = 0; } #endif /* HAVE_RES_INIT */ #ifdef HAVE_GETNAMEINFO { /* * STR #2486: httpAddrLookup() fails when getnameinfo() returns EAI_AGAIN * * FWIW, I think this is really a bug in the implementation of * getnameinfo(), but falling back on httpAddrString() is easy to * do... */ int error = getnameinfo(&addr->addr, (socklen_t)httpAddrLength(addr), name, (socklen_t)namelen, NULL, 0, 0); if (error) { if (error == EAI_FAIL) cg->need_res_init = 1; return (httpAddrString(addr, name, namelen)); } } #else { struct hostent *host; /* Host from name service */ # ifdef AF_INET6 if (addr->addr.sa_family == AF_INET6) host = gethostbyaddr((char *)&(addr->ipv6.sin6_addr), sizeof(struct in_addr), AF_INET6); else # endif /* AF_INET6 */ host = gethostbyaddr((char *)&(addr->ipv4.sin_addr), sizeof(struct in_addr), AF_INET); if (host == NULL) { /* * No hostname, so return the raw address... */ if (h_errno == NO_RECOVERY) cg->need_res_init = 1; return (httpAddrString(addr, name, namelen)); } strlcpy(name, host->h_name, (size_t)namelen); } #endif /* HAVE_GETNAMEINFO */ DEBUG_printf(("1httpAddrLookup: returning \"%s\"...", name)); return (name); } /* * 'httpAddrFamily()' - Get the address family of an address. */ int /* O - Address family */ httpAddrFamily(http_addr_t *addr) /* I - Address */ { if (addr) return (addr->addr.sa_family); else return (0); } /* * 'httpAddrPort()' - Get the port number associated with an address. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - Port number */ httpAddrPort(http_addr_t *addr) /* I - Address */ { if (!addr) return (-1); #ifdef AF_INET6 else if (addr->addr.sa_family == AF_INET6) return (ntohs(addr->ipv6.sin6_port)); #endif /* AF_INET6 */ else if (addr->addr.sa_family == AF_INET) return (ntohs(addr->ipv4.sin_port)); else return (0); } /* * '_httpAddrSetPort()' - Set the port number associated with an address. */ void _httpAddrSetPort(http_addr_t *addr, /* I - Address */ int port) /* I - Port */ { if (!addr || port <= 0) return; #ifdef AF_INET6 if (addr->addr.sa_family == AF_INET6) addr->ipv6.sin6_port = htons(port); else #endif /* AF_INET6 */ if (addr->addr.sa_family == AF_INET) addr->ipv4.sin_port = htons(port); } /* * 'httpAddrString()' - Convert an address to a numeric string. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Numeric address string */ httpAddrString(const http_addr_t *addr, /* I - Address to convert */ char *s, /* I - String buffer */ int slen) /* I - Length of string */ { DEBUG_printf(("httpAddrString(addr=%p, s=%p, slen=%d)", (void *)addr, (void *)s, slen)); /* * Range check input... */ if (!addr || !s || slen <= 2) { if (s && slen >= 1) *s = '\0'; return (NULL); } #ifdef AF_LOCAL if (addr->addr.sa_family == AF_LOCAL) { if (addr->un.sun_path[0] == '/') strlcpy(s, addr->un.sun_path, (size_t)slen); else strlcpy(s, "localhost", (size_t)slen); } else #endif /* AF_LOCAL */ if (addr->addr.sa_family == AF_INET) { unsigned temp; /* Temporary address */ temp = ntohl(addr->ipv4.sin_addr.s_addr); snprintf(s, (size_t)slen, "%d.%d.%d.%d", (temp >> 24) & 255, (temp >> 16) & 255, (temp >> 8) & 255, temp & 255); } #ifdef AF_INET6 else if (addr->addr.sa_family == AF_INET6) { char *sptr, /* Pointer into string */ temps[64]; /* Temporary string for address */ # ifdef HAVE_GETNAMEINFO if (getnameinfo(&addr->addr, (socklen_t)httpAddrLength(addr), temps, sizeof(temps), NULL, 0, NI_NUMERICHOST)) { /* * If we get an error back, then the address type is not supported * and we should zero out the buffer... */ s[0] = '\0'; return (NULL); } else if ((sptr = strchr(temps, '%')) != NULL) { /* * Convert "%zone" to "+zone" to match URI form... */ *sptr = '+'; } # else int i; /* Looping var */ unsigned temp; /* Current value */ const char *prefix; /* Prefix for address */ prefix = ""; for (sptr = temps, i = 0; i < 4 && addr->ipv6.sin6_addr.s6_addr32[i]; i ++) { temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]); snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff); prefix = ":"; sptr += strlen(sptr); temp &= 0xffff; if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1]) { snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp); sptr += strlen(sptr); } } if (i < 4) { while (i < 4 && !addr->ipv6.sin6_addr.s6_addr32[i]) i ++; if (i < 4) { snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s:", prefix); prefix = ":"; sptr += strlen(sptr); for (; i < 4; i ++) { temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]); if ((temp & 0xffff0000) || (i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1])) { snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff); sptr += strlen(sptr); } snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp & 0xffff); sptr += strlen(sptr); } } else if (sptr == s) { /* * Empty address... */ strlcpy(temps, "::", sizeof(temps)); } else { /* * Empty at end... */ strlcpy(sptr, "::", sizeof(temps) - (size_t)(sptr - temps)); } } # endif /* HAVE_GETNAMEINFO */ /* * Add "[v1." and "]" around IPv6 address to convert to URI form. */ snprintf(s, (size_t)slen, "[v1.%s]", temps); } #endif /* AF_INET6 */ else strlcpy(s, "UNKNOWN", (size_t)slen); DEBUG_printf(("1httpAddrString: returning \"%s\"...", s)); return (s); } /* * 'httpGetAddress()' - Get the address of the connected peer of a connection. * * For connections created with @link httpConnect2@, the address is for the * server. For connections created with @link httpAccept@, the address is for * the client. * * Returns @code NULL@ if the socket is currently unconnected. * * @since CUPS 2.0/OS 10.10@ */ http_addr_t * /* O - Connected address or @code NULL@ */ httpGetAddress(http_t *http) /* I - HTTP connection */ { if (http) return (http->hostaddr); else return (NULL); } /* * 'httpGetHostByName()' - Lookup a hostname or IPv4 address, and return * address records for the specified name. * * @deprecated@ @exclude all@ */ struct hostent * /* O - Host entry */ httpGetHostByName(const char *name) /* I - Hostname or IP address */ { const char *nameptr; /* Pointer into name */ unsigned ip[4]; /* IP address components */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_printf(("httpGetHostByName(name=\"%s\")", name)); /* * Avoid lookup delays and configuration problems when connecting * to the localhost address... */ if (!strcmp(name, "localhost")) name = "127.0.0.1"; /* * This function is needed because some operating systems have a * buggy implementation of gethostbyname() that does not support * IP addresses. If the first character of the name string is a * number, then sscanf() is used to extract the IP components. * We then pack the components into an IPv4 address manually, * since the inet_aton() function is deprecated. We use the * htonl() macro to get the right byte order for the address. * * We also support domain sockets when supported by the underlying * OS... */ #ifdef AF_LOCAL if (name[0] == '/') { /* * A domain socket address, so make an AF_LOCAL entry and return it... */ cg->hostent.h_name = (char *)name; cg->hostent.h_aliases = NULL; cg->hostent.h_addrtype = AF_LOCAL; cg->hostent.h_length = (int)strlen(name) + 1; cg->hostent.h_addr_list = cg->ip_ptrs; cg->ip_ptrs[0] = (char *)name; cg->ip_ptrs[1] = NULL; DEBUG_puts("1httpGetHostByName: returning domain socket address..."); return (&cg->hostent); } #endif /* AF_LOCAL */ for (nameptr = name; isdigit(*nameptr & 255) || *nameptr == '.'; nameptr ++); if (!*nameptr) { /* * We have an IPv4 address; break it up and provide the host entry * to the caller. */ if (sscanf(name, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) != 4) return (NULL); /* Must have 4 numbers */ if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255) return (NULL); /* Invalid byte ranges! */ cg->ip_addr = htonl((((((((unsigned)ip[0] << 8) | (unsigned)ip[1]) << 8) | (unsigned)ip[2]) << 8) | (unsigned)ip[3])); /* * Fill in the host entry and return it... */ cg->hostent.h_name = (char *)name; cg->hostent.h_aliases = NULL; cg->hostent.h_addrtype = AF_INET; cg->hostent.h_length = 4; cg->hostent.h_addr_list = cg->ip_ptrs; cg->ip_ptrs[0] = (char *)&(cg->ip_addr); cg->ip_ptrs[1] = NULL; DEBUG_puts("1httpGetHostByName: returning IPv4 address..."); return (&cg->hostent); } else { /* * Use the gethostbyname() function to get the IPv4 address for * the name... */ DEBUG_puts("1httpGetHostByName: returning domain lookup address(es)..."); return (gethostbyname(name)); } } /* * 'httpGetHostname()' - Get the FQDN for the connection or local system. * * When "http" points to a connected socket, return the hostname or * address that was used in the call to httpConnect() or httpConnectEncrypt(), * or the address of the client for the connection from httpAcceptConnection(). * Otherwise, return the FQDN for the local system using both gethostname() * and gethostbyname() to get the local hostname with domain. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - FQDN for connection or system */ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ char *s, /* I - String buffer for name */ int slen) /* I - Size of buffer */ { if (http) { if (!s || slen <= 1) { if (http->hostname[0] == '/') return ("localhost"); else return (http->hostname); } else if (http->hostname[0] == '/') strlcpy(s, "localhost", (size_t)slen); else strlcpy(s, http->hostname, (size_t)slen); } else { /* * Get the hostname... */ if (!s || slen <= 1) return (NULL); if (gethostname(s, (size_t)slen) < 0) strlcpy(s, "localhost", (size_t)slen); if (!strchr(s, '.')) { #ifdef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME /* * The hostname is not a FQDN, so use the local hostname from the * SystemConfiguration framework... */ SCDynamicStoreRef sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("libcups"), NULL, NULL); /* System configuration data */ CFStringRef local = sc ? SCDynamicStoreCopyLocalHostName(sc) : NULL; /* Local host name */ char localStr[1024]; /* Local host name C string */ if (local && CFStringGetCString(local, localStr, sizeof(localStr), kCFStringEncodingUTF8)) { /* * Append ".local." to the hostname we get... */ snprintf(s, (size_t)slen, "%s.local.", localStr); } if (local) CFRelease(local); if (sc) CFRelease(sc); #else /* * The hostname is not a FQDN, so look it up... */ struct hostent *host; /* Host entry to get FQDN */ if ((host = gethostbyname(s)) != NULL && host->h_name) { /* * Use the resolved hostname... */ strlcpy(s, host->h_name, (size_t)slen); } #endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ } /* * Make sure .local hostnames end with a period... */ if (strlen(s) > 6 && !strcmp(s + strlen(s) - 6, ".local")) strlcat(s, ".", (size_t)slen); } /* * Convert the hostname to lowercase as needed... */ if (s[0] != '/') { char *ptr; /* Pointer into string */ for (ptr = s; *ptr; ptr ++) *ptr = (char)_cups_tolower((int)*ptr); } /* * Return the hostname with as much domain info as we have... */ return (s); } /* * 'httpResolveHostname()' - Resolve the hostname of the HTTP connection * address. * * @since CUPS 2.0/OS 10.10@ */ const char * /* O - Resolved hostname or @code NULL@ */ httpResolveHostname(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Hostname buffer */ size_t bufsize) /* I - Size of buffer */ { if (!http) return (NULL); if (isdigit(http->hostname[0] & 255) || http->hostname[0] == '[') { char temp[1024]; /* Temporary string */ if (httpAddrLookup(http->hostaddr, temp, sizeof(temp))) strlcpy(http->hostname, temp, sizeof(http->hostname)); else return (NULL); } if (buffer) { if (http->hostname[0] == '/') strlcpy(buffer, "localhost", bufsize); else strlcpy(buffer, http->hostname, bufsize); return (buffer); } else if (http->hostname[0] == '/') return ("localhost"); else return (http->hostname); } cups-2.3.1/cups/http-addrlist.c000664 000765 000024 00000055003 13574721672 016503 0ustar00mikestaff000000 000000 /* * HTTP address list routines for CUPS. * * Copyright 2007-2018 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. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #ifdef HAVE_RESOLV_H # include #endif /* HAVE_RESOLV_H */ #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ #ifndef _WIN32 # include #endif /* _WIN32 */ /* * 'httpAddrConnect()' - Connect to any of the addresses in the list. * * @since CUPS 1.2/macOS 10.5@ @exclude all@ */ http_addrlist_t * /* O - Connected address or NULL on failure */ httpAddrConnect( http_addrlist_t *addrlist, /* I - List of potential addresses */ int *sock) /* O - Socket */ { DEBUG_printf(("httpAddrConnect(addrlist=%p, sock=%p)", (void *)addrlist, (void *)sock)); return (httpAddrConnect2(addrlist, sock, 30000, NULL)); } /* * 'httpAddrConnect2()' - Connect to any of the addresses in the list with a * timeout and optional cancel. * * @since CUPS 1.7/macOS 10.9@ */ http_addrlist_t * /* O - Connected address or NULL on failure */ httpAddrConnect2( http_addrlist_t *addrlist, /* I - List of potential addresses */ int *sock, /* O - Socket */ int msec, /* I - Timeout in milliseconds */ int *cancel) /* I - Pointer to "cancel" variable */ { int val; /* Socket option value */ #ifndef _WIN32 int i, j, /* Looping vars */ flags, /* Socket flags */ result; /* Result from select() or poll() */ #endif /* !_WIN32 */ int remaining; /* Remaining timeout */ int nfds, /* Number of file descriptors */ fds[100]; /* Socket file descriptors */ http_addrlist_t *addrs[100]; /* Addresses */ #ifndef HAVE_POLL int max_fd = -1; /* Highest file descriptor */ #endif /* !HAVE_POLL */ #ifdef O_NONBLOCK # ifdef HAVE_POLL struct pollfd pfds[100]; /* Polled file descriptors */ # else fd_set input_set, /* select() input set */ output_set, /* select() output set */ error_set; /* select() error set */ struct timeval timeout; /* Timeout */ # endif /* HAVE_POLL */ #endif /* O_NONBLOCK */ #ifdef DEBUG # ifndef _WIN32 socklen_t len; /* Length of value */ http_addr_t peer; /* Peer address */ # endif /* !_WIN32 */ char temp[256]; /* Temporary address string */ #endif /* DEBUG */ DEBUG_printf(("httpAddrConnect2(addrlist=%p, sock=%p, msec=%d, cancel=%p)", (void *)addrlist, (void *)sock, msec, (void *)cancel)); if (!sock) { errno = EINVAL; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } if (cancel && *cancel) return (NULL); if (msec <= 0) msec = INT_MAX; /* * Loop through each address until we connect or run out of addresses... */ nfds = 0; remaining = msec; while (remaining > 0) { if (cancel && *cancel) { while (nfds > 0) { nfds --; httpAddrClose(NULL, fds[nfds]); } return (NULL); } if (addrlist && nfds < (int)(sizeof(fds) / sizeof(fds[0]))) { /* * Create the socket... */ DEBUG_printf(("2httpAddrConnect2: Trying %s:%d...", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr)))); if ((fds[nfds] = (int)socket(httpAddrFamily(&(addrlist->addr)), SOCK_STREAM, 0)) < 0) { /* * Don't abort yet, as this could just be an issue with the local * system not being configured with IPv4/IPv6/domain socket enabled. * * Just skip this address... */ addrlist = addrlist->next; continue; } /* * Set options... */ val = 1; setsockopt(fds[nfds], SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val)); #ifdef SO_REUSEPORT val = 1; setsockopt(fds[nfds], SOL_SOCKET, SO_REUSEPORT, CUPS_SOCAST &val, sizeof(val)); #endif /* SO_REUSEPORT */ #ifdef SO_NOSIGPIPE val = 1; setsockopt(fds[nfds], SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val)); #endif /* SO_NOSIGPIPE */ /* * Using TCP_NODELAY improves responsiveness, especially on systems * with a slow loopback interface... */ val = 1; setsockopt(fds[nfds], IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val)); #ifdef FD_CLOEXEC /* * Close this socket when starting another process... */ fcntl(fds[nfds], F_SETFD, FD_CLOEXEC); #endif /* FD_CLOEXEC */ #ifdef O_NONBLOCK /* * Do an asynchronous connect by setting the socket non-blocking... */ DEBUG_printf(("httpAddrConnect2: Setting non-blocking connect()")); flags = fcntl(fds[nfds], F_GETFL, 0); fcntl(fds[nfds], F_SETFL, flags | O_NONBLOCK); #endif /* O_NONBLOCK */ /* * Then connect... */ if (!connect(fds[nfds], &(addrlist->addr.addr), (socklen_t)httpAddrLength(&(addrlist->addr)))) { DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr)))); #ifdef O_NONBLOCK fcntl(fds[nfds], F_SETFL, flags); #endif /* O_NONBLOCK */ *sock = fds[nfds]; while (nfds > 0) { nfds --; httpAddrClose(NULL, fds[nfds]); } return (addrlist); } #ifdef _WIN32 if (WSAGetLastError() != WSAEINPROGRESS && WSAGetLastError() != WSAEWOULDBLOCK) #else if (errno != EINPROGRESS && errno != EWOULDBLOCK) #endif /* _WIN32 */ { DEBUG_printf(("1httpAddrConnect2: Unable to connect to %s:%d: %s", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr)), strerror(errno))); httpAddrClose(NULL, fds[nfds]); addrlist = addrlist->next; continue; } #ifndef _WIN32 fcntl(fds[nfds], F_SETFL, flags); #endif /* !_WIN32 */ #ifndef HAVE_POLL if (fds[nfds] > max_fd) max_fd = fds[nfds]; #endif /* !HAVE_POLL */ addrs[nfds] = addrlist; nfds ++; addrlist = addrlist->next; } if (!addrlist && nfds == 0) break; /* * See if we can connect to any of the addresses so far... */ #ifdef O_NONBLOCK DEBUG_puts("1httpAddrConnect2: Finishing async connect()"); do { if (cancel && *cancel) { /* * Close this socket and return... */ DEBUG_puts("1httpAddrConnect2: Canceled connect()"); while (nfds > 0) { nfds --; httpAddrClose(NULL, fds[nfds]); } *sock = -1; return (NULL); } # ifdef HAVE_POLL for (i = 0; i < nfds; i ++) { pfds[i].fd = fds[i]; pfds[i].events = POLLIN | POLLOUT; } result = poll(pfds, (nfds_t)nfds, addrlist ? 100 : remaining > 250 ? 250 : remaining); DEBUG_printf(("1httpAddrConnect2: poll() returned %d (%d)", result, errno)); # else FD_ZERO(&input_set); for (i = 0; i < nfds; i ++) FD_SET(fds[i], &input_set); output_set = input_set; error_set = input_set; timeout.tv_sec = 0; timeout.tv_usec = (addrlist ? 100 : remaining > 250 ? 250 : remaining) * 1000; result = select(max_fd + 1, &input_set, &output_set, &error_set, &timeout); DEBUG_printf(("1httpAddrConnect2: select() returned %d (%d)", result, errno)); # endif /* HAVE_POLL */ } # ifdef _WIN32 while (result < 0 && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK)); # else while (result < 0 && (errno == EINTR || errno == EAGAIN)); # endif /* _WIN32 */ if (result > 0) { http_addrlist_t *connaddr = NULL; /* Connected address, if any */ for (i = 0; i < nfds; i ++) { # ifdef HAVE_POLL DEBUG_printf(("pfds[%d].revents=%x\n", i, pfds[i].revents)); if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP))) # else if (FD_ISSET(fds[i], &input_set) && !FD_ISSET(fds[i], &error_set)) # endif /* HAVE_POLL */ { *sock = fds[i]; connaddr = addrs[i]; # ifdef DEBUG len = sizeof(peer); if (!getpeername(fds[i], (struct sockaddr *)&peer, &len)) DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer))); # endif /* DEBUG */ break; } # ifdef HAVE_POLL else if (pfds[i].revents & (POLLERR | POLLHUP)) # else else if (FD_ISSET(fds[i], &error_set)) # endif /* HAVE_POLL */ { /* * Error on socket, remove from the "pool"... */ httpAddrClose(NULL, fds[i]); nfds --; if (i < nfds) { memmove(fds + i, fds + i + 1, (size_t)(nfds - i) * (sizeof(fds[0]))); memmove(addrs + i, addrs + i + 1, (size_t)(nfds - i) * (sizeof(addrs[0]))); } i --; } } if (connaddr) { /* * Connected on one address, close all of the other sockets we have so * far and return... */ for (j = 0; j < i; j ++) httpAddrClose(NULL, fds[j]); for (j ++; j < nfds; j ++) httpAddrClose(NULL, fds[j]); return (connaddr); } } #endif /* O_NONBLOCK */ if (addrlist) remaining -= 100; else remaining -= 250; } while (nfds > 0) { nfds --; httpAddrClose(NULL, fds[nfds]); } #ifdef _WIN32 _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, "Connection failed", 0); #else _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, strerror(errno), 0); #endif /* _WIN32 */ return (NULL); } /* * 'httpAddrCopyList()' - Copy an address list. * * @since CUPS 1.7/macOS 10.9@ */ http_addrlist_t * /* O - New address list or @code NULL@ on error */ httpAddrCopyList( http_addrlist_t *src) /* I - Source address list */ { http_addrlist_t *dst = NULL, /* First list entry */ *prev = NULL, /* Previous list entry */ *current = NULL;/* Current list entry */ while (src) { if ((current = malloc(sizeof(http_addrlist_t))) == NULL) { current = dst; while (current) { prev = current; current = current->next; free(prev); } return (NULL); } memcpy(current, src, sizeof(http_addrlist_t)); current->next = NULL; if (prev) prev->next = current; else dst = current; prev = current; src = src->next; } return (dst); } /* * 'httpAddrFreeList()' - Free an address list. * * @since CUPS 1.2/macOS 10.5@ */ void httpAddrFreeList( http_addrlist_t *addrlist) /* I - Address list to free */ { http_addrlist_t *next; /* Next address in list */ /* * Free each address in the list... */ while (addrlist) { next = addrlist->next; free(addrlist); addrlist = next; } } /* * 'httpAddrGetList()' - Get a list of addresses for a hostname. * * @since CUPS 1.2/macOS 10.5@ */ http_addrlist_t * /* O - List of addresses or NULL */ httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for passive listen address */ int family, /* I - Address family or AF_UNSPEC */ const char *service) /* I - Service name or port number */ { http_addrlist_t *first, /* First address in list */ *addr, /* Current address in list */ *temp; /* New address */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ #ifdef DEBUG _cups_debug_printf("httpAddrGetList(hostname=\"%s\", family=AF_%s, " "service=\"%s\")\n", hostname ? hostname : "(nil)", family == AF_UNSPEC ? "UNSPEC" : # ifdef AF_LOCAL family == AF_LOCAL ? "LOCAL" : # endif /* AF_LOCAL */ # ifdef AF_INET6 family == AF_INET6 ? "INET6" : # endif /* AF_INET6 */ family == AF_INET ? "INET" : "???", service); #endif /* DEBUG */ #ifdef HAVE_RES_INIT /* * STR #2920: Initialize resolver after failure in cups-polld * * If the previous lookup failed, re-initialize the resolver to prevent * temporary network errors from persisting. This *should* be handled by * the resolver libraries, but apparently the glibc folks do not agree. * * We set a flag at the end of this function if we encounter an error that * requires reinitialization of the resolver functions. We then call * res_init() if the flag is set on the next call here or in httpAddrLookup(). */ if (cg->need_res_init) { res_init(); cg->need_res_init = 0; } #endif /* HAVE_RES_INIT */ /* * Lookup the address the best way we can... */ first = addr = NULL; #ifdef AF_LOCAL if (hostname && hostname[0] == '/') { /* * Domain socket address... */ if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL) { addr = first; first->addr.un.sun_family = AF_LOCAL; strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path)); } } else #endif /* AF_LOCAL */ if (!hostname || _cups_strcasecmp(hostname, "localhost")) { #ifdef HAVE_GETADDRINFO struct addrinfo hints, /* Address lookup hints */ *results, /* Address lookup results */ *current; /* Current result */ char ipv6[64], /* IPv6 address */ *ipv6zone; /* Pointer to zone separator */ int ipv6len; /* Length of IPv6 address */ int error; /* getaddrinfo() error */ /* * Lookup the address as needed... */ memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_flags = hostname ? 0 : AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; if (hostname && *hostname == '[') { /* * Remove brackets from numeric IPv6 address... */ if (!strncmp(hostname, "[v1.", 4)) { /* * Copy the newer address format which supports link-local addresses... */ strlcpy(ipv6, hostname + 4, sizeof(ipv6)); if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') { ipv6[ipv6len] = '\0'; hostname = ipv6; /* * Convert "+zone" in address to "%zone"... */ if ((ipv6zone = strrchr(ipv6, '+')) != NULL) *ipv6zone = '%'; } } else { /* * Copy the regular non-link-local IPv6 address... */ strlcpy(ipv6, hostname + 1, sizeof(ipv6)); if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') { ipv6[ipv6len] = '\0'; hostname = ipv6; } } } if ((error = getaddrinfo(hostname, service, &hints, &results)) == 0) { /* * Copy the results to our own address list structure... */ for (current = results; current; current = current->ai_next) if (current->ai_family == AF_INET || current->ai_family == AF_INET6) { /* * Copy the address over... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { httpAddrFreeList(first); freeaddrinfo(results); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); return (NULL); } if (current->ai_family == AF_INET6) memcpy(&(temp->addr.ipv6), current->ai_addr, sizeof(temp->addr.ipv6)); else memcpy(&(temp->addr.ipv4), current->ai_addr, sizeof(temp->addr.ipv4)); /* * Append the address to the list... */ if (!first) first = temp; if (addr) addr->next = temp; addr = temp; } /* * Free the results from getaddrinfo()... */ freeaddrinfo(results); } else { if (error == EAI_FAIL) cg->need_res_init = 1; # ifdef _WIN32 /* Really, Microsoft?!? */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerrorA(error), 0); # else _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerror(error), 0); # endif /* _WIN32 */ } #else if (hostname) { int i; /* Looping vars */ unsigned ip[4]; /* IPv4 address components */ const char *ptr; /* Pointer into hostname */ struct hostent *host; /* Result of lookup */ struct servent *port; /* Port number for service */ int portnum; /* Port number */ /* * Lookup the service... */ if (!service) portnum = 0; else if (isdigit(*service & 255)) portnum = atoi(service); else if ((port = getservbyname(service, NULL)) != NULL) portnum = ntohs(port->s_port); else if (!strcmp(service, "http")) portnum = 80; else if (!strcmp(service, "https")) portnum = 443; else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) portnum = 631; else if (!strcmp(service, "lpd")) portnum = 515; else if (!strcmp(service, "socket")) portnum = 9100; else return (NULL); /* * This code is needed because some operating systems have a * buggy implementation of gethostbyname() that does not support * IPv4 addresses. If the hostname string is an IPv4 address, then * sscanf() is used to extract the IPv4 components. We then pack * the components into an IPv4 address manually, since the * inet_aton() function is deprecated. We use the htonl() macro * to get the right byte order for the address. */ for (ptr = hostname; isdigit(*ptr & 255) || *ptr == '.'; ptr ++); if (!*ptr) { /* * We have an IPv4 address; break it up and create an IPv4 address... */ if (sscanf(hostname, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) == 4 && ip[0] <= 255 && ip[1] <= 255 && ip[2] <= 255 && ip[3] <= 255) { first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!first) return (NULL); first->addr.ipv4.sin_family = AF_INET; first->addr.ipv4.sin_addr.s_addr = htonl((((((((unsigned)ip[0] << 8) | (unsigned)ip[1]) << 8) | (unsigned)ip[2]) << 8) | (unsigned)ip[3])); first->addr.ipv4.sin_port = htons(portnum); } } else if ((host = gethostbyname(hostname)) != NULL && # ifdef AF_INET6 (host->h_addrtype == AF_INET || host->h_addrtype == AF_INET6)) # else host->h_addrtype == AF_INET) # endif /* AF_INET6 */ { for (i = 0; host->h_addr_list[i]; i ++) { /* * Copy the address over... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { httpAddrFreeList(first); return (NULL); } # ifdef AF_INET6 if (host->h_addrtype == AF_INET6) { temp->addr.ipv6.sin6_family = AF_INET6; memcpy(&(temp->addr.ipv6.sin6_addr), host->h_addr_list[i], sizeof(temp->addr.ipv6)); temp->addr.ipv6.sin6_port = htons(portnum); } else # endif /* AF_INET6 */ { temp->addr.ipv4.sin_family = AF_INET; memcpy(&(temp->addr.ipv4.sin_addr), host->h_addr_list[i], sizeof(temp->addr.ipv4)); temp->addr.ipv4.sin_port = htons(portnum); } /* * Append the address to the list... */ if (!first) first = temp; if (addr) addr->next = temp; addr = temp; } } else { if (h_errno == NO_RECOVERY) cg->need_res_init = 1; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, hstrerror(h_errno), 0); } } #endif /* HAVE_GETADDRINFO */ } /* * Detect some common errors and handle them sanely... */ if (!addr && (!hostname || !_cups_strcasecmp(hostname, "localhost"))) { struct servent *port; /* Port number for service */ int portnum; /* Port number */ /* * Lookup the service... */ if (!service) portnum = 0; else if (isdigit(*service & 255)) portnum = atoi(service); else if ((port = getservbyname(service, NULL)) != NULL) portnum = ntohs(port->s_port); else if (!strcmp(service, "http")) portnum = 80; else if (!strcmp(service, "https")) portnum = 443; else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) portnum = 631; else if (!strcmp(service, "lpd")) portnum = 515; else if (!strcmp(service, "socket")) portnum = 9100; else { httpAddrFreeList(first); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown service name."), 1); return (NULL); } if (hostname && !_cups_strcasecmp(hostname, "localhost")) { /* * Unfortunately, some users ignore all of the warnings in the * /etc/hosts file and delete "localhost" from it. If we get here * then we were unable to resolve the name, so use the IPv6 and/or * IPv4 loopback interface addresses... */ #ifdef AF_INET6 if (family != AF_INET) { /* * Add [::1] to the address list... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); httpAddrFreeList(first); return (NULL); } temp->addr.ipv6.sin6_family = AF_INET6; temp->addr.ipv6.sin6_port = htons(portnum); # ifdef _WIN32 temp->addr.ipv6.sin6_addr.u.Byte[15] = 1; # else temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1); # endif /* _WIN32 */ if (!first) first = temp; addr = temp; } if (family != AF_INET6) #endif /* AF_INET6 */ { /* * Add 127.0.0.1 to the address list... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); httpAddrFreeList(first); return (NULL); } temp->addr.ipv4.sin_family = AF_INET; temp->addr.ipv4.sin_port = htons(portnum); temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001); if (!first) first = temp; if (addr) addr->next = temp; } } else if (!hostname) { /* * Provide one or more passive listening addresses... */ #ifdef AF_INET6 if (family != AF_INET) { /* * Add [::] to the address list... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); httpAddrFreeList(first); return (NULL); } temp->addr.ipv6.sin6_family = AF_INET6; temp->addr.ipv6.sin6_port = htons(portnum); if (!first) first = temp; addr = temp; } if (family != AF_INET6) #endif /* AF_INET6 */ { /* * Add 0.0.0.0 to the address list... */ temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); if (!temp) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); httpAddrFreeList(first); return (NULL); } temp->addr.ipv4.sin_family = AF_INET; temp->addr.ipv4.sin_port = htons(portnum); if (!first) first = temp; if (addr) addr->next = temp; } } } /* * Return the address list... */ return (first); } cups-2.3.1/cups/language-private.h000664 000765 000024 00000004776 13574721672 017173 0ustar00mikestaff000000 000000 /* * Private localization support for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_LANGUAGE_PRIVATE_H_ # define _CUPS_LANGUAGE_PRIVATE_H_ /* * Include necessary headers... */ # include "config.h" # include # include # ifdef __APPLE__ # include # endif /* __APPLE__ */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Macro for localized text... */ # define _(x) x /* * Constants... */ # define _CUPS_MESSAGE_PO 0 /* Message file is in GNU .po format */ # define _CUPS_MESSAGE_UNQUOTE 1 /* Unescape \foo in strings? */ # define _CUPS_MESSAGE_STRINGS 2 /* Message file is in Apple .strings format */ # define _CUPS_MESSAGE_EMPTY 4 /* Allow empty localized strings */ /* * Types... */ typedef struct _cups_message_s /**** Message catalog entry ****/ { char *msg, /* Original string */ *str; /* Localized string */ } _cups_message_t; /* * Prototypes... */ # ifdef __APPLE__ extern const char *_cupsAppleLanguage(const char *locale, char *language, size_t langsize) _CUPS_PRIVATE; extern const char *_cupsAppleLocale(CFStringRef languageName, char *locale, size_t localesize) _CUPS_PRIVATE; # endif /* __APPLE__ */ extern void _cupsCharmapFlush(void) _CUPS_INTERNAL; extern const char *_cupsEncodingName(cups_encoding_t encoding) _CUPS_PRIVATE; extern void _cupsLangPrintError(const char *prefix, const char *message) _CUPS_PRIVATE; extern int _cupsLangPrintFilter(FILE *fp, const char *prefix, const char *message, ...) _CUPS_FORMAT(3, 4) _CUPS_PRIVATE; extern int _cupsLangPrintf(FILE *fp, const char *message, ...) _CUPS_FORMAT(2, 3) _CUPS_PRIVATE; extern int _cupsLangPuts(FILE *fp, const char *message) _CUPS_PRIVATE; extern const char *_cupsLangString(cups_lang_t *lang, const char *message) _CUPS_PRIVATE; extern void _cupsMessageFree(cups_array_t *a) _CUPS_PRIVATE; extern cups_array_t *_cupsMessageLoad(const char *filename, int flags) _CUPS_PRIVATE; extern const char *_cupsMessageLookup(cups_array_t *a, const char *m) _CUPS_PRIVATE; extern cups_array_t *_cupsMessageNew(void *context) _CUPS_PRIVATE; extern int _cupsMessageSave(const char *filename, int flags, cups_array_t *a) _CUPS_PRIVATE; extern void _cupsSetLocale(char *argv[]) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_LANGUAGE_PRIVATE_H_ */ cups-2.3.1/cups/testfile.c000664 000765 000024 00000036752 13574721672 015551 0ustar00mikestaff000000 000000 /* * File test program for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "string-private.h" #include "debug-private.h" #include "file.h" #include #include #ifdef _WIN32 # include #else # include #endif /* _WIN32 */ #include /* * Local functions... */ static int count_lines(cups_file_t *fp); static int random_tests(void); static int read_write_tests(int compression); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int status; /* Exit status */ char filename[1024]; /* Filename buffer */ cups_file_t *fp; /* File pointer */ #ifndef _WIN32 int fds[2]; /* Open file descriptors */ cups_file_t *fdfile; /* File opened with cupsFileOpenFd() */ #endif /* !_WIN32 */ int count; /* Number of lines in file */ if (argc == 1) { /* * Do uncompressed file tests... */ status = read_write_tests(0); #ifdef HAVE_LIBZ /* * Do compressed file tests... */ putchar('\n'); status += read_write_tests(1); #endif /* HAVE_LIBZ */ /* * Do uncompressed random I/O tests... */ status += random_tests(); #ifndef _WIN32 /* * Test fdopen and close without reading... */ pipe(fds); close(fds[1]); fputs("\ncupsFileOpenFd(fd, \"r\"): ", stdout); fflush(stdout); if ((fdfile = cupsFileOpenFd(fds[0], "r")) == NULL) { puts("FAIL"); status ++; } else { /* * Able to open file, now close without reading. If we don't return * before the alarm fires, that is a failure and we will crash on the * alarm signal... */ puts("PASS"); fputs("cupsFileClose(no read): ", stdout); fflush(stdout); alarm(5); cupsFileClose(fdfile); alarm(0); puts("PASS"); } #endif /* !_WIN32 */ /* * Count lines in test file, rewind, then count again. */ fputs("\ncupsFileOpen(\"testfile.txt\", \"r\"): ", stdout); if ((fp = cupsFileOpen("testfile.txt", "r")) == NULL) { puts("FAIL"); status ++; } else { puts("PASS"); fputs("cupsFileGets: ", stdout); if ((count = count_lines(fp)) != 477) { printf("FAIL (got %d lines, expected 477)\n", count); status ++; } else { puts("PASS"); fputs("cupsFileRewind: ", stdout); if (cupsFileRewind(fp) != 0) { puts("FAIL"); status ++; } else { puts("PASS"); fputs("cupsFileGets: ", stdout); if ((count = count_lines(fp)) != 477) { printf("FAIL (got %d lines, expected 477)\n", count); status ++; } else puts("PASS"); } } cupsFileClose(fp); } /* * Test path functions... */ fputs("\ncupsFileFind: ", stdout); #ifdef _WIN32 if (cupsFileFind("notepad.exe", "C:/WINDOWS", 1, filename, sizeof(filename)) && cupsFileFind("notepad.exe", "C:/WINDOWS;C:/WINDOWS/SYSTEM32", 1, filename, sizeof(filename))) #else if (cupsFileFind("cat", "/bin", 1, filename, sizeof(filename)) && cupsFileFind("cat", "/bin:/usr/bin", 1, filename, sizeof(filename))) #endif /* _WIN32 */ printf("PASS (%s)\n", filename); else { puts("FAIL"); status ++; } /* * Summarize the results and return... */ if (!status) puts("\nALL TESTS PASSED!"); else printf("\n%d TEST(S) FAILED!\n", status); } else { /* * Cat the filename on the command-line... */ char line[8192]; /* Line from file */ if ((fp = cupsFileOpen(argv[1], "r")) == NULL) { perror(argv[1]); status = 1; } else if (argc == 2) { status = 0; while (cupsFileGets(fp, line, sizeof(line))) puts(line); if (!cupsFileEOF(fp)) perror(argv[1]); cupsFileClose(fp); } else { status = 0; ssize_t bytes; while ((bytes = cupsFileRead(fp, line, sizeof(line))) > 0) printf("%s: %d bytes\n", argv[1], (int)bytes); if (cupsFileEOF(fp)) printf("%s: EOF\n", argv[1]); else perror(argv[1]); cupsFileClose(fp); } } return (status); } /* * 'count_lines()' - Count the number of lines in a file. */ static int /* O - Number of lines */ count_lines(cups_file_t *fp) /* I - File to read from */ { int count; /* Number of lines */ char line[1024]; /* Line buffer */ for (count = 0; cupsFileGets(fp, line, sizeof(line)); count ++); return (count); } /* * 'random_tests()' - Do random access tests. */ static int /* O - Status */ random_tests(void) { int status, /* Status of tests */ pass, /* Current pass */ count, /* Number of records read */ record, /* Current record */ num_records; /* Number of records */ off_t pos; /* Position in file */ ssize_t expected; /* Expected position in file */ cups_file_t *fp; /* File */ char buffer[512]; /* Data buffer */ /* * Run 4 passes, each time appending to a data file and then reopening the * file for reading to validate random records in the file. */ for (status = 0, pass = 0; pass < 4; pass ++) { /* * cupsFileOpen(append) */ printf("\ncupsFileOpen(append %d): ", pass); if ((fp = cupsFileOpen("testfile.dat", "a")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); status ++; break; } else puts("PASS"); /* * cupsFileTell() */ expected = 256 * (ssize_t)sizeof(buffer) * pass; fputs("cupsFileTell(): ", stdout); if ((pos = cupsFileTell(fp)) != (off_t)expected) { printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", CUPS_LLCAST pos, CUPS_LLCAST expected); status ++; break; } else puts("PASS"); /* * cupsFileWrite() */ fputs("cupsFileWrite(256 512-byte records): ", stdout); for (record = 0; record < 256; record ++) { memset(buffer, record, sizeof(buffer)); if (cupsFileWrite(fp, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) break; } if (record < 256) { printf("FAIL (%d: %s)\n", record, strerror(errno)); status ++; break; } else puts("PASS"); /* * cupsFileTell() */ expected += 256 * (ssize_t)sizeof(buffer); fputs("cupsFileTell(): ", stdout); if ((pos = cupsFileTell(fp)) != (off_t)expected) { printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", CUPS_LLCAST pos, CUPS_LLCAST expected); status ++; break; } else puts("PASS"); cupsFileClose(fp); /* * cupsFileOpen(read) */ printf("\ncupsFileOpen(read %d): ", pass); if ((fp = cupsFileOpen("testfile.dat", "r")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); status ++; break; } else puts("PASS"); /* * cupsFileSeek, cupsFileRead */ fputs("cupsFileSeek(), cupsFileRead(): ", stdout); for (num_records = (pass + 1) * 256, count = (pass + 1) * 256, record = ((int)CUPS_RAND() & 65535) % num_records; count > 0; count --, record = (record + ((int)CUPS_RAND() & 31) - 16 + num_records) % num_records) { /* * The last record is always the first... */ if (count == 1) record = 0; /* * Try reading the data for the specified record, and validate the * contents... */ expected = (ssize_t)sizeof(buffer) * record; if ((pos = cupsFileSeek(fp, expected)) != expected) { printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", CUPS_LLCAST pos, CUPS_LLCAST expected); status ++; break; } else { if (cupsFileRead(fp, buffer, sizeof(buffer)) != sizeof(buffer)) { printf("FAIL (%s)\n", strerror(errno)); status ++; break; } else if ((buffer[0] & 255) != (record & 255) || memcmp(buffer, buffer + 1, sizeof(buffer) - 1)) { printf("FAIL (Bad Data - %d instead of %d)\n", buffer[0] & 255, record & 255); status ++; break; } } } if (count == 0) puts("PASS"); cupsFileClose(fp); } /* * Remove the test file... */ unlink("testfile.dat"); /* * Return the test status... */ return (status); } /* * 'read_write_tests()' - Perform read/write tests. */ static int /* O - Status */ read_write_tests(int compression) /* I - Use compression? */ { int i; /* Looping var */ cups_file_t *fp; /* File */ int status; /* Exit status */ char line[1024], /* Line from file */ *value; /* Directive value from line */ int linenum; /* Line number */ unsigned char readbuf[8192], /* Read buffer */ writebuf[8192]; /* Write buffer */ int byte; /* Byte from file */ ssize_t bytes; /* Number of bytes read/written */ off_t length; /* Length of file */ static const char *partial_line = "partial line"; /* Partial line */ /* * No errors so far... */ status = 0; /* * Initialize the write buffer with random data... */ CUPS_SRAND((unsigned)time(NULL)); for (i = 0; i < (int)sizeof(writebuf); i ++) writebuf[i] = (unsigned char)CUPS_RAND(); /* * cupsFileOpen(write) */ printf("cupsFileOpen(write%s): ", compression ? " compressed" : ""); fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat", compression ? "w9" : "w"); if (fp) { puts("PASS"); /* * cupsFileCompression() */ fputs("cupsFileCompression(): ", stdout); if (cupsFileCompression(fp) == compression) puts("PASS"); else { printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp), compression); status ++; } /* * cupsFilePuts() */ fputs("cupsFilePuts(): ", stdout); if (cupsFilePuts(fp, "# Hello, World\n") > 0) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFilePrintf() */ fputs("cupsFilePrintf(): ", stdout); for (i = 0; i < 1000; i ++) if (cupsFilePrintf(fp, "TestLine %03d\n", i) < 0) break; if (i >= 1000) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFilePutChar() */ fputs("cupsFilePutChar(): ", stdout); for (i = 0; i < 256; i ++) if (cupsFilePutChar(fp, i) < 0) break; if (i >= 256) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileWrite() */ fputs("cupsFileWrite(): ", stdout); for (i = 0; i < 10000; i ++) if (cupsFileWrite(fp, (char *)writebuf, sizeof(writebuf)) < 0) break; if (i >= 10000) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFilePuts() with partial line... */ fputs("cupsFilePuts(\"partial line\"): ", stdout); if (cupsFilePuts(fp, partial_line) > 0) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileTell() */ fputs("cupsFileTell(): ", stdout); if ((length = cupsFileTell(fp)) == 81933283) puts("PASS"); else { printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length); status ++; } /* * cupsFileClose() */ fputs("cupsFileClose(): ", stdout); if (!cupsFileClose(fp)) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileOpen(read) */ fputs("\ncupsFileOpen(read): ", stdout); fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat", "r"); if (fp) { puts("PASS"); /* * cupsFileGets() */ fputs("cupsFileGets(): ", stdout); if (cupsFileGets(fp, line, sizeof(line))) { if (line[0] == '#') puts("PASS"); else { printf("FAIL (Got line \"%s\", expected comment line)\n", line); status ++; } } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileCompression() */ fputs("cupsFileCompression(): ", stdout); if (cupsFileCompression(fp) == compression) puts("PASS"); else { printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp), compression); status ++; } /* * cupsFileGetConf() */ linenum = 1; fputs("cupsFileGetConf(): ", stdout); for (i = 0, value = NULL; i < 1000; i ++) if (!cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) break; else if (_cups_strcasecmp(line, "TestLine") || !value || atoi(value) != i || linenum != (i + 2)) break; if (i >= 1000) puts("PASS"); else if (line[0]) { printf("FAIL (Line %d, directive \"%s\", value \"%s\")\n", linenum, line, value ? value : "(null)"); status ++; } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileGetChar() */ fputs("cupsFileGetChar(): ", stdout); for (i = 0, byte = 0; i < 256; i ++) if ((byte = cupsFileGetChar(fp)) != i) break; if (i >= 256) puts("PASS"); else if (byte >= 0) { printf("FAIL (Got %d, expected %d)\n", byte, i); status ++; } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileRead() */ fputs("cupsFileRead(): ", stdout); for (i = 0, bytes = 0; i < 10000; i ++) if ((bytes = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0) break; else if (memcmp(readbuf, writebuf, sizeof(readbuf))) break; if (i >= 10000) puts("PASS"); else if (bytes > 0) { printf("FAIL (Pass %d, ", i); for (i = 0; i < (int)sizeof(readbuf); i ++) if (readbuf[i] != writebuf[i]) break; printf("match failed at offset %d - got %02X, expected %02X)\n", i, readbuf[i], writebuf[i]); } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * cupsFileGetChar() with partial line... */ fputs("cupsFileGetChar(partial line): ", stdout); for (i = 0; i < (int)strlen(partial_line); i ++) if ((byte = cupsFileGetChar(fp)) < 0) break; else if (byte != partial_line[i]) break; if (!partial_line[i]) puts("PASS"); else { printf("FAIL (got '%c', expected '%c')\n", byte, partial_line[i]); status ++; } /* * cupsFileTell() */ fputs("cupsFileTell(): ", stdout); if ((length = cupsFileTell(fp)) == 81933283) puts("PASS"); else { printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length); status ++; } /* * cupsFileClose() */ fputs("cupsFileClose(): ", stdout); if (!cupsFileClose(fp)) puts("PASS"); else { printf("FAIL (%s)\n", strerror(errno)); status ++; } } else { printf("FAIL (%s)\n", strerror(errno)); status ++; } /* * Remove the test file... */ if (!status) unlink(compression ? "testfile.dat.gz" : "testfile.dat"); /* * Return the test status... */ return (status); } cups-2.3.1/cups/ipp-file.c000664 000765 000024 00000050576 13574721672 015437 0ustar00mikestaff000000 000000 /* * IPP data file parsing functions. * * 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 * information. */ /* * Include necessary headers... */ #include "ipp-private.h" #include "string-private.h" #include "debug-internal.h" /* * Local functions... */ static ipp_t *parse_collection(_ipp_file_t *f, _ipp_vars_t *v, void *user_data); static int parse_value(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, ipp_t *ipp, ipp_attribute_t **attr, int element); static void report_error(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *message, ...) _CUPS_FORMAT(4, 5); /* * '_ippFileParse()' - Parse an IPP data file. */ ipp_t * /* O - IPP attributes or @code NULL@ on failure */ _ippFileParse( _ipp_vars_t *v, /* I - Variables */ const char *filename, /* I - Name of file to parse */ void *user_data) /* I - User data pointer */ { _ipp_file_t f; /* IPP data file information */ ipp_t *attrs = NULL; /* Active IPP message */ ipp_attribute_t *attr = NULL; /* Current attribute */ char token[1024]; /* Token string */ ipp_t *ignored = NULL; /* Ignored attributes */ DEBUG_printf(("_ippFileParse(v=%p, filename=\"%s\", user_data=%p)", (void *)v, filename, user_data)); /* * Initialize file info... */ memset(&f, 0, sizeof(f)); f.filename = filename; f.linenum = 1; if ((f.fp = cupsFileOpen(filename, "r")) == NULL) { DEBUG_printf(("1_ippFileParse: Unable to open \"%s\": %s", filename, strerror(errno))); return (0); } /* * Do the callback with a NULL token to setup any initial state... */ (*v->tokencb)(&f, v, user_data, NULL); /* * Read data file, using the callback function as needed... */ while (_ippFileReadToken(&f, token, sizeof(token))) { if (!_cups_strcasecmp(token, "DEFINE") || !_cups_strcasecmp(token, "DEFINE-DEFAULT")) { char name[128], /* Variable name */ value[1024], /* Variable value */ temp[1024]; /* Temporary string */ attr = NULL; if (_ippFileReadToken(&f, name, sizeof(name)) && _ippFileReadToken(&f, temp, sizeof(temp))) { if (_cups_strcasecmp(token, "DEFINE-DEFAULT") || !_ippVarsGet(v, name)) { _ippVarsExpand(v, value, temp, sizeof(value)); _ippVarsSet(v, name, value); } } else { report_error(&f, v, user_data, "Missing %s name and/or value on line %d of \"%s\".", token, f.linenum, f.filename); break; } } else if (f.attrs && !_cups_strcasecmp(token, "ATTR")) { /* * Attribute definition... */ char syntax[128], /* Attribute syntax (value tag) */ name[128]; /* Attribute name */ ipp_tag_t value_tag; /* Value tag */ attr = NULL; if (!_ippFileReadToken(&f, syntax, sizeof(syntax))) { report_error(&f, v, user_data, "Missing ATTR syntax on line %d of \"%s\".", f.linenum, f.filename); break; } else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) { report_error(&f, v, user_data, "Bad ATTR syntax \"%s\" on line %d of \"%s\".", syntax, f.linenum, f.filename); break; } if (!_ippFileReadToken(&f, name, sizeof(name)) || !name[0]) { report_error(&f, v, user_data, "Missing ATTR name on line %d of \"%s\".", f.linenum, f.filename); break; } if (!v->attrcb || (*v->attrcb)(&f, user_data, name)) { /* * Add this attribute... */ attrs = f.attrs; } else { /* * Ignore this attribute... */ if (!ignored) ignored = ippNew(); attrs = ignored; } if (value_tag < IPP_TAG_INTEGER) { /* * Add out-of-band attribute - no value string needed... */ ippAddOutOfBand(attrs, f.group_tag, value_tag, name); } else { /* * Add attribute with one or more values... */ attr = ippAddString(attrs, f.group_tag, value_tag, name, NULL, NULL); if (!parse_value(&f, v, user_data, attrs, &attr, 0)) break; } } else if (attr && !_cups_strcasecmp(token, ",")) { /* * Additional value... */ if (!parse_value(&f, v, user_data, attrs, &attr, ippGetCount(attr))) break; } else { /* * Something else... */ attr = NULL; attrs = NULL; if (!(*v->tokencb)(&f, v, user_data, token)) break; } } /* * Close the file and free ignored attributes, then return any attributes we * kept... */ cupsFileClose(f.fp); ippDelete(ignored); return (f.attrs); } /* * '_ippFileReadToken()' - Read a token from an IPP data file. */ int /* O - 1 on success, 0 on failure */ _ippFileReadToken(_ipp_file_t *f, /* I - File to read from */ char *token, /* I - Token string buffer */ size_t tokensize)/* I - Size of token string buffer */ { int ch, /* Character from file */ quote = 0; /* Quoting character */ char *tokptr = token, /* Pointer into token buffer */ *tokend = token + tokensize - 1;/* End of token buffer */ /* * Skip whitespace and comments... */ DEBUG_printf(("1_ippFileReadToken: linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp))); while ((ch = cupsFileGetChar(f->fp)) != EOF) { if (_cups_isspace(ch)) { /* * Whitespace... */ if (ch == '\n') { f->linenum ++; DEBUG_printf(("1_ippFileReadToken: LF in leading whitespace, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp))); } } else if (ch == '#') { /* * Comment... */ DEBUG_puts("1_ippFileReadToken: Skipping comment in leading whitespace..."); while ((ch = cupsFileGetChar(f->fp)) != EOF) { if (ch == '\n') break; } if (ch == '\n') { f->linenum ++; DEBUG_printf(("1_ippFileReadToken: LF at end of comment, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp))); } else break; } else break; } if (ch == EOF) { DEBUG_puts("1_ippFileReadToken: EOF"); return (0); } /* * Read a token... */ while (ch != EOF) { if (ch == '\n') { f->linenum ++; DEBUG_printf(("1_ippFileReadToken: LF in token, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp))); } if (ch == quote) { /* * End of quoted text... */ *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Returning \"%s\" at closing quote.", token)); return (1); } else if (!quote && _cups_isspace(ch)) { /* * End of unquoted text... */ *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Returning \"%s\" before whitespace.", token)); return (1); } else if (!quote && (ch == '\'' || ch == '\"')) { /* * Start of quoted text or regular expression... */ if (ch == '<') quote = '>'; else quote = ch; DEBUG_printf(("1_ippFileReadToken: Start of quoted string, quote=%c, pos=%ld", quote, (long)cupsFileTell(f->fp))); } else if (!quote && ch == '#') { /* * Start of comment... */ cupsFileSeek(f->fp, cupsFileTell(f->fp) - 1); *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Returning \"%s\" before comment.", token)); return (1); } else if (!quote && (ch == '{' || ch == '}' || ch == ',')) { /* * Delimiter... */ if (tokptr > token) { /* * Return the preceding token first... */ cupsFileSeek(f->fp, cupsFileTell(f->fp) - 1); } else { /* * Return this delimiter by itself... */ *tokptr++ = (char)ch; } *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Returning \"%s\".", token)); return (1); } else { if (ch == '\\') { /* * Quoted character... */ DEBUG_printf(("1_ippFileReadToken: Quoted character at pos=%ld", (long)cupsFileTell(f->fp))); if ((ch = cupsFileGetChar(f->fp)) == EOF) { *token = '\0'; DEBUG_puts("1_ippFileReadToken: EOF"); return (0); } else if (ch == '\n') { f->linenum ++; DEBUG_printf(("1_ippFileReadToken: quoted LF, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp))); } else if (ch == 'a') ch = '\a'; else if (ch == 'b') ch = '\b'; else if (ch == 'f') ch = '\f'; else if (ch == 'n') ch = '\n'; else if (ch == 'r') ch = '\r'; else if (ch == 't') ch = '\t'; else if (ch == 'v') ch = '\v'; } if (tokptr < tokend) { /* * Add to current token... */ *tokptr++ = (char)ch; } else { /* * Token too long... */ *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Too long: \"%s\".", token)); return (0); } } /* * Get the next character... */ ch = cupsFileGetChar(f->fp); } *tokptr = '\0'; DEBUG_printf(("1_ippFileReadToken: Returning \"%s\" at EOF.", token)); return (tokptr > token); } /* * 'parse_collection()' - Parse an IPP collection value. */ static ipp_t * /* O - Collection value or @code NULL@ on error */ parse_collection( _ipp_file_t *f, /* I - IPP data file */ _ipp_vars_t *v, /* I - IPP variables */ void *user_data) /* I - User data pointer */ { ipp_t *col = ippNew(); /* Collection value */ ipp_attribute_t *attr = NULL; /* Current member attribute */ char token[1024]; /* Token string */ /* * Parse the collection value... */ while (_ippFileReadToken(f, token, sizeof(token))) { if (!_cups_strcasecmp(token, "}")) { /* * End of collection value... */ break; } else if (!_cups_strcasecmp(token, "MEMBER")) { /* * Member attribute definition... */ char syntax[128], /* Attribute syntax (value tag) */ name[128]; /* Attribute name */ ipp_tag_t value_tag; /* Value tag */ attr = NULL; if (!_ippFileReadToken(f, syntax, sizeof(syntax))) { report_error(f, v, user_data, "Missing MEMBER syntax on line %d of \"%s\".", f->linenum, f->filename); ippDelete(col); col = NULL; break; } else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) { report_error(f, v, user_data, "Bad MEMBER syntax \"%s\" on line %d of \"%s\".", syntax, f->linenum, f->filename); ippDelete(col); col = NULL; break; } if (!_ippFileReadToken(f, name, sizeof(name)) || !name[0]) { report_error(f, v, user_data, "Missing MEMBER name on line %d of \"%s\".", f->linenum, f->filename); ippDelete(col); col = NULL; break; } if (value_tag < IPP_TAG_INTEGER) { /* * Add out-of-band attribute - no value string needed... */ ippAddOutOfBand(col, IPP_TAG_ZERO, value_tag, name); } else { /* * Add attribute with one or more values... */ attr = ippAddString(col, IPP_TAG_ZERO, value_tag, name, NULL, NULL); if (!parse_value(f, v, user_data, col, &attr, 0)) { ippDelete(col); col = NULL; break; } } } else if (attr && !_cups_strcasecmp(token, ",")) { /* * Additional value... */ if (!parse_value(f, v, user_data, col, &attr, ippGetCount(attr))) { ippDelete(col); col = NULL; break; } } else { /* * Something else... */ report_error(f, v, user_data, "Unknown directive \"%s\" on line %d of \"%s\".", token, f->linenum, f->filename); ippDelete(col); col = NULL; attr = NULL; break; } } return (col); } /* * 'parse_value()' - Parse an IPP value. */ static int /* O - 1 on success or 0 on error */ parse_value(_ipp_file_t *f, /* I - IPP data file */ _ipp_vars_t *v, /* I - IPP variables */ void *user_data,/* I - User data pointer */ ipp_t *ipp, /* I - IPP message */ ipp_attribute_t **attr, /* IO - IPP attribute */ int element) /* I - Element number */ { char value[2049], /* Value string */ *valueptr, /* Pointer into value string */ temp[2049], /* Temporary string */ *tempptr; /* Pointer into temporary string */ size_t valuelen; /* Length of value */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { report_error(f, v, user_data, "Missing value on line %d of \"%s\".", f->linenum, f->filename); return (0); } _ippVarsExpand(v, value, temp, sizeof(value)); switch (ippGetValueTag(*attr)) { case IPP_TAG_BOOLEAN : return (ippSetBoolean(ipp, attr, element, !_cups_strcasecmp(value, "true"))); break; case IPP_TAG_ENUM : case IPP_TAG_INTEGER : return (ippSetInteger(ipp, attr, element, (int)strtol(value, NULL, 0))); break; case IPP_TAG_DATE : { int year, /* Year */ month, /* Month */ day, /* Day of month */ hour, /* Hour */ minute, /* Minute */ second, /* Second */ utc_offset = 0; /* Timezone offset from UTC */ ipp_uchar_t date[11]; /* dateTime value */ if (*value == 'P') { /* * Time period... */ time_t curtime; /* Current time in seconds */ int period = 0, /* Current period value */ saw_T = 0; /* Saw time separator */ curtime = time(NULL); for (valueptr = value + 1; *valueptr; valueptr ++) { if (isdigit(*valueptr & 255)) { period = (int)strtol(valueptr, &valueptr, 10); if (!valueptr || period < 0) { report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } } if (*valueptr == 'Y') { curtime += 365 * 86400 * period; period = 0; } else if (*valueptr == 'M') { if (saw_T) curtime += 60 * period; else curtime += 30 * 86400 * period; period = 0; } else if (*valueptr == 'D') { curtime += 86400 * period; period = 0; } else if (*valueptr == 'H') { curtime += 3600 * period; period = 0; } else if (*valueptr == 'S') { curtime += period; period = 0; } else if (*valueptr == 'T') { saw_T = 1; period = 0; } else { report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } } return (ippSetDate(ipp, attr, element, ippTimeToDate(curtime))); } else if (sscanf(value, "%d-%d-%dT%d:%d:%d%d", &year, &month, &day, &hour, &minute, &second, &utc_offset) < 6) { /* * Date/time value did not parse... */ report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } date[0] = (ipp_uchar_t)(year >> 8); date[1] = (ipp_uchar_t)(year & 255); date[2] = (ipp_uchar_t)month; date[3] = (ipp_uchar_t)day; date[4] = (ipp_uchar_t)hour; date[5] = (ipp_uchar_t)minute; date[6] = (ipp_uchar_t)second; date[7] = 0; if (utc_offset < 0) { utc_offset = -utc_offset; date[8] = (ipp_uchar_t)'-'; } else { date[8] = (ipp_uchar_t)'+'; } date[9] = (ipp_uchar_t)(utc_offset / 100); date[10] = (ipp_uchar_t)(utc_offset % 100); return (ippSetDate(ipp, attr, element, date)); } break; case IPP_TAG_RESOLUTION : { int xres, /* X resolution */ yres; /* Y resolution */ char *ptr; /* Pointer into value */ xres = yres = (int)strtol(value, (char **)&ptr, 10); if (ptr > value && xres > 0) { if (*ptr == 'x') yres = (int)strtol(ptr + 1, (char **)&ptr, 10); } if (ptr <= value || xres <= 0 || yres <= 0 || !ptr || (_cups_strcasecmp(ptr, "dpi") && _cups_strcasecmp(ptr, "dpc") && _cups_strcasecmp(ptr, "dpcm") && _cups_strcasecmp(ptr, "other"))) { report_error(f, v, user_data, "Bad resolution value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } if (!_cups_strcasecmp(ptr, "dpi")) return (ippSetResolution(ipp, attr, element, IPP_RES_PER_INCH, xres, yres)); else if (!_cups_strcasecmp(ptr, "dpc") || !_cups_strcasecmp(ptr, "dpcm")) return (ippSetResolution(ipp, attr, element, IPP_RES_PER_CM, xres, yres)); else return (ippSetResolution(ipp, attr, element, (ipp_res_t)0, xres, yres)); } break; case IPP_TAG_RANGE : { int lower, /* Lower value */ upper; /* Upper value */ if (sscanf(value, "%d-%d", &lower, &upper) != 2) { report_error(f, v, user_data, "Bad rangeOfInteger value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } return (ippSetRange(ipp, attr, element, lower, upper)); } break; case IPP_TAG_STRING : valuelen = strlen(value); if (value[0] == '<' && value[strlen(value) - 1] == '>') { if (valuelen & 1) { report_error(f, v, user_data, "Bad octetString value on line %d of \"%s\".", f->linenum, f->filename); return (0); } valueptr = value + 1; tempptr = temp; while (*valueptr && *valueptr != '>') { if (!isxdigit(valueptr[0] & 255) || !isxdigit(valueptr[1] & 255)) { report_error(f, v, user_data, "Bad octetString value on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (valueptr[0] >= '0' && valueptr[0] <= '9') *tempptr = (char)((valueptr[0] - '0') << 4); else *tempptr = (char)((tolower(valueptr[0]) - 'a' + 10) << 4); if (valueptr[1] >= '0' && valueptr[1] <= '9') *tempptr |= (valueptr[1] - '0'); else *tempptr |= (tolower(valueptr[1]) - 'a' + 10); tempptr ++; } return (ippSetOctetString(ipp, attr, element, temp, (int)(tempptr - temp))); } else return (ippSetOctetString(ipp, attr, element, value, (int)valuelen)); break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : return (ippSetString(ipp, attr, element, value)); break; case IPP_TAG_BEGIN_COLLECTION : { int status; /* Add status */ ipp_t *col; /* Collection value */ if (strcmp(value, "{")) { report_error(f, v, user_data, "Bad collection value on line %d of \"%s\".", f->linenum, f->filename); return (0); } if ((col = parse_collection(f, v, user_data)) == NULL) return (0); status = ippSetCollection(ipp, attr, element, col); ippDelete(col); return (status); } break; default : report_error(f, v, user_data, "Unsupported value on line %d of \"%s\".", f->linenum, f->filename); return (0); } return (1); } /* * 'report_error()' - Report an error. */ static void report_error( _ipp_file_t *f, /* I - IPP data file */ _ipp_vars_t *v, /* I - Error callback function, if any */ void *user_data, /* I - User data pointer */ const char *message, /* I - Printf-style message */ ...) /* I - Additional arguments as needed */ { char buffer[8192]; /* Formatted string */ va_list ap; /* Argument pointer */ va_start(ap, message); vsnprintf(buffer, sizeof(buffer), message, ap); va_end(ap); if (v->errorcb) (*v->errorcb)(f, user_data, buffer); else fprintf(stderr, "%s\n", buffer); } cups-2.3.1/cups/testcreds.c000664 000765 000024 00000006527 13574721672 015727 0ustar00mikestaff000000 000000 /* * HTTP credentials test program for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { http_t *http; /* HTTP connection */ char scheme[HTTP_MAX_URI], /* Scheme from URI */ hostname[HTTP_MAX_URI], /* Hostname from URI */ username[HTTP_MAX_URI], /* Username:password from URI */ resource[HTTP_MAX_URI]; /* Resource from URI */ int port; /* Port number from URI */ http_trust_t trust; /* Trust evaluation for connection */ cups_array_t *hcreds, /* Credentials from connection */ *tcreds; /* Credentials from trust store */ char hinfo[1024], /* String for connection credentials */ tinfo[1024]; /* String for trust store credentials */ static const char *trusts[] = /* Trust strings */ { "OK", "Invalid", "Changed", "Expired", "Renewed", "Unknown" }; /* * Check command-line... */ if (argc != 2) { puts("Usage: ./testcreds hostname"); puts(" ./testcreds https://hostname[:port]"); return (1); } if (!strncmp(argv[1], "https://", 8)) { /* * Connect to the host and validate credentials... */ if (httpSeparateURI(HTTP_URI_CODING_MOST, argv[1], scheme, sizeof(scheme), username, sizeof(username), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { printf("ERROR: Bad URI \"%s\".\n", argv[1]); return (1); } if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL)) == NULL) { printf("ERROR: Unable to connect to \"%s\" on port %d: %s\n", hostname, port, cupsLastErrorString()); return (1); } puts("HTTP Credentials:"); if (!httpCopyCredentials(http, &hcreds)) { trust = httpCredentialsGetTrust(hcreds, hostname); httpCredentialsString(hcreds, hinfo, sizeof(hinfo)); printf(" Certificate Count: %d\n", cupsArrayCount(hcreds)); if (trust == HTTP_TRUST_OK) puts(" Trust: OK"); else printf(" Trust: %s (%s)\n", trusts[trust], cupsLastErrorString()); printf(" Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(hcreds))); printf(" IsValidName: %d\n", httpCredentialsAreValidForName(hcreds, hostname)); printf(" String: \"%s\"\n", hinfo); httpFreeCredentials(hcreds); } else puts(" Not present (error)."); puts(""); } else { /* * Load stored credentials... */ strlcpy(hostname, argv[1], sizeof(hostname)); } printf("Trust Store for \"%s\":\n", hostname); if (!httpLoadCredentials(NULL, &tcreds, hostname)) { httpCredentialsString(tcreds, tinfo, sizeof(tinfo)); printf(" Certificate Count: %d\n", cupsArrayCount(tcreds)); printf(" Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(tcreds))); printf(" IsValidName: %d\n", httpCredentialsAreValidForName(tcreds, hostname)); printf(" String: \"%s\"\n", tinfo); httpFreeCredentials(tcreds); } else puts(" Not present."); return (0); } cups-2.3.1/cups/debug.c000664 000765 000024 00000032515 13574721672 015011 0ustar00mikestaff000000 000000 /* * Debugging functions for CUPS. * * Copyright © 2008-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include "thread-private.h" #ifdef _WIN32 # include # include # include # define getpid (int)GetCurrentProcessId int /* O - 0 on success, -1 on failure */ _cups_gettimeofday(struct timeval *tv, /* I - Timeval struct */ void *tz) /* I - Timezone */ { struct _timeb timebuffer; /* Time buffer struct */ _ftime(&timebuffer); tv->tv_sec = (long)timebuffer.time; tv->tv_usec = timebuffer.millitm * 1000; return 0; } #else # include # include #endif /* _WIN32 */ #include #include #ifdef DEBUG /* * Globals... */ int _cups_debug_fd = -1; /* Debug log file descriptor */ int _cups_debug_level = 1; /* Log level (0 to 9) */ /* * Local globals... */ static regex_t *debug_filter = NULL; /* Filter expression for messages */ static int debug_init = 0; /* Did we initialize debugging? */ static _cups_mutex_t debug_init_mutex = _CUPS_MUTEX_INITIALIZER, /* Mutex to control initialization */ debug_log_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex to serialize log entries */ /* * 'debug_thread_id()' - Return an integer representing the current thread. */ static int /* O - Local thread ID */ debug_thread_id(void) { _cups_globals_t *cg = _cupsGlobals(); /* Global data */ return (cg->thread_id); } /* * '_cups_debug_printf()' - Write a formatted line to the log. */ void _cups_debug_printf(const char *format, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { va_list ap; /* Pointer to arguments */ struct timeval curtime; /* Current time */ char buffer[2048]; /* Output buffer */ ssize_t bytes; /* Number of bytes in buffer */ int level; /* Log level in message */ /* * See if we need to do any logging... */ if (!debug_init) _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"), getenv("CUPS_DEBUG_FILTER"), 0); if (_cups_debug_fd < 0) return; /* * Filter as needed... */ if (isdigit(format[0])) level = *format++ - '0'; else level = 0; if (level > _cups_debug_level) return; if (debug_filter) { int result; /* Filter result */ _cupsMutexLock(&debug_init_mutex); result = regexec(debug_filter, format, 0, NULL, 0); _cupsMutexUnlock(&debug_init_mutex); if (result) return; } /* * Format the message... */ gettimeofday(&curtime, NULL); snprintf(buffer, sizeof(buffer), "T%03d %02d:%02d:%02d.%03d ", debug_thread_id(), (int)((curtime.tv_sec / 3600) % 24), (int)((curtime.tv_sec / 60) % 60), (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000)); va_start(ap, format); bytes = _cups_safe_vsnprintf(buffer + 19, sizeof(buffer) - 20, format, ap) + 19; va_end(ap); if ((size_t)bytes >= (sizeof(buffer) - 1)) { buffer[sizeof(buffer) - 2] = '\n'; bytes = sizeof(buffer) - 1; } else if (buffer[bytes - 1] != '\n') { buffer[bytes++] = '\n'; buffer[bytes] = '\0'; } /* * Write it out... */ _cupsMutexLock(&debug_log_mutex); write(_cups_debug_fd, buffer, (size_t)bytes); _cupsMutexUnlock(&debug_log_mutex); } /* * '_cups_debug_puts()' - Write a single line to the log. */ void _cups_debug_puts(const char *s) /* I - String to output */ { struct timeval curtime; /* Current time */ char buffer[2048]; /* Output buffer */ ssize_t bytes; /* Number of bytes in buffer */ int level; /* Log level in message */ /* * See if we need to do any logging... */ if (!debug_init) _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"), getenv("CUPS_DEBUG_FILTER"), 0); if (_cups_debug_fd < 0) return; /* * Filter as needed... */ if (isdigit(s[0])) level = *s++ - '0'; else level = 0; if (level > _cups_debug_level) return; if (debug_filter) { int result; /* Filter result */ _cupsMutexLock(&debug_init_mutex); result = regexec(debug_filter, s, 0, NULL, 0); _cupsMutexUnlock(&debug_init_mutex); if (result) return; } /* * Format the message... */ gettimeofday(&curtime, NULL); bytes = snprintf(buffer, sizeof(buffer), "T%03d %02d:%02d:%02d.%03d %s", debug_thread_id(), (int)((curtime.tv_sec / 3600) % 24), (int)((curtime.tv_sec / 60) % 60), (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000), s); if ((size_t)bytes >= (sizeof(buffer) - 1)) { buffer[sizeof(buffer) - 2] = '\n'; bytes = sizeof(buffer) - 1; } else if (buffer[bytes - 1] != '\n') { buffer[bytes++] = '\n'; buffer[bytes] = '\0'; } /* * Write it out... */ _cupsMutexLock(&debug_log_mutex); write(_cups_debug_fd, buffer, (size_t)bytes); _cupsMutexUnlock(&debug_log_mutex); } /* * '_cups_debug_set()' - Enable or disable debug logging. */ void _cups_debug_set(const char *logfile, /* I - Log file or NULL */ const char *level, /* I - Log level or NULL */ const char *filter, /* I - Filter string or NULL */ int force) /* I - Force initialization */ { _cupsMutexLock(&debug_init_mutex); if (!debug_init || force) { /* * Restore debug settings to defaults... */ if (_cups_debug_fd != -1) { close(_cups_debug_fd); _cups_debug_fd = -1; } if (debug_filter) { regfree((regex_t *)debug_filter); debug_filter = NULL; } _cups_debug_level = 1; /* * Open logs, set log levels, etc. */ if (!logfile) _cups_debug_fd = -1; else if (!strcmp(logfile, "-")) _cups_debug_fd = 2; else { char buffer[1024]; /* Filename buffer */ snprintf(buffer, sizeof(buffer), logfile, getpid()); if (buffer[0] == '+') _cups_debug_fd = open(buffer + 1, O_WRONLY | O_APPEND | O_CREAT, 0644); else _cups_debug_fd = open(buffer, O_WRONLY | O_TRUNC | O_CREAT, 0644); } if (level) _cups_debug_level = atoi(level); if (filter) { if ((debug_filter = (regex_t *)calloc(1, sizeof(regex_t))) == NULL) fputs("Unable to allocate memory for CUPS_DEBUG_FILTER - results not " "filtered!\n", stderr); else if (regcomp(debug_filter, filter, REG_EXTENDED)) { fputs("Bad regular expression in CUPS_DEBUG_FILTER - results not " "filtered!\n", stderr); free(debug_filter); debug_filter = NULL; } } debug_init = 1; } _cupsMutexUnlock(&debug_init_mutex); } #else /* * '_cups_debug_set()' - Enable or disable debug logging. */ void _cups_debug_set(const char *logfile, /* I - Log file or NULL */ const char *level, /* I - Log level or NULL */ const char *filter, /* I - Filter string or NULL */ int force) /* I - Force initialization */ { (void)logfile; (void)level; (void)filter; (void)force; } #endif /* DEBUG */ /* * '_cups_safe_vsnprintf()' - Format a string into a fixed size buffer, * quoting special characters. */ ssize_t /* O - Number of bytes formatted */ _cups_safe_vsnprintf( char *buffer, /* O - Output buffer */ size_t bufsize, /* O - Size of output buffer */ const char *format, /* I - printf-style format string */ va_list ap) /* I - Pointer to additional arguments */ { char *bufptr, /* Pointer to position in buffer */ *bufend, /* Pointer to end of buffer */ size, /* Size character (h, l, L) */ type; /* Format type character */ int width, /* Width of field */ prec; /* Number of characters of precision */ char tformat[100], /* Temporary format string for snprintf() */ *tptr, /* Pointer into temporary format */ temp[1024]; /* Buffer for formatted numbers */ char *s; /* Pointer to string */ ssize_t bytes; /* Total number of bytes needed */ if (!buffer || bufsize < 2 || !format) return (-1); /* * Loop through the format string, formatting as needed... */ bufptr = buffer; bufend = buffer + bufsize - 1; bytes = 0; while (*format) { if (*format == '%') { tptr = tformat; *tptr++ = *format++; if (*format == '%') { if (bufptr < bufend) *bufptr++ = *format; bytes ++; format ++; continue; } else if (strchr(" -+#\'", *format)) *tptr++ = *format++; if (*format == '*') { /* * Get width from argument... */ format ++; width = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width); tptr += strlen(tptr); } else { width = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; width = width * 10 + *format++ - '0'; } } if (*format == '.') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; format ++; if (*format == '*') { /* * Get precision from argument... */ format ++; prec = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec); tptr += strlen(tptr); } else { prec = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; prec = prec * 10 + *format++ - '0'; } } } if (*format == 'l' && format[1] == 'l') { size = 'L'; if (tptr < (tformat + sizeof(tformat) - 2)) { *tptr++ = 'l'; *tptr++ = 'l'; } format += 2; } else if (*format == 'h' || *format == 'l' || *format == 'L') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; size = *format++; } else size = 0; if (!*format) break; if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; type = *format++; *tptr = '\0'; switch (type) { case 'E' : /* Floating point formats */ case 'G' : case 'e' : case 'f' : case 'g' : if ((size_t)(width + 2) > sizeof(temp)) break; snprintf(temp, sizeof(temp), tformat, va_arg(ap, double)); bytes += (int)strlen(temp); if (bufptr) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr += strlen(bufptr); } break; case 'B' : /* Integer formats */ case 'X' : case 'b' : case 'd' : case 'i' : case 'o' : case 'u' : case 'x' : if ((size_t)(width + 2) > sizeof(temp)) break; # ifdef HAVE_LONG_LONG if (size == 'L') snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long)); else # endif /* HAVE_LONG_LONG */ if (size == 'l') snprintf(temp, sizeof(temp), tformat, va_arg(ap, long)); else snprintf(temp, sizeof(temp), tformat, va_arg(ap, int)); bytes += (int)strlen(temp); if (bufptr) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr += strlen(bufptr); } break; case 'p' : /* Pointer value */ if ((size_t)(width + 2) > sizeof(temp)) break; snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *)); bytes += (int)strlen(temp); if (bufptr) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr += strlen(bufptr); } break; case 'c' : /* Character or character array */ bytes += width; if (bufptr) { if (width <= 1) *bufptr++ = (char)va_arg(ap, int); else { if ((bufptr + width) > bufend) width = (int)(bufend - bufptr); memcpy(bufptr, va_arg(ap, char *), (size_t)width); bufptr += width; } } break; case 's' : /* String */ if ((s = va_arg(ap, char *)) == NULL) s = "(null)"; /* * Copy the C string, replacing control chars and \ with * C character escapes... */ for (bufend --; *s && bufptr < bufend; s ++) { if (*s == '\n') { *bufptr++ = '\\'; *bufptr++ = 'n'; bytes += 2; } else if (*s == '\r') { *bufptr++ = '\\'; *bufptr++ = 'r'; bytes += 2; } else if (*s == '\t') { *bufptr++ = '\\'; *bufptr++ = 't'; bytes += 2; } else if (*s == '\\') { *bufptr++ = '\\'; *bufptr++ = '\\'; bytes += 2; } else if (*s == '\'') { *bufptr++ = '\\'; *bufptr++ = '\''; bytes += 2; } else if (*s == '\"') { *bufptr++ = '\\'; *bufptr++ = '\"'; bytes += 2; } else if ((*s & 255) < ' ') { if ((bufptr + 2) >= bufend) break; *bufptr++ = '\\'; *bufptr++ = '0'; *bufptr++ = '0' + *s / 8; *bufptr++ = '0' + (*s & 7); bytes += 4; } else { *bufptr++ = *s; bytes ++; } } bufend ++; break; case 'n' : /* Output number of chars so far */ *(va_arg(ap, int *)) = (int)bytes; break; } } else { bytes ++; if (bufptr < bufend) *bufptr++ = *format; format ++; } } /* * Nul-terminate the string and return the number of characters needed. */ *bufptr = '\0'; return (bytes); } cups-2.3.1/cups/file-private.h000664 000765 000024 00000005025 13574721672 016313 0ustar00mikestaff000000 000000 /* * Private file definitions for CUPS. * * Since stdio files max out at 256 files on many systems, we have to * write similar functions without this limit. At the same time, using * our own file functions allows us to provide transparent support of * different line endings, gzip'd print files, PPD files, etc. * * Copyright © 2007-2018 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. */ #ifndef _CUPS_FILE_PRIVATE_H_ # define _CUPS_FILE_PRIVATE_H_ /* * Include necessary headers... */ # include "cups-private.h" # include # include # include # include # ifdef _WIN32 # include # include # endif /* _WIN32 */ /* * Some operating systems support large files via open flag O_LARGEFILE... */ # ifndef O_LARGEFILE # define O_LARGEFILE 0 # endif /* !O_LARGEFILE */ /* * Some operating systems don't define O_BINARY, which is used by Microsoft * and IBM to flag binary files... */ # ifndef O_BINARY # define O_BINARY 0 # endif /* !O_BINARY */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Types and structures... */ typedef enum /**** _cupsFileCheck return values ****/ { _CUPS_FILE_CHECK_OK = 0, /* Everything OK */ _CUPS_FILE_CHECK_MISSING = 1, /* File is missing */ _CUPS_FILE_CHECK_PERMISSIONS = 2, /* File (or parent dir) has bad perms */ _CUPS_FILE_CHECK_WRONG_TYPE = 3, /* File has wrong type */ _CUPS_FILE_CHECK_RELATIVE_PATH = 4 /* File contains a relative path */ } _cups_fc_result_t; typedef enum /**** _cupsFileCheck file type values ****/ { _CUPS_FILE_CHECK_FILE = 0, /* Check the file and parent directory */ _CUPS_FILE_CHECK_PROGRAM = 1, /* Check the program and parent directory */ _CUPS_FILE_CHECK_FILE_ONLY = 2, /* Check the file only */ _CUPS_FILE_CHECK_DIRECTORY = 3 /* Check the directory */ } _cups_fc_filetype_t; typedef void (*_cups_fc_func_t)(void *context, _cups_fc_result_t result, const char *message); /* * Prototypes... */ extern _cups_fc_result_t _cupsFileCheck(const char *filename, _cups_fc_filetype_t filetype, int dorootchecks, _cups_fc_func_t cb, void *context) _CUPS_PRIVATE; extern void _cupsFileCheckFilter(void *context, _cups_fc_result_t result, const char *message) _CUPS_PRIVATE; extern int _cupsFilePeekAhead(cups_file_t *fp, int ch); # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_FILE_PRIVATE_H_ */ cups-2.3.1/cups/api-raster.shtml000664 000765 000024 00000013642 13574721672 016677 0ustar00mikestaff000000 000000

Overview

The CUPS raster API provides a standard interface for reading and writing CUPS raster streams which are used for printing to raster printers. Because the raster format is updated from time to time, it is important to use this API to avoid incompatibilities with newer versions of CUPS.

Two kinds of CUPS filters use the CUPS raster API - raster image processor (RIP) filters such as pstoraster and cgpdftoraster (macOS) that produce CUPS raster files and printer driver filters that convert CUPS raster files into a format usable by the printer. Printer driver filters are by far the most common.

CUPS raster files (application/vnd.cups-raster) consists of a stream of raster page descriptions produced by one of the RIP filters such as pstoraster, imagetoraster, or cgpdftoraster. CUPS raster files are referred to using the cups_raster_t type and are opened using the cupsRasterOpen function. For example, to read raster data from the standard input, open file descriptor 0:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);

Each page of data begins with a page dictionary structure called cups_page_header2_t. This structure contains the colorspace, bits per color, media size, media type, hardware resolution, and so forth used for the page.

Note:

Do not confuse the colorspace in the page header with the PPD ColorModel keyword. ColorModel refers to the general type of color used for a device (Gray, RGB, CMYK, DeviceN) and is often used to select a particular colorspace for the page header along with the associate color profile. The page header colorspace (cupsColorSpace) describes both the type and organization of the color data, for example KCMY (black first) instead of CMYK and RGBA (RGB + alpha) instead of RGB.

You read the page header using the cupsRasterReadHeader2 function:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
cups_page_header2_t header;

while (cupsRasterReadHeader2(ras, &header))
{
  /* setup this page */

  /* read raster data */

  /* finish this page */
}

After the page dictionary comes the page data which is a full-resolution, possibly compressed bitmap representing the page in the printer's output colorspace. You read uncompressed raster data using the cupsRasterReadPixels function. A for loop is normally used to read the page one line at a time:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
cups_page_header2_t header;
int page = 0;
int y;
char *buffer;

while (cupsRasterReadHeader2(ras, &header))
{
  /* setup this page */
  page ++;
  fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies);

  /* allocate memory for 1 line */
  buffer = malloc(header.cupsBytesPerLine);

  /* read raster data */
  for (y = 0; y < header.cupsHeight; y ++)
  {
    if (cupsRasterReadPixels(ras, buffer, header.cupsBytesPerLine) == 0)
      break;

    /* write raster data to printer on stdout */
  }

  /* finish this page */
}

When you are done reading the raster data, call the cupsRasterClose function to free the memory used to read the raster file:

cups_raster_t *ras;

cupsRasterClose(ras);

Functions by Task

Opening and Closing Raster Streams

Reading Raster Streams

Writing Raster Streams

cups-2.3.1/cups/pwg-private.h000664 000765 000024 00000001774 13574721672 016200 0ustar00mikestaff000000 000000 /* * Private PWG media API definitions for CUPS. * * Copyright 2009-2016 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_PWG_PRIVATE_H_ # define _CUPS_PWG_PRIVATE_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Functions... */ extern void _pwgGenerateSize(char *keyword, size_t keysize, const char *prefix, const char *name, int width, int length) _CUPS_INTERNAL_MSG("Use pwgFormatSizeName instead."); extern int _pwgInitSize(pwg_size_t *size, ipp_t *job, int *margins_set) _CUPS_INTERNAL_MSG("Use pwgInitSize instead."); extern const pwg_media_t *_pwgMediaTable(size_t *num_media) _CUPS_PRIVATE; extern pwg_media_t *_pwgMediaNearSize(int width, int length, int epsilon) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_PWG_PRIVATE_H_ */ cups-2.3.1/cups/array-private.h000664 000765 000024 00000001334 13574721672 016511 0ustar00mikestaff000000 000000 /* * Private array definitions for CUPS. * * Copyright 2011-2012 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_ARRAY_PRIVATE_H_ # define _CUPS_ARRAY_PRIVATE_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Functions... */ extern int _cupsArrayAddStrings(cups_array_t *a, const char *s, char delim) _CUPS_PRIVATE; extern cups_array_t *_cupsArrayNewStrings(const char *s, char delim) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_ARRAY_PRIVATE_H_ */ cups-2.3.1/cups/langprintf.c000664 000765 000024 00000016706 13574721672 016073 0ustar00mikestaff000000 000000 /* * Localized printf/puts functions for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 2002-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * '_cupsLangPrintError()' - Print a message followed by a standard error. */ void _cupsLangPrintError(const char *prefix, /* I - Non-localized message prefix */ const char *message)/* I - Message */ { ssize_t bytes; /* Number of bytes formatted */ int last_errno; /* Last error */ char buffer[2048], /* Message buffer */ *bufptr, /* Pointer into buffer */ output[8192]; /* Output buffer */ _cups_globals_t *cg; /* Global data */ /* * Range check... */ if (!message) return; /* * Save the errno value... */ last_errno = errno; /* * Get the message catalog... */ cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Format the message... */ if (prefix) { snprintf(buffer, sizeof(buffer), "%s:", prefix); bufptr = buffer + strlen(buffer); } else bufptr = buffer; snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), /* TRANSLATORS: Message is "subject: error" */ _cupsLangString(cg->lang_default, _("%s: %s")), _cupsLangString(cg->lang_default, message), strerror(last_errno)); strlcat(buffer, "\n", sizeof(buffer)); /* * Convert and write to stderr... */ bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), cg->lang_default->encoding); if (bytes > 0) fwrite(output, 1, (size_t)bytes, stderr); } /* * '_cupsLangPrintFilter()' - Print a formatted filter message string to a file. */ int /* O - Number of bytes written */ _cupsLangPrintFilter( FILE *fp, /* I - File to write to */ const char *prefix, /* I - Non-localized message prefix */ const char *message, /* I - Message string to use */ ...) /* I - Additional arguments as needed */ { ssize_t bytes; /* Number of bytes formatted */ char temp[2048], /* Temporary format buffer */ buffer[2048], /* Message buffer */ output[8192]; /* Output buffer */ va_list ap; /* Pointer to additional arguments */ _cups_globals_t *cg; /* Global data */ /* * Range check... */ if (!fp || !message) return (-1); cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Format the string... */ va_start(ap, message); snprintf(temp, sizeof(temp), "%s: %s\n", prefix, _cupsLangString(cg->lang_default, message)); vsnprintf(buffer, sizeof(buffer), temp, ap); va_end(ap); /* * Transcode to the destination charset... */ bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), cg->lang_default->encoding); /* * Write the string and return the number of bytes written... */ if (bytes > 0) return ((int)fwrite(output, 1, (size_t)bytes, fp)); else return ((int)bytes); } /* * '_cupsLangPrintf()' - Print a formatted message string to a file. */ int /* O - Number of bytes written */ _cupsLangPrintf(FILE *fp, /* I - File to write to */ const char *message, /* I - Message string to use */ ...) /* I - Additional arguments as needed */ { ssize_t bytes; /* Number of bytes formatted */ char buffer[2048], /* Message buffer */ output[8192]; /* Output buffer */ va_list ap; /* Pointer to additional arguments */ _cups_globals_t *cg; /* Global data */ /* * Range check... */ if (!fp || !message) return (-1); cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Format the string... */ va_start(ap, message); vsnprintf(buffer, sizeof(buffer) - 1, _cupsLangString(cg->lang_default, message), ap); va_end(ap); strlcat(buffer, "\n", sizeof(buffer)); /* * Transcode to the destination charset... */ bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), cg->lang_default->encoding); /* * Write the string and return the number of bytes written... */ if (bytes > 0) return ((int)fwrite(output, 1, (size_t)bytes, fp)); else return ((int)bytes); } /* * '_cupsLangPuts()' - Print a static message string to a file. */ int /* O - Number of bytes written */ _cupsLangPuts(FILE *fp, /* I - File to write to */ const char *message) /* I - Message string to use */ { ssize_t bytes; /* Number of bytes formatted */ char output[8192]; /* Message buffer */ _cups_globals_t *cg; /* Global data */ /* * Range check... */ if (!fp || !message) return (-1); cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Transcode to the destination charset... */ bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)_cupsLangString(cg->lang_default, message), sizeof(output) - 4, cg->lang_default->encoding); bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n", (int)(sizeof(output) - (size_t)bytes), cg->lang_default->encoding); /* * Write the string and return the number of bytes written... */ if (bytes > 0) return ((int)fwrite(output, 1, (size_t)bytes, fp)); else return ((int)bytes); } /* * '_cupsSetLocale()' - Set the current locale and transcode the command-line. */ void _cupsSetLocale(char *argv[]) /* IO - Command-line arguments */ { int i; /* Looping var */ char buffer[8192]; /* Command-line argument buffer */ _cups_globals_t *cg; /* Global data */ #ifdef LC_TIME const char *lc_time; /* Current LC_TIME value */ char new_lc_time[255], /* New LC_TIME value */ *charset; /* Pointer to character set */ #endif /* LC_TIME */ /* * Set the locale so that times, etc. are displayed properly. * * Unfortunately, while we need the localized time value, we *don't* * want to use the localized charset for the time value, so we need * to set LC_TIME to the locale name with .UTF-8 on the end (if * the locale includes a character set specifier...) */ setlocale(LC_ALL, ""); #ifdef LC_TIME if ((lc_time = setlocale(LC_TIME, NULL)) == NULL) lc_time = setlocale(LC_ALL, NULL); if (lc_time) { strlcpy(new_lc_time, lc_time, sizeof(new_lc_time)); if ((charset = strchr(new_lc_time, '.')) == NULL) charset = new_lc_time + strlen(new_lc_time); strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (size_t)(charset - new_lc_time)); } else strlcpy(new_lc_time, "C", sizeof(new_lc_time)); setlocale(LC_TIME, new_lc_time); #endif /* LC_TIME */ /* * Initialize the default language info... */ cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Transcode the command-line arguments from the locale charset to * UTF-8... */ if (cg->lang_default->encoding != CUPS_US_ASCII && cg->lang_default->encoding != CUPS_UTF8) { for (i = 1; argv[i]; i ++) { /* * Try converting from the locale charset to UTF-8... */ if (cupsCharsetToUTF8((cups_utf8_t *)buffer, argv[i], sizeof(buffer), cg->lang_default->encoding) < 0) continue; /* * Save the new string if it differs from the original... */ if (strcmp(buffer, argv[i])) argv[i] = strdup(buffer); } } } cups-2.3.1/cups/testconflicts.c000664 000765 000024 00000005356 13574721672 016612 0ustar00mikestaff000000 000000 /* * PPD constraint test program for CUPS. * * Copyright 2008-2012 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups.h" #include "ppd.h" #include "string-private.h" /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ ppd_file_t *ppd; /* PPD file loaded from disk */ char line[256], /* Input buffer */ *ptr, /* Pointer into buffer */ *optr, /* Pointer to first option name */ *cptr; /* Pointer to first choice */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ char *option, /* Current option */ *choice; /* Current choice */ if (argc != 2) { puts("Usage: testconflicts filename.ppd"); return (1); } if ((ppd = ppdOpenFile(argv[1])) == NULL) { ppd_status_t err; /* Last error in file */ int linenum; /* Line number in file */ err = ppdLastError(&linenum); printf("Unable to open PPD file \"%s\": %s on line %d\n", argv[1], ppdErrorString(err), linenum); return (1); } ppdMarkDefaults(ppd); option = NULL; choice = NULL; for (;;) { num_options = 0; options = NULL; if (!cupsResolveConflicts(ppd, option, choice, &num_options, &options)) puts("Unable to resolve conflicts!"); else if ((!option && num_options > 0) || (option && num_options > 1)) { fputs("Resolved conflicts with the following options:\n ", stdout); for (i = 0; i < num_options; i ++) if (!option || _cups_strcasecmp(option, options[i].name)) printf(" %s=%s", options[i].name, options[i].value); putchar('\n'); cupsFreeOptions(num_options, options); } if (option) { free(option); option = NULL; } if (choice) { free(choice); choice = NULL; } printf("\nNew Option(s): "); fflush(stdout); if (!fgets(line, sizeof(line), stdin) || line[0] == '\n') break; for (ptr = line; isspace(*ptr & 255); ptr ++); for (optr = ptr; *ptr && *ptr != '='; ptr ++); if (!*ptr) break; for (*ptr++ = '\0', cptr = ptr; *ptr && !isspace(*ptr & 255); ptr ++); if (!*ptr) break; *ptr++ = '\0'; option = strdup(optr); choice = strdup(cptr); num_options = cupsParseOptions(ptr, 0, &options); ppdMarkOption(ppd, option, choice); if (cupsMarkOptions(ppd, num_options, options)) puts("Options Conflict!"); cupsFreeOptions(num_options, options); } if (option) free(option); if (choice) free(choice); return (0); } cups-2.3.1/cups/ppd-attr.c000664 000765 000024 00000014471 13574721672 015457 0ustar00mikestaff000000 000000 /* * PPD model-specific attribute routines for CUPS. * * Copyright 2007-2015 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * 'ppdFindAttr()' - Find the first matching attribute. * * @since CUPS 1.1.19/macOS 10.3@ */ ppd_attr_t * /* O - Attribute or @code NULL@ if not found */ ppdFindAttr(ppd_file_t *ppd, /* I - PPD file data */ const char *name, /* I - Attribute name */ const char *spec) /* I - Specifier string or @code NULL@ */ { ppd_attr_t key, /* Search key */ *attr; /* Current attribute */ DEBUG_printf(("2ppdFindAttr(ppd=%p, name=\"%s\", spec=\"%s\")", ppd, name, spec)); /* * Range check input... */ if (!ppd || !name || ppd->num_attrs == 0) return (NULL); /* * Search for a matching attribute... */ memset(&key, 0, sizeof(key)); strlcpy(key.name, name, sizeof(key.name)); /* * Return the first matching attribute, if any... */ if ((attr = (ppd_attr_t *)cupsArrayFind(ppd->sorted_attrs, &key)) != NULL) { if (spec) { /* * Loop until we find the first matching attribute for "spec"... */ while (attr && _cups_strcasecmp(spec, attr->spec)) { if ((attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) != NULL && _cups_strcasecmp(attr->name, name)) attr = NULL; } } } return (attr); } /* * 'ppdFindNextAttr()' - Find the next matching attribute. * * @since CUPS 1.1.19/macOS 10.3@ */ ppd_attr_t * /* O - Attribute or @code NULL@ if not found */ ppdFindNextAttr(ppd_file_t *ppd, /* I - PPD file data */ const char *name, /* I - Attribute name */ const char *spec) /* I - Specifier string or @code NULL@ */ { ppd_attr_t *attr; /* Current attribute */ /* * Range check input... */ if (!ppd || !name || ppd->num_attrs == 0) return (NULL); /* * See if there are more attributes to return... */ while ((attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) != NULL) { /* * Check the next attribute to see if it is a match... */ if (_cups_strcasecmp(attr->name, name)) { /* * Nope, reset the current pointer to the end of the array... */ cupsArrayIndex(ppd->sorted_attrs, cupsArrayCount(ppd->sorted_attrs)); return (NULL); } if (!spec || !_cups_strcasecmp(attr->spec, spec)) break; } /* * Return the next attribute's value... */ return (attr); } /* * '_ppdNormalizeMakeAndModel()' - Normalize a product/make-and-model string. * * This function tries to undo the mistakes made by many printer manufacturers * to produce a clean make-and-model string we can use. */ char * /* O - Normalized make-and-model string or NULL on error */ _ppdNormalizeMakeAndModel( const char *make_and_model, /* I - Original make-and-model string */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of string buffer */ { char *bufptr; /* Pointer into buffer */ if (!make_and_model || !buffer || bufsize < 1) { if (buffer) *buffer = '\0'; return (NULL); } /* * Skip leading whitespace... */ while (_cups_isspace(*make_and_model)) make_and_model ++; /* * Remove parenthesis and add manufacturers as needed... */ if (make_and_model[0] == '(') { strlcpy(buffer, make_and_model + 1, bufsize); if ((bufptr = strrchr(buffer, ')')) != NULL) *bufptr = '\0'; } else if (!_cups_strncasecmp(make_and_model, "XPrint", 6)) { /* * Xerox XPrint... */ snprintf(buffer, bufsize, "Xerox %s", make_and_model); } else if (!_cups_strncasecmp(make_and_model, "Eastman", 7)) { /* * Kodak... */ snprintf(buffer, bufsize, "Kodak %s", make_and_model + 7); } else if (!_cups_strncasecmp(make_and_model, "laserwriter", 11)) { /* * Apple LaserWriter... */ snprintf(buffer, bufsize, "Apple LaserWriter%s", make_and_model + 11); } else if (!_cups_strncasecmp(make_and_model, "colorpoint", 10)) { /* * Seiko... */ snprintf(buffer, bufsize, "Seiko %s", make_and_model); } else if (!_cups_strncasecmp(make_and_model, "fiery", 5)) { /* * EFI... */ snprintf(buffer, bufsize, "EFI %s", make_and_model); } else if (!_cups_strncasecmp(make_and_model, "ps ", 3) || !_cups_strncasecmp(make_and_model, "colorpass", 9)) { /* * Canon... */ snprintf(buffer, bufsize, "Canon %s", make_and_model); } else if (!_cups_strncasecmp(make_and_model, "designjet", 9) || !_cups_strncasecmp(make_and_model, "deskjet", 7)) { /* * HP... */ snprintf(buffer, bufsize, "HP %s", make_and_model); } else strlcpy(buffer, make_and_model, bufsize); /* * Clean up the make... */ if (!_cups_strncasecmp(buffer, "agfa", 4)) { /* * Replace with AGFA (all uppercase)... */ buffer[0] = 'A'; buffer[1] = 'G'; buffer[2] = 'F'; buffer[3] = 'A'; } else if (!_cups_strncasecmp(buffer, "Hewlett-Packard hp ", 19)) { /* * Just put "HP" on the front... */ buffer[0] = 'H'; buffer[1] = 'P'; _cups_strcpy(buffer + 2, buffer + 18); } else if (!_cups_strncasecmp(buffer, "Hewlett-Packard ", 16)) { /* * Just put "HP" on the front... */ buffer[0] = 'H'; buffer[1] = 'P'; _cups_strcpy(buffer + 2, buffer + 15); } else if (!_cups_strncasecmp(buffer, "Lexmark International", 21)) { /* * Strip "International"... */ _cups_strcpy(buffer + 8, buffer + 21); } else if (!_cups_strncasecmp(buffer, "herk", 4)) { /* * Replace with LHAG... */ buffer[0] = 'L'; buffer[1] = 'H'; buffer[2] = 'A'; buffer[3] = 'G'; } else if (!_cups_strncasecmp(buffer, "linotype", 8)) { /* * Replace with LHAG... */ buffer[0] = 'L'; buffer[1] = 'H'; buffer[2] = 'A'; buffer[3] = 'G'; _cups_strcpy(buffer + 4, buffer + 8); } /* * Remove trailing whitespace and return... */ for (bufptr = buffer + strlen(buffer) - 1; bufptr >= buffer && _cups_isspace(*bufptr); bufptr --); bufptr[1] = '\0'; return (buffer[0] ? buffer : NULL); } cups-2.3.1/cups/snprintf.c000664 000765 000024 00000015525 13574721672 015570 0ustar00mikestaff000000 000000 /* * snprintf functions for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include "string-private.h" #ifndef HAVE_VSNPRINTF /* * '_cups_vsnprintf()' - Format a string into a fixed size buffer. */ int /* O - Number of bytes formatted */ _cups_vsnprintf(char *buffer, /* O - Output buffer */ size_t bufsize, /* O - Size of output buffer */ const char *format, /* I - printf-style format string */ va_list ap) /* I - Pointer to additional arguments */ { char *bufptr, /* Pointer to position in buffer */ *bufend, /* Pointer to end of buffer */ sign, /* Sign of format width */ size, /* Size character (h, l, L) */ type; /* Format type character */ int width, /* Width of field */ prec; /* Number of characters of precision */ char tformat[100], /* Temporary format string for sprintf() */ *tptr, /* Pointer into temporary format */ temp[1024]; /* Buffer for formatted numbers */ size_t templen; /* Length of "temp" */ char *s; /* Pointer to string */ int slen; /* Length of string */ int bytes; /* Total number of bytes needed */ /* * Loop through the format string, formatting as needed... */ bufptr = buffer; bufend = buffer + bufsize - 1; bytes = 0; while (*format) { if (*format == '%') { tptr = tformat; *tptr++ = *format++; if (*format == '%') { if (bufptr && bufptr < bufend) *bufptr++ = *format; bytes ++; format ++; continue; } else if (strchr(" -+#\'", *format)) { *tptr++ = *format; sign = *format++; } else sign = 0; if (*format == '*') { /* * Get width from argument... */ format ++; width = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); tptr += strlen(tptr); } else { width = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; width = width * 10 + *format++ - '0'; } } if (*format == '.') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; format ++; if (*format == '*') { /* * Get precision from argument... */ format ++; prec = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); tptr += strlen(tptr); } else { prec = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; prec = prec * 10 + *format++ - '0'; } } } else prec = -1; if (*format == 'l' && format[1] == 'l') { size = 'L'; if (tptr < (tformat + sizeof(tformat) - 2)) { *tptr++ = 'l'; *tptr++ = 'l'; } format += 2; } else if (*format == 'h' || *format == 'l' || *format == 'L') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; size = *format++; } if (!*format) break; if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; type = *format++; *tptr = '\0'; switch (type) { case 'E' : /* Floating point formats */ case 'G' : case 'e' : case 'f' : case 'g' : if ((width + 2) > sizeof(temp)) break; sprintf(temp, tformat, va_arg(ap, double)); templen = strlen(temp); bytes += (int)templen; if (bufptr) { if ((bufptr + templen) > bufend) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr = bufend; } else { memcpy(bufptr, temp, templen + 1); bufptr += templen; } } break; case 'B' : /* Integer formats */ case 'X' : case 'b' : case 'd' : case 'i' : case 'o' : case 'u' : case 'x' : if ((width + 2) > sizeof(temp)) break; sprintf(temp, tformat, va_arg(ap, int)); templen = strlen(temp); bytes += (int)templen; if (bufptr) { if ((bufptr + templen) > bufend) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr = bufend; } else { memcpy(bufptr, temp, templen + 1); bufptr += templen; } } break; case 'p' : /* Pointer value */ if ((width + 2) > sizeof(temp)) break; sprintf(temp, tformat, va_arg(ap, void *)); templen = strlen(temp); bytes += (int)templen; if (bufptr) { if ((bufptr + templen) > bufend) { strlcpy(bufptr, temp, (size_t)(bufend - bufptr)); bufptr = bufend; } else { memcpy(bufptr, temp, templen + 1); bufptr += templen; } } break; case 'c' : /* Character or character array */ bytes += width; if (bufptr) { if (width <= 1) *bufptr++ = va_arg(ap, int); else { if ((bufptr + width) > bufend) width = (int)(bufend - bufptr); memcpy(bufptr, va_arg(ap, char *), (size_t)width); bufptr += width; } } break; case 's' : /* String */ if ((s = va_arg(ap, char *)) == NULL) s = "(null)"; slen = (int)strlen(s); if (slen > width && prec != width) width = slen; bytes += width; if (bufptr) { if ((bufptr + width) > bufend) width = (int)(bufend - bufptr); if (slen > width) slen = width; if (sign == '-') { memcpy(bufptr, s, (size_t)slen); memset(bufptr + slen, ' ', (size_t)(width - slen)); } else { memset(bufptr, ' ', (size_t)(width - slen)); memcpy(bufptr + width - slen, s, (size_t)slen); } bufptr += width; } break; case 'n' : /* Output number of chars so far */ *(va_arg(ap, int *)) = bytes; break; } } else { bytes ++; if (bufptr && bufptr < bufend) *bufptr++ = *format; format ++; } } /* * Nul-terminate the string and return the number of characters needed. */ *bufptr = '\0'; return (bytes); } #endif /* !HAVE_VSNPRINT */ #ifndef HAVE_SNPRINTF /* * '_cups_snprintf()' - Format a string into a fixed size buffer. */ int /* O - Number of bytes formatted */ _cups_snprintf(char *buffer, /* O - Output buffer */ size_t bufsize, /* O - Size of output buffer */ const char *format, /* I - printf-style format string */ ...) /* I - Additional arguments as needed */ { int bytes; /* Number of bytes formatted */ va_list ap; /* Pointer to additional arguments */ va_start(ap, format); bytes = vsnprintf(buffer, bufsize, format, ap); va_end(ap); return (bytes); } #endif /* !HAVE_SNPRINTF */ cups-2.3.1/cups/tls-gnutls.c000664 000765 000024 00000133033 13574721672 016034 0ustar00mikestaff000000 000000 /* * TLS support code for CUPS using GNU TLS. * * 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.c ****/ /* * Include necessary headers... */ #include /* * Local globals... */ static int tls_auto_create = 0; /* Auto-create self-signed certs? */ static char *tls_common_name = NULL; /* Default common name */ static gnutls_x509_crl_t tls_crl = NULL;/* Certificate revocation list */ static char *tls_keypath = NULL; /* Server cert keychain path */ static _cups_mutex_t tls_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex for keychain/certs */ static int tls_options = -1,/* Options for TLS connections */ tls_min_version = _HTTP_TLS_1_0, tls_max_version = _HTTP_TLS_MAX; /* * Local functions... */ static gnutls_x509_crt_t http_gnutls_create_credential(http_credential_t *credential); static const char *http_gnutls_default_path(char *buffer, size_t bufsize); static void http_gnutls_load_crl(void); static const char *http_gnutls_make_path(char *buffer, size_t bufsize, const char *dirname, const char *filename, const char *ext); static ssize_t http_gnutls_read(gnutls_transport_ptr_t ptr, void *data, size_t length); static ssize_t http_gnutls_write(gnutls_transport_ptr_t ptr, const void *data, size_t length); /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsMakeServerCredentials( const char *path, /* I - Path to keychain/directory */ const char *common_name, /* I - Common name */ int num_alt_names, /* I - Number of subject alternate names */ const char **alt_names, /* I - Subject Alternate Names */ time_t expiration_date) /* I - Expiration date */ { gnutls_x509_crt_t crt; /* Self-signed certificate */ gnutls_x509_privkey_t key; /* Encryption private key */ char temp[1024], /* Temporary directory name */ crtfile[1024], /* Certificate filename */ keyfile[1024]; /* Private key filename */ cups_lang_t *language; /* Default language info */ cups_file_t *fp; /* Key/cert file */ unsigned char buffer[8192]; /* Buffer for x509 data */ size_t bytes; /* Number of bytes of data */ unsigned char serial[4]; /* Serial number buffer */ time_t curtime; /* Current time */ int result; /* Result of GNU TLS calls */ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date)); /* * Filenames... */ if (!path) path = http_gnutls_default_path(temp, sizeof(temp)); if (!path || !common_name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } http_gnutls_make_path(crtfile, sizeof(crtfile), path, common_name, "crt"); http_gnutls_make_path(keyfile, sizeof(keyfile), path, common_name, "key"); /* * Create the encryption key... */ DEBUG_puts("1cupsMakeServerCredentials: Creating key pair."); gnutls_x509_privkey_init(&key); gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0); DEBUG_puts("1cupsMakeServerCredentials: Key pair created."); /* * Save it... */ bytes = sizeof(buffer); if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, buffer, &bytes)) < 0) { DEBUG_printf(("1cupsMakeServerCredentials: Unable to export private key: %s", gnutls_strerror(result))); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(result), 0); gnutls_x509_privkey_deinit(key); return (0); } else if ((fp = cupsFileOpen(keyfile, "w")) != NULL) { DEBUG_printf(("1cupsMakeServerCredentials: Writing private key to \"%s\".", keyfile)); cupsFileWrite(fp, (char *)buffer, bytes); cupsFileClose(fp); } else { DEBUG_printf(("1cupsMakeServerCredentials: Unable to create private key file \"%s\": %s", keyfile, strerror(errno))); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); gnutls_x509_privkey_deinit(key); return (0); } /* * Create the self-signed certificate... */ DEBUG_puts("1cupsMakeServerCredentials: Generating self-signed X.509 certificate."); language = cupsLangDefault(); curtime = time(NULL); serial[0] = curtime >> 24; serial[1] = curtime >> 16; serial[2] = curtime >> 8; serial[3] = curtime; gnutls_x509_crt_init(&crt); if (strlen(language->language) == 5) gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0, language->language + 3, 2); else gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0, "US", 2); gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COMMON_NAME, 0, common_name, strlen(common_name)); gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, common_name, strlen(common_name)); gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME, 0, "Unknown", 7); gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0, "Unknown", 7); gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_LOCALITY_NAME, 0, "Unknown", 7); /* gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_PKCS9_EMAIL, 0, ServerAdmin, strlen(ServerAdmin));*/ gnutls_x509_crt_set_key(crt, key); gnutls_x509_crt_set_serial(crt, serial, sizeof(serial)); gnutls_x509_crt_set_activation_time(crt, curtime); gnutls_x509_crt_set_expiration_time(crt, curtime + 10 * 365 * 86400); gnutls_x509_crt_set_ca_status(crt, 0); gnutls_x509_crt_set_subject_alt_name(crt, GNUTLS_SAN_DNSNAME, common_name, (unsigned)strlen(common_name), GNUTLS_FSAN_SET); if (!strchr(common_name, '.')) { /* * Add common_name.local to the list, too... */ char localname[256]; /* hostname.local */ snprintf(localname, sizeof(localname), "%s.local", common_name); gnutls_x509_crt_set_subject_alt_name(crt, GNUTLS_SAN_DNSNAME, localname, (unsigned)strlen(localname), GNUTLS_FSAN_APPEND); } gnutls_x509_crt_set_subject_alt_name(crt, GNUTLS_SAN_DNSNAME, "localhost", 9, GNUTLS_FSAN_APPEND); if (num_alt_names > 0) { int i; /* Looping var */ for (i = 0; i < num_alt_names; i ++) { if (strcmp(alt_names[i], "localhost")) { gnutls_x509_crt_set_subject_alt_name(crt, GNUTLS_SAN_DNSNAME, alt_names[i], (unsigned)strlen(alt_names[i]), GNUTLS_FSAN_APPEND); } } } gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0); gnutls_x509_crt_set_key_usage(crt, GNUTLS_KEY_DIGITAL_SIGNATURE | GNUTLS_KEY_KEY_ENCIPHERMENT); gnutls_x509_crt_set_version(crt, 3); bytes = sizeof(buffer); if (gnutls_x509_crt_get_key_id(crt, 0, buffer, &bytes) >= 0) gnutls_x509_crt_set_subject_key_id(crt, buffer, bytes); gnutls_x509_crt_sign(crt, crt, key); /* * Save it... */ bytes = sizeof(buffer); if ((result = gnutls_x509_crt_export(crt, GNUTLS_X509_FMT_PEM, buffer, &bytes)) < 0) { DEBUG_printf(("1cupsMakeServerCredentials: Unable to export public key and X.509 certificate: %s", gnutls_strerror(result))); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(result), 0); gnutls_x509_crt_deinit(crt); gnutls_x509_privkey_deinit(key); return (0); } else if ((fp = cupsFileOpen(crtfile, "w")) != NULL) { DEBUG_printf(("1cupsMakeServerCredentials: Writing public key and X.509 certificate to \"%s\".", crtfile)); cupsFileWrite(fp, (char *)buffer, bytes); cupsFileClose(fp); } else { DEBUG_printf(("1cupsMakeServerCredentials: Unable to create public key and X.509 certificate file \"%s\": %s", crtfile, strerror(errno))); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); gnutls_x509_crt_deinit(crt); gnutls_x509_privkey_deinit(key); return (0); } /* * Cleanup... */ gnutls_x509_crt_deinit(crt); gnutls_x509_privkey_deinit(key); DEBUG_puts("1cupsMakeServerCredentials: Successfully created credentials."); return (1); } /* * 'cupsSetServerCredentials()' - Set the default server credentials. * * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsSetServerCredentials( const char *path, /* I - Path to keychain/directory */ const char *common_name, /* I - Default common name for server */ int auto_create) /* I - 1 = automatically create self-signed certificates */ { char temp[1024]; /* Default path buffer */ DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create)); /* * Use defaults as needed... */ if (!path) path = http_gnutls_default_path(temp, sizeof(temp)); /* * Range check input... */ if (!path || !common_name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } _cupsMutexLock(&tls_mutex); /* * Free old values... */ if (tls_keypath) _cupsStrFree(tls_keypath); if (tls_common_name) _cupsStrFree(tls_common_name); /* * Save the new values... */ tls_keypath = _cupsStrAlloc(path); tls_auto_create = auto_create; tls_common_name = _cupsStrAlloc(common_name); _cupsMutexUnlock(&tls_mutex); return (1); } /* * 'httpCopyCredentials()' - Copy the credentials associated with the peer in * an encrypted connection. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - Status of call (0 = success) */ httpCopyCredentials( http_t *http, /* I - Connection to server */ cups_array_t **credentials) /* O - Array of credentials */ { unsigned count; /* Number of certificates */ const gnutls_datum_t *certs; /* Certificates */ DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", http, credentials)); if (credentials) *credentials = NULL; if (!http || !http->tls || !credentials) return (-1); *credentials = cupsArrayNew(NULL, NULL); certs = gnutls_certificate_get_peers(http->tls, &count); DEBUG_printf(("1httpCopyCredentials: certs=%p, count=%u", certs, count)); if (certs && count) { while (count > 0) { httpAddCredential(*credentials, certs->data, certs->size); certs ++; count --; } } return (0); } /* * '_httpCreateCredentials()' - Create credentials in the internal format. */ http_tls_credentials_t /* O - Internal credentials */ _httpCreateCredentials( cups_array_t *credentials) /* I - Array of credentials */ { (void)credentials; return (NULL); } /* * '_httpFreeCredentials()' - Free internal credentials. */ void _httpFreeCredentials( http_tls_credentials_t credentials) /* I - Internal credentials */ { (void)credentials; } /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if valid, 0 otherwise */ httpCredentialsAreValidForName( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Name to check */ { gnutls_x509_crt_t cert; /* Certificate */ int result = 0; /* Result */ cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials)); if (cert) { result = gnutls_x509_crt_check_hostname(cert, common_name) != 0; if (result) { gnutls_x509_crl_iter_t iter = NULL; /* Iterator */ unsigned char cserial[1024], /* Certificate serial number */ rserial[1024]; /* Revoked serial number */ size_t cserial_size, /* Size of cert serial number */ rserial_size; /* Size of revoked serial number */ _cupsMutexLock(&tls_mutex); if (gnutls_x509_crl_get_crt_count(tls_crl) > 0) { cserial_size = sizeof(cserial); gnutls_x509_crt_get_serial(cert, cserial, &cserial_size); rserial_size = sizeof(rserial); while (!gnutls_x509_crl_iter_crt_serial(tls_crl, &iter, rserial, &rserial_size, NULL)) { if (cserial_size == rserial_size && !memcmp(cserial, rserial, rserial_size)) { result = 0; break; } rserial_size = sizeof(rserial); } gnutls_x509_crl_iter_deinit(iter); } _cupsMutexUnlock(&tls_mutex); } gnutls_x509_crt_deinit(cert); } return (result); } /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * * @since CUPS 2.0/OS 10.10@ */ http_trust_t /* O - Level of trust */ httpCredentialsGetTrust( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for trust lookup */ { http_trust_t trust = HTTP_TRUST_OK; /* Trusted? */ gnutls_x509_crt_t cert; /* Certificate */ cups_array_t *tcreds = NULL; /* Trusted credentials */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */ if (!common_name) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No common name specified."), 1); return (HTTP_TRUST_UNKNOWN); } if ((cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create credentials from array."), 1); return (HTTP_TRUST_UNKNOWN); } if (cg->any_root < 0) { _cupsSetDefaults(); http_gnutls_load_crl(); } /* * Look this common name up in the default keychains... */ httpLoadCredentials(NULL, &tcreds, common_name); if (tcreds) { char credentials_str[1024], /* String for incoming credentials */ tcreds_str[1024]; /* String for saved credentials */ httpCredentialsString(credentials, credentials_str, sizeof(credentials_str)); httpCredentialsString(tcreds, tcreds_str, sizeof(tcreds_str)); if (strcmp(credentials_str, tcreds_str)) { /* * Credentials don't match, let's look at the expiration date of the new * credentials and allow if the new ones have a later expiration... */ if (!cg->trust_first) { /* * Do not trust certificates on first use... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Trust on first use is disabled."), 1); trust = HTTP_TRUST_INVALID; } else if (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds)) { /* * The new credentials are not newly issued... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("New credentials are older than stored credentials."), 1); trust = HTTP_TRUST_INVALID; } else if (!httpCredentialsAreValidForName(credentials, common_name)) { /* * The common name does not match the issued certificate... */ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("New credentials are not valid for name."), 1); trust = HTTP_TRUST_INVALID; } else if (httpCredentialsGetExpiration(tcreds) < time(NULL)) { /* * Save the renewed credentials... */ trust = HTTP_TRUST_RENEWED; httpSaveCredentials(NULL, credentials, common_name); } } httpFreeCredentials(tcreds); } else if (cg->validate_certs && !httpCredentialsAreValidForName(credentials, common_name)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No stored credentials, not valid for name."), 1); trust = HTTP_TRUST_INVALID; } else if (!cg->trust_first) { /* * See if we have a site CA certificate we can compare... */ if (!httpLoadCredentials(NULL, &tcreds, "site")) { if (cupsArrayCount(credentials) != (cupsArrayCount(tcreds) + 1)) { /* * Certificate isn't directly generated from the CA cert... */ trust = HTTP_TRUST_INVALID; } else { /* * Do a tail comparison of the two certificates... */ http_credential_t *a, *b; /* Certificates */ for (a = (http_credential_t *)cupsArrayFirst(tcreds), b = (http_credential_t *)cupsArrayIndex(credentials, 1); a && b; a = (http_credential_t *)cupsArrayNext(tcreds), b = (http_credential_t *)cupsArrayNext(credentials)) if (a->datalen != b->datalen || memcmp(a->data, b->data, a->datalen)) break; if (a || b) trust = HTTP_TRUST_INVALID; } if (trust != HTTP_TRUST_OK) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Credentials do not validate against site CA certificate."), 1); } else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Trust on first use is disabled."), 1); trust = HTTP_TRUST_INVALID; } } if (trust == HTTP_TRUST_OK && !cg->expired_certs) { time_t curtime; /* Current date/time */ time(&curtime); if (curtime < gnutls_x509_crt_get_activation_time(cert) || curtime > gnutls_x509_crt_get_expiration_time(cert)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Credentials have expired."), 1); trust = HTTP_TRUST_EXPIRED; } } if (trust == HTTP_TRUST_OK && !cg->any_root && cupsArrayCount(credentials) == 1) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Self-signed credentials are blocked."), 1); trust = HTTP_TRUST_INVALID; } gnutls_x509_crt_deinit(cert); return (trust); } /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Expiration date of credentials */ httpCredentialsGetExpiration( cups_array_t *credentials) /* I - Credentials */ { gnutls_x509_crt_t cert; /* Certificate */ time_t result = 0; /* Result */ cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials)); if (cert) { result = gnutls_x509_crt_get_expiration_time(cert); gnutls_x509_crt_deinit(cert); } return (result); } /* * 'httpCredentialsString()' - Return a string representing the credentials. * * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Total size of credentials string */ httpCredentialsString( cups_array_t *credentials, /* I - Credentials */ char *buffer, /* I - Buffer or @code NULL@ */ size_t bufsize) /* I - Size of buffer */ { http_credential_t *first; /* First certificate */ gnutls_x509_crt_t cert; /* Certificate */ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize)); if (!buffer) return (0); if (buffer && bufsize > 0) *buffer = '\0'; if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL && (cert = http_gnutls_create_credential(first)) != NULL) { char name[256], /* Common name associated with cert */ issuer[256]; /* Issuer associated with cert */ size_t len; /* Length of string */ time_t expiration; /* Expiration date of cert */ int sigalg; /* Signature algorithm */ unsigned char md5_digest[16]; /* MD5 result */ len = sizeof(name) - 1; if (gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, name, &len) >= 0) name[len] = '\0'; else strlcpy(name, "unknown", sizeof(name)); len = sizeof(issuer) - 1; if (gnutls_x509_crt_get_issuer_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, issuer, &len) >= 0) issuer[len] = '\0'; else strlcpy(issuer, "unknown", sizeof(issuer)); expiration = gnutls_x509_crt_get_expiration_time(cert); sigalg = gnutls_x509_crt_get_signature_algorithm(cert); cupsHashData("md5", first->data, first->datalen, md5_digest, sizeof(md5_digest)); snprintf(buffer, bufsize, "%s (issued by %s) / %s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", name, issuer, httpGetDateString(expiration), gnutls_sign_get_name((gnutls_sign_algorithm_t)sigalg), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]); gnutls_x509_crt_deinit(cert); } DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer)); return (strlen(buffer)); } /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ httpLoadCredentials( const char *path, /* I - Keychain/PKCS#12 path */ cups_array_t **credentials, /* IO - Credentials */ const char *common_name) /* I - Common name for credentials */ { cups_file_t *fp; /* Certificate file */ char filename[1024], /* filename.crt */ temp[1024], /* Temporary string */ line[256]; /* Base64-encoded line */ unsigned char *data = NULL; /* Buffer for cert data */ size_t alloc_data = 0, /* Bytes allocated */ num_data = 0; /* Bytes used */ int decoded; /* Bytes decoded */ int in_certificate = 0; /* In a certificate? */ if (!credentials || !common_name) return (-1); if (!path) path = http_gnutls_default_path(temp, sizeof(temp)); if (!path) return (-1); http_gnutls_make_path(filename, sizeof(filename), path, common_name, "crt"); if ((fp = cupsFileOpen(filename, "r")) == NULL) return (-1); while (cupsFileGets(fp, line, sizeof(line))) { if (!strcmp(line, "-----BEGIN CERTIFICATE-----")) { if (in_certificate) { /* * Missing END CERTIFICATE... */ httpFreeCredentials(*credentials); *credentials = NULL; break; } in_certificate = 1; } else if (!strcmp(line, "-----END CERTIFICATE-----")) { if (!in_certificate || !num_data) { /* * Missing data... */ httpFreeCredentials(*credentials); *credentials = NULL; break; } if (!*credentials) *credentials = cupsArrayNew(NULL, NULL); if (httpAddCredential(*credentials, data, num_data)) { httpFreeCredentials(*credentials); *credentials = NULL; break; } num_data = 0; in_certificate = 0; } else if (in_certificate) { if (alloc_data == 0) { data = malloc(2048); alloc_data = 2048; if (!data) break; } else if ((num_data + strlen(line)) >= alloc_data) { unsigned char *tdata = realloc(data, alloc_data + 1024); /* Expanded buffer */ if (!tdata) { httpFreeCredentials(*credentials); *credentials = NULL; break; } data = tdata; alloc_data += 1024; } decoded = alloc_data - num_data; httpDecode64_2((char *)data + num_data, &decoded, line); num_data += (size_t)decoded; } } cupsFileClose(fp); if (in_certificate) { /* * Missing END CERTIFICATE... */ httpFreeCredentials(*credentials); *credentials = NULL; } if (data) free(data); return (*credentials ? 0 : -1); } /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ httpSaveCredentials( const char *path, /* I - Keychain/PKCS#12 path */ cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for credentials */ { cups_file_t *fp; /* Certificate file */ char filename[1024], /* filename.crt */ nfilename[1024],/* filename.crt.N */ temp[1024], /* Temporary string */ line[256]; /* Base64-encoded line */ const unsigned char *ptr; /* Pointer into certificate */ ssize_t remaining; /* Bytes left */ http_credential_t *cred; /* Current credential */ if (!credentials || !common_name) return (-1); if (!path) path = http_gnutls_default_path(temp, sizeof(temp)); if (!path) return (-1); http_gnutls_make_path(filename, sizeof(filename), path, common_name, "crt"); snprintf(nfilename, sizeof(nfilename), "%s.N", filename); if ((fp = cupsFileOpen(nfilename, "w")) == NULL) return (-1); fchmod(cupsFileNumber(fp), 0600); for (cred = (http_credential_t *)cupsArrayFirst(credentials); cred; cred = (http_credential_t *)cupsArrayNext(credentials)) { cupsFilePuts(fp, "-----BEGIN CERTIFICATE-----\n"); for (ptr = cred->data, remaining = (ssize_t)cred->datalen; remaining > 0; remaining -= 45, ptr += 45) { httpEncode64_2(line, sizeof(line), (char *)ptr, remaining > 45 ? 45 : remaining); cupsFilePrintf(fp, "%s\n", line); } cupsFilePuts(fp, "-----END CERTIFICATE-----\n"); } cupsFileClose(fp); return (rename(nfilename, filename)); } /* * 'http_gnutls_create_credential()' - Create a single credential in the internal format. */ static gnutls_x509_crt_t /* O - Certificate */ http_gnutls_create_credential( http_credential_t *credential) /* I - Credential */ { int result; /* Result from GNU TLS */ gnutls_x509_crt_t cert; /* Certificate */ gnutls_datum_t datum; /* Data record */ DEBUG_printf(("3http_gnutls_create_credential(credential=%p)", credential)); if (!credential) return (NULL); if ((result = gnutls_x509_crt_init(&cert)) < 0) { DEBUG_printf(("4http_gnutls_create_credential: init error: %s", gnutls_strerror(result))); return (NULL); } datum.data = credential->data; datum.size = credential->datalen; if ((result = gnutls_x509_crt_import(cert, &datum, GNUTLS_X509_FMT_DER)) < 0) { DEBUG_printf(("4http_gnutls_create_credential: import error: %s", gnutls_strerror(result))); gnutls_x509_crt_deinit(cert); return (NULL); } return (cert); } /* * 'http_gnutls_default_path()' - Get the default credential store path. */ static const char * /* O - Path or NULL on error */ http_gnutls_default_path(char *buffer,/* I - Path buffer */ size_t bufsize)/* I - Size of path buffer */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (cg->home) { snprintf(buffer, bufsize, "%s/.cups", cg->home); if (access(buffer, 0)) { DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer)); if (mkdir(buffer, 0700)) { DEBUG_printf(("1http_gnutls_default_path: Failed to make directory: %s", strerror(errno))); return (NULL); } } snprintf(buffer, bufsize, "%s/.cups/ssl", cg->home); if (access(buffer, 0)) { DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer)); if (mkdir(buffer, 0700)) { DEBUG_printf(("1http_gnutls_default_path: Failed to make directory: %s", strerror(errno))); return (NULL); } } } else strlcpy(buffer, CUPS_SERVERROOT "/ssl", bufsize); DEBUG_printf(("1http_gnutls_default_path: Using default path \"%s\".", buffer)); return (buffer); } /* * 'http_gnutls_load_crl()' - Load the certificate revocation list, if any. */ static void http_gnutls_load_crl(void) { _cupsMutexLock(&tls_mutex); if (!gnutls_x509_crl_init(&tls_crl)) { cups_file_t *fp; /* CRL file */ char filename[1024], /* site.crl */ line[256]; /* Base64-encoded line */ unsigned char *data = NULL; /* Buffer for cert data */ size_t alloc_data = 0, /* Bytes allocated */ num_data = 0; /* Bytes used */ int decoded; /* Bytes decoded */ gnutls_datum_t datum; /* Data record */ http_gnutls_make_path(filename, sizeof(filename), CUPS_SERVERROOT, "site", "crl"); if ((fp = cupsFileOpen(filename, "r")) != NULL) { while (cupsFileGets(fp, line, sizeof(line))) { if (!strcmp(line, "-----BEGIN X509 CRL-----")) { if (num_data) { /* * Missing END X509 CRL... */ break; } } else if (!strcmp(line, "-----END X509 CRL-----")) { if (!num_data) { /* * Missing data... */ break; } datum.data = data; datum.size = num_data; gnutls_x509_crl_import(tls_crl, &datum, GNUTLS_X509_FMT_PEM); num_data = 0; } else { if (alloc_data == 0) { data = malloc(2048); alloc_data = 2048; if (!data) break; } else if ((num_data + strlen(line)) >= alloc_data) { unsigned char *tdata = realloc(data, alloc_data + 1024); /* Expanded buffer */ if (!tdata) break; data = tdata; alloc_data += 1024; } decoded = alloc_data - num_data; httpDecode64_2((char *)data + num_data, &decoded, line); num_data += (size_t)decoded; } } cupsFileClose(fp); if (data) free(data); } } _cupsMutexUnlock(&tls_mutex); } /* * 'http_gnutls_make_path()' - Format a filename for a certificate or key file. */ static const char * /* O - Filename */ http_gnutls_make_path( char *buffer, /* I - Filename buffer */ size_t bufsize, /* I - Size of buffer */ const char *dirname, /* I - Directory */ const char *filename, /* I - Filename (usually hostname) */ const char *ext) /* I - Extension */ { char *bufptr, /* Pointer into buffer */ *bufend = buffer + bufsize - 1; /* End of buffer */ snprintf(buffer, bufsize, "%s/", dirname); bufptr = buffer + strlen(buffer); while (*filename && bufptr < bufend) { if (_cups_isalnum(*filename) || *filename == '-' || *filename == '.') *bufptr++ = *filename; else *bufptr++ = '_'; filename ++; } if (bufptr < bufend) *bufptr++ = '.'; strlcpy(bufptr, ext, (size_t)(bufend - bufptr + 1)); return (buffer); } /* * 'http_gnutls_read()' - Read function for the GNU TLS library. */ static ssize_t /* O - Number of bytes read or -1 on error */ http_gnutls_read( gnutls_transport_ptr_t ptr, /* I - Connection to server */ void *data, /* I - Buffer */ size_t length) /* I - Number of bytes to read */ { http_t *http; /* HTTP connection */ ssize_t bytes; /* Bytes read */ DEBUG_printf(("6http_gnutls_read(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); http = (http_t *)ptr; if (!http->blocking || http->timeout_value > 0.0) { /* * Make sure we have data before we read... */ while (!_httpWait(http, http->wait_value, 0)) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; http->error = ETIMEDOUT; return (-1); } } bytes = recv(http->fd, data, length, 0); DEBUG_printf(("6http_gnutls_read: bytes=%d", (int)bytes)); return (bytes); } /* * 'http_gnutls_write()' - Write function for the GNU TLS library. */ static ssize_t /* O - Number of bytes written or -1 on error */ http_gnutls_write( gnutls_transport_ptr_t ptr, /* I - Connection to server */ const void *data, /* I - Data buffer */ size_t length) /* I - Number of bytes to write */ { ssize_t bytes; /* Bytes written */ DEBUG_printf(("6http_gnutls_write(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); bytes = send(((http_t *)ptr)->fd, data, length, 0); DEBUG_printf(("http_gnutls_write: bytes=%d", (int)bytes)); return (bytes); } /* * '_httpTLSInitialize()' - Initialize the TLS stack. */ void _httpTLSInitialize(void) { /* * Initialize GNU TLS... */ gnutls_global_init(); } /* * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes. */ size_t /* O - Bytes available */ _httpTLSPending(http_t *http) /* I - HTTP connection */ { return (gnutls_record_check_pending(http->tls)); } /* * '_httpTLSRead()' - Read from a SSL/TLS connection. */ int /* O - Bytes read */ _httpTLSRead(http_t *http, /* I - Connection to server */ char *buf, /* I - Buffer to store data */ int len) /* I - Length of buffer */ { ssize_t result; /* Return value */ result = gnutls_record_recv(http->tls, buf, (size_t)len); if (result < 0 && !errno) { /* * Convert GNU TLS error to errno value... */ switch (result) { case GNUTLS_E_INTERRUPTED : errno = EINTR; break; case GNUTLS_E_AGAIN : errno = EAGAIN; break; default : errno = EPIPE; break; } result = -1; } return ((int)result); } /* * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options. */ void _httpTLSSetOptions(int options, /* I - Options */ int min_version, /* I - Minimum TLS version */ int max_version) /* I - Maximum TLS version */ { if (!(options & _HTTP_TLS_SET_DEFAULT) || tls_options < 0) { tls_options = options; tls_min_version = min_version; tls_max_version = max_version; } } /* * '_httpTLSStart()' - Set up SSL/TLS support on a connection. */ int /* O - 0 on success, -1 on failure */ _httpTLSStart(http_t *http) /* I - Connection to server */ { char hostname[256], /* Hostname */ *hostptr; /* Pointer into hostname */ int status; /* Status of handshake */ gnutls_certificate_credentials_t *credentials; /* TLS credentials */ char priority_string[2048]; /* Priority string */ int version; /* Current version */ double old_timeout; /* Old timeout value */ http_timeout_cb_t old_cb; /* Old timeout callback */ void *old_data; /* Old timeout data */ static const char * const versions[] =/* SSL/TLS versions */ { "VERS-SSL3.0", "VERS-TLS1.0", "VERS-TLS1.1", "VERS-TLS1.2", "VERS-TLS1.3", "VERS-TLS-ALL" }; DEBUG_printf(("3_httpTLSStart(http=%p)", http)); if (tls_options < 0) { DEBUG_puts("4_httpTLSStart: Setting defaults."); _cupsSetDefaults(); DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options)); } if (http->mode == _HTTP_MODE_SERVER && !tls_keypath) { DEBUG_puts("4_httpTLSStart: cupsSetServerCredentials not called."); http->error = errno = EINVAL; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Server credentials not set."), 1); return (-1); } credentials = (gnutls_certificate_credentials_t *) malloc(sizeof(gnutls_certificate_credentials_t)); if (credentials == NULL) { DEBUG_printf(("8_httpStartTLS: Unable to allocate credentials: %s", strerror(errno))); http->error = errno; http->status = HTTP_STATUS_ERROR; _cupsSetHTTPError(HTTP_STATUS_ERROR); return (-1); } gnutls_certificate_allocate_credentials(credentials); status = gnutls_init(&http->tls, http->mode == _HTTP_MODE_CLIENT ? GNUTLS_CLIENT : GNUTLS_SERVER); if (!status) status = gnutls_set_default_priority(http->tls); if (status) { http->error = EIO; http->status = HTTP_STATUS_ERROR; DEBUG_printf(("4_httpTLSStart: Unable to initialize common TLS parameters: %s", gnutls_strerror(status))); _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0); gnutls_deinit(http->tls); gnutls_certificate_free_credentials(*credentials); free(credentials); http->tls = NULL; return (-1); } if (http->mode == _HTTP_MODE_CLIENT) { /* * Client: get the hostname to use for TLS... */ if (httpAddrLocalhost(http->hostaddr)) { strlcpy(hostname, "localhost", sizeof(hostname)); } else { /* * Otherwise make sure the hostname we have does not end in a trailing dot. */ strlcpy(hostname, http->hostname, sizeof(hostname)); if ((hostptr = hostname + strlen(hostname) - 1) >= hostname && *hostptr == '.') *hostptr = '\0'; } status = gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname, strlen(hostname)); } else { /* * Server: get certificate and private key... */ char crtfile[1024], /* Certificate file */ keyfile[1024]; /* Private key file */ int have_creds = 0; /* Have credentials? */ if (http->fields[HTTP_FIELD_HOST]) { /* * Use hostname for TLS upgrade... */ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname)); } else { /* * Resolve hostname from connection address... */ http_addr_t addr; /* Connection address */ socklen_t addrlen; /* Length of address */ addrlen = sizeof(addr); if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen)) { DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno))); hostname[0] = '\0'; } else if (httpAddrLocalhost(&addr)) hostname[0] = '\0'; else { httpAddrLookup(&addr, hostname, sizeof(hostname)); DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname)); } } if (isdigit(hostname[0] & 255) || hostname[0] == '[') hostname[0] = '\0'; /* Don't allow numeric addresses */ if (hostname[0]) { /* * First look in the CUPS keystore... */ http_gnutls_make_path(crtfile, sizeof(crtfile), tls_keypath, hostname, "crt"); http_gnutls_make_path(keyfile, sizeof(keyfile), tls_keypath, hostname, "key"); if (access(crtfile, R_OK) || access(keyfile, R_OK)) { /* * No CUPS-managed certs, look for CA certs... */ char cacrtfile[1024], cakeyfile[1024]; /* CA cert files */ snprintf(cacrtfile, sizeof(cacrtfile), "/etc/letsencrypt/live/%s/fullchain.pem", hostname); snprintf(cakeyfile, sizeof(cakeyfile), "/etc/letsencrypt/live/%s/privkey.pem", hostname); if ((access(cacrtfile, R_OK) || access(cakeyfile, R_OK)) && (hostptr = strchr(hostname, '.')) != NULL) { /* * Try just domain name... */ hostptr ++; if (strchr(hostptr, '.')) { snprintf(cacrtfile, sizeof(cacrtfile), "/etc/letsencrypt/live/%s/fullchain.pem", hostptr); snprintf(cakeyfile, sizeof(cakeyfile), "/etc/letsencrypt/live/%s/privkey.pem", hostptr); } } if (!access(cacrtfile, R_OK) && !access(cakeyfile, R_OK)) { /* * Use the CA certs... */ strlcpy(crtfile, cacrtfile, sizeof(crtfile)); strlcpy(keyfile, cakeyfile, sizeof(keyfile)); } } have_creds = !access(crtfile, R_OK) && !access(keyfile, R_OK); } else if (tls_common_name) { /* * First look in the CUPS keystore... */ http_gnutls_make_path(crtfile, sizeof(crtfile), tls_keypath, tls_common_name, "crt"); http_gnutls_make_path(keyfile, sizeof(keyfile), tls_keypath, tls_common_name, "key"); if (access(crtfile, R_OK) || access(keyfile, R_OK)) { /* * No CUPS-managed certs, look for CA certs... */ char cacrtfile[1024], cakeyfile[1024]; /* CA cert files */ snprintf(cacrtfile, sizeof(cacrtfile), "/etc/letsencrypt/live/%s/fullchain.pem", tls_common_name); snprintf(cakeyfile, sizeof(cakeyfile), "/etc/letsencrypt/live/%s/privkey.pem", tls_common_name); if ((access(cacrtfile, R_OK) || access(cakeyfile, R_OK)) && (hostptr = strchr(tls_common_name, '.')) != NULL) { /* * Try just domain name... */ hostptr ++; if (strchr(hostptr, '.')) { snprintf(cacrtfile, sizeof(cacrtfile), "/etc/letsencrypt/live/%s/fullchain.pem", hostptr); snprintf(cakeyfile, sizeof(cakeyfile), "/etc/letsencrypt/live/%s/privkey.pem", hostptr); } } if (!access(cacrtfile, R_OK) && !access(cakeyfile, R_OK)) { /* * Use the CA certs... */ strlcpy(crtfile, cacrtfile, sizeof(crtfile)); strlcpy(keyfile, cakeyfile, sizeof(keyfile)); } } have_creds = !access(crtfile, R_OK) && !access(keyfile, R_OK); } if (!have_creds && tls_auto_create && (hostname[0] || tls_common_name)) { DEBUG_printf(("4_httpTLSStart: Auto-create credentials for \"%s\".", hostname[0] ? hostname : tls_common_name)); if (!cupsMakeServerCredentials(tls_keypath, hostname[0] ? hostname : tls_common_name, 0, NULL, time(NULL) + 365 * 86400)) { DEBUG_puts("4_httpTLSStart: cupsMakeServerCredentials failed."); http->error = errno = EINVAL; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create server credentials."), 1); return (-1); } } DEBUG_printf(("4_httpTLSStart: Using certificate \"%s\" and private key \"%s\".", crtfile, keyfile)); if (!status) status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM); } if (!status) status = gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials); if (status) { http->error = EIO; http->status = HTTP_STATUS_ERROR; DEBUG_printf(("4_httpTLSStart: Unable to complete client/server setup: %s", gnutls_strerror(status))); _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0); gnutls_deinit(http->tls); gnutls_certificate_free_credentials(*credentials); free(credentials); http->tls = NULL; return (-1); } strlcpy(priority_string, "NORMAL", sizeof(priority_string)); if (tls_max_version < _HTTP_TLS_MAX) { /* * Require specific TLS versions... */ strlcat(priority_string, ":-VERS-TLS-ALL", sizeof(priority_string)); for (version = tls_min_version; version <= tls_max_version; version ++) { strlcat(priority_string, ":+", sizeof(priority_string)); strlcat(priority_string, versions[version], sizeof(priority_string)); } } else if (tls_min_version == _HTTP_TLS_SSL3) { /* * Allow all versions of TLS and SSL/3.0... */ strlcat(priority_string, ":+VERS-TLS-ALL:+VERS-SSL3.0", sizeof(priority_string)); } else { /* * Require a minimum version... */ strlcat(priority_string, ":+VERS-TLS-ALL", sizeof(priority_string)); for (version = 0; version < tls_min_version; version ++) { strlcat(priority_string, ":-", sizeof(priority_string)); strlcat(priority_string, versions[version], sizeof(priority_string)); } } if (tls_options & _HTTP_TLS_ALLOW_RC4) strlcat(priority_string, ":+ARCFOUR-128", sizeof(priority_string)); else strlcat(priority_string, ":!ARCFOUR-128", sizeof(priority_string)); strlcat(priority_string, ":!ANON-DH", sizeof(priority_string)); if (tls_options & _HTTP_TLS_DENY_CBC) strlcat(priority_string, ":!AES-128-CBC:!AES-256-CBC:!CAMELLIA-128-CBC:!CAMELLIA-256-CBC:!3DES-CBC", sizeof(priority_string)); #ifdef HAVE_GNUTLS_PRIORITY_SET_DIRECT gnutls_priority_set_direct(http->tls, priority_string, NULL); #else gnutls_priority_t priority; /* Priority */ gnutls_priority_init(&priority, priority_string, NULL); gnutls_priority_set(http->tls, priority); gnutls_priority_deinit(priority); #endif /* HAVE_GNUTLS_PRIORITY_SET_DIRECT */ gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr_t)http); gnutls_transport_set_pull_function(http->tls, http_gnutls_read); #ifdef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION gnutls_transport_set_pull_timeout_function(http->tls, (gnutls_pull_timeout_func)httpWait); #endif /* HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */ gnutls_transport_set_push_function(http->tls, http_gnutls_write); /* * Enforce a minimum timeout of 10 seconds for the TLS handshake... */ old_timeout = http->timeout_value; old_cb = http->timeout_cb; old_data = http->timeout_data; if (!old_cb || old_timeout < 10.0) { DEBUG_puts("4_httpTLSStart: Setting timeout to 10 seconds."); httpSetTimeout(http, 10.0, NULL, NULL); } /* * Do the TLS handshake... */ while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS) { DEBUG_printf(("5_httpStartTLS: gnutls_handshake returned %d (%s)", status, gnutls_strerror(status))); if (gnutls_error_is_fatal(status)) { http->error = EIO; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, gnutls_strerror(status), 0); gnutls_deinit(http->tls); gnutls_certificate_free_credentials(*credentials); free(credentials); http->tls = NULL; httpSetTimeout(http, old_timeout, old_cb, old_data); return (-1); } } /* * Restore the previous timeout settings... */ httpSetTimeout(http, old_timeout, old_cb, old_data); http->tls_credentials = credentials; return (0); } /* * '_httpTLSStop()' - Shut down SSL/TLS on a connection. */ void _httpTLSStop(http_t *http) /* I - Connection to server */ { int error; /* Error code */ error = gnutls_bye(http->tls, http->mode == _HTTP_MODE_CLIENT ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR); if (error != GNUTLS_E_SUCCESS) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gnutls_strerror(errno), 0); gnutls_deinit(http->tls); http->tls = NULL; if (http->tls_credentials) { gnutls_certificate_free_credentials(*(http->tls_credentials)); free(http->tls_credentials); http->tls_credentials = NULL; } } /* * '_httpTLSWrite()' - Write to a SSL/TLS connection. */ int /* O - Bytes written */ _httpTLSWrite(http_t *http, /* I - Connection to server */ const char *buf, /* I - Buffer holding data */ int len) /* I - Length of buffer */ { ssize_t result; /* Return value */ DEBUG_printf(("2http_write_ssl(http=%p, buf=%p, len=%d)", http, buf, len)); result = gnutls_record_send(http->tls, buf, (size_t)len); if (result < 0 && !errno) { /* * Convert GNU TLS error to errno value... */ switch (result) { case GNUTLS_E_INTERRUPTED : errno = EINTR; break; case GNUTLS_E_AGAIN : errno = EAGAIN; break; default : errno = EPIPE; break; } result = -1; } DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result)); return ((int)result); } cups-2.3.1/cups/cups-private.h000664 000765 000024 00000023654 13574721672 016356 0ustar00mikestaff000000 000000 /* * Private definitions for CUPS. * * 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. */ #ifndef _CUPS_CUPS_PRIVATE_H_ # define _CUPS_CUPS_PRIVATE_H_ /* * Include necessary headers... */ # include "string-private.h" # include "array-private.h" # include "ipp-private.h" # include "http-private.h" # include "language-private.h" # include "pwg-private.h" # include "thread-private.h" # include # ifdef __APPLE__ # include # include # endif /* __APPLE__ */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Types... */ typedef struct _cups_buffer_s /**** Read/write buffer ****/ { struct _cups_buffer_s *next; /* Next buffer in list */ size_t size; /* Size of buffer */ char used, /* Is this buffer used? */ d[1]; /* Data buffer */ } _cups_buffer_t; typedef struct _cups_raster_error_s /**** Error buffer structure ****/ { char *start, /* Start of buffer */ *current, /* Current position in buffer */ *end; /* End of buffer */ } _cups_raster_error_t; typedef enum _cups_digestoptions_e /**** Digest Options values */ { _CUPS_DIGESTOPTIONS_NONE, /* No Digest authentication options */ _CUPS_DIGESTOPTIONS_DENYMD5 /* Do not use MD5 hashes for digest */ } _cups_digestoptions_t; typedef enum _cups_uatokens_e /**** UserAgentTokens values */ { _CUPS_UATOKENS_NONE, /* Do not send User-Agent */ _CUPS_UATOKENS_PRODUCT_ONLY, /* CUPS IPP */ _CUPS_UATOKENS_MAJOR, /* CUPS/major IPP/2 */ _CUPS_UATOKENS_MINOR, /* CUPS/major.minor IPP/2.1 */ _CUPS_UATOKENS_MINIMAL, /* CUPS/major.minor.patch IPP/2.1 */ _CUPS_UATOKENS_OS, /* CUPS/major.minor.patch (osname osversion) IPP/2.1 */ _CUPS_UATOKENS_FULL /* CUPS/major.minor.patch (osname osversion; architecture) IPP/2.1 */ } _cups_uatokens_t; typedef struct _cups_globals_s /**** CUPS global state data ****/ { /* Multiple places... */ const char *cups_datadir, /* CUPS_DATADIR environment var */ *cups_serverbin,/* CUPS_SERVERBIN environment var */ *cups_serverroot, /* CUPS_SERVERROOT environment var */ *cups_statedir, /* CUPS_STATEDIR environment var */ *home, /* HOME environment var */ *localedir; /* LOCALDIR environment var */ /* adminutil.c */ time_t cupsd_update; /* Last time we got or set cupsd.conf */ char cupsd_hostname[HTTP_MAX_HOST]; /* Hostname for connection */ int cupsd_num_settings; /* Number of server settings */ cups_option_t *cupsd_settings;/* Server settings */ /* auth.c */ # ifdef HAVE_GSSAPI char gss_service_name[32]; /* Kerberos service name */ # endif /* HAVE_GSSAPI */ /* backend.c */ char resolved_uri[1024]; /* Buffer for cupsBackendDeviceURI */ /* debug.c */ # ifdef DEBUG int thread_id; /* Friendly thread ID */ # endif /* DEBUG */ /* file.c */ cups_file_t *stdio_files[3];/* stdin, stdout, stderr */ /* http.c */ char http_date[256]; /* Date+time buffer */ /* http-addr.c */ unsigned ip_addr; /* Packed IPv4 address */ char *ip_ptrs[2]; /* Pointer to packed address */ struct hostent hostent; /* Host entry for IP address */ # ifdef HAVE_GETADDRINFO char hostname[1024]; /* Hostname */ # endif /* HAVE_GETADDRINFO */ int need_res_init; /* Need to reinitialize resolver? */ /* ipp.c */ ipp_uchar_t ipp_date[11]; /* RFC-2579 date/time data */ _cups_buffer_t *cups_buffers; /* Buffer list */ /* ipp-support.c */ int ipp_port; /* IPP port number */ char ipp_unknown[255]; /* Unknown error statuses */ /* language.c */ cups_lang_t *lang_default; /* Default language */ # ifdef __APPLE__ char language[32]; /* Cached language */ # endif /* __APPLE__ */ /* pwg-media.c */ cups_array_t *leg_size_lut, /* Lookup table for legacy names */ *ppd_size_lut, /* Lookup table for PPD names */ *pwg_size_lut; /* Lookup table for PWG names */ pwg_media_t pwg_media; /* PWG media data for custom size */ char pwg_name[65], /* PWG media name for custom size */ ppd_name[41]; /* PPD media name for custom size */ /* raster-error.c */ _cups_raster_error_t raster_error; /* Raster error information */ /* request.c */ http_t *http; /* Current server connection */ ipp_status_t last_error; /* Last IPP error */ char *last_status_message; /* Last IPP status-message */ /* snmp.c */ char snmp_community[255]; /* Default SNMP community name */ int snmp_debug; /* Log SNMP IO to stderr? */ /* tempfile.c */ char tempfile[1024]; /* cupsTempFd/File buffer */ /* usersys.c */ _cups_digestoptions_t digestoptions; /* DigestOptions setting */ _cups_uatokens_t uatokens; /* UserAgentTokens setting */ http_encryption_t encryption; /* Encryption setting */ char user[65], /* User name */ user_agent[256],/* User-Agent string */ server[256], /* Server address */ servername[256],/* Server hostname */ password[128]; /* Password for default callback */ cups_password_cb2_t password_cb; /* Password callback */ void *password_data; /* Password user data */ http_tls_credentials_t tls_credentials; /* Default client credentials */ cups_client_cert_cb_t client_cert_cb; /* Client certificate callback */ void *client_cert_data; /* Client certificate user data */ cups_server_cert_cb_t server_cert_cb; /* Server certificate callback */ void *server_cert_data; /* Server certificate user data */ int server_version, /* Server IPP version */ trust_first, /* Trust on first use? */ any_root, /* Allow any (e.g., self-signed) root */ expired_certs, /* Allow expired certs */ validate_certs; /* Validate certificates */ /* util.c */ char def_printer[256]; /* Default printer */ } _cups_globals_t; typedef struct _cups_media_db_s /* Media database */ { char *color, /* Media color, if any */ *key, /* Media key, if any */ *info, /* Media human-readable name, if any */ *size_name, /* Media PWG size name, if provided */ *source, /* Media source, if any */ *type; /* Media type, if any */ int width, /* Width in hundredths of millimeters */ length, /* Length in hundredths of * millimeters */ bottom, /* Bottom margin in hundredths of * millimeters */ left, /* Left margin in hundredths of * millimeters */ right, /* Right margin in hundredths of * millimeters */ top; /* Top margin in hundredths of * millimeters */ } _cups_media_db_t; typedef struct _cups_dconstres_s /* Constraint/resolver */ { char *name; /* Name of resolver */ ipp_t *collection; /* Collection containing attrs */ } _cups_dconstres_t; struct _cups_dinfo_s /* Destination capability and status * information */ { int version; /* IPP version */ const char *uri; /* Printer URI */ char *resource; /* Resource path */ ipp_t *attrs; /* Printer attributes */ int num_defaults; /* Number of default options */ cups_option_t *defaults; /* Default options */ cups_array_t *constraints; /* Job constraints */ cups_array_t *resolvers; /* Job resolvers */ cups_array_t *localizations; /* Localization information */ cups_array_t *media_db; /* Media database */ _cups_media_db_t min_size, /* Minimum size */ max_size; /* Maximum size */ unsigned cached_flags; /* Flags used for cached media */ cups_array_t *cached_db; /* Cache of media from last index/default */ time_t ready_time; /* When xxx-ready attributes were last queried */ ipp_t *ready_attrs; /* xxx-ready attributes */ cups_array_t *ready_db; /* media[-col]-ready media database */ }; /* * Prototypes... */ # ifdef __APPLE__ extern CFStringRef _cupsAppleCopyDefaultPaperID(void) _CUPS_PRIVATE; extern CFStringRef _cupsAppleCopyDefaultPrinter(void) _CUPS_PRIVATE; extern int _cupsAppleGetUseLastPrinter(void) _CUPS_PRIVATE; extern void _cupsAppleSetDefaultPaperID(CFStringRef name) _CUPS_PRIVATE; extern void _cupsAppleSetDefaultPrinter(CFStringRef name) _CUPS_PRIVATE; extern void _cupsAppleSetUseLastPrinter(int uselast) _CUPS_PRIVATE; # endif /* __APPLE__ */ extern char *_cupsBufferGet(size_t size) _CUPS_PRIVATE; extern void _cupsBufferRelease(char *b) _CUPS_PRIVATE; extern http_t *_cupsConnect(void) _CUPS_PRIVATE; extern char *_cupsCreateDest(const char *name, const char *info, const char *device_id, const char *device_uri, char *uri, size_t urisize) _CUPS_PRIVATE; extern ipp_attribute_t *_cupsEncodeOption(ipp_t *ipp, ipp_tag_t group_tag, _ipp_option_t *map, const char *name, const char *value) _CUPS_PRIVATE; extern int _cupsGet1284Values(const char *device_id, cups_option_t **values) _CUPS_PRIVATE; extern const char *_cupsGetDestResource(cups_dest_t *dest, unsigned flags, char *resource, size_t resourcesize) _CUPS_PRIVATE; extern int _cupsGetDests(http_t *http, ipp_op_t op, const char *name, cups_dest_t **dests, cups_ptype_t type, cups_ptype_t mask) _CUPS_PRIVATE; extern const char *_cupsGetPassword(const char *prompt) _CUPS_PRIVATE; extern void _cupsGlobalLock(void) _CUPS_PRIVATE; extern _cups_globals_t *_cupsGlobals(void) _CUPS_PRIVATE; extern void _cupsGlobalUnlock(void) _CUPS_PRIVATE; # ifdef HAVE_GSSAPI extern const char *_cupsGSSServiceName(void) _CUPS_PRIVATE; # endif /* HAVE_GSSAPI */ extern int _cupsNextDelay(int current, int *previous) _CUPS_PRIVATE; extern void _cupsSetDefaults(void) _CUPS_INTERNAL; extern void _cupsSetError(ipp_status_t status, const char *message, int localize) _CUPS_PRIVATE; extern void _cupsSetHTTPError(http_status_t status) _CUPS_INTERNAL; # ifdef HAVE_GSSAPI extern int _cupsSetNegotiateAuthString(http_t *http, const char *method, const char *resource) _CUPS_PRIVATE; # endif /* HAVE_GSSAPI */ extern char *_cupsUserDefault(char *name, size_t namesize) _CUPS_INTERNAL; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_CUPS_PRIVATE_H_ */ cups-2.3.1/cups/ppd-page.c000664 000765 000024 00000021557 13574721672 015424 0ustar00mikestaff000000 000000 /* * Page size functions for CUPS. * * Copyright 2007-2015 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers... */ #include "string-private.h" #include "debug-internal.h" #include "ppd.h" /* * 'ppdPageSize()' - Get the page size record for the named size. */ ppd_size_t * /* O - Size record for page or NULL */ ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */ const char *name) /* I - Size name */ { int i; /* Looping var */ ppd_size_t *size; /* Current page size */ double w, l; /* Width and length of page */ char *nameptr; /* Pointer into name */ struct lconv *loc; /* Locale data */ ppd_coption_t *coption; /* Custom option for page size */ ppd_cparam_t *cparam; /* Custom option parameter */ DEBUG_printf(("2ppdPageSize(ppd=%p, name=\"%s\")", ppd, name)); if (!ppd) { DEBUG_puts("3ppdPageSize: Bad PPD pointer, returning NULL..."); return (NULL); } if (name) { if (!strncmp(name, "Custom.", 7) && ppd->variable_sizes) { /* * Find the custom page size... */ for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) if (!strcmp("Custom", size->name)) break; if (!i) { DEBUG_puts("3ppdPageSize: No custom sizes, returning NULL..."); return (NULL); } /* * Variable size; size name can be one of the following: * * Custom.WIDTHxLENGTHin - Size in inches * Custom.WIDTHxLENGTHft - Size in feet * Custom.WIDTHxLENGTHcm - Size in centimeters * Custom.WIDTHxLENGTHmm - Size in millimeters * Custom.WIDTHxLENGTHm - Size in meters * Custom.WIDTHxLENGTH[pt] - Size in points */ loc = localeconv(); w = _cupsStrScand(name + 7, &nameptr, loc); if (!nameptr || *nameptr != 'x') return (NULL); l = _cupsStrScand(nameptr + 1, &nameptr, loc); if (!nameptr) return (NULL); if (!_cups_strcasecmp(nameptr, "in")) { w *= 72.0; l *= 72.0; } else if (!_cups_strcasecmp(nameptr, "ft")) { w *= 12.0 * 72.0; l *= 12.0 * 72.0; } else if (!_cups_strcasecmp(nameptr, "mm")) { w *= 72.0 / 25.4; l *= 72.0 / 25.4; } else if (!_cups_strcasecmp(nameptr, "cm")) { w *= 72.0 / 2.54; l *= 72.0 / 2.54; } else if (!_cups_strcasecmp(nameptr, "m")) { w *= 72.0 / 0.0254; l *= 72.0 / 0.0254; } size->width = (float)w; size->length = (float)l; size->left = ppd->custom_margins[0]; size->bottom = ppd->custom_margins[1]; size->right = (float)(w - ppd->custom_margins[2]); size->top = (float)(l - ppd->custom_margins[3]); /* * Update the custom option records for the page size, too... */ if ((coption = ppdFindCustomOption(ppd, "PageSize")) != NULL) { if ((cparam = ppdFindCustomParam(coption, "Width")) != NULL) cparam->current.custom_points = (float)w; if ((cparam = ppdFindCustomParam(coption, "Height")) != NULL) cparam->current.custom_points = (float)l; } /* * Return the page size... */ DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, size->name, size->width, size->length)); return (size); } else { /* * Lookup by name... */ for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) if (!_cups_strcasecmp(name, size->name)) { DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, size->name, size->width, size->length)); return (size); } } } else { /* * Find default... */ for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) if (size->marked) { DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, size->name, size->width, size->length)); return (size); } } DEBUG_puts("3ppdPageSize: Size not found, returning NULL"); return (NULL); } /* * 'ppdPageSizeLimits()' - Return the custom page size limits. * * This function returns the minimum and maximum custom page sizes and printable * areas based on the currently-marked (selected) options. * * If the specified PPD file does not support custom page sizes, both * "minimum" and "maximum" are filled with zeroes. * * @since CUPS 1.4/macOS 10.6@ */ int /* O - 1 if custom sizes are supported, 0 otherwise */ ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */ ppd_size_t *minimum, /* O - Minimum custom size */ ppd_size_t *maximum) /* O - Maximum custom size */ { ppd_choice_t *qualifier2, /* Second media qualifier */ *qualifier3; /* Third media qualifier */ ppd_attr_t *attr; /* Attribute */ float width, /* Min/max width */ length; /* Min/max length */ char spec[PPD_MAX_NAME]; /* Selector for min/max */ /* * Range check input... */ if (!ppd || !ppd->variable_sizes || !minimum || !maximum) { if (minimum) memset(minimum, 0, sizeof(ppd_size_t)); if (maximum) memset(maximum, 0, sizeof(ppd_size_t)); return (0); } /* * See if we have the cupsMediaQualifier2 and cupsMediaQualifier3 attributes... */ cupsArraySave(ppd->sorted_attrs); if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier2", NULL)) != NULL && attr->value) qualifier2 = ppdFindMarkedChoice(ppd, attr->value); else qualifier2 = NULL; if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier3", NULL)) != NULL && attr->value) qualifier3 = ppdFindMarkedChoice(ppd, attr->value); else qualifier3 = NULL; /* * Figure out the current minimum width and length... */ width = ppd->custom_min[0]; length = ppd->custom_min[1]; if (qualifier2) { /* * Try getting cupsMinSize... */ if (qualifier3) { snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice, qualifier3->choice); attr = ppdFindAttr(ppd, "cupsMinSize", spec); } else attr = NULL; if (!attr) { snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice); attr = ppdFindAttr(ppd, "cupsMinSize", spec); } if (!attr && qualifier3) { snprintf(spec, sizeof(spec), "..%s", qualifier3->choice); attr = ppdFindAttr(ppd, "cupsMinSize", spec); } if ((attr && attr->value && sscanf(attr->value, "%f%f", &width, &length) != 2) || !attr) { width = ppd->custom_min[0]; length = ppd->custom_min[1]; } } minimum->width = width; minimum->length = length; minimum->left = ppd->custom_margins[0]; minimum->bottom = ppd->custom_margins[1]; minimum->right = width - ppd->custom_margins[2]; minimum->top = length - ppd->custom_margins[3]; /* * Figure out the current maximum width and length... */ width = ppd->custom_max[0]; length = ppd->custom_max[1]; if (qualifier2) { /* * Try getting cupsMaxSize... */ if (qualifier3) { snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice, qualifier3->choice); attr = ppdFindAttr(ppd, "cupsMaxSize", spec); } else attr = NULL; if (!attr) { snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice); attr = ppdFindAttr(ppd, "cupsMaxSize", spec); } if (!attr && qualifier3) { snprintf(spec, sizeof(spec), "..%s", qualifier3->choice); attr = ppdFindAttr(ppd, "cupsMaxSize", spec); } if (!attr || (attr->value && sscanf(attr->value, "%f%f", &width, &length) != 2)) { width = ppd->custom_max[0]; length = ppd->custom_max[1]; } } maximum->width = width; maximum->length = length; maximum->left = ppd->custom_margins[0]; maximum->bottom = ppd->custom_margins[1]; maximum->right = width - ppd->custom_margins[2]; maximum->top = length - ppd->custom_margins[3]; /* * Return the min and max... */ cupsArrayRestore(ppd->sorted_attrs); return (1); } /* * 'ppdPageWidth()' - Get the page width for the given size. */ float /* O - Width of page in points or 0.0 */ ppdPageWidth(ppd_file_t *ppd, /* I - PPD file record */ const char *name) /* I - Size name */ { ppd_size_t *size; /* Page size */ if ((size = ppdPageSize(ppd, name)) == NULL) return (0.0); else return (size->width); } /* * 'ppdPageLength()' - Get the page length for the given size. */ float /* O - Length of page in points or 0.0 */ ppdPageLength(ppd_file_t *ppd, /* I - PPD file */ const char *name) /* I - Size name */ { ppd_size_t *size; /* Page size */ if ((size = ppdPageSize(ppd, name)) == NULL) return (0.0); else return (size->length); } cups-2.3.1/cups/ipp.h000664 000765 000024 00000150552 13574721672 014522 0ustar00mikestaff000000 000000 /* * Internet Printing Protocol definitions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_IPP_H_ # define _CUPS_IPP_H_ /* * Include necessary headers... */ # include "http.h" # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * IPP version string... */ # define IPP_VERSION "\002\001" /* * IPP registered port number... * * Note: Applications should never use IPP_PORT, but instead use the * ippPort() function to allow overrides via the IPP_PORT environment * variable and services file if needed! */ # define IPP_PORT 631 /* * Common limits... */ # define IPP_MAX_CHARSET 64 /* Maximum length of charset values w/nul */ # define IPP_MAX_KEYWORD 256 /* Maximum length of keyword values w/nul */ # define IPP_MAX_LANGUAGE 64 /* Maximum length of naturalLanguage values w/nul */ # define IPP_MAX_LENGTH 32767 /* Maximum size of any single value */ # define IPP_MAX_MIMETYPE 256 /* Maximum length of mimeMediaType values w/nul */ # define IPP_MAX_NAME 256 /* Maximum length of common name values w/nul */ # define IPP_MAX_OCTETSTRING 1023 /* Maximum length of octetString values w/o nul */ # define IPP_MAX_TEXT 1024 /* Maximum length of text values w/nul */ # define IPP_MAX_URI 1024 /* Maximum length of uri values w/nul */ # define IPP_MAX_URISCHEME 64 /* Maximum length of uriScheme values w/nul */ # define IPP_MAX_VALUES 8 /* Power-of-2 allocation increment */ /* * Macro to flag a text string attribute as "const" (static storage) vs. * allocated. */ # define IPP_CONST_TAG(x) (ipp_tag_t)(IPP_TAG_CUPS_CONST | (x)) /* * Types and structures... */ typedef enum ipp_dstate_e /**** Document states @exclude all@ ****/ { IPP_DSTATE_PENDING = 3, /* Document is pending */ IPP_DSTATE_PROCESSING = 5, /* Document is processing */ IPP_DSTATE_CANCELED = 7, /* Document is canceled */ IPP_DSTATE_ABORTED, /* Document is aborted */ IPP_DSTATE_COMPLETED /* Document is completed */ # ifndef _CUPS_NO_DEPRECATED # define IPP_DOCUMENT_PENDING IPP_DSTATE_PENDING # define IPP_DOCUMENT_PROCESSING IPP_DSTATE_PROCESSING # define IPP_DOCUMENT_CANCELED IPP_DSTATE_CANCELED # define IPP_DOCUMENT_ABORTED IPP_DSTATE_ABORTED # define IPP_DOCUMENT_COMPLETED IPP_DSTATE_COMPLETED # endif /* !_CUPS_NO_DEPRECATED */ } ipp_dstate_t; typedef enum ipp_finishings_e /**** Finishings values ****/ { IPP_FINISHINGS_NONE = 3, /* No finishing */ IPP_FINISHINGS_STAPLE, /* Staple (any location/method) */ IPP_FINISHINGS_PUNCH, /* Punch (any location/count) */ IPP_FINISHINGS_COVER, /* Add cover */ IPP_FINISHINGS_BIND, /* Bind */ IPP_FINISHINGS_SADDLE_STITCH, /* Staple interior */ IPP_FINISHINGS_EDGE_STITCH, /* Stitch along any side */ IPP_FINISHINGS_FOLD, /* Fold (any type) */ IPP_FINISHINGS_TRIM, /* Trim (any type) */ IPP_FINISHINGS_BALE, /* Bale (any type) */ IPP_FINISHINGS_BOOKLET_MAKER, /* Fold to make booklet */ IPP_FINISHINGS_JOG_OFFSET, /* Offset for binding (any type) */ IPP_FINISHINGS_COAT, /* Apply protective liquid or powder coating */ IPP_FINISHINGS_LAMINATE, /* Apply protective (solid) material */ IPP_FINISHINGS_STAPLE_TOP_LEFT = 20, /* Staple top left corner */ IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, /* Staple bottom left corner */ IPP_FINISHINGS_STAPLE_TOP_RIGHT, /* Staple top right corner */ IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT, /* Staple bottom right corner */ IPP_FINISHINGS_EDGE_STITCH_LEFT, /* Stitch along left side */ IPP_FINISHINGS_EDGE_STITCH_TOP, /* Stitch along top edge */ IPP_FINISHINGS_EDGE_STITCH_RIGHT, /* Stitch along right side */ IPP_FINISHINGS_EDGE_STITCH_BOTTOM, /* Stitch along bottom edge */ IPP_FINISHINGS_STAPLE_DUAL_LEFT, /* Two staples on left */ IPP_FINISHINGS_STAPLE_DUAL_TOP, /* Two staples on top */ IPP_FINISHINGS_STAPLE_DUAL_RIGHT, /* Two staples on right */ IPP_FINISHINGS_STAPLE_DUAL_BOTTOM, /* Two staples on bottom */ IPP_FINISHINGS_STAPLE_TRIPLE_LEFT, /* Three staples on left */ IPP_FINISHINGS_STAPLE_TRIPLE_TOP, /* Three staples on top */ IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT, /* Three staples on right */ IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM, /* Three staples on bottom */ IPP_FINISHINGS_BIND_LEFT = 50, /* Bind on left */ IPP_FINISHINGS_BIND_TOP, /* Bind on top */ IPP_FINISHINGS_BIND_RIGHT, /* Bind on right */ IPP_FINISHINGS_BIND_BOTTOM, /* Bind on bottom */ IPP_FINISHINGS_TRIM_AFTER_PAGES = 60, /* Trim output after each page */ IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS, /* Trim output after each document */ IPP_FINISHINGS_TRIM_AFTER_COPIES, /* Trim output after each copy */ IPP_FINISHINGS_TRIM_AFTER_JOB, /* Trim output after job */ IPP_FINISHINGS_PUNCH_TOP_LEFT = 70, /* Punch 1 hole top left */ IPP_FINISHINGS_PUNCH_BOTTOM_LEFT, /* Punch 1 hole bottom left */ IPP_FINISHINGS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */ IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT, /* Punch 1 hole bottom right */ IPP_FINISHINGS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */ IPP_FINISHINGS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge */ IPP_FINISHINGS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side */ IPP_FINISHINGS_PUNCH_DUAL_BOTTOM, /* Punch 2 holes bottom edge */ IPP_FINISHINGS_PUNCH_TRIPLE_LEFT, /* Punch 3 holes left side */ IPP_FINISHINGS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge */ IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT, /* Punch 3 holes right side */ IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM, /* Punch 3 holes bottom edge */ IPP_FINISHINGS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */ 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, /* 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 */ IPP_FINISHINGS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically */ IPP_FINISHINGS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline */ IPP_FINISHINGS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold*/ IPP_FINISHINGS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections */ IPP_FINISHINGS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */ IPP_FINISHINGS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */ IPP_FINISHINGS_FOLD_Z, /* Fold the paper vertically into three sections, forming a Z */ IPP_FINISHINGS_FOLD_ENGINEERING_Z, /* Fold the paper vertically into two small sections and one larger, forming an elongated Z */ /* CUPS extensions for finishings (pre-standard versions of values above) */ IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046, /* Punch 1 hole top left @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT, /* Punch 1 hole bottom right @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT, /* Punch 3 holes right side @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM, /* Punch 3 holes bottom edge @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side @exclude all@ */ IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge @exclude all@ */ 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_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@ */ IPP_FINISHINGS_CUPS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically @exclude all@ */ IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline @exclude all@ */ IPP_FINISHINGS_CUPS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold @exclude all@ */ IPP_FINISHINGS_CUPS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections @exclude all@ */ IPP_FINISHINGS_CUPS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold @exclude all@ */ IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline @exclude all@ */ 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 misspellings... */ typedef enum ipp_finishings_e ipp_finish_t; # endif /* !_CUPS_NO_DEPRECATED */ typedef enum ipp_jcollate_e /**** Job collation types @deprecated@ @exclude all@ ****/ { IPP_JCOLLATE_UNCOLLATED_SHEETS = 3, IPP_JCOLLATE_COLLATED_DOCUMENTS, IPP_JCOLLATE_UNCOLLATED_DOCUMENTS # ifndef _CUPS_NO_DEPRECATED # define IPP_JOB_UNCOLLATED_SHEETS IPP_JCOLLATE_UNCOLLATED_SHEETS # define IPP_JOB_COLLATED_DOCUMENTS IPP_JCOLLATE_COLLATED_DOCUMENTS # define IPP_JOB_UNCOLLATED_DOCUMENTS IPP_JCOLLATE_UNCOLLATED_DOCUMENTS # endif /* !_CUPS_NO_DEPRECATED */ } ipp_jcollate_t; typedef enum ipp_jstate_e /**** Job states ****/ { IPP_JSTATE_PENDING = 3, /* Job is waiting to be printed */ IPP_JSTATE_HELD, /* Job is held for printing */ IPP_JSTATE_PROCESSING, /* Job is currently printing */ IPP_JSTATE_STOPPED, /* Job has been stopped */ IPP_JSTATE_CANCELED, /* Job has been canceled */ IPP_JSTATE_ABORTED, /* Job has aborted due to error */ IPP_JSTATE_COMPLETED /* Job has completed successfully */ # ifndef _CUPS_NO_DEPRECATED # define IPP_JOB_PENDING IPP_JSTATE_PENDING # define IPP_JOB_HELD IPP_JSTATE_HELD # define IPP_JOB_PROCESSING IPP_JSTATE_PROCESSING # define IPP_JOB_STOPPED IPP_JSTATE_STOPPED # define IPP_JOB_CANCELED IPP_JSTATE_CANCELED # define IPP_JOB_ABORTED IPP_JSTATE_ABORTED # define IPP_JOB_COMPLETED IPP_JSTATE_COMPLETED /* Legacy name for canceled state */ # define IPP_JOB_CANCELLED IPP_JSTATE_CANCELED # endif /* !_CUPS_NO_DEPRECATED */ } ipp_jstate_t; typedef enum ipp_op_e /**** IPP operations ****/ { IPP_OP_CUPS_INVALID = -1, /* Invalid operation name for @link ippOpValue@ */ IPP_OP_CUPS_NONE = 0, /* No operation @private@ */ IPP_OP_PRINT_JOB = 0x0002, /* Print-Job: Print a single file */ IPP_OP_PRINT_URI, /* Print-URI: Print a single URL @exclude all@ */ IPP_OP_VALIDATE_JOB, /* Validate-Job: Validate job values prior to submission */ IPP_OP_CREATE_JOB, /* Create-Job: Create an empty print job */ IPP_OP_SEND_DOCUMENT, /* Send-Document: Add a file to a job */ IPP_OP_SEND_URI, /* Send-URI: Add a URL to a job @exclude all@ */ IPP_OP_CANCEL_JOB, /* Cancel-Job: Cancel a job */ IPP_OP_GET_JOB_ATTRIBUTES, /* Get-Job-Attribute: Get information about a job */ IPP_OP_GET_JOBS, /* Get-Jobs: Get a list of jobs */ IPP_OP_GET_PRINTER_ATTRIBUTES, /* Get-Printer-Attributes: Get information about a printer */ IPP_OP_HOLD_JOB, /* Hold-Job: Hold a job for printing */ IPP_OP_RELEASE_JOB, /* Release-Job: Release a job for printing */ IPP_OP_RESTART_JOB, /* Restart-Job: Reprint a job @deprecated@ */ IPP_OP_PAUSE_PRINTER = 0x0010, /* Pause-Printer: Stop a printer */ IPP_OP_RESUME_PRINTER, /* Resume-Printer: Start a printer */ IPP_OP_PURGE_JOBS, /* Purge-Jobs: Delete all jobs @deprecated@ @exclude all@ */ IPP_OP_SET_PRINTER_ATTRIBUTES, /* Set-Printer-Attributes: Set printer values */ IPP_OP_SET_JOB_ATTRIBUTES, /* Set-Job-Attributes: Set job values */ IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get-Printer-Supported-Values: Get supported values */ IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create-Printer-Subscriptions: Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ */ IPP_OP_CREATE_JOB_SUBSCRIPTIONS, /* Create-Job-Subscriptions: Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ */ IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get-Subscription-Attributes: Get subscription information @since CUPS 1.2/macOS 10.5@ */ IPP_OP_GET_SUBSCRIPTIONS, /* Get-Subscriptions: Get list of subscriptions @since CUPS 1.2/macOS 10.5@ */ IPP_OP_RENEW_SUBSCRIPTION, /* Renew-Subscription: Renew a printer subscription @since CUPS 1.2/macOS 10.5@ */ IPP_OP_CANCEL_SUBSCRIPTION, /* Cancel-Subscription: Cancel a subscription @since CUPS 1.2/macOS 10.5@ */ IPP_OP_GET_NOTIFICATIONS, /* Get-Notifications: Get notification events @since CUPS 1.2/macOS 10.5@ */ IPP_OP_SEND_NOTIFICATIONS, /* Send-Notifications: Send notification events @private@ */ IPP_OP_GET_RESOURCE_ATTRIBUTES, /* Get-Resource-Attributes: Get resource information @private@ */ IPP_OP_GET_RESOURCE_DATA, /* Get-Resource-Data: Get resource data @private@ @deprecated@ */ IPP_OP_GET_RESOURCES, /* Get-Resources: Get list of resources @private@ */ IPP_OP_GET_PRINT_SUPPORT_FILES, /* Get-Printer-Support-Files: Get printer support files @private@ */ IPP_OP_ENABLE_PRINTER, /* Enable-Printer: Accept new jobs for a printer */ IPP_OP_DISABLE_PRINTER, /* Disable-Printer: Reject new jobs for a printer */ IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB, /* Pause-Printer-After-Current-Job: Stop printer after the current job */ IPP_OP_HOLD_NEW_JOBS, /* Hold-New-Jobs: Hold new jobs */ IPP_OP_RELEASE_HELD_NEW_JOBS, /* Release-Held-New-Jobs: Release new jobs that were previously held */ IPP_OP_DEACTIVATE_PRINTER, /* Deactivate-Printer: Stop a printer and do not accept jobs @deprecated@ @exclude all@ */ IPP_OP_ACTIVATE_PRINTER, /* Activate-Printer: Start a printer and accept jobs @deprecated@ @exclude all@ */ IPP_OP_RESTART_PRINTER, /* Restart-Printer: Restart a printer @exclude all@ */ IPP_OP_SHUTDOWN_PRINTER, /* Shutdown-Printer: Turn a printer off @exclude all@ */ IPP_OP_STARTUP_PRINTER, /* Startup-Printer: Turn a printer on @exclude all@ */ IPP_OP_REPROCESS_JOB, /* Reprocess-Job: Reprint a job @deprecated@ @exclude all@*/ IPP_OP_CANCEL_CURRENT_JOB, /* Cancel-Current-Job: Cancel the current job */ IPP_OP_SUSPEND_CURRENT_JOB, /* Suspend-Current-Job: Suspend the current job */ IPP_OP_RESUME_JOB, /* Resume-Job: Resume the current job */ IPP_OP_PROMOTE_JOB, /* Promote-Job: Promote a job to print sooner */ IPP_OP_SCHEDULE_JOB_AFTER, /* Schedule-Job-After: Schedule a job to print after another */ IPP_OP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document: Cancel a document @exclude all@ */ IPP_OP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes: Get document information @exclude all@ */ IPP_OP_GET_DOCUMENTS, /* Get-Documents: Get a list of documents in a job @exclude all@ */ IPP_OP_DELETE_DOCUMENT, /* Delete-Document: Delete a document @deprecated@ @exclude all@ */ IPP_OP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes: Set document values @exclude all@ */ IPP_OP_CANCEL_JOBS, /* Cancel-Jobs: Cancel all jobs (administrative) */ IPP_OP_CANCEL_MY_JOBS, /* Cancel-My-Jobs: Cancel a user's jobs */ IPP_OP_RESUBMIT_JOB, /* Resubmit-Job: Copy and reprint a job @exclude all@ */ IPP_OP_CLOSE_JOB, /* Close-Job: Close a job and start printing */ IPP_OP_IDENTIFY_PRINTER, /* Identify-Printer: Make the printer beep, flash, or display a message for identification */ IPP_OP_VALIDATE_DOCUMENT, /* Validate-Document: Validate document values prior to submission @exclude all@ */ IPP_OP_ADD_DOCUMENT_IMAGES, /* Add-Document-Images: Add image(s) from the specified scanner source @exclude all@ */ IPP_OP_ACKNOWLEDGE_DOCUMENT, /* Acknowledge-Document: Acknowledge processing of a document @exclude all@ */ IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer: Acknowledge action on an Identify-Printer request @exclude all@ */ IPP_OP_ACKNOWLEDGE_JOB, /* Acknowledge-Job: Acknowledge processing of a job @exclude all@ */ IPP_OP_FETCH_DOCUMENT, /* Fetch-Document: Fetch a document for processing @exclude all@ */ IPP_OP_FETCH_JOB, /* Fetch-Job: Fetch a job for processing @exclude all@ */ IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes: Get printer information for a specific output device @exclude all@ */ IPP_OP_UPDATE_ACTIVE_JOBS, /* Update-Active-Jobs: Update the list of active jobs that a proxy has processed @exclude all@ */ IPP_OP_DEREGISTER_OUTPUT_DEVICE, /* Deregister-Output-Device: Remove an output device @exclude all@ */ IPP_OP_UPDATE_DOCUMENT_STATUS, /* Update-Document-Status: Update document values @exclude all@ */ IPP_OP_UPDATE_JOB_STATUS, /* Update-Job-Status: Update job values @exclude all@ */ IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES, /* Update-Output-Device-Attributes: Update output device values @exclude all@ */ IPP_OP_GET_NEXT_DOCUMENT_DATA, /* Get-Next-Document-Data: Scan more document data @exclude all@ */ IPP_OP_ALLOCATE_PRINTER_RESOURCES, /* Allocate-Printer-Resources: Use resources for a printer. */ IPP_OP_CREATE_PRINTER, /* Create-Printer: Create a new service. */ IPP_OP_DEALLOCATE_PRINTER_RESOURCES, /* Deallocate-Printer-Resources: Stop using resources for a printer. */ IPP_OP_DELETE_PRINTER, /* Delete-Printer: Delete an existing service. */ IPP_OP_GET_PRINTERS, /* Get-Printers: Get a list of services. */ IPP_OP_SHUTDOWN_ONE_PRINTER, /* Shutdown-One-Printer: Shutdown a service. */ IPP_OP_STARTUP_ONE_PRINTER, /* Startup-One-Printer: Start a service. */ IPP_OP_CANCEL_RESOURCE, /* Cancel-Resource: Uninstall a resource. */ IPP_OP_CREATE_RESOURCE, /* Create-Resource: Create a new (empty) resource. */ IPP_OP_INSTALL_RESOURCE, /* Install-Resource: Install a resource. */ IPP_OP_SEND_RESOURCE_DATA, /* Send-Resource-Data: Upload the data for a resource. */ IPP_OP_SET_RESOURCE_ATTRIBUTES, /* Set-Resource-Attributes: Set resource object attributes. */ IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS, /* Create-Resource-Subscriptions: Create event subscriptions for a resource. */ IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS, /* Create-System-Subscriptions: Create event subscriptions for a system. */ IPP_OP_DISABLE_ALL_PRINTERS, /* Disable-All-Printers: Stop accepting new jobs on all services. */ IPP_OP_ENABLE_ALL_PRINTERS, /* Enable-All-Printers: Start accepting new jobs on all services. */ IPP_OP_GET_SYSTEM_ATTRIBUTES, /* Get-System-Attributes: Get system object attributes. */ IPP_OP_GET_SYSTEM_SUPPORTED_VALUES, /* Get-System-Supported-Values: Get supported values for system object attributes. */ IPP_OP_PAUSE_ALL_PRINTERS, /* Pause-All-Printers: Stop all services immediately. */ IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB, /* Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs. */ IPP_OP_REGISTER_OUTPUT_DEVICE, /* Register-Output-Device: Register a remote service. */ IPP_OP_RESTART_SYSTEM, /* Restart-System: Restart all services. */ IPP_OP_RESUME_ALL_PRINTERS, /* Resume-All-Printers: Start job processing on all services. */ IPP_OP_SET_SYSTEM_ATTRIBUTES, /* Set-System-Attributes: Set system object attributes. */ IPP_OP_SHUTDOWN_ALL_PRINTERS, /* Shutdown-All-Printers: Shutdown all services. */ IPP_OP_STARTUP_ALL_PRINTERS, /* Startup-All-Printers: Startup all services. */ IPP_OP_PRIVATE = 0x4000, /* Reserved @private@ */ IPP_OP_CUPS_GET_DEFAULT, /* CUPS-Get-Default: Get the default printer */ IPP_OP_CUPS_GET_PRINTERS, /* CUPS-Get-Printers: Get a list of printers and/or classes */ IPP_OP_CUPS_ADD_MODIFY_PRINTER, /* CUPS-Add-Modify-Printer: Add or modify a printer */ IPP_OP_CUPS_DELETE_PRINTER, /* CUPS-Delete-Printer: Delete a printer */ IPP_OP_CUPS_GET_CLASSES, /* CUPS-Get-Classes: Get a list of classes @deprecated@ @exclude all@ */ IPP_OP_CUPS_ADD_MODIFY_CLASS, /* CUPS-Add-Modify-Class: Add or modify a class */ IPP_OP_CUPS_DELETE_CLASS, /* CUPS-Delete-Class: Delete a class */ IPP_OP_CUPS_ACCEPT_JOBS, /* CUPS-Accept-Jobs: Accept new jobs on a printer @exclude all@ */ IPP_OP_CUPS_REJECT_JOBS, /* CUPS-Reject-Jobs: Reject new jobs on a printer @exclude all@ */ IPP_OP_CUPS_SET_DEFAULT, /* CUPS-Set-Default: Set the default printer */ IPP_OP_CUPS_GET_DEVICES, /* CUPS-Get-Devices: Get a list of supported devices @deprecated@ */ IPP_OP_CUPS_GET_PPDS, /* CUPS-Get-PPDs: Get a list of supported drivers @deprecated@ */ IPP_OP_CUPS_MOVE_JOB, /* CUPS-Move-Job: Move a job to a different printer */ IPP_OP_CUPS_AUTHENTICATE_JOB, /* CUPS-Authenticate-Job: Authenticate a job @since CUPS 1.2/macOS 10.5@ */ IPP_OP_CUPS_GET_PPD, /* CUPS-Get-PPD: Get a PPD file @deprecated@ */ IPP_OP_CUPS_GET_DOCUMENT = 0x4027, /* CUPS-Get-Document: Get a document file @since CUPS 1.4/macOS 10.6@ */ IPP_OP_CUPS_CREATE_LOCAL_PRINTER /* CUPS-Create-Local-Printer: Create a local (temporary) printer @since CUPS 2.2@ */ # ifndef _CUPS_NO_DEPRECATED # define IPP_PRINT_JOB IPP_OP_PRINT_JOB # define IPP_PRINT_URI IPP_OP_PRINT_URI # define IPP_VALIDATE_JOB IPP_OP_VALIDATE_JOB # define IPP_CREATE_JOB IPP_OP_CREATE_JOB # define IPP_SEND_DOCUMENT IPP_OP_SEND_DOCUMENT # define IPP_SEND_URI IPP_OP_SEND_URI # define IPP_CANCEL_JOB IPP_OP_CANCEL_JOB # define IPP_GET_JOB_ATTRIBUTES IPP_OP_GET_JOB_ATTRIBUTES # define IPP_GET_JOBS IPP_OP_GET_JOBS # define IPP_GET_PRINTER_ATTRIBUTES IPP_OP_GET_PRINTER_ATTRIBUTES # define IPP_HOLD_JOB IPP_OP_HOLD_JOB # define IPP_RELEASE_JOB IPP_OP_RELEASE_JOB # define IPP_RESTART_JOB IPP_OP_RESTART_JOB # define IPP_PAUSE_PRINTER IPP_OP_PAUSE_PRINTER # define IPP_RESUME_PRINTER IPP_OP_RESUME_PRINTER # define IPP_PURGE_JOBS IPP_OP_PURGE_JOBS # define IPP_SET_PRINTER_ATTRIBUTES IPP_OP_SET_PRINTER_ATTRIBUTES # define IPP_SET_JOB_ATTRIBUTES IPP_OP_SET_JOB_ATTRIBUTES # define IPP_GET_PRINTER_SUPPORTED_VALUES IPP_OP_GET_PRINTER_SUPPORTED_VALUES # define IPP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS # define IPP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS # define IPP_OP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS # define IPP_OP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS # define IPP_GET_SUBSCRIPTION_ATTRIBUTES IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES # define IPP_GET_SUBSCRIPTIONS IPP_OP_GET_SUBSCRIPTIONS # define IPP_RENEW_SUBSCRIPTION IPP_OP_RENEW_SUBSCRIPTION # define IPP_CANCEL_SUBSCRIPTION IPP_OP_CANCEL_SUBSCRIPTION # define IPP_GET_NOTIFICATIONS IPP_OP_GET_NOTIFICATIONS # define IPP_SEND_NOTIFICATIONS IPP_OP_SEND_NOTIFICATIONS # define IPP_GET_RESOURCE_ATTRIBUTES IPP_OP_GET_RESOURCE_ATTRIBUTES # define IPP_GET_RESOURCE_DATA IPP_OP_GET_RESOURCE_DATA # define IPP_GET_RESOURCES IPP_OP_GET_RESOURCES # define IPP_GET_PRINT_SUPPORT_FILES IPP_OP_GET_PRINT_SUPPORT_FILES # define IPP_ENABLE_PRINTER IPP_OP_ENABLE_PRINTER # define IPP_DISABLE_PRINTER IPP_OP_DISABLE_PRINTER # define IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB # define IPP_HOLD_NEW_JOBS IPP_OP_HOLD_NEW_JOBS # define IPP_RELEASE_HELD_NEW_JOBS IPP_OP_RELEASE_HELD_NEW_JOBS # define IPP_DEACTIVATE_PRINTER IPP_OP_DEACTIVATE_PRINTER # define IPP_ACTIVATE_PRINTER IPP_OP_ACTIVATE_PRINTER # define IPP_RESTART_PRINTER IPP_OP_RESTART_PRINTER # define IPP_SHUTDOWN_PRINTER IPP_OP_SHUTDOWN_PRINTER # define IPP_STARTUP_PRINTER IPP_OP_STARTUP_PRINTER # define IPP_REPROCESS_JOB IPP_OP_REPROCESS_JOB # define IPP_CANCEL_CURRENT_JOB IPP_OP_CANCEL_CURRENT_JOB # define IPP_SUSPEND_CURRENT_JOB IPP_OP_SUSPEND_CURRENT_JOB # define IPP_RESUME_JOB IPP_OP_RESUME_JOB # define IPP_PROMOTE_JOB IPP_OP_PROMOTE_JOB # define IPP_SCHEDULE_JOB_AFTER IPP_OP_SCHEDULE_JOB_AFTER # define IPP_CANCEL_DOCUMENT IPP_OP_CANCEL_DOCUMENT # define IPP_GET_DOCUMENT_ATTRIBUTES IPP_OP_GET_DOCUMENT_ATTRIBUTES # define IPP_GET_DOCUMENTS IPP_OP_GET_DOCUMENTS # define IPP_DELETE_DOCUMENT IPP_OP_DELETE_DOCUMENT # define IPP_SET_DOCUMENT_ATTRIBUTES IPP_OP_SET_DOCUMENT_ATTRIBUTES # define IPP_CANCEL_JOBS IPP_OP_CANCEL_JOBS # define IPP_CANCEL_MY_JOBS IPP_OP_CANCEL_MY_JOBS # define IPP_RESUBMIT_JOB IPP_OP_RESUBMIT_JOB # define IPP_CLOSE_JOB IPP_OP_CLOSE_JOB # define IPP_IDENTIFY_PRINTER IPP_OP_IDENTIFY_PRINTER # define IPP_VALIDATE_DOCUMENT IPP_OP_VALIDATE_DOCUMENT # define IPP_OP_SEND_HARDCOPY_DOCUMENT IPP_OP_ADD_DOCUMENT_IMAGES # define IPP_PRIVATE IPP_OP_PRIVATE # define CUPS_GET_DEFAULT IPP_OP_CUPS_GET_DEFAULT # define CUPS_GET_PRINTERS IPP_OP_CUPS_GET_PRINTERS # define CUPS_ADD_MODIFY_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER # define CUPS_DELETE_PRINTER IPP_OP_CUPS_DELETE_PRINTER # define CUPS_GET_CLASSES IPP_OP_CUPS_GET_CLASSES # define CUPS_ADD_MODIFY_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS # define CUPS_DELETE_CLASS IPP_OP_CUPS_DELETE_CLASS # define CUPS_ACCEPT_JOBS IPP_OP_CUPS_ACCEPT_JOBS # define CUPS_REJECT_JOBS IPP_OP_CUPS_REJECT_JOBS # define CUPS_SET_DEFAULT IPP_OP_CUPS_SET_DEFAULT # define CUPS_GET_DEVICES IPP_OP_CUPS_GET_DEVICES # define CUPS_GET_PPDS IPP_OP_CUPS_GET_PPDS # define CUPS_MOVE_JOB IPP_OP_CUPS_MOVE_JOB # define CUPS_AUTHENTICATE_JOB IPP_OP_CUPS_AUTHENTICATE_JOB # define CUPS_GET_PPD IPP_OP_CUPS_GET_PPD # define CUPS_GET_DOCUMENT IPP_OP_CUPS_GET_DOCUMENT /* Legacy names */ # define CUPS_ADD_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER # define CUPS_ADD_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS # endif /* !_CUPS_NO_DEPRECATED */ } ipp_op_t; typedef enum ipp_orient_e /**** Orientation values ****/ { IPP_ORIENT_PORTRAIT = 3, /* No rotation */ IPP_ORIENT_LANDSCAPE, /* 90 degrees counter-clockwise */ IPP_ORIENT_REVERSE_LANDSCAPE, /* 90 degrees clockwise */ IPP_ORIENT_REVERSE_PORTRAIT, /* 180 degrees */ IPP_ORIENT_NONE /* No rotation */ # ifndef _CUPS_NO_DEPRECATED # define IPP_PORTRAIT IPP_ORIENT_PORTRAIT # define IPP_LANDSCAPE IPP_ORIENT_LANDSCAPE # define IPP_REVERSE_LANDSCAPE IPP_ORIENT_REVERSE_LANDSCAPE # define IPP_REVERSE_PORTRAIT IPP_ORIENT_REVERSE_PORTRAIT # endif /* !_CUPS_NO_DEPRECATED */ } ipp_orient_t; typedef enum ipp_pstate_e /**** Printer state values ****/ { IPP_PSTATE_IDLE = 3, /* Printer is idle */ IPP_PSTATE_PROCESSING, /* Printer is working */ IPP_PSTATE_STOPPED /* Printer is stopped */ # ifndef _CUPS_NO_DEPRECATED # define IPP_PRINTER_IDLE IPP_PSTATE_IDLE # define IPP_PRINTER_PROCESSING IPP_PSTATE_PROCESSING # define IPP_PRINTER_STOPPED IPP_PSTATE_STOPPED # endif /* _CUPS_NO_DEPRECATED */ } ipp_pstate_t; typedef enum ipp_quality_e /**** Print quality values ****/ { IPP_QUALITY_DRAFT = 3, /* Draft quality */ IPP_QUALITY_NORMAL, /* Normal quality */ IPP_QUALITY_HIGH /* High quality */ } ipp_quality_t; typedef enum ipp_res_e /**** Resolution units ****/ { IPP_RES_PER_INCH = 3, /* Pixels per inch */ IPP_RES_PER_CM /* Pixels per centimeter */ } ipp_res_t; typedef enum ipp_rstate_e /**** resource-state values ****/ { IPP_RSTATE_PENDING = 3, /* Resource is created but has no data yet. */ IPP_RSTATE_AVAILABLE, /* Resource is available for installation. */ IPP_RSTATE_INSTALLED, /* Resource is installed. */ IPP_RSTATE_CANCELED, /* Resource has been canceled and is pending deletion. */ IPP_RSTATE_ABORTED /* Resource has been aborted and is pending deletion. */ } ipp_rstate_t; typedef enum ipp_sstate_e /**** system-state values ****/ { IPP_SSTATE_IDLE = 3, /* At least one printer is idle and none are processing a job. */ IPP_SSTATE_PROCESSING, /* At least one printer is processing a job. */ IPP_SSTATE_STOPPED /* All printers are stopped. */ } ipp_sstate_t; typedef enum ipp_state_e /**** ipp_t state values ****/ { IPP_STATE_ERROR = -1, /* An error occurred */ IPP_STATE_IDLE, /* Nothing is happening/request completed */ IPP_STATE_HEADER, /* The request header needs to be sent/received */ IPP_STATE_ATTRIBUTE, /* One or more attributes need to be sent/received */ IPP_STATE_DATA /* IPP request data needs to be sent/received */ # ifndef _CUPS_NO_DEPRECATED # define IPP_ERROR IPP_STATE_ERROR # define IPP_IDLE IPP_STATE_IDLE # define IPP_HEADER IPP_STATE_HEADER # define IPP_ATTRIBUTE IPP_STATE_ATTRIBUTE # define IPP_DATA IPP_STATE_DATA # endif /* !_CUPS_NO_DEPRECATED */ } ipp_state_t; typedef enum ipp_status_e /**** IPP status code values ****/ { IPP_STATUS_CUPS_INVALID = -1, /* Invalid status name for @link ippErrorValue@ */ IPP_STATUS_OK = 0x0000, /* successful-ok */ IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED, /* successful-ok-ignored-or-substituted-attributes */ IPP_STATUS_OK_CONFLICTING, /* successful-ok-conflicting-attributes */ IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS, /* successful-ok-ignored-subscriptions */ IPP_STATUS_OK_IGNORED_NOTIFICATIONS, /* successful-ok-ignored-notifications @private@ */ IPP_STATUS_OK_TOO_MANY_EVENTS, /* successful-ok-too-many-events */ IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION,/* successful-ok-but-cancel-subscription @private@ */ IPP_STATUS_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */ IPP_STATUS_REDIRECTION_OTHER_SITE = 0x0200, /* redirection-other-site @private@ */ IPP_STATUS_CUPS_SEE_OTHER = 0x0280, /* cups-see-other @private@ */ IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,/* client-error-bad-request */ IPP_STATUS_ERROR_FORBIDDEN, /* client-error-forbidden */ IPP_STATUS_ERROR_NOT_AUTHENTICATED, /* client-error-not-authenticated */ IPP_STATUS_ERROR_NOT_AUTHORIZED, /* client-error-not-authorized */ IPP_STATUS_ERROR_NOT_POSSIBLE, /* client-error-not-possible */ IPP_STATUS_ERROR_TIMEOUT, /* client-error-timeout */ IPP_STATUS_ERROR_NOT_FOUND, /* client-error-not-found */ IPP_STATUS_ERROR_GONE, /* client-error-gone */ IPP_STATUS_ERROR_REQUEST_ENTITY, /* client-error-request-entity-too-large */ IPP_STATUS_ERROR_REQUEST_VALUE, /* client-error-request-value-too-long */ IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, /* client-error-document-format-not-supported */ IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,/* client-error-attributes-or-values-not-supported */ IPP_STATUS_ERROR_URI_SCHEME, /* client-error-uri-scheme-not-supported */ IPP_STATUS_ERROR_CHARSET, /* client-error-charset-not-supported */ IPP_STATUS_ERROR_CONFLICTING, /* client-error-conflicting-attributes */ IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED, /* client-error-compression-not-supported */ IPP_STATUS_ERROR_COMPRESSION_ERROR, /* client-error-compression-error */ IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, /* client-error-document-format-error */ IPP_STATUS_ERROR_DOCUMENT_ACCESS, /* client-error-document-access-error */ IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE, /* client-error-attributes-not-settable */ IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS, /* client-error-ignored-all-subscriptions */ IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS, /* client-error-too-many-subscriptions */ IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS, /* client-error-ignored-all-notifications @private@ */ IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND, /* client-error-print-support-file-not-found @private@ */ IPP_STATUS_ERROR_DOCUMENT_PASSWORD, /* client-error-document-password-error */ IPP_STATUS_ERROR_DOCUMENT_PERMISSION, /* client-error-document-permission-error */ IPP_STATUS_ERROR_DOCUMENT_SECURITY, /* client-error-document-security-error */ IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE,/* client-error-document-unprintable-error */ IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED, /* client-error-account-info-needed */ IPP_STATUS_ERROR_ACCOUNT_CLOSED, /* client-error-account-closed */ IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED, /* client-error-account-limit-reached */ IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED, /* client-error-account-authorization-failed */ IPP_STATUS_ERROR_NOT_FETCHABLE, /* client-error-not-fetchable */ /* Legacy status codes for paid printing */ IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C, /* cups-error-account-info-needed @deprecated@ */ IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED, /* cups-error-account-closed @deprecate@ */ IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED, /* cups-error-account-limit-reached @deprecated@ */ IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED, /* cups-error-account-authorization-failed @deprecated@ */ IPP_STATUS_ERROR_INTERNAL = 0x0500, /* server-error-internal-error */ IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, /* server-error-operation-not-supported */ IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, /* server-error-service-unavailable */ IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, /* server-error-version-not-supported */ IPP_STATUS_ERROR_DEVICE, /* server-error-device-error */ IPP_STATUS_ERROR_TEMPORARY, /* server-error-temporary-error */ IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS, /* server-error-not-accepting-jobs */ IPP_STATUS_ERROR_BUSY, /* server-error-busy */ IPP_STATUS_ERROR_JOB_CANCELED, /* server-error-job-canceled */ IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, /* server-error-multiple-document-jobs-not-supported */ IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED, /* server-error-printer-is-deactivated */ IPP_STATUS_ERROR_TOO_MANY_JOBS, /* server-error-too-many-jobs */ IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS, /* server-error-too-many-documents */ /* These are internal and never sent over the wire... */ IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000, /* cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/macOS 10.7@ */ IPP_STATUS_ERROR_CUPS_PKI, /* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */ IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required @since CUPS 1.5/macOS 10.7@ */ # ifndef _CUPS_NO_DEPRECATED # define IPP_OK IPP_STATUS_OK # define IPP_OK_SUBST IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED # define IPP_OK_CONFLICT IPP_STATUS_OK_CONFLICTING # define IPP_OK_IGNORED_SUBSCRIPTIONS IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS # define IPP_OK_IGNORED_NOTIFICATIONS IPP_STATUS_OK_IGNORED_NOTIFICATIONS # define IPP_OK_TOO_MANY_EVENTS IPP_STATUS_OK_TOO_MANY_EVENTS # define IPP_OK_BUT_CANCEL_SUBSCRIPTION IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION # define IPP_OK_EVENTS_COMPLETE IPP_STATUS_OK_EVENTS_COMPLETE # define IPP_REDIRECTION_OTHER_SITE IPP_STATUS_REDIRECTION_OTHER_SITE # define CUPS_SEE_OTHER IPP_STATUS_CUPS_SEE_OTHER # define IPP_BAD_REQUEST IPP_STATUS_ERROR_BAD_REQUEST # define IPP_FORBIDDEN IPP_STATUS_ERROR_FORBIDDEN # define IPP_NOT_AUTHENTICATED IPP_STATUS_ERROR_NOT_AUTHENTICATED # define IPP_NOT_AUTHORIZED IPP_STATUS_ERROR_NOT_AUTHORIZED # define IPP_NOT_POSSIBLE IPP_STATUS_ERROR_NOT_POSSIBLE # define IPP_TIMEOUT IPP_STATUS_ERROR_TIMEOUT # define IPP_NOT_FOUND IPP_STATUS_ERROR_NOT_FOUND # define IPP_GONE IPP_STATUS_ERROR_GONE # define IPP_REQUEST_ENTITY IPP_STATUS_ERROR_REQUEST_ENTITY # define IPP_REQUEST_VALUE IPP_STATUS_ERROR_REQUEST_VALUE # define IPP_DOCUMENT_FORMAT IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED # define IPP_ATTRIBUTES IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES # define IPP_URI_SCHEME IPP_STATUS_ERROR_URI_SCHEME # define IPP_CHARSET IPP_STATUS_ERROR_CHARSET # define IPP_CONFLICT IPP_STATUS_ERROR_CONFLICTING # define IPP_COMPRESSION_NOT_SUPPORTED IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED # define IPP_COMPRESSION_ERROR IPP_STATUS_ERROR_COMPRESSION_ERROR # define IPP_DOCUMENT_FORMAT_ERROR IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR # define IPP_DOCUMENT_ACCESS_ERROR IPP_STATUS_ERROR_DOCUMENT_ACCESS # define IPP_ATTRIBUTES_NOT_SETTABLE IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE # define IPP_IGNORED_ALL_SUBSCRIPTIONS IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS # define IPP_TOO_MANY_SUBSCRIPTIONS IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS # define IPP_IGNORED_ALL_NOTIFICATIONS IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS # define IPP_PRINT_SUPPORT_FILE_NOT_FOUND IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND # define IPP_DOCUMENT_PASSWORD_ERROR IPP_STATUS_ERROR_DOCUMENT_PASSWORD # define IPP_DOCUMENT_PERMISSION_ERROR IPP_STATUS_ERROR_DOCUMENT_PERMISSION # define IPP_DOCUMENT_SECURITY_ERROR IPP_STATUS_ERROR_DOCUMENT_SECURITY # define IPP_DOCUMENT_UNPRINTABLE_ERROR IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE # define IPP_INTERNAL_ERROR IPP_STATUS_ERROR_INTERNAL # define IPP_OPERATION_NOT_SUPPORTED IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED # define IPP_SERVICE_UNAVAILABLE IPP_STATUS_ERROR_SERVICE_UNAVAILABLE # define IPP_VERSION_NOT_SUPPORTED IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED # define IPP_DEVICE_ERROR IPP_STATUS_ERROR_DEVICE # define IPP_TEMPORARY_ERROR IPP_STATUS_ERROR_TEMPORARY # define IPP_NOT_ACCEPTING IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS # define IPP_PRINTER_BUSY IPP_STATUS_ERROR_BUSY # define IPP_ERROR_JOB_CANCELED IPP_STATUS_ERROR_JOB_CANCELED # define IPP_MULTIPLE_JOBS_NOT_SUPPORTED IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED # define IPP_PRINTER_IS_DEACTIVATED IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED # define IPP_TOO_MANY_JOBS IPP_STATUS_ERROR_TOO_MANY_JOBS # define IPP_TOO_MANY_DOCUMENTS IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS # define IPP_AUTHENTICATION_CANCELED IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED # define IPP_PKI_ERROR IPP_STATUS_ERROR_CUPS_PKI # define IPP_UPGRADE_REQUIRED IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED /* Legacy name for canceled status */ # define IPP_ERROR_JOB_CANCELLED IPP_STATUS_ERROR_JOB_CANCELED # endif /* _CUPS_NO_DEPRECATED */ } ipp_status_t; typedef enum ipp_tag_e /**** Value and group tag values for attributes ****/ { IPP_TAG_CUPS_INVALID = -1, /* Invalid tag name for @link ippTagValue@ */ IPP_TAG_ZERO = 0x00, /* Zero tag - used for separators */ IPP_TAG_OPERATION, /* Operation group */ IPP_TAG_JOB, /* Job group */ IPP_TAG_END, /* End-of-attributes */ IPP_TAG_PRINTER, /* Printer group */ IPP_TAG_UNSUPPORTED_GROUP, /* Unsupported attributes group */ IPP_TAG_SUBSCRIPTION, /* Subscription group */ IPP_TAG_EVENT_NOTIFICATION, /* Event group */ IPP_TAG_RESOURCE, /* Resource group */ IPP_TAG_DOCUMENT, /* Document group */ IPP_TAG_SYSTEM, /* System group */ IPP_TAG_UNSUPPORTED_VALUE = 0x10, /* Unsupported value */ IPP_TAG_DEFAULT, /* Default value */ IPP_TAG_UNKNOWN, /* Unknown value */ IPP_TAG_NOVALUE, /* No-value value */ IPP_TAG_NOTSETTABLE = 0x15, /* Not-settable value */ IPP_TAG_DELETEATTR, /* Delete-attribute value */ IPP_TAG_ADMINDEFINE, /* Admin-defined value */ IPP_TAG_INTEGER = 0x21, /* Integer value */ IPP_TAG_BOOLEAN, /* Boolean value */ IPP_TAG_ENUM, /* Enumeration value */ IPP_TAG_STRING = 0x30, /* Octet string value */ IPP_TAG_DATE, /* Date/time value */ IPP_TAG_RESOLUTION, /* Resolution value */ IPP_TAG_RANGE, /* Range value */ IPP_TAG_BEGIN_COLLECTION, /* Beginning of collection value @exclude all@ */ IPP_TAG_TEXTLANG, /* Text-with-language value */ IPP_TAG_NAMELANG, /* Name-with-language value */ IPP_TAG_END_COLLECTION, /* End of collection value @exclude all@ */ IPP_TAG_TEXT = 0x41, /* Text value */ IPP_TAG_NAME, /* Name value */ IPP_TAG_RESERVED_STRING, /* Reserved for future string value @private@ */ IPP_TAG_KEYWORD, /* Keyword value */ IPP_TAG_URI, /* URI value */ IPP_TAG_URISCHEME, /* URI scheme value */ IPP_TAG_CHARSET, /* Character set value */ IPP_TAG_LANGUAGE, /* Language value */ IPP_TAG_MIMETYPE, /* MIME media type value */ IPP_TAG_MEMBERNAME, /* Collection member name value @exclude all@ */ IPP_TAG_EXTENSION = 0x7f, /* Extension point for 32-bit tags @exclude all@ */ IPP_TAG_CUPS_MASK = 0x7fffffff, /* Mask for copied attribute values @private@ */ /* The following expression is used to avoid compiler warnings with +/-0x80000000 */ IPP_TAG_CUPS_CONST = -0x7fffffff-1 /* Bitflag for copied/const attribute values @private@ */ # ifndef _CUPS_NO_DEPRECATED # define IPP_TAG_MASK IPP_TAG_CUPS_MASK # define IPP_TAG_COPY IPP_TAG_CUPS_CONST # endif /* !_CUPS_NO_DEPRECATED */ } ipp_tag_t; typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character @exclude all@ ****/ typedef struct _ipp_s ipp_t; /**** IPP request/response data ****/ typedef struct _ipp_attribute_s ipp_attribute_t; /**** IPP attribute ****/ /**** New in CUPS 1.2/macOS 10.5 ****/ typedef ssize_t (*ipp_iocb_t)(void *context, ipp_uchar_t *buffer, size_t bytes); /**** ippReadIO/ippWriteIO callback function @since CUPS 1.2/macOS 10.5@ ****/ /**** New in CUPS 1.6/macOS 10.8 ****/ typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr); /**** ippCopyAttributes callback function @since CUPS 1.6/macOS 10.8 ****/ /* * Prototypes... */ extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int value) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const int *values) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *value) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const char *language, const char * const *values) _CUPS_PUBLIC; extern time_t ippDateToTime(const ipp_uchar_t *date) _CUPS_PUBLIC; extern void ippDelete(ipp_t *ipp) _CUPS_PUBLIC; extern const char *ippErrorString(ipp_status_t error) _CUPS_PUBLIC; extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t value_tag) _CUPS_PUBLIC; extern ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, ipp_tag_t value_tag) _CUPS_PUBLIC; extern size_t ippLength(ipp_t *ipp) _CUPS_PUBLIC; extern ipp_t *ippNew(void) _CUPS_PUBLIC; extern ipp_state_t ippRead(http_t *http, ipp_t *ipp) _CUPS_PUBLIC; extern const ipp_uchar_t *ippTimeToDate(time_t t) _CUPS_PUBLIC; extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp) _CUPS_PUBLIC; extern int ippPort(void) _CUPS_PUBLIC; extern void ippSetPort(int p) _CUPS_PUBLIC; /**** New in CUPS 1.1.19 ****/ extern ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_t *value) _CUPS_API_1_1_19; extern ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const ipp_t **values) _CUPS_API_1_1_19; extern void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr) _CUPS_API_1_1_19; extern ipp_state_t ippReadFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; extern ipp_state_t ippWriteFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; /**** New in CUPS 1.2/macOS 10.5 ****/ extern ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, const char *name, const void *data, int datalen) _CUPS_API_1_2; extern ipp_status_t ippErrorValue(const char *name) _CUPS_API_1_2; extern ipp_t *ippNewRequest(ipp_op_t op) _CUPS_API_1_2; extern const char *ippOpString(ipp_op_t op) _CUPS_API_1_2; extern ipp_op_t ippOpValue(const char *name) _CUPS_API_1_2; extern ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; extern ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; /**** New in CUPS 1.4/macOS 10.6 ****/ extern const char *ippTagString(ipp_tag_t tag) _CUPS_API_1_4; extern ipp_tag_t ippTagValue(const char *name) _CUPS_API_1_4; /**** New in CUPS 1.6/macOS 10.8 ****/ extern ipp_attribute_t *ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name) _CUPS_API_1_6; extern size_t ippAttributeString(ipp_attribute_t *attr, char *buffer, size_t bufsize) _CUPS_API_1_6; extern ipp_attribute_t *ippCopyAttribute(ipp_t *dst, ipp_attribute_t *attr, int quickcopy) _CUPS_API_1_6; extern int ippCopyAttributes(ipp_t *dst, ipp_t *src, int quickcopy, ipp_copycb_t cb, void *context) _CUPS_API_1_6; extern int ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr, int element, int count) _CUPS_API_1_6; extern const char *ippEnumString(const char *attrname, int enumvalue) _CUPS_API_1_6; extern int ippEnumValue(const char *attrname, const char *enumstring) _CUPS_API_1_6; extern ipp_attribute_t *ippFirstAttribute(ipp_t *ipp) _CUPS_API_1_6; extern int ippGetBoolean(ipp_attribute_t *attr, int element) _CUPS_API_1_6; extern ipp_t *ippGetCollection(ipp_attribute_t *attr, int element) _CUPS_API_1_6; extern int ippGetCount(ipp_attribute_t *attr) _CUPS_API_1_6; extern const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element) _CUPS_API_1_6; extern ipp_tag_t ippGetGroupTag(ipp_attribute_t *attr) _CUPS_API_1_6; extern int ippGetInteger(ipp_attribute_t *attr, int element) _CUPS_API_1_6; extern const char *ippGetName(ipp_attribute_t *attr) _CUPS_API_1_6; extern ipp_op_t ippGetOperation(ipp_t *ipp) _CUPS_API_1_6; extern int ippGetRange(ipp_attribute_t *attr, int element, int *upper) _CUPS_API_1_6; extern int ippGetRequestId(ipp_t *ipp) _CUPS_API_1_6; extern int ippGetResolution(ipp_attribute_t *attr, int element, int *yres, ipp_res_t *units) _CUPS_API_1_6; extern ipp_state_t ippGetState(ipp_t *ipp) _CUPS_API_1_6; extern ipp_status_t ippGetStatusCode(ipp_t *ipp) _CUPS_API_1_6; extern const char *ippGetString(ipp_attribute_t *attr, int element, const char **language) _CUPS_API_1_6; extern ipp_tag_t ippGetValueTag(ipp_attribute_t *attr) _CUPS_API_1_6; extern int ippGetVersion(ipp_t *ipp, int *minor) _CUPS_API_1_6; extern ipp_attribute_t *ippNextAttribute(ipp_t *ipp) _CUPS_API_1_6; extern int ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr, int element, int boolvalue) _CUPS_API_1_6; extern int ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_t *colvalue) _CUPS_API_1_6; extern int ippSetDate(ipp_t *ipp, ipp_attribute_t **attr, int element, const ipp_uchar_t *datevalue) _CUPS_API_1_6; extern int ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t group_tag) _CUPS_API_1_6; extern int ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr, int element, int intvalue) _CUPS_API_1_6; extern int ippSetName(ipp_t *ipp, ipp_attribute_t **attr, const char *name) _CUPS_API_1_6; extern int ippSetOperation(ipp_t *ipp, ipp_op_t op) _CUPS_API_1_6; extern int ippSetRange(ipp_t *ipp, ipp_attribute_t **attr, int element, int lowervalue, int uppervalue) _CUPS_API_1_6; extern int ippSetRequestId(ipp_t *ipp, int request_id) _CUPS_API_1_6; extern int ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_res_t unitsvalue, int xresvalue, int yresvalue) _CUPS_API_1_6; extern int ippSetState(ipp_t *ipp, ipp_state_t state) _CUPS_API_1_6; extern int ippSetStatusCode(ipp_t *ipp, ipp_status_t status) _CUPS_API_1_6; extern int ippSetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *strvalue) _CUPS_API_1_6; extern int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t value_tag) _CUPS_API_1_6; extern int ippSetVersion(ipp_t *ipp, int major, int minor) _CUPS_API_1_6; /**** New in CUPS 1.7 ****/ extern ipp_attribute_t *ippAddStringf(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, ...) _CUPS_API_1_7; extern ipp_attribute_t *ippAddStringfv(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, va_list ap) _CUPS_API_1_7; extern int ippContainsInteger(ipp_attribute_t *attr, int value) _CUPS_API_1_7; extern int ippContainsString(ipp_attribute_t *attr, const char *value) _CUPS_API_1_7; extern cups_array_t *ippCreateRequestedArray(ipp_t *request) _CUPS_API_1_7; extern void *ippGetOctetString(ipp_attribute_t *attr, int element, int *datalen) _CUPS_API_1_7; extern ipp_t *ippNewResponse(ipp_t *request) _CUPS_API_1_7; extern int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const void *data, int datalen) _CUPS_API_1_7; extern int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, ...) _CUPS_API_1_7; extern int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, va_list ap) _CUPS_API_1_7; extern int ippValidateAttribute(ipp_attribute_t *attr) _CUPS_API_1_7; extern int ippValidateAttributes(ipp_t *ipp) _CUPS_API_1_7; /**** New in CUPS 2.0 ****/ extern const char *ippStateString(ipp_state_t state) _CUPS_API_2_0; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_IPP_H_ */ cups-2.3.1/cups/test.ppd000664 000765 000024 00000023550 13574721672 015242 0ustar00mikestaff000000 000000 *PPD-Adobe: "4.3" *% *% Test PPD file for CUPS. *% *% This file is used to test the CUPS PPD API functions and cannot be *% used with any known printers. Look on the CUPS web site for working PPD *% files. *% *% If you are a PPD file developer, consider using the PPD compiler (ppdc) *% to create your PPD files - not only will it save you time, it produces *% consistently high-quality files. *% *% Copyright (c) 2007-2018 by Apple Inc. *% Copyright (c) 2002-2006 by Easy Software Products. *% *% Licensed under Apache License v2.0. See the file "LICENSE" for more *% information. *FormatVersion: "4.3" *FileVersion: "2.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "TEST.PPD" *Manufacturer: "Apple" *Product: "(Test)" *cupsVersion: 2.3 *ModelName: "Test" *ShortNickName: "Test" *NickName: "Test for CUPS" *PSVersion: "(3010.000) 0" *LanguageLevel: "3" *ColorDevice: True *DefaultColorSpace: RGB *FileSystem: False *Throughput: "1" *LandscapeOrientation: Plus90 *TTRasterizer: Type42 *cupsFilter: "application/vnd.cups-raster 0 -" *RequiresPageRegion All: True *% These constraints are used to test ppdConflicts() and cupsResolveConflicts() *UIConstraints: *PageSize Letter *InputSlot Envelope *UIConstraints: *InputSlot Envelope *PageSize Letter *UIConstraints: *PageRegion Letter *InputSlot Envelope *UIConstraints: *InputSlot Envelope *PageRegion Letter *% These constraints are used to test ppdInstallableConflict() *UIConstraints: "*Duplex *InstalledDuplexer False" *UIConstraints: "*InstalledDuplexer False *Duplex" *% These attributes test ppdFindAttr/ppdFindNext... *cupsTest Foo/I Love Foo: "" *cupsTest Bar/I Love Bar: "" *% For PageSize, we have put all of the translations in-line... *OpenUI *PageSize/Page Size: PickOne *fr.Translation PageSize/French Page Size: "" *fr_CA.Translation PageSize/French Canadian Page Size: "" *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: Letter *PageSize Letter/US Letter: "PageSize=Letter" *fr.PageSize Letter/French US Letter: "" *fr_CA.PageSize Letter/French Canadian US Letter: "" *PageSize Letter.Banner/US Letter Banner: "PageSize=Letter.Banner" *fr.PageSize Letter.Banner/French US Letter Banner: "" *fr_CA.PageSize Letter.Banner/French Canadian US Letter Banner: "" *PageSize Letter.Fullbleed/US Letter Borderless: "PageSize=Letter.Fullbleed" *fr.PageSize Letter.Fullbleed/French US Letter Borderless: "" *fr_CA.PageSize Letter.Fullbleed/French Canadian US Letter Borderless: "" *PageSize A4/A4: "PageSize=A4" *fr.PageSize A4/French A4: "" *fr_CA.PageSize A4/French Canadian A4: "" *PageSize Env10/#10 Envelope: "PageSize=Env10" *fr.PageSize Env10/French #10 Envelope: "" *fr_CA.PageSize Env10/French Canadian #10 Envelope: "" *CloseUI: *PageSize *% For PageRegion, we have separated the translations... *OpenUI *PageRegion/Page Region: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: Letter *PageRegion Letter/US Letter: "PageRegion=Letter" *PageRegion Letter.Banner/US Letter Banner: "PageRegion=Letter.Fullbleed" *PageRegion Letter.Fullbleed/US Letter Borderless: "PageRegion=Letter.Fullbleed" *PageRegion A4/A4: "PageRegion=A4" *PageRegion Env10/#10 Envelope: "PageRegion=Env10" *CloseUI: *PageRegion *fr.Translation PageRegion/French Page Region: "" *fr.PageRegion Letter/French US Letter: "" *fr.PageRegion Letter.Banner/French US Letter Banner: "" *fr.PageRegion Letter.Fullbleed/French US Letter Borderless: "" *fr.PageRegion A4/French A4: "" *fr.PageRegion Env10/French #10 Envelope: "" *fr_CA.Translation PageRegion/French Canadian Page Region: "" *fr_CA.PageRegion Letter/French Canadian US Letter: "" *fr_CA.PageRegion Letter.Banner/French Canadian US Letter Banner: "" *fr_CA.PageRegion Letter.Fullbleed/French Canadian US Letter Borderless: "" *fr_CA.PageRegion A4/French Canadian A4: "" *fr_CA.PageRegion Env10/French Canadian #10 Envelope: "" *DefaultImageableArea: Letter *ImageableArea Letter: "18 36 594 756" *ImageableArea Letter.Banner: "18 0 594 792" *ImageableArea Letter.Fullbleed: "0 0 612 792" *ImageableArea A4: "18 36 577 806" *ImageableArea Env10: "18 36 279 648" *DefaultPaperDimension: Letter *PaperDimension Letter: "612 792" *PaperDimension Letter.Banner: "612 792" *PaperDimension Letter.Fullbleed: "612 792" *PaperDimension A4: "595 842" *PaperDimension Env10: "297 684" *% Custom page size support *HWMargins: 0 0 0 0 *NonUIOrderDependency: 100 AnySetup *CustomPageSize True *CustomPageSize True/Custom Page Size: "PageSize=Custom" *ParamCustomPageSize Width: 1 points 36 1080 *ParamCustomPageSize Height: 2 points 36 86400 *ParamCustomPageSize WidthOffset/Width Offset: 3 points 0 0 *ParamCustomPageSize HeightOffset/Height Offset: 4 points 0 0 *ParamCustomPageSize Orientation: 5 int 0 0 *OpenUI *InputSlot/Input Slot: PickOne *OrderDependency: 20 AnySetup *InputSlot *DefaultInputSlot: Tray *InputSlot Tray/Tray: "InputSlot=Tray" *InputSlot Manual/Manual Feed: "InputSlot=Manual" *InputSlot Envelope/Envelope Feed: "InputSlot=Envelope" *CloseUI: *InputSlot *OpenUI *MediaType/Media Type: PickOne *OrderDependency: 25 AnySetup *MediaType *DefaultMediaType: Plain *MediaType Plain/Plain Paper: "MediaType=Plain" *MediaType Matte/Matte Photo: "MediaType=Matte" *MediaType Glossy/Glossy Photo: "MediaType=Glossy" *MediaType Transparency/Transparency Film: "MediaType=Transparency" *CloseUI: *MediaType *OpenUI *OutputBin/Output Tray: PickOne *OrderDependency: 25 AnySetup *OutputBin *DefaultOutputBin: Tray1 *OutputBin Auto/Automatic Tray: "OutputBin=Auto" *OutputBin Tray1/Tray 1: "OutputBin=Tray1" *OutputBin Tray2/Tray 2: "OutputBin=Tray2" *OutputBin MainTray/Main Tray: "OutputBin=MainTray" *CloseUI: *OutputBin *OpenUI *Duplex/2-Sided Printing: PickOne *OrderDependency: 10 DocumentSetup *Duplex *DefaultDuplex: None *Duplex None/Off: "Duplex=None" *Duplex DuplexNoTumble/Long Edge: "Duplex=DuplexNoTumble" *Duplex DuplexTumble/Short Edge: "Duplex=DuplexTumble" *CloseUI: *Duplex *% Installable option... *OpenGroup: InstallableOptions/Installable Options *OpenUI InstalledDuplexer/Duplexer Installed: Boolean *DefaultInstalledDuplexer: False *InstalledDuplexer False: "" *InstalledDuplexer True: "" *CloseUI: *InstalledDuplexer *CloseGroup: InstallableOptions *% Custom options... *OpenGroup: Extended/Extended Options *OpenUI IntOption/Integer: PickOne *OrderDependency: 30 AnySetup *IntOption *DefaultIntOption: None *IntOption None: "" *IntOption 1: "IntOption=1" *IntOption 2: "IntOption=2" *IntOption 3: "IntOption=3" *CloseUI: *IntOption *CustomIntOption True/Custom Integer: "IntOption=Custom" *ParamCustomIntOption Integer: 1 int -100 100 *OpenUI StringOption/String: PickOne *OrderDependency: 40 AnySetup *StringOption *DefaultStringOption: None *StringOption None: "" *StringOption foo: "StringOption=foo" *StringOption bar: "StringOption=bar" *CloseUI: *StringOption *CustomStringOption True/Custom String: "StringOption=Custom" *ParamCustomStringOption String1: 2 string 1 10 *ParamCustomStringOption String2: 1 string 1 10 *CloseGroup: Extended *% IPP reasons for ppdLocalizeIPPReason tests *cupsIPPReason foo/Foo Reason: "http://foo/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/foo/bar.html" *End *fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long%20 text:Foo%20Reason http://foo/fr/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/fr/foo/bar.html" *End *zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201%20 text:Foo%20Reason http://foo/zh_TW/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/zh_TW/foo/bar.html" *End *zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202%20 text:Foo%20Reason http://foo/zh/bar.html help:anchor='foo'%20bookID=Vendor%20Help /help/zh/foo/bar.html" *End *% Marker names for ppdLocalizeMarkerName tests *cupsMarkerName cyan/Cyan Toner: "" *fr.cupsMarkerName cyan/La Toner Cyan: "" *zh_TW.cupsMarkerName cyan/Number 1 Cyan Toner: "" *zh.cupsMarkerName cyan/Number 2 Cyan Toner: "" *DefaultFont: Courier *Font AvantGarde-Book: Standard "(001.006S)" Standard ROM *Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM *Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM *Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM *Font Bookman-Demi: Standard "(001.004S)" Standard ROM *Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM *Font Bookman-Light: Standard "(001.004S)" Standard ROM *Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM *Font Courier: Standard "(002.004S)" Standard ROM *Font Courier-Bold: Standard "(002.004S)" Standard ROM *Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM *Font Courier-Oblique: Standard "(002.004S)" Standard ROM *Font Helvetica: Standard "(001.006S)" Standard ROM *Font Helvetica-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM *Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM *Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM *Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM *Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM *Font Palatino-Bold: Standard "(001.005S)" Standard ROM *Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM *Font Palatino-Italic: Standard "(001.005S)" Standard ROM *Font Palatino-Roman: Standard "(001.005S)" Standard ROM *Font Symbol: Special "(001.007S)" Special ROM *Font Times-Bold: Standard "(001.007S)" Standard ROM *Font Times-BoldItalic: Standard "(001.009S)" Standard ROM *Font Times-Italic: Standard "(001.007S)" Standard ROM *Font Times-Roman: Standard "(001.007S)" Standard ROM *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM cups-2.3.1/cups/api-raster.header000664 000765 000024 00000001200 13574721672 016763 0ustar00mikestaff000000 000000

Raster API

Header cups/raster.h
Library -lcups
See Also Programming: CUPS Programming Manual
Programming: PPD API
References: CUPS PPD Specification
cups-2.3.1/cups/testi18n.c000664 000765 000024 00000033706 13574721672 015405 0ustar00mikestaff000000 000000 /* * Internationalization test for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "string-private.h" #include "language-private.h" #include #include #include /* * Local globals... */ static const char * const lang_encodings[] = { /* Encoding strings */ "us-ascii", "iso-8859-1", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-9", "iso-8859-10", "utf-8", "iso-8859-13", "iso-8859-14", "iso-8859-15", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "koi8-r", "koi8-u", "iso-8859-11", "iso-8859-16", "mac-roman", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "windows-932", "windows-936", "windows-949", "windows-950", "windows-1361", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "euc-cn", "euc-jp", "euc-kr", "euc-tw", "jis-x0213" }; /* * Local functions... */ static void print_utf8(const char *msg, const cups_utf8_t *src); /* * 'main()' - Main entry for internationalization test module. */ int /* O - Exit code */ main(int argc, /* I - Argument Count */ char *argv[]) /* I - Arguments */ { FILE *fp; /* File pointer */ int count; /* File line counter */ int status, /* Status of current test */ errors; /* Error count */ char line[1024]; /* File line source string */ int len; /* Length (count) of string */ char legsrc[1024], /* Legacy source string */ legdest[1024], /* Legacy destination string */ *legptr; /* Pointer into legacy string */ cups_utf8_t utf8latin[] = /* UTF-8 Latin-1 source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; /* "A != ." - use ISO 8859-1 */ cups_utf8_t utf8repla[] = /* UTF-8 Latin-1 replacement */ { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; /* "A ." */ cups_utf8_t utf8greek[] = /* UTF-8 Greek source string */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 }; /* "A != ." - use ISO 8859-7 */ cups_utf8_t utf8japan[] = /* UTF-8 Japanese source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 }; /* "A != ." - use Windows 932 or EUC-JP */ cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 }; /* "A != ." - use Windows 950 (Big5) or EUC-TW */ cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */ cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */ if (argc > 1) { int i; /* Looping var */ cups_encoding_t encoding; /* Source encoding */ if (argc != 3) { puts("Usage: ./testi18n [filename charset]"); return (1); } if ((fp = fopen(argv[1], "rb")) == NULL) { perror(argv[1]); return (1); } for (i = 0, encoding = CUPS_AUTO_ENCODING; i < (int)(sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++) if (!_cups_strcasecmp(lang_encodings[i], argv[2])) { encoding = (cups_encoding_t)i; break; } if (encoding == CUPS_AUTO_ENCODING) { fprintf(stderr, "%s: Unknown character set!\n", argv[2]); return (1); } while (fgets(line, sizeof(line), fp)) { if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0) { fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line); return (1); } fputs((char *)utf8dest, stdout); } fclose(fp); return (0); } /* * Start with some conversion tests from a UTF-8 test file. */ errors = 0; if ((fp = fopen("utf8demo.txt", "rb")) == NULL) { perror("utf8demo.txt"); return (1); } /* * cupsUTF8ToUTF32 */ fputs("cupsUTF8ToUTF32 of utfdemo.txt: ", stdout); for (count = 0, status = 0; fgets(line, sizeof(line), fp);) { count ++; if (cupsUTF8ToUTF32(utf32dest, (cups_utf8_t *)line, 1024) < 0) { printf("FAIL (UTF-8 to UTF-32 on line %d)\n", count); errors ++; status = 1; break; } } if (!status) puts("PASS"); /* * cupsUTF8ToCharset(CUPS_EUC_JP) */ fputs("cupsUTF8ToCharset(CUPS_EUC_JP) of utfdemo.txt: ", stdout); rewind(fp); for (count = 0, status = 0; fgets(line, sizeof(line), fp);) { count ++; len = cupsUTF8ToCharset(legdest, (cups_utf8_t *)line, 1024, CUPS_EUC_JP); if (len < 0) { printf("FAIL (UTF-8 to EUC-JP on line %d)\n", count); errors ++; status = 1; break; } } if (!status) puts("PASS"); fclose(fp); /* * Test UTF-8 to legacy charset (ISO 8859-1)... */ fputs("cupsUTF8ToCharset(CUPS_ISO8859_1): ", stdout); legdest[0] = 0; len = cupsUTF8ToCharset(legdest, utf8latin, 1024, CUPS_ISO8859_1); if (len < 0) { printf("FAIL (len=%d)\n", len); errors ++; } else puts("PASS"); /* * cupsCharsetToUTF8 */ fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1); if ((size_t)len != strlen((char *)utf8latin)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin)); print_utf8(" utf8latin", utf8latin); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8latin, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8latin", utf8latin); print_utf8(" utf8dest", utf8dest); errors ++; } else if (cupsUTF8ToCharset(legdest, utf8repla, 1024, CUPS_ISO8859_1) < 0) { puts("FAIL (replacement characters do not work!)"); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (ISO 8859-7)... */ fputs("cupsUTF8ToCharset(CUPS_ISO8859_7): ", stdout); if (cupsUTF8ToCharset(legdest, utf8greek, 1024, CUPS_ISO8859_7) < 0) { puts("FAIL"); errors ++; } else { for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); if (*legptr) { puts("FAIL (unknown character)"); errors ++; } else puts("PASS"); } fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7); if ((size_t)len != strlen((char *)utf8greek)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek)); print_utf8(" utf8greek", utf8greek); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8greek, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8greek", utf8greek); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (Windows 932)... */ fputs("cupsUTF8ToCharset(CUPS_WINDOWS_932): ", stdout); if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_WINDOWS_932) < 0) { puts("FAIL"); errors ++; } else { for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); if (*legptr) { puts("FAIL (unknown character)"); errors ++; } else puts("PASS"); } fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932); if ((size_t)len != strlen((char *)utf8japan)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan)); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8japan, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (EUC-JP)... */ fputs("cupsUTF8ToCharset(CUPS_EUC_JP): ", stdout); if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_EUC_JP) < 0) { puts("FAIL"); errors ++; } else { for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); if (*legptr) { puts("FAIL (unknown character)"); errors ++; } else puts("PASS"); } #ifndef __linux fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP); if ((size_t)len != strlen((char *)utf8japan)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan)); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8japan, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); #endif /* !__linux */ /* * Test UTF-8 to/from legacy charset (Windows 950)... */ fputs("cupsUTF8ToCharset(CUPS_WINDOWS_950): ", stdout); if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_WINDOWS_950) < 0) { puts("FAIL"); errors ++; } else { for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); if (*legptr) { puts("FAIL (unknown character)"); errors ++; } else puts("PASS"); } fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950); if ((size_t)len != strlen((char *)utf8taiwan)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan)); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8taiwan, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (EUC-TW)... */ fputs("cupsUTF8ToCharset(CUPS_EUC_TW): ", stdout); if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_EUC_TW) < 0) { puts("FAIL"); errors ++; } else { for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); if (*legptr) { puts("FAIL (unknown character)"); errors ++; } else puts("PASS"); } fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW); if ((size_t)len != strlen((char *)utf8taiwan)) { printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan)); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else if (memcmp(utf8taiwan, utf8dest, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); #if 0 /* * Test UTF-8 (16-bit) to UTF-32 (w/ BOM)... */ if (verbose) printf("\ntesti18n: Testing UTF-8 to UTF-32 (w/ BOM)...\n"); len = cupsUTF8ToUTF32(utf32dest, utf8good, 1024); if (len < 0) return (1); if (verbose) { print_utf8(" utf8good ", utf8good); print_utf32(" utf32dest", utf32dest); } memcpy(utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t)); len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024); if (len < 0) return (1); if (len != strlen ((char *) utf8good)) return (1); if (memcmp(utf8good, utf8dest, len) != 0) return (1); /* * Test invalid UTF-8 (16-bit) to UTF-32 (w/ BOM)... */ if (verbose) printf("\ntesti18n: Testing UTF-8 bad 16-bit source string...\n"); len = cupsUTF8ToUTF32(utf32dest, utf8bad, 1024); if (len >= 0) return (1); if (verbose) print_utf8(" utf8bad ", utf8bad); /* * Test _cupsCharmapFlush()... */ if (verbose) printf("\ntesti18n: Testing _cupsCharmapFlush()...\n"); _cupsCharmapFlush(); return (0); #endif /* 0 */ return (errors > 0); } /* * 'print_utf8()' - Print UTF-8 string with (optional) message. */ static void print_utf8(const char *msg, /* I - Message String */ const cups_utf8_t *src) /* I - UTF-8 Source String */ { const char *prefix; /* Prefix string */ if (msg) printf("%s:", msg); for (prefix = " "; *src; src ++) { printf("%s%02x", prefix, *src); if ((src[0] & 0x80) && (src[1] & 0x80)) prefix = ""; else prefix = " "; } putchar('\n'); } cups-2.3.1/cups/snmp.c000664 000765 000024 00000121167 13574721672 014702 0ustar00mikestaff000000 000000 /* * SNMP functions for CUPS. * * 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 * information. */ /* * Include necessary headers. */ #include "cups-private.h" #include "snmp-private.h" #include "debug-internal.h" #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ /* * Local functions... */ static void asn1_debug(const char *prefix, unsigned char *buffer, size_t len, int indent); static int asn1_decode_snmp(unsigned char *buffer, size_t len, cups_snmp_t *packet); static int asn1_encode_snmp(unsigned char *buffer, size_t len, cups_snmp_t *packet); static int asn1_get_integer(unsigned char **buffer, unsigned char *bufend, unsigned length); static int asn1_get_oid(unsigned char **buffer, unsigned char *bufend, unsigned length, int *oid, int oidsize); static int asn1_get_packed(unsigned char **buffer, unsigned char *bufend); static char *asn1_get_string(unsigned char **buffer, unsigned char *bufend, unsigned length, char *string, size_t strsize); static unsigned asn1_get_length(unsigned char **buffer, unsigned char *bufend); static int asn1_get_type(unsigned char **buffer, unsigned char *bufend); static void asn1_set_integer(unsigned char **buffer, int integer); static void asn1_set_length(unsigned char **buffer, unsigned length); static void asn1_set_oid(unsigned char **buffer, const int *oid); static void asn1_set_packed(unsigned char **buffer, int integer); static unsigned asn1_size_integer(int integer); static unsigned asn1_size_length(unsigned length); static unsigned asn1_size_oid(const int *oid); static unsigned asn1_size_packed(int integer); static void snmp_set_error(cups_snmp_t *packet, const char *message); /* * '_cupsSNMPClose()' - Close a SNMP socket. */ void _cupsSNMPClose(int fd) /* I - SNMP socket file descriptor */ { DEBUG_printf(("4_cupsSNMPClose(fd=%d)", fd)); httpAddrClose(NULL, fd); } /* * '_cupsSNMPCopyOID()' - Copy an OID. * * The array pointed to by "src" is terminated by the value -1. */ int * /* O - New OID */ _cupsSNMPCopyOID(int *dst, /* I - Destination OID */ const int *src, /* I - Source OID */ int dstsize) /* I - Number of integers in dst */ { int i; /* Looping var */ DEBUG_printf(("4_cupsSNMPCopyOID(dst=%p, src=%p, dstsize=%d)", dst, src, dstsize)); for (i = 0, dstsize --; src[i] >= 0 && i < dstsize; i ++) dst[i] = src[i]; dst[i] = -1; return (dst); } /* * '_cupsSNMPDefaultCommunity()' - Get the default SNMP community name. * * The default community name is the first community name found in the * snmp.conf file. If no community name is defined there, "public" is used. */ const char * /* O - Default community name */ _cupsSNMPDefaultCommunity(void) { cups_file_t *fp; /* snmp.conf file */ char line[1024], /* Line from file */ *value; /* Value from file */ int linenum; /* Line number in file */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ DEBUG_puts("4_cupsSNMPDefaultCommunity()"); if (!cg->snmp_community[0]) { strlcpy(cg->snmp_community, "public", sizeof(cg->snmp_community)); snprintf(line, sizeof(line), "%s/snmp.conf", cg->cups_serverroot); if ((fp = cupsFileOpen(line, "r")) != NULL) { linenum = 0; while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) if (!_cups_strcasecmp(line, "Community")) { if (value) strlcpy(cg->snmp_community, value, sizeof(cg->snmp_community)); else cg->snmp_community[0] = '\0'; break; } cupsFileClose(fp); } } DEBUG_printf(("5_cupsSNMPDefaultCommunity: Returning \"%s\"", cg->snmp_community)); return (cg->snmp_community); } /* * '_cupsSNMPIsOID()' - Test whether a SNMP response contains the specified OID. * * The array pointed to by "oid" is terminated by the value -1. */ int /* O - 1 if equal, 0 if not equal */ _cupsSNMPIsOID(cups_snmp_t *packet, /* I - Response packet */ const int *oid) /* I - OID */ { int i; /* Looping var */ /* * Range check input... */ DEBUG_printf(("4_cupsSNMPIsOID(packet=%p, oid=%p)", packet, oid)); if (!packet || !oid) { DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); return (0); } /* * Compare OIDs... */ for (i = 0; i < CUPS_SNMP_MAX_OID && oid[i] >= 0 && packet->object_name[i] >= 0; i ++) if (oid[i] != packet->object_name[i]) { DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); return (0); } DEBUG_printf(("5_cupsSNMPIsOID: Returning %d", i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i])); return (i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i]); } /* * '_cupsSNMPIsOIDPrefixed()' - Test whether a SNMP response uses the specified * OID prefix. * * The array pointed to by "prefix" is terminated by the value -1. */ int /* O - 1 if prefixed, 0 if not prefixed */ _cupsSNMPIsOIDPrefixed( cups_snmp_t *packet, /* I - Response packet */ const int *prefix) /* I - OID prefix */ { int i; /* Looping var */ /* * Range check input... */ DEBUG_printf(("4_cupsSNMPIsOIDPrefixed(packet=%p, prefix=%p)", packet, prefix)); if (!packet || !prefix) { DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); return (0); } /* * Compare OIDs... */ for (i = 0; i < CUPS_SNMP_MAX_OID && prefix[i] >= 0 && packet->object_name[i] >= 0; i ++) if (prefix[i] != packet->object_name[i]) { DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); return (0); } DEBUG_printf(("5_cupsSNMPIsOIDPrefixed: Returning %d", i < CUPS_SNMP_MAX_OID)); return (i < CUPS_SNMP_MAX_OID); } /* * '_cupsSNMPOIDToString()' - Convert an OID to a string. */ char * /* O - New string or @code NULL@ on error */ _cupsSNMPOIDToString(const int *src, /* I - OID */ char *dst, /* I - String buffer */ size_t dstsize) /* I - Size of string buffer */ { char *dstptr, /* Pointer into string buffer */ *dstend; /* End of string buffer */ DEBUG_printf(("4_cupsSNMPOIDToString(src=%p, dst=%p, dstsize=" CUPS_LLFMT ")", src, dst, CUPS_LLCAST dstsize)); /* * Range check input... */ if (!src || !dst || dstsize < 4) return (NULL); /* * Loop through the OID array and build a string... */ for (dstptr = dst, dstend = dstptr + dstsize - 1; *src >= 0 && dstptr < dstend; src ++, dstptr += strlen(dstptr)) snprintf(dstptr, (size_t)(dstend - dstptr + 1), ".%d", *src); if (*src >= 0) return (NULL); else return (dst); } /* * '_cupsSNMPOpen()' - Open a SNMP socket. */ int /* O - SNMP socket file descriptor */ _cupsSNMPOpen(int family) /* I - Address family - @code AF_INET@ or @code AF_INET6@ */ { int fd; /* SNMP socket file descriptor */ int val; /* Socket option value */ /* * Create the SNMP socket... */ DEBUG_printf(("4_cupsSNMPOpen(family=%d)", family)); if ((fd = socket(family, SOCK_DGRAM, 0)) < 0) { DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); return (-1); } /* * Set the "broadcast" flag... */ val = 1; if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, CUPS_SOCAST &val, sizeof(val))) { DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); close(fd); return (-1); } DEBUG_printf(("5_cupsSNMPOpen: Returning %d", fd)); return (fd); } /* * '_cupsSNMPRead()' - Read and parse a SNMP response. * * If "timeout" is negative, @code _cupsSNMPRead@ will wait for a response * indefinitely. */ cups_snmp_t * /* O - SNMP packet or @code NULL@ if none */ _cupsSNMPRead(int fd, /* I - SNMP socket file descriptor */ cups_snmp_t *packet, /* I - SNMP packet buffer */ double timeout) /* I - Timeout in seconds */ { unsigned char buffer[CUPS_SNMP_MAX_PACKET]; /* Data packet */ ssize_t bytes; /* Number of bytes received */ socklen_t addrlen; /* Source address length */ http_addr_t address; /* Source address */ /* * Range check input... */ DEBUG_printf(("4_cupsSNMPRead(fd=%d, packet=%p, timeout=%.1f)", fd, packet, timeout)); if (fd < 0 || !packet) { DEBUG_puts("5_cupsSNMPRead: Returning NULL"); return (NULL); } /* * Optionally wait for a response... */ if (timeout >= 0.0) { int ready; /* Data ready on socket? */ #ifdef HAVE_POLL struct pollfd pfd; /* Polled file descriptor */ pfd.fd = fd; pfd.events = POLLIN; while ((ready = poll(&pfd, 1, (int)(timeout * 1000.0))) < 0 && (errno == EINTR || errno == EAGAIN)); #else fd_set input_set; /* select() input set */ struct timeval stimeout; /* select() timeout */ do { FD_ZERO(&input_set); FD_SET(fd, &input_set); stimeout.tv_sec = (int)timeout; stimeout.tv_usec = (int)((timeout - stimeout.tv_sec) * 1000000); ready = select(fd + 1, &input_set, NULL, NULL, &stimeout); } # ifdef _WIN32 while (ready < 0 && WSAGetLastError() == WSAEINTR); # else while (ready < 0 && (errno == EINTR || errno == EAGAIN)); # endif /* _WIN32 */ #endif /* HAVE_POLL */ /* * If we don't have any data ready, return right away... */ if (ready <= 0) { DEBUG_puts("5_cupsSNMPRead: Returning NULL (timeout)"); return (NULL); } } /* * Read the response data... */ addrlen = sizeof(address); if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&address, &addrlen)) < 0) { DEBUG_printf(("5_cupsSNMPRead: Returning NULL (%s)", strerror(errno))); return (NULL); } /* * Look for the response status code in the SNMP message header... */ asn1_debug("DEBUG: IN ", buffer, (size_t)bytes, 0); asn1_decode_snmp(buffer, (size_t)bytes, packet); memcpy(&(packet->address), &address, sizeof(packet->address)); /* * Return decoded data packet... */ DEBUG_puts("5_cupsSNMPRead: Returning packet"); return (packet); } /* * '_cupsSNMPSetDebug()' - Enable/disable debug logging to stderr. */ void _cupsSNMPSetDebug(int level) /* I - 1 to enable debug output, 0 otherwise */ { _cups_globals_t *cg = _cupsGlobals(); /* Global data */ DEBUG_printf(("4_cupsSNMPSetDebug(level=%d)", level)); cg->snmp_debug = level; } /* * '_cupsSNMPStringToOID()' - Convert a numeric OID string to an OID array. * * This function converts a string of the form ".N.N.N.N.N" to the * corresponding OID array terminated by -1. * * @code NULL@ is returned if the array is not large enough or the string is * not a valid OID number. */ int * /* O - Pointer to OID array or @code NULL@ on error */ _cupsSNMPStringToOID(const char *src, /* I - OID string */ int *dst, /* I - OID array */ int dstsize)/* I - Number of integers in OID array */ { int *dstptr, /* Pointer into OID array */ *dstend; /* End of OID array */ DEBUG_printf(("4_cupsSNMPStringToOID(src=\"%s\", dst=%p, dstsize=%d)", src, dst, dstsize)); /* * Range check input... */ if (!src || !dst || dstsize < 2) return (NULL); /* * Skip leading "."... */ if (*src == '.') src ++; /* * Loop to the end of the string... */ for (dstend = dst + dstsize - 1, dstptr = dst, *dstptr = 0; *src && dstptr < dstend; src ++) { if (*src == '.') { dstptr ++; *dstptr = 0; } else if (isdigit(*src & 255)) *dstptr = *dstptr * 10 + *src - '0'; else break; } if (*src) return (NULL); /* * Terminate the end of the OID array and return... */ dstptr[1] = -1; return (dst); } /* * '_cupsSNMPWalk()' - Enumerate a group of OIDs. * * This function queries all of the OIDs with the specified OID prefix, * calling the "cb" function for every response that is received. * * The array pointed to by "prefix" is terminated by the value -1. * * If "timeout" is negative, @code _cupsSNMPWalk@ will wait for a response * indefinitely. */ int /* O - Number of OIDs found or -1 on error */ _cupsSNMPWalk(int fd, /* I - SNMP socket */ http_addr_t *address, /* I - Address to query */ int version, /* I - SNMP version */ const char *community,/* I - Community name */ const int *prefix, /* I - OID prefix */ double timeout, /* I - Timeout for each response in seconds */ cups_snmp_cb_t cb, /* I - Function to call for each response */ void *data) /* I - User data pointer that is passed to the callback function */ { int count = 0; /* Number of OIDs found */ unsigned request_id = 0; /* Current request ID */ cups_snmp_t packet; /* Current response packet */ int lastoid[CUPS_SNMP_MAX_OID]; /* Last OID we got */ /* * Range check input... */ DEBUG_printf(("4_cupsSNMPWalk(fd=%d, address=%p, version=%d, " "community=\"%s\", prefix=%p, timeout=%.1f, cb=%p, data=%p)", fd, address, version, community, prefix, timeout, cb, data)); if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || !prefix || !cb) { DEBUG_puts("5_cupsSNMPWalk: Returning -1"); return (-1); } /* * Copy the OID prefix and then loop until we have no more OIDs... */ _cupsSNMPCopyOID(packet.object_name, prefix, CUPS_SNMP_MAX_OID); lastoid[0] = -1; for (;;) { request_id ++; if (!_cupsSNMPWrite(fd, address, version, community, CUPS_ASN1_GET_NEXT_REQUEST, request_id, packet.object_name)) { DEBUG_puts("5_cupsSNMPWalk: Returning -1"); return (-1); } if (!_cupsSNMPRead(fd, &packet, timeout)) { DEBUG_puts("5_cupsSNMPWalk: Returning -1"); return (-1); } if (!_cupsSNMPIsOIDPrefixed(&packet, prefix) || _cupsSNMPIsOID(&packet, lastoid)) { DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count)); return (count); } if (packet.error || packet.error_status) { DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count > 0 ? count : -1)); return (count > 0 ? count : -1); } _cupsSNMPCopyOID(lastoid, packet.object_name, CUPS_SNMP_MAX_OID); count ++; (*cb)(&packet, data); } } /* * '_cupsSNMPWrite()' - Send an SNMP query packet. * * The array pointed to by "oid" is terminated by the value -1. */ int /* O - 1 on success, 0 on error */ _cupsSNMPWrite( int fd, /* I - SNMP socket */ http_addr_t *address, /* I - Address to send to */ int version, /* I - SNMP version */ const char *community, /* I - Community name */ cups_asn1_t request_type, /* I - Request type */ const unsigned request_id, /* I - Request ID */ const int *oid) /* I - OID */ { int i; /* Looping var */ cups_snmp_t packet; /* SNMP message packet */ unsigned char buffer[CUPS_SNMP_MAX_PACKET]; /* SNMP message buffer */ ssize_t bytes; /* Size of message */ http_addr_t temp; /* Copy of address */ /* * Range check input... */ DEBUG_printf(("4_cupsSNMPWrite(fd=%d, address=%p, version=%d, " "community=\"%s\", request_type=%d, request_id=%u, oid=%p)", fd, address, version, community, request_type, request_id, oid)); if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || (request_type != CUPS_ASN1_GET_REQUEST && request_type != CUPS_ASN1_GET_NEXT_REQUEST) || request_id < 1 || !oid) { DEBUG_puts("5_cupsSNMPWrite: Returning 0 (bad arguments)"); return (0); } /* * Create the SNMP message... */ memset(&packet, 0, sizeof(packet)); packet.version = version; packet.request_type = request_type; packet.request_id = request_id; packet.object_type = CUPS_ASN1_NULL_VALUE; strlcpy(packet.community, community, sizeof(packet.community)); for (i = 0; oid[i] >= 0 && i < (CUPS_SNMP_MAX_OID - 1); i ++) packet.object_name[i] = oid[i]; packet.object_name[i] = -1; if (oid[i] >= 0) { DEBUG_puts("5_cupsSNMPWrite: Returning 0 (OID too big)"); errno = E2BIG; return (0); } bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet); if (bytes < 0) { DEBUG_puts("5_cupsSNMPWrite: Returning 0 (request too big)"); errno = E2BIG; return (0); } asn1_debug("DEBUG: OUT ", buffer, (size_t)bytes, 0); /* * Send the message... */ temp = *address; _httpAddrSetPort(&temp, CUPS_SNMP_PORT); return (sendto(fd, buffer, (size_t)bytes, 0, (void *)&temp, (socklen_t)httpAddrLength(&temp)) == bytes); } /* * 'asn1_debug()' - Decode an ASN1-encoded message. */ static void asn1_debug(const char *prefix, /* I - Prefix string */ unsigned char *buffer, /* I - Buffer */ size_t len, /* I - Length of buffer */ int indent) /* I - Indentation */ { size_t i; /* Looping var */ unsigned char *bufend; /* End of buffer */ int integer; /* Number value */ int oid[CUPS_SNMP_MAX_OID]; /* OID value */ char string[CUPS_SNMP_MAX_STRING]; /* String value */ unsigned char value_type; /* Type of value */ unsigned value_length; /* Length of value */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ #ifdef __clang_analyzer__ /* Suppress bogus clang error */ memset(string, 0, sizeof(string)); #endif /* __clang_analyzer__ */ if (cg->snmp_debug <= 0) return; if (cg->snmp_debug > 1 && indent == 0) { /* * Do a hex dump of the packet... */ size_t j; fprintf(stderr, "%sHex Dump (%d bytes):\n", prefix, (int)len); for (i = 0; i < len; i += 16) { fprintf(stderr, "%s%04x:", prefix, (unsigned)i); for (j = 0; j < 16 && (i + j) < len; j ++) { if (j && !(j & 3)) fprintf(stderr, " %02x", buffer[i + j]); else fprintf(stderr, " %02x", buffer[i + j]); } while (j < 16) { if (j && !(j & 3)) fputs(" ", stderr); else fputs(" ", stderr); j ++; } fputs(" ", stderr); for (j = 0; j < 16 && (i + j) < len; j ++) if (buffer[i + j] < ' ' || buffer[i + j] >= 0x7f) putc('.', stderr); else putc(buffer[i + j], stderr); putc('\n', stderr); } } if (indent == 0) fprintf(stderr, "%sMessage:\n", prefix); bufend = buffer + len; while (buffer < bufend) { /* * Get value type... */ value_type = (unsigned char)asn1_get_type(&buffer, bufend); value_length = asn1_get_length(&buffer, bufend); switch (value_type) { case CUPS_ASN1_BOOLEAN : integer = asn1_get_integer(&buffer, bufend, value_length); fprintf(stderr, "%s%*sBOOLEAN %d bytes %d\n", prefix, indent, "", value_length, integer); break; case CUPS_ASN1_INTEGER : integer = asn1_get_integer(&buffer, bufend, value_length); fprintf(stderr, "%s%*sINTEGER %d bytes %d\n", prefix, indent, "", value_length, integer); break; case CUPS_ASN1_COUNTER : integer = asn1_get_integer(&buffer, bufend, value_length); fprintf(stderr, "%s%*sCOUNTER %d bytes %u\n", prefix, indent, "", value_length, (unsigned)integer); break; case CUPS_ASN1_GAUGE : integer = asn1_get_integer(&buffer, bufend, value_length); fprintf(stderr, "%s%*sGAUGE %d bytes %u\n", prefix, indent, "", value_length, (unsigned)integer); break; case CUPS_ASN1_TIMETICKS : integer = asn1_get_integer(&buffer, bufend, value_length); fprintf(stderr, "%s%*sTIMETICKS %d bytes %u\n", prefix, indent, "", value_length, (unsigned)integer); break; case CUPS_ASN1_OCTET_STRING : fprintf(stderr, "%s%*sOCTET STRING %d bytes \"%s\"\n", prefix, indent, "", value_length, asn1_get_string(&buffer, bufend, value_length, string, sizeof(string))); break; case CUPS_ASN1_HEX_STRING : asn1_get_string(&buffer, bufend, value_length, string, sizeof(string)); fprintf(stderr, "%s%*sHex-STRING %d bytes", prefix, indent, "", value_length); for (i = 0; i < value_length; i ++) fprintf(stderr, " %02X", string[i] & 255); putc('\n', stderr); break; case CUPS_ASN1_NULL_VALUE : fprintf(stderr, "%s%*sNULL VALUE %d bytes\n", prefix, indent, "", value_length); buffer += value_length; break; case CUPS_ASN1_OID : integer = asn1_get_oid(&buffer, bufend, value_length, oid, CUPS_SNMP_MAX_OID); fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "", value_length); for (i = 0; i < (unsigned)integer; i ++) fprintf(stderr, ".%d", oid[i]); putc('\n', stderr); break; case CUPS_ASN1_SEQUENCE : fprintf(stderr, "%s%*sSEQUENCE %d bytes\n", prefix, indent, "", value_length); asn1_debug(prefix, buffer, value_length, indent + 4); buffer += value_length; break; case CUPS_ASN1_GET_NEXT_REQUEST : fprintf(stderr, "%s%*sGet-Next-Request-PDU %d bytes\n", prefix, indent, "", value_length); asn1_debug(prefix, buffer, value_length, indent + 4); buffer += value_length; break; case CUPS_ASN1_GET_REQUEST : fprintf(stderr, "%s%*sGet-Request-PDU %d bytes\n", prefix, indent, "", value_length); asn1_debug(prefix, buffer, value_length, indent + 4); buffer += value_length; break; case CUPS_ASN1_GET_RESPONSE : fprintf(stderr, "%s%*sGet-Response-PDU %d bytes\n", prefix, indent, "", value_length); asn1_debug(prefix, buffer, value_length, indent + 4); buffer += value_length; break; default : fprintf(stderr, "%s%*sUNKNOWN(%x) %d bytes\n", prefix, indent, "", value_type, value_length); buffer += value_length; break; } } } /* * 'asn1_decode_snmp()' - Decode a SNMP packet. */ static int /* O - 0 on success, -1 on error */ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */ size_t len, /* I - Size of buffer */ cups_snmp_t *packet) /* I - SNMP packet */ { unsigned char *bufptr, /* Pointer into the data */ *bufend; /* End of data */ unsigned length; /* Length of value */ /* * Initialize the decoding... */ memset(packet, 0, sizeof(cups_snmp_t)); packet->object_name[0] = -1; bufptr = buffer; bufend = buffer + len; if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) snmp_set_error(packet, _("Packet does not start with SEQUENCE")); else if (asn1_get_length(&bufptr, bufend) == 0) snmp_set_error(packet, _("SEQUENCE uses indefinite length")); else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) snmp_set_error(packet, _("No version number")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("Version uses indefinite length")); else if ((packet->version = asn1_get_integer(&bufptr, bufend, length)) != CUPS_SNMP_VERSION_1) snmp_set_error(packet, _("Bad SNMP version number")); else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OCTET_STRING) snmp_set_error(packet, _("No community name")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("Community name uses indefinite length")); else { asn1_get_string(&bufptr, bufend, length, packet->community, sizeof(packet->community)); if ((packet->request_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend)) != CUPS_ASN1_GET_RESPONSE) snmp_set_error(packet, _("Packet does not contain a Get-Response-PDU")); else if (asn1_get_length(&bufptr, bufend) == 0) snmp_set_error(packet, _("Get-Response-PDU uses indefinite length")); else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) snmp_set_error(packet, _("No request-id")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("request-id uses indefinite length")); else { packet->request_id = (unsigned)asn1_get_integer(&bufptr, bufend, length); if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) snmp_set_error(packet, _("No error-status")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("error-status uses indefinite length")); else { packet->error_status = asn1_get_integer(&bufptr, bufend, length); if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) snmp_set_error(packet, _("No error-index")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("error-index uses indefinite length")); else { packet->error_index = asn1_get_integer(&bufptr, bufend, length); if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) snmp_set_error(packet, _("No variable-bindings SEQUENCE")); else if (asn1_get_length(&bufptr, bufend) == 0) snmp_set_error(packet, _("variable-bindings uses indefinite length")); else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) snmp_set_error(packet, _("No VarBind SEQUENCE")); else if (asn1_get_length(&bufptr, bufend) == 0) snmp_set_error(packet, _("VarBind uses indefinite length")); else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OID) snmp_set_error(packet, _("No name OID")); else if ((length = asn1_get_length(&bufptr, bufend)) == 0) snmp_set_error(packet, _("Name OID uses indefinite length")); else { asn1_get_oid(&bufptr, bufend, length, packet->object_name, CUPS_SNMP_MAX_OID); packet->object_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend); if ((length = asn1_get_length(&bufptr, bufend)) == 0 && packet->object_type != CUPS_ASN1_NULL_VALUE && packet->object_type != CUPS_ASN1_OCTET_STRING) snmp_set_error(packet, _("Value uses indefinite length")); else { switch (packet->object_type) { case CUPS_ASN1_BOOLEAN : packet->object_value.boolean = asn1_get_integer(&bufptr, bufend, length); break; case CUPS_ASN1_INTEGER : packet->object_value.integer = asn1_get_integer(&bufptr, bufend, length); break; case CUPS_ASN1_NULL_VALUE : break; case CUPS_ASN1_OCTET_STRING : case CUPS_ASN1_BIT_STRING : case CUPS_ASN1_HEX_STRING : packet->object_value.string.num_bytes = length; asn1_get_string(&bufptr, bufend, length, (char *)packet->object_value.string.bytes, sizeof(packet->object_value.string.bytes)); break; case CUPS_ASN1_OID : asn1_get_oid(&bufptr, bufend, length, packet->object_value.oid, CUPS_SNMP_MAX_OID); break; case CUPS_ASN1_COUNTER : packet->object_value.counter = asn1_get_integer(&bufptr, bufend, length); break; case CUPS_ASN1_GAUGE : packet->object_value.gauge = (unsigned)asn1_get_integer(&bufptr, bufend, length); break; case CUPS_ASN1_TIMETICKS : packet->object_value.timeticks = (unsigned)asn1_get_integer(&bufptr, bufend, length); break; default : snmp_set_error(packet, _("Unsupported value type")); break; } } } } } } } return (packet->error ? -1 : 0); } /* * 'asn1_encode_snmp()' - Encode a SNMP packet. */ static int /* O - Length on success, -1 on error */ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */ size_t bufsize, /* I - Size of buffer */ cups_snmp_t *packet) /* I - SNMP packet */ { unsigned char *bufptr; /* Pointer into buffer */ unsigned total, /* Total length */ msglen, /* Length of entire message */ commlen, /* Length of community string */ reqlen, /* Length of request */ listlen, /* Length of variable list */ varlen, /* Length of variable */ namelen, /* Length of object name OID */ valuelen; /* Length of object value */ /* * Get the lengths of the community string, OID, and message... */ namelen = asn1_size_oid(packet->object_name); switch (packet->object_type) { case CUPS_ASN1_NULL_VALUE : valuelen = 0; break; case CUPS_ASN1_BOOLEAN : valuelen = asn1_size_integer(packet->object_value.boolean); break; case CUPS_ASN1_INTEGER : valuelen = asn1_size_integer(packet->object_value.integer); break; case CUPS_ASN1_OCTET_STRING : valuelen = packet->object_value.string.num_bytes; break; case CUPS_ASN1_OID : valuelen = asn1_size_oid(packet->object_value.oid); break; default : packet->error = "Unknown object type"; return (-1); } varlen = 1 + asn1_size_length(namelen) + namelen + 1 + asn1_size_length(valuelen) + valuelen; listlen = 1 + asn1_size_length(varlen) + varlen; reqlen = 2 + asn1_size_integer((int)packet->request_id) + 2 + asn1_size_integer(packet->error_status) + 2 + asn1_size_integer(packet->error_index) + 1 + asn1_size_length(listlen) + listlen; commlen = (unsigned)strlen(packet->community); msglen = 2 + asn1_size_integer(packet->version) + 1 + asn1_size_length(commlen) + commlen + 1 + asn1_size_length(reqlen) + reqlen; total = 1 + asn1_size_length(msglen) + msglen; if (total > bufsize) { packet->error = "Message too large for buffer"; return (-1); } /* * Then format the message... */ bufptr = buffer; *bufptr++ = CUPS_ASN1_SEQUENCE; /* SNMPv1 message header */ asn1_set_length(&bufptr, msglen); asn1_set_integer(&bufptr, packet->version); /* version */ *bufptr++ = CUPS_ASN1_OCTET_STRING; /* community */ asn1_set_length(&bufptr, commlen); memcpy(bufptr, packet->community, commlen); bufptr += commlen; *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); asn1_set_integer(&bufptr, packet->error_status); asn1_set_integer(&bufptr, packet->error_index); *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable-bindings */ asn1_set_length(&bufptr, listlen); *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable */ asn1_set_length(&bufptr, varlen); asn1_set_oid(&bufptr, packet->object_name); /* ObjectName */ switch (packet->object_type) { case CUPS_ASN1_NULL_VALUE : *bufptr++ = CUPS_ASN1_NULL_VALUE; /* ObjectValue */ *bufptr++ = 0; /* Length */ break; case CUPS_ASN1_BOOLEAN : asn1_set_integer(&bufptr, packet->object_value.boolean); break; case CUPS_ASN1_INTEGER : asn1_set_integer(&bufptr, packet->object_value.integer); break; case CUPS_ASN1_OCTET_STRING : *bufptr++ = CUPS_ASN1_OCTET_STRING; asn1_set_length(&bufptr, valuelen); memcpy(bufptr, packet->object_value.string.bytes, valuelen); bufptr += valuelen; break; case CUPS_ASN1_OID : asn1_set_oid(&bufptr, packet->object_value.oid); break; default : break; } return ((int)(bufptr - buffer)); } /* * 'asn1_get_integer()' - Get an integer value. */ static int /* O - Integer value */ asn1_get_integer( unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend, /* I - End of buffer */ unsigned length) /* I - Length of value */ { int value; /* Integer value */ if (*buffer >= bufend) return (0); if (length > sizeof(int)) { (*buffer) += length; return (0); } for (value = (**buffer & 0x80) ? ~0 : 0; length > 0 && *buffer < bufend; length --, (*buffer) ++) value = ((value & 0xffffff) << 8) | **buffer; return (value); } /* * 'asn1_get_length()' - Get a value length. */ static unsigned /* O - Length */ asn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend) /* I - End of buffer */ { unsigned length; /* Length */ if (*buffer >= bufend) return (0); length = **buffer; (*buffer) ++; if (length & 128) { int count; /* Number of bytes for length */ if ((count = length & 127) > sizeof(unsigned)) { (*buffer) += count; return (0); } for (length = 0; count > 0 && *buffer < bufend; count --, (*buffer) ++) length = (length << 8) | **buffer; } return (length); } /* * 'asn1_get_oid()' - Get an OID value. */ static int /* O - Number of OIDs */ asn1_get_oid( unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend, /* I - End of buffer */ unsigned length, /* I - Length of value */ int *oid, /* I - OID buffer */ int oidsize) /* I - Size of OID buffer */ { unsigned char *valend; /* End of value */ int *oidptr, /* Current OID */ *oidend; /* End of OID buffer */ int number; /* OID number */ if (*buffer >= bufend) return (0); valend = *buffer + length; oidptr = oid; oidend = oid + oidsize - 1; if (valend > bufend) valend = bufend; number = asn1_get_packed(buffer, bufend); if (number < 80) { *oidptr++ = number / 40; number = number % 40; *oidptr++ = number; } else { *oidptr++ = 2; number -= 80; *oidptr++ = number; } while (*buffer < valend) { number = asn1_get_packed(buffer, bufend); if (oidptr < oidend) *oidptr++ = number; } *oidptr = -1; return ((int)(oidptr - oid)); } /* * 'asn1_get_packed()' - Get a packed integer value. */ static int /* O - Value */ asn1_get_packed( unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend) /* I - End of buffer */ { int value; /* Value */ if (*buffer >= bufend) return (0); value = 0; while (*buffer < bufend && (**buffer & 128)) { value = (value << 7) | (**buffer & 127); (*buffer) ++; } if (*buffer < bufend) { value = (value << 7) | **buffer; (*buffer) ++; } return (value); } /* * 'asn1_get_string()' - Get a string value. */ static char * /* O - String */ asn1_get_string( unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend, /* I - End of buffer */ unsigned length, /* I - Value length */ 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); if (length < strsize) { /* * String is smaller than the buffer... */ if (length > 0) memcpy(string, *buffer, length); string[length] = '\0'; } else { /* * String is larger than the buffer... */ memcpy(string, *buffer, strsize - 1); string[strsize - 1] = '\0'; } if (length > 0) (*buffer) += length; return (string); } /* * 'asn1_get_type()' - Get a value type. */ static int /* O - Type */ asn1_get_type(unsigned char **buffer, /* IO - Pointer in buffer */ unsigned char *bufend) /* I - End of buffer */ { int type; /* Type */ if (*buffer >= bufend) return (0); type = **buffer; (*buffer) ++; if ((type & 31) == 31) type = asn1_get_packed(buffer, bufend); return (type); } /* * 'asn1_set_integer()' - Set an integer value. */ static void asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */ int integer) /* I - Integer value */ { **buffer = CUPS_ASN1_INTEGER; (*buffer) ++; if (integer > 0x7fffff || integer < -0x800000) { **buffer = 4; (*buffer) ++; **buffer = (unsigned char)(integer >> 24); (*buffer) ++; **buffer = (unsigned char)(integer >> 16); (*buffer) ++; **buffer = (unsigned char)(integer >> 8); (*buffer) ++; **buffer = (unsigned char)integer; (*buffer) ++; } else if (integer > 0x7fff || integer < -0x8000) { **buffer = 3; (*buffer) ++; **buffer = (unsigned char)(integer >> 16); (*buffer) ++; **buffer = (unsigned char)(integer >> 8); (*buffer) ++; **buffer = (unsigned char)integer; (*buffer) ++; } else if (integer > 0x7f || integer < -0x80) { **buffer = 2; (*buffer) ++; **buffer = (unsigned char)(integer >> 8); (*buffer) ++; **buffer = (unsigned char)integer; (*buffer) ++; } else { **buffer = 1; (*buffer) ++; **buffer = (unsigned char)integer; (*buffer) ++; } } /* * 'asn1_set_length()' - Set a value length. */ static void asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */ unsigned length) /* I - Length value */ { if (length > 255) { **buffer = 0x82; /* 2-byte length */ (*buffer) ++; **buffer = (unsigned char)(length >> 8); (*buffer) ++; **buffer = (unsigned char)length; (*buffer) ++; } else if (length > 127) { **buffer = 0x81; /* 1-byte length */ (*buffer) ++; **buffer = (unsigned char)length; (*buffer) ++; } else { **buffer = (unsigned char)length; /* Length */ (*buffer) ++; } } /* * 'asn1_set_oid()' - Set an OID value. */ static void asn1_set_oid(unsigned char **buffer, /* IO - Pointer in buffer */ const int *oid) /* I - OID value */ { **buffer = CUPS_ASN1_OID; (*buffer) ++; asn1_set_length(buffer, asn1_size_oid(oid)); if (oid[1] < 0) { asn1_set_packed(buffer, oid[0] * 40); return; } asn1_set_packed(buffer, oid[0] * 40 + oid[1]); for (oid += 2; *oid >= 0; oid ++) asn1_set_packed(buffer, *oid); } /* * 'asn1_set_packed()' - Set a packed integer value. */ static void asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */ int integer) /* I - Integer value */ { if (integer > 0xfffffff) { **buffer = ((integer >> 28) & 0x7f) | 0x80; (*buffer) ++; } if (integer > 0x1fffff) { **buffer = ((integer >> 21) & 0x7f) | 0x80; (*buffer) ++; } if (integer > 0x3fff) { **buffer = ((integer >> 14) & 0x7f) | 0x80; (*buffer) ++; } if (integer > 0x7f) { **buffer = ((integer >> 7) & 0x7f) | 0x80; (*buffer) ++; } **buffer = integer & 0x7f; (*buffer) ++; } /* * 'asn1_size_integer()' - Figure out the number of bytes needed for an * integer value. */ static unsigned /* O - Size in bytes */ asn1_size_integer(int integer) /* I - Integer value */ { if (integer > 0x7fffff || integer < -0x800000) return (4); else if (integer > 0x7fff || integer < -0x8000) return (3); else if (integer > 0x7f || integer < -0x80) return (2); else return (1); } /* * 'asn1_size_length()' - Figure out the number of bytes needed for a * length value. */ static unsigned /* O - Size in bytes */ asn1_size_length(unsigned length) /* I - Length value */ { if (length > 0xff) return (3); else if (length > 0x7f) return (2); else return (1); } /* * 'asn1_size_oid()' - Figure out the number of bytes needed for an * OID value. */ static unsigned /* O - Size in bytes */ asn1_size_oid(const int *oid) /* I - OID value */ { unsigned length; /* Length of value */ if (oid[1] < 0) return (asn1_size_packed(oid[0] * 40)); for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; *oid >= 0; oid ++) length += asn1_size_packed(*oid); return (length); } /* * 'asn1_size_packed()' - Figure out the number of bytes needed for a * packed integer value. */ static unsigned /* O - Size in bytes */ asn1_size_packed(int integer) /* I - Integer value */ { if (integer > 0xfffffff) return (5); else if (integer > 0x1fffff) return (4); else if (integer > 0x3fff) return (3); else if (integer > 0x7f) return (2); else return (1); } /* * 'snmp_set_error()' - Set the localized error for a packet. */ static void snmp_set_error(cups_snmp_t *packet, /* I - Packet */ const char *message) /* I - Error message */ { _cups_globals_t *cg = _cupsGlobals(); /* Global data */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); packet->error = _cupsLangString(cg->lang_default, message); } cups-2.3.1/cups/testipp.c000664 000765 000024 00000071273 13574721672 015417 0ustar00mikestaff000000 000000 /* * IPP test program for CUPS. * * 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. */ /* * Include necessary headers... */ #include "file.h" #include "string-private.h" #include "ipp-private.h" #ifdef _WIN32 # include #else # include # include #endif /* _WIN32 */ /* * Local types... */ typedef struct _ippdata_t { size_t rpos, /* Read position */ wused, /* Bytes used */ wsize; /* Max size of buffer */ ipp_uchar_t *wbuffer; /* Buffer */ } _ippdata_t; /* * Local globals... */ static ipp_uchar_t collection[] = /* Collection buffer */ { 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_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0a, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', IPP_TAG_BEGIN_COLLECTION, /* begCollection tag */ 0x00, 0x00, /* Name length + name */ 0x00, 0x00, /* No value */ IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', IPP_TAG_INTEGER, /* integer tag */ 0x00, 0x00, /* No name */ 0x00, 0x04, /* Value length + value */ 0x00, 0x00, 0x54, 0x56, IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', IPP_TAG_INTEGER, /* integer tag */ 0x00, 0x00, /* No name */ 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_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', IPP_TAG_KEYWORD, /* keyword tag */ 0x00, 0x00, /* No name */ 0x00, 0x04, /* Value length + value */ 'b', 'l', 'u', 'e', IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0a, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', IPP_TAG_KEYWORD, /* keyword tag */ 0x00, 0x00, /* No name */ 0x00, 0x05, /* Value length + value */ 'p', 'l', 'a', 'i', 'n', IPP_TAG_END_COLLECTION, /* endCollection tag */ 0x00, 0x00, /* No name */ 0x00, 0x00, /* No value */ IPP_TAG_BEGIN_COLLECTION, /* begCollection tag */ 0x00, 0x00, /* No name */ 0x00, 0x00, /* No value */ IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0a, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', IPP_TAG_BEGIN_COLLECTION, /* begCollection tag */ 0x00, 0x00, /* Name length + name */ 0x00, 0x00, /* No value */ IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', IPP_TAG_INTEGER, /* integer tag */ 0x00, 0x00, /* No name */ 0x00, 0x04, /* Value length + value */ 0x00, 0x00, 0x52, 0x08, IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', IPP_TAG_INTEGER, /* integer tag */ 0x00, 0x00, /* No name */ 0x00, 0x04, /* Value length + value */ 0x00, 0x00, 0x74, 0x04, IPP_TAG_END_COLLECTION, /* endCollection tag */ 0x00, 0x00, /* No name */ 0x00, 0x00, /* No value */ IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0b, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', IPP_TAG_KEYWORD, /* keyword tag */ 0x00, 0x00, /* No name */ 0x00, 0x05, /* Value length + value */ 'p', 'l', 'a', 'i', 'd', IPP_TAG_MEMBERNAME, /* memberAttrName tag */ 0x00, 0x00, /* No name */ 0x00, 0x0a, /* Value length + value */ 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', IPP_TAG_KEYWORD, /* keyword tag */ 0x00, 0x00, /* No name */ 0x00, 0x06, /* Value length + value */ 'g', 'l', 'o', 's', 's', 'y', IPP_TAG_END_COLLECTION, /* 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 */ IPP_TAG_END /* end tag */ }; static ipp_uchar_t mixed[] = /* Mixed value buffer */ { 0x01, 0x01, /* IPP version */ 0x00, 0x02, /* Print-Job operation */ 0x00, 0x00, 0x00, 0x01, /* Request ID */ IPP_TAG_OPERATION, IPP_TAG_INTEGER, /* integer tag */ 0x00, 0x1f, /* Name length + name */ 'n', 'o', 't', 'i', 'f', 'y', '-', 'l', 'e', 'a', 's', 'e', '-', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '-', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd', 0x00, 0x04, /* Value length + value */ 0x00, 0x00, 0x00, 0x01, IPP_TAG_RANGE, /* rangeOfInteger tag */ 0x00, 0x00, /* No name */ 0x00, 0x08, /* Value length + value */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, IPP_TAG_END /* end tag */ }; /* * Local functions... */ 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); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { _ippdata_t data; /* IPP buffer */ ipp_uchar_t buffer[8192]; /* Write buffer data */ ipp_t *cols[2], /* Collections */ *size; /* media-size collection */ ipp_t *request; /* Request */ ipp_attribute_t *media_col, /* media-col attribute */ *media_size, /* media-size attribute */ *attr; /* Other attribute */ ipp_state_t state; /* State */ size_t length; /* Length of data */ cups_file_t *fp; /* File pointer */ size_t i; /* Looping var */ int status; /* Status of tests (0 = success, 1 = fail) */ #ifdef DEBUG const char *name; /* Option name */ #endif /* DEBUG */ status = 0; if (argc == 1) { /* * Test request generation code... */ printf("Create Sample Request: "); request = ippNew(); request->request.op.version[0] = 0x01; request->request.op.version[1] = 0x01; request->request.op.operation_id = IPP_OP_PRINT_JOB; request->request.op.request_id = 1; ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8"); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en"); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/foo"); cols[0] = ippNew(); size = ippNew(); ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21590); ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 27940); ippAddCollection(cols[0], IPP_TAG_JOB, "media-size", size); ippDelete(size); ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL, "blue"); ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL, "plain"); cols[1] = ippNew(); size = ippNew(); ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21000); ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 29700); ippAddCollection(cols[1], IPP_TAG_JOB, "media-size", size); ippDelete(size); ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL, "plaid"); ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL, "glossy"); ippAddCollections(request, IPP_TAG_JOB, "media-col", 2, (const ipp_t **)cols); ippDelete(cols[0]); ippDelete(cols[1]); length = ippLength(request); if (length != sizeof(collection)) { printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", (int)length, (int)sizeof(collection)); status = 1; } else puts("PASS"); /* * Write test #1... */ printf("Write Sample to Memory: "); data.wused = 0; data.wsize = sizeof(buffer); data.wbuffer = buffer; while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; if (state != IPP_STATE_DATA) { printf("FAIL - %d bytes written.\n", (int)data.wused); status = 1; } else if (data.wused != sizeof(collection)) { printf("FAIL - wrote %d bytes, expected %d bytes!\n", (int)data.wused, (int)sizeof(collection)); hex_dump("Bytes Written", data.wbuffer, data.wused); hex_dump("Baseline", collection, sizeof(collection)); status = 1; } else if (memcmp(data.wbuffer, collection, data.wused)) { for (i = 0; i < data.wused; i ++) if (data.wbuffer[i] != collection[i]) break; printf("FAIL - output does not match baseline at 0x%04x!\n", (unsigned)i); hex_dump("Bytes Written", data.wbuffer, data.wused); hex_dump("Baseline", collection, sizeof(collection)); status = 1; } else puts("PASS"); ippDelete(request); /* * Read the data back in and confirm... */ printf("Read Sample from Memory: "); request = ippNew(); data.rpos = 0; while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; length = ippLength(request); if (state != IPP_STATE_DATA) { printf("FAIL - %d bytes read.\n", (int)data.rpos); status = 1; } else if (data.rpos != data.wused) { printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, (int)data.wused); print_attributes(request, 8); status = 1; } else if (length != sizeof(collection)) { printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", (int)length, (int)sizeof(collection)); print_attributes(request, 8); status = 1; } else puts("PASS"); fputs("ippFindAttribute(media-col): ", stdout); if ((media_col = ippFindAttribute(request, "media-col", IPP_TAG_BEGIN_COLLECTION)) == NULL) { if ((media_col = ippFindAttribute(request, "media-col", IPP_TAG_ZERO)) == NULL) puts("FAIL (not found)"); else printf("FAIL (wrong type - %s)\n", ippTagString(media_col->value_tag)); status = 1; } else if (media_col->num_values != 2) { printf("FAIL (wrong count - %d)\n", media_col->num_values); status = 1; } else puts("PASS"); if (media_col) { fputs("ippFindAttribute(media-size 1): ", stdout); if ((media_size = ippFindAttribute(media_col->values[0].collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) == NULL) { if ((media_size = ippFindAttribute(media_col->values[0].collection, "media-col", IPP_TAG_ZERO)) == NULL) puts("FAIL (not found)"); else printf("FAIL (wrong type - %s)\n", ippTagString(media_size->value_tag)); status = 1; } else { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_INTEGER)) == NULL) { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_ZERO)) == NULL) puts("FAIL (missing x-dimension)"); else printf("FAIL (wrong type for x-dimension - %s)\n", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 21590) { printf("FAIL (wrong value for x-dimension - %d)\n", attr->values[0].integer); status = 1; } else if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_INTEGER)) == NULL) { if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_ZERO)) == NULL) puts("FAIL (missing y-dimension)"); else printf("FAIL (wrong type for y-dimension - %s)\n", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 27940) { printf("FAIL (wrong value for y-dimension - %d)\n", attr->values[0].integer); status = 1; } else puts("PASS"); } fputs("ippFindAttribute(media-size 2): ", stdout); if ((media_size = ippFindAttribute(media_col->values[1].collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) == NULL) { if ((media_size = ippFindAttribute(media_col->values[1].collection, "media-col", IPP_TAG_ZERO)) == NULL) puts("FAIL (not found)"); else printf("FAIL (wrong type - %s)\n", ippTagString(media_size->value_tag)); status = 1; } else { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_INTEGER)) == NULL) { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_ZERO)) == NULL) puts("FAIL (missing x-dimension)"); else printf("FAIL (wrong type for x-dimension - %s)\n", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 21000) { printf("FAIL (wrong value for x-dimension - %d)\n", attr->values[0].integer); status = 1; } else if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_INTEGER)) == NULL) { if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_ZERO)) == NULL) puts("FAIL (missing y-dimension)"); else printf("FAIL (wrong type for y-dimension - %s)\n", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 29700) { printf("FAIL (wrong value for y-dimension - %d)\n", attr->values[0].integer); status = 1; } else puts("PASS"); } } /* * Test hierarchical find... */ fputs("ippFindAttribute(media-col/media-size/x-dimension): ", stdout); if ((attr = ippFindAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { if (ippGetInteger(attr, 0) != 21590) { printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0)); status = 1; } else puts("PASS"); } else { puts("FAIL (not found)"); status = 1; } fputs("ippFindNextAttribute(media-col/media-size/x-dimension): ", stdout); if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { if (ippGetInteger(attr, 0) != 21000) { printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0)); status = 1; } else puts("PASS"); } else { puts("FAIL (not found)"); status = 1; } fputs("ippFindNextAttribute(media-col/media-size/x-dimension) again: ", stdout); if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { printf("FAIL (got %d, expected nothing)\n", ippGetInteger(attr, 0)); status = 1; } else puts("PASS"); 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... */ fputs("Read Mixed integer/rangeOfInteger from Memory: ", stdout); request = ippNew(); data.rpos = 0; data.wused = sizeof(mixed); data.wsize = sizeof(mixed); data.wbuffer = mixed; while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; length = ippLength(request); if (state != IPP_STATE_DATA) { printf("FAIL - %d bytes read.\n", (int)data.rpos); status = 1; } else if (data.rpos != sizeof(mixed)) { printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, (int)sizeof(mixed)); print_attributes(request, 8); status = 1; } else if (length != (sizeof(mixed) + 4)) { printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", (int)length, (int)sizeof(mixed) + 4); print_attributes(request, 8); status = 1; } else puts("PASS"); fputs("ippFindAttribute(notify-lease-duration-supported): ", stdout); if ((attr = ippFindAttribute(request, "notify-lease-duration-supported", IPP_TAG_ZERO)) == NULL) { puts("FAIL (not found)"); status = 1; } else if (attr->value_tag != IPP_TAG_RANGE) { printf("FAIL (wrong type - %s)\n", ippTagString(attr->value_tag)); status = 1; } else if (attr->num_values != 2) { printf("FAIL (wrong count - %d)\n", attr->num_values); status = 1; } else if (attr->values[0].range.lower != 1 || attr->values[0].range.upper != 1 || attr->values[1].range.lower != 16 || attr->values[1].range.upper != 32) { printf("FAIL (wrong values - %d,%d and %d,%d)\n", attr->values[0].range.lower, attr->values[0].range.upper, attr->values[1].range.lower, attr->values[1].range.upper); status = 1; } else puts("PASS"); ippDelete(request); #ifdef DEBUG /* * Test that private option array is sorted... */ fputs("_ippCheckOptions: ", stdout); if ((name = _ippCheckOptions()) == NULL) puts("PASS"); else { printf("FAIL (\"%s\" out of order)\n", name); status = 1; } #endif /* DEBUG */ /* * Test _ippFindOption() private API... */ fputs("_ippFindOption(\"printer-type\"): ", stdout); if (_ippFindOption("printer-type")) puts("PASS"); else { puts("FAIL"); status = 1; } /* * Summarize... */ putchar('\n'); if (status) puts("Core IPP tests failed."); else puts("Core IPP tests passed."); } else { /* * Read IPP files... */ for (i = 1; i < (size_t)argc; i ++) { if (strlen(argv[i]) > 5 && !strcmp(argv[i] + strlen(argv[i]) - 5, ".test")) { /* * Read an ASCII IPP message... */ _ipp_vars_t v; /* IPP variables */ _ippVarsInit(&v, NULL, NULL, token_cb); 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 { /* * Read a raw (binary) 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)cupsFileRead, 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); } if (request) { printf("\n%s:\n", argv[i]); print_attributes(request, 4); ippDelete(request); } } } return (status); } /* * 'hex_dump()' - Produce a hex dump of a buffer. */ void hex_dump(const char *title, /* I - Title */ ipp_uchar_t *buffer, /* I - Buffer to dump */ size_t bytes) /* I - Number of bytes */ { size_t i, j; /* Looping vars */ int ch; /* Current ASCII char */ /* * Show lines of 16 bytes at a time... */ printf(" %s:\n", title); for (i = 0; i < bytes; i += 16) { /* * Show the offset... */ printf(" %04x ", (unsigned)i); /* * Then up to 16 bytes in hex... */ for (j = 0; j < 16; j ++) if ((i + j) < bytes) printf(" %02x", buffer[i + j]); else printf(" "); /* * Then the ASCII representation of the bytes... */ putchar(' '); putchar(' '); for (j = 0; j < 16 && (i + j) < bytes; j ++) { ch = buffer[i + j] & 127; if (ch < ' ' || ch == 127) putchar('.'); else putchar(ch); } putchar('\n'); } } /* * 'print_attributes()' - Print the attributes in a request... */ void print_attributes(ipp_t *ipp, /* I - IPP request */ int indent) /* I - Indentation */ { ipp_tag_t group; /* Current group */ ipp_attribute_t *attr; /* Current attribute */ char buffer[2048]; /* Value string */ for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) { if (!attr->name && indent == 4) { group = IPP_TAG_ZERO; putchar('\n'); continue; } if (group != attr->group_tag) { group = attr->group_tag; printf("\n%*s%s:\n\n", indent - 4, "", ippTagString(group)); } ippAttributeString(attr, buffer, sizeof(buffer)); printf("%*s%s (%s%s): %s\n", indent, "", attr->name ? attr->name : "(null)", attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), buffer); } } /* * 'read_cb()' - Read data from a buffer. */ ssize_t /* O - Number of bytes read */ read_cb(_ippdata_t *data, /* I - Data */ ipp_uchar_t *buffer, /* O - Buffer to read */ size_t bytes) /* I - Number of bytes to read */ { size_t count; /* Number of bytes */ /* * Copy bytes from the data buffer to the read buffer... */ if ((count = data->wsize - data->rpos) > bytes) count = bytes; memcpy(buffer, data->wbuffer + data->rpos, count); data->rpos += count; /* * Return the number of bytes read... */ return ((ssize_t)count); } /* * '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. */ int /* O - 1 on success, 0 on failure */ token_cb(_ipp_file_t *f, /* I - IPP file data */ _ipp_vars_t *v, /* I - IPP variables */ void *user_data, /* I - User data pointer */ const char *token) /* I - Token string */ { (void)v; (void)user_data; if (!token) { f->attrs = ippNew(); f->group_tag = IPP_TAG_PRINTER; } else { fprintf(stderr, "Unknown directive \"%s\" on line %d of \"%s\".\n", token, f->linenum, f->filename); return (0); } return (1); } /* * 'write_cb()' - Write data into a buffer. */ ssize_t /* O - Number of bytes written */ write_cb(_ippdata_t *data, /* I - Data */ ipp_uchar_t *buffer, /* I - Buffer to write */ size_t bytes) /* I - Number of bytes to write */ { size_t count; /* Number of bytes */ /* * Loop until all bytes are written... */ if ((count = data->wsize - data->wused) > bytes) count = bytes; memcpy(data->wbuffer + data->wused, buffer, count); data->wused += count; /* * Return the number of bytes written... */ return ((ssize_t)count); } cups-2.3.1/cups/array.h000664 000765 000024 00000005216 13574721672 015044 0ustar00mikestaff000000 000000 /* * Sorted array definitions for CUPS. * * Copyright 2007-2010 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_ARRAY_H_ # define _CUPS_ARRAY_H_ /* * Include necessary headers... */ # include "versioning.h" # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Types and structures... */ typedef struct _cups_array_s cups_array_t; /**** CUPS array type ****/ typedef int (*cups_array_func_t)(void *first, void *second, void *data); /**** Array comparison function ****/ typedef int (*cups_ahash_func_t)(void *element, void *data); /**** Array hash function ****/ typedef void *(*cups_acopy_func_t)(void *element, void *data); /**** Array element copy function ****/ typedef void (*cups_afree_func_t)(void *element, void *data); /**** Array element free function ****/ /* * Functions... */ extern int cupsArrayAdd(cups_array_t *a, void *e) _CUPS_API_1_2; extern void cupsArrayClear(cups_array_t *a) _CUPS_API_1_2; extern int cupsArrayCount(cups_array_t *a) _CUPS_API_1_2; extern void *cupsArrayCurrent(cups_array_t *a) _CUPS_API_1_2; extern void cupsArrayDelete(cups_array_t *a) _CUPS_API_1_2; extern cups_array_t *cupsArrayDup(cups_array_t *a) _CUPS_API_1_2; extern void *cupsArrayFind(cups_array_t *a, void *e) _CUPS_API_1_2; extern void *cupsArrayFirst(cups_array_t *a) _CUPS_API_1_2; extern int cupsArrayGetIndex(cups_array_t *a) _CUPS_API_1_3; extern int cupsArrayGetInsert(cups_array_t *a) _CUPS_API_1_3; extern void *cupsArrayIndex(cups_array_t *a, int n) _CUPS_API_1_2; extern int cupsArrayInsert(cups_array_t *a, void *e) _CUPS_API_1_2; extern void *cupsArrayLast(cups_array_t *a) _CUPS_API_1_2; extern cups_array_t *cupsArrayNew(cups_array_func_t f, void *d) _CUPS_API_1_2; extern cups_array_t *cupsArrayNew2(cups_array_func_t f, void *d, cups_ahash_func_t h, int hsize) _CUPS_API_1_3; extern cups_array_t *cupsArrayNew3(cups_array_func_t f, void *d, cups_ahash_func_t h, int hsize, cups_acopy_func_t cf, cups_afree_func_t ff) _CUPS_API_1_5; extern void *cupsArrayNext(cups_array_t *a) _CUPS_API_1_2; extern void *cupsArrayPrev(cups_array_t *a) _CUPS_API_1_2; extern int cupsArrayRemove(cups_array_t *a, void *e) _CUPS_API_1_2; extern void *cupsArrayRestore(cups_array_t *a) _CUPS_API_1_2; extern int cupsArraySave(cups_array_t *a) _CUPS_API_1_2; extern void *cupsArrayUserData(cups_array_t *a) _CUPS_API_1_2; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_ARRAY_H_ */ cups-2.3.1/cups/ppd-localize.c000664 000765 000024 00000042375 13574721672 016313 0ustar00mikestaff000000 000000 /* * PPD localization routines for CUPS. * * Copyright 2007-2018 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers. */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * Local functions... */ static cups_lang_t *ppd_ll_CC(char *ll_CC, size_t ll_CC_size); /* * 'ppdLocalize()' - Localize the PPD file to the current locale. * * All groups, options, and choices are localized, as are ICC profile * descriptions, printer presets, and custom option parameters. Each * localized string uses the UTF-8 character encoding. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */ { int i, j, k; /* Looping vars */ ppd_group_t *group; /* Current group */ ppd_option_t *option; /* Current option */ ppd_choice_t *choice; /* Current choice */ ppd_coption_t *coption; /* Current custom option */ ppd_cparam_t *cparam; /* Current custom parameter */ ppd_attr_t *attr, /* Current attribute */ *locattr; /* Localized attribute */ char ckeyword[PPD_MAX_NAME], /* Custom keyword */ ll_CC[6]; /* Language + country locale */ /* * Range check input... */ DEBUG_printf(("ppdLocalize(ppd=%p)", ppd)); if (!ppd) return (-1); /* * Get the default language... */ ppd_ll_CC(ll_CC, sizeof(ll_CC)); /* * Now lookup all of the groups, options, choices, etc. */ for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) { if ((locattr = _ppdLocalizedAttr(ppd, "Translation", group->name, ll_CC)) != NULL) strlcpy(group->text, locattr->text, sizeof(group->text)); for (j = group->num_options, option = group->options; j > 0; j --, option ++) { if ((locattr = _ppdLocalizedAttr(ppd, "Translation", option->keyword, ll_CC)) != NULL) strlcpy(option->text, locattr->text, sizeof(option->text)); for (k = option->num_choices, choice = option->choices; k > 0; k --, choice ++) { if (strcmp(choice->choice, "Custom") || !ppdFindCustomOption(ppd, option->keyword)) locattr = _ppdLocalizedAttr(ppd, option->keyword, choice->choice, ll_CC); else { snprintf(ckeyword, sizeof(ckeyword), "Custom%s", option->keyword); locattr = _ppdLocalizedAttr(ppd, ckeyword, "True", ll_CC); } if (locattr) strlcpy(choice->text, locattr->text, sizeof(choice->text)); } } } /* * Translate any custom parameters... */ for (coption = (ppd_coption_t *)cupsArrayFirst(ppd->coptions); coption; coption = (ppd_coption_t *)cupsArrayNext(ppd->coptions)) { for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) { snprintf(ckeyword, sizeof(ckeyword), "ParamCustom%s", coption->keyword); if ((locattr = _ppdLocalizedAttr(ppd, ckeyword, cparam->name, ll_CC)) != NULL) strlcpy(cparam->text, locattr->text, sizeof(cparam->text)); } } /* * Translate ICC profile names... */ if ((attr = ppdFindAttr(ppd, "APCustomColorMatchingName", NULL)) != NULL) { if ((locattr = _ppdLocalizedAttr(ppd, "APCustomColorMatchingName", attr->spec, ll_CC)) != NULL) strlcpy(attr->text, locattr->text, sizeof(attr->text)); } for (attr = ppdFindAttr(ppd, "cupsICCProfile", NULL); attr; attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL)) { cupsArraySave(ppd->sorted_attrs); if ((locattr = _ppdLocalizedAttr(ppd, "cupsICCProfile", attr->spec, ll_CC)) != NULL) strlcpy(attr->text, locattr->text, sizeof(attr->text)); cupsArrayRestore(ppd->sorted_attrs); } /* * Translate printer presets... */ for (attr = ppdFindAttr(ppd, "APPrinterPreset", NULL); attr; attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) { cupsArraySave(ppd->sorted_attrs); if ((locattr = _ppdLocalizedAttr(ppd, "APPrinterPreset", attr->spec, ll_CC)) != NULL) strlcpy(attr->text, locattr->text, sizeof(attr->text)); cupsArrayRestore(ppd->sorted_attrs); } return (0); } /* * 'ppdLocalizeAttr()' - Localize an attribute. * * This function uses the current locale to find the localized attribute for * the given main and option keywords. If no localized version of the * attribute exists for the current locale, the unlocalized version is returned. */ ppd_attr_t * /* O - Localized attribute or @code NULL@ if none exists */ ppdLocalizeAttr(ppd_file_t *ppd, /* I - PPD file */ const char *keyword, /* I - Main keyword */ const char *spec) /* I - Option keyword or @code NULL@ for none */ { ppd_attr_t *locattr; /* Localized attribute */ char ll_CC[6]; /* Language + country locale */ /* * Get the default language... */ ppd_ll_CC(ll_CC, sizeof(ll_CC)); /* * Find the localized attribute... */ if (spec) locattr = _ppdLocalizedAttr(ppd, keyword, spec, ll_CC); else locattr = _ppdLocalizedAttr(ppd, "Translation", keyword, ll_CC); if (!locattr) locattr = ppdFindAttr(ppd, keyword, spec); return (locattr); } /* * 'ppdLocalizeIPPReason()' - Get the localized version of a cupsIPPReason * attribute. * * This function uses the current locale to find the corresponding reason * text or URI from the attribute value. If "scheme" is NULL or "text", * the returned value contains human-readable (UTF-8) text from the translation * string or attribute value. Otherwise the corresponding URI is returned. * * If no value of the requested scheme can be found, NULL is returned. * * @since CUPS 1.3/macOS 10.5@ */ const char * /* O - Value or NULL if not found */ ppdLocalizeIPPReason( ppd_file_t *ppd, /* I - PPD file */ const char *reason, /* I - IPP reason keyword to look up */ const char *scheme, /* I - URI scheme or NULL for text */ char *buffer, /* I - Value buffer */ size_t bufsize) /* I - Size of value buffer */ { cups_lang_t *lang; /* Current language */ ppd_attr_t *locattr; /* Localized attribute */ char ll_CC[6], /* Language + country locale */ *bufptr, /* Pointer into buffer */ *bufend, /* Pointer to end of buffer */ *valptr; /* Pointer into value */ int ch; /* Hex-encoded character */ size_t schemelen; /* Length of scheme name */ /* * Range check input... */ if (buffer) *buffer = '\0'; if (!ppd || !reason || (scheme && !*scheme) || !buffer || bufsize < PPD_MAX_TEXT) return (NULL); /* * Get the default language... */ lang = ppd_ll_CC(ll_CC, sizeof(ll_CC)); /* * Find the localized attribute... */ if ((locattr = _ppdLocalizedAttr(ppd, "cupsIPPReason", reason, ll_CC)) == NULL) locattr = ppdFindAttr(ppd, "cupsIPPReason", reason); if (!locattr) { if (lang && (!scheme || !strcmp(scheme, "text")) && strcmp(reason, "none")) { /* * Try to localize a standard printer-state-reason keyword... */ char msgid[1024], /* State message identifier */ *ptr; /* Pointer to state suffix */ const char *message = NULL; /* Localized message */ snprintf(msgid, sizeof(msgid), "printer-state-reasons.%s", reason); if ((ptr = strrchr(msgid, '-')) != NULL && (!strcmp(ptr, "-error") || !strcmp(ptr, "-report") || !strcmp(ptr, "-warning"))) *ptr = '\0'; message = _cupsLangString(lang, msgid); if (message && strcmp(message, msgid)) { strlcpy(buffer, _cupsLangString(lang, message), bufsize); return (buffer); } } return (NULL); } /* * Now find the value we need... */ bufend = buffer + bufsize - 1; if (!scheme || !strcmp(scheme, "text")) { /* * Copy a text value (either the translation text or text:... URIs from * the value... */ strlcpy(buffer, locattr->text, bufsize); for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;) { if (!strncmp(valptr, "text:", 5)) { /* * Decode text: URI and add to the buffer... */ valptr += 5; while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend) { if (*valptr == '%' && isxdigit(valptr[1] & 255) && isxdigit(valptr[2] & 255)) { /* * Pull a hex-encoded character from the URI... */ valptr ++; if (isdigit(*valptr & 255)) ch = (*valptr - '0') << 4; else ch = (tolower(*valptr) - 'a' + 10) << 4; valptr ++; if (isdigit(*valptr & 255)) *bufptr++ = (char)(ch | (*valptr - '0')); else *bufptr++ = (char)(ch | (tolower(*valptr) - 'a' + 10)); valptr ++; } else if (*valptr == '+') { *bufptr++ = ' '; valptr ++; } else *bufptr++ = *valptr++; } } else { /* * Skip this URI... */ while (*valptr && !_cups_isspace(*valptr)) valptr++; } /* * Skip whitespace... */ while (_cups_isspace(*valptr)) valptr ++; } if (bufptr > buffer) *bufptr = '\0'; return (buffer); } else { /* * Copy a URI... */ schemelen = strlen(scheme); if (scheme[schemelen - 1] == ':') /* Force scheme to be just the name */ schemelen --; for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;) { if ((!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':') || (*valptr == '/' && !strcmp(scheme, "file"))) { /* * Copy URI... */ while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend) *bufptr++ = *valptr++; *bufptr = '\0'; return (buffer); } else { /* * Skip this URI... */ while (*valptr && !_cups_isspace(*valptr)) valptr++; } /* * Skip whitespace... */ while (_cups_isspace(*valptr)) valptr ++; } return (NULL); } } /* * 'ppdLocalizeMarkerName()' - Get the localized version of a marker-names * attribute value. * * This function uses the current locale to find the corresponding name * text from the attribute value. If no localized text for the requested * name can be found, @code NULL@ is returned. * * @since CUPS 1.4/macOS 10.6@ */ const char * /* O - Value or @code NULL@ if not found */ ppdLocalizeMarkerName( ppd_file_t *ppd, /* I - PPD file */ const char *name) /* I - Marker name to look up */ { ppd_attr_t *locattr; /* Localized attribute */ char ll_CC[6]; /* Language + country locale */ /* * Range check input... */ if (!ppd || !name) return (NULL); /* * Get the default language... */ ppd_ll_CC(ll_CC, sizeof(ll_CC)); /* * Find the localized attribute... */ if ((locattr = _ppdLocalizedAttr(ppd, "cupsMarkerName", name, ll_CC)) == NULL) locattr = ppdFindAttr(ppd, "cupsMarkerName", name); return (locattr ? locattr->text : NULL); } /* * '_ppdFreeLanguages()' - Free an array of languages from _ppdGetLanguages. */ void _ppdFreeLanguages( cups_array_t *languages) /* I - Languages array */ { char *language; /* Current language */ for (language = (char *)cupsArrayFirst(languages); language; language = (char *)cupsArrayNext(languages)) free(language); cupsArrayDelete(languages); } /* * '_ppdGetLanguages()' - Get an array of languages from a PPD file. */ cups_array_t * /* O - Languages array */ _ppdGetLanguages(ppd_file_t *ppd) /* I - PPD file */ { cups_array_t *languages; /* Languages array */ ppd_attr_t *attr; /* cupsLanguages attribute */ char *value, /* Copy of attribute value */ *start, /* Start of current language */ *ptr; /* Pointer into languages */ /* * See if we have a cupsLanguages attribute... */ if ((attr = ppdFindAttr(ppd, "cupsLanguages", NULL)) == NULL || !attr->value) return (NULL); /* * Yes, load the list... */ if ((languages = cupsArrayNew((cups_array_func_t)strcmp, NULL)) == NULL) return (NULL); if ((value = strdup(attr->value)) == NULL) { cupsArrayDelete(languages); return (NULL); } for (ptr = value; *ptr;) { /* * Skip leading whitespace... */ while (_cups_isspace(*ptr)) ptr ++; if (!*ptr) break; /* * Find the end of this language name... */ for (start = ptr; *ptr && !_cups_isspace(*ptr); ptr ++); if (*ptr) *ptr++ = '\0'; if (!strcmp(start, "en")) continue; cupsArrayAdd(languages, strdup(start)); } /* * Free the temporary string and return either an array with one or more * values or a NULL pointer... */ free(value); if (cupsArrayCount(languages) == 0) { cupsArrayDelete(languages); return (NULL); } else return (languages); } /* * '_ppdHashName()' - Generate a hash value for a device or profile name. * * This function is primarily used on macOS, but is generally accessible * since cupstestppd needs to check for profile name collisions in PPD files... */ unsigned /* O - Hash value */ _ppdHashName(const char *name) /* I - Name to hash */ { unsigned mult, /* Multiplier */ hash = 0; /* Hash value */ for (mult = 1; *name && mult <= 128; mult ++, name ++) hash += (*name & 255) * mult; return (hash); } /* * '_ppdLocalizedAttr()' - Find a localized attribute. */ ppd_attr_t * /* O - Localized attribute or NULL */ _ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */ const char *keyword, /* I - Main keyword */ const char *spec, /* I - Option keyword */ const char *ll_CC) /* I - Language + country locale */ { char lkeyword[PPD_MAX_NAME]; /* Localization keyword */ ppd_attr_t *attr; /* Current attribute */ DEBUG_printf(("4_ppdLocalizedAttr(ppd=%p, keyword=\"%s\", spec=\"%s\", " "ll_CC=\"%s\")", ppd, keyword, spec, ll_CC)); /* * Look for Keyword.ll_CC, then Keyword.ll... */ snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll_CC, keyword); if ((attr = ppdFindAttr(ppd, lkeyword, spec)) == NULL) { /* * * * Multiple locales need special handling... Sigh... */ if (!strcmp(ll_CC, "zh_HK")) { snprintf(lkeyword, sizeof(lkeyword), "zh_TW.%s", keyword); attr = ppdFindAttr(ppd, lkeyword, spec); } if (!attr) { snprintf(lkeyword, sizeof(lkeyword), "%2.2s.%s", ll_CC, keyword); attr = ppdFindAttr(ppd, lkeyword, spec); } if (!attr) { if (!strncmp(ll_CC, "ja", 2)) { /* * Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese * PPD files were incorrectly assigned "jp" as the locale name * instead of "ja". Support both the old (incorrect) and new * locale names for Japanese... */ snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword); attr = ppdFindAttr(ppd, lkeyword, spec); } else if (!strncmp(ll_CC, "nb", 2)) { /* * Norway has two languages, "Bokmal" (the primary one) * and "Nynorsk" (new Norwegian); this code maps from the (currently) * recommended "nb" to the previously recommended "no"... */ snprintf(lkeyword, sizeof(lkeyword), "no.%s", keyword); attr = ppdFindAttr(ppd, lkeyword, spec); } else if (!strncmp(ll_CC, "no", 2)) { /* * Norway has two languages, "Bokmal" (the primary one) * and "Nynorsk" (new Norwegian); we map "no" to "nb" here as * recommended by the locale folks... */ snprintf(lkeyword, sizeof(lkeyword), "nb.%s", keyword); attr = ppdFindAttr(ppd, lkeyword, spec); } } } #ifdef DEBUG if (attr) DEBUG_printf(("5_ppdLocalizedAttr: *%s %s/%s: \"%s\"\n", attr->name, attr->spec, attr->text, attr->value ? attr->value : "")); else DEBUG_puts("5_ppdLocalizedAttr: NOT FOUND"); #endif /* DEBUG */ return (attr); } /* * 'ppd_ll_CC()' - Get the current locale names. */ static cups_lang_t * /* O - Current language */ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */ size_t ll_CC_size) /* I - Size of country-specific name */ { cups_lang_t *lang; /* Current language */ /* * Get the current locale... */ if ((lang = cupsLangDefault()) == NULL) { strlcpy(ll_CC, "en_US", ll_CC_size); return (NULL); } /* * Copy the locale name... */ strlcpy(ll_CC, lang->language, ll_CC_size); if (strlen(ll_CC) == 2) { /* * Map "ll" to primary/origin country locales to have the best * chance of finding a match... */ if (!strcmp(ll_CC, "cs")) strlcpy(ll_CC, "cs_CZ", ll_CC_size); else if (!strcmp(ll_CC, "en")) strlcpy(ll_CC, "en_US", ll_CC_size); else if (!strcmp(ll_CC, "ja")) strlcpy(ll_CC, "ja_JP", ll_CC_size); else if (!strcmp(ll_CC, "sv")) strlcpy(ll_CC, "sv_SE", ll_CC_size); else if (!strcmp(ll_CC, "zh")) /* Simplified Chinese */ strlcpy(ll_CC, "zh_CN", ll_CC_size); } DEBUG_printf(("8ppd_ll_CC: lang->language=\"%s\", ll_CC=\"%s\"...", lang->language, ll_CC)); return (lang); } cups-2.3.1/cups/snmp-private.h000664 000765 000024 00000010647 13574721672 016357 0ustar00mikestaff000000 000000 /* * Private SNMP definitions for CUPS. * * Copyright © 2007-2014 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 * information. */ #ifndef _CUPS_SNMP_PRIVATE_H_ # define _CUPS_SNMP_PRIVATE_H_ /* * Include necessary headers. */ #include /* * Constants... */ #define CUPS_SNMP_PORT 161 /* SNMP well-known port */ #define CUPS_SNMP_MAX_COMMUNITY 512 /* Maximum size of community name */ #define CUPS_SNMP_MAX_OID 128 /* Maximum number of OID numbers */ #define CUPS_SNMP_MAX_PACKET 1472 /* Maximum size of SNMP packet */ #define CUPS_SNMP_MAX_STRING 1024 /* Maximum size of string */ #define CUPS_SNMP_VERSION_1 0 /* SNMPv1 */ /* * Types... */ enum cups_asn1_e /**** ASN1 request/object types ****/ { CUPS_ASN1_END_OF_CONTENTS = 0x00, /* End-of-contents */ CUPS_ASN1_BOOLEAN = 0x01, /* BOOLEAN */ CUPS_ASN1_INTEGER = 0x02, /* INTEGER or ENUMERATION */ CUPS_ASN1_BIT_STRING = 0x03, /* BIT STRING */ CUPS_ASN1_OCTET_STRING = 0x04, /* OCTET STRING */ CUPS_ASN1_NULL_VALUE = 0x05, /* NULL VALUE */ CUPS_ASN1_OID = 0x06, /* OBJECT IDENTIFIER */ CUPS_ASN1_SEQUENCE = 0x30, /* SEQUENCE */ CUPS_ASN1_HEX_STRING = 0x40, /* Binary string aka Hex-STRING */ CUPS_ASN1_COUNTER = 0x41, /* 32-bit unsigned aka Counter32 */ CUPS_ASN1_GAUGE = 0x42, /* 32-bit unsigned aka Gauge32 */ CUPS_ASN1_TIMETICKS = 0x43, /* 32-bit unsigned aka Timeticks32 */ CUPS_ASN1_GET_REQUEST = 0xa0, /* GetRequest-PDU */ CUPS_ASN1_GET_NEXT_REQUEST = 0xa1, /* GetNextRequest-PDU */ CUPS_ASN1_GET_RESPONSE = 0xa2 /* GetResponse-PDU */ }; typedef enum cups_asn1_e cups_asn1_t; /**** ASN1 request/object types ****/ typedef struct cups_snmp_string_s /**** String value ****/ { unsigned char bytes[CUPS_SNMP_MAX_STRING]; /* Bytes in string */ unsigned num_bytes; /* Number of bytes */ } cups_snmp_string_t; union cups_snmp_value_u /**** Object value ****/ { int boolean; /* Boolean value */ int integer; /* Integer value */ int counter; /* Counter value */ unsigned gauge; /* Gauge value */ unsigned timeticks; /* Timeticks value */ int oid[CUPS_SNMP_MAX_OID]; /* OID value */ cups_snmp_string_t string; /* String value */ }; typedef struct cups_snmp_s /**** SNMP data packet ****/ { const char *error; /* Encode/decode error */ http_addr_t address; /* Source address */ int version; /* Version number */ char community[CUPS_SNMP_MAX_COMMUNITY]; /* Community name */ cups_asn1_t request_type; /* Request type */ unsigned request_id; /* request-id value */ int error_status; /* error-status value */ int error_index; /* error-index value */ int object_name[CUPS_SNMP_MAX_OID]; /* object-name value */ cups_asn1_t object_type; /* object-value type */ union cups_snmp_value_u object_value; /* object-value value */ } cups_snmp_t; typedef void (*cups_snmp_cb_t)(cups_snmp_t *packet, void *data); /* * Prototypes... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ extern void _cupsSNMPClose(int fd) _CUPS_PRIVATE; extern int *_cupsSNMPCopyOID(int *dst, const int *src, int dstsize) _CUPS_PRIVATE; extern const char *_cupsSNMPDefaultCommunity(void) _CUPS_PRIVATE; extern int _cupsSNMPIsOID(cups_snmp_t *packet, const int *oid) _CUPS_PRIVATE; extern int _cupsSNMPIsOIDPrefixed(cups_snmp_t *packet, const int *prefix) _CUPS_PRIVATE; extern char *_cupsSNMPOIDToString(const int *src, char *dst, size_t dstsize) _CUPS_PRIVATE; extern int _cupsSNMPOpen(int family) _CUPS_PRIVATE; extern cups_snmp_t *_cupsSNMPRead(int fd, cups_snmp_t *packet, double timeout) _CUPS_PRIVATE; extern void _cupsSNMPSetDebug(int level) _CUPS_PRIVATE; extern int *_cupsSNMPStringToOID(const char *src, int *dst, int dstsize) _CUPS_PRIVATE; extern int _cupsSNMPWalk(int fd, http_addr_t *address, int version, const char *community, const int *prefix, double timeout, cups_snmp_cb_t cb, void *data) _CUPS_PRIVATE; extern int _cupsSNMPWrite(int fd, http_addr_t *address, int version, const char *community, cups_asn1_t request_type, const unsigned request_id, const int *oid) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_SNMP_PRIVATE_H_ */ cups-2.3.1/cups/http.c000664 000765 000024 00000346063 13574721672 014710 0ustar00mikestaff000000 000000 /* * HTTP routines for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * This file contains Kerberos support code, copyright 2006 by * Jelmer Vernooij. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #ifdef _WIN32 # include #else # include # include # include #endif /* _WIN32 */ #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ # ifdef HAVE_LIBZ # include # endif /* HAVE_LIBZ */ /* * Local functions... */ static void http_add_field(http_t *http, http_field_t field, const char *value, int append); #ifdef HAVE_LIBZ static void http_content_coding_finish(http_t *http); static void http_content_coding_start(http_t *http, const char *value); #endif /* HAVE_LIBZ */ static http_t *http_create(const char *host, int port, http_addrlist_t *addrlist, int family, http_encryption_t encryption, int blocking, _http_mode_t mode); #ifdef DEBUG static void http_debug_hex(const char *prefix, const char *buffer, int bytes); #endif /* DEBUG */ static ssize_t http_read(http_t *http, char *buffer, size_t length); static ssize_t http_read_buffered(http_t *http, char *buffer, size_t length); static ssize_t http_read_chunk(http_t *http, char *buffer, size_t length); static int http_send(http_t *http, http_state_t request, const char *uri); static ssize_t http_write(http_t *http, const char *buffer, size_t length); static ssize_t http_write_chunk(http_t *http, const char *buffer, size_t length); static off_t http_set_length(http_t *http); static void http_set_timeout(int fd, double timeout); static void http_set_wait(http_t *http); #ifdef HAVE_SSL static int http_tls_upgrade(http_t *http); #endif /* HAVE_SSL */ /* * Local globals... */ static const char * const http_fields[] = { "Accept-Language", "Accept-Ranges", "Authorization", "Connection", "Content-Encoding", "Content-Language", "Content-Length", "Content-Location", "Content-MD5", "Content-Range", "Content-Type", "Content-Version", "Date", "Host", "If-Modified-Since", "If-Unmodified-since", "Keep-Alive", "Last-Modified", "Link", "Location", "Range", "Referer", "Retry-After", "Transfer-Encoding", "Upgrade", "User-Agent", "WWW-Authenticate", "Accept-Encoding", "Allow", "Server", "Authentication-Info" }; /* * 'httpAcceptConnection()' - Accept a new HTTP client connection from the * specified listening socket. * * @since CUPS 1.7/macOS 10.9@ */ http_t * /* O - HTTP connection or @code NULL@ */ httpAcceptConnection(int fd, /* I - Listen socket file descriptor */ int blocking) /* I - 1 if the connection should be blocking, 0 otherwise */ { http_t *http; /* HTTP connection */ http_addrlist_t addrlist; /* Dummy address list */ socklen_t addrlen; /* Length of address */ int val; /* Socket option value */ /* * Range check input... */ if (fd < 0) return (NULL); /* * Create the client connection... */ memset(&addrlist, 0, sizeof(addrlist)); if ((http = http_create(NULL, 0, &addrlist, AF_UNSPEC, HTTP_ENCRYPTION_IF_REQUESTED, blocking, _HTTP_MODE_SERVER)) == NULL) return (NULL); /* * Accept the client and get the remote address... */ addrlen = sizeof(http_addr_t); if ((http->fd = accept(fd, (struct sockaddr *)&(http->addrlist->addr), &addrlen)) < 0) { _cupsSetHTTPError(HTTP_STATUS_ERROR); httpClose(http); return (NULL); } http->hostaddr = &(http->addrlist->addr); if (httpAddrLocalhost(http->hostaddr)) strlcpy(http->hostname, "localhost", sizeof(http->hostname)); else httpAddrString(http->hostaddr, http->hostname, sizeof(http->hostname)); #ifdef SO_NOSIGPIPE /* * Disable SIGPIPE for this socket. */ val = 1; setsockopt(http->fd, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val)); #endif /* SO_NOSIGPIPE */ /* * Using TCP_NODELAY improves responsiveness, especially on systems * with a slow loopback interface. Since we write large buffers * when sending print files and requests, there shouldn't be any * performance penalty for this... */ val = 1; setsockopt(http->fd, IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val)); #ifdef FD_CLOEXEC /* * Close this socket when starting another process... */ fcntl(http->fd, F_SETFD, FD_CLOEXEC); #endif /* FD_CLOEXEC */ return (http); } /* * 'httpAddCredential()' - Allocates and adds a single credential to an array. * * Use @code cupsArrayNew(NULL, NULL)@ to create a credentials array. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - 0 on success, -1 on error */ httpAddCredential( cups_array_t *credentials, /* I - Credentials array */ const void *data, /* I - PEM-encoded X.509 data */ size_t datalen) /* I - Length of data */ { http_credential_t *credential; /* Credential data */ if ((credential = malloc(sizeof(http_credential_t))) != NULL) { credential->datalen = datalen; if ((credential->data = malloc(datalen)) != NULL) { memcpy(credential->data, data, datalen); cupsArrayAdd(credentials, credential); return (0); } free(credential); } return (-1); } /* * 'httpBlocking()' - Set blocking/non-blocking behavior on a connection. */ void httpBlocking(http_t *http, /* I - HTTP connection */ int b) /* I - 1 = blocking, 0 = non-blocking */ { if (http) { http->blocking = b; http_set_wait(http); } } /* * 'httpCheck()' - Check to see if there is a pending response from the server. */ int /* O - 0 = no data, 1 = data available */ httpCheck(http_t *http) /* I - HTTP connection */ { return (httpWait(http, 0)); } /* * 'httpClearCookie()' - Clear the cookie value(s). * * @since CUPS 1.1.19/macOS 10.3@ */ void httpClearCookie(http_t *http) /* I - HTTP connection */ { if (!http) return; if (http->cookie) { free(http->cookie); http->cookie = NULL; } } /* * 'httpClearFields()' - Clear HTTP request fields. */ void httpClearFields(http_t *http) /* I - HTTP connection */ { http_field_t field; /* Current field */ DEBUG_printf(("httpClearFields(http=%p)", (void *)http)); if (http) { memset(http->_fields, 0, sizeof(http->fields)); for (field = HTTP_FIELD_ACCEPT_LANGUAGE; field < HTTP_FIELD_MAX; field ++) { if (http->fields[field] && http->fields[field] != http->_fields[field]) free(http->fields[field]); http->fields[field] = NULL; } if (http->mode == _HTTP_MODE_CLIENT) { if (http->hostname[0] == '/') httpSetField(http, HTTP_FIELD_HOST, "localhost"); else httpSetField(http, HTTP_FIELD_HOST, http->hostname); } http->expect = (http_status_t)0; } } /* * 'httpClose()' - Close an HTTP connection. */ void httpClose(http_t *http) /* I - HTTP connection */ { #ifdef HAVE_GSSAPI OM_uint32 minor_status; /* Minor status code */ #endif /* HAVE_GSSAPI */ DEBUG_printf(("httpClose(http=%p)", (void *)http)); /* * Range check input... */ if (!http) return; /* * Close any open connection... */ _httpDisconnect(http); /* * Free memory used... */ httpAddrFreeList(http->addrlist); if (http->cookie) free(http->cookie); #ifdef HAVE_GSSAPI if (http->gssctx != GSS_C_NO_CONTEXT) gss_delete_sec_context(&minor_status, &http->gssctx, GSS_C_NO_BUFFER); if (http->gssname != GSS_C_NO_NAME) gss_release_name(&minor_status, &http->gssname); #endif /* HAVE_GSSAPI */ #ifdef HAVE_AUTHORIZATION_H if (http->auth_ref) AuthorizationFree(http->auth_ref, kAuthorizationFlagDefaults); #endif /* HAVE_AUTHORIZATION_H */ httpClearFields(http); if (http->authstring && http->authstring != http->_authstring) free(http->authstring); free(http); } /* * 'httpCompareCredentials()' - Compare two sets of X.509 credentials. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if they match, 0 if they do not */ httpCompareCredentials( cups_array_t *cred1, /* I - First set of X.509 credentials */ cups_array_t *cred2) /* I - Second set of X.509 credentials */ { http_credential_t *temp1, *temp2; /* Temporary credentials */ for (temp1 = (http_credential_t *)cupsArrayFirst(cred1), temp2 = (http_credential_t *)cupsArrayFirst(cred2); temp1 && temp2; temp1 = (http_credential_t *)cupsArrayNext(cred1), temp2 = (http_credential_t *)cupsArrayNext(cred2)) if (temp1->datalen != temp2->datalen) return (0); else if (memcmp(temp1->data, temp2->data, temp1->datalen)) return (0); return (temp1 == temp2); } /* * 'httpConnect()' - Connect to a HTTP server. * * This function is deprecated - use @link httpConnect2@ instead. * * @deprecated@ @exclude all@ */ http_t * /* O - New HTTP connection */ httpConnect(const char *host, /* I - Host to connect to */ int port) /* I - Port number */ { return (httpConnect2(host, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL)); } /* * 'httpConnect2()' - Connect to a HTTP server. * * @since CUPS 1.7/macOS 10.9@ */ http_t * /* O - New HTTP connection */ httpConnect2( const char *host, /* I - Host to connect to */ int port, /* I - Port number */ http_addrlist_t *addrlist, /* I - List of addresses or @code NULL@ to lookup */ int family, /* I - Address family to use or @code AF_UNSPEC@ for any */ http_encryption_t encryption, /* I - Type of encryption to use */ int blocking, /* I - 1 for blocking connection, 0 for non-blocking */ int msec, /* I - Connection timeout in milliseconds, 0 means don't connect */ int *cancel) /* I - Pointer to "cancel" variable */ { http_t *http; /* New HTTP connection */ DEBUG_printf(("httpConnect2(host=\"%s\", port=%d, addrlist=%p, family=%d, encryption=%d, blocking=%d, msec=%d, cancel=%p)", host, port, (void *)addrlist, family, encryption, blocking, msec, (void *)cancel)); /* * Create the HTTP structure... */ if ((http = http_create(host, port, addrlist, family, encryption, blocking, _HTTP_MODE_CLIENT)) == NULL) return (NULL); /* * Optionally connect to the remote system... */ if (msec == 0 || !httpReconnect2(http, msec, cancel)) return (http); /* * Could not connect to any known address - bail out! */ httpClose(http); return (NULL); } /* * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption. * * This function is now deprecated. Please use the @link httpConnect2@ function * instead. * * @deprecated@ @exclude all@ */ http_t * /* O - New HTTP connection */ httpConnectEncrypt( const char *host, /* I - Host to connect to */ int port, /* I - Port number */ http_encryption_t encryption) /* I - Type of encryption to use */ { DEBUG_printf(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)", host, port, encryption)); return (httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)); } /* * 'httpDelete()' - Send a DELETE request to the server. */ int /* O - Status of call (0 = success) */ httpDelete(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI to delete */ { return (http_send(http, HTTP_STATE_DELETE, uri)); } /* * '_httpDisconnect()' - Disconnect a HTTP connection. */ void _httpDisconnect(http_t *http) /* I - HTTP connection */ { #ifdef HAVE_SSL if (http->tls) _httpTLSStop(http); #endif /* HAVE_SSL */ httpAddrClose(NULL, http->fd); http->fd = -1; } /* * 'httpEncryption()' - Set the required encryption on the link. */ int /* O - -1 on error, 0 on success */ httpEncryption(http_t *http, /* I - HTTP connection */ http_encryption_t e) /* I - New encryption preference */ { DEBUG_printf(("httpEncryption(http=%p, e=%d)", (void *)http, e)); #ifdef HAVE_SSL if (!http) return (0); if (http->mode == _HTTP_MODE_CLIENT) { http->encryption = e; if ((http->encryption == HTTP_ENCRYPTION_ALWAYS && !http->tls) || (http->encryption == HTTP_ENCRYPTION_NEVER && http->tls)) return (httpReconnect2(http, 30000, NULL)); else if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls) return (http_tls_upgrade(http)); else return (0); } else { if (e == HTTP_ENCRYPTION_NEVER && http->tls) return (-1); http->encryption = e; if (e != HTTP_ENCRYPTION_IF_REQUESTED && !http->tls) return (_httpTLSStart(http)); else return (0); } #else if (e == HTTP_ENCRYPTION_ALWAYS || e == HTTP_ENCRYPTION_REQUIRED) return (-1); else return (0); #endif /* HAVE_SSL */ } /* * 'httpError()' - Get the last error on a connection. */ int /* O - Error code (errno) value */ httpError(http_t *http) /* I - HTTP connection */ { if (http) return (http->error); else return (EINVAL); } /* * 'httpFieldValue()' - Return the HTTP field enumeration value for a field * name. */ http_field_t /* O - Field index */ httpFieldValue(const char *name) /* I - String name */ { int i; /* Looping var */ for (i = 0; i < HTTP_FIELD_MAX; i ++) if (!_cups_strcasecmp(name, http_fields[i])) return ((http_field_t)i); return (HTTP_FIELD_UNKNOWN); } /* * 'httpFlush()' - Flush data read from a HTTP connection. */ void httpFlush(http_t *http) /* I - HTTP connection */ { char buffer[8192]; /* Junk buffer */ int blocking; /* To block or not to block */ http_state_t oldstate; /* Old state */ DEBUG_printf(("httpFlush(http=%p), state=%s", (void *)http, httpStateString(http->state))); /* * Nothing to do if we are in the "waiting" state... */ if (http->state == HTTP_STATE_WAITING) return; /* * Temporarily set non-blocking mode so we don't get stuck in httpRead()... */ blocking = http->blocking; http->blocking = 0; /* * Read any data we can... */ oldstate = http->state; while (httpRead2(http, buffer, sizeof(buffer)) > 0); /* * Restore blocking and reset the connection if we didn't get all of * the remaining data... */ http->blocking = blocking; if (http->state == oldstate && http->state != HTTP_STATE_WAITING && http->fd >= 0) { /* * Didn't get the data back, so close the current connection. */ #ifdef HAVE_LIBZ if (http->coding) http_content_coding_finish(http); #endif /* HAVE_LIBZ */ DEBUG_puts("1httpFlush: Setting state to HTTP_STATE_WAITING and closing."); http->state = HTTP_STATE_WAITING; #ifdef HAVE_SSL if (http->tls) _httpTLSStop(http); #endif /* HAVE_SSL */ httpAddrClose(NULL, http->fd); http->fd = -1; } } /* * 'httpFlushWrite()' - Flush data written to a HTTP connection. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Bytes written or -1 on error */ httpFlushWrite(http_t *http) /* I - HTTP connection */ { ssize_t bytes; /* Bytes written */ DEBUG_printf(("httpFlushWrite(http=%p) data_encoding=%d", (void *)http, http ? http->data_encoding : 100)); if (!http || !http->wused) { DEBUG_puts(http ? "1httpFlushWrite: Write buffer is empty." : "1httpFlushWrite: No connection."); return (0); } if (http->data_encoding == HTTP_ENCODING_CHUNKED) bytes = http_write_chunk(http, http->wbuffer, (size_t)http->wused); else bytes = http_write(http, http->wbuffer, (size_t)http->wused); http->wused = 0; DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", (int)bytes, errno)); return ((int)bytes); } /* * 'httpFreeCredentials()' - Free an array of credentials. */ void httpFreeCredentials( cups_array_t *credentials) /* I - Array of credentials */ { http_credential_t *credential; /* Credential */ for (credential = (http_credential_t *)cupsArrayFirst(credentials); credential; credential = (http_credential_t *)cupsArrayNext(credentials)) { cupsArrayRemove(credentials, credential); free((void *)credential->data); free(credential); } cupsArrayDelete(credentials); } /* * 'httpGet()' - Send a GET request to the server. */ int /* O - Status of call (0 = success) */ httpGet(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI to get */ { return (http_send(http, HTTP_STATE_GET, uri)); } /* * 'httpGetActivity()' - Get the most recent activity for a connection. * * The return value is the time in seconds of the last read or write. * * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Time of last read or write */ httpGetActivity(http_t *http) /* I - HTTP connection */ { return (http ? http->activity : 0); } /* * 'httpGetAuthString()' - Get the current authorization string. * * The authorization string is set by @link cupsDoAuthentication@ and * @link httpSetAuthString@. Use @link httpGetAuthString@ to retrieve the * string to use with @link httpSetField@ for the * @code HTTP_FIELD_AUTHORIZATION@ value. * * @since CUPS 1.3/macOS 10.5@ */ char * /* O - Authorization string */ httpGetAuthString(http_t *http) /* I - HTTP connection */ { if (http) return (http->authstring); else return (NULL); } /* * 'httpGetBlocking()' - Get the blocking/non-block state of a connection. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 if blocking, 0 if non-blocking */ httpGetBlocking(http_t *http) /* I - HTTP connection */ { return (http ? http->blocking : 0); } /* * 'httpGetContentEncoding()' - Get a common content encoding, if any, between * the client and server. * * This function uses the value of the Accepts-Encoding HTTP header and must be * called after receiving a response from the server or a request from the * client. The value returned can be use in subsequent requests (for clients) * or in the response (for servers) in order to compress the content stream. * * @since CUPS 1.7/macOS 10.9@ */ const char * /* O - Content-Coding value or @code NULL@ for the identity coding. */ httpGetContentEncoding(http_t *http) /* I - HTTP connection */ { #ifdef HAVE_LIBZ if (http && http->fields[HTTP_FIELD_ACCEPT_ENCODING]) { int i; /* Looping var */ char temp[HTTP_MAX_VALUE], /* Copy of Accepts-Encoding value */ *start, /* Start of coding value */ *end; /* End of coding value */ double qvalue; /* "qvalue" for coding */ struct lconv *loc = localeconv(); /* Locale data */ static const char * const codings[] = { /* Supported content codings */ "deflate", "gzip", "x-deflate", "x-gzip" }; strlcpy(temp, http->fields[HTTP_FIELD_ACCEPT_ENCODING], sizeof(temp)); for (start = temp; *start; start = end) { /* * Find the end of the coding name... */ qvalue = 1.0; end = start; while (*end && *end != ';' && *end != ',' && !isspace(*end & 255)) end ++; if (*end == ';') { /* * Grab the qvalue as needed... */ if (!strncmp(end, ";q=", 3)) qvalue = _cupsStrScand(end + 3, NULL, loc); /* * Skip past all attributes... */ *end++ = '\0'; while (*end && *end != ',' && !isspace(*end & 255)) end ++; } else if (*end) *end++ = '\0'; while (*end && isspace(*end & 255)) end ++; /* * Check value if it matches something we support... */ if (qvalue <= 0.0) continue; for (i = 0; i < (int)(sizeof(codings) / sizeof(codings[0])); i ++) if (!strcmp(start, codings[i])) return (codings[i]); } } #endif /* HAVE_LIBZ */ return (NULL); } /* * 'httpGetCookie()' - Get any cookie data from the response. * * @since CUPS 1.1.19/macOS 10.3@ */ const char * /* O - Cookie data or @code NULL@ */ httpGetCookie(http_t *http) /* I - HTTP connection */ { return (http ? http->cookie : NULL); } /* * 'httpGetEncryption()' - Get the current encryption mode of a connection. * * This function returns the encryption mode for the connection. Use the * @link httpIsEncrypted@ function to determine whether a TLS session has * been established. * * @since CUPS 2.0/OS 10.10@ */ http_encryption_t /* O - Current encryption mode */ httpGetEncryption(http_t *http) /* I - HTTP connection */ { return (http ? http->encryption : HTTP_ENCRYPTION_IF_REQUESTED); } /* * 'httpGetExpect()' - Get the value of the Expect header, if any. * * Returns @code HTTP_STATUS_NONE@ if there is no Expect header, otherwise * returns the expected HTTP status code, typically @code HTTP_STATUS_CONTINUE@. * * @since CUPS 1.7/macOS 10.9@ */ http_status_t /* O - Expect: status, if any */ httpGetExpect(http_t *http) /* I - HTTP connection */ { if (!http) return (HTTP_STATUS_ERROR); else return (http->expect); } /* * 'httpGetFd()' - Get the file descriptor associated with a connection. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - File descriptor or -1 if none */ httpGetFd(http_t *http) /* I - HTTP connection */ { return (http ? http->fd : -1); } /* * 'httpGetField()' - Get a field value from a request/response. */ const char * /* O - Field value */ httpGetField(http_t *http, /* I - HTTP connection */ http_field_t field) /* I - Field to get */ { if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX) return (NULL); else if (http->fields[field]) return (http->fields[field]); else return (""); } /* * 'httpGetKeepAlive()' - Get the current Keep-Alive state of the connection. * * @since CUPS 2.0/OS 10.10@ */ http_keepalive_t /* O - Keep-Alive state */ httpGetKeepAlive(http_t *http) /* I - HTTP connection */ { return (http ? http->keep_alive : HTTP_KEEPALIVE_OFF); } /* * 'httpGetLength()' - Get the amount of data remaining from the * content-length or transfer-encoding fields. * * This function is deprecated and will not return lengths larger than * 2^31 - 1; use httpGetLength2() instead. * * @deprecated@ @exclude all@ */ int /* O - Content length */ httpGetLength(http_t *http) /* I - HTTP connection */ { /* * Get the read content length and return the 32-bit value. */ if (http) { httpGetLength2(http); return (http->_data_remaining); } else return (-1); } /* * 'httpGetLength2()' - Get the amount of data remaining from the * content-length or transfer-encoding fields. * * This function returns the complete content length, even for * content larger than 2^31 - 1. * * @since CUPS 1.2/macOS 10.5@ */ off_t /* O - Content length */ httpGetLength2(http_t *http) /* I - HTTP connection */ { off_t remaining; /* Remaining length */ DEBUG_printf(("2httpGetLength2(http=%p), state=%s", (void *)http, httpStateString(http->state))); if (!http) return (-1); if (http->fields[HTTP_FIELD_TRANSFER_ENCODING] && !_cups_strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked")) { DEBUG_puts("4httpGetLength2: chunked request!"); remaining = 0; } else { /* * The following is a hack for HTTP servers that don't send a * Content-Length or Transfer-Encoding field... * * If there is no Content-Length then the connection must close * after the transfer is complete... */ if (!http->fields[HTTP_FIELD_CONTENT_LENGTH] || !http->fields[HTTP_FIELD_CONTENT_LENGTH][0]) { /* * Default content length is 0 for errors and certain types of operations, * and 2^31-1 for other successful requests... */ if (http->status >= HTTP_STATUS_MULTIPLE_CHOICES || http->state == HTTP_STATE_OPTIONS || (http->state == HTTP_STATE_GET && http->mode == _HTTP_MODE_SERVER) || http->state == HTTP_STATE_HEAD || (http->state == HTTP_STATE_PUT && http->mode == _HTTP_MODE_CLIENT) || http->state == HTTP_STATE_DELETE || http->state == HTTP_STATE_TRACE || http->state == HTTP_STATE_CONNECT) remaining = 0; else remaining = 2147483647; } else if ((remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH], NULL, 10)) < 0) remaining = -1; DEBUG_printf(("4httpGetLength2: content_length=" CUPS_LLFMT, CUPS_LLCAST remaining)); } return (remaining); } /* * 'httpGetPending()' - Get the number of bytes that are buffered for writing. * * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Number of bytes buffered */ httpGetPending(http_t *http) /* I - HTTP connection */ { return (http ? (size_t)http->wused : 0); } /* * 'httpGetReady()' - Get the number of bytes that can be read without blocking. * * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Number of bytes available */ httpGetReady(http_t *http) /* I - HTTP connection */ { if (!http) return (0); else if (http->used > 0) return ((size_t)http->used); #ifdef HAVE_SSL else if (http->tls) return (_httpTLSPending(http)); #endif /* HAVE_SSL */ return (0); } /* * 'httpGetRemaining()' - Get the number of remaining bytes in the message * body or current chunk. * * The @link httpIsChunked@ function can be used to determine whether the * message body is chunked or fixed-length. * * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Remaining bytes */ httpGetRemaining(http_t *http) /* I - HTTP connection */ { return (http ? (size_t)http->data_remaining : 0); } /* * 'httpGets()' - Get a line of text from a HTTP connection. */ char * /* O - Line or @code NULL@ */ httpGets(char *line, /* I - Line to read into */ int length, /* I - Max length of buffer */ http_t *http) /* I - HTTP connection */ { char *lineptr, /* Pointer into line */ *lineend, /* End of line */ *bufptr, /* Pointer into input buffer */ *bufend; /* Pointer to end of buffer */ ssize_t bytes; /* Number of bytes read */ int eol; /* End-of-line? */ DEBUG_printf(("2httpGets(line=%p, length=%d, http=%p)", (void *)line, length, (void *)http)); if (!http || !line || length <= 1) return (NULL); /* * Read a line from the buffer... */ http->error = 0; lineptr = line; lineend = line + length - 1; eol = 0; while (lineptr < lineend) { /* * Pre-load the buffer as needed... */ #ifdef _WIN32 WSASetLastError(0); #else errno = 0; #endif /* _WIN32 */ while (http->used == 0) { /* * No newline; see if there is more data to be read... */ while (!_httpWait(http, http->wait_value, 1)) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; DEBUG_puts("3httpGets: Timed out!"); #ifdef _WIN32 http->error = WSAETIMEDOUT; #else http->error = ETIMEDOUT; #endif /* _WIN32 */ return (NULL); } bytes = http_read(http, http->buffer + http->used, (size_t)(HTTP_MAX_BUFFER - http->used)); DEBUG_printf(("4httpGets: read " CUPS_LLFMT " bytes.", CUPS_LLCAST bytes)); if (bytes < 0) { /* * Nope, can't get a line this time... */ #ifdef _WIN32 DEBUG_printf(("3httpGets: recv() error %d!", WSAGetLastError())); if (WSAGetLastError() == WSAEINTR) continue; else if (WSAGetLastError() == WSAEWOULDBLOCK) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; http->error = WSAGetLastError(); } else if (WSAGetLastError() != http->error) { http->error = WSAGetLastError(); continue; } #else DEBUG_printf(("3httpGets: recv() error %d!", errno)); if (errno == EINTR) continue; else if (errno == EWOULDBLOCK || errno == EAGAIN) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; else if (!http->timeout_cb && errno == EAGAIN) continue; http->error = errno; } else if (errno != http->error) { http->error = errno; continue; } #endif /* _WIN32 */ return (NULL); } else if (bytes == 0) { http->error = EPIPE; return (NULL); } /* * Yup, update the amount used... */ http->used += (int)bytes; } /* * Now copy as much of the current line as possible... */ for (bufptr = http->buffer, bufend = http->buffer + http->used; lineptr < lineend && bufptr < bufend;) { if (*bufptr == 0x0a) { eol = 1; bufptr ++; break; } else if (*bufptr == 0x0d) bufptr ++; else *lineptr++ = *bufptr++; } http->used -= (int)(bufptr - http->buffer); if (http->used > 0) memmove(http->buffer, bufptr, (size_t)http->used); if (eol) { /* * End of line... */ http->activity = time(NULL); *lineptr = '\0'; DEBUG_printf(("3httpGets: Returning \"%s\"", line)); return (line); } } DEBUG_puts("3httpGets: No new line available!"); return (NULL); } /* * 'httpGetState()' - Get the current state of the HTTP request. */ http_state_t /* O - HTTP state */ httpGetState(http_t *http) /* I - HTTP connection */ { return (http ? http->state : HTTP_STATE_ERROR); } /* * 'httpGetStatus()' - Get the status of the last HTTP request. * * @since CUPS 1.2/macOS 10.5@ */ http_status_t /* O - HTTP status */ httpGetStatus(http_t *http) /* I - HTTP connection */ { return (http ? http->status : HTTP_STATUS_ERROR); } /* * 'httpGetSubField()' - Get a sub-field value. * * @deprecated@ @exclude all@ */ char * /* O - Value or @code NULL@ */ httpGetSubField(http_t *http, /* I - HTTP connection */ http_field_t field, /* I - Field index */ const char *name, /* I - Name of sub-field */ char *value) /* O - Value string */ { return (httpGetSubField2(http, field, name, value, HTTP_MAX_VALUE)); } /* * 'httpGetSubField2()' - Get a sub-field value. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Value or @code NULL@ */ httpGetSubField2(http_t *http, /* I - HTTP connection */ http_field_t field, /* I - Field index */ const char *name, /* I - Name of sub-field */ char *value, /* O - Value string */ int valuelen) /* I - Size of value buffer */ { const char *fptr; /* Pointer into field */ char temp[HTTP_MAX_VALUE], /* Temporary buffer for name */ *ptr, /* Pointer into string buffer */ *end; /* End of value buffer */ DEBUG_printf(("2httpGetSubField2(http=%p, field=%d, name=\"%s\", value=%p, valuelen=%d)", (void *)http, field, name, (void *)value, valuelen)); if (value) *value = '\0'; if (!http || !name || !value || valuelen < 2 || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX || !http->fields[field]) return (NULL); end = value + valuelen - 1; for (fptr = http->fields[field]; *fptr;) { /* * Skip leading whitespace... */ while (_cups_isspace(*fptr)) fptr ++; if (*fptr == ',') { fptr ++; continue; } /* * Get the sub-field name... */ for (ptr = temp; *fptr && *fptr != '=' && !_cups_isspace(*fptr) && ptr < (temp + sizeof(temp) - 1); *ptr++ = *fptr++); *ptr = '\0'; DEBUG_printf(("4httpGetSubField2: name=\"%s\"", temp)); /* * Skip trailing chars up to the '='... */ while (_cups_isspace(*fptr)) fptr ++; if (!*fptr) break; if (*fptr != '=') continue; /* * Skip = and leading whitespace... */ fptr ++; while (_cups_isspace(*fptr)) fptr ++; if (*fptr == '\"') { /* * Read quoted string... */ for (ptr = value, fptr ++; *fptr && *fptr != '\"' && ptr < end; *ptr++ = *fptr++); *ptr = '\0'; while (*fptr && *fptr != '\"') fptr ++; if (*fptr) fptr ++; } else { /* * Read unquoted string... */ for (ptr = value; *fptr && !_cups_isspace(*fptr) && *fptr != ',' && ptr < end; *ptr++ = *fptr++); *ptr = '\0'; while (*fptr && !_cups_isspace(*fptr) && *fptr != ',') fptr ++; } DEBUG_printf(("4httpGetSubField2: value=\"%s\"", value)); /* * See if this is the one... */ if (!strcmp(name, temp)) { DEBUG_printf(("3httpGetSubField2: Returning \"%s\"", value)); return (value); } } value[0] = '\0'; DEBUG_puts("3httpGetSubField2: Returning NULL"); return (NULL); } /* * 'httpGetVersion()' - Get the HTTP version at the other end. */ http_version_t /* O - Version number */ httpGetVersion(http_t *http) /* I - HTTP connection */ { return (http ? http->version : HTTP_VERSION_1_0); } /* * 'httpHead()' - Send a HEAD request to the server. */ int /* O - Status of call (0 = success) */ httpHead(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI for head */ { DEBUG_printf(("httpHead(http=%p, uri=\"%s\")", (void *)http, uri)); return (http_send(http, HTTP_STATE_HEAD, uri)); } /* * 'httpInitialize()' - Initialize the HTTP interface library and set the * default HTTP proxy (if any). */ void httpInitialize(void) { static int initialized = 0; /* Have we been called before? */ #ifdef _WIN32 WSADATA winsockdata; /* WinSock data */ #endif /* _WIN32 */ _cupsGlobalLock(); if (initialized) { _cupsGlobalUnlock(); return; } #ifdef _WIN32 WSAStartup(MAKEWORD(2,2), &winsockdata); #elif !defined(SO_NOSIGPIPE) /* * Ignore SIGPIPE signals... */ # ifdef HAVE_SIGSET sigset(SIGPIPE, SIG_IGN); # elif defined(HAVE_SIGACTION) struct sigaction action; /* POSIX sigaction data */ memset(&action, 0, sizeof(action)); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); # else signal(SIGPIPE, SIG_IGN); # endif /* !SO_NOSIGPIPE */ #endif /* _WIN32 */ # ifdef HAVE_SSL _httpTLSInitialize(); # endif /* HAVE_SSL */ initialized = 1; _cupsGlobalUnlock(); } /* * 'httpIsChunked()' - Report whether a message body is chunked. * * This function returns non-zero if the message body is composed of * variable-length chunks. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if chunked, 0 if not */ httpIsChunked(http_t *http) /* I - HTTP connection */ { return (http ? http->data_encoding == HTTP_ENCODING_CHUNKED : 0); } /* * 'httpIsEncrypted()' - Report whether a connection is encrypted. * * This function returns non-zero if the connection is currently encrypted. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if encrypted, 0 if not */ httpIsEncrypted(http_t *http) /* I - HTTP connection */ { return (http ? http->tls != NULL : 0); } /* * 'httpOptions()' - Send an OPTIONS request to the server. */ int /* O - Status of call (0 = success) */ httpOptions(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI for options */ { return (http_send(http, HTTP_STATE_OPTIONS, uri)); } /* * 'httpPeek()' - Peek at data from a HTTP connection. * * This function copies available data from the given HTTP connection, reading * a buffer as needed. The data is still available for reading using * @link httpRead2@. * * For non-blocking connections the usual timeouts apply. * * @since CUPS 1.7/macOS 10.9@ */ ssize_t /* O - Number of bytes copied */ httpPeek(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer for data */ size_t length) /* I - Maximum number of bytes */ { ssize_t bytes; /* Bytes read */ char len[32]; /* Length string */ DEBUG_printf(("httpPeek(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (http == NULL || buffer == NULL) return (-1); http->activity = time(NULL); http->error = 0; if (length <= 0) return (0); if (http->data_encoding == HTTP_ENCODING_CHUNKED && http->data_remaining <= 0) { DEBUG_puts("2httpPeek: Getting chunk length..."); if (httpGets(len, sizeof(len), http) == NULL) { DEBUG_puts("1httpPeek: Could not get length!"); return (0); } if (!len[0]) { DEBUG_puts("1httpPeek: Blank chunk length, trying again..."); if (!httpGets(len, sizeof(len), http)) { DEBUG_puts("1httpPeek: Could not get chunk length."); return (0); } } http->data_remaining = strtoll(len, NULL, 16); if (http->data_remaining < 0) { DEBUG_puts("1httpPeek: Negative chunk length!"); return (0); } } DEBUG_printf(("2httpPeek: data_remaining=" CUPS_LLFMT, CUPS_LLCAST http->data_remaining)); if (http->data_remaining <= 0 && http->data_encoding != HTTP_ENCODING_FIELDS) { /* * A zero-length chunk ends a transfer; unless we are reading POST * data, go idle... */ #ifdef HAVE_LIBZ if (http->coding >= _HTTP_CODING_GUNZIP) http_content_coding_finish(http); #endif /* HAVE_LIBZ */ if (http->data_encoding == HTTP_ENCODING_CHUNKED) httpGets(len, sizeof(len), http); if (http->state == HTTP_STATE_POST_RECV) http->state ++; else http->state = HTTP_STATE_STATUS; DEBUG_printf(("1httpPeek: 0-length chunk, set state to %s.", httpStateString(http->state))); /* * Prevent future reads for this request... */ http->data_encoding = HTTP_ENCODING_FIELDS; return (0); } else if (length > (size_t)http->data_remaining) length = (size_t)http->data_remaining; #ifdef HAVE_LIBZ if (http->used == 0 && (http->coding == _HTTP_CODING_IDENTITY || (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in == 0))) #else if (http->used == 0) #endif /* HAVE_LIBZ */ { /* * Buffer small reads for better performance... */ ssize_t buflen; /* Length of read for buffer */ if (!http->blocking) { while (!httpWait(http, http->wait_value)) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; return (0); } } if ((size_t)http->data_remaining > sizeof(http->buffer)) buflen = sizeof(http->buffer); else buflen = (ssize_t)http->data_remaining; DEBUG_printf(("2httpPeek: Reading %d bytes into buffer.", (int)buflen)); bytes = http_read(http, http->buffer, (size_t)buflen); DEBUG_printf(("2httpPeek: Read " CUPS_LLFMT " bytes into buffer.", CUPS_LLCAST bytes)); if (bytes > 0) { #ifdef DEBUG http_debug_hex("httpPeek", http->buffer, (int)bytes); #endif /* DEBUG */ http->used = (int)bytes; } } #ifdef HAVE_LIBZ if (http->coding >= _HTTP_CODING_GUNZIP) { # ifdef HAVE_INFLATECOPY int zerr; /* Decompressor error */ z_stream stream; /* Copy of decompressor stream */ if (http->used > 0 && ((z_stream *)http->stream)->avail_in < HTTP_MAX_BUFFER) { size_t buflen = HTTP_MAX_BUFFER - ((z_stream *)http->stream)->avail_in; /* Number of bytes to copy */ if (((z_stream *)http->stream)->avail_in > 0 && ((z_stream *)http->stream)->next_in > http->sbuffer) memmove(http->sbuffer, ((z_stream *)http->stream)->next_in, ((z_stream *)http->stream)->avail_in); ((z_stream *)http->stream)->next_in = http->sbuffer; if (buflen > (size_t)http->data_remaining) buflen = (size_t)http->data_remaining; if (buflen > (size_t)http->used) buflen = (size_t)http->used; DEBUG_printf(("1httpPeek: Copying %d more bytes of data into " "decompression buffer.", (int)buflen)); memcpy(http->sbuffer + ((z_stream *)http->stream)->avail_in, http->buffer, buflen); ((z_stream *)http->stream)->avail_in += buflen; http->used -= (int)buflen; http->data_remaining -= (off_t)buflen; if (http->used > 0) memmove(http->buffer, http->buffer + buflen, (size_t)http->used); } DEBUG_printf(("2httpPeek: length=%d, avail_in=%d", (int)length, (int)((z_stream *)http->stream)->avail_in)); if (inflateCopy(&stream, (z_stream *)http->stream) != Z_OK) { DEBUG_puts("2httpPeek: Unable to copy decompressor stream."); http->error = ENOMEM; return (-1); } stream.next_out = (Bytef *)buffer; stream.avail_out = (uInt)length; zerr = inflate(&stream, Z_SYNC_FLUSH); inflateEnd(&stream); if (zerr < Z_OK) { DEBUG_printf(("2httpPeek: zerr=%d", zerr)); #ifdef DEBUG http_debug_hex("2httpPeek", (char *)http->sbuffer, (int)((z_stream *)http->stream)->avail_in); #endif /* DEBUG */ http->error = EIO; return (-1); } bytes = (ssize_t)(length - ((z_stream *)http->stream)->avail_out); # else DEBUG_puts("2httpPeek: No inflateCopy on this platform, httpPeek does not " "work with compressed streams."); return (-1); # endif /* HAVE_INFLATECOPY */ } else #endif /* HAVE_LIBZ */ if (http->used > 0) { if (length > (size_t)http->used) length = (size_t)http->used; bytes = (ssize_t)length; DEBUG_printf(("2httpPeek: grabbing %d bytes from input buffer...", (int)bytes)); memcpy(buffer, http->buffer, length); } else bytes = 0; if (bytes < 0) { #ifdef _WIN32 if (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK) bytes = 0; else http->error = WSAGetLastError(); #else if (errno == EINTR || errno == EAGAIN) bytes = 0; else http->error = errno; #endif /* _WIN32 */ } else if (bytes == 0) { http->error = EPIPE; return (0); } return (bytes); } /* * 'httpPost()' - Send a POST request to the server. */ int /* O - Status of call (0 = success) */ httpPost(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI for post */ { return (http_send(http, HTTP_STATE_POST, uri)); } /* * 'httpPrintf()' - Print a formatted string to a HTTP connection. * * @private@ */ int /* O - Number of bytes written */ httpPrintf(http_t *http, /* I - HTTP connection */ const char *format, /* I - printf-style format string */ ...) /* I - Additional args as needed */ { ssize_t bytes; /* Number of bytes to write */ char buf[65536]; /* Buffer for formatted string */ va_list ap; /* Variable argument pointer */ DEBUG_printf(("2httpPrintf(http=%p, format=\"%s\", ...)", (void *)http, format)); va_start(ap, format); bytes = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); DEBUG_printf(("3httpPrintf: (" CUPS_LLFMT " bytes) %s", CUPS_LLCAST bytes, buf)); 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 { if (http->wused) { DEBUG_puts("4httpPrintf: flushing existing data..."); if (httpFlushWrite(http) < 0) return (-1); } return ((int)http_write(http, buf, (size_t)bytes)); } } /* * 'httpPut()' - Send a PUT request to the server. */ int /* O - Status of call (0 = success) */ httpPut(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI to put */ { DEBUG_printf(("httpPut(http=%p, uri=\"%s\")", (void *)http, uri)); return (http_send(http, HTTP_STATE_PUT, uri)); } /* * 'httpRead()' - Read data from a HTTP connection. * * This function is deprecated. Use the httpRead2() function which can * read more than 2GB of data. * * @deprecated@ @exclude all@ */ int /* O - Number of bytes read */ httpRead(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer for data */ int length) /* I - Maximum number of bytes */ { return ((int)httpRead2(http, buffer, (size_t)length)); } /* * 'httpRead2()' - Read data from a HTTP connection. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Number of bytes read */ httpRead2(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer for data */ size_t length) /* I - Maximum number of bytes */ { ssize_t bytes; /* Bytes read */ #ifdef HAVE_LIBZ DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") coding=%d data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http->coding, http->data_encoding, CUPS_LLCAST http->data_remaining)); #else DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http->data_encoding, CUPS_LLCAST http->data_remaining)); #endif /* HAVE_LIBZ */ if (http == NULL || buffer == NULL) return (-1); http->activity = time(NULL); http->error = 0; if (length <= 0) return (0); #ifdef HAVE_LIBZ if (http->coding >= _HTTP_CODING_GUNZIP) { do { if (((z_stream *)http->stream)->avail_in > 0) { int zerr; /* Decompressor error */ DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d", (int)((z_stream *)http->stream)->avail_in, (int)length)); ((z_stream *)http->stream)->next_out = (Bytef *)buffer; ((z_stream *)http->stream)->avail_out = (uInt)length; if ((zerr = inflate((z_stream *)http->stream, Z_SYNC_FLUSH)) < Z_OK) { DEBUG_printf(("2httpRead2: zerr=%d", zerr)); #ifdef DEBUG http_debug_hex("2httpRead2", (char *)http->sbuffer, (int)((z_stream *)http->stream)->avail_in); #endif /* DEBUG */ http->error = EIO; return (-1); } bytes = (ssize_t)(length - ((z_stream *)http->stream)->avail_out); DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d, bytes=%d", ((z_stream *)http->stream)->avail_in, ((z_stream *)http->stream)->avail_out, (int)bytes)); } else bytes = 0; if (bytes == 0) { ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t)((z_stream *)http->stream)->avail_in; /* Additional bytes for buffer */ if (buflen > 0) { if (((z_stream *)http->stream)->avail_in > 0 && ((z_stream *)http->stream)->next_in > http->sbuffer) memmove(http->sbuffer, ((z_stream *)http->stream)->next_in, ((z_stream *)http->stream)->avail_in); ((z_stream *)http->stream)->next_in = http->sbuffer; DEBUG_printf(("1httpRead2: Reading up to %d more bytes of data into " "decompression buffer.", (int)buflen)); if (http->data_remaining > 0) { if (buflen > http->data_remaining) buflen = (ssize_t)http->data_remaining; bytes = http_read_buffered(http, (char *)http->sbuffer + ((z_stream *)http->stream)->avail_in, (size_t)buflen); } else if (http->data_encoding == HTTP_ENCODING_CHUNKED) bytes = http_read_chunk(http, (char *)http->sbuffer + ((z_stream *)http->stream)->avail_in, (size_t)buflen); else bytes = 0; if (bytes < 0) return (bytes); else if (bytes == 0) break; DEBUG_printf(("1httpRead2: Adding " CUPS_LLFMT " bytes to " "decompression buffer.", CUPS_LLCAST bytes)); http->data_remaining -= bytes; ((z_stream *)http->stream)->avail_in += (uInt)bytes; if (http->data_remaining <= 0 && http->data_encoding == HTTP_ENCODING_CHUNKED) { /* * Read the trailing blank line now... */ char len[32]; /* Length string */ httpGets(len, sizeof(len), http); } bytes = 0; } else return (0); } } while (bytes == 0); } else #endif /* HAVE_LIBZ */ if (http->data_remaining == 0 && http->data_encoding == HTTP_ENCODING_CHUNKED) { if ((bytes = http_read_chunk(http, buffer, length)) > 0) { http->data_remaining -= bytes; if (http->data_remaining <= 0) { /* * Read the trailing blank line now... */ char len[32]; /* Length string */ httpGets(len, sizeof(len), http); } } } else if (http->data_remaining <= 0) { /* * No more data to read... */ return (0); } else { DEBUG_printf(("1httpRead2: Reading up to %d bytes into buffer.", (int)length)); if (length > (size_t)http->data_remaining) length = (size_t)http->data_remaining; if ((bytes = http_read_buffered(http, buffer, length)) > 0) { http->data_remaining -= bytes; if (http->data_remaining <= 0 && http->data_encoding == HTTP_ENCODING_CHUNKED) { /* * Read the trailing blank line now... */ char len[32]; /* Length string */ httpGets(len, sizeof(len), http); } } } if ( #ifdef HAVE_LIBZ (http->coding == _HTTP_CODING_IDENTITY || (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in == 0)) && #endif /* HAVE_LIBZ */ ((http->data_remaining <= 0 && http->data_encoding == HTTP_ENCODING_LENGTH) || (http->data_encoding == HTTP_ENCODING_CHUNKED && bytes == 0))) { #ifdef HAVE_LIBZ if (http->coding >= _HTTP_CODING_GUNZIP) http_content_coding_finish(http); #endif /* HAVE_LIBZ */ if (http->state == HTTP_STATE_POST_RECV) http->state ++; else if (http->state == HTTP_STATE_GET_SEND || http->state == HTTP_STATE_POST_SEND) http->state = HTTP_STATE_WAITING; else http->state = HTTP_STATE_STATUS; DEBUG_printf(("1httpRead2: End of content, set state to %s.", httpStateString(http->state))); } return (bytes); } /* * 'httpReadRequest()' - Read a HTTP request from a connection. * * @since CUPS 1.7/macOS 10.9@ */ http_state_t /* O - New state of connection */ httpReadRequest(http_t *http, /* I - HTTP connection */ char *uri, /* I - URI buffer */ size_t urilen) /* I - Size of URI buffer */ { char line[4096], /* HTTP request line */ *req_method, /* HTTP request method */ *req_uri, /* HTTP request URI */ *req_version; /* HTTP request version number string */ /* * Range check input... */ DEBUG_printf(("httpReadRequest(http=%p, uri=%p, urilen=" CUPS_LLFMT ")", (void *)http, (void *)uri, CUPS_LLCAST urilen)); if (uri) *uri = '\0'; if (!http || !uri || urilen < 1) { DEBUG_puts("1httpReadRequest: Bad arguments, returning HTTP_STATE_ERROR."); return (HTTP_STATE_ERROR); } else if (http->state != HTTP_STATE_WAITING) { DEBUG_printf(("1httpReadRequest: Bad state %s, returning HTTP_STATE_ERROR.", httpStateString(http->state))); return (HTTP_STATE_ERROR); } /* * Reset state... */ httpClearFields(http); http->activity = time(NULL); http->data_encoding = HTTP_ENCODING_FIELDS; http->data_remaining = 0; http->keep_alive = HTTP_KEEPALIVE_OFF; http->status = HTTP_STATUS_OK; http->version = HTTP_VERSION_1_1; /* * Read a line from the socket... */ if (!httpGets(line, sizeof(line), http)) { DEBUG_puts("1httpReadRequest: Unable to read, returning HTTP_STATE_ERROR"); return (HTTP_STATE_ERROR); } if (!line[0]) { DEBUG_puts("1httpReadRequest: Blank line, returning HTTP_STATE_WAITING"); return (HTTP_STATE_WAITING); } DEBUG_printf(("1httpReadRequest: %s", line)); /* * Parse it... */ req_method = line; req_uri = line; while (*req_uri && !isspace(*req_uri & 255)) req_uri ++; if (!*req_uri) { DEBUG_puts("1httpReadRequest: No request URI."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request URI."), 1); return (HTTP_STATE_ERROR); } *req_uri++ = '\0'; while (*req_uri && isspace(*req_uri & 255)) req_uri ++; req_version = req_uri; while (*req_version && !isspace(*req_version & 255)) req_version ++; if (!*req_version) { DEBUG_puts("1httpReadRequest: No request protocol version."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No request protocol version."), 1); return (HTTP_STATE_ERROR); } *req_version++ = '\0'; while (*req_version && isspace(*req_version & 255)) req_version ++; /* * Validate... */ if (!strcmp(req_method, "OPTIONS")) http->state = HTTP_STATE_OPTIONS; else if (!strcmp(req_method, "GET")) http->state = HTTP_STATE_GET; else if (!strcmp(req_method, "HEAD")) http->state = HTTP_STATE_HEAD; else if (!strcmp(req_method, "POST")) http->state = HTTP_STATE_POST; else if (!strcmp(req_method, "PUT")) http->state = HTTP_STATE_PUT; else if (!strcmp(req_method, "DELETE")) http->state = HTTP_STATE_DELETE; else if (!strcmp(req_method, "TRACE")) http->state = HTTP_STATE_TRACE; else if (!strcmp(req_method, "CONNECT")) http->state = HTTP_STATE_CONNECT; else { DEBUG_printf(("1httpReadRequest: Unknown method \"%s\".", req_method)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown request method."), 1); return (HTTP_STATE_UNKNOWN_METHOD); } DEBUG_printf(("1httpReadRequest: Set state to %s.", httpStateString(http->state))); if (!strcmp(req_version, "HTTP/1.0")) { http->version = HTTP_VERSION_1_0; http->keep_alive = HTTP_KEEPALIVE_OFF; } else if (!strcmp(req_version, "HTTP/1.1")) { http->version = HTTP_VERSION_1_1; http->keep_alive = HTTP_KEEPALIVE_ON; } else { DEBUG_printf(("1httpReadRequest: Unknown version \"%s\".", req_version)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown request version."), 1); return (HTTP_STATE_UNKNOWN_VERSION); } DEBUG_printf(("1httpReadRequest: URI is \"%s\".", req_uri)); strlcpy(uri, req_uri, urilen); return (http->state); } /* * 'httpReconnect()' - Reconnect to a HTTP server. * * This function is deprecated. Please use the @link httpReconnect2@ function * instead. * * @deprecated@ @exclude all@ */ int /* O - 0 on success, non-zero on failure */ httpReconnect(http_t *http) /* I - HTTP connection */ { DEBUG_printf(("httpReconnect(http=%p)", (void *)http)); return (httpReconnect2(http, 30000, NULL)); } /* * 'httpReconnect2()' - Reconnect to a HTTP server with timeout and optional * cancel. */ int /* O - 0 on success, non-zero on failure */ httpReconnect2(http_t *http, /* I - HTTP connection */ int msec, /* I - Timeout in milliseconds */ int *cancel) /* I - Pointer to "cancel" variable */ { http_addrlist_t *addr; /* Connected address */ #ifdef DEBUG http_addrlist_t *current; /* Current address */ char temp[256]; /* Temporary address string */ #endif /* DEBUG */ DEBUG_printf(("httpReconnect2(http=%p, msec=%d, cancel=%p)", (void *)http, msec, (void *)cancel)); if (!http) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (-1); } #ifdef HAVE_SSL if (http->tls) { DEBUG_puts("2httpReconnect2: Shutting down SSL/TLS..."); _httpTLSStop(http); } #endif /* HAVE_SSL */ /* * Close any previously open socket... */ if (http->fd >= 0) { DEBUG_printf(("2httpReconnect2: Closing socket %d...", http->fd)); httpAddrClose(NULL, http->fd); http->fd = -1; } /* * Reset all state (except fields, which may be reused)... */ http->state = HTTP_STATE_WAITING; http->version = HTTP_VERSION_1_1; http->keep_alive = HTTP_KEEPALIVE_OFF; memset(&http->_hostaddr, 0, sizeof(http->_hostaddr)); http->data_encoding = HTTP_ENCODING_FIELDS; http->_data_remaining = 0; http->used = 0; http->data_remaining = 0; http->hostaddr = NULL; http->wused = 0; /* * Connect to the server... */ #ifdef DEBUG for (current = http->addrlist; current; current = current->next) DEBUG_printf(("2httpReconnect2: Address %s:%d", httpAddrString(&(current->addr), temp, sizeof(temp)), httpAddrPort(&(current->addr)))); #endif /* DEBUG */ if ((addr = httpAddrConnect2(http->addrlist, &(http->fd), msec, cancel)) == NULL) { /* * Unable to connect... */ #ifdef _WIN32 http->error = WSAGetLastError(); #else http->error = errno; #endif /* _WIN32 */ http->status = HTTP_STATUS_ERROR; DEBUG_printf(("1httpReconnect2: httpAddrConnect failed: %s", strerror(http->error))); return (-1); } DEBUG_printf(("2httpReconnect2: New socket=%d", http->fd)); if (http->timeout_value > 0) http_set_timeout(http->fd, http->timeout_value); http->hostaddr = &(addr->addr); http->error = 0; #ifdef HAVE_SSL if (http->encryption == HTTP_ENCRYPTION_ALWAYS) { /* * Always do encryption via SSL. */ if (_httpTLSStart(http) != 0) { httpAddrClose(NULL, http->fd); return (-1); } } else if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls_upgrade) return (http_tls_upgrade(http)); #endif /* HAVE_SSL */ DEBUG_printf(("1httpReconnect2: Connected to %s:%d...", httpAddrString(http->hostaddr, temp, sizeof(temp)), httpAddrPort(http->hostaddr))); return (0); } /* * 'httpSetAuthString()' - Set the current authorization string. * * This function just stores a copy of the current authorization string in * the HTTP connection object. You must still call @link httpSetField@ to set * @code HTTP_FIELD_AUTHORIZATION@ prior to issuing a HTTP request using * @link httpGet@, @link httpHead@, @link httpOptions@, @link httpPost@, or * @link httpPut@. * * @since CUPS 1.3/macOS 10.5@ */ void httpSetAuthString(http_t *http, /* I - HTTP connection */ const char *scheme, /* I - Auth scheme (NULL to clear it) */ const char *data) /* I - Auth data (NULL for none) */ { /* * Range check input... */ if (!http) return; if (http->authstring && http->authstring != http->_authstring) free(http->authstring); http->authstring = http->_authstring; if (scheme) { /* * Set the current authorization string... */ size_t len = strlen(scheme) + (data ? strlen(data) + 1 : 0) + 1; char *temp; if (len > sizeof(http->_authstring)) { if ((temp = malloc(len)) == NULL) len = sizeof(http->_authstring); else http->authstring = temp; } if (data) snprintf(http->authstring, len, "%s %s", scheme, data); else strlcpy(http->authstring, scheme, len); } else { /* * Clear the current authorization string... */ http->_authstring[0] = '\0'; } } /* * 'httpSetCredentials()' - Set the credentials associated with an encrypted * connection. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - Status of call (0 = success) */ httpSetCredentials(http_t *http, /* I - HTTP connection */ cups_array_t *credentials) /* I - Array of credentials */ { if (!http || cupsArrayCount(credentials) < 1) return (-1); #ifdef HAVE_SSL _httpFreeCredentials(http->tls_credentials); http->tls_credentials = _httpCreateCredentials(credentials); #endif /* HAVE_SSL */ return (http->tls_credentials ? 0 : -1); } /* * 'httpSetCookie()' - Set the cookie value(s). * * @since CUPS 1.1.19/macOS 10.3@ */ void httpSetCookie(http_t *http, /* I - Connection */ const char *cookie) /* I - Cookie string */ { if (!http) return; if (http->cookie) free(http->cookie); if (cookie) http->cookie = strdup(cookie); else http->cookie = NULL; } /* * 'httpSetDefaultField()' - Set the default value of an HTTP header. * * Currently only @code HTTP_FIELD_ACCEPT_ENCODING@, @code HTTP_FIELD_SERVER@, * and @code HTTP_FIELD_USER_AGENT@ can be set. * * @since CUPS 1.7/macOS 10.9@ */ void httpSetDefaultField(http_t *http, /* I - HTTP connection */ http_field_t field, /* I - Field index */ const char *value)/* I - Value */ { DEBUG_printf(("httpSetDefaultField(http=%p, field=%d(%s), value=\"%s\")", (void *)http, field, http_fields[field], value)); if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX) return; if (http->default_fields[field]) free(http->default_fields[field]); http->default_fields[field] = value ? strdup(value) : NULL; } /* * 'httpSetExpect()' - Set the Expect: header in a request. * * Currently only @code HTTP_STATUS_CONTINUE@ is supported for the "expect" * argument. * * @since CUPS 1.2/macOS 10.5@ */ void httpSetExpect(http_t *http, /* I - HTTP connection */ http_status_t expect) /* I - HTTP status to expect (@code HTTP_STATUS_CONTINUE@) */ { DEBUG_printf(("httpSetExpect(http=%p, expect=%d)", (void *)http, expect)); if (http) http->expect = expect; } /* * 'httpSetField()' - Set the value of an HTTP header. */ void httpSetField(http_t *http, /* I - HTTP connection */ http_field_t field, /* I - Field index */ const char *value) /* I - Value */ { DEBUG_printf(("httpSetField(http=%p, field=%d(%s), value=\"%s\")", (void *)http, field, http_fields[field], value)); if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX || !value) return; http_add_field(http, field, value, 0); } /* * 'httpSetKeepAlive()' - Set the current Keep-Alive state of a connection. * * @since CUPS 2.0/OS 10.10@ */ void httpSetKeepAlive( http_t *http, /* I - HTTP connection */ http_keepalive_t keep_alive) /* I - New Keep-Alive value */ { if (http) http->keep_alive = keep_alive; } /* * 'httpSetLength()' - Set the content-length and content-encoding. * * @since CUPS 1.2/macOS 10.5@ */ void httpSetLength(http_t *http, /* I - HTTP connection */ size_t length) /* I - Length (0 for chunked) */ { DEBUG_printf(("httpSetLength(http=%p, length=" CUPS_LLFMT ")", (void *)http, CUPS_LLCAST length)); if (!http) return; if (!length) { httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked"); httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, ""); } else { char len[32]; /* Length string */ snprintf(len, sizeof(len), CUPS_LLFMT, CUPS_LLCAST length); httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, ""); httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, len); } } /* * 'httpSetTimeout()' - Set read/write timeouts and an optional callback. * * The optional timeout callback receives both the HTTP connection and a user * data pointer and must return 1 to continue or 0 to error (time) out. * * @since CUPS 1.5/macOS 10.7@ */ void httpSetTimeout( http_t *http, /* I - HTTP connection */ double timeout, /* I - Number of seconds for timeout, must be greater than 0 */ http_timeout_cb_t cb, /* I - Callback function or @code NULL@ */ void *user_data) /* I - User data pointer */ { if (!http || timeout <= 0.0) return; http->timeout_cb = cb; http->timeout_data = user_data; http->timeout_value = timeout; if (http->fd >= 0) http_set_timeout(http->fd, timeout); http_set_wait(http); } /* * 'httpShutdown()' - Shutdown one side of an HTTP connection. * * @since CUPS 2.0/OS 10.10@ */ void httpShutdown(http_t *http) /* I - HTTP connection */ { if (!http || http->fd < 0) return; #ifdef HAVE_SSL if (http->tls) _httpTLSStop(http); #endif /* HAVE_SSL */ #ifdef _WIN32 shutdown(http->fd, SD_RECEIVE); /* Microsoft-ism... */ #else shutdown(http->fd, SHUT_RD); #endif /* _WIN32 */ } /* * 'httpTrace()' - Send an TRACE request to the server. * * @exclude all@ */ int /* O - Status of call (0 = success) */ httpTrace(http_t *http, /* I - HTTP connection */ const char *uri) /* I - URI for trace */ { return (http_send(http, HTTP_STATE_TRACE, uri)); } /* * '_httpUpdate()' - Update the current HTTP status for incoming data. * * Note: Unlike httpUpdate(), this function does not flush pending write data * and only retrieves a single status line from the HTTP connection. */ int /* O - 1 to continue, 0 to stop */ _httpUpdate(http_t *http, /* I - HTTP connection */ http_status_t *status) /* O - Current HTTP status */ { char line[32768], /* Line from connection... */ *value; /* Pointer to value on line */ http_field_t field; /* Field index */ int major, minor; /* HTTP version numbers */ DEBUG_printf(("_httpUpdate(http=%p, status=%p), state=%s", (void *)http, (void *)status, httpStateString(http->state))); /* * Grab a single line from the connection... */ if (!httpGets(line, sizeof(line), http)) { *status = HTTP_STATUS_ERROR; return (0); } DEBUG_printf(("2_httpUpdate: Got \"%s\"", line)); if (line[0] == '\0') { /* * Blank line means the start of the data section (if any). Return * the result code, too... * * If we get status 100 (HTTP_STATUS_CONTINUE), then we *don't* change * states. Instead, we just return HTTP_STATUS_CONTINUE to the caller and * keep on tryin'... */ if (http->status == HTTP_STATUS_CONTINUE) { *status = http->status; return (0); } if (http->status < HTTP_STATUS_BAD_REQUEST) http->digest_tries = 0; #ifdef HAVE_SSL if (http->status == HTTP_STATUS_SWITCHING_PROTOCOLS && !http->tls) { if (_httpTLSStart(http) != 0) { httpAddrClose(NULL, http->fd); *status = http->status = HTTP_STATUS_ERROR; return (0); } *status = HTTP_STATUS_CONTINUE; return (0); } #endif /* HAVE_SSL */ if (http_set_length(http) < 0) { DEBUG_puts("1_httpUpdate: Bad Content-Length."); http->error = EINVAL; http->status = *status = HTTP_STATUS_ERROR; return (0); } switch (http->state) { case HTTP_STATE_GET : case HTTP_STATE_POST : case HTTP_STATE_POST_RECV : case HTTP_STATE_PUT : http->state ++; DEBUG_printf(("1_httpUpdate: Set state to %s.", httpStateString(http->state))); case HTTP_STATE_POST_SEND : case HTTP_STATE_HEAD : break; default : http->state = HTTP_STATE_WAITING; DEBUG_puts("1_httpUpdate: Reset state to HTTP_STATE_WAITING."); break; } #ifdef HAVE_LIBZ DEBUG_puts("1_httpUpdate: Calling http_content_coding_start."); http_content_coding_start(http, httpGetField(http, HTTP_FIELD_CONTENT_ENCODING)); #endif /* HAVE_LIBZ */ *status = http->status; return (0); } else if (!strncmp(line, "HTTP/", 5) && http->mode == _HTTP_MODE_CLIENT) { /* * Got the beginning of a response... */ int intstatus; /* Status value as an integer */ if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &intstatus) != 3) { *status = http->status = HTTP_STATUS_ERROR; return (0); } httpClearFields(http); http->version = (http_version_t)(major * 100 + minor); *status = http->status = (http_status_t)intstatus; } else if ((value = strchr(line, ':')) != NULL) { /* * Got a value... */ *value++ = '\0'; while (_cups_isspace(*value)) value ++; DEBUG_printf(("1_httpUpdate: Header %s: %s", line, value)); /* * Be tolerants of servers that send unknown attribute fields... */ if (!_cups_strcasecmp(line, "expect")) { /* * "Expect: 100-continue" or similar... */ http->expect = (http_status_t)atoi(value); } else if (!_cups_strcasecmp(line, "cookie")) { /* * "Cookie: name=value[; name=value ...]" - replaces previous cookies... */ httpSetCookie(http, value); } else if ((field = httpFieldValue(line)) != HTTP_FIELD_UNKNOWN) { http_add_field(http, field, value, 1); if (field == HTTP_FIELD_AUTHENTICATION_INFO) httpGetSubField2(http, HTTP_FIELD_AUTHENTICATION_INFO, "nextnonce", http->nextnonce, (int)sizeof(http->nextnonce)); } #ifdef DEBUG else DEBUG_printf(("1_httpUpdate: unknown field %s seen!", line)); #endif /* DEBUG */ } else { DEBUG_printf(("1_httpUpdate: Bad response line \"%s\"!", line)); http->error = EINVAL; http->status = *status = HTTP_STATUS_ERROR; return (0); } return (1); } /* * 'httpUpdate()' - Update the current HTTP state for incoming data. */ http_status_t /* O - HTTP status */ httpUpdate(http_t *http) /* I - HTTP connection */ { http_status_t status; /* Request status */ DEBUG_printf(("httpUpdate(http=%p), state=%s", (void *)http, httpStateString(http->state))); /* * Flush pending data, if any... */ if (http->wused) { DEBUG_puts("2httpUpdate: flushing buffer..."); if (httpFlushWrite(http) < 0) return (HTTP_STATUS_ERROR); } /* * If we haven't issued any commands, then there is nothing to "update"... */ if (http->state == HTTP_STATE_WAITING) return (HTTP_STATUS_CONTINUE); /* * Grab all of the lines we can from the connection... */ while (_httpUpdate(http, &status)); /* * See if there was an error... */ if (http->error == EPIPE && http->status > HTTP_STATUS_CONTINUE) { DEBUG_printf(("1httpUpdate: Returning status %d...", http->status)); return (http->status); } if (http->error) { DEBUG_printf(("1httpUpdate: socket error %d - %s", http->error, strerror(http->error))); http->status = HTTP_STATUS_ERROR; return (HTTP_STATUS_ERROR); } /* * Return the current status... */ return (status); } /* * '_httpWait()' - Wait for data available on a connection (no flush). */ int /* O - 1 if data is available, 0 otherwise */ _httpWait(http_t *http, /* I - HTTP connection */ int msec, /* I - Milliseconds to wait */ int usessl) /* I - Use SSL context? */ { #ifdef HAVE_POLL struct pollfd pfd; /* Polled file descriptor */ #else fd_set input_set; /* select() input set */ struct timeval timeout; /* Timeout */ #endif /* HAVE_POLL */ int nfds; /* Result from select()/poll() */ DEBUG_printf(("4_httpWait(http=%p, msec=%d, usessl=%d)", (void *)http, msec, usessl)); if (http->fd < 0) { DEBUG_printf(("5_httpWait: Returning 0 since fd=%d", http->fd)); return (0); } /* * Check the SSL/TLS buffers for data first... */ #ifdef HAVE_SSL if (http->tls && _httpTLSPending(http)) { DEBUG_puts("5_httpWait: Return 1 since there is pending TLS data."); return (1); } #endif /* HAVE_SSL */ /* * Then try doing a select() or poll() to poll the socket... */ #ifdef HAVE_POLL pfd.fd = http->fd; pfd.events = POLLIN; do { nfds = poll(&pfd, 1, msec); } while (nfds < 0 && (errno == EINTR || errno == EAGAIN)); #else do { FD_ZERO(&input_set); FD_SET(http->fd, &input_set); DEBUG_printf(("6_httpWait: msec=%d, http->fd=%d", msec, http->fd)); if (msec >= 0) { timeout.tv_sec = msec / 1000; timeout.tv_usec = (msec % 1000) * 1000; nfds = select(http->fd + 1, &input_set, NULL, NULL, &timeout); } else nfds = select(http->fd + 1, &input_set, NULL, NULL, NULL); DEBUG_printf(("6_httpWait: select() returned %d...", nfds)); } # ifdef _WIN32 while (nfds < 0 && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK)); # else while (nfds < 0 && (errno == EINTR || errno == EAGAIN)); # endif /* _WIN32 */ #endif /* HAVE_POLL */ DEBUG_printf(("5_httpWait: returning with nfds=%d, errno=%d...", nfds, errno)); return (nfds > 0); } /* * 'httpWait()' - Wait for data available on a connection. * * @since CUPS 1.1.19/macOS 10.3@ */ int /* O - 1 if data is available, 0 otherwise */ httpWait(http_t *http, /* I - HTTP connection */ int msec) /* I - Milliseconds to wait */ { /* * First see if there is data in the buffer... */ DEBUG_printf(("2httpWait(http=%p, msec=%d)", (void *)http, msec)); if (http == NULL) return (0); if (http->used) { DEBUG_puts("3httpWait: Returning 1 since there is buffered data ready."); return (1); } #ifdef HAVE_LIBZ if (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in > 0) { DEBUG_puts("3httpWait: Returning 1 since there is buffered data ready."); return (1); } #endif /* HAVE_LIBZ */ /* * Flush pending data, if any... */ if (http->wused) { DEBUG_puts("3httpWait: Flushing write buffer."); if (httpFlushWrite(http) < 0) return (0); } /* * If not, check the SSL/TLS buffers and do a select() on the connection... */ return (_httpWait(http, msec, 1)); } /* * 'httpWrite()' - Write data to a HTTP connection. * * This function is deprecated. Use the httpWrite2() function which can * write more than 2GB of data. * * @deprecated@ @exclude all@ */ int /* O - Number of bytes written */ httpWrite(http_t *http, /* I - HTTP connection */ const char *buffer, /* I - Buffer for data */ int length) /* I - Number of bytes to write */ { return ((int)httpWrite2(http, buffer, (size_t)length)); } /* * 'httpWrite2()' - Write data to a HTTP connection. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Number of bytes written */ httpWrite2(http_t *http, /* I - HTTP connection */ const char *buffer, /* I - Buffer for data */ size_t length) /* I - Number of bytes to write */ { ssize_t bytes; /* Bytes written */ DEBUG_printf(("httpWrite2(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); /* * Range check input... */ if (!http || !buffer) { DEBUG_puts("1httpWrite2: Returning -1 due to bad input."); return (-1); } /* * Mark activity on the connection... */ http->activity = time(NULL); /* * Buffer small writes for better performance... */ #ifdef HAVE_LIBZ if (http->coding == _HTTP_CODING_GZIP || http->coding == _HTTP_CODING_DEFLATE) { DEBUG_printf(("1httpWrite2: http->coding=%d", http->coding)); if (length == 0) { http_content_coding_finish(http); bytes = 0; } else { size_t slen; /* Bytes to write */ ssize_t sret; /* Bytes written */ ((z_stream *)http->stream)->next_in = (Bytef *)buffer; ((z_stream *)http->stream)->avail_in = (uInt)length; while (deflate((z_stream *)http->stream, Z_NO_FLUSH) == Z_OK) { DEBUG_printf(("1httpWrite2: avail_out=%d", ((z_stream *)http->stream)->avail_out)); if (((z_stream *)http->stream)->avail_out > 0) continue; slen = _HTTP_MAX_SBUFFER - ((z_stream *)http->stream)->avail_out; DEBUG_printf(("1httpWrite2: Writing intermediate chunk, len=%d", (int)slen)); if (slen > 0 && http->data_encoding == HTTP_ENCODING_CHUNKED) sret = http_write_chunk(http, (char *)http->sbuffer, slen); else if (slen > 0) sret = http_write(http, (char *)http->sbuffer, slen); else sret = 0; if (sret < 0) { DEBUG_puts("1httpWrite2: Unable to write, returning -1."); return (-1); } ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer; ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER; } bytes = (ssize_t)length; } } else #endif /* HAVE_LIBZ */ if (length > 0) { if (http->wused && (length + (size_t)http->wused) > sizeof(http->wbuffer)) { DEBUG_printf(("2httpWrite2: Flushing buffer (wused=%d, length=" CUPS_LLFMT ")", http->wused, CUPS_LLCAST length)); httpFlushWrite(http); } if ((length + (size_t)http->wused) <= sizeof(http->wbuffer) && length < sizeof(http->wbuffer)) { /* * Write to buffer... */ DEBUG_printf(("2httpWrite2: Copying " CUPS_LLFMT " bytes to wbuffer...", CUPS_LLCAST length)); memcpy(http->wbuffer + http->wused, buffer, length); http->wused += (int)length; bytes = (ssize_t)length; } else { /* * Otherwise write the data directly... */ DEBUG_printf(("2httpWrite2: Writing " CUPS_LLFMT " bytes to socket...", CUPS_LLCAST length)); if (http->data_encoding == HTTP_ENCODING_CHUNKED) bytes = (ssize_t)http_write_chunk(http, buffer, length); else bytes = (ssize_t)http_write(http, buffer, length); DEBUG_printf(("2httpWrite2: Wrote " CUPS_LLFMT " bytes...", CUPS_LLCAST bytes)); } if (http->data_encoding == HTTP_ENCODING_LENGTH) http->data_remaining -= bytes; } else bytes = 0; /* * Handle end-of-request processing... */ if ((http->data_encoding == HTTP_ENCODING_CHUNKED && length == 0) || (http->data_encoding == HTTP_ENCODING_LENGTH && http->data_remaining == 0)) { /* * Finished with the transfer; unless we are sending POST or PUT * data, go idle... */ #ifdef HAVE_LIBZ if (http->coding == _HTTP_CODING_GZIP || http->coding == _HTTP_CODING_DEFLATE) http_content_coding_finish(http); #endif /* HAVE_LIBZ */ if (http->wused) { if (httpFlushWrite(http) < 0) return (-1); } if (http->data_encoding == HTTP_ENCODING_CHUNKED) { /* * Send a 0-length chunk at the end of the request... */ http_write(http, "0\r\n\r\n", 5); /* * Reset the data state... */ http->data_encoding = HTTP_ENCODING_FIELDS; http->data_remaining = 0; } if (http->state == HTTP_STATE_POST_RECV) http->state ++; else if (http->state == HTTP_STATE_POST_SEND || http->state == HTTP_STATE_GET_SEND) http->state = HTTP_STATE_WAITING; else http->state = HTTP_STATE_STATUS; DEBUG_printf(("2httpWrite2: Changed state to %s.", httpStateString(http->state))); } DEBUG_printf(("1httpWrite2: Returning " CUPS_LLFMT ".", CUPS_LLCAST bytes)); return (bytes); } /* * 'httpWriteResponse()' - Write a HTTP response to a client connection. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 0 on success, -1 on error */ httpWriteResponse(http_t *http, /* I - HTTP connection */ http_status_t status) /* I - Status code */ { http_encoding_t old_encoding; /* Old data_encoding value */ off_t old_remaining; /* Old data_remaining value */ /* * Range check input... */ DEBUG_printf(("httpWriteResponse(http=%p, status=%d)", (void *)http, status)); if (!http || status < HTTP_STATUS_CONTINUE) { DEBUG_puts("1httpWriteResponse: Bad input."); return (-1); } /* * Set the various standard fields if they aren't already... */ if (!http->fields[HTTP_FIELD_DATE]) httpSetField(http, HTTP_FIELD_DATE, httpGetDateString(time(NULL))); if (status >= HTTP_STATUS_BAD_REQUEST && http->keep_alive) { http->keep_alive = HTTP_KEEPALIVE_OFF; httpSetField(http, HTTP_FIELD_KEEP_ALIVE, ""); } if (http->version == HTTP_VERSION_1_1) { if (!http->fields[HTTP_FIELD_CONNECTION]) { if (http->keep_alive) httpSetField(http, HTTP_FIELD_CONNECTION, "Keep-Alive"); else httpSetField(http, HTTP_FIELD_CONNECTION, "close"); } if (http->keep_alive && !http->fields[HTTP_FIELD_KEEP_ALIVE]) httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "timeout=10"); } #ifdef HAVE_SSL if (status == HTTP_STATUS_UPGRADE_REQUIRED || status == HTTP_STATUS_SWITCHING_PROTOCOLS) { if (!http->fields[HTTP_FIELD_CONNECTION]) httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade"); if (!http->fields[HTTP_FIELD_UPGRADE]) httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0"); if (!http->fields[HTTP_FIELD_CONTENT_LENGTH]) httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, "0"); } #endif /* HAVE_SSL */ if (!http->fields[HTTP_FIELD_SERVER]) httpSetField(http, HTTP_FIELD_SERVER, http->default_fields[HTTP_FIELD_SERVER] ? http->default_fields[HTTP_FIELD_SERVER] : CUPS_MINIMAL); /* * Set the Accept-Encoding field if it isn't already... */ if (!http->fields[HTTP_FIELD_ACCEPT_ENCODING]) httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING, http->default_fields[HTTP_FIELD_ACCEPT_ENCODING] ? http->default_fields[HTTP_FIELD_ACCEPT_ENCODING] : #ifdef HAVE_LIBZ "gzip, deflate, identity"); #else "identity"); #endif /* HAVE_LIBZ */ /* * Send the response header... */ old_encoding = http->data_encoding; old_remaining = http->data_remaining; http->data_encoding = HTTP_ENCODING_FIELDS; if (httpPrintf(http, "HTTP/%d.%d %d %s\r\n", http->version / 100, http->version % 100, (int)status, httpStatus(status)) < 0) { http->status = HTTP_STATUS_ERROR; return (-1); } if (status != HTTP_STATUS_CONTINUE) { /* * 100 Continue doesn't have the rest of the response headers... */ int i; /* Looping var */ const char *value; /* Field value */ for (i = 0; i < HTTP_FIELD_MAX; i ++) { if ((value = httpGetField(http, i)) != NULL && *value) { if (httpPrintf(http, "%s: %s\r\n", http_fields[i], value) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } } if (http->cookie) { if (strchr(http->cookie, ';')) { if (httpPrintf(http, "Set-Cookie: %s\r\n", http->cookie) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } else if (httpPrintf(http, "Set-Cookie: %s; path=/; httponly;%s\r\n", http->cookie, http->tls ? " secure;" : "") < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } /* * "Click-jacking" defense (STR #4492)... */ if (httpPrintf(http, "X-Frame-Options: DENY\r\n" "Content-Security-Policy: frame-ancestors 'none'\r\n") < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } if (httpWrite2(http, "\r\n", 2) < 2) { http->status = HTTP_STATUS_ERROR; return (-1); } if (httpFlushWrite(http) < 0) { http->status = HTTP_STATUS_ERROR; return (-1); } if (status == HTTP_STATUS_CONTINUE || status == HTTP_STATUS_SWITCHING_PROTOCOLS) { /* * Restore the old data_encoding and data_length values... */ http->data_encoding = old_encoding; http->data_remaining = old_remaining; if (old_remaining <= INT_MAX) http->_data_remaining = (int)old_remaining; else http->_data_remaining = INT_MAX; } else if (http->state == HTTP_STATE_OPTIONS || http->state == HTTP_STATE_HEAD || http->state == HTTP_STATE_PUT || http->state == HTTP_STATE_TRACE || http->state == HTTP_STATE_CONNECT || http->state == HTTP_STATE_STATUS) { DEBUG_printf(("1httpWriteResponse: Resetting state to HTTP_STATE_WAITING, " "was %s.", httpStateString(http->state))); http->state = HTTP_STATE_WAITING; } else { /* * Force data_encoding and data_length to be set according to the response * headers... */ http_set_length(http); if (http->data_encoding == HTTP_ENCODING_LENGTH && http->data_remaining == 0) { DEBUG_printf(("1httpWriteResponse: Resetting state to HTTP_STATE_WAITING, " "was %s.", httpStateString(http->state))); http->state = HTTP_STATE_WAITING; return (0); } if (http->state == HTTP_STATE_POST_RECV || http->state == HTTP_STATE_GET) http->state ++; #ifdef HAVE_LIBZ /* * Then start any content encoding... */ DEBUG_puts("1httpWriteResponse: Calling http_content_coding_start."); http_content_coding_start(http, httpGetField(http, HTTP_FIELD_CONTENT_ENCODING)); #endif /* HAVE_LIBZ */ } return (0); } /* * 'http_add_field()' - Add a value for a HTTP field, appending if needed. */ static void http_add_field(http_t *http, /* I - HTTP connection */ http_field_t field, /* I - HTTP field */ const char *value, /* I - Value string */ int append) /* I - Append value? */ { char temp[1024]; /* Temporary value string */ size_t fieldlen, /* Length of existing value */ valuelen, /* Length of value string */ total; /* Total length of string */ if (field == HTTP_FIELD_HOST) { /* * Special-case for Host: as we don't want a trailing "." on the hostname and * need to bracket IPv6 numeric addresses. */ char *ptr = strchr(value, ':'); if (value[0] != '[' && ptr && strchr(ptr + 1, ':')) { /* * Bracket IPv6 numeric addresses... * * This is slightly inefficient (basically copying twice), but is an edge * case and not worth optimizing... */ snprintf(temp, sizeof(temp), "[%s]", value); value = temp; } else if (*value) { /* * Check for a trailing dot on the hostname... */ strlcpy(temp, value, sizeof(temp)); value = temp; ptr = temp + strlen(temp) - 1; if (*ptr == '.') *ptr = '\0'; } } if (append && field != HTTP_FIELD_ACCEPT_ENCODING && field != HTTP_FIELD_ACCEPT_LANGUAGE && field != HTTP_FIELD_ACCEPT_RANGES && field != HTTP_FIELD_ALLOW && field != HTTP_FIELD_LINK && field != HTTP_FIELD_TRANSFER_ENCODING && field != HTTP_FIELD_UPGRADE && field != HTTP_FIELD_WWW_AUTHENTICATE) append = 0; if (!append && http->fields[field]) { if (http->fields[field] != http->_fields[field]) free(http->fields[field]); http->fields[field] = NULL; } valuelen = strlen(value); if (!valuelen) { http->_fields[field][0] = '\0'; return; } if (http->fields[field]) { fieldlen = strlen(http->fields[field]); total = fieldlen + 2 + valuelen; } else { fieldlen = 0; total = valuelen; } if (total < HTTP_MAX_VALUE && field < HTTP_FIELD_ACCEPT_ENCODING) { /* * Copy short values to legacy char arrays (maintained for binary * compatibility with CUPS 1.2.x and earlier applications...) */ if (fieldlen) { char combined[HTTP_MAX_VALUE]; /* Combined value string */ snprintf(combined, sizeof(combined), "%s, %s", http->_fields[field], value); value = combined; } strlcpy(http->_fields[field], value, sizeof(http->_fields[field])); http->fields[field] = http->_fields[field]; } else if (fieldlen) { /* * Expand the field value... */ char *combined; /* New value string */ if (http->fields[field] == http->_fields[field]) { if ((combined = malloc(total + 1)) != NULL) { http->fields[field] = combined; snprintf(combined, total + 1, "%s, %s", http->_fields[field], value); } } else if ((combined = realloc(http->fields[field], total + 1)) != NULL) { http->fields[field] = combined; strlcat(combined, ", ", total + 1); strlcat(combined, value, total + 1); } } else { /* * Allocate the field value... */ http->fields[field] = strdup(value); } #ifdef HAVE_LIBZ if (field == HTTP_FIELD_CONTENT_ENCODING && http->data_encoding != HTTP_ENCODING_FIELDS) { DEBUG_puts("1httpSetField: Calling http_content_coding_start."); http_content_coding_start(http, value); } #endif /* HAVE_LIBZ */ } #ifdef HAVE_LIBZ /* * 'http_content_coding_finish()' - Finish doing any content encoding. */ static void http_content_coding_finish( http_t *http) /* I - HTTP connection */ { int zerr; /* Compression status */ Byte dummy[1]; /* Dummy read buffer */ size_t bytes; /* Number of bytes to write */ DEBUG_printf(("http_content_coding_finish(http=%p)", (void *)http)); DEBUG_printf(("1http_content_coding_finishing: http->coding=%d", http->coding)); switch (http->coding) { case _HTTP_CODING_DEFLATE : case _HTTP_CODING_GZIP : ((z_stream *)http->stream)->next_in = dummy; ((z_stream *)http->stream)->avail_in = 0; do { zerr = deflate((z_stream *)http->stream, Z_FINISH); bytes = _HTTP_MAX_SBUFFER - ((z_stream *)http->stream)->avail_out; if (bytes > 0) { DEBUG_printf(("1http_content_coding_finish: Writing trailing chunk, len=%d", (int)bytes)); if (http->data_encoding == HTTP_ENCODING_CHUNKED) http_write_chunk(http, (char *)http->sbuffer, bytes); else http_write(http, (char *)http->sbuffer, bytes); } ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer; ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER; } while (zerr == Z_OK); deflateEnd((z_stream *)http->stream); free(http->sbuffer); free(http->stream); http->sbuffer = NULL; http->stream = NULL; if (http->wused) httpFlushWrite(http); break; case _HTTP_CODING_INFLATE : case _HTTP_CODING_GUNZIP : inflateEnd((z_stream *)http->stream); free(http->sbuffer); free(http->stream); http->sbuffer = NULL; http->stream = NULL; break; default : break; } http->coding = _HTTP_CODING_IDENTITY; } /* * 'http_content_coding_start()' - Start doing content encoding. */ static void http_content_coding_start( http_t *http, /* I - HTTP connection */ const char *value) /* I - Value of Content-Encoding */ { int zerr; /* Error/status */ _http_coding_t coding; /* Content coding value */ DEBUG_printf(("http_content_coding_start(http=%p, value=\"%s\")", (void *)http, value)); if (http->coding != _HTTP_CODING_IDENTITY) { DEBUG_printf(("1http_content_coding_start: http->coding already %d.", http->coding)); return; } else if (!strcmp(value, "x-gzip") || !strcmp(value, "gzip")) { if (http->state == HTTP_STATE_GET_SEND || http->state == HTTP_STATE_POST_SEND) coding = http->mode == _HTTP_MODE_SERVER ? _HTTP_CODING_GZIP : _HTTP_CODING_GUNZIP; else if (http->state == HTTP_STATE_POST_RECV || http->state == HTTP_STATE_PUT_RECV) coding = http->mode == _HTTP_MODE_CLIENT ? _HTTP_CODING_GZIP : _HTTP_CODING_GUNZIP; else { DEBUG_puts("1http_content_coding_start: Not doing content coding."); return; } } else if (!strcmp(value, "x-deflate") || !strcmp(value, "deflate")) { if (http->state == HTTP_STATE_GET_SEND || http->state == HTTP_STATE_POST_SEND) coding = http->mode == _HTTP_MODE_SERVER ? _HTTP_CODING_DEFLATE : _HTTP_CODING_INFLATE; else if (http->state == HTTP_STATE_POST_RECV || http->state == HTTP_STATE_PUT_RECV) coding = http->mode == _HTTP_MODE_CLIENT ? _HTTP_CODING_DEFLATE : _HTTP_CODING_INFLATE; else { DEBUG_puts("1http_content_coding_start: Not doing content coding."); return; } } else { DEBUG_puts("1http_content_coding_start: Not doing content coding."); return; } switch (coding) { case _HTTP_CODING_DEFLATE : case _HTTP_CODING_GZIP : if (http->wused) httpFlushWrite(http); if ((http->sbuffer = malloc(_HTTP_MAX_SBUFFER)) == NULL) { http->status = HTTP_STATUS_ERROR; http->error = errno; return; } /* * Window size for compression is 11 bits - optimal based on PWG Raster * sample files on pwg.org. -11 is raw deflate, 27 is gzip, per ZLIB * documentation. */ if ((http->stream = calloc(1, sizeof(z_stream))) == NULL) { free(http->sbuffer); http->sbuffer = NULL; http->status = HTTP_STATUS_ERROR; http->error = errno; return; } if ((zerr = deflateInit2((z_stream *)http->stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, coding == _HTTP_CODING_DEFLATE ? -11 : 27, 7, Z_DEFAULT_STRATEGY)) < Z_OK) { free(http->sbuffer); free(http->stream); http->sbuffer = NULL; http->stream = NULL; http->status = HTTP_STATUS_ERROR; http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL; return; } ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer; ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER; break; case _HTTP_CODING_INFLATE : case _HTTP_CODING_GUNZIP : if ((http->sbuffer = malloc(_HTTP_MAX_SBUFFER)) == NULL) { http->status = HTTP_STATUS_ERROR; http->error = errno; return; } /* * Window size for decompression is up to 15 bits (maximum supported). * -15 is raw inflate, 31 is gunzip, per ZLIB documentation. */ if ((http->stream = calloc(1, sizeof(z_stream))) == NULL) { free(http->sbuffer); http->sbuffer = NULL; http->status = HTTP_STATUS_ERROR; http->error = errno; return; } if ((zerr = inflateInit2((z_stream *)http->stream, coding == _HTTP_CODING_INFLATE ? -15 : 31)) < Z_OK) { free(http->sbuffer); free(http->stream); http->sbuffer = NULL; http->stream = NULL; http->status = HTTP_STATUS_ERROR; http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL; return; } ((z_stream *)http->stream)->avail_in = 0; ((z_stream *)http->stream)->next_in = http->sbuffer; break; default : break; } http->coding = coding; DEBUG_printf(("1http_content_coding_start: http->coding now %d.", http->coding)); } #endif /* HAVE_LIBZ */ /* * 'http_create()' - Create an unconnected HTTP connection. */ static http_t * /* O - HTTP connection */ http_create( const char *host, /* I - Hostname */ int port, /* I - Port number */ http_addrlist_t *addrlist, /* I - Address list or @code NULL@ */ int family, /* I - Address family or AF_UNSPEC */ http_encryption_t encryption, /* I - Encryption to use */ int blocking, /* I - 1 for blocking mode */ _http_mode_t mode) /* I - _HTTP_MODE_CLIENT or _SERVER */ { http_t *http; /* New HTTP connection */ char service[255]; /* Service name */ http_addrlist_t *myaddrlist = NULL; /* My address list */ DEBUG_printf(("4http_create(host=\"%s\", port=%d, addrlist=%p, family=%d, encryption=%d, blocking=%d, mode=%d)", host, port, (void *)addrlist, family, encryption, blocking, mode)); if (!host && mode == _HTTP_MODE_CLIENT) return (NULL); httpInitialize(); /* * Lookup the host... */ if (addrlist) { myaddrlist = httpAddrCopyList(addrlist); } else { snprintf(service, sizeof(service), "%d", port); myaddrlist = httpAddrGetList(host, family, service); } if (!myaddrlist) return (NULL); /* * Allocate memory for the structure... */ if ((http = calloc(sizeof(http_t), 1)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); httpAddrFreeList(myaddrlist); return (NULL); } /* * Initialize the HTTP data... */ http->mode = mode; http->activity = time(NULL); http->addrlist = myaddrlist; http->blocking = blocking; http->fd = -1; #ifdef HAVE_GSSAPI http->gssctx = GSS_C_NO_CONTEXT; http->gssname = GSS_C_NO_NAME; #endif /* HAVE_GSSAPI */ http->status = HTTP_STATUS_CONTINUE; http->version = HTTP_VERSION_1_1; if (host) strlcpy(http->hostname, host, sizeof(http->hostname)); if (port == 443) /* Always use encryption for https */ http->encryption = HTTP_ENCRYPTION_ALWAYS; else http->encryption = encryption; http_set_wait(http); /* * Return the new structure... */ return (http); } #ifdef DEBUG /* * 'http_debug_hex()' - Do a hex dump of a buffer. */ static void http_debug_hex(const char *prefix, /* I - Prefix for line */ const char *buffer, /* I - Buffer to dump */ int bytes) /* I - Bytes to dump */ { int i, j, /* Looping vars */ ch; /* Current character */ char line[255], /* Line buffer */ *start, /* Start of line after prefix */ *ptr; /* Pointer into line */ if (_cups_debug_fd < 0 || _cups_debug_level < 6) return; DEBUG_printf(("6%s: %d bytes:", prefix, bytes)); snprintf(line, sizeof(line), "6%s: ", prefix); start = line + strlen(line); for (i = 0; i < bytes; i += 16) { for (j = 0, ptr = start; j < 16 && (i + j) < bytes; j ++, ptr += 2) snprintf(ptr, 3, "%02X", buffer[i + j] & 255); while (j < 16) { memcpy(ptr, " ", 3); ptr += 2; j ++; } memcpy(ptr, " ", 3); ptr += 2; for (j = 0; j < 16 && (i + j) < bytes; j ++) { ch = buffer[i + j] & 255; if (ch < ' ' || ch >= 127) ch = '.'; *ptr++ = (char)ch; } *ptr = '\0'; DEBUG_puts(line); } } #endif /* DEBUG */ /* * 'http_read()' - Read a buffer from a HTTP connection. * * This function does the low-level read from the socket, retrying and timing * out as needed. */ static ssize_t /* O - Number of bytes read or -1 on error */ http_read(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer */ size_t length) /* I - Maximum bytes to read */ { ssize_t bytes; /* Bytes read */ DEBUG_printf(("http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (!http->blocking || http->timeout_value > 0.0) { while (!httpWait(http, http->wait_value)) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; DEBUG_puts("2http_read: Timeout."); return (0); } } DEBUG_printf(("2http_read: Reading %d bytes into buffer.", (int)length)); do { #ifdef HAVE_SSL if (http->tls) bytes = _httpTLSRead(http, buffer, (int)length); else #endif /* HAVE_SSL */ bytes = recv(http->fd, buffer, length, 0); if (bytes < 0) { #ifdef _WIN32 if (WSAGetLastError() != WSAEINTR) { http->error = WSAGetLastError(); return (-1); } else if (WSAGetLastError() == WSAEWOULDBLOCK) { if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data)) { http->error = WSAEWOULDBLOCK; return (-1); } } #else DEBUG_printf(("2http_read: %s", strerror(errno))); if (errno == EWOULDBLOCK || errno == EAGAIN) { if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data)) { http->error = errno; return (-1); } else if (!http->timeout_cb && errno != EAGAIN) { http->error = errno; return (-1); } } else if (errno != EINTR) { http->error = errno; return (-1); } #endif /* _WIN32 */ } } while (bytes < 0); DEBUG_printf(("2http_read: Read " CUPS_LLFMT " bytes into buffer.", CUPS_LLCAST bytes)); #ifdef DEBUG if (bytes > 0) http_debug_hex("http_read", buffer, (int)bytes); #endif /* DEBUG */ if (bytes < 0) { #ifdef _WIN32 if (WSAGetLastError() == WSAEINTR) bytes = 0; else http->error = WSAGetLastError(); #else if (errno == EINTR || (errno == EAGAIN && !http->timeout_cb)) bytes = 0; else http->error = errno; #endif /* _WIN32 */ } else if (bytes == 0) { http->error = EPIPE; return (0); } return (bytes); } /* * 'http_read_buffered()' - Do a buffered read from a HTTP connection. * * This function reads data from the HTTP buffer or from the socket, as needed. */ static ssize_t /* O - Number of bytes read or -1 on error */ http_read_buffered(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer */ size_t length) /* I - Maximum bytes to read */ { ssize_t bytes; /* Bytes read */ DEBUG_printf(("http_read_buffered(http=%p, buffer=%p, length=" CUPS_LLFMT ") used=%d", (void *)http, (void *)buffer, CUPS_LLCAST length, http->used)); if (http->used > 0) { if (length > (size_t)http->used) bytes = (ssize_t)http->used; else bytes = (ssize_t)length; DEBUG_printf(("2http_read: Grabbing %d bytes from input buffer.", (int)bytes)); memcpy(buffer, http->buffer, (size_t)bytes); http->used -= (int)bytes; if (http->used > 0) memmove(http->buffer, http->buffer + bytes, (size_t)http->used); } else bytes = http_read(http, buffer, length); return (bytes); } /* * 'http_read_chunk()' - Read a chunk from a HTTP connection. * * This function reads and validates the chunk length, then does a buffered read * returning the number of bytes placed in the buffer. */ static ssize_t /* O - Number of bytes read or -1 on error */ http_read_chunk(http_t *http, /* I - HTTP connection */ char *buffer, /* I - Buffer */ size_t length) /* I - Maximum bytes to read */ { DEBUG_printf(("http_read_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (http->data_remaining <= 0) { char len[32]; /* Length string */ if (!httpGets(len, sizeof(len), http)) { DEBUG_puts("1http_read_chunk: Could not get chunk length."); return (0); } if (!len[0]) { DEBUG_puts("1http_read_chunk: Blank chunk length, trying again..."); if (!httpGets(len, sizeof(len), http)) { DEBUG_puts("1http_read_chunk: Could not get chunk length."); return (0); } } http->data_remaining = strtoll(len, NULL, 16); if (http->data_remaining < 0) { DEBUG_printf(("1http_read_chunk: Negative chunk length \"%s\" (" CUPS_LLFMT ")", len, CUPS_LLCAST http->data_remaining)); return (0); } DEBUG_printf(("2http_read_chunk: Got chunk length \"%s\" (" CUPS_LLFMT ")", len, CUPS_LLCAST http->data_remaining)); if (http->data_remaining == 0) { /* * 0-length chunk, grab trailing blank line... */ httpGets(len, sizeof(len), http); } } DEBUG_printf(("2http_read_chunk: data_remaining=" CUPS_LLFMT, CUPS_LLCAST http->data_remaining)); if (http->data_remaining <= 0) return (0); else if (length > (size_t)http->data_remaining) length = (size_t)http->data_remaining; return (http_read_buffered(http, buffer, length)); } /* * 'http_send()' - Send a request with all fields and the trailing blank line. */ static int /* O - 0 on success, non-zero on error */ http_send(http_t *http, /* I - HTTP connection */ http_state_t request, /* I - Request code */ const char *uri) /* I - URI */ { int i; /* Looping var */ char buf[1024]; /* Encoded URI buffer */ const char *value; /* Field value */ static const char * const codes[] = /* Request code strings */ { NULL, "OPTIONS", "GET", NULL, "HEAD", "POST", NULL, NULL, "PUT", NULL, "DELETE", "TRACE", "CLOSE", NULL, NULL }; DEBUG_printf(("4http_send(http=%p, request=HTTP_%s, uri=\"%s\")", (void *)http, codes[request], uri)); if (http == NULL || uri == NULL) return (-1); /* * Set the User-Agent field if it isn't already... */ if (!http->fields[HTTP_FIELD_USER_AGENT]) { if (http->default_fields[HTTP_FIELD_USER_AGENT]) httpSetField(http, HTTP_FIELD_USER_AGENT, http->default_fields[HTTP_FIELD_USER_AGENT]); else httpSetField(http, HTTP_FIELD_USER_AGENT, cupsUserAgent()); } /* * Set the Accept-Encoding field if it isn't already... */ if (!http->fields[HTTP_FIELD_ACCEPT_ENCODING] && http->default_fields[HTTP_FIELD_ACCEPT_ENCODING]) httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING, http->default_fields[HTTP_FIELD_ACCEPT_ENCODING]); /* * Encode the URI as needed... */ _httpEncodeURI(buf, uri, sizeof(buf)); /* * See if we had an error the last time around; if so, reconnect... */ if (http->fd < 0 || http->status == HTTP_STATUS_ERROR || http->status >= HTTP_STATUS_BAD_REQUEST) { DEBUG_printf(("5http_send: Reconnecting, fd=%d, status=%d, tls_upgrade=%d", http->fd, http->status, http->tls_upgrade)); if (httpReconnect2(http, 30000, NULL)) return (-1); } /* * Flush any written data that is pending... */ if (http->wused) { if (httpFlushWrite(http) < 0) if (httpReconnect2(http, 30000, NULL)) return (-1); } /* * Send the request header... */ http->state = request; http->data_encoding = HTTP_ENCODING_FIELDS; if (request == HTTP_STATE_POST || request == HTTP_STATE_PUT) http->state ++; http->status = HTTP_STATUS_CONTINUE; #ifdef HAVE_SSL if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls) { httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade"); httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0"); } #endif /* HAVE_SSL */ if (httpPrintf(http, "%s %s HTTP/1.1\r\n", codes[request], buf) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } for (i = 0; i < HTTP_FIELD_MAX; i ++) if ((value = httpGetField(http, i)) != NULL && *value) { DEBUG_printf(("5http_send: %s: %s", http_fields[i], value)); if (i == HTTP_FIELD_HOST) { if (httpPrintf(http, "Host: %s:%d\r\n", value, httpAddrPort(http->hostaddr)) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } else if (httpPrintf(http, "%s: %s\r\n", http_fields[i], value) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } } if (http->cookie) if (httpPrintf(http, "Cookie: $Version=0; %s\r\n", http->cookie) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } DEBUG_printf(("5http_send: expect=%d, mode=%d, state=%d", http->expect, http->mode, http->state)); if (http->expect == HTTP_STATUS_CONTINUE && http->mode == _HTTP_MODE_CLIENT && (http->state == HTTP_STATE_POST_RECV || http->state == HTTP_STATE_PUT_RECV)) if (httpPrintf(http, "Expect: 100-continue\r\n") < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } if (httpPrintf(http, "\r\n") < 1) { http->status = HTTP_STATUS_ERROR; return (-1); } if (httpFlushWrite(http) < 0) return (-1); http_set_length(http); httpClearFields(http); /* * The Kerberos and AuthRef authentication strings can only be used once... */ if (http->fields[HTTP_FIELD_AUTHORIZATION] && http->authstring && (!strncmp(http->authstring, "Negotiate", 9) || !strncmp(http->authstring, "AuthRef", 7))) { http->_authstring[0] = '\0'; if (http->authstring != http->_authstring) free(http->authstring); http->authstring = http->_authstring; } return (0); } /* * 'http_set_length()' - Set the data_encoding and data_remaining values. */ static off_t /* O - Remainder or -1 on error */ http_set_length(http_t *http) /* I - Connection */ { off_t remaining; /* Remainder */ DEBUG_printf(("http_set_length(http=%p) mode=%d state=%s", (void *)http, http->mode, httpStateString(http->state))); if ((remaining = httpGetLength2(http)) >= 0) { if (http->mode == _HTTP_MODE_SERVER && http->state != HTTP_STATE_GET_SEND && http->state != HTTP_STATE_PUT && http->state != HTTP_STATE_POST && http->state != HTTP_STATE_POST_SEND) { DEBUG_puts("1http_set_length: Not setting data_encoding/remaining."); return (remaining); } if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_TRANSFER_ENCODING), "chunked")) { DEBUG_puts("1http_set_length: Setting data_encoding to " "HTTP_ENCODING_CHUNKED."); http->data_encoding = HTTP_ENCODING_CHUNKED; } else { DEBUG_puts("1http_set_length: Setting data_encoding to " "HTTP_ENCODING_LENGTH."); http->data_encoding = HTTP_ENCODING_LENGTH; } DEBUG_printf(("1http_set_length: Setting data_remaining to " CUPS_LLFMT ".", CUPS_LLCAST remaining)); http->data_remaining = remaining; if (remaining <= INT_MAX) http->_data_remaining = (int)remaining; else http->_data_remaining = INT_MAX; } return (remaining); } /* * 'http_set_timeout()' - Set the socket timeout values. */ static void http_set_timeout(int fd, /* I - File descriptor */ double timeout) /* I - Timeout in seconds */ { #ifdef _WIN32 DWORD tv = (DWORD)(timeout * 1000); /* Timeout in milliseconds */ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CUPS_SOCAST &tv, sizeof(tv)); setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, CUPS_SOCAST &tv, sizeof(tv)); #else struct timeval tv; /* Timeout in secs and usecs */ tv.tv_sec = (int)timeout; tv.tv_usec = (int)(1000000 * fmod(timeout, 1.0)); setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CUPS_SOCAST &tv, sizeof(tv)); setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, CUPS_SOCAST &tv, sizeof(tv)); #endif /* _WIN32 */ } /* * 'http_set_wait()' - Set the default wait value for reads. */ static void http_set_wait(http_t *http) /* I - HTTP connection */ { if (http->blocking) { http->wait_value = (int)(http->timeout_value * 1000); if (http->wait_value <= 0) http->wait_value = 60000; } else http->wait_value = 10000; } #ifdef HAVE_SSL /* * 'http_tls_upgrade()' - Force upgrade to TLS encryption. */ static int /* O - Status of connection */ http_tls_upgrade(http_t *http) /* I - HTTP connection */ { int ret; /* Return value */ http_t myhttp; /* Local copy of HTTP data */ DEBUG_printf(("7http_tls_upgrade(%p)", (void *)http)); /* * Flush the connection to make sure any previous "Upgrade" message * has been read. */ httpFlush(http); /* * Copy the HTTP data to a local variable so we can do the OPTIONS * request without interfering with the existing request data... */ memcpy(&myhttp, http, sizeof(myhttp)); /* * Send an OPTIONS request to the server, requiring SSL or TLS * encryption on the link... */ http->tls_upgrade = 1; memset(http->fields, 0, sizeof(http->fields)); http->expect = (http_status_t)0; if (http->hostname[0] == '/') httpSetField(http, HTTP_FIELD_HOST, "localhost"); else httpSetField(http, HTTP_FIELD_HOST, http->hostname); httpSetField(http, HTTP_FIELD_CONNECTION, "upgrade"); httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0"); if ((ret = httpOptions(http, "*")) == 0) { /* * Wait for the secure connection... */ while (httpUpdate(http) == HTTP_STATUS_CONTINUE); } /* * Restore the HTTP request data... */ memcpy(http->_fields, myhttp._fields, sizeof(http->_fields)); memcpy(http->fields, myhttp.fields, sizeof(http->fields)); http->data_encoding = myhttp.data_encoding; http->data_remaining = myhttp.data_remaining; http->_data_remaining = myhttp._data_remaining; http->expect = myhttp.expect; http->digest_tries = myhttp.digest_tries; http->tls_upgrade = 0; /* * See if we actually went secure... */ if (!http->tls) { /* * Server does not support HTTP upgrade... */ DEBUG_puts("8http_tls_upgrade: Server does not support HTTP upgrade!"); _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Encryption is not supported."), 1); httpAddrClose(NULL, http->fd); http->fd = -1; return (-1); } else return (ret); } #endif /* HAVE_SSL */ /* * 'http_write()' - Write a buffer to a HTTP connection. */ static ssize_t /* O - Number of bytes written */ http_write(http_t *http, /* I - HTTP connection */ const char *buffer, /* I - Buffer for data */ size_t length) /* I - Number of bytes to write */ { ssize_t tbytes, /* Total bytes sent */ bytes; /* Bytes sent */ DEBUG_printf(("2http_write(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); http->error = 0; tbytes = 0; while (length > 0) { DEBUG_printf(("3http_write: About to write %d bytes.", (int)length)); if (http->timeout_value > 0.0) { #ifdef HAVE_POLL struct pollfd pfd; /* Polled file descriptor */ #else fd_set output_set; /* Output ready for write? */ struct timeval timeout; /* Timeout value */ #endif /* HAVE_POLL */ int nfds; /* Result from select()/poll() */ do { #ifdef HAVE_POLL pfd.fd = http->fd; pfd.events = POLLOUT; while ((nfds = poll(&pfd, 1, http->wait_value)) < 0 && (errno == EINTR || errno == EAGAIN)) /* do nothing */; #else do { FD_ZERO(&output_set); FD_SET(http->fd, &output_set); timeout.tv_sec = http->wait_value / 1000; timeout.tv_usec = 1000 * (http->wait_value % 1000); nfds = select(http->fd + 1, NULL, &output_set, NULL, &timeout); } # ifdef _WIN32 while (nfds < 0 && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK)); # else while (nfds < 0 && (errno == EINTR || errno == EAGAIN)); # endif /* _WIN32 */ #endif /* HAVE_POLL */ if (nfds < 0) { http->error = errno; return (-1); } else if (nfds == 0 && (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data))) { #ifdef _WIN32 http->error = WSAEWOULDBLOCK; #else http->error = EWOULDBLOCK; #endif /* _WIN32 */ return (-1); } } while (nfds <= 0); } #ifdef HAVE_SSL if (http->tls) bytes = _httpTLSWrite(http, buffer, (int)length); else #endif /* HAVE_SSL */ bytes = send(http->fd, buffer, length, 0); DEBUG_printf(("3http_write: Write of " CUPS_LLFMT " bytes returned " CUPS_LLFMT ".", CUPS_LLCAST length, CUPS_LLCAST bytes)); if (bytes < 0) { #ifdef _WIN32 if (WSAGetLastError() == WSAEINTR) continue; else if (WSAGetLastError() == WSAEWOULDBLOCK) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; http->error = WSAGetLastError(); } else if (WSAGetLastError() != http->error && WSAGetLastError() != WSAECONNRESET) { http->error = WSAGetLastError(); continue; } #else if (errno == EINTR) continue; else if (errno == EWOULDBLOCK || errno == EAGAIN) { if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; else if (!http->timeout_cb && errno == EAGAIN) continue; http->error = errno; } else if (errno != http->error && errno != ECONNRESET) { http->error = errno; continue; } #endif /* _WIN32 */ DEBUG_printf(("3http_write: error writing data (%s).", strerror(http->error))); return (-1); } buffer += bytes; tbytes += bytes; length -= (size_t)bytes; } #ifdef DEBUG http_debug_hex("http_write", buffer - tbytes, (int)tbytes); #endif /* DEBUG */ DEBUG_printf(("3http_write: Returning " CUPS_LLFMT ".", CUPS_LLCAST tbytes)); return (tbytes); } /* * 'http_write_chunk()' - Write a chunked buffer. */ static ssize_t /* O - Number bytes written */ http_write_chunk(http_t *http, /* I - HTTP connection */ const char *buffer, /* I - Buffer to write */ size_t length) /* I - Length of buffer */ { char header[16]; /* Chunk header */ ssize_t bytes; /* Bytes written */ DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); /* * Write the chunk header, data, and trailer. */ snprintf(header, sizeof(header), "%x\r\n", (unsigned)length); if (http_write(http, header, strlen(header)) < 0) { DEBUG_puts("8http_write_chunk: http_write of length failed."); return (-1); } if ((bytes = http_write(http, buffer, length)) < 0) { DEBUG_puts("8http_write_chunk: http_write of buffer failed."); return (-1); } if (http_write(http, "\r\n", 2) < 0) { DEBUG_puts("8http_write_chunk: http_write of CR LF failed."); return (-1); } return (bytes); } cups-2.3.1/cups/ppd-mark.c000664 000765 000024 00000065745 13574721672 015451 0ustar00mikestaff000000 000000 /* * Option marking routines for CUPS. * * 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. * * PostScript is a trademark of Adobe Systems, Inc. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #include "debug-internal.h" /* * Local functions... */ #ifdef DEBUG static void ppd_debug_marked(ppd_file_t *ppd, const char *title); #else # define ppd_debug_marked(ppd,title) #endif /* DEBUG */ static void ppd_defaults(ppd_file_t *ppd, ppd_group_t *g); static void ppd_mark_choices(ppd_file_t *ppd, const char *s); static void ppd_mark_option(ppd_file_t *ppd, const char *option, const char *choice); /* * 'cupsMarkOptions()' - Mark command-line options in a PPD file. * * This function maps the IPP "finishings", "media", "mirror", * "multiple-document-handling", "output-bin", "print-color-mode", * "print-quality", "printer-resolution", and "sides" attributes to their * corresponding PPD options and choices. */ int /* O - 1 if conflicts exist, 0 otherwise */ cupsMarkOptions( ppd_file_t *ppd, /* I - PPD file */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { int i, j; /* Looping vars */ char *ptr, /* Pointer into string */ s[255]; /* Temporary string */ const char *val, /* Pointer into value */ *media, /* media option */ *output_bin, /* output-bin option */ *page_size, /* PageSize option */ *ppd_keyword, /* PPD keyword */ *print_color_mode, /* print-color-mode option */ *print_quality, /* print-quality option */ *sides; /* sides option */ cups_option_t *optptr; /* Current option */ ppd_attr_t *attr; /* PPD attribute */ _ppd_cache_t *cache; /* PPD cache and mapping data */ /* * Check arguments... */ if (!ppd || num_options <= 0 || !options) return (0); ppd_debug_marked(ppd, "Before..."); /* * Do special handling for finishings, media, output-bin, output-mode, * print-color-mode, print-quality, and PageSize... */ media = cupsGetOption("media", num_options, options); output_bin = cupsGetOption("output-bin", num_options, options); page_size = cupsGetOption("PageSize", num_options, options); print_quality = cupsGetOption("print-quality", num_options, options); sides = cupsGetOption("sides", num_options, options); if ((print_color_mode = cupsGetOption("print-color-mode", num_options, options)) == NULL) print_color_mode = cupsGetOption("output-mode", num_options, options); if ((media || output_bin || print_color_mode || print_quality || sides) && !ppd->cache) { /* * Load PPD cache and mapping data as needed... */ ppd->cache = _ppdCacheCreateWithPPD(ppd); } cache = ppd->cache; if (media) { /* * Loop through the option string, separating it at commas and marking each * individual option as long as the corresponding PPD option (PageSize, * InputSlot, etc.) is not also set. * * For PageSize, we also check for an empty option value since some versions * of macOS use it to specify auto-selection of the media based solely on * the size. */ for (val = media; *val;) { /* * Extract the sub-option from the string... */ for (ptr = s; *val && *val != ',' && (size_t)(ptr - s) < (sizeof(s) - 1);) *ptr++ = *val++; *ptr++ = '\0'; if (*val == ',') val ++; /* * Mark it... */ if (!page_size || !page_size[0]) { if (!_cups_strncasecmp(s, "Custom.", 7) || ppdPageSize(ppd, s)) ppd_mark_option(ppd, "PageSize", s); else if ((ppd_keyword = _ppdCacheGetPageSize(cache, NULL, s, NULL)) != NULL) ppd_mark_option(ppd, "PageSize", ppd_keyword); } if (cache && cache->source_option && !cupsGetOption(cache->source_option, num_options, options) && (ppd_keyword = _ppdCacheGetInputSlot(cache, NULL, s)) != NULL) ppd_mark_option(ppd, cache->source_option, ppd_keyword); if (!cupsGetOption("MediaType", num_options, options) && (ppd_keyword = _ppdCacheGetMediaType(cache, NULL, s)) != NULL) ppd_mark_option(ppd, "MediaType", ppd_keyword); } } if (cache) { if (!cupsGetOption("com.apple.print.DocumentTicket.PMSpoolFormat", num_options, options) && !cupsGetOption("APPrinterPreset", num_options, options) && (print_color_mode || print_quality)) { /* * Map output-mode and print-quality to a preset... */ _pwg_print_color_mode_t pwg_pcm;/* print-color-mode index */ _pwg_print_quality_t pwg_pq; /* print-quality index */ cups_option_t *preset;/* Current preset option */ if (print_color_mode && !strcmp(print_color_mode, "monochrome")) pwg_pcm = _PWG_PRINT_COLOR_MODE_MONOCHROME; else pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; if (print_quality) { pwg_pq = (_pwg_print_quality_t)(atoi(print_quality) - IPP_QUALITY_DRAFT); if (pwg_pq < _PWG_PRINT_QUALITY_DRAFT) pwg_pq = _PWG_PRINT_QUALITY_DRAFT; else if (pwg_pq > _PWG_PRINT_QUALITY_HIGH) pwg_pq = _PWG_PRINT_QUALITY_HIGH; } else pwg_pq = _PWG_PRINT_QUALITY_NORMAL; if (cache->num_presets[pwg_pcm][pwg_pq] == 0) { /* * Try to find a preset that works so that we maximize the chances of us * getting a good print using IPP attributes. */ if (cache->num_presets[pwg_pcm][_PWG_PRINT_QUALITY_NORMAL] > 0) pwg_pq = _PWG_PRINT_QUALITY_NORMAL; else if (cache->num_presets[_PWG_PRINT_COLOR_MODE_COLOR][pwg_pq] > 0) pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; else { pwg_pq = _PWG_PRINT_QUALITY_NORMAL; pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; } } if (cache->num_presets[pwg_pcm][pwg_pq] > 0) { /* * Copy the preset options as long as the corresponding names are not * already defined in the IPP request... */ for (i = cache->num_presets[pwg_pcm][pwg_pq], preset = cache->presets[pwg_pcm][pwg_pq]; i > 0; i --, preset ++) { if (!cupsGetOption(preset->name, num_options, options)) ppd_mark_option(ppd, preset->name, preset->value); } } } if (output_bin && !cupsGetOption("OutputBin", num_options, options) && (ppd_keyword = _ppdCacheGetOutputBin(cache, output_bin)) != NULL) { /* * Map output-bin to OutputBin... */ ppd_mark_option(ppd, "OutputBin", ppd_keyword); } if (sides && cache->sides_option && !cupsGetOption(cache->sides_option, num_options, options)) { /* * Map sides to duplex option... */ if (!strcmp(sides, "one-sided") && cache->sides_1sided) ppd_mark_option(ppd, cache->sides_option, cache->sides_1sided); else if (!strcmp(sides, "two-sided-long-edge") && cache->sides_2sided_long) ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_long); else if (!strcmp(sides, "two-sided-short-edge") && cache->sides_2sided_short) ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_short); } } /* * Mark other options... */ for (i = num_options, optptr = options; i > 0; i --, optptr ++) { if (!_cups_strcasecmp(optptr->name, "media") || !_cups_strcasecmp(optptr->name, "output-bin") || !_cups_strcasecmp(optptr->name, "output-mode") || !_cups_strcasecmp(optptr->name, "print-quality") || !_cups_strcasecmp(optptr->name, "sides")) continue; else if (!_cups_strcasecmp(optptr->name, "resolution") || !_cups_strcasecmp(optptr->name, "printer-resolution")) { ppd_mark_option(ppd, "Resolution", optptr->value); ppd_mark_option(ppd, "SetResolution", optptr->value); /* Calcomp, Linotype, QMS, Summagraphics, Tektronix, Varityper */ ppd_mark_option(ppd, "JCLResolution", optptr->value); /* HP */ ppd_mark_option(ppd, "CNRes_PGP", optptr->value); /* Canon */ } else if (!_cups_strcasecmp(optptr->name, "multiple-document-handling")) { if (!cupsGetOption("Collate", num_options, options) && ppdFindOption(ppd, "Collate")) { if (_cups_strcasecmp(optptr->value, "separate-documents-uncollated-copies")) ppd_mark_option(ppd, "Collate", "True"); else ppd_mark_option(ppd, "Collate", "False"); } } else if (!_cups_strcasecmp(optptr->name, "finishings")) { /* * Lookup cupsIPPFinishings attributes for each value... */ for (ptr = optptr->value; *ptr;) { /* * Get the next finishings number... */ if (!isdigit(*ptr & 255)) break; if ((j = (int)strtol(ptr, &ptr, 10)) < 3) break; /* * Skip separator as needed... */ if (*ptr == ',') ptr ++; /* * Look it up in the PPD file... */ sprintf(s, "%d", j); if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL) continue; /* * Apply "*Option Choice" settings from the attribute value... */ ppd_mark_choices(ppd, attr->value); } } else if (!_cups_strcasecmp(optptr->name, "APPrinterPreset")) { /* * Lookup APPrinterPreset value... */ if ((attr = ppdFindAttr(ppd, "APPrinterPreset", optptr->value)) != NULL) { /* * Apply "*Option Choice" settings from the attribute value... */ ppd_mark_choices(ppd, attr->value); } } else if (!_cups_strcasecmp(optptr->name, "mirror")) ppd_mark_option(ppd, "MirrorPrint", optptr->value); else ppd_mark_option(ppd, optptr->name, optptr->value); } if (print_quality) { int pq = atoi(print_quality); /* print-quaity value */ if (pq == IPP_QUALITY_DRAFT) ppd_mark_option(ppd, "cupsPrintQuality", "Draft"); else if (pq == IPP_QUALITY_HIGH) ppd_mark_option(ppd, "cupsPrintQuality", "High"); else ppd_mark_option(ppd, "cupsPrintQuality", "Normal"); } ppd_debug_marked(ppd, "After..."); return (ppdConflicts(ppd) > 0); } /* * 'ppdFindChoice()' - Return a pointer to an option choice. */ ppd_choice_t * /* O - Choice pointer or @code NULL@ */ ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */ const char *choice) /* I - Name of choice */ { int i; /* Looping var */ ppd_choice_t *c; /* Current choice */ if (!o || !choice) return (NULL); if (choice[0] == '{' || !_cups_strncasecmp(choice, "Custom.", 7)) choice = "Custom"; for (i = o->num_choices, c = o->choices; i > 0; i --, c ++) if (!_cups_strcasecmp(c->choice, choice)) return (c); return (NULL); } /* * 'ppdFindMarkedChoice()' - Return the marked choice for the specified option. */ ppd_choice_t * /* O - Pointer to choice or @code NULL@ */ ppdFindMarkedChoice(ppd_file_t *ppd, /* I - PPD file */ const char *option) /* I - Keyword/option name */ { ppd_choice_t key, /* Search key for choice */ *marked; /* Marked choice */ DEBUG_printf(("2ppdFindMarkedChoice(ppd=%p, option=\"%s\")", ppd, option)); if ((key.option = ppdFindOption(ppd, option)) == NULL) { DEBUG_puts("3ppdFindMarkedChoice: Option not found, returning NULL"); return (NULL); } marked = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key); DEBUG_printf(("3ppdFindMarkedChoice: Returning %p(%s)...", marked, marked ? marked->choice : "NULL")); return (marked); } /* * 'ppdFindOption()' - Return a pointer to the specified option. */ ppd_option_t * /* O - Pointer to option or @code NULL@ */ ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */ const char *option) /* I - Option/Keyword name */ { /* * Range check input... */ if (!ppd || !option) return (NULL); if (ppd->options) { /* * Search in the array... */ ppd_option_t key; /* Option search key */ strlcpy(key.keyword, option, sizeof(key.keyword)); return ((ppd_option_t *)cupsArrayFind(ppd->options, &key)); } else { /* * Search in each group... */ int i, j; /* Looping vars */ ppd_group_t *group; /* Current group */ ppd_option_t *optptr; /* Current option */ for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) for (j = group->num_options, optptr = group->options; j > 0; j --, optptr ++) if (!_cups_strcasecmp(optptr->keyword, option)) return (optptr); return (NULL); } } /* * 'ppdIsMarked()' - Check to see if an option is marked. */ int /* O - Non-zero if option is marked */ ppdIsMarked(ppd_file_t *ppd, /* I - PPD file data */ const char *option, /* I - Option/Keyword name */ const char *choice) /* I - Choice name */ { ppd_choice_t key, /* Search key */ *c; /* Choice pointer */ if (!ppd) return (0); if ((key.option = ppdFindOption(ppd, option)) == NULL) return (0); if ((c = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) == NULL) return (0); return (!strcmp(c->choice, choice)); } /* * 'ppdMarkDefaults()' - Mark all default options in the PPD file. */ void ppdMarkDefaults(ppd_file_t *ppd) /* I - PPD file record */ { int i; /* Looping variables */ ppd_group_t *g; /* Current group */ ppd_choice_t *c; /* Current choice */ if (!ppd) return; /* * Clean out the marked array... */ for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); c; c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) { cupsArrayRemove(ppd->marked, c); c->marked = 0; } /* * Then repopulate it with the defaults... */ for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++) ppd_defaults(ppd, g); /* * Finally, tag any conflicts (API compatibility) once at the end. */ ppdConflicts(ppd); } /* * 'ppdMarkOption()' - Mark an option in a PPD file and return the number of * conflicts. */ int /* O - Number of conflicts */ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */ const char *option, /* I - Keyword */ const char *choice) /* I - Option name */ { DEBUG_printf(("ppdMarkOption(ppd=%p, option=\"%s\", choice=\"%s\")", ppd, option, choice)); /* * Range check input... */ if (!ppd || !option || !choice) return (0); /* * Mark the option... */ ppd_mark_option(ppd, option, choice); /* * Return the number of conflicts... */ return (ppdConflicts(ppd)); } /* * 'ppdFirstOption()' - Return the first option in the PPD file. * * Options are returned from all groups in ascending alphanumeric order. * * @since CUPS 1.2/macOS 10.5@ */ ppd_option_t * /* O - First option or @code NULL@ */ ppdFirstOption(ppd_file_t *ppd) /* I - PPD file */ { if (!ppd) return (NULL); else return ((ppd_option_t *)cupsArrayFirst(ppd->options)); } /* * 'ppdNextOption()' - Return the next option in the PPD file. * * Options are returned from all groups in ascending alphanumeric order. * * @since CUPS 1.2/macOS 10.5@ */ ppd_option_t * /* O - Next option or @code NULL@ */ ppdNextOption(ppd_file_t *ppd) /* I - PPD file */ { if (!ppd) return (NULL); else return ((ppd_option_t *)cupsArrayNext(ppd->options)); } /* * '_ppdParseOptions()' - Parse options from a PPD file. * * This function looks for strings of the form: * * *option choice ... *optionN choiceN * property value ... propertyN valueN * * It stops when it finds a string that doesn't match this format. */ int /* O - Number of options */ _ppdParseOptions( const char *s, /* I - String to parse */ int num_options, /* I - Number of options */ cups_option_t **options, /* IO - Options */ _ppd_parse_t which) /* I - What to parse */ { char option[PPD_MAX_NAME * 2 + 1], /* Current option/property */ choice[PPD_MAX_NAME], /* Current choice/value */ *ptr; /* Pointer into option or choice */ if (!s) return (num_options); /* * Read all of the "*Option Choice" and "property value" pairs from the * string, add them to an options array as we go... */ while (*s) { /* * Skip leading whitespace... */ while (_cups_isspace(*s)) s ++; /* * Get the option/property name... */ ptr = option; while (*s && !_cups_isspace(*s) && ptr < (option + sizeof(option) - 1)) *ptr++ = *s++; if (ptr == s || !_cups_isspace(*s)) break; *ptr = '\0'; /* * Get the choice... */ while (_cups_isspace(*s)) s ++; if (!*s) break; ptr = choice; while (*s && !_cups_isspace(*s) && ptr < (choice + sizeof(choice) - 1)) *ptr++ = *s++; if (*s && !_cups_isspace(*s)) break; *ptr = '\0'; /* * Add it to the options array... */ if (option[0] == '*' && which != _PPD_PARSE_PROPERTIES) num_options = cupsAddOption(option + 1, choice, num_options, options); else if (option[0] != '*' && which != _PPD_PARSE_OPTIONS) num_options = cupsAddOption(option, choice, num_options, options); } return (num_options); } #ifdef DEBUG /* * 'ppd_debug_marked()' - Output the marked array to stdout... */ static void ppd_debug_marked(ppd_file_t *ppd, /* I - PPD file data */ const char *title) /* I - Title for list */ { ppd_choice_t *c; /* Current choice */ DEBUG_printf(("2cupsMarkOptions: %s", title)); for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); c; c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) DEBUG_printf(("2cupsMarkOptions: %s=%s", c->option->keyword, c->choice)); } #endif /* DEBUG */ /* * 'ppd_defaults()' - Set the defaults for this group and all sub-groups. */ static void ppd_defaults(ppd_file_t *ppd, /* I - PPD file */ ppd_group_t *g) /* I - Group to default */ { int i; /* Looping var */ ppd_option_t *o; /* Current option */ ppd_group_t *sg; /* Current sub-group */ for (i = g->num_options, o = g->options; i > 0; i --, o ++) if (_cups_strcasecmp(o->keyword, "PageRegion") != 0) ppd_mark_option(ppd, o->keyword, o->defchoice); for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++) ppd_defaults(ppd, sg); } /* * 'ppd_mark_choices()' - Mark one or more option choices from a string. */ static void ppd_mark_choices(ppd_file_t *ppd, /* I - PPD file */ const char *s) /* I - "*Option Choice ..." string */ { int i, /* Looping var */ num_options; /* Number of options */ cups_option_t *options, /* Options */ *option; /* Current option */ if (!s) return; options = NULL; num_options = _ppdParseOptions(s, 0, &options, 0); for (i = num_options, option = options; i > 0; i --, option ++) ppd_mark_option(ppd, option->name, option->value); cupsFreeOptions(num_options, options); } /* * 'ppd_mark_option()' - Quick mark an option without checking for conflicts. */ static void ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */ const char *option, /* I - Option name */ const char *choice) /* I - Choice name */ { int i, j; /* Looping vars */ ppd_option_t *o; /* Option pointer */ ppd_choice_t *c, /* Choice pointer */ *oldc, /* Old choice pointer */ key; /* Search key for choice */ struct lconv *loc; /* Locale data */ DEBUG_printf(("7ppd_mark_option(ppd=%p, option=\"%s\", choice=\"%s\")", ppd, option, choice)); /* * AP_D_InputSlot is the "default input slot" on macOS, and setting * it clears the regular InputSlot choices... */ if (!_cups_strcasecmp(option, "AP_D_InputSlot")) { cupsArraySave(ppd->options); if ((o = ppdFindOption(ppd, "InputSlot")) != NULL) { key.option = o; if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } } cupsArrayRestore(ppd->options); } /* * Check for custom options... */ cupsArraySave(ppd->options); o = ppdFindOption(ppd, option); cupsArrayRestore(ppd->options); if (!o) return; loc = localeconv(); if (!_cups_strncasecmp(choice, "Custom.", 7)) { /* * Handle a custom option... */ if ((c = ppdFindChoice(o, "Custom")) == NULL) return; if (!_cups_strcasecmp(option, "PageSize")) { /* * Handle custom page sizes... */ ppdPageSize(ppd, choice); } else { /* * Handle other custom options... */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ char *units; /* Custom points units */ if ((coption = ppdFindCustomOption(ppd, option)) != NULL) { if ((cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params)) == NULL) return; switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_REAL : cparam->current.custom_real = (float)_cupsStrScand(choice + 7, NULL, loc); break; case PPD_CUSTOM_POINTS : cparam->current.custom_points = (float)_cupsStrScand(choice + 7, &units, loc); if (units) { if (!_cups_strcasecmp(units, "cm")) cparam->current.custom_points *= 72.0f / 2.54f; else if (!_cups_strcasecmp(units, "mm")) cparam->current.custom_points *= 72.0f / 25.4f; else if (!_cups_strcasecmp(units, "m")) cparam->current.custom_points *= 72.0f / 0.0254f; else if (!_cups_strcasecmp(units, "in")) cparam->current.custom_points *= 72.0f; else if (!_cups_strcasecmp(units, "ft")) cparam->current.custom_points *= 12.0f * 72.0f; } break; case PPD_CUSTOM_INT : cparam->current.custom_int = atoi(choice + 7); break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : if (cparam->current.custom_string) free(cparam->current.custom_string); cparam->current.custom_string = strdup(choice + 7); break; } } } /* * Make sure that we keep the option marked below... */ choice = "Custom"; } else if (choice[0] == '{') { /* * Handle multi-value custom options... */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ char *units; /* Custom points units */ int num_vals; /* Number of values */ cups_option_t *vals, /* Values */ *val; /* Value */ if ((c = ppdFindChoice(o, "Custom")) == NULL) return; if ((coption = ppdFindCustomOption(ppd, option)) != NULL) { num_vals = cupsParseOptions(choice, 0, &vals); for (i = 0, val = vals; i < num_vals; i ++, val ++) { if ((cparam = ppdFindCustomParam(coption, val->name)) == NULL) continue; switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_REAL : cparam->current.custom_real = (float)_cupsStrScand(val->value, NULL, loc); break; case PPD_CUSTOM_POINTS : cparam->current.custom_points = (float)_cupsStrScand(val->value, &units, loc); if (units) { if (!_cups_strcasecmp(units, "cm")) cparam->current.custom_points *= 72.0f / 2.54f; else if (!_cups_strcasecmp(units, "mm")) cparam->current.custom_points *= 72.0f / 25.4f; else if (!_cups_strcasecmp(units, "m")) cparam->current.custom_points *= 72.0f / 0.0254f; else if (!_cups_strcasecmp(units, "in")) cparam->current.custom_points *= 72.0f; else if (!_cups_strcasecmp(units, "ft")) cparam->current.custom_points *= 12.0f * 72.0f; } break; case PPD_CUSTOM_INT : cparam->current.custom_int = atoi(val->value); break; case PPD_CUSTOM_PASSCODE : case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : if (cparam->current.custom_string) free(cparam->current.custom_string); cparam->current.custom_string = strdup(val->value); break; } } cupsFreeOptions(num_vals, vals); } } else { for (i = o->num_choices, c = o->choices; i > 0; i --, c ++) if (!_cups_strcasecmp(c->choice, choice)) break; if (!i) return; } /* * Option found; mark it and then handle unmarking any other options. */ if (o->ui != PPD_UI_PICKMANY) { /* * Unmark all other choices... */ if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, c)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } if (!_cups_strcasecmp(option, "PageSize") || !_cups_strcasecmp(option, "PageRegion")) { /* * Mark current page size... */ for (j = 0; j < ppd->num_sizes; j ++) ppd->sizes[j].marked = !_cups_strcasecmp(ppd->sizes[j].name, choice); /* * Unmark the current PageSize or PageRegion setting, as * appropriate... */ cupsArraySave(ppd->options); if (!_cups_strcasecmp(option, "PageSize")) { if ((o = ppdFindOption(ppd, "PageRegion")) != NULL) { key.option = o; if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } } } else { if ((o = ppdFindOption(ppd, "PageSize")) != NULL) { key.option = o; if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } } } cupsArrayRestore(ppd->options); } else if (!_cups_strcasecmp(option, "InputSlot")) { /* * Unmark ManualFeed option... */ cupsArraySave(ppd->options); if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL) { key.option = o; if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } } cupsArrayRestore(ppd->options); } else if (!_cups_strcasecmp(option, "ManualFeed") && !_cups_strcasecmp(choice, "True")) { /* * Unmark InputSlot option... */ cupsArraySave(ppd->options); if ((o = ppdFindOption(ppd, "InputSlot")) != NULL) { key.option = o; if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) { oldc->marked = 0; cupsArrayRemove(ppd->marked, oldc); } } cupsArrayRestore(ppd->options); } } c->marked = 1; cupsArrayAdd(ppd->marked, c); } cups-2.3.1/cups/adminutil.h000664 000765 000024 00000004421 13574721672 015711 0ustar00mikestaff000000 000000 /* * Administration utility API definitions for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 2001-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_ADMINUTIL_H_ # define _CUPS_ADMINUTIL_H_ /* * Include necessary headers... */ # include # include "cups.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define CUPS_SERVER_DEBUG_LOGGING "_debug_logging" # define CUPS_SERVER_REMOTE_ADMIN "_remote_admin" # define CUPS_SERVER_REMOTE_ANY "_remote_any" # define CUPS_SERVER_SHARE_PRINTERS "_share_printers" # define CUPS_SERVER_USER_CANCEL_ANY "_user_cancel_any" /* * Types and structures... */ typedef void (*cups_device_cb_t)(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, void *user_data); /* Device callback * @since CUPS 1.4/macOS 10.6@ */ /* * Functions... */ extern int cupsAdminExportSamba(const char *dest, const char *ppd, const char *samba_server, const char *samba_user, const char *samba_password, FILE *logfile) _CUPS_DEPRECATED; extern char *cupsAdminCreateWindowsPPD(http_t *http, const char *dest, char *buffer, int bufsize) _CUPS_DEPRECATED; extern int cupsAdminGetServerSettings(http_t *http, int *num_settings, cups_option_t **settings) _CUPS_API_1_3; extern int cupsAdminSetServerSettings(http_t *http, int num_settings, cups_option_t *settings) _CUPS_API_1_3; extern ipp_status_t cupsGetDevices(http_t *http, int timeout, const char *include_schemes, const char *exclude_schemes, cups_device_cb_t callback, void *user_data) _CUPS_DEPRECATED; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_ADMINUTIL_H_ */ cups-2.3.1/cups/testarray.c000664 000765 000024 00000024702 13574721672 015740 0ustar00mikestaff000000 000000 /* * Array test program for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "string-private.h" #include "debug-private.h" #include "array-private.h" #include "dir.h" /* * Local functions... */ static double get_seconds(void); static int load_words(const char *filename, cups_array_t *array); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(void) { int i; /* Looping var */ cups_array_t *array, /* Test array */ *dup_array; /* Duplicate array */ int status; /* Exit status */ char *text; /* Text from array */ char word[256]; /* Word from file */ double start, /* Start time */ end; /* End time */ cups_dir_t *dir; /* Current directory */ cups_dentry_t *dent; /* Directory entry */ char *saved[32]; /* Saved entries */ void *data; /* User data for arrays */ /* * No errors so far... */ status = 0; /* * cupsArrayNew() */ fputs("cupsArrayNew: ", stdout); data = (void *)"testarray"; array = cupsArrayNew((cups_array_func_t)strcmp, data); if (array) puts("PASS"); else { puts("FAIL (returned NULL, expected pointer)"); status ++; } /* * cupsArrayUserData() */ fputs("cupsArrayUserData: ", stdout); if (cupsArrayUserData(array) == data) puts("PASS"); else { printf("FAIL (returned %p instead of %p!)\n", cupsArrayUserData(array), data); status ++; } /* * cupsArrayAdd() */ fputs("cupsArrayAdd: ", stdout); if (!cupsArrayAdd(array, strdup("One Fish"))) { puts("FAIL (\"One Fish\")"); status ++; } else { if (!cupsArrayAdd(array, strdup("Two Fish"))) { puts("FAIL (\"Two Fish\")"); status ++; } else { if (!cupsArrayAdd(array, strdup("Red Fish"))) { puts("FAIL (\"Red Fish\")"); status ++; } else { if (!cupsArrayAdd(array, strdup("Blue Fish"))) { puts("FAIL (\"Blue Fish\")"); status ++; } else puts("PASS"); } } } /* * cupsArrayCount() */ fputs("cupsArrayCount: ", stdout); if (cupsArrayCount(array) == 4) puts("PASS"); else { printf("FAIL (returned %d, expected 4)\n", cupsArrayCount(array)); status ++; } /* * cupsArrayFirst() */ fputs("cupsArrayFirst: ", stdout); if ((text = (char *)cupsArrayFirst(array)) != NULL && !strcmp(text, "Blue Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"Blue Fish\")\n", text); status ++; } /* * cupsArrayNext() */ fputs("cupsArrayNext: ", stdout); if ((text = (char *)cupsArrayNext(array)) != NULL && !strcmp(text, "One Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); status ++; } /* * cupsArrayLast() */ fputs("cupsArrayLast: ", stdout); if ((text = (char *)cupsArrayLast(array)) != NULL && !strcmp(text, "Two Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"Two Fish\")\n", text); status ++; } /* * cupsArrayPrev() */ fputs("cupsArrayPrev: ", stdout); if ((text = (char *)cupsArrayPrev(array)) != NULL && !strcmp(text, "Red Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"Red Fish\")\n", text); status ++; } /* * cupsArrayFind() */ fputs("cupsArrayFind: ", stdout); if ((text = (char *)cupsArrayFind(array, (void *)"One Fish")) != NULL && !strcmp(text, "One Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); status ++; } /* * cupsArrayCurrent() */ fputs("cupsArrayCurrent: ", stdout); if ((text = (char *)cupsArrayCurrent(array)) != NULL && !strcmp(text, "One Fish")) puts("PASS"); else { printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); status ++; } /* * cupsArrayDup() */ fputs("cupsArrayDup: ", stdout); if ((dup_array = cupsArrayDup(array)) != NULL && cupsArrayCount(dup_array) == 4) puts("PASS"); else { printf("FAIL (returned %p with %d elements, expected pointer with 4 elements)\n", (void *)dup_array, cupsArrayCount(dup_array)); status ++; } /* * cupsArrayRemove() */ fputs("cupsArrayRemove: ", stdout); if (cupsArrayRemove(array, (void *)"One Fish") && cupsArrayCount(array) == 3) puts("PASS"); else { printf("FAIL (returned 0 with %d elements, expected 1 with 4 elements)\n", cupsArrayCount(array)); status ++; } /* * cupsArrayClear() */ fputs("cupsArrayClear: ", stdout); cupsArrayClear(array); if (cupsArrayCount(array) == 0) puts("PASS"); else { printf("FAIL (%d elements, expected 0 elements)\n", cupsArrayCount(array)); status ++; } /* * Now load this source file and grab all of the unique words... */ fputs("Load unique words: ", stdout); fflush(stdout); start = get_seconds(); if ((dir = cupsDirOpen(".")) == NULL) { puts("FAIL (cupsDirOpen failed)"); status ++; } else { while ((dent = cupsDirRead(dir)) != NULL) { i = (int)strlen(dent->filename) - 2; if (i > 0 && dent->filename[i] == '.' && (dent->filename[i + 1] == 'c' || dent->filename[i + 1] == 'h')) load_words(dent->filename, array); } cupsDirClose(dir); end = get_seconds(); printf("%d words in %.3f seconds (%.0f words/sec), ", cupsArrayCount(array), end - start, cupsArrayCount(array) / (end - start)); fflush(stdout); for (text = (char *)cupsArrayFirst(array); text;) { /* * Copy this word to the word buffer (safe because we strdup'd from * the same buffer in the first place... :) */ strlcpy(word, text, sizeof(word)); /* * Grab the next word and compare... */ if ((text = (char *)cupsArrayNext(array)) == NULL) break; if (strcmp(word, text) >= 0) break; } if (text) { printf("FAIL (\"%s\" >= \"%s\"!)\n", word, text); status ++; } else puts("PASS"); } /* * Test deleting with iteration... */ fputs("Delete While Iterating: ", stdout); text = (char *)cupsArrayFirst(array); cupsArrayRemove(array, text); free(text); text = (char *)cupsArrayNext(array); if (!text) { puts("FAIL (cupsArrayNext returned NULL!)"); status ++; } else puts("PASS"); /* * Test save/restore... */ fputs("cupsArraySave: ", stdout); for (i = 0, text = (char *)cupsArrayFirst(array); i < 32; i ++, text = (char *)cupsArrayNext(array)) { saved[i] = text; if (!cupsArraySave(array)) break; } if (i < 32) printf("FAIL (depth = %d)\n", i); else puts("PASS"); fputs("cupsArrayRestore: ", stdout); while (i > 0) { i --; text = cupsArrayRestore(array); if (text != saved[i]) break; } if (i) printf("FAIL (depth = %d)\n", i); else puts("PASS"); /* * Delete the arrays... */ cupsArrayDelete(array); cupsArrayDelete(dup_array); /* * Test the array with string functions... */ fputs("_cupsArrayNewStrings(\" \\t\\nfoo bar\\tboo\\nfar\", ' '): ", stdout); array = _cupsArrayNewStrings(" \t\nfoo bar\tboo\nfar", ' '); if (!array) { status = 1; puts("FAIL (unable to create array)"); } else if (cupsArrayCount(array) != 4) { status = 1; printf("FAIL (got %d elements, expected 4)\n", cupsArrayCount(array)); } else if (strcmp(text = (char *)cupsArrayFirst(array), "bar")) { status = 1; printf("FAIL (first element \"%s\", expected \"bar\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "boo")) { status = 1; printf("FAIL (first element \"%s\", expected \"boo\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "far")) { status = 1; printf("FAIL (first element \"%s\", expected \"far\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "foo")) { status = 1; printf("FAIL (first element \"%s\", expected \"foo\")\n", text); } else puts("PASS"); fputs("_cupsArrayAddStrings(array, \"foo2,bar2\", ','): ", stdout); _cupsArrayAddStrings(array, "foo2,bar2", ','); if (cupsArrayCount(array) != 6) { status = 1; printf("FAIL (got %d elements, expected 6)\n", cupsArrayCount(array)); } else if (strcmp(text = (char *)cupsArrayFirst(array), "bar")) { status = 1; printf("FAIL (first element \"%s\", expected \"bar\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "bar2")) { status = 1; printf("FAIL (first element \"%s\", expected \"bar2\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "boo")) { status = 1; printf("FAIL (first element \"%s\", expected \"boo\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "far")) { status = 1; printf("FAIL (first element \"%s\", expected \"far\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "foo")) { status = 1; printf("FAIL (first element \"%s\", expected \"foo\")\n", text); } else if (strcmp(text = (char *)cupsArrayNext(array), "foo2")) { status = 1; printf("FAIL (first element \"%s\", expected \"foo2\")\n", text); } else puts("PASS"); cupsArrayDelete(array); /* * Summarize the results and return... */ if (!status) puts("\nALL TESTS PASSED!"); else printf("\n%d TEST(S) FAILED!\n", status); return (status); } /* * 'get_seconds()' - Get the current time in seconds... */ #ifdef _WIN32 # include static double get_seconds(void) { } #else # include static double get_seconds(void) { struct timeval curtime; /* Current time */ gettimeofday(&curtime, NULL); return (curtime.tv_sec + 0.000001 * curtime.tv_usec); } #endif /* _WIN32 */ /* * 'load_words()' - Load words from a file. */ static int /* O - 1 on success, 0 on failure */ load_words(const char *filename, /* I - File to load */ cups_array_t *array) /* I - Array to add to */ { FILE *fp; /* Test file */ char word[256]; /* Word from file */ if ((fp = fopen(filename, "r")) == NULL) { perror(filename); return (0); } while (fscanf(fp, "%255s", word) == 1) { if (!cupsArrayFind(array, word)) cupsArrayAdd(array, strdup(word)); } fclose(fp); return (1); } cups-2.3.1/cups/cupspm.png000664 000765 000024 00000436757 13574721672 015614 0ustar00mikestaff000000 000000 PNG  IHDRxQ"Ug=IDATxj+9reAx i彑<>~'B!B!g<<<}zyyyO<<<<<<<<ϟчn<<<<yyyyyoZ1=<<{u6<<<<_<<<B<<<<|A~}q-<<<<#nN<<<<;o< <<<GqadX֜s`&ND0fȩ頻o}3]^:]ַ><=?xTME9jEI% .c$ne޲KѦM/(L!)u D{҆ Uq&O?]t(,Qz%3UWHDEa\Q9iS1hujB_9Μh.C|nyycGx|9@Ѓ^JFD:{O͙#oYL }?_n]-XȤinAzaӟ&Kо\q6j梃y~%:K}uټ?_2Dzk֞ n}Xw+KyZ5DkȉEaaf<01&|Nꮻhf Ւ 1cZi/[4?EA@KPq=z?o,_hwTbL/x0 p~0ZZD׫ENN m|.jr -tb`GP rh+|Æ'5h9mj?>ɑ7Hk-fϩyA=sACoV<<ڲEC|Dkֈk?:0| iaAD$6{`Gծ$)Not!h{Uxɋk3H}l&x뇙 ~'# V:hp Pm=zD}ե }N B]Jx!]Fy6&xt?Az饠(:{`4@'G}յq9+A'C(+-~XODkZEdpu={ĠAQy_uN۶@0O^]x5R"=zDapuzđP{Cb~OŃ/L(lDUԉ6mThO ?Y o?hp}~_j}*4o /͇yO8[?Bm.N<=hxA qq~OG^b1AUx;v=/܃g4ÇEԜ92A'/!qc3+oߞRWSD6-|/܃g4z-[֭}z_ɫURD7SE~Ndm[ }L y9^ V:hp D[PPJqI&]DǎoFbCj<֭4@ /܃g4:RKUδ{ > ^|o~\|˖qK^-lp HqUǺ 5w.we)w4i1E  A$|yx4XAUACFѡCG+1f@t|2h81Y3*)6/B?7{`܃GА)Aq0{_կO|!fRo]-g<|C8я=hxA#hȔ yMWj, A!1awU9WsjۂpTX^{`̃GА)AݹĈD!6D;va~6"v"-ʇ1ھ H={`̃GАAA pB9TRgc~8""uh~ =hxA#hȸ z}WjjmTRzK?_͚%zHz1C^vZyS˖W^Qkкugs> yUQ|y2!5g=hxA;4@8\7?b`1}W'3[eeFDbx9sZ0J{M97_(It|qu D%%"+VR;k N<1M7o.Sŋinan|Ő!2"8 V:hpG_xI޵ע}ς&M2ÇuD۷yyW"[jE[* ӦMvzmKjѢdޣʙ3+.Lțn#{L=D"VSU؄wr_܃g4#AѦMANSE=n N.S+VСC:2'Go~^Ď#d"<:uT(R+WG&%i/(ucnHLe 6Dxе+=hxA#h-gKϞD}yT,+tD6APj4& ߮;V>xbJ*Q'b?Y NAysP#E-\߯grڴ 7|Q>= XJ|o݉Gߣ:"ĹlN>92^={[nIfL-1q"=hxA=$gu1|яy&owݕ}|hΝY$ 4<=ECKΪ]ŌK 1lX$\hgoGg~00vt0>D߼9ƌ}E~aԫ2h/K'lEhxiJ>ۧ=d޽5sɓ#4_de'Ծ(1IDw.^-^# R>h˓>T1pſ?Y / / ʛo`/gԜ%J-[hx{48?/+}Y'[ҨEE˧bw- |"٘aPa9^H\|s_:aN`^рR9߭㚭Tqq:l@3,.F?*K|yJK~AE;zhǎ[c6ԪU=hx /W4`TwݥJ}Ad%y5[;^3n+|0tH$D0x1>+K/2h-/xASрR_XHvi 3=Z3T0r$|0hfଳn/沊J# x7G\S#hA۶iW_yEU߻-1R5['_і-^ BxA^#^?N#4sѺunϿ?+0^ƷnMAyJNf1qfxǎ<%}oBxվ2hԨVoteCW̃[_hx*/{kC?mƍ+3<20X?<П Z|vz-\bDtª?Y Ͽ㥪|0`)vmkW0=86n'(wQAZrZ|Vc,9oSsu܃jm߮|Pƍ+izPu>q᝘_G\~fi'g4`~KuyeYGYҖnC/*<o1oߐ*0?g͋ɓ F'i~S};~ru+0^s^.ߪ?X2{6Uxڵ*WǼFL gɫE\(=~ݧ*? V:hpAKuyq͚…VQJX_^h N>1o5 3ϜOgoL۵SJG4X<} /رԚ5VQKj>C 4H Gz̧~qE hxAxںUsg;.ƍ+Qq{xE, 0<'v%#3~?$Sbd4xAxc*^=隭裏Oua,q5]#FpDƙ<}f(ɾ? 0Yv GL9+8,V2a.=hxAh?Ւ%,GSNwﮙKouO( i31.]4sٳ3'l:xPs)ϰg4?j^>fW/ԩCBhRoYڠ ޳f(hQ4X<} <- XGL}y0jhӦ4?4޽724K|Dg~yYU ՠ((PO>X{o ED+&{/(x?7pa^;wg>~̰{ūUV*6m/y|h`Eo|u*^!i\]+e&GwB|C9ti_G;wdŋ1_x['o8߳g#ՋRxc0x߲e'O|U;0<' +@ϋ(~ÆIƢT=]y^ee_sBnЮ!&c-ы)]4?S'8_jڳdIc,H`̗e2OsOd?d8n?hPrP:%O>C8w'߱#19^>|[ƣ 7Sh0!3B])6?p񑙯N oo%O>CzUC`&%o^40Ly|ыΗ|fQi;^}PRJ+~JJ#/y~Mh`E /%|>N}U+s9D)%[xm%O>C)4c>O>U2_E͔. ߞ/Z xBJ}Uta^۶>ɓ_VA@ÌGӦR|ƇE͔.h|ѱ-'[^xq7m/]*TD[ЫWc_Knb 0'=o?K6E͔.h|Yt/_.qGQZ%-_=v'sJ|k+cGK>h`E۴u%8(zX$X(Xl֞"x#ON"V[ Ty<%o^40Ly|Ηm3:\cg e˃s5t'K-0'߮J} '_40 ytы/[lk2~GO eɑq^׽J Owpק.2k%Oh𒢁fɃ ^4|v՚5bK!JRj)ߏfL~!Ovps=X 2_y['o5KCT`2~ȓQ}sEp|ppk%O>/o}ΊzH}%`y5k=h<_?ɯ!uO͓9F`||3䡋G/lgP.`}wU>N$e#J)dw!O>"t2 " FbVN0 y|_Y ~+3 3(*8TR6T{k˖u?Jv?q/Γ:K`|o`EC UW%K9џ%>wgȐ`0{s ƌ 'L'Mn%=;=O<~t)'QOٵ?WwË/X|o`ES4PT;^&7O'RfGq;ww57\*J0'/wۍZɓ_|3䡋7hc,3HRB0z۬ A) yĉ+k%O!]4QEEů:=|>Rf7~s:յÛnXy{3_+y['o}l]Rx|4wj+k%Oh`E7z@Qeqk.2EE(ßg4h <Vn6J<~|3䡋7h֭|o~~eRft7w:Ktua8OUT0_+ydE7n@Qq#ʕRN 6mP3 u.K};yK/ |Zɓ? fC ߈EE=ezA $z|Υˉ y%+E k%O͐/RY7KptRKBwUA GO>)Jok%OE͐. .Ov SLJ}קO]\VXp|+o뭙,g럊Yk>2/ы)^4EEv݄O/OKW0r$s9jJG 罝wXůje^ɣ 7Sh0?? `'_Q_8qb eTe$:!X7|ǎ+VE}x3vSPW e&mI>aS/9}"ױ0/ы)^4 ۭoH|&&`gU e›n{|ijK  پȓG/o~۬}|n#h"UTsxkWbEey'fC  Tm7hW[&~z)?5H'(<_QX`ey'^40Lytkԏ?G+*x)OU+/)פԪU6m,?䫈ES$o4B`jU^o`E|EEEơ5 6UD+k?j æȓG/oz׵kc!SC ϢRBtG&[y!o(8{7߬VV0f5stQїN1_cyg&EIX~ Ch0r> RtǺZCo<85KW_&_[ éS?(6o| R>1i+w2|{vw/RQ=tp)[C)8QR~v|ɧ/v~K^IO8A58@/^܈~& 3|[ލ éScq;t@|9~(Kȗ|zCn#N+90ף +*k&\x*1 'LXyCfy_"ʕoe@oMB[Yi<|>\۵j#_9(j v~CwW+0_3{Pqgpe+2 TrRQ4 n׮/;23&YG&+~;%:c&*v| _@#F4 Q2<1ɦ*(U,o͟v[0fLr~y?YANP않b˖y.^`Hkߢ菷dym#v?L!/T]4K&Ϭpફc .HIu!'ͺyݻ;t&05oD?XW_?qS~|os'O:wO:ӦYymn C1;@kP)bwapʔ !h<_B/8_ȓ'Ii"5k| NI<-R+W&wOk ϫkPid맷cc ΗɓƌkWR~ey00@q5wwA0{n ='-N`rh|!O'A>|o,ZD\y%E.6< ߼9~cc[o5Of*90#Gs|ыΗ#@#~-ʕpT mD -vyD>zA0W^L'dI+!=0܁h|!Otkx 7 ?lAVx]/DJx?|+_o#n+woXg&M [omEK y>?fWTğ|"ff|[oTQ$Rav|.\0֬)&~*93 '5?zRC.{oFhBWɫ#ITptX|납g 37N`-]??6V6~! <Y/l.|~!,woыΗ Iov;p*3 %Ygޛ6>JcE { @%7Cv"zt!j#7yکBA,(6m|3(V9N";!'BVꫯPG/8_לbE͊<"*~EJv?b _|A_|i{#FSɲ,AV4w.E ԩ)wov<2F 2_tF EK,Lo)6iR/'OdcǢ_4p)C68fǟ|Xg3_t>$]~y g3ߌhrAVs&ϫk4P/?T ?~B{AWovPf7i13/:t?AqGH ̷~fp'ۣ+!&MyC\^4p~Պ'͝+8?(/:ۈ{,[ a& =0DZ`7|x!=k/ ыίZp<[۫n;oߐ"4n&o㯐ץwsxw|ůf3&Mb.E-G/8jœF~4u׮̷~y*8ϥʉ..[WT+"/X`u *pqIwu|xmtyX _{ +2/L&h|NZB;[R?^Ubogu[D|r m[>ZQU+ί[o W8}:EWxuV*ܞ=o=_MY>CT{ V͛ǟ}&v)<֖˚|;[)_)O><詧Y̷VT 㙯=l\]'2ߚQb7_|8vܓ|׿Vql [m?zU[.#oС(c/;6{OS0a ?_UߟZoxVT/.y5\~9~,[r bI86?Eyp u<\50ݺ)MXL6w3_|^D]S]c[;NbK/e="Ŗ-aw/y')CWbΝG/y.{Aws`$T>WzLx ozlPZ,R8u**Hワ_yA?Mb^EC!O?(bǎ̷|jj%vE>WHuz]AV>z9T#ڶxk.%[Rr Vv{Je-ǍC h?g*_ѲeMopLۿyTc'~~L,v)Z/՚5b>(l5λ{ﭢHlQo_ļЋC|֜|k˻C.c)8E>6(nPWODJRq[nb^]?حUodSzP7ȓǏ-[ mS[y(UE/ o1oTcLCEE8cXAN8AZ*~2\=h^EC!OuWHg3͚s Qɋv\C$ypl]ym)|;/$I)U5dmZʏ?CN'h^EC!O>~5~{#G2M-C/iM^u:}bdp;wVk׊JQ^p%_w`wbyE RasN2~l䱯eP_|QAB/yȑKFby0-ʋJ'6%R{اW(l S :/c>ر?vT. h?WV{S6e"zQpΦt"ͥ$o?8ђ%RRA\uUE +MoG˗ >f/{V=mv}JXrKܼC|pb 3_jSFƑG&q `N_ģ\آE%%|w_Ahp|ׇ Θ $F\jY` ~*Ik~V_ `*ZUVf^pO\)_ɫqIjN<_;GK܊|7pqa*9!ԩ\ GE{ᗖ dH1BQ{,52oC+ |>u3௾hTH=H$+Ybc4E3Qc{ַo!W$B [K$:s _,h|ç!6>]ю߲2j(p4Z+d<=>SU*hm͕h4_RBm2~12K՚Q5p~s]v}L)r7t1J+~g5/Ndg|iw-.q7ۏR=СtH^K(B#P -o/-u>4vZ[/[7d^|1^awqKI4HMn':uR-5YӷNsOӬo}cߐYCLE.]Z*m `잾^;RJNh#GdJ"K.ӭN:UfQ3 _K.Jc/;w.>ME% hO"r^Zׇu;X0WnQK+'j<5$R>rtOG@>#F"Ȉ_$8>[=&y]GPVϗۯ,KMXLxGp]Hl ~<Ai+gaAKkj\zP+̑#T(EuWZ&[ˇq1#?E6e =(HxԆ aqP8Js _b$8>ρ_W_58jܓ//Ke8vwvOg%F@ #~EW[)/o}7 WHDx~hKQw4*-Y|bzjl=,iyNͿEq~H:X[}퓩C1N:ɼ*Gwޡ^l 6@ģ~N9X~4| &jkGjRTV _h,I>|mxx6hE+*~$GPė(K'<>p@ ׼bp[%R8yĝ4IDċ/# 9iG^~(Ÿh|=ZցbH~qcL:TGC>|6PYZVxuq-P| O?Zq~5@^W ѐ6wwc#}0ģ$~a歷"CE‡䗔~15>p 3M@` jz _bT4v|ڕJ9ǝ>ZP!k<ФbqX:Kg$mp&OV6 [Qx{gOW~<@I+^! ~U;cYj/9''A^J"uLzÇr /wJǷg1#ďQ*:wΛdzlrD|I{ɇoEʞGiWu _5CqRŗ 9᫽{?3fKf?eKf`xO˧\VuM/m $pŋ'|t7 sG]1CG"歷-Xn=>ƍm8K/,x‡m`o\|Iϧ_?pj}=>r Yc北' 3 lF0oQA|{9x ~|;c}=%Sr s2u"O~زeDFdǧ\Ä e`M{LH/T4r|y 1.1z)MZ$Q* 7N`Wxh5ugVRvzP^Q* :G"-Z xx~5.Wu1kÆ)'P:vDWP_<؝?$8_xiև1~vpؼRs{w}| 8tċH 6᫽zK.=`¼Zxiɇ{ _G?kfǁ@(:`ۏŬF.Z%xIh)P~ǎCI {xߺ|SN.-v󿀾~1LQ4J ҉]vqKyG :PSr"޷rÇ_Sc?<O-ttz%"$zٺ^\3Mc%?-?`NlԺB}|."̼Nf7z ?'[ϛǁ)hH>}{@n};w2]D&%QQ\>|bV2?_D0[H4cѼ68mn]`ozI~>|ڶm:[H?a㬳؊=fڳ'K'4k3fp VG>[?5g+WrP[K㢋ǝ;Wgv2|v3ÇWkWkq8q>@9p>m&et*/҉@?|WvQ@ oG9#g?o |[ϼj|9Ł3iX ߡC2z5~-~+(K"ٸAU9qLTWc>|dv|2 QG)aO! J7 |u=~<5|NGC>|GirP;%&[m ?[~f^|t1.-YA~a KutS\B痃"d?RWW O3`J uM0g"ѣ]t6yƅR 7Y|~isPYݧ-_f8)}Η_rP 9sOMᇼe-%W/:C#7dͳj_}=&a7hT?hg+P [7T4 ç4T|aO￿̹?!ix>şxnh3g^7߬F4.sg g[Y_y3gr33+P6-o>|_k;&>5ӝ?q>\?8W700ۦ",*Ţ,̷$p~ÆY#Y[->ԗ|m$|Qm}^bA ׹y=T~,ﻯALgҤdߓ̷Fw/64w端cjn=Jra̷C_~֣7u_;W]E'|~I/qHo gD+z̟T4—Wz(~_|R{o%)?ۛr |*̚%aҁYRO?|07 -mP_Ƙ3my]{':whÇ~yvO~ˁhƱnST>P{Q(>Bf_1/s Uvp<Ïhyy5G1Ӕv5g >|P׍H~5Zn%C1} -.~>|UU!1괿'*Ἇ'|eet'߼&ݟ~8GuHza㬳6Ç>m 㢋1cxqw\{8KH}yEt>Ji 79s&1Fs\ B}k//W8?ioti/ͳǎ5Z; Ç>|OP`a=h9ג%]|G9z Lf8?KQ$U_rI>|HDY}mJf^}6".l[ܙ:J3FCÇO=4FUΞMr AATA;)H>|vI./t]G /ͻ6N=U<8Q^.Ç_qy9>|һNiQ3,:}F~p,jLƘe+?r>ܼOn ;wl5z?s[n~~},Ylgf 5yļZ3WzP">|G􏼶O?di,]nQeVTD{x+lj~sOD?|M#m$4Ϛu UhvU;@jH >N;n1}ѮJ,lއ?j^ L}=%(1AEmԐ\?XSAOOzJ t=WWbU]EB`<>|çu MAo:?miQvH^<R*VZb e ]R]顈+yyyygϴ yyyy?^gn<<<@"?l<<<d"yyyyk)yyy3'Y=<<иovyyyy35<<<<_}N4Gm<<<<ŧU7K4<<<<[r綿FY<<<{yyyy,nyyyy MV<<<4"#7yyyy>~0<<< ,<<<<|<<<<-o3yyy<$I$IJ^a<<<Ÿkm5<<<{io<<<|6<t<<<Wyyyy#yyyy|m<<<<*z<<<>>>>>>o;kDO`Fk_ c~`y~ʬɆlŎ89 B]#<˼|8:xb;D}|c`nZ5ڑA",-g]6c[vchNl.n6<;ziCtRӜoٙ؂#~ʬFlNYl8b b {ygx؂EFForfecgY-[0Vc=6c;vgN.-`^lxxD䌌N&U[#i_1 4mX؂5;b ƅ\s/[0a$_2zx__epLɴ%$0 ?gb lnaé˥\`M>`%GC+>>S%9KIRɂ,ɏ`l\lسi ƙ\p2WyOY^EyMczؐۘ@$폡\ϋLxuI%>>~,s,dI2s3ZM*==]+72;,ˢìE;Ⱦ\ӌ}?k0jcfղɾ|>_o"Owsz.|N8``Gdd%<31XLWp5#Kߏ ThDÕ%3i>>>>>>>>^# S"YŘY2%2;s'r'2H˲5'ɻRl؂qWrgrGq{[06.`$ 2' 0=M)&MTOyA|@q:hY˟G6?Zs> ^InnVR0ewg3g5V(`,Zlhlaw.1!C|||||||||^BgiY^&O\.?g7.*r_Yz .dVf[1>>>>>>>Չ+.r-hes![Gcv<}S)/s(jYKA>~Or{ Q~Ď|@?>>>>>>>>^7.ʏ:yFѪg֣eYO||iaO~05rl9ttUT>>~_3YُGxӲ bSbF{W'feYbݡT!J4j7WkiO`ea-g|J7̤FYm9{EWҥa_IUCkSby̚~>'0؛Y[s0ze|@}|<3|dfֲŁ<g|eEfٺV|g||||||||tOa*3C+.WZo4|DZc%fU,#i?GտFZ4Yi`?ԲY('OF2#W~z D||m&?,e6M/^ ]0rrZhʏDUv=ܦ!=Z%9/A9( 'p?m^a?VU&>' tUnVٺlɇzO/v4T\~5>~U9OV߫q70T˲Gx}_euTF|W||||||||^(#c TVyڟq?ʬ sfFa\j؀ce|P?̪e}o'`-VmKW|||||||7{ϯ*?\ Z_q _g3G6Qa=oCW|||||||WyeZP_g Uy@ֲ.r .Yko?.N؄(sL3>>>>>>>}S%:3uMtI?O'kYfgO [|FHD6eQ5ʬʁKLh?SzOJUkYE+3 oO'QfaUz^dm'>>>>>>>^yM/*Н!̫eG/?'/NasW*u<fD?Yޕ(k뇨Wts?3в,i|DgS٢~+j׼&QFy}">#Uc1- 6NƓǏnNg+TĊ>>>>>~ UK >.UO?4ʬ-&T/W ai5P~^\ӌ#+>>>>>>?GRD!GꉏRCٖYdfֲ́<ϴO||YlDzj=.D W^?AU"}NKiL$n~pKU }N>a$Ix>o-мhQ~_[47{S$Iuy^yCX4o*G$I8:MyM/*/>ߏolH$I|wWQgk8%$ILn_)*E||=Ǫ29#DfJ$y^oqsO9J$r"+M1*>OҐ$Ig|w7NWV$I?]ᡬO }*>;ݯ*ד>+au{iT:g||ʃ.zr#>~ 6}ǯ*&}w]U&}wի5+H鳣}|-}|||||D =~&U>>UYKS@||L2?JU1>>3>>>>>>^YW/ZЏMm/bNWʖxKkSIw NǪAxբR|| 4I7ʦN9xidkTe g{ޤNkʟ4g||||||ĪOU}Iʉ}|r3>>>>>>^U_+>U+HR4g||||||=5[5߫]ώg||||||慇eT<.U_eU)>>)3>>>>>>^y=ǔY||},=~6Uy>>.UY+>>>>>>a*wD4kgQ6XgGK4m>*ER||ggk3>=~1 pT0zBLd?*>3Cg"43ah[o//4> zP^[6vrEy;nk.K.LN9#e])drCYcRg%Ydy昕ib ƩI1Fead@)*U:vhfilT~/~|_3{V^9X`kԶm۶m[9|\D7ջ`@lڶmD( Y,uUu7MhضLv\0^ǥq\iZ` u7 DB`K!Pzcǜp~*ęR^TJko~sk̝>8ܓ޿[cH3 `MmIP a :B 0n!Ki!#!BLJ9SjB+clZsn!\bxK#gίNjdڶay>_Gq!uB6)m1fs}!R)5VjT1sc.]9~6]1S:t[)`آo XۃU%@cQdRUls̼2 b jJ? lmB<-? " "qغ ˬ߿Zaj|n9ϙ̽'d,'Ktҟ-[e~|//Պ?"vz^`]^z[r<4ӏDErn둲r<D^zmPzD9 GQ.?_bzdHmqoE:>|>^BQf/#|QD)kwiN'(roo^ \2<(@(?(+~WND)OtEe"!B ·z^x=DӎzDyE3O'_A?Y#+L* I:!x Q&~z^PoWDy 4ӏX reEew xtC^'zx9^?(hD,D)(;L*oI:!xK%|(^뫯#"mh}? #O!W?OP#F"Ӳ^8}:̀}QC^(^OC?8롁~%ʖ;r '"Ӳn=Tҹ2:p>(^7PuC'^L? \2wu':8!'rz^OśFc~'h wͽȴv)<\=?KzbQ>s<,f_Ou)'//Eem=<?5ޟ$Tp>\z^t şw(S4ӏ<<r=l9lX0-˗Nl\vC~pz:Wj;O ʫ~ (QyYdZ#}!x(awz^O:O%~e읲9kDy68z^\Dz\9^ߞ(߄foCC~!#G읲92Fp>z~pW^5q E 'C~cǺ읲6tfCQ>·Kz=w/ewh)HgLw.>{[ƌ!UkD^iz$ꢯVx3 Gf9(rA+KRGγ x2QvC^-6-b'2 G(Q΄I͞Z:$Ro'Q|z*Q=z]D tD,XԷ |re8z^o˃nƽ^?(K~󈲜"W? Z&^ťwa-I[k%5|z+VRt/!L?Dmm/laz}7Vf=s C^-vN|b{~Q^@WQs^{_v-dg|zӲHV!^?(h|r8Q17qwZ92QDy+8z^oT9T!^߁(_foOo@~n'OL}3{wEqBσ^?^5q4Џ᷐fʔ Wo; ҙzSp>z^Hq6^Qvf(A~fӧMƑ25?OO·uz:: z^Qfѿ(GC~N&[;1~&8ֽ^z-)*Zh!ʕL?{r˗~!\w?|k?(sz^S=ҭ[UL(~ rl9lXf GVmwrk^z=-/oڸ{2(A~>BA:k^߽k4M۽^G "W?W3.|cw謳Hr5?M=pHz!6]^ Qvf(C~啗\R_7 /0t@ 9z^]av׿(G@3?@#ٳW+]gw r.8z^P`{DLH,\8m=4K<7^z}暫=m#L?rkTkX#ܓt UDz^멿T f G( W?'nR76%5ާIp>z^'}mzDG Q)HؽOqw˺uEQw{5G=|8z^O}{~*Q^ ?(B~%Y:ȼx^ߝqDS8z^STڒmzQDy4ӏx"W?e'_uz}]}|\G|8z^Ͽ3K;T^ߕ(_hD4&:5N8\]_w3reop>z^Cl^ׯ(?f'ʏ!W?ӧ x]w9Ők('^zRGz#4ӏDy d$u2z}wU'-k?L|z>4fږz(H0hLjr dg_|~x wHN5e8z^Oy$N׿(~')+VWnq۬eDz^קz^TϩDA_{^(~k2r!.cVy|+/$6VW^oO:\Pz}ʷ~_h"]L?rJ ҙp~ 7^}!,z밾> E=Q ·z^S\_Ӣ^F'~ӉσDtԨ~W?~'T?vf~d l RoPz}3Z^䭶z~$QAL?Dy-g1Q׳kίϟ`ܸޚZW֧nt\#Dz^p_EuE^ߝ(_fDB~ gkKͿ[/v衄ytƌn+Ig,)KcPz}ٰmzz#O~;B޸auSOwNy2ͯ?}:Dz^sK_LhA~?!Jrs8Q>z^xW"XwW S~!^݅ 7UoV|쳏}wW)oB[YʟX7|2鬃\b·z^OA}mz+;B3Jc!W??'Zv\O~gx6Ç&Ny_Xѽ o9{L[n)_;y>c p> ^zjGDħamzCDG(Q΀\|({lfÚ5O^p'SINo{WLIK:o\|z Tzq[J^(~wPՐRq{, `wfrc6~;6ZyJ~;H:5޷&w)zBz,AL?yDYy!Q:n_77^y#FEA7(olٿzu͔/7OjKCmlz^g0!TFןNǡ~!:9]1tٲ;M;`ȑr 3;7ܰ٬%{T|r x ·z^φM_nx}mz1DyE3'R=Qo9]wӃ>vc)'Oܹ?/#xp>^zAu~E%l$g~#~\KΘEV_sOr(=∷Ϛ[oV9S*n9 rr)8^z=jgYTOGeQ~ ߁(_\H͜/̛w'o#{mI~xqc7݊rgqz?t΁\}Qaz^3|(6yD Gk ” W?\wOk׾x 2^q%^v;{3raz^ӲOǢevyCs4ӏDr ʯ:]pĉ{l-9Ö[|)_~2G4ʽz𔊹G*5O&ʫ0z^~C_Bu\Ew K`  2kw 1wpZ<9N}霮g:ߑk]'~PDJODjov S DL<w:ꡳaz1b;ϻx߄(?χz^c _F`t}A"P'rDf;xGlz?s]xK܌l0FT%(5|{^4cd72SMD9JYRas5mZ\o~xE"cR~7QVχ/z^3}#Z'$Cgդ:#5P]vYSr|gi%R:fq٭gU%{%Kx>|Izh\{E0GPYDyT=_)ΦwgFJd5ָ:G撊o|,##%^zZ+.1`݈MS0| JsQz5yJ~Sj+ ' z%=^U!PjD>gC^/Bc*^xׯ,?(:w&mRLϟvZ _?'ټs=eP 6T9{6JKrx>z^D˵^}V#ʃPD-g{ f:aVDvhwwܲyFP%8$9JWPzKzZyݠ^_ QCz`(JճQ螘;GP"ʩ;$K*p3 J݈e|z%= !Q:!ʚPGIc:&gۄBҗΫ;o0K*wxEC>(?χz^_&z}}%uD>@z~Ef),X3vdRϪtZ# +ſ(3N=ϓg?(U7媫w&ND6X}C7kO2m.8h-sPd)kC^xmWzJbSD9 J;eJ3*)m3k`ϪbI{Pd(S^^QCz72(U"tYd>cX}.c_^rɠ6T=~;A~ QK|zOk-MWGB=RlL_~yd_:gWwiK*J=ƥB>(_χz^{ݹm_5@(Az=\)PK>̿`ro9ye#撊,zs+C^x2+[&Dԣ(AzYe' Kg1E6~sU_9!a|z-fz}Ueu(/R|(nAycC(:Cߡ%9{4y%zPz}E$CC"N=eO(UgrЖ[4~S;To6Tt.@m |oeg|zG%gz}}?(sN=8(UϛrƮƳFz}i(2#^=C32B,:(U5D~WT|s;Pd'yGzP6 ^Sb̃RNsؙha#ﳉ<z^bM7R$WHu ʻH9(_8IZ<[^k%ux?(χ=z^4r09Q~JS~|JճQ~Sx߉("y>z^E\:2r/N=CRz$ʽ]9[hzO?|R}]<z^׳g`h (BթGQ 0|RJ%hz;|N" (a^z}{MwgD ԣ( Bz~EkudT{"+x݆wz/݂r%$ԣ!AzA"6$u^?ou"kḛ{z^(] WGcN=ogW(Urܔ),kow}:^vۑGxw8χ{^/KthtӋ^_/"PGrg!Q.kQ]'O&oC~3Q޽^zڨD1k͑Ũ:_G"sT=eɡvo?^5$_C~.Q޽^? z}eQMSJ\9(>T-i.^z^M^ӉESTT݈sm&cMQn|րR} Qn#y>z^gBE_߂(?:"ʧIL?\q_3?Rg(5$a^z=>kD2;LUDWS~ Q"< CDy[Z3;^g_(28O<z^ȊZ/ 2S~] sQ7.X7J^'Pd( y^ ߹uYq]/zDԣDǡH=@6ؠ{Y{bT{~!%Pd(z^ :_'nPSD9xN^p=No'p^z6~ۼkhSLR(g ݃zqSx(z^y& {S_LN=O`(U5Dwg6^cM"L<z^OBE|^__LPr4c?^t" |p^ZgNJDTuD Js Qx陹Y0^*s?N|B^z}w~|ԣ?(RlKϙ}yGn|VR}M Wz^yy?5.J~+TDT=kon;׷ގVgs(2#Ox^;V1kS~|0|Rŋ== +^9^Pd(Šz^0,hiS~# L^k-G?4c e:hz^Y1/2S~i(AzF7٤+z;|."-D9V^z7mԽHE"iP=DYJ^j`l7J^3krhz^4({qKHSD J3(WomT{w$wC~*Qn_z劦h^_ǿ(Bz_ ʾP ҹ|LH}^rS_z>p˵&Rz$ (U1Dȉ'3Q-[|~EDhz^ ϖhx Iԣ(Cz^AΚ5fzꫭF>B*2'BWV^z^8%R/ߏ(:'"(Uˈ+fhA^b\YBǿ{z^QAI6DԩG,QEyycgک+gc(2޿G-`z^Z+~ MS~|Tgq 6&mf+x4)uz^%S:7#OIE깋(O6N:|" $9Fп^z=˽ ,_BM"Z=DTO琭riS# Pd_Ik`z^|WM"N={I*,# D9s4g1ծw_Dy3^zIBjZhGz}u(Az& 6ک;L>o"}:Q>#_z07rS-QΆ:J"ݡT=6ځ[n_(27#I+ڿ^z} C ޯ^__AN=(UD;󴍩HE8^z^jEwz}  QBS~1|΃RlC\t3OۘjGx;`dz^|<ߴA?(&թG QBz _6vڿ/X@H5^zrhDz} Q:O$;HEy(C)N>mc媫'ρ0z^YFNuE9|6^k-g1%0z^i\I]cIRz[PeM7uiSӧB>A~)Qz^^وe/ $ѯA{H=!S:󴍩棏&x?(oz^߬\~l^_(;Az'S"%ӧ;󴍩vuPdA/Fֿ^z=-,h^Hs(ԩGkR#]z'k;̙mL3vݕ|D*2'0z^ܸ^_J"3N=oeg(UD̙w@D#_zG]l^?xQuѿ(gAz6"ҙmL&NF~|z^$/W@?(:$uP'!eyk6ڿ\{-Epܝ #_zeٕz}.QuLO@z ʔIyTT(2&qz^,"Dחۗ.AI:vRz>A"kB~Q_z.2-zD-ԩGQ>E2QtSg1:6PdI_zj^/KO(ԩG+Q Ey7|Nag1վr;Oz^ ]t@ :PˈKRzn!ϥӧ;󴍩W|fB>Q~ z^ONw}35M(SN= Q$g6Q^{T=G3g:󴍩v{ϫI_{^zQzr ԩGl ٕ(Ϟ6ڱSHe^z)Q^?@Q:@"T=OW^'~6ۇf8kڴgϯvdx{r4ٿ^z=Kz@DyԩGNEyQUlAO\m5`v^msR}.Q.>z^D|bH?(!թG?(sH=$ǯֹs}&+[dա!x?( z^8KIz@NDԩGQs;Q: ^_wVLЕfEzFEDٿ^z=m|>2!~~Q~uGqֹs#z})߹yLeեPd@o_z}izDIuI/Cz^O"_~ͭ3ez^ߧ'"xB^?(|j'_HE9(<GSgѢy5Czs=l=K=4ބ3lz^+Ѹ zrԩG|VP3Ǟ.7Swŋ ? >ؚn⷗_^KO7a%z^i޷/W _o&PO g+_r}Y֬_fhs1bax;Hsx>z^߿ _tѽdo ePHoHo!-Yr~X_fڦ|=7,܄5?o$|zayݾJ>ΟC@z'P{Pg‹/ L?ڹyL?k޷fP=n +3Pz}e0mÉ!Rz2l+M;1qCz5{ۚbp_upV#$χz^4ź뛩~|ԣ(7AzL6,^܎ޫZ1y=MGU}M >ܹoš6|zb@/7$ʯHuџHAzE"ήxݿo,-= f,h=XϦPdI?<z^߳m}P/" AS~?|TDlc|Կ_rO:B= Zwg"ݡ~Q-;SCV[eosNz|[3TuGox<|χz^xIt_W/?K"}N=GHyT]r߇3%K=2ʄUWף{ߚN=WL('@^z=]_Jz@H3ԣ |&Az&W]=me.^|;C7Gs攭G_5òsN;ۡ~-Q."^z/Qďo$%Pw#q۠E2 R+f< Zo|x?(#9z^/7-{^? .Q@z%+H=':&l޶…n =d+G_:#jֿI R^z= jDӆޗ^? $Q>@SVE깍߯?n{+eֺ꫋S5C;kpnoE;Dzs,iDԩG5Q"|D>fhMz޼=6ݔ{u)[o[3ԬyIR}"Q"^z{Mb}YLCzV(Rr+^ѽĽ`sC`n@=~Go}[3T)l&*9z^yB V!:!HE깜(7tr~"nrgt|A"=sIⱛo_ 7Lxczg̨_G>@$JOz^Y7Ԉ5B(Z=](RLfU_źCvd΂YekR'O>|7:z^BkrD>[Bz7P}3^O{#=d7f^;瞻@[3xQs6?@"P|z^pFd6?GN=' P-/~.AUIkAfWXp%֯ ':4D`k_~s?ޯ"ʕP_8 y^OF^/Qzۉ2ԣ#|ֆRL ʃ7ؽ=Uu'L7e/ZT~sKt6|hƌXJ>oIDy z{,x(~bԡ{־z $ԣ(Az(ߟ;S`Gs9n=`uV8IJ7O^O>Wt;EyMAzo!P/efӳ`esYmU!Oy@}խ\'i=#4iQ4χzv8(p ?zǭznD*N=g'Cpw`Akq(i;I]xu^_ݡ.8ܖ_Va;3w& s{l)ť=7#֔Ν?:kVz ˌח-ɡbRRy?دCq8DyKpy[ՁapI7xcu9ކc\Ğq4bܩ6xn͜YL@mg* џp a[7r"WCK+vx9oUP4)H|1~ .ݍxb\bԨd|cD mB}=ZA8W.%:B [7__Tz9 )0o<V92!nOK^x\W\CC8cnړWC:P|q zhU: |8o<.wHOofp]{ŋ#B";пmSB#!ǍcZ 6BjoocPU-`#ȡ$Y7xΜ 9.cx<'\>}K X6_{l)(xk$eka!?'HJooq#)<( 7xA?B4xo[Bk#Vxbqm׮dz@BtQa|ng~Ϟ֕BRl}3xCʐzx1=2kM-׵W'ՀFANx' hy&7k C|1u\j .J'a  v<~|XMj#ٶ-'$1. )o !hY|u,Ys%^}ɫؼyL, &x9xG0x%=?K}{GN &ud NntRkֳ~IǥXߌ7ghS6t۶Up|ݺ?Oi[fg'C W!H|~_oS eS:Psx{8q2Z s9.-읊6is1Ν!La{:DyKmCORgr)eKƢ/۟]಑#uҶn]Ojc`+WekY(=7)nDbmp Ğ\>dfVmX~2Y]ݺ#Mڴd7EC!`'D+3[wW%K/.׳&UMOOCa܇xϔp`A4>FbgpVĞ)t J`EEUG[fӦ$[+VZ }/Bh[7>WiNRAי^Pc}mڴZF~Rp+rx+֙ wE-o"aUގXc|_\zĞqۑS ,PH]HLfB?WR)zxxず׮}1t jhdm`5qYڴulҒŨkE[?COC" x[x$lGs{oKo'Vr߂|hlv]qq4BĒqChMtzgx H[3֑I"yhFd[avT$^=bgyG# rI7W*h"| c|6.F<'ܭRjm.QqJZ*R~tZ*zX9y㟇cg#Ph%":vKa.,W;bNJJsDzm;0o`h{u35yF*eE9.Ui%pDmOC|wwk mH=wni59=zT(/W^&{͒޽ ^oqR!R -<$ZeW-x\> Si"D6cG2ʻ\J=ʼnZB5E׌3{w&jmK<(>BTx9~Np'<7~ҐH(1]j.5U}?a nLԏ"vLv)A=H \r=܊ uψ.ؽu_%"۾2+Δ%dEݻXj8J0V6rR|4xL;?=o?*H'M/!b{?Z={A͚o ,]k\.bt=|anQHo?>5~=5" Q#^ߌ7LC|b~+H}L\)Ӣ Fy0m[*5i˖ܱ#!As^oԒ Zn@^B@*OUǔ IƥQ=7ᒦmAe>ޕ'C^^I̟[@o1w ҇j[^Di}7Qz<ߟEƿ +u-$xm<3~]ը1uk}m-ᎶZibKAU^N~R:tp ,ao<"Q'xµKqi>xb6Z3`@%w4衎̓ȭjUkQ_4tPEmhu[ث~6 E.9c4ISp5xj1si;t역[Z3=Zo5kWct&"MS( <ƥbeH+*ސXB Rtu~XR--Ib=,MigTZ9Zs|Mkgjar|4Ps=@Nj@h6ϊ%T 35 &5ODh(?'x &B|E57&\Fl>+Oå{p`JIzhvB%D/HRoy&CU"W)B"W\njffkT4n}iSTtc.ի[Æ9T a ܃ }o9wݓ'4Wƫ7A#5_Anv2a c5.s#w1qbt~f_;f|-!;LY:]VҒ%ku F19Yx}?t&`>K{Cmۚ b>>p-ǯ8p\}P7kҏlۖ,15/.ZΝƎVXw]>UflҘG<Rze69&̄'ԃI}a 5tky>-ZP=:{ߦ?vV&h/M$F ~x z+]PxƟB.D&b!'%\e.>ѨфWњ%zug2ڸQK=>g׍/MBhZK7UFDy߁Z'둾x*0ABBOt=A8NܹZ134wL{K%iU~688dԩZH]3NH 'v9k=>;+d*(VOP*\سv jށ8{*-^zO)Z2@;kӦ>qi/m>kWݺ͛k%0uX4];Zi"vCZ׳~Jԟ]@ q$uKJچ}kakjqڵ-Dy@Őx!8!"^ B A“|n˗` S׭VdԞZ"An=ҥ!fEm4Y3vatI_W5--((l,ۑ_7r?K9"gxDpRis.O왌KM`^p;Δi-ח-ӰXhuqPψޖiL %iџ qi'xO#"jៈFʠ>"7is4u6mSMWƋoLnQKI:!?n٢|{%<|7x.$cqnL9ٍ ,\Ğ%_\CիZ-3fKAFXhƍժU5=US|/¥;8?R MX`6@ dd[O-p|/0/v ^/֍0U5^n?^jB }w?M[&77M0:5OK&{%8g0HT/Ps.OiK\+qjvq̚հv _]MV>Dw¥x5U^xhioH!W OWwyI݇'ji)M|܄&MJ4 ٯZCQgLiɝ:i6D2 Z /ncHBs堀9/x㓈 iM$j g>3'dR@hV B>y t'J76 EFkOMkպ}i,D¥?#Ő W ߂\?=U O;JƨѸ̓⬫]fMEL݃3gV,t!]7rP`tt;gO"\dFP3>D\d)jeֽdi qH]>EyywP7UF MH/Nfg`>Tc RW8]nOkdvVCΧ_m3A\$"m֝ԩ>꒮OHC4zpKF٭7d?QD (#H IDpޞ/Ö-(2Q(ל=Fm׬͐) BO s`\wW] 6CcB q>ǥ=5\ X0!sH'"T#JOi"8Pv]񍲪Ts{P׳$vD%&<%,x A8{o|G`3dcHy !ڀ'܈KZ<<έ\y`dz RKj@x^9Z&cْ߬޽/.~a_nȠx-Y]7> #?o| #"|ǐT@ĞR҂k>Yo7!K{رƃ>" AG(&+r>FB2[BkD ;̅jxV>BbdpT!"Zݦkz3Ң"mr'!Vݜ̓+Kj]$Ȓs"'=iB$j !)3?7 ĞytͦMoXܹwOH/ZJےum@Lՠ106ȽS[a$Uù~XAbdIOHUo81kX/3f\XZ+8X˒_@r'OF.䮐7( 8 ^Z¼ם;ozIfڪWLա􅱰6հ9 ߀o=.=o ,l@ܮGgʴQ'wXWJюZl0M Ԏږ?ޓ<Β ̋#Uy㍿i@$j yg .݉xbO..ǵhJJ_ӯ+.ZX(?_d4iҢvHL0a7r+)rlKyyO!O!!Jc$vG"< i- Рsf jY u٫^ UT,^O7@:g7'd%WH2OO\z(!Ox ?- m93|uӻvҪUzrr"F0Մ"(}ȻbOLqIb"x !m^鄧m۪O,Xp͘1 zRwy |, v`5KbY)>o<oCB|&yG}%Dkqm$z{>B-c=T@[@AjKAZo߻Im3HpJ`r< ֓o!VC4,:2a,<@bj':S+FK/^S3粑#guﮍ3teԔ 6Kb{IHʬ?\V]OR7"yD,=TťyqW1vrzIȬYMkp5KmjC[`1lEE3??K`i]3g^;6ÒOVX͒SRܒ <,!U,q x0Jƿjup x@=RWZu" F0 B{a lGGJrVg%D@=SbҵxzIze|% pQEa_;(n¥=ʆf F\#w&r9 v~y^TO" cgH|#r94'Exd,9^~-{LԪٿYE?p ~K++3O?qsdo_ED4X? ~D\ <'$V5ha ̃p܋<o߆髿OqN!)3^?EvC;h ⥺99Y=vq⋃q۟(6rС;wnأ–-#WWuZ4x"Dyp'pC=taL #H}okn25 )c n=܂t$~ʄ:&dڠR=.\@R8կ^}X%>qKؾ=\+ ?ɒ8^o{.>o ՉDMH-qU$z{^%a/ 5O=wƟ@je~l\⪦Nx{9A#?6 ?QEmڬ8I^_tY7S`~MF%brlrOnx?l"Q!6'SJB#`& F^B>G!fz#ͰYatD+Jfd+ VxCvCc4NxHo?ڳ5kzEeCNܹ]^^zZ߱ODsItDOy_SZ?0b_ACQ7x+'U 3Rwd~A.|ߏq yy a|hDoȃdcuȗH6IAsSܷVp ={>()ۆ ر>ҧos}^6&4Q׉:P"oXѱ^=T}xO㍯0O(rtx㍯8ҊHXBhȾx?" G5H)&@h $L/吋j+ x#FYDAxսG>}mZ74pd3/S\lJM[0TK톯tO~vXoaS٦~'?b(yhӍ?Ob5.̴8kTys td 9h$Z+ Z9mZlmMsَ7vXoZĦG0yÆۻw-5YzȆ,_N:imM'zـlmylԒ_/dvl`o0!Qp'?e拏I~_F&p  _'?;_&q8@Jaa7Fq1S^<"^QGô~q$M]F|N[b?a OohŅV;ulȿY,)ͣ&bH׮s饅o/SONc,Efl6 @# ]xm^_1o+ޮ3Ds%ȴ_$_i'D{e;ʖ[q b TV2ù&Jaò}"X,rӻC-?} .?W_]R<_SN!{t֪iS%mrYgfdaH3.kDR1抣D_'ّ|nYQ1pIFz喇<Ӣx^(~N+kDΓv"N'$6e/T$.ߒg#rU c"klyZ5?nAi4c*),AIFfGCõYgYSSfI'}9׉%C<kIs 0e qE7#'ďBU2q=Ɓ}f &` 3 E`^.ol jڴxYAϙEeS9لq-b=S<_^r!Du ),t=\-"OfL~_b<7b  9->L 2CLf%63;q8{}Xl]!GD̵bxyW2HhqO4j3FmMʆP ?7vB =7n\@+gm&9ᄫF.K.dV>vl{P,c,zI|%Xhr`"~'?k6 ϋgb\HWyL&p'0!t$jhOFp$s)7y)@,}n\<'a,Z޵ r:픙L២1c1N@g.s|+NV2AJOǎosΦd,>]~Mx>dOd3*ASc6\#qϦL9O%Қ߈eDQ%T9R1 V\Y`~8X"$ŸVm7$bN/$6dD~5.OX+R',vŕ\Be'XKc(KbMX)6S"G}P٦%`g|U/~z.~U͚e{Cꪒώ-ϞO&\Zr"bh+'{񒨂Z~OB16 ~WЁ[D?ynQM7bx?s&cGY$jَ]x*~/y"ߊ2C8.1Ti-VʻZ+S颯b4=~'x AoA׶mU l ;[m[Cc]CNz3ZD1h(('?kEt!LwUE'9xY<,8F]i"?Z:1}8I\.ng?2=$wo) "@#/rèUfv:HI7eHe(yJ#K)٠,B6eUr+:u:yȐ,sA6 BΞrL*DiKN1[UpFG2ԟ&O.(\Q5' q<ΊT;Mq)aIoZ,͞)LuLT=$xD\́Y޵iN2Ӌ, ie^:LgZљPS̞]8F-S>Uӧg;GdGٳy&*AVqrgg*_y+/+_{3FjRS!-fc[1r2:+3+(O~+׉D;y؋uњje}拇o 1dV~M؆ُc9g wbh?H+c8- ߰2ӔøWL(+-8wؔxLimF6_q[İ9ۑqO 9\DuSvy:+Ƨ"ɷ9؏53 Qx̌1N, Sp:G2Y$ZН!a"2G&UX#6&1&OOhޥg({pX-6=[D+ъyEU;vyUMoƌgO;mȑ#m]36o~FPRUʙgIt1r҂),_,CkffI('"W=xV'~@OQxilCxe8_?L$҅8qLJnA""dC'.2ӑxN4`e 2_b\-*3Hx -}{aN]ڴQ úwh}8qW4lK|9'b1Z9:U\-Z|gN123ɷ 1WDOXa2 xE<&(f 8LwO"Fpgp)3O<-/Dzl~oFDgZ1Xi'V5bq t">xJYF*-[>6qbܐ xdv_>tmU!}C뻘=۷W"}6'w fr2?}J ~<)~t#OV6Bp"RW\f"ԉ[MI /mmVd$.O::?!1iRLA(3øI|%a{x]L2#\1V<*Q%϶MVj" &t?=1-X1m'm9GlIEj͕Wf(?>bU_|Dyh%_'#)=,_!z*V˩T_%fR~f,4qǰ/;ЉDgWF1sJyI,+Ig/߈qRaZ2O(J}O+'J/a{}1<)4jo4jkj5g3y'޶u듇 „lUpי3_41c8},qC=ɓNھm[%29_%'-V/-<{lp6"LY;ߚ¦уy'qDRC'c9i,O-}&?{Ĺ ӏQ*VW[\L'8\#z)B/o8Y%@4zugoʨuъCDգG6mX}ʷq{:aݲM>ֹ(Z~JQ>rR$_^H{mmBogVyET0?&(6as S5w\}&2%`;#Gbc+JYq ;+39*8Bq6\-yJP2Y.~+Z*=ZclRԲ6oܸ.<9&ٳkO YM(9lٕDaVLaK&L&L?&L4Dߓ(X+D>?˹\4(F31Q2J~9]UIjؙS DlN,v1ef8hPB}ԉ,gŗ4Z5mz1l5KX!/{t6_;19ꮼSOӧeӦJ'~,첣 S_!VY'沭ēTSr'>&C1OY,CB1LEORjٖAϱtqŻb)$R<..lˡ\)&U'qTf0MOm?ŭb2ЌyMlf/JD]i _l̈́r;.w{췗]1{v`C͆Y FePz:,+D/oTԿ'_.XwDr1\Ns`@Pm9Ӹ#Vo[){pw~9ϊREن3Ocn?)tT:s|˻K-5rQ4.{>kVlKK&[zpg9QeG6sǞy`?Ǘ\m]DZ0Kԉw#'-RQ52qMLp2_~t?[";OUxIT*'ԖAKz;c\-n*բ)؇V*LwX![^Eٔ$fAL X-syI&nQ,Gyf7%s4KĢwn:{?_6ڴQom|N;>v업kVű+81{x![(%eُ63QmcǶiL‚ǎ3Z9Dwy"_<]@⊟Ek99EO?H ]ؙdf[yP2O~WĵK%{sSQ(E-@Bٛ[׍zZ-)5e*o#))֊y8dIΘma#`veʾp酏]TǑ~̶ȶӿn6TNP"NԱ~\lVN󒨦=C;kO~ z$3~bbC-t7L߉Jşy#QeFqxZC,!_$b2CinuF4X(JF<.Rth qݔvEJf4L4f7w&O6̶PϴnwQG}>u"IGu͇#(=PMJ1CcLlf<}_"?$_63O~ {I7R'inʡE\#O5"_S* ӞQ\&+Q))䫜[-hN2ПX&ʹ*kw_m/YictH>t < ^s|6ѵm[Oߎ>o'\0R%U"c Sh.'gVsh-cXDyىt|k 27NH'3q"!-\,?_%bk'xWa'[,>5;rh ^/Σ2Е|!b1V[d4 _\|qeGw^{I?搽P7vX*W&Dzx1md'"zN,=yPG7omGY%78Ob9bh'g.`oZ0=EV->3]̫bKiop$5P$VQ?DgQ%d8OiDL9͙xَO8i={oաYÆ=qߌ19 9+  ̥NTSX&MeSmFmĢ$?ɿO=x^='?_.׈tWaZ/آ_Вq<&Vo!?@~|QdXYR٣}W<1]pu:_YƁ}C}[FS/z 9iTe(Qot|S?_LFNx'Nfw09[xSaKoĭ-~>@G.cQ߬4a=Ʊ;j-eeUI'^}:vTtkC=ᄺ+R3ߩXLVNƳ*^ GxSA-\qN-L)?jLt?ORWq8mT QCCsefGb D);2W, hDN-U-6m-wiGM~َl_}{f̘llY!٢_tNcދY/Q254LMOG9$c6O~_g?9ٞۨ>O~_'Vq ;*I-rUVYtRf<[P(yB4|y?(Ή|C?/z(ݶ߾j2 י3:F6ڴ9er2DǑ/aq1Vٞ#)Db̴bO:7K1$)w 3̩Dm֬gSo=wءUӦꙚlYG3yrs6w(`2}arҎYbUK(Dǿb&IЈ\(`h+'DzHl'x@_9{KQee[|8moſi򎥐,Y} V۴jOFUd3)ϝvEcm[8x߱ɓNھm[%2o/'Lb1U-L&B]Ugo뾿ᶙeT7\R3ɯzCq/3*Loq/Ux@M3ef-~b4(]m|(ꩼK6Lcٞ;aJct~K/,nm_ǣ>jР6͚뒊|aWnJX~+\Nư^0gEU1^~&ַ,XwO~v:3ɯ&xV(0m؟)'EAhPva2b{h4N2+8 kΜW<ҵD4&סi,X׊cSVTi#||}?,[-4Hh=ZLm&t/D0BxAC:>Sbi7v{2}[lւITt(!Sh> ph%m4s ۄW u7?,zj7dy7?}G->=nxk>^Ik5tYhA-Zo뿭ZUB}UpB) C?Nҡn]JI}xH&̃(!?5x*܏Qןp zn>E Y*Lěo*S,xrDJSX | nU5W_=ի{S+"QJFDH#!(/}A^o/V|aooǨ-PcWT Lk N: 4zBP1==us2\Awu.kբ4P(QǍ^K. [}eEaqo~mh8gX|̯ J|?GӠ 1MifMɿ? e/ڷ/g4#u^/dbt`S(PQ|?43( \>_ѳ6 )I t,ʆBW>W h; h:Ac-32m5dOvnv6yr)% = P.J+=wH?.6!['dIaj#1GqF"t%TgpX[I'y_RD\@|z &C |j ׶kȰaMߡM#5v={z&nGRN8×3^h [Ob#|C*tY#1`Q;<6 NL) 3OTo#></ ߨy]uƌWߢ?~6ĉ VԂ <(QϗCv3Jd .6 [o'\-cQ? xdFhLS/Q.<^ ) PTSG/M'R8x*t@3h 47gfС#F>s^?Mr?vJ)Ix#G ukϡZx? z|M4X?>HhT0A}1p4ʄQAgVoB9KT=B5kvt|;`̧{O X #5a:,O^{'3m`<<ߢ|aB/ԁ`'*{0T(+06&qW:uz=OxĽDx$qḦ́TJv8 > O9<:|o@H{X,ϲ@24 35*}"5?n4*Kkx7!ʛ{OhT7T|s^9s\bp8H nI 9(/􀯓f}RFs= 7hG]`yO[#'nnTMZ?8bD9($FO@|؁V2QJ1]< {uGA/\8MbE_ <AW*HOA}l4J|鐎`*|}`ԇka%چNBypK;؏]ĎuE6R42UogAQp3@ɶ>\ړ(DߢUd7_0^+} <.;`!|ͷyh+ZCѨZݺ4r~ i7o- Ua:G- %~5.[ͧ0l QB替u#mcdy&7z̀ i!(cqtS~tDoiR9g@h !hR_5Ђ狿W^fӉ>pD }4@&“h*AO‡htjԸGso:bPٳ/k҄?C<U !%RC^ѢE ?$oLH pBg]A;OPͷ'?up,P0*`315kNѣ.\?81k2RS>a=J}(.EO;RGoohYdy?` ʂZLMȂ`=: cМRSFxCCkJ͇T}|E!PXG u'jպWnآE̘҆ѭAO]xog\8jaxl}3"7(~Eד7ͨi!3@~B=?Inp'~1RV# Q6*/aG)C=\E^ !PhD?zMIڵ[n9yE+!,VZ2xpZJ Q& = 5`؍os~!T]T' ~Bg{0B|!\3t O&R:?_,"Ҵ_{ Jy,/T{94'mԹOwnj9xq#PiYLP.g4@bϷoPO^Fv>-d\w $# }? /]pY硯Ch4g2/̀y" 62F,-z{P Eeu#`-ghh[wj߾{6uލ/+W?E"(Q4R:1G`PX|"\LR|C Cg:}>n6oEi.ʫ?o#JbD~C\@=ezt֡~ұ^]ѸqK[K E~(s"25T/ox-.@^EnCR$7+GZ }Vu `!@yMD۟yD~I 7EtQ]aJXYA@pt_2~|^h\֣o}e*8=P_7W_P!QfP]<2~˳|yttTD&SG(@A\ L=Mp M`\XYg eA|CR f~„K⧓'7^h wxa< d>>5_¤Z@wAdyz'h1j3a(,Aq.RhNNB7ş(>E[Rõ&T!@K C&!{Æsbĉ˖]j~=2Y~>NE![̧KYt|Ϳ݀GZ,H|zL:eD5 h-@h 0/KC8yE52.o|:,p?bFԳQs%7Oth8ŇUM:zH*";_J߈W-Oa{a76GZ{zͅPi7Z9:F |F"E~Ӓ67 hexCv?6|in:nxtB4 O@>J㛋VLp)o+4}!|g"o~!zA=<Ϡ/h4g2r o(}QTLԀW~nE'C1yȀ^0^C9yp+zMa<<PAp4$fAH!Ȅp%mBKX|i>|y=FH3| 4{&lyWTL+ oYj>F9pYJl(6䠆pA3[q Jeau[|+墠iq ]HFC$݇LΠQx Ysᯇ?5|p# kP.$p>'a ZF@=| !::C!+˿.vouȄ0C4xG*^Ȃ|4&\\ ."7Ϡ;i ɧegR3(c~=.5&AcA::Ыh2$id8^;PW@GEdyO=Ӣ2#7,#;|`3ua,Mv>F P:$N|,idG CSOoM/*t%: (5i0N@9q<<'|sPo@!/mh'ZBk|&zxb{h6 p "Vĥ xJFCPY*: uDg-?I;$Cϣxʽ?߂i>ap io'?*W?޽6 W@E| p D/d@\Xda5.@W+\d#ϡ/-zF_ց X@ch$%dq. YRg4~o^QO<B4E7B|\m|O IPӖVGdp1 j no==D%C',Hn\/iA/QC<vXw2=!i`Dg替>Ѥ1VÅVDoPxb_0[\l>/L_:q4څ?O `'ZBUʍGɐ[!^; 7,.Aw,-oh!d$EaZA|\ad'|ʛpD^"Ηxŏs3-CͰyh%*L Q2+/TP>Ai>pr|\|7?#U`:ޟ| =nNBg Ϣ]OGK$RFCJ|N^ x Ysr7/P/< @s>@ `0TgXOPW;ޟ1n %vPw{T^1/eRL7(44ڌQ jf?O"|q^_^D H?؉CߠGhT0^C9ȗ,'bj0XDyP}!~nxn>tw(1z[֡+y}s ^CI4/Te(žO`y3aZt|7$Zp`_$D3rgM ڎ@l7߱PuGQi PbqC:<5:[m:\kaE`:agP/ ?_7YS%?m|ρ[H%XKag*ljq y~k"b* |(1?ve"؀_o#^h !_V\<,OqO8^ooG v0Gߡ|W$} ,r?Hilt|脋:=C 1h^Hp,OpYS,KeԈ&d}h=:8>Nb!^{|߃ :X(y$=p%qG3"otW(ײ t J;^?@ &#7v\< %zhoԗX }a:B8>Nb<3k4=^C+tl~xY[-uk'WQ} v"3>;p0<'v_T*jLn+/Oq}xqQ)%~R _BpBezAev#;^E4wAx< xYs+[ w7|h DaQi>N<w'4?'Q⚹y>q%Joi-AWZZXwx - 01.\<,O q7=PR I=: I8>Nb<7pѯ4ُ:L運/Q NY6(7} /tϐn\<۟+9W_7Ԃm@GQ2i>N<w..,e53!|z -_Y)&ڋ8sеx2A`yſ#?zKqoq,O\M{p}| Oـ.'~O/\||40zf_ցg.0Vx:؃,`b-<ͧ ?ĕo.dyB/QP{q}v7 >J|q775?C56\u^oFB 1b <ͧXT|#*dƏo򌥟 Q?H"xh0K%c-Pҡ4C )u. ڝ73 M AEJo\| v_*e*@X*<cBXQ@1*.V#|.!.7|;b'؆- dyOoW{0|M򌥏w4.Rg|B wb Ϗ`Q1y.Q"cL\,Ga zoq򌥏 w;QpfT.7?eRL7^T5't^OYX,O/p[o~8 xNɬC1݃mbx7?}D7B}/p /TYH|̟%`y V7oŋ(nP#HF"9:[?i>(\%H*xfNoCĉ͇:*`?$Fpx|N `,8$^y( p,O)-6-7Z%Ḟ'_ƛ@0A;ߏ".M@|7WxMoP(i qYs?aNj?+Pǻ#L[q{8xOh!L/{%UGMdŜ%+`ƜsfP1(&ssN  V~^ow]=G nB{3*?OVڏ}Уp6mA_V2t"M=mٿE OT0ʖo~JZ~@'jB~?QR2C=-n)]0P')JoWz[~pX["')O/Cܧ} Vo~~0!g΂&'J!~梓`0 4=.ES`z9 G_ݠkoDЌr"Z hNRC~u9">S6?L/%"к:f!`i:ϡ{DiN0Q LSAjߓO"گm+t~[!~~GӠ"E>SrI!߾}!œhߢmi É0}kЛ*4dl D%J -} xl?k1:kf*}R Z֡欿 -,mN9 e7u=iJD }'c5O'Z2"\x-Ey&a!J_?Q>0΄PJe0= sP5?ط %A'`SX_~[nŸCJ}~&z,'iܿ;jվ} œ bT8GMγΥZA{DiCgD(\ob< `~_b,Eӈ]a"\uhrR@S8~Cط5">u/_|F9{P=nCkPKz$Fdh!:Np:܇>G,kYby"c~<QT_6"/)ֵo~q0CGug?XR3ʌ'J 듄!p8LG*TYGBmh~}2˳u_v[xiTVo}O0J} ?Tq"qnH9o0|\(O&O/\E"AkS4(c>" 0uWur^D+!0@3B~O_s6OUr۷f?(fOQwb(<3U>Qr?y\1ڏtQ+~kJDP_ðo\aycVoJi~Auw֘0{B@6yVBWs T>Qr(e~`7Ё AԴO/C 3,DgЎ+{?LQk 0gOp8'_` ,E+ga&@I Tח}O S-CǾ[aNiY| Ps6B8bb "䟋s"y%D}AHo8 >{81ܾ0Ch}f4QACy۟I}6+B-IrD E? 5"J ShpZNp<֠l{DAC__C9B$Ip?Z Ob,K9}"Li"MEC=HFf#=k0G@-QrO~鿏Ά4_B?"o~RGCh}`8F_SqАjoCOJPȒEM=IH/0!c"JW!t[pSt+:v t^wa_EQ"(rϪͻ(0>C'1Tط4>eC?GF5۟z5_Ϳu!vPcE|/F oh1}_QM9۷_ OjC`&1~BoJC@ig!ƑK~ 0|/Dj켈oE0~?w"ozD!> hZ!o?>h8ܧ}JVJyh:L2: e~=1PO H{Xj켈ogڏ.T_s!'s6z6j@iӛ?T˾ٕ >p'҇~?]H̎)8NX 9ߌ ΋( 8گ&)wB۷1.Gɕ0F?}Jۿ*ܧ}\j޷߈AIF'5N_Q^?Dj(oq گnР"o\b\BS:X V/1T˾;+ ܧ},FY_YmKbvP6WfN/#g΋(CPݯ1@EoĘ2dȐ={Ց-`WQsG!o.Dc}'| v|Хw O%(c2j򼈒c^ߣֻ_xbFEoq O1qva-իW}}=R;9 %z^]i>7DR$1;j~_y%!l z# ĸ9}.Z(˘4iҎ;8t>}k׎l byٷ4 >%FdD-נsdt^~9%\DPMQr"1ۯt>4hpEFPhDN;4|}oߞLHOACeD}v+ '1{RF$b,@5y^DlDGP͸+<ꩊې,ob<'4Dˈ#סCR#i?JۿHpS"4ðo5:D2z#ME("ʗ(sa:r~3 $:zs+rEO!(>Q&7]wuȑ ر#-J~V4x^ߋsOݎ\%}]$`XZ0m6>*TO&ϋ(o78RoJ_@göPGg} O-n6zvԉf-J۟s8OoPa D'T;5} ´Z=zb܋" +z MK>\3w%(>Q&4{ǖ[nw҅&M JۿO`Qz¾&$85?]>0=Vϫ+1.,E=1Q'J3= RT~ߞoBh}LNcnVni׮]lJQe0˾h3Fc<1Cf(~Kc[@&rdjN4!eh:ƀHQo+bJ< qƍ[4[nDI b|R=/!~'žJ ?59x/b ~p))aT(FF6;QaKf#Z((Iٌ_4˾ʃi/2t ^BMcb,@Hh}+T~CTY>o =NɿQosb|AC~*7yٷ">SY+KbNU%$CyT 1A:4W #LN&IcG:FR"7b,F%~|KۗݸW䋔 1[}&%y9h}>s9r@XR248ex~< lKPo1~ #{ذa;I 9hʃ˾ai ?5IW'$.}VE![a*׿Q9(.Cz Sx -Am@Sa8Yvi_ ƍP>JPh}}5j!Q? i}#~kk ڋČju<1fQcb u8>`e:%Fefܿ=4YhotI0i; *jI}j|''0ܹ&l2f̘qC_ھ4aWFT>h,'%oi,ԍdϸ?3Qc(Z4*oDQS;u2ӠݏN-r.\Ϣ(1n@߾FD4ݻom݄ 4$g b|}air;~ٷd4l #N#t}^s%'Ah٨*=aYvyT}s+ ۿ}Qy,-D]]]^N;5DIPb|R=/ >} FoԙdtPrO#( 糈0D? 騙3#U1@M7^t &k:npIp!Q`~9"L7O k׮_~#Gm4$g1>Fi} >Ec7BbvO,#U(rT> Ɨ(PWe 5!@k_/_9<p z nlb\ {^"2;vx㍷jcǶܠ!A?ÉJ_O܈"ko:t-H2: Ԉ߯q >]T>d;hgvp(<@]FR ݍAy eeZpTo[DY3ѵkAm6:%i?É!Jfop 5F%}-%1}n@8qxa&Lb:î0@3Vt:'".t$lBtpz{nACA˾aCdetud=z 2dv(Q3Ҡ!o1D)>X}-E$ F׵0@&WyAa j?st':6&k:x֠ {1F=/?DU+ZNdG}}}>}.T3hHb|R=/G ܧ}yJ5[mIb&w}ވsd:">P>G"aעɍp{79dMWq?*To0c /Fw#?ѡC%i?# {?'JS.ط$;܋x3aN/@DEs21AYsԓ৿2t;: 5]a\^(~'ƕ~o D)ЍI1C}O"Li3E`~ h86,D! *>ʷ0cye8k |nC@ ע7ZT~.$kK0AKY^C]4ʃ˾a&Oc?цطj}ޅs d5!>B}j<`3e4܊V6~!܊~dMw Go\HˡkĘiYO3a4XR=/テ>B4g㿂gp%P.}Eq(`pZQp)uCt :5pz+|oߟv}X؄I+bz^?]i>X1 W>@9rɿ/rdbtPyLs;ї?C[ЁЛ?>/&e@2ϧh&z T4z^?3ܧ}÷p<޾Ѧ$XH Q!>AD6Q-aK s7?4 ?c/܄E y 1.EoJ%:I4hHҠ}ڧ|D7[o?{7t4Oc0{A.GT(>?C]1Qy:t& F4}֠zoD'YhjD5%ĸ ߾;aBϢsa"iJۏƁOo?/I4LMn 2 _Q6}.E Aٟ. =Țp@u oLDPC$LSHgJTks0c}ڧw/CH xp?#yߕ8Qyh/Bfo@ްYK 5KLCa۷"P_C$ͳ 1ކTk >=uG}H d? yQ <AVn?n@S;Y["EP_s."t= tmJu;O4^ 1[kyf;1NT,R9 q8 R~z ]ndM?8nE0Ba۷_8j")1D׾a7p)ZE|DQ߾{PQ*TKf EDue|2@j~AokdJC61yU46}Jz-Dpo_yАb~_Fܧ}Jǵ ۷EbF;fyf@B-Gtt2;J_^GנIЅ, y]|(l~zT]AIߞT۷4> D/(olԍdåT|+ԑ _&/: :Qcaj~^GW ЙG3J <(l~O! ԖفoTطJAOh Rӷok4ČQkKD !Pƒh1f#l؂L(~^AWЉ;Uu6}'cjHPyۯ|'ri }ס3hנzf䞿B óh1Z6|h ΅Wj c)w/P+޷?sP[g'bRc0;OÌ+/9څV0}@i:A͢+Sg$/]:0Cnaz@A?ș  k%z]vc9 s(i~MPK SyАjテ}'t_i~v$f7fDN􂻑_/8\x.ݠY3{ѷ(ڏ΂o21@m]2J5}o l>D& - ']`jE] @tK`9ÅEKÅ!pEߡkDiP%s-+1^BoMD}'n/[mEb&Uw-"hDɂp.9;z];C{f((~ gBQ۷_mʃTط"̶>/|'*[GhAA=i-܅V6_ANЎW?oD9 ߾m6jFQyҠ}':P2m4L%HE>HK2B =΃.{T~ Ca۷?xǾwaiMW3A$'@9 ߾N4pDg<1Ao"hp =&}5?a9*Baa< -CԿaNo? wQ3OTط"(pznQ_.ط_K03^@EE?Gi0m,xj Lbo%"É0}Zu?* Rc0#}'>n~>$tXr̿ 1A!t*"k`;8Gп0bo9"eFi?HPyfOcK۷_3^Cy߁|=z #Țz΅'r+"IP/Cd`[8F+Pg1Dio}ڧwԵ߾{Q!8VBQ}_@Sa8Yvs)4oN+D[۟zRϟ#i䱿E'P= |^x(f~AȔ7LGS^x ǾaO_9߾o83CBe-N!dM.gJoCy3Tط ">a&a,dVQ6۷݌:p Zο?1B7t< c\C+~lD㠘f_h:6!S6`e^xT˾O+Bݧ}"_Դcas#JԴ߁s,2}o5Yt+:)[I Z'J-%۰oZt=H2:tԀR1 oW.t c\^BPk~|p 3}!Œ*_)2NGѯ(~&yٷ4l>%.`߾v$fW8bF>߸ 5`,\^FQ׾ʃBoD1tMtȎ:΃g逸٧Ҡ!oJiueWOطo ']VyN"L*@B/ _B9߾7a欿.=vK+h5jN?yٷ_v>eFك}Hx`S16|o6:1\WWj~ۏboUDBg6PGvtIp-z54hHҠ}g]Z:+F@=ws&1Gm>E0jeߏ}sabo%D]!<4Al¿(?6yٷ4l >cР"[)5?Ϲĸ BB+Lkh ʵ+߾aBy9(JTokDM}IPr#1}KUhdyy.B?B3!Џ{MA9߾a&@yAw#`)Aߕ}ab۟[iPGGFl[j?3ܧ}֕ԯ+dDa߾*Ц$H%s"Ъl@ ?"kz>p#uk[4 oC0CAoPw ɟy(ڷ4i?En#Y>o~U8DB(Q#œ .dMOn+C~C9߾a_GЎ|_SG~>PD`d}@I UVDUـ}Y El6yZ1۷oG`kPTkb4OT\2H۷ogtϣj֟s,t'Bo8fk@~>ۯ=?>h8߾;aVߟdN܇Rݯ}KaIX"2H۷oԇĜ+P|90G@i@oFdM8nF ??׼ "́P^iު݋A½(ܧ}J۷: WQdeͽ5-tɚ~p0D ??ےo򠡘۟s~fà?-ƽ)cRD>S>۟z ٰ*0Mxw\E{B< mCgW|s(f~gTq ==hH5}?"iŧo1ڋČQj az]&CW?oW3,f~oD9j70 ]H=( =}ڧ|8`%طo;P7QjDw5z]&Bf Oo o0ӠWhHUAo'D>Mʼ|߾}_q$f ,BV{fhP*MdpF!?ۏ#+a΅9.ĸǾa6i`E[ܷ߀nFIF{ E{ fghr4:5‘p'c~#0_L2D s1BoYAOĈ\-۷os >B+K24:5h}߾}aYLEĸ~&Ɲ)c~|ܧ}O|7Pw=H2:™D/KK1p75{~#}0~ڶmk۶m۶mۘ"?y={LMRL%5SuOQ}ng=R9hx?{GGP9>^DC; x>gS`MY 6$(`cH\E*uwǚj)ęHړ;dFQu}VC}[A* goRg6O=nnn5%V YϠ/)DFRuV;&(ζ`En!K6S~ցO+rd ˽LW'-f) ĉP v{쳞^ \A4}Hק c>uk}2^_Xn p q=1}G g=~_ROFqF}$z}W 7+Ap#Q>zV^_W~ruA}I'w2^_Xe%8&~"az1lYORhx?UG@PQ`zIW8pCLԼO^8AqI* R 3SO~Q1LX*Bؿ^E lYOߕT&kx?DGGDP`o|d=^GK*Jؿ^ߥIlYO߉T#ρŹ(N SO~&K ӞGDaz0Af`HAD*w~2Aq2O=Ei3޿{a&p$ʳD9T.X?z}ɋV?7xg^_+M0-XGv!(`zIJ*w~*q2}wڔElj?4ا~Ryhx? GGlKL#?qOM,z^8} ׉s\~e( >E"?[^gHeCO}=*6~'׏^1'%L"SO+9Z0z*Rn#'S_7O4I6_HM .#Q>ᙡ]Ώ(z^ߋAeM8#&_T>&ϑr,׏'D慧 _q}nz^W\Np%9aCKg_G֏^5:% |Ag_M?S^z}1Yq}VWD9TΟ~)]> ewDAz}T1\B|J[~vRG4c sv~\o7(>iO/[^W:Áp? aI/K*gGX;19 9דGg[^(l goS|Jy}T& xR9|?ĉhO =3?$-^zřFQEo/`|O*gP"k}(z^8_A4eU8&>_>O 3[?$DփS_ʓ!^7 _W;\TѰ\J|B|y"NފabNJaaECwz^AqV2,q<AYWAqƂ}D*zD0ش2>g{>^A7baHk緙723'Ir*ϻ{P"3}δSҷz^8@EKl "sp5(Aq=ĿREևӈWɄ'YdE'A@l@,F'O.^ugy|!;FSE=zKХ>n<=YщDѿQrȻ^;wz^!Y<#drTHxEjghl?ۈє0϶{=cz^?$҃:oȮ&v"`+p߿IP>ӃBO[ ד޹b*Yx^gYBH @FY\?g-3IhZ?bkJdQxy=ӡl[rwuz^Yjuw{bTueb8}8hT?e) {>;;ye^ACm=bKCv#% \?C%(Ά`g'+:ӏ!bJd/Hfz Fnɺz^gx Tpx~OghH?s`WSU^AR][k`(. #\oU%9y??vDg WZ+^$tLLB -ȂAH:"(6`&+: w?/U)U >Uzr"[z^kӃ%`<߈}ũ""1 ?Aqvo=\[z^Oqپ8e-8'H>M{zp ǫE r@bߟ8{w%yky-ٲ(+Qa1Jb '^333;Y,Yt;K=K=zg©}vUFsGvWa U+Bu>4 7/ ;Ȁԯ3wis]Ca?]z~HS,G\ILOy%dZtU:'pݯaiWã~3uz^t4:ar?EL>/&7MdT ~4Ct+ɋhb?)-!z^PAK7)E GÇ_ȓd%]~%:a_H&!z=[I,(z^:/>ԣ_Eq>9^Er|$(.?$_)կ#Av ߍz~0\A r8B?2)'Sۯ4 xbd/!zo/*} caz^U+jWp   K`@ 2b?|jkhҙ!z^+ B_ȇ#x |D `P_o4 l?4`#CO& z^_NQ?h,O 28u=q;hio~Sǥez^/'Tg. l$')rLm>LΟ緄|~2w b?)!*؀{^+P/ɑ0~d'8~J!Sr.%qwi~ua z^ szr5?Z"Cq{Bu>S| IXG{=k:叆z^_E%gn#x3|b#i~.(ȷkb?SFYz~  wlqF]'?)A5~꧍ǕDrz^ׯ!TgG̯&aOp)YK&~\D 2$ GO'\bX^9hؕ~dG8~L&Y˥'Bu> SX B~꧙YbX^94x}Br EQlCo.W LUM[t??`tz^9soc~5r=F2D]?h{i]"b?ճ즲+z^'Tgϙo''#8XE1n.&>߿s='i^b?S^P?z~:;5"7fLP G=YH)~z{z^ׯ'TS??B~C0YB&RV יVd6 %H~{&v.3,^zzBmNKZ 7k(E&RϾ+:>ԣ_O>O'sx=ݣhSz^H@{$e_JN>/eS22z.P /%A~gzS ^ktͰx^ z:OV=#Ͳ&X+} ֣U4[2S.DIw^!lk§_d5_K.!}PF&xEab A{%; udS.z^?$l8 ~M[Gq0\?uy7hh& „3 ~Cff?zz=}Ӳ{Fzy&5i?dH*YL?t]cwz^?C@y!;YJ֯@]Q7G|."S=]z^\Jq vӁ=OC]6y.Ea; 4pz$ҙez^|:=s }@N`s 9)vA~[z,/~Y3-^ ~G &3 F<|}l+dz?7iLՈiz^ׯ'W^;vb(N0p}z9„3Aa?zƈtK?0c^ȏ;afD.&kL~:ˆ$TPhz}sA^WyJ373z^_NA>Bn;?KAu^#~kAy;.z^=ir ̥̃R2Ftw=F^GmGSt;z^<<xo{)?k yY?hx'߶ב Gr=zz'w$zNz^&%of,\N'Մo4owd6 r*l$Y^;~(/TL/z^Kə0v+L/'T0 o:„3΢zz=c+z^ד`/Mr;~~;q=CAn#U^uFWvx^ɏ;afD.&k(9F fxnx xLb=z-`j^zrX@GǟOAuc?$T0sC֣=u(z^o ג"Th1*Bu3? g6Q^^z^?L~Nٴ)'YEsω3?4K:R=z<^3^z~9fG8~I!U Bu>#~^3af>oh^Oz^Co zzlO?a2gM0s y aXCZ_׳޸u)z^"o0v>gP| F~0sCR0=҇z=_(z^^\@q<,̂wOOPOKb YC!d\JS^g˷ FJ+;lzx^[7!}Kz3BuN #|-:oiߟGk}ozs(/tz^O?c`.f|$Kߪ:q?_G`zZbHXAz=ӈOz^_K.%i7x;C|F߄q~Gf F>ׯ)P\Gz^3IGYf#Oi/RoPoלF̆ߓA_ӥcg]z^u_i=gɈtHAu^ ~i:2 zw%=z^Z9fn'|L~LΏsHA0{/هy=H̃Ku?z=c+z^'h7ŀdĻh~nϾp?颞hS^z~m on/z_ȈtFAuk(XA1KӫWO)z^10v3>%ϑϱ0m~4D29l z=X4f\1z^kɥ3;oɔ(rfw0<9&Cz=S=z^IG YrybJ0r>1 ~&oA^ay^zCşMz^/%gy]8'u ^d Nxb^g/{ y B |z==fxx^zCY(z.wPW”kh~2m^jQz^Ʌ",x7ܿ"_E]%#u?:9Vz=TN銝z^Q|BWSNQɈy=@a E|Lݓkz^gXK3KˣyԿxd8LE)-z^ \Jq ٝd#AACKSZVP^z~;w[C )"Tezn"hwód?/^Oy٦)_Qz^AS#)~s&ى,YG%z^_Gf !G ڮn '3gztz]J {^z~=ŵT8ZL?FKz. si2^{եņ{^z!sr0̦,Od%g / M~LfT|IQw[Ud> r 3y?z6 Ř3Lz^oկ"eYn1b4Lb=$; _'g^O]QcE߼^z^+&Y _)֑S&SM g^-ņz^zS ǒy8Kή _Jq0 RzV=)K+Lz^?ŏȻ`fդPwQI,'MWyƜ*+< z^!(N>Bn8E{xF'K|Pz}򥈊Bz^R\K8Z*LֿѰ L$aOM׏K,]tz^a6f!,s 2)/:;DG.'x^OWtztKz^<%d!f6?'SlO ՙ!hA ^g7&iz^(J^C9N(֓v̧A3qcLgz^?F~C9QrR2WRjgd&7H~z=hKZ֥z^xXD)_IΎ]C s< zʋ߯(z^4 &Y _:r=)l(y Imz-]z^3?Er,K3ȳdU~0Ki^g 6}+Cz^ׯBvt=rjBufH|#^g̩Ģt\z^zN=Vn^E]v15?H3~v^SQ=fVz^kL؁ n ^gK]5ҁ^z^ϓ+>/l*&xLVzu];iz^z}G]0vS@U=K,!k$ޯ^׳2NՔBz^o_JN>BJUG.wI_^{4VW,(z^uZSLrjypElrtY^z^?i!a6zn Abz}K ?})g^z^oɯ R,! ϩzzP|Bz^׷o 8֯Ez^zc&G&uSX^3fPE^z^ׯd zL#*z^zVMFcb zz+֗Gz^z$ǒ!SX^K;`Vz^kȥ?v 5o ȜǶ{&V`fY?l}z?WSx~7=0]b];ZZ6}O}O< Yy>pK'eJ->ϩ<ϧ9A><'큨><Qڻwvyy> Yy> Qܥ|}h(J߱cwu,Yxyl4g$D!ϳ/҉8vnG?VzyyO <7cu{tpK9Q@wt;-n=<<ϧzl<ěq" E[F1y Sl4gdRO*ry )&V=<<_L l<7 +O7 EM<1C=<<_8jA>y'([|b⪫n4K.U?<<ħ8A><'GQ+FFK2x(yS ŻNg$> ޮȿgO>~yysu7|{wg& bĦ'9s6s׬M=u͚--[Wڿ4<<<|R~U9YhL^Y_ly2}6u,Y]yyy$D4˿燲h4d'.\dyyy@4~8+Nhl{ĞsOFyyy>"kgtbJwƬu7X*d<<<'UmKhǿoz Xw'#<<< F, '|5l yyyOڎ%jY6M, '|7Tcs穟=<<|t1pwA=5|[RDdyyy(@L^`F <@1q'<<<h5HyY,85 W϶m{=*>CGOA209!HLU '5kP$f}71 p:Kk >"+r'Ӗz?@ D>[ՆRX´jL5s}jv#ㅤ!h '+J  -[T6:=\AbP Η7mHݴV}'Ms+ko`6޸ `mX惑(`iS ]i;Xffff23333[fnW̌14W߉H+N6h4 V v3#l㼍ښ6q9$,p1oz*x[VPKWffoۖzָF (C+xGC/GcpBK ϯG-w: WdoV'>uHI1AR&M<Z:țc'ļ1"q` H' 78QD>7ƭN)(#?LcB۲>$ZS?L߱Z@y@FgxׯfwS9K&0k"ަmOȅt-H"kW^q=b%oTԃ7[ÕB 0CAY/#YUTRsmjo(C~xo Հd [駄+BzN|~sgξ g82q?o-PSUP E>Fdtsez:?5Ǎ5N|l L"駃ZC(8B_Z&j+lZgƱax|phvEI|0}4|;S>*nG 7#G7 f|J<0E[$sQ^/f EyA?Q#`z #\Q):!4akk:wrZĉnڄ &=~-GWHCB$~PkM8Ƀ{x;3}BuW^i^pff$Ν67ҰQ޶maq *S_xrD3>TA:N]|fK9lI o-5!+19N^!(tCe&ì=v82%ޕ^z&?H_za$K1@EBeepH ?3}& qE5/ES-Srʩ(a{]OFӐ>UEs35,9oTa/}Tn/Ҍf|JI AORMR /+xN ] W~͵:2u?ƛHqd"?.r.ءyϽMGDK,d?t>T>TGu?HkĈ.};1\'<ݰ F6 ~DGn/']F3>T 1KbKWs o-5-TX" S| pXՃax?~8A%ǬǟfGGtMiSCxl <,FKشsΣd<3*L#T~>RfE\n5:p#frpiң&L27iuF3>=9-[~DC+xK]S+Q < כȣ ]2> ֘8ڻPHV]ǟri#zUJBhX00Ӈ:A{L, 96ylW%E}QcL/t=d5w!$n>h&CO< i7p<Es07CGn"~g40CAN/,w#o(C~xo <]pEpuCh&neL "TUC&cHD1 XL2Ї(rAxY_%Km1БF_H|C tc:aHfnbFq3 ܤ_ x)T,C ޥ)7W:6\ 3`zwQ:IS:A{3aPe40ֶ]TG};[gOF \bg]]n}KkC|c9f=58e*&n7R E?)7Ir~!,>'?p;wj %D@"W Qk }'6!<0{F+]Æ;~[#1蛪f>y@F<885- ڴtY6*ٴ\9STzo&U$XtCbK'!AiҌ o-ZXhuLdW< sWoC'>tCwD~G&'MA> JS0P|f̤@Sh*LOҺ\Z_0Na=eoP_T1IOΒ%s '_&SbdR.=7Ia 8QcHߐ^[B!5 ]Hh0w03C:>}g;21ѥ of-xgҌYnHy9ϬN蔇s%|XBt]1V|I~?߈FzM#t b~іNCtX|{iƭ7!?2B"8VW~xϩtf֧UfdLJTI+V #~_}M9xȧ{ݜPYfυ}ûnڥ]xQ]ڤ[׈If]~o$D:<))757)P{" o-5AHW]LJȔ8eJCy=v[ӪbL=3&Vdu D3odiMxyl#ѺS>7!~ ߽4r|0:J5ڤ)72/ڌhƐa7W \!?S:azɧ〝H?>$fݬNuHL ^s^X~M)+٣v7:ޥ[℉瞟q]h$ |嗙އ]\8M;sŕYO<ւ ?Eք 'J;8)yW3>N<KhEr2ƹKzP,*B!$SR2MEx#WqS*n|* 2 T>"LQ#S;W2>0*| .r nkզ&= >G|Wl! ޽9>G9" dfQnEO I!d_d~~78ڢɳ._εbK/ 7!?Ih&eWJ'į7iL>:2顿wƐ;d9 w=< '- SzBn6mƢ/qO>g υ?J( =NJXT za{zqt~O^p꣓5ϟ5nѽI\):{ɍ[ܷCq8aS8OYo(C~xo>!Fj_WN^oM7sNL^DRFl%?#Y׸c+ȉ4c&xy~6@C:$''r_+w}4-ؿޱs}6ybfå7=]c ?7;WsAq" 2\mAXeu7fUI7!?ԄK""?4uBh5q ao ݴ9go5Nw4kNʙg=˖!Uߋ?w腄UڞvhH%q˝Nڮϔ3"a_n=Hֶ}or5 .l:5瞧i3ִfy5a_7$(!f6|D&0eƇ_FPL\oyZawQɯ.8sQr-Mf|ɼ?HI@(= I0|C+xKm +xnwc'-L/Lv{Β%H.? (ڽ51<ɣyeE^!wk&d$YX*}A**^N'p:.RqupI_Xc b]4(xs34f/8ps3>A@~q : $g&uUߐ^[BBDRDX:A? S9ϻf j^<2o'sG <yvz mFI3f|`qA\eEkʴ4 ZXk%y\* ܛ~ THښ`ÇS=~z4sțo(5b.f|I ًC1<)7w3C6bSF۴#qkB#P RtoIQ:AS̛ڟy}SO\yšol(4H1L`_5 sd}l; a(Sp)re233s.e1cx>-(?.w~]*710% cg){7yngje`P/L:o7|zOWD?+—\%[Iʳ6=v)1 ,:F\[ɾnj5Dj3ru"U|\뤌J$w1rh,xSО[tOv>8_G ʫ&Da _}"~C U4f\73>)!?>^_|I'Oqcs~oXd7Ź|*TtvM.åYǯd[?g-\V4GSݍ'ðr}yj>D׿hswm 7 hSԦZ>/iPRɧ1'=>a2LJx9D':ycU{"@ϗ}wlZV m>4\| |zw{_# R`Ex4;"O$eBܨ_(Г}%>%RM6ӢMԞaAQQG gFOEoǿCECK&H)nj gYS9zdĻkG et_l{, C*+CS1&ymצM|p_PhaX̩x>x-?9?CEC?-W$nC׿3r=E Rl|Ɏę}h&k`-Z$Ѡþ:H y6^w=H-+Q e,h|"ڼ&amnM|@_ f'ogoAs3gx>x񱊆5OC!%xFZyZNȋcꦾtz) yrln-s:~%]=݃5]h*Gb yJ ?B,">gM|ڜ`Ym*T?:ugF7g|* P* ?+>N|Ph]uđzyuw!/_>vm_K HV|3 &#AǯckGĂV4hk$ϪHvFN,3Wǧdm8mhqm_\ >`EZ>/Lm[RTe~x#3>Ǝ=>$VI^f)ls,˺rW|KԍSRu=bZc3W15dM4(s5g{R$[|H̽kOD{/y:>`P-HmmH`^ox#Ƨ O_Z'upQ.OT:oⳟC/3z|Xr!?kۇڏrj>)pǗSoLR=~F,yWdm|=أM|4ڿ jSզZ>/(9>Bo7>m~d{ b%9 ȓ>2u@e;~3.4{>==lwtB&Ps)\ |V4(/쒉FA'+|ȣh(jh_jSԦZ>/hiq`otaÙF7k|dFC!-銀Z'$ W)yG&*zTo'4SsY)?sl"O%_59jG)iBSO @V0 R=ﲛxhCW|C zX}Ѭ<#S[9^uu(cMh=7\yRp%_C^SroJK9ǯ=_KJ4d >x?ъ0"Ȁ *+S$Xx=H\Ӥs3N/ϒO;S72&b:~cQɇ5!\x-|NHVO VxaW9^bQ&_s2lTr(/؇ok}.>W~;2VX$N,϶WIifZ?yXy>6MM+7ԦTG|z=o&"F{OE2('0|NH.h jN/bzDΑRFzל<쳼wo{ᅾrJZ't f%wtgj՞jn?ڴ6u|Њ|(_P%ywW4x8xh#/έ]eZ<2n;zo7ɮ\yY0WAʯ}?< k '/̙-D3>*z.>XݤXawɮjWgGaPwV*[|H,h?⏦V=*ڴۏVAm&uM|X_ ?_ x#}Ƨ2$G?b }eer|I ɶgs.*Kvˁi_|F6|/+$b;yàg}2L~w+VѠx1/h_Ѡv[G6 )vL4(Tȇ'louTECf>!㍀*vYľ2{E`WWer_NӍ7Ut-<˙=pQW/_*Acz&|]|]ۼ|Y?+V eA!/h[o`Aզ~iaOPmu"F{Osk*Mg4 ^ 94PnEӦ&OrkuϿk޿GMvwgȃЊl,Z̶oYrz&|]#5[)j5؇S~k֨"ag4SM&7<Ѡ&#V >6 u"F{OeLQDq/x!g]_wy$Y}RJ6|ڛ,zBQɇ5+d$md4s5EMޮ :;aSpXh0'6|@mNtFCf>!㍀mXCDH4DCʓr!/}!/#תZz#ʆOرdMݯgqj>I>͘Ƈ@6^w}塇ozre y;GS't|@mٷ4cgO8mj{_!07|uB~Eq7hDC+;k?i|ҥꋺGbS&ީ:PRF5nל}!Cmh #c$ |WZN<|{T $5z -!>'P{GJ1c%eJ|]}ѡnr t?h6Y0,oI6DÆy6ŋ/XѠ&P '6u|Xm{:ox| >E\އ~|N\ϝoЖRFSQPmz˜'Oҥy Z~d=ES9s[I Aɇro︓D?; RL4/nb{ 4`/ ;{jSܛj'2!o茆ȷ}|Nl~ VmPOXox넎6Rȇ x|(:O>+-['rML9" F_4eO^ >y,@I_`=~qQ/ui:4_mgNGS;GS;M|شFz['t|XmC{^o x|GZ'"ߋO`xiYyn2{C-=rϿcN3gpԃ8Xϵ45A͇5C3P2lfS&|b{;Ѯ~;&|ش+kSLJN4(W4鋯hu?>࣭&Bxܔ'&3ny{mO3Uk˧sLszR:~5ȵ}ǔq'3t| _{ xV4ڴwVAmpF6hu?>SќD=3rVLy}Or?o$uYk˧v&j}Y|ϨWsKᘱLK_+t|Ì~ͺa_0H;{&t|@m;}Nx>ax|U4<||RpX߼.W},omM@dfF|%23x-==ַr)h߁+hAF|̆AP:>6!?: x|91_|:ďLtB,.SMH`@vv_duu hϤaE~)soos߻~s0Ѡ5/=G|Ex4[ez+t|н ?hpox|H<ohEyn2+*z$u¿ꈣ:>[/NͶN~fNlz~IoaGg4GS; &t|@mڭVvԦM|@_`o !07|*cEMDt >oucO?o~-/|Q'/Um-~38BZ|z~Y寰[`@uM<8__bF=jS)2F7|*#47Fo'&|^Tw/'Lj'OUifܧ;p[hqʕ8W5 д-<h u|Ì~-~DMX>60zSt|$Z>/⍏"S2v\>9%O<畫1UQ!l7gbxu§la2R'3^~sj0oiߋM%V4ټ~Z'xGS^igO@mTʇmy?>S*"Ԓ5>moQyn2 #AS?ʂ`#=e2 SpoR\sj~7~_yXuMLJ/3>>PNa1igO@mvoy?>SkX|[Ny#fnTˮ߳t)W5K鋘~):0%[mMDAfڍ+i#^>i#+{t|н D։o>%@D?>-['rM|>>-]0ﺻ`Xz)lAw*6g~47蘆U_]jT %@)cϸ(SLMyӌ3h+K M\ W4x8x[x7hAy~r-Zw{&Uއ-~G)j35?zlEK9jKnupŕ.AwIy2HEo'h/oeb{^|,igO@mTˇ -O< OEq:3ޮu" IOW-D_qqŗMGwݙx-< njKss_Wrl||m;ufɓ>+x̷Nڴw6 M>E)8hD7 :1F 9*OMz0gH9 d ?E3fkq'ԝsn`JJ4.Ï>{ q\'wPåX'tp <~DnDM~M\ N_|EC7, u"?v )OMW]'2ӫ**$r/ʵL&;U KWyyWl{Nx8_z}>hڈM}=jS-UG+!xB"޾!I}z^is,Zl(Qm/Wu\8~|]z?aAV7tRS2A8te 7wk>I< _)l6[h ͒9su|@mjGPvo7BSќD0;(ѐdݤO@W7sԘ%K|GWʇo8r_vR"zŬV fK'3hASLh;{&|XmC{@: x#ǧhVhyxߞ`(e:yG1?o?'/8 q &R-9p:y+҉; &|Xm/Xz㵩jS-u"F{O}UD?~7hAynҷ-n60Ǔ^Jy=LR.y _^'h0ÿr_FJSo|kj_vF}>&)e['fPѠM|@_`k['BaoԲh!CB"??.ѐ= l˳`$i"RS#=bowR|_<'_~ngDMR>64'6|Xm+}N< gFOeLQL"[N61kh}W'b5KxDCnɓu>o[,]:,2V)ʳdm:x#o瞂c?ćzà\&'z u3vz >6y{kcgO0  l'BaoȌGqD~kMy>?oIbYc-<@9EaoձXn8yXNee:y;6 <46 MbNjsOxY># W7u"'} W\9,Z{{k?䙞2M^e߉Tw9bV>IPU'gG?*?Q_(9 |b{3W0OMB4`gO@mjTȇO4vd7㍀ZADI-s]DuC>'4Y:|]~O9͓Cp2fL!hj__op]G=e[oܻ^~o+je_ͳK_[>5-_\V>dp~Kwر,dly |QG#7| yfPlღ#6 6A!FOE!"xF M!㇣|ٮ'K1tv6pD6"h_Thg嗌>ԊCgX9r=,ŗ .oȺo-9/}ɒ 31)"sO\[;Xlkߏ6 MVj7p ]oԲhxE/ x9(OMkΞsNiӦ+2^*]˿e5:=%nk7{AGyCf]%5\vy˳K[7^Ԧ~A V4 pOUQoDnu^>m"Ο\NYW^9cWx9.jC|ƛ_zY_qIDׯ~_r6|löN o0ZoTMG:mį7uBզZ>/(=>ze[1#1KNA1ޗN#Yb2ioSNKօi#K~k|m۶m۶mlD{nyyةN*̬_u~pcY3?x :;bFγ6Uo*)sdeoOI; '&; ݁[oS  ƬB;Fsx<ξfըBx5x<O oE+O{<?EQԙ_+WړSY_< ^(x[NQ F{r*x!ѽ6 g  Ө=QEQX"pk:pbx<'o¦{}E* x<oKpU]U\jʶ'&3?wG#I@ucϬg_o*p R_(uys4'rco5<<<Fr<<<<_ Gyyy'Ev,?<<<<8yyyy<<<|г%<<<<7?-<<<12yyyywnyyyy5nQ0<<<Eyyyzq}Nyyyyy;hq(xyyyo4]yyyywyyyy"0yyy'§<<<<ϫq<<<3<<<<?TxyyyOA<<<o'n<<<<_/F#<<<<4w<<<[4(^ox<exI x<h2(6_vR4(^ox<ex <89$z<wZ4أf=d擙yVIj}vѠvx|;+&XBS+x<^wU4أv}哙~WE1h O<v4Lxdh=|jvUhPx<> y3 K'=l jGZ4'WM:ܸox<^w]4أ醲YWQ/d}x<>NM8 ,ۢa/ɧzmFaw4>{<ǎxD8 {Eחm!dmTx|E|xڢAS>x<oHD΋o` 3i9/d}x<>AM>x<oHD΋{4u|++h`}x<>΢AA>x<o\ix</K*:}m>k<[4>Uy<sѠ&<7/0 #h ;ZZHѠga,4 0QPxǟ0LFBTx|E|x< ð!]%Pq];a0  0 y+^`!' \t1E0 Eap| z1E=N=I>=? h`}x<>AS>x<o&d;=)"|J_RۢAzMx ^h< x!/X4yԢAzexQVxMgp>ݟ.hвx<>AY>x<o{BxQECϷ&O =ONѠvx|E|xJ+䯟3=oKzņWmm&nʫ,Lт g+鸿 {cBRᦛW^pɥm2P/h`=(xοv4Yx<oB?VrB= ЗJŝOzٽ>iEyVwWT$|Ƀ^W]o44 ;xOK[bROk~;ІFrk<%ネk wNoӹ煼{6$|N v4POȾlYx6 8qN<3ff~w3y擕T[M_nխnH|*Dg, iA@ÏC-ܝkJiwɦOfw>Y0F#mic:\r~4屿c|e^|Ew҆:ɓ'[tBcTu?Eʒk4?ȾmO<vt4Y'(Ο;w~ؾ27>h~|C g?' hECkɓwgȓ'O<_i9M'khGw?P_4#¿zIs]姞_7ސ}_`r| !%ʹ{x^o`Wɓ7_43Pg}OC)w k4ٓh?ó?v_j K^c3!`+̎oP?n 3{.Fɓ $&OF8OhLٻFPu_aE"M|R&wR`V4Fn|+O@X{+6_'OnEɓ'cm4|x ~G VYh޾aUk+/M=>?hLk}IIh0>AL Z X99h"߆!h0:%`- ɓ'0JÏyɓ7a4y4(x Qr6xE}kwsɓ'O[ѐ89u%qgXҾ&KFvD;:3fs~ュ݄3 h)~j j4p~'O|xa 5O C}|1״ߣ6zҟ=,+'FwE'O =i6mO>Yy%y+w̞`'a'ZOh0kMdEN7' 2>T “'O޽`3*|Γ'OQA~sɢwV)7gB7a<4o4(WQ2JW`U\xJd:=&ޜqk@y/փ7@Olc>zFɓOn4$yɓ z:^~s*WvpohP,o.XchG`W^IW\փ7[P|*`ɓ'o1ɓ'oA~>rhgg^orF}Quܖ_sTzFCSO_iBݽkpEͰJbM@=`Gn4 ˍ-=$N\Pj4F{=Gp 0uzFɓelwNkC+jsA9 `l|  48'Ob]D/j~ጆj1ߪo@Uk4Hגf.pUwFh0ߠFC h*`ɓ'oڅQkbyɓV4ѐT E/[zwQß4oٌѐ3ox@6O =pt M&B{x[ (#i!D>ɓ'Ot"|Ql` <}f땻_Tx!Y 2-s܄N+h{N?9ښxv2DmӃuzP*hDW4lPk4p~Oo(hP;g7KUHFLDW4H>7xP6+)# ɓ'X:JQɓ's}OH${/ަy{.aɞ5`N>{77so/n4ӃjU4_2z 3rg&t7 |MKJv'z ɓ'Or$x+&yBOmC_xO^'v3 9ƛZ8j4Un+w\s˭i_9+@+g['V ɓ'O޲V yW4ЃflpP*o~~)k~G ŽocJ*s] Ѓh0?h0׾gVN@F.>VDi|Md}#Cx O wxb74r,ozh{;@o*49r =:\\t"`5y[-hgӂ{4kBn~|U6'xy&>Xpbp̏o=zNl&O|"(e~|ŇKGc|j56_'O";y^l>+>FswOf Ϙ%[W}vtnwV+5 F^Z`~|2:=~MRI@Ѡh|M=6_'Oٲ Ea1D>Gf^ˤa|kӟQFNOPFpH!雮vDkɓd#h;yW4֓9aR՛V O"Ϛ6õ~|Em:?J}܇l.{|"7TW4ߚV? NP8~ӧi/FCzZwL9wvǓ=\{4۷Kt`@^ CeuLn[z`|h 'A(T7?O+$Ò.5456_'OhH$q)ȓ'OG/p@lex| ˤGm'?K@]| GCkɓAv:cɓ'c։WR3zl1#Օ5qJF} r?P__s{12使dE.PA⢋0u*\10(=' [ƍz %bvNh|MLoBOhLl+6_'Oe#OaM@lECkɓ?Խ Oɓ'Oz 8=YYioomjO  =-27) M@Go4ќѠSs&07F =h*ɓ'o "O O@hECkɓ~K!V 1Oȓ'Oy$`6FZOAh`H~Jz  z=7D[[eIEm<}_Vҟ'`mg ґG*3v3Hɓ'o%< )ln3*ȓ'Oޗ<~WǍo'hP)6P_Z*Y"U=Rfߖ|xM{Ah):kpt^iM@]=`CZѠ058'O5..?!O&6RWWk4_|EqTUU)y &gϝ/0=j"|O3G'C6s`<F$sĚ;L[ﳦpփ3Jt0Np~O<ތ?^VpPrkB;Rh0Px@* 4рiiXԴ!y[ctV'p+yɓ@8ɓ'OxY^t7ޜZrnpXʭ۞~{$w'伸ZV(ɖݟ|"8&sniWy՛v#%`C0`E6:WR< υĬyyyyv4b<<<<_30Qyyyy_řyyyy+&[oyyyy>yyyyk ]?5xyyyΖ<<<g37<<<<_]" ţyyyy~%Pyyyyba<<<yyyy|%<<<yyyy|Kyyyy~;kc1 yyyyyyyt<<<<< ]>\q$<< myyyyWb]Lyyyy~󵠈%yyyy/__kyyyy|-><<<<.溂yyyy~yyy|"Z*xyyy}}5zE<<<%t yyy_op yyyy_|]yyy<|yyyy~?#52<<<Ayyyy+(r<<<<|-b,*.<<<]g<<<<IENDB`cups-2.3.1/cups/api-ppd.header000664 000765 000024 00000001721 13574721672 016256 0ustar00mikestaff000000 000000

PPD API (DEPRECATED)

Header cups/ppd.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS Programming Manual
Specifications: CUPS PPD Extensions
cups-2.3.1/cups/tls.c000664 000765 000024 00000004010 13574721672 014512 0ustar00mikestaff000000 000000 /* * TLS routines for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * This file contains Kerberos support code, copyright 2006 by * Jelmer Vernooij. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #ifdef _WIN32 # include #else # include # include # include #endif /* _WIN32 */ #ifdef HAVE_POLL # include #endif /* HAVE_POLL */ /* * Include platform-specific TLS code... */ #ifdef HAVE_SSL # ifdef HAVE_GNUTLS # include "tls-gnutls.c" # elif defined(HAVE_CDSASSL) # include "tls-darwin.c" # elif defined(HAVE_SSPISSL) # include "tls-sspi.c" # endif /* HAVE_GNUTLS */ #else /* Stubs for when TLS is not supported/available */ int httpCopyCredentials(http_t *http, cups_array_t **credentials) { (void)http; if (credentials) *credentials = NULL; return (-1); } int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name) { (void)credentials; (void)common_name; return (1); } time_t httpCredentialsGetExpiration(cups_array_t *credentials) { (void)credentials; return (INT_MAX); } http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name) { (void)credentials; (void)common_name; return (HTTP_TRUST_OK); } size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize) { (void)credentials; (void)bufsize; if (buffer) *buffer = '\0'; return (0); } int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name) { (void)path; (void)credentials; (void)common_name; return (-1); } int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name) { (void)path; (void)credentials; (void)common_name; return (-1); } #endif /* HAVE_SSL */ cups-2.3.1/cups/raster-stream.c000664 000765 000024 00000137702 13574721672 016520 0ustar00mikestaff000000 000000 /* * Raster file routines for CUPS. * * Copyright 2007-2019 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * This file is part of the CUPS Imaging library. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "raster-private.h" #include "debug-internal.h" #ifdef HAVE_STDINT_H # include #endif /* HAVE_STDINT_H */ /* * Private structures... */ typedef void (*_cups_copyfunc_t)(void *dst, const void *src, size_t bytes); /* * Local globals... */ static const char * const apple_media_types[] = { /* media-type values for Apple Raster */ "auto", "stationery", "transparency", "envelope", "cardstock", "labels", "stationery-letterhead", "disc", "photographic-matte", "photographic-satin", "photographic-semi-gloss", "photographic-glossy", "photographic-high-gloss", "other" }; #ifdef DEBUG static const char * const cups_modes[] = { /* Open modes */ "CUPS_RASTER_READ", "CUPS_RASTER_WRITE", "CUPS_RASTER_WRITE_COMPRESSED", "CUPS_RASTER_WRITE_PWG", "CUPS_RASTER_WRITE_APPLE" }; #endif /* DEBUG */ /* * Local functions... */ static ssize_t cups_raster_io(cups_raster_t *r, unsigned char *buf, size_t bytes); static ssize_t cups_raster_read(cups_raster_t *r, unsigned char *buf, size_t bytes); static int cups_raster_update(cups_raster_t *r); static ssize_t cups_raster_write(cups_raster_t *r, const unsigned char *pixels); static void cups_swap(unsigned char *buf, size_t bytes); static void cups_swap_copy(unsigned char *dst, const unsigned char *src, size_t bytes); /* * '_cupsRasterColorSpaceString()' - Return the colorspace name for a * cupsColorSpace value. */ const char * _cupsRasterColorSpaceString( cups_cspace_t cspace) /* I - cupsColorSpace value */ { static const char * const cups_color_spaces[] = { /* Color spaces */ "W", "RGB", "RGBA", "K", "CMY", "YMC", "CMYK", "YMCK", "KCMY", "KCMYcm", "GMCK", "GMCS", "WHITE", "GOLD", "SILVER", "CIEXYZ", "CIELab", "RGBW", "SW", "SRGB", "ADOBERGB", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "ICC1", "ICC2", "ICC3", "ICC4", "ICC5", "ICC6", "ICC7", "ICC8", "ICC9", "ICCA", "ICCB", "ICCC", "ICCD", "ICCE", "ICCF", "47", "DEVICE1", "DEVICE2", "DEVICE3", "DEVICE4", "DEVICE5", "DEVICE6", "DEVICE7", "DEVICE8", "DEVICE9", "DEVICEA", "DEVICEB", "DEVICEC", "DEVICED", "DEVICEE", "DEVICEF" }; if (cspace < CUPS_CSPACE_W || cspace > CUPS_CSPACE_DEVICEF) return ("Unknown"); else return (cups_color_spaces[cspace]); } /* * '_cupsRasterDelete()' - Free a raster stream. * * The file descriptor associated with the raster stream must be closed * separately as needed. */ void _cupsRasterDelete(cups_raster_t *r) /* I - Stream to free */ { if (r != NULL) { if (r->buffer) free(r->buffer); if (r->pixels) free(r->pixels); free(r); } } /* * '_cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output. * * The "media" argument specifies the media to use. * * The "type" argument specifies a "pwg-raster-document-type-supported" value * that controls the color space and bit depth of the raster data. * * The "xres" and "yres" arguments specify the raster resolution in dots per * inch. * * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value * to apply for the back side of a page. Pass @code NULL@ for the front side. * * @since CUPS 2.2/macOS 10.12@ */ int /* O - 1 on success, 0 on failure */ _cupsRasterInitPWGHeader( cups_page_header2_t *h, /* I - Page header */ pwg_media_t *media, /* I - PWG media information */ const char *type, /* I - PWG raster type string */ int xdpi, /* I - Cross-feed direction (horizontal) resolution */ int ydpi, /* I - Feed direction (vertical) resolution */ const char *sides, /* I - IPP "sides" option value */ const char *sheet_back) /* I - Transform for back side or @code NULL@ for none */ { if (!h || !media || !type || xdpi <= 0 || ydpi <= 0) { _cupsRasterAddError("%s", strerror(EINVAL)); return (0); } /* * Initialize the page header... */ memset(h, 0, sizeof(cups_page_header2_t)); strlcpy(h->cupsPageSizeName, media->pwg, sizeof(h->cupsPageSizeName)); h->PageSize[0] = (unsigned)(72 * media->width / 2540); h->PageSize[1] = (unsigned)(72 * media->length / 2540); /* This never gets written but is needed for some applications */ h->cupsPageSize[0] = 72.0f * media->width / 2540.0f; h->cupsPageSize[1] = 72.0f * media->length / 2540.0f; h->ImagingBoundingBox[2] = h->PageSize[0]; h->ImagingBoundingBox[3] = h->PageSize[1]; h->HWResolution[0] = (unsigned)xdpi; h->HWResolution[1] = (unsigned)ydpi; h->cupsWidth = (unsigned)(media->width * xdpi / 2540); h->cupsHeight = (unsigned)(media->length * ydpi / 2540); if (h->cupsWidth > 0x00ffffff || h->cupsHeight > 0x00ffffff) { _cupsRasterAddError("Raster dimensions too large."); return (0); } h->cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] = h->cupsWidth; h->cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] = h->cupsHeight; /* * Colorspace and bytes per line... */ if (!strcmp(type, "adobe-rgb_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 24; h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; } else if (!strcmp(type, "adobe-rgb_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 48; h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; } else if (!strcmp(type, "black_1")) { h->cupsBitsPerColor = 1; h->cupsBitsPerPixel = 1; h->cupsColorSpace = CUPS_CSPACE_K; } else if (!strcmp(type, "black_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 8; h->cupsColorSpace = CUPS_CSPACE_K; } else if (!strcmp(type, "black_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 16; h->cupsColorSpace = CUPS_CSPACE_K; } else if (!strcmp(type, "cmyk_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 32; h->cupsColorSpace = CUPS_CSPACE_CMYK; } else if (!strcmp(type, "cmyk_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 64; h->cupsColorSpace = CUPS_CSPACE_CMYK; } else if (!strncmp(type, "device", 6) && type[6] >= '1' && type[6] <= '9') { int ncolors, bits; /* Number of colors and bits */ if (sscanf(type, "device%d_%d", &ncolors, &bits) != 2 || ncolors > 15 || (bits != 8 && bits != 16)) { _cupsRasterAddError("Unsupported raster type \'%s\'.", type); return (0); } h->cupsBitsPerColor = (unsigned)bits; h->cupsBitsPerPixel = (unsigned)(ncolors * bits); h->cupsColorSpace = (cups_cspace_t)(CUPS_CSPACE_DEVICE1 + ncolors - 1); } else if (!strcmp(type, "rgb_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 24; h->cupsColorSpace = CUPS_CSPACE_RGB; } else if (!strcmp(type, "rgb_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 48; h->cupsColorSpace = CUPS_CSPACE_RGB; } else if (!strcmp(type, "sgray_1")) { h->cupsBitsPerColor = 1; h->cupsBitsPerPixel = 1; h->cupsColorSpace = CUPS_CSPACE_SW; } else if (!strcmp(type, "sgray_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 8; h->cupsColorSpace = CUPS_CSPACE_SW; } else if (!strcmp(type, "sgray_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 16; h->cupsColorSpace = CUPS_CSPACE_SW; } else if (!strcmp(type, "srgb_8")) { h->cupsBitsPerColor = 8; h->cupsBitsPerPixel = 24; h->cupsColorSpace = CUPS_CSPACE_SRGB; } else if (!strcmp(type, "srgb_16")) { h->cupsBitsPerColor = 16; h->cupsBitsPerPixel = 48; h->cupsColorSpace = CUPS_CSPACE_SRGB; } else { _cupsRasterAddError("Unsupported raster type \'%s\'.", type); return (0); } h->cupsColorOrder = CUPS_ORDER_CHUNKED; h->cupsNumColors = h->cupsBitsPerPixel / h->cupsBitsPerColor; h->cupsBytesPerLine = (h->cupsWidth * h->cupsBitsPerPixel + 7) / 8; /* * Duplex support... */ h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 1; h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 1; if (sides) { if (!strcmp(sides, "two-sided-long-edge")) { h->Duplex = 1; } else if (!strcmp(sides, "two-sided-short-edge")) { h->Duplex = 1; h->Tumble = 1; } else if (strcmp(sides, "one-sided")) { _cupsRasterAddError("Unsupported sides value \'%s\'.", sides); return (0); } if (sheet_back) { if (!strcmp(sheet_back, "flipped")) { if (h->Tumble) h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; else h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; } else if (!strcmp(sheet_back, "manual-tumble")) { if (h->Tumble) { h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; } } else if (!strcmp(sheet_back, "rotated")) { if (!h->Tumble) { h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; } } else if (strcmp(sheet_back, "normal")) { _cupsRasterAddError("Unsupported sheet_back value \'%s\'.", sheet_back); return (0); } } } return (1); } /* * '_cupsRasterNew()' - Create a raster stream using a callback function. * * This function associates a raster stream with the given callback function and * context pointer. * * When writing raster data, the @code CUPS_RASTER_WRITE@, * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can * be used - compressed and PWG output is generally 25-50% smaller but adds a * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ _cupsRasterNew( cups_raster_iocb_t iocb, /* I - Read/write callback */ void *ctx, /* I - Context pointer for callback */ cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, @code CUPS_RASTER_WRITE@, @code CUPS_RASTER_WRITE_COMPRESSED@, or @code CUPS_RASTER_WRITE_PWG@ */ { cups_raster_t *r; /* New stream */ DEBUG_printf(("_cupsRasterOpenIO(iocb=%p, ctx=%p, mode=%s)", (void *)iocb, ctx, cups_modes[mode])); _cupsRasterClearError(); if ((r = calloc(sizeof(cups_raster_t), 1)) == NULL) { _cupsRasterAddError("Unable to allocate memory for raster stream: %s\n", strerror(errno)); DEBUG_puts("1_cupsRasterOpenIO: Returning NULL."); return (NULL); } r->ctx = ctx; r->iocb = iocb; r->mode = mode; if (mode == CUPS_RASTER_READ) { /* * Open for read - get sync word... */ if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) != sizeof(r->sync)) { _cupsRasterAddError("Unable to read header from raster stream: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to read header, returning NULL."); return (NULL); } if (r->sync != CUPS_RASTER_SYNC && r->sync != CUPS_RASTER_REVSYNC && r->sync != CUPS_RASTER_SYNCv1 && r->sync != CUPS_RASTER_REVSYNCv1 && r->sync != CUPS_RASTER_SYNCv2 && r->sync != CUPS_RASTER_REVSYNCv2 && r->sync != CUPS_RASTER_SYNCapple && r->sync != CUPS_RASTER_REVSYNCapple) { _cupsRasterAddError("Unknown raster format %08x!\n", r->sync); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unknown format, returning NULL."); return (NULL); } if (r->sync == CUPS_RASTER_SYNCv2 || r->sync == CUPS_RASTER_REVSYNCv2 || r->sync == CUPS_RASTER_SYNCapple || r->sync == CUPS_RASTER_REVSYNCapple) r->compressed = 1; DEBUG_printf(("1_cupsRasterOpenIO: sync=%08x", r->sync)); if (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1 || r->sync == CUPS_RASTER_REVSYNCv2 || r->sync == CUPS_RASTER_REVSYNCapple) r->swapped = 1; if (r->sync == CUPS_RASTER_SYNCapple || r->sync == CUPS_RASTER_REVSYNCapple) { unsigned char header[8]; /* File header */ if (cups_raster_io(r, (unsigned char *)header, sizeof(header)) != sizeof(header)) { _cupsRasterAddError("Unable to read header from raster stream: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to read header, returning NULL."); return (NULL); } } #ifdef DEBUG r->iostart = r->iocount; #endif /* DEBUG */ } else { /* * Open for write - put sync word... */ switch (mode) { default : case CUPS_RASTER_WRITE : r->sync = CUPS_RASTER_SYNC; break; case CUPS_RASTER_WRITE_COMPRESSED : r->compressed = 1; r->sync = CUPS_RASTER_SYNCv2; break; case CUPS_RASTER_WRITE_PWG : r->compressed = 1; r->sync = htonl(CUPS_RASTER_SYNC_PWG); r->swapped = r->sync != CUPS_RASTER_SYNC_PWG; break; case CUPS_RASTER_WRITE_APPLE : r->compressed = 1; r->sync = htonl(CUPS_RASTER_SYNCapple); r->swapped = r->sync != CUPS_RASTER_SYNCapple; r->apple_page_count = 0xffffffffU; break; } if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) < (ssize_t)sizeof(r->sync)) { _cupsRasterAddError("Unable to write raster stream header: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to write header, returning NULL."); return (NULL); } } DEBUG_printf(("1_cupsRasterOpenIO: compressed=%d, swapped=%d, returning %p", r->compressed, r->swapped, (void *)r)); return (r); } /* * '_cupsRasterReadHeader()' - Read a raster page header. */ unsigned /* O - 1 on success, 0 on fail */ _cupsRasterReadHeader( cups_raster_t *r) /* I - Raster stream */ { size_t len; /* Length for read/swap */ DEBUG_printf(("3_cupsRasterReadHeader(r=%p), r->mode=%s", (void *)r, r ? cups_modes[r->mode] : "")); if (r == NULL || r->mode != CUPS_RASTER_READ) return (0); DEBUG_printf(("4_cupsRasterReadHeader: r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); memset(&(r->header), 0, sizeof(r->header)); /* * Read the header... */ switch (r->sync) { default : /* * Get the length of the raster header... */ if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1) len = sizeof(cups_page_header_t); else len = sizeof(cups_page_header2_t); DEBUG_printf(("4_cupsRasterReadHeader: len=%d", (int)len)); /* * Read it... */ if (cups_raster_read(r, (unsigned char *)&(r->header), len) < (ssize_t)len) { DEBUG_printf(("4_cupsRasterReadHeader: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); return (0); } /* * Swap bytes as needed... */ if (r->swapped) { unsigned *s, /* Current word */ temp; /* Temporary copy */ DEBUG_puts("4_cupsRasterReadHeader: Swapping header bytes."); for (len = 81, s = &(r->header.AdvanceDistance); len > 0; len --, s ++) { temp = *s; *s = ((temp & 0xff) << 24) | ((temp & 0xff00) << 8) | ((temp & 0xff0000) >> 8) | ((temp & 0xff000000) >> 24); DEBUG_printf(("4_cupsRasterReadHeader: %08x => %08x", temp, *s)); } } break; case CUPS_RASTER_SYNCapple : case CUPS_RASTER_REVSYNCapple : { unsigned char appleheader[32]; /* Raw header */ static const unsigned rawcspace[] = { CUPS_CSPACE_SW, CUPS_CSPACE_SRGB, CUPS_CSPACE_CIELab, CUPS_CSPACE_ADOBERGB, CUPS_CSPACE_W, CUPS_CSPACE_RGB, CUPS_CSPACE_CMYK }; static const unsigned rawnumcolors[] = { 1, 3, 3, 3, 1, 3, 4 }; if (cups_raster_read(r, appleheader, sizeof(appleheader)) < (ssize_t)sizeof(appleheader)) { DEBUG_printf(("4_cupsRasterReadHeader: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); return (0); } strlcpy(r->header.MediaClass, "PwgRaster", sizeof(r->header.MediaClass)); /* PwgRaster */ r->header.cupsBitsPerPixel = appleheader[0]; r->header.cupsColorSpace = appleheader[1] >= (sizeof(rawcspace) / sizeof(rawcspace[0])) ? CUPS_CSPACE_DEVICE1 : rawcspace[appleheader[1]]; r->header.cupsNumColors = appleheader[1] >= (sizeof(rawnumcolors) / sizeof(rawnumcolors[0])) ? 1 : rawnumcolors[appleheader[1]]; r->header.cupsBitsPerColor = r->header.cupsBitsPerPixel / r->header.cupsNumColors; r->header.cupsWidth = ((((((unsigned)appleheader[12] << 8) | (unsigned)appleheader[13]) << 8) | (unsigned)appleheader[14]) << 8) | (unsigned)appleheader[15]; r->header.cupsHeight = ((((((unsigned)appleheader[16] << 8) | (unsigned)appleheader[17]) << 8) | (unsigned)appleheader[18]) << 8) | (unsigned)appleheader[19]; r->header.cupsBytesPerLine = r->header.cupsWidth * r->header.cupsBitsPerPixel / 8; r->header.cupsColorOrder = CUPS_ORDER_CHUNKED; r->header.HWResolution[0] = r->header.HWResolution[1] = ((((((unsigned)appleheader[20] << 8) | (unsigned)appleheader[21]) << 8) | (unsigned)appleheader[22]) << 8) | (unsigned)appleheader[23]; if (r->header.HWResolution[0] > 0) { r->header.PageSize[0] = (unsigned)(r->header.cupsWidth * 72 / r->header.HWResolution[0]); r->header.PageSize[1] = (unsigned)(r->header.cupsHeight * 72 / r->header.HWResolution[1]); r->header.cupsPageSize[0] = (float)(r->header.cupsWidth * 72.0 / r->header.HWResolution[0]); r->header.cupsPageSize[1] = (float)(r->header.cupsHeight * 72.0 / r->header.HWResolution[1]); } r->header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = r->apple_page_count; r->header.cupsInteger[CUPS_RASTER_PWG_AlternatePrimary] = 0xffffff; r->header.cupsInteger[CUPS_RASTER_PWG_PrintQuality] = appleheader[3]; if (appleheader[2] >= 2) r->header.Duplex = 1; if (appleheader[2] == 2) r->header.Tumble = 1; r->header.MediaPosition = appleheader[5]; if (appleheader[4] < (int)(sizeof(apple_media_types) / sizeof(apple_media_types[0]))) strlcpy(r->header.MediaType, apple_media_types[appleheader[4]], sizeof(r->header.MediaType)); else strlcpy(r->header.MediaType, "other", sizeof(r->header.MediaType)); } break; } /* * Update the header and row count... */ if (!cups_raster_update(r)) return (0); DEBUG_printf(("4_cupsRasterReadHeader: cupsColorSpace=%s", _cupsRasterColorSpaceString(r->header.cupsColorSpace))); DEBUG_printf(("4_cupsRasterReadHeader: cupsBitsPerColor=%u", r->header.cupsBitsPerColor)); DEBUG_printf(("4_cupsRasterReadHeader: cupsBitsPerPixel=%u", r->header.cupsBitsPerPixel)); DEBUG_printf(("4_cupsRasterReadHeader: cupsBytesPerLine=%u", r->header.cupsBytesPerLine)); DEBUG_printf(("4_cupsRasterReadHeader: cupsWidth=%u", r->header.cupsWidth)); DEBUG_printf(("4_cupsRasterReadHeader: cupsHeight=%u", r->header.cupsHeight)); DEBUG_printf(("4_cupsRasterReadHeader: r->bpp=%d", r->bpp)); return (r->header.cupsBitsPerPixel > 0 && r->header.cupsBitsPerPixel <= 240 && r->header.cupsBitsPerColor > 0 && r->header.cupsBitsPerColor <= 16 && r->header.cupsBytesPerLine > 0 && r->header.cupsBytesPerLine <= 0x7fffffff && r->header.cupsHeight != 0 && (r->header.cupsBytesPerLine % r->bpp) == 0); } /* * '_cupsRasterReadPixels()' - Read raster pixels. * * For best performance, filters should read one or more whole lines. * The "cupsBytesPerLine" value from the page header can be used to allocate * the line buffer and as the number of bytes to read. */ unsigned /* O - Number of bytes read */ _cupsRasterReadPixels( cups_raster_t *r, /* I - Raster stream */ unsigned char *p, /* I - Pointer to pixel buffer */ unsigned len) /* I - Number of bytes to read */ { ssize_t bytes; /* Bytes read */ unsigned cupsBytesPerLine; /* cupsBytesPerLine value */ unsigned remaining; /* Bytes remaining */ unsigned char *ptr, /* Pointer to read buffer */ byte, /* Byte from file */ *temp; /* Pointer into buffer */ unsigned count; /* Repetition count */ DEBUG_printf(("_cupsRasterReadPixels(r=%p, p=%p, len=%u)", (void *)r, (void *)p, len)); if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 || r->header.cupsBytesPerLine == 0) { DEBUG_puts("1_cupsRasterReadPixels: Returning 0."); return (0); } DEBUG_printf(("1_cupsRasterReadPixels: compressed=%d, remaining=%u", r->compressed, r->remaining)); if (!r->compressed) { /* * Read without compression... */ r->remaining -= len / r->header.cupsBytesPerLine; if (cups_raster_io(r, p, len) < (ssize_t)len) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); return (0); } /* * Swap bytes as needed... */ if (r->swapped && (r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) cups_swap(p, len); /* * Return... */ DEBUG_printf(("1_cupsRasterReadPixels: Returning %u", len)); return (len); } /* * Read compressed data... */ remaining = len; cupsBytesPerLine = r->header.cupsBytesPerLine; while (remaining > 0 && r->remaining > 0) { if (r->count == 0) { /* * Need to read a new row... */ if (remaining == cupsBytesPerLine) ptr = p; else ptr = r->pixels; /* * Read using a modified PackBits compression... */ if (!cups_raster_read(r, &byte, 1)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); return (0); } r->count = (unsigned)byte + 1; if (r->count > 1) ptr = r->pixels; temp = ptr; bytes = (ssize_t)cupsBytesPerLine; while (bytes > 0) { /* * Get a new repeat count... */ if (!cups_raster_read(r, &byte, 1)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); return (0); } if (byte == 128) { /* * Clear to end of line... */ switch (r->header.cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_RGB : case CUPS_CSPACE_SW : case CUPS_CSPACE_SRGB : case CUPS_CSPACE_RGBW : case CUPS_CSPACE_ADOBERGB : memset(temp, 0xff, (size_t)bytes); break; default : memset(temp, 0x00, (size_t)bytes); break; } temp += bytes; bytes = 0; } else if (byte & 128) { /* * Copy N literal pixels... */ count = (unsigned)(257 - byte) * r->bpp; if (count > (unsigned)bytes) count = (unsigned)bytes; if (!cups_raster_read(r, temp, count)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); return (0); } temp += count; bytes -= (ssize_t)count; } else { /* * Repeat the next N bytes... */ count = ((unsigned)byte + 1) * r->bpp; if (count > (unsigned)bytes) count = (unsigned)bytes; if (count < r->bpp) break; bytes -= (ssize_t)count; if (!cups_raster_read(r, temp, r->bpp)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); return (0); } temp += r->bpp; count -= r->bpp; while (count > 0) { memcpy(temp, temp - r->bpp, r->bpp); temp += r->bpp; count -= r->bpp; } } } /* * Swap bytes as needed... */ if ((r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16) && r->swapped) { DEBUG_puts("1_cupsRasterReadPixels: Swapping bytes."); cups_swap(ptr, (size_t)cupsBytesPerLine); } /* * Update pointers... */ if (remaining >= cupsBytesPerLine) { bytes = (ssize_t)cupsBytesPerLine; r->pcurrent = r->pixels; r->count --; r->remaining --; } else { bytes = (ssize_t)remaining; r->pcurrent = r->pixels + bytes; } /* * Copy data as needed... */ if (ptr != p) memcpy(p, ptr, (size_t)bytes); } else { /* * Copy fragment from buffer... */ if ((unsigned)(bytes = (int)(r->pend - r->pcurrent)) > remaining) bytes = (ssize_t)remaining; memcpy(p, r->pcurrent, (size_t)bytes); r->pcurrent += bytes; if (r->pcurrent >= r->pend) { r->pcurrent = r->pixels; r->count --; r->remaining --; } } remaining -= (unsigned)bytes; p += bytes; } DEBUG_printf(("1_cupsRasterReadPixels: Returning %u", len)); return (len); } /* * '_cupsRasterWriteHeader()' - Write a raster page header. */ unsigned /* O - 1 on success, 0 on failure */ _cupsRasterWriteHeader( cups_raster_t *r) /* I - Raster stream */ { DEBUG_printf(("_cupsRasterWriteHeader(r=%p)", (void *)r)); DEBUG_printf(("1_cupsRasterWriteHeader: cupsColorSpace=%s", _cupsRasterColorSpaceString(r->header.cupsColorSpace))); DEBUG_printf(("1_cupsRasterWriteHeader: cupsBitsPerColor=%u", r->header.cupsBitsPerColor)); DEBUG_printf(("1_cupsRasterWriteHeader: cupsBitsPerPixel=%u", r->header.cupsBitsPerPixel)); DEBUG_printf(("1_cupsRasterWriteHeader: cupsBytesPerLine=%u", r->header.cupsBytesPerLine)); DEBUG_printf(("1_cupsRasterWriteHeader: cupsWidth=%u", r->header.cupsWidth)); DEBUG_printf(("1_cupsRasterWriteHeader: cupsHeight=%u", r->header.cupsHeight)); /* * Compute the number of raster lines in the page image... */ if (!cups_raster_update(r)) { DEBUG_puts("1_cupsRasterWriteHeader: Unable to update parameters, returning 0."); return (0); } if (r->mode == CUPS_RASTER_WRITE_APPLE) { r->rowheight = r->header.HWResolution[0] / r->header.HWResolution[1]; if (r->header.HWResolution[0] != (r->rowheight * r->header.HWResolution[1])) return (0); } else r->rowheight = 1; /* * Write the raster header... */ if (r->mode == CUPS_RASTER_WRITE_PWG) { /* * PWG raster data is always network byte order with much of the page header * zeroed. */ cups_page_header2_t fh; /* File page header */ memset(&fh, 0, sizeof(fh)); strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, sizeof(fh.cupsRenderingIntent)); strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, sizeof(fh.cupsPageSizeName)); fh.CutMedia = htonl(r->header.CutMedia); fh.Duplex = htonl(r->header.Duplex); fh.HWResolution[0] = htonl(r->header.HWResolution[0]); fh.HWResolution[1] = htonl(r->header.HWResolution[1]); fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); fh.InsertSheet = htonl(r->header.InsertSheet); fh.Jog = htonl(r->header.Jog); fh.LeadingEdge = htonl(r->header.LeadingEdge); fh.ManualFeed = htonl(r->header.ManualFeed); fh.MediaPosition = htonl(r->header.MediaPosition); fh.MediaWeight = htonl(r->header.MediaWeight); fh.NumCopies = htonl(r->header.NumCopies); fh.Orientation = htonl(r->header.Orientation); fh.PageSize[0] = htonl(r->header.PageSize[0]); fh.PageSize[1] = htonl(r->header.PageSize[1]); fh.Tumble = htonl(r->header.Tumble); fh.cupsWidth = htonl(r->header.cupsWidth); fh.cupsHeight = htonl(r->header.cupsHeight); fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); fh.cupsColorOrder = htonl(r->header.cupsColorOrder); fh.cupsColorSpace = htonl(r->header.cupsColorSpace); fh.cupsNumColors = htonl(r->header.cupsNumColors); fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); fh.cupsInteger[3] = htonl((unsigned)(r->header.cupsImagingBBox[0] * r->header.HWResolution[0] / 72.0)); fh.cupsInteger[4] = htonl((unsigned)(r->header.cupsImagingBBox[1] * r->header.HWResolution[1] / 72.0)); fh.cupsInteger[5] = htonl((unsigned)(r->header.cupsImagingBBox[2] * r->header.HWResolution[0] / 72.0)); fh.cupsInteger[6] = htonl((unsigned)(r->header.cupsImagingBBox[3] * r->header.HWResolution[1] / 72.0)); fh.cupsInteger[7] = htonl(0xffffff); return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); } else if (r->mode == CUPS_RASTER_WRITE_APPLE) { /* * Raw raster data is always network byte order with most of the page header * zeroed. */ int i; /* Looping var */ unsigned char appleheader[32];/* Raw page header */ unsigned height = r->header.cupsHeight * r->rowheight; /* Computed page height */ if (r->apple_page_count == 0xffffffffU) { /* * Write raw page count from raster page header... */ r->apple_page_count = r->header.cupsInteger[0]; appleheader[0] = 'A'; appleheader[1] = 'S'; appleheader[2] = 'T'; appleheader[3] = 0; appleheader[4] = (unsigned char)(r->apple_page_count >> 24); appleheader[5] = (unsigned char)(r->apple_page_count >> 16); appleheader[6] = (unsigned char)(r->apple_page_count >> 8); appleheader[7] = (unsigned char)(r->apple_page_count); if (cups_raster_io(r, appleheader, 8) != 8) return (0); } memset(appleheader, 0, sizeof(appleheader)); appleheader[0] = (unsigned char)r->header.cupsBitsPerPixel; appleheader[1] = r->header.cupsColorSpace == CUPS_CSPACE_SRGB ? 1 : r->header.cupsColorSpace == CUPS_CSPACE_CIELab ? 2 : r->header.cupsColorSpace == CUPS_CSPACE_ADOBERGB ? 3 : r->header.cupsColorSpace == CUPS_CSPACE_W ? 4 : r->header.cupsColorSpace == CUPS_CSPACE_RGB ? 5 : r->header.cupsColorSpace == CUPS_CSPACE_CMYK ? 6 : 0; appleheader[2] = r->header.Duplex ? (r->header.Tumble ? 2 : 3) : 1; appleheader[3] = (unsigned char)(r->header.cupsInteger[CUPS_RASTER_PWG_PrintQuality]); appleheader[5] = (unsigned char)(r->header.MediaPosition); appleheader[12] = (unsigned char)(r->header.cupsWidth >> 24); appleheader[13] = (unsigned char)(r->header.cupsWidth >> 16); appleheader[14] = (unsigned char)(r->header.cupsWidth >> 8); appleheader[15] = (unsigned char)(r->header.cupsWidth); appleheader[16] = (unsigned char)(height >> 24); appleheader[17] = (unsigned char)(height >> 16); appleheader[18] = (unsigned char)(height >> 8); appleheader[19] = (unsigned char)(height); appleheader[20] = (unsigned char)(r->header.HWResolution[0] >> 24); appleheader[21] = (unsigned char)(r->header.HWResolution[0] >> 16); appleheader[22] = (unsigned char)(r->header.HWResolution[0] >> 8); appleheader[23] = (unsigned char)(r->header.HWResolution[0]); for (i = 0; i < (int)(sizeof(apple_media_types) / sizeof(apple_media_types[0])); i ++) { if (!strcmp(r->header.MediaType, apple_media_types[i])) { appleheader[4] = (unsigned char)i; break; } } return (cups_raster_io(r, appleheader, sizeof(appleheader)) == sizeof(appleheader)); } else return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) == sizeof(r->header)); } /* * '_cupsRasterWritePixels()' - Write raster pixels. * * For best performance, filters should write one or more whole lines. * The "cupsBytesPerLine" value from the page header can be used to allocate * the line buffer and as the number of bytes to write. */ unsigned /* O - Number of bytes written */ _cupsRasterWritePixels( cups_raster_t *r, /* I - Raster stream */ unsigned char *p, /* I - Bytes to write */ unsigned len) /* I - Number of bytes to write */ { ssize_t bytes; /* Bytes read */ unsigned remaining; /* Bytes remaining */ DEBUG_printf(("_cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u", (void *)r, (void *)p, len, r->remaining)); if (r == NULL || r->mode == CUPS_RASTER_READ || r->remaining == 0) return (0); if (!r->compressed) { /* * Without compression, just write the raster data raw unless the data needs * to be swapped... */ r->remaining -= len / r->header.cupsBytesPerLine; if (r->swapped && (r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) { unsigned char *bufptr; /* Pointer into write buffer */ /* * Allocate a write buffer as needed... */ if ((size_t)len > r->bufsize) { if (r->buffer) bufptr = realloc(r->buffer, len); else bufptr = malloc(len); if (!bufptr) return (0); r->buffer = bufptr; r->bufsize = len; } /* * Byte swap the pixels and write them... */ cups_swap_copy(r->buffer, p, len); bytes = cups_raster_io(r, r->buffer, len); } else bytes = cups_raster_io(r, p, len); if (bytes < (ssize_t)len) return (0); else return (len); } /* * Otherwise, compress each line... */ for (remaining = len; remaining > 0; remaining -= (unsigned)bytes, p += bytes) { /* * Figure out the number of remaining bytes on the current line... */ if ((bytes = (ssize_t)remaining) > (ssize_t)(r->pend - r->pcurrent)) bytes = (ssize_t)(r->pend - r->pcurrent); if (r->count > 0) { /* * Check to see if this line is the same as the previous line... */ if (memcmp(p, r->pcurrent, (size_t)bytes)) { if (cups_raster_write(r, r->pixels) <= 0) return (0); r->count = 0; } else { /* * Mark more bytes as the same... */ r->pcurrent += bytes; if (r->pcurrent >= r->pend) { /* * Increase the repeat count... */ r->count += r->rowheight; r->pcurrent = r->pixels; /* * Flush out this line if it is the last one... */ r->remaining --; if (r->remaining == 0) { if (cups_raster_write(r, r->pixels) <= 0) return (0); else return (len); } else if (r->count > (256 - r->rowheight)) { if (cups_raster_write(r, r->pixels) <= 0) return (0); r->count = 0; } } continue; } } if (r->count == 0) { /* * Copy the raster data to the buffer... */ memcpy(r->pcurrent, p, (size_t)bytes); r->pcurrent += bytes; if (r->pcurrent >= r->pend) { /* * Increase the repeat count... */ r->count += r->rowheight; r->pcurrent = r->pixels; /* * Flush out this line if it is the last one... */ r->remaining --; if (r->remaining == 0) { if (cups_raster_write(r, r->pixels) <= 0) return (0); } } } } return (len); } /* * 'cups_raster_io()' - Read/write bytes from a context, handling interruptions. */ static ssize_t /* O - Bytes read/write or -1 */ cups_raster_io(cups_raster_t *r, /* I - Raster stream */ unsigned char *buf, /* I - Buffer for read/write */ size_t bytes) /* I - Number of bytes to read/write */ { ssize_t count, /* Number of bytes read/written */ total; /* Total bytes read/written */ DEBUG_printf(("5cups_raster_io(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)r, (void *)buf, CUPS_LLCAST bytes)); for (total = 0; total < (ssize_t)bytes; total += count, buf += count) { count = (*r->iocb)(r->ctx, buf, bytes - (size_t)total); DEBUG_printf(("6cups_raster_io: count=%d, total=%d", (int)count, (int)total)); if (count == 0) break; // { // DEBUG_puts("6cups_raster_io: Returning 0."); // return (0); // } else if (count < 0) { DEBUG_puts("6cups_raster_io: Returning -1 on error."); return (-1); } #ifdef DEBUG r->iocount += (size_t)count; #endif /* DEBUG */ } DEBUG_printf(("6cups_raster_io: iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); DEBUG_printf(("6cups_raster_io: Returning " CUPS_LLFMT ".", CUPS_LLCAST total)); return (total); } /* * 'cups_raster_read()' - Read through the raster buffer. */ static ssize_t /* O - Number of bytes read */ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ unsigned char *buf, /* I - Buffer */ size_t bytes) /* I - Number of bytes to read */ { ssize_t count, /* Number of bytes read */ remaining, /* Remaining bytes in buffer */ total; /* Total bytes read */ DEBUG_printf(("4cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT "), offset=" CUPS_LLFMT, (void *)r, (void *)buf, CUPS_LLCAST bytes, CUPS_LLCAST (r->iostart + r->bufptr - r->buffer))); if (!r->compressed) return (cups_raster_io(r, buf, bytes)); /* * Allocate a read buffer as needed... */ count = (ssize_t)(2 * r->header.cupsBytesPerLine); if (count < 65536) count = 65536; if ((size_t)count > r->bufsize) { ssize_t offset = r->bufptr - r->buffer; /* Offset to current start of buffer */ ssize_t end = r->bufend - r->buffer;/* Offset to current end of buffer */ unsigned char *rptr; /* Pointer in read buffer */ if (r->buffer) rptr = realloc(r->buffer, (size_t)count); else rptr = malloc((size_t)count); if (!rptr) return (0); r->buffer = rptr; r->bufptr = rptr + offset; r->bufend = rptr + end; r->bufsize = (size_t)count; } /* * Loop until we have read everything... */ for (total = 0, remaining = (int)(r->bufend - r->bufptr); total < (ssize_t)bytes; total += count, buf += count) { count = (ssize_t)bytes - total; DEBUG_printf(("5cups_raster_read: count=" CUPS_LLFMT ", remaining=" CUPS_LLFMT ", buf=%p, bufptr=%p, bufend=%p", CUPS_LLCAST count, CUPS_LLCAST remaining, (void *)buf, (void *)r->bufptr, (void *)r->bufend)); if (remaining == 0) { if (count < 16) { /* * Read into the raster buffer and then copy... */ #ifdef DEBUG r->iostart += (size_t)(r->bufend - r->buffer); #endif /* DEBUG */ remaining = (*r->iocb)(r->ctx, r->buffer, r->bufsize); if (remaining <= 0) return (0); r->bufptr = r->buffer; r->bufend = r->buffer + remaining; #ifdef DEBUG r->iocount += (size_t)remaining; #endif /* DEBUG */ } else { /* * Read directly into "buf"... */ count = (*r->iocb)(r->ctx, buf, (size_t)count); if (count <= 0) return (0); #ifdef DEBUG r->iostart += (size_t)count; r->iocount += (size_t)count; #endif /* DEBUG */ continue; } } /* * Copy bytes from raster buffer to "buf"... */ if (count > remaining) count = remaining; if (count == 1) { /* * Copy 1 byte... */ *buf = *(r->bufptr)++; remaining --; } else if (count < 128) { /* * Copy up to 127 bytes without using memcpy(); this is * faster because it avoids an extra function call and is * often further optimized by the compiler... */ unsigned char *bufptr; /* Temporary buffer pointer */ remaining -= count; for (bufptr = r->bufptr; count > 0; count --, total ++) *buf++ = *bufptr++; r->bufptr = bufptr; } else { /* * Use memcpy() for a large read... */ memcpy(buf, r->bufptr, (size_t)count); r->bufptr += count; remaining -= count; } } DEBUG_printf(("5cups_raster_read: Returning %ld", (long)total)); return (total); } /* * 'cups_raster_update()' - Update the raster header and row count for the * current page. */ static int /* O - 1 on success, 0 on failure */ cups_raster_update(cups_raster_t *r) /* I - Raster stream */ { if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1 || r->header.cupsNumColors == 0) { /* * Set the "cupsNumColors" field according to the colorspace... */ switch (r->header.cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_K : case CUPS_CSPACE_WHITE : case CUPS_CSPACE_GOLD : case CUPS_CSPACE_SILVER : case CUPS_CSPACE_SW : r->header.cupsNumColors = 1; break; case CUPS_CSPACE_RGB : case CUPS_CSPACE_CMY : case CUPS_CSPACE_YMC : case CUPS_CSPACE_CIEXYZ : case CUPS_CSPACE_CIELab : case CUPS_CSPACE_SRGB : case CUPS_CSPACE_ADOBERGB : case CUPS_CSPACE_ICC1 : case CUPS_CSPACE_ICC2 : case CUPS_CSPACE_ICC3 : case CUPS_CSPACE_ICC4 : case CUPS_CSPACE_ICC5 : case CUPS_CSPACE_ICC6 : case CUPS_CSPACE_ICC7 : case CUPS_CSPACE_ICC8 : case CUPS_CSPACE_ICC9 : case CUPS_CSPACE_ICCA : case CUPS_CSPACE_ICCB : case CUPS_CSPACE_ICCC : case CUPS_CSPACE_ICCD : case CUPS_CSPACE_ICCE : case CUPS_CSPACE_ICCF : r->header.cupsNumColors = 3; break; case CUPS_CSPACE_RGBA : case CUPS_CSPACE_RGBW : case CUPS_CSPACE_CMYK : case CUPS_CSPACE_YMCK : case CUPS_CSPACE_KCMY : case CUPS_CSPACE_GMCK : case CUPS_CSPACE_GMCS : r->header.cupsNumColors = 4; break; case CUPS_CSPACE_KCMYcm : if (r->header.cupsBitsPerPixel < 8) r->header.cupsNumColors = 6; else r->header.cupsNumColors = 4; break; case CUPS_CSPACE_DEVICE1 : case CUPS_CSPACE_DEVICE2 : case CUPS_CSPACE_DEVICE3 : case CUPS_CSPACE_DEVICE4 : case CUPS_CSPACE_DEVICE5 : case CUPS_CSPACE_DEVICE6 : case CUPS_CSPACE_DEVICE7 : case CUPS_CSPACE_DEVICE8 : case CUPS_CSPACE_DEVICE9 : case CUPS_CSPACE_DEVICEA : case CUPS_CSPACE_DEVICEB : case CUPS_CSPACE_DEVICEC : case CUPS_CSPACE_DEVICED : case CUPS_CSPACE_DEVICEE : case CUPS_CSPACE_DEVICEF : r->header.cupsNumColors = r->header.cupsColorSpace - CUPS_CSPACE_DEVICE1 + 1; break; default : /* Unknown color space */ return (0); } } /* * Set the number of bytes per pixel/color... */ if (r->header.cupsColorOrder == CUPS_ORDER_CHUNKED) r->bpp = (r->header.cupsBitsPerPixel + 7) / 8; else r->bpp = (r->header.cupsBitsPerColor + 7) / 8; if (r->bpp == 0) r->bpp = 1; /* * Set the number of remaining rows... */ if (r->header.cupsColorOrder == CUPS_ORDER_PLANAR) r->remaining = r->header.cupsHeight * r->header.cupsNumColors; else r->remaining = r->header.cupsHeight; /* * Allocate the compression buffer... */ if (r->compressed) { if (r->pixels != NULL) free(r->pixels); if ((r->pixels = calloc(r->header.cupsBytesPerLine, 1)) == NULL) { r->pcurrent = NULL; r->pend = NULL; r->count = 0; return (0); } r->pcurrent = r->pixels; r->pend = r->pixels + r->header.cupsBytesPerLine; r->count = 0; } return (1); } /* * 'cups_raster_write()' - Write a row of compressed raster data... */ static ssize_t /* O - Number of bytes written */ cups_raster_write( cups_raster_t *r, /* I - Raster stream */ const unsigned char *pixels) /* I - Pixel data to write */ { const unsigned char *start, /* Start of sequence */ *ptr, /* Current pointer in sequence */ *pend, /* End of raster buffer */ *plast; /* Pointer to last pixel */ unsigned char *wptr; /* Pointer into write buffer */ unsigned bpp, /* Bytes per pixel */ count; /* Count */ _cups_copyfunc_t cf; /* Copy function */ DEBUG_printf(("3cups_raster_write(r=%p, pixels=%p)", (void *)r, (void *)pixels)); /* * Determine whether we need to swap bytes... */ if (r->swapped && (r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) { DEBUG_puts("4cups_raster_write: Swapping bytes when writing."); cf = (_cups_copyfunc_t)cups_swap_copy; } else cf = (_cups_copyfunc_t)memcpy; /* * Allocate a write buffer as needed... */ count = r->header.cupsBytesPerLine * 2; if (count < 65536) count = 65536; if ((size_t)count > r->bufsize) { if (r->buffer) wptr = realloc(r->buffer, count); else wptr = malloc(count); if (!wptr) { DEBUG_printf(("4cups_raster_write: Unable to allocate " CUPS_LLFMT " bytes for raster buffer: %s", CUPS_LLCAST count, strerror(errno))); return (-1); } r->buffer = wptr; r->bufsize = count; } /* * Write the row repeat count... */ bpp = r->bpp; pend = pixels + r->header.cupsBytesPerLine; plast = pend - bpp; wptr = r->buffer; *wptr++ = (unsigned char)(r->count - 1); /* * Write using a modified PackBits compression... */ for (ptr = pixels; ptr < pend;) { start = ptr; ptr += bpp; if (ptr == pend) { /* * Encode a single pixel at the end... */ *wptr++ = 0; (*cf)(wptr, start, bpp); wptr += bpp; } else if (!memcmp(start, ptr, bpp)) { /* * Encode a sequence of repeating pixels... */ for (count = 2; count < 128 && ptr < plast; count ++, ptr += bpp) if (memcmp(ptr, ptr + bpp, bpp)) break; *wptr++ = (unsigned char)(count - 1); (*cf)(wptr, ptr, bpp); wptr += bpp; ptr += bpp; } else { /* * Encode a sequence of non-repeating pixels... */ for (count = 1; count < 128 && ptr < plast; count ++, ptr += bpp) if (!memcmp(ptr, ptr + bpp, bpp)) break; if (ptr >= plast && count < 128) { count ++; ptr += bpp; } *wptr++ = (unsigned char)(257 - count); count *= bpp; (*cf)(wptr, start, count); wptr += count; } } DEBUG_printf(("4cups_raster_write: Writing " CUPS_LLFMT " bytes.", CUPS_LLCAST (wptr - r->buffer))); return (cups_raster_io(r, r->buffer, (size_t)(wptr - r->buffer))); } /* * 'cups_swap()' - Swap bytes in raster data... */ static void cups_swap(unsigned char *buf, /* I - Buffer to swap */ size_t bytes) /* I - Number of bytes to swap */ { unsigned char even, odd; /* Temporary variables */ bytes /= 2; while (bytes > 0) { even = buf[0]; odd = buf[1]; buf[0] = odd; buf[1] = even; buf += 2; bytes --; } } /* * 'cups_swap_copy()' - Copy and swap bytes in raster data... */ static void cups_swap_copy( unsigned char *dst, /* I - Destination */ const unsigned char *src, /* I - Source */ size_t bytes) /* I - Number of bytes to swap */ { bytes /= 2; while (bytes > 0) { dst[0] = src[1]; dst[1] = src[0]; dst += 2; src += 2; bytes --; } } cups-2.3.1/cups/tls-darwin.h000664 000765 000024 00000002745 13574721672 016016 0ustar00mikestaff000000 000000 /* * 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); cups-2.3.1/cups/dest-options.c000664 000765 000024 00000231725 13574721672 016357 0ustar00mikestaff000000 000000 /* * Destination option/media support 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 "cups-private.h" #include "debug-internal.h" /* * Local constants... */ #define _CUPS_MEDIA_READY_TTL 30 /* Life of xxx-ready values */ /* * Local functions... */ static void cups_add_dconstres(cups_array_t *a, ipp_t *collection); static int cups_collection_contains(ipp_t *test, ipp_t *match); static size_t cups_collection_string(ipp_attribute_t *attr, char *buffer, size_t bufsize) _CUPS_NONNULL((1,2)); static int cups_compare_dconstres(_cups_dconstres_t *a, _cups_dconstres_t *b); static int cups_compare_media_db(_cups_media_db_t *a, _cups_media_db_t *b); static _cups_media_db_t *cups_copy_media_db(_cups_media_db_t *mdb); static void cups_create_cached(http_t *http, cups_dinfo_t *dinfo, unsigned flags); static void cups_create_constraints(cups_dinfo_t *dinfo); static void cups_create_defaults(cups_dinfo_t *dinfo); static void cups_create_media_db(cups_dinfo_t *dinfo, unsigned flags); static void cups_free_media_db(_cups_media_db_t *mdb); static int cups_get_media_db(http_t *http, cups_dinfo_t *dinfo, pwg_media_t *pwg, unsigned flags, cups_size_t *size); static int cups_is_close_media_db(_cups_media_db_t *a, _cups_media_db_t *b); static cups_array_t *cups_test_constraints(cups_dinfo_t *dinfo, const char *new_option, const char *new_value, int num_options, cups_option_t *options, int *num_conflicts, cups_option_t **conflicts); 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/macOS 10.14@ */ int /* O - New number of options */ cupsAddDestMediaOptions( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags, /* I - Media matching flags */ cups_size_t *size, /* I - Media size */ int num_options, /* I - Current number of options */ cups_option_t **options) /* IO - Options */ { cups_array_t *db; /* Media database */ _cups_media_db_t *mdb; /* Media database entry */ char value[2048]; /* Option value */ /* * Range check input... */ if (!http || !dest || !dinfo || !size || !options) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (num_options); } /* * Find the matching media size... */ if (flags & CUPS_MEDIA_FLAGS_READY) db = dinfo->ready_db; else db = dinfo->media_db; DEBUG_printf(("1cupsAddDestMediaOptions: size->media=\"%s\"", size->media)); for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->key && !strcmp(mdb->key, size->media)) break; else if (mdb->size_name && !strcmp(mdb->size_name, size->media)) break; } if (!mdb) { for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->width == size->width && mdb->length == size->length && mdb->bottom == size->bottom && mdb->left == size->left && mdb->right == size->right && mdb->top == size->top) break; } } if (!mdb) { for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->width == size->width && mdb->length == size->length) break; } } if (!mdb) { DEBUG_puts("1cupsAddDestMediaOptions: Unable to find matching size."); return (num_options); } DEBUG_printf(("1cupsAddDestMediaOptions: MATCH mdb%p [key=\"%s\" size_name=\"%s\" source=\"%s\" type=\"%s\" width=%d length=%d B%d L%d R%d T%d]", (void *)mdb, mdb->key, mdb->size_name, mdb->source, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top)); if (mdb->source) { if (mdb->type) snprintf(value, sizeof(value), "{media-size={x-dimension=%d y-dimension=%d} media-bottom-margin=%d media-left-margin=%d media-right-margin=%d media-top-margin=%d media-source=\"%s\" media-type=\"%s\"}", mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top, mdb->source, mdb->type); else snprintf(value, sizeof(value), "{media-size={x-dimension=%d y-dimension=%d} media-bottom-margin=%d media-left-margin=%d media-right-margin=%d media-top-margin=%d media-source=\"%s\"}", mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top, mdb->source); } else if (mdb->type) { snprintf(value, sizeof(value), "{media-size={x-dimension=%d y-dimension=%d} media-bottom-margin=%d media-left-margin=%d media-right-margin=%d media-top-margin=%d media-type=\"%s\"}", mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top, mdb->type); } else { snprintf(value, sizeof(value), "{media-size={x-dimension=%d y-dimension=%d} media-bottom-margin=%d media-left-margin=%d media-right-margin=%d media-top-margin=%d}", mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top); } num_options = cupsAddOption("media-col", value, num_options, options); return (num_options); } /* * 'cupsCheckDestSupported()' - Check that the option and value are supported * by the destination. * * Returns 1 if supported, 0 otherwise. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 if supported, 0 otherwise */ cupsCheckDestSupported( 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 */ const char *value) /* I - Value or @code NULL@ */ { int i; /* Looping var */ char temp[1024]; /* Temporary string */ int int_value; /* Integer value */ int xres_value, /* Horizontal resolution */ yres_value; /* Vertical resolution */ ipp_res_t units_value; /* Resolution units */ ipp_attribute_t *attr; /* Attribute */ _ipp_value_t *attrval; /* Current attribute value */ _ipp_option_t *map; /* Option mapping information */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo || !option) return (0); /* * Lookup the attribute... */ if (strstr(option, "-supported")) attr = ippFindAttribute(dinfo->attrs, option, IPP_TAG_ZERO); else { snprintf(temp, sizeof(temp), "%s-supported", option); attr = ippFindAttribute(dinfo->attrs, temp, IPP_TAG_ZERO); } if (!attr) return (0); if (!value) return (1); /* * Compare values... */ if (!strcmp(option, "media") && !strncmp(value, "custom_", 7)) { /* * Check range of custom media sizes... */ pwg_media_t *pwg; /* Current PWG media size info */ int min_width, /* Minimum width */ min_length, /* Minimum length */ max_width, /* Maximum width */ max_length; /* Maximum length */ /* * Get the minimum and maximum size... */ min_width = min_length = INT_MAX; max_width = max_length = 0; for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (!strncmp(attrval->string.text, "custom_min_", 11) && (pwg = pwgMediaForPWG(attrval->string.text)) != NULL) { min_width = pwg->width; min_length = pwg->length; } else if (!strncmp(attrval->string.text, "custom_max_", 11) && (pwg = pwgMediaForPWG(attrval->string.text)) != NULL) { max_width = pwg->width; max_length = pwg->length; } } /* * Check the range... */ if (min_width < INT_MAX && max_width > 0 && (pwg = pwgMediaForPWG(value)) != NULL && pwg->width >= min_width && pwg->width <= max_width && pwg->length >= min_length && pwg->length <= max_length) return (1); } else { /* * Check literal values... */ map = _ippFindOption(option); switch (attr->value_tag) { case IPP_TAG_INTEGER : if (map && map->value_tag == IPP_TAG_STRING) return (strlen(value) <= (size_t)attr->values[0].integer); case IPP_TAG_ENUM : int_value = atoi(value); for (i = 0; i < attr->num_values; i ++) if (attr->values[i].integer == int_value) return (1); break; case IPP_TAG_BOOLEAN : return (attr->values[0].boolean); case IPP_TAG_RANGE : if (map && map->value_tag == IPP_TAG_STRING) int_value = (int)strlen(value); else int_value = atoi(value); for (i = 0; i < attr->num_values; i ++) if (int_value >= attr->values[i].range.lower && int_value <= attr->values[i].range.upper) return (1); break; case IPP_TAG_RESOLUTION : if (sscanf(value, "%dx%d%15s", &xres_value, &yres_value, temp) != 3) { if (sscanf(value, "%d%15s", &xres_value, temp) != 2) return (0); yres_value = xres_value; } if (!strcmp(temp, "dpi")) units_value = IPP_RES_PER_INCH; else if (!strcmp(temp, "dpc") || !strcmp(temp, "dpcm")) units_value = IPP_RES_PER_CM; else return (0); for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (attrval->resolution.xres == xres_value && attrval->resolution.yres == yres_value && attrval->resolution.units == units_value) return (1); } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_CHARSET : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_MIMETYPE : case IPP_TAG_LANGUAGE : case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : for (i = 0; i < attr->num_values; i ++) if (!strcmp(attr->values[i].string.text, value)) return (1); break; default : break; } } /* * If we get there the option+value is not supported... */ return (0); } /* * 'cupsCopyDestConflicts()' - Get conflicts and resolutions for a new * option/value pair. * * "num_options" and "options" represent the currently selected options by the * user. "new_option" and "new_value" are the setting the user has just * changed. * * Returns 1 if there is a conflict, 0 if there are no conflicts, and -1 if * there was an unrecoverable error such as a resolver loop. * * If "num_conflicts" and "conflicts" are not @code NULL@, they are set to * contain the list of conflicting option/value pairs. Similarly, if * "num_resolved" and "resolved" are not @code NULL@ they will be set to the * list of changes needed to resolve the conflict. * * If cupsCopyDestConflicts returns 1 but "num_resolved" and "resolved" are set * to 0 and @code NULL@, respectively, then the conflict cannot be resolved. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 if there is a conflict, 0 if none, -1 on error */ cupsCopyDestConflicts( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ int num_options, /* I - Number of current options */ cups_option_t *options, /* I - Current options */ const char *new_option, /* I - New option */ const char *new_value, /* I - New value */ int *num_conflicts, /* O - Number of conflicting options */ cups_option_t **conflicts, /* O - Conflicting options */ int *num_resolved, /* O - Number of options to resolve */ cups_option_t **resolved) /* O - Resolved options */ { int i, /* Looping var */ have_conflicts = 0, /* Do we have conflicts? */ changed, /* Did we change something? */ tries, /* Number of tries for resolution */ num_myconf = 0, /* My number of conflicting options */ num_myres = 0; /* My number of resolved options */ cups_option_t *myconf = NULL, /* My conflicting options */ *myres = NULL, /* My resolved options */ *myoption, /* My current option */ *option; /* Current option */ cups_array_t *active = NULL, /* Active conflicts */ *pass = NULL, /* Resolvers for this pass */ *resolvers = NULL, /* Resolvers we have used */ *test; /* Test array for conflicts */ _cups_dconstres_t *c, /* Current constraint */ *r; /* Current resolver */ ipp_attribute_t *attr; /* Current attribute */ char value[2048]; /* Current attribute value as string */ const char *myvalue; /* Current value of an option */ /* * Clear returned values... */ if (num_conflicts) *num_conflicts = 0; if (conflicts) *conflicts = NULL; if (num_resolved) *num_resolved = 0; if (resolved) *resolved = NULL; /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo || (num_conflicts != NULL) != (conflicts != NULL) || (num_resolved != NULL) != (resolved != NULL)) return (0); /* * Load constraints as needed... */ if (!dinfo->constraints) cups_create_constraints(dinfo); if (cupsArrayCount(dinfo->constraints) == 0) return (0); if (!dinfo->num_defaults) cups_create_defaults(dinfo); /* * If we are resolving, create a shadow array... */ if (num_resolved) { for (i = num_options, option = options; i > 0; i --, option ++) num_myres = cupsAddOption(option->name, option->value, num_myres, &myres); if (new_option && new_value) num_myres = cupsAddOption(new_option, new_value, num_myres, &myres); } else { num_myres = num_options; myres = options; } /* * Check for any conflicts... */ if (num_resolved) pass = cupsArrayNew((cups_array_func_t)cups_compare_dconstres, NULL); for (tries = 0; tries < 100; tries ++) { /* * Check for any conflicts... */ if (num_conflicts || num_resolved) { cupsFreeOptions(num_myconf, myconf); num_myconf = 0; myconf = NULL; active = cups_test_constraints(dinfo, new_option, new_value, num_myres, myres, &num_myconf, &myconf); } else active = cups_test_constraints(dinfo, new_option, new_value, num_myres, myres, NULL, NULL); have_conflicts = (active != NULL); if (!active || !num_resolved) break; /* All done */ /* * Scan the constraints that were triggered to apply resolvers... */ if (!resolvers) resolvers = cupsArrayNew((cups_array_func_t)cups_compare_dconstres, NULL); for (c = (_cups_dconstres_t *)cupsArrayFirst(active), changed = 0; c; c = (_cups_dconstres_t *)cupsArrayNext(active)) { if (cupsArrayFind(pass, c)) continue; /* Already applied this resolver... */ if (cupsArrayFind(resolvers, c)) { DEBUG_printf(("1cupsCopyDestConflicts: Resolver loop with %s.", c->name)); have_conflicts = -1; goto cleanup; } if ((r = cupsArrayFind(dinfo->resolvers, c)) == NULL) { DEBUG_printf(("1cupsCopyDestConflicts: Resolver %s not found.", c->name)); have_conflicts = -1; goto cleanup; } /* * Add the options from the resolver... */ cupsArrayAdd(pass, r); cupsArrayAdd(resolvers, r); for (attr = ippFirstAttribute(r->collection); attr; attr = ippNextAttribute(r->collection)) { if (new_option && !strcmp(attr->name, new_option)) continue; /* Ignore this if we just changed it */ if (ippAttributeString(attr, value, sizeof(value)) >= sizeof(value)) continue; /* Ignore if the value is too long */ if ((test = cups_test_constraints(dinfo, attr->name, value, num_myres, myres, NULL, NULL)) == NULL) { /* * That worked, flag it... */ changed = 1; } else cupsArrayDelete(test); /* * Add the option/value from the resolver regardless of whether it * worked; this makes sure that we can cascade several changes to * make things resolve... */ num_myres = cupsAddOption(attr->name, value, num_myres, &myres); } } if (!changed) { DEBUG_puts("1cupsCopyDestConflicts: Unable to resolve constraints."); have_conflicts = -1; goto cleanup; } cupsArrayClear(pass); cupsArrayDelete(active); active = NULL; } if (tries >= 100) { DEBUG_puts("1cupsCopyDestConflicts: Unable to resolve after 100 tries."); have_conflicts = -1; goto cleanup; } /* * Copy resolved options as needed... */ if (num_resolved) { for (i = num_myres, myoption = myres; i > 0; i --, myoption ++) { if ((myvalue = cupsGetOption(myoption->name, num_options, options)) == NULL || strcmp(myvalue, myoption->value)) { if (new_option && !strcmp(new_option, myoption->name) && new_value && !strcmp(new_value, myoption->value)) continue; *num_resolved = cupsAddOption(myoption->name, myoption->value, *num_resolved, resolved); } } } /* * Clean up... */ cleanup: cupsArrayDelete(active); cupsArrayDelete(pass); cupsArrayDelete(resolvers); if (num_resolved) { /* * Free shadow copy of options... */ cupsFreeOptions(num_myres, myres); } if (num_conflicts) { /* * Return conflicting options to caller... */ *num_conflicts = num_myconf; *conflicts = myconf; } else { /* * Free conflicting options... */ cupsFreeOptions(num_myconf, myconf); } return (have_conflicts); } /* * 'cupsCopyDestInfo()' - Get the supported values/capabilities for the * destination. * * The caller is responsible for calling @link cupsFreeDestInfo@ on the return * value. @code NULL@ is returned on error. * * @since CUPS 1.6/macOS 10.8@ */ cups_dinfo_t * /* O - Destination information */ cupsCopyDestInfo( http_t *http, /* I - Connection to destination */ cups_dest_t *dest) /* I - Destination */ { cups_dinfo_t *dinfo; /* Destination information */ unsigned dflags; /* Destination flags */ ipp_t *request, /* Get-Printer-Attributes request */ *response; /* Supported attributes */ int tries, /* Number of tries so far */ delay, /* Current retry delay */ prev_delay; /* Next retry delay */ const char *uri; /* Printer URI */ char resource[1024]; /* Resource path */ int version; /* IPP version */ ipp_status_t status; /* Status of request */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ static const char * const requested_attrs[] = { /* Requested attributes */ "job-template", "media-col-database", "printer-description" }; DEBUG_printf(("cupsCopyDestInfo(http=%p, dest=%p(%s))", (void *)http, (void *)dest, dest ? dest->name : "")); /* * Get the default connection as needed... */ if (!http) { DEBUG_puts("1cupsCopyDestInfo: Default server connection."); http = _cupsConnect(); dflags = CUPS_DEST_FLAGS_NONE; } #ifdef AF_LOCAL else if (httpAddrFamily(http->hostaddr) == AF_LOCAL) { DEBUG_puts("1cupsCopyDestInfo: Connection to server (domain socket)."); dflags = CUPS_DEST_FLAGS_NONE; } #endif /* AF_LOCAL */ else if ((strcmp(http->hostname, cg->server) && cg->server[0] != '/') || cg->ipp_port != httpAddrPort(http->hostaddr)) { DEBUG_printf(("1cupsCopyDestInfo: Connection to device (%s).", http->hostname)); dflags = CUPS_DEST_FLAGS_DEVICE; } else { DEBUG_printf(("1cupsCopyDestInfo: Connection to server (%s).", http->hostname)); dflags = CUPS_DEST_FLAGS_NONE; } /* * Range check input... */ if (!http || !dest) return (NULL); /* * Get the printer URI and resource path... */ if ((uri = _cupsGetDestResource(dest, dflags, resource, sizeof(resource))) == NULL) { DEBUG_puts("1cupsCopyDestInfo: Unable to get resource."); return (NULL); } /* * Get the supported attributes... */ delay = 1; prev_delay = 1; tries = 0; version = 20; do { /* * Send a Get-Printer-Attributes request... */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippSetVersion(request, version / 10, version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(requested_attrs) / sizeof(requested_attrs[0])), NULL, requested_attrs); response = cupsDoRequest(http, request, resource); status = cupsLastError(); if (status > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { DEBUG_printf(("1cupsCopyDestInfo: Get-Printer-Attributes for '%s' returned %s (%s)", dest->name, ippErrorString(status), cupsLastErrorString())); ippDelete(response); response = NULL; if ((status == IPP_STATUS_ERROR_BAD_REQUEST || status == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED) && version > 11) { version = 11; } else if (status == IPP_STATUS_ERROR_BUSY) { sleep((unsigned)delay); delay = _cupsNextDelay(delay, &prev_delay); } else return (NULL); } tries ++; } while (!response && tries < 10); if (!response) { DEBUG_puts("1cupsCopyDestInfo: Unable to get printer attributes."); return (NULL); } /* * Allocate a cups_dinfo_t structure and return it... */ if ((dinfo = calloc(1, sizeof(cups_dinfo_t))) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); ippDelete(response); return (NULL); } DEBUG_printf(("1cupsCopyDestInfo: version=%d, uri=\"%s\", resource=\"%s\".", version, uri, resource)); dinfo->version = version; dinfo->uri = uri; dinfo->resource = _cupsStrAlloc(resource); dinfo->attrs = response; return (dinfo); } /* * 'cupsFindDestDefault()' - Find the default value(s) for the given option. * * The returned value is an IPP attribute. Use the @code ippGetBoolean@, * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@, * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@, * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@ * functions to inspect the default value(s) as needed. * * @since CUPS 1.7/macOS 10.9@ */ ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */ cupsFindDestDefault( 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/attribute name */ { char name[IPP_MAX_NAME]; /* Attribute name */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo || !option) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Find and return the attribute... */ snprintf(name, sizeof(name), "%s-default", option); return (ippFindAttribute(dinfo->attrs, name, IPP_TAG_ZERO)); } /* * 'cupsFindDestReady()' - Find the default value(s) for the given option. * * The returned value is an IPP attribute. Use the @code ippGetBoolean@, * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@, * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@, * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@ * functions to inspect the default value(s) as needed. * * @since CUPS 1.7/macOS 10.9@ */ ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */ cupsFindDestReady( 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/attribute name */ { char name[IPP_MAX_NAME]; /* Attribute name */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo || !option) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Find and return the attribute... */ cups_update_ready(http, dinfo); snprintf(name, sizeof(name), "%s-ready", option); return (ippFindAttribute(dinfo->ready_attrs, name, IPP_TAG_ZERO)); } /* * 'cupsFindDestSupported()' - Find the default value(s) for the given option. * * The returned value is an IPP attribute. Use the @code ippGetBoolean@, * @code ippGetCollection@, @code ippGetCount@, @code ippGetDate@, * @code ippGetInteger@, @code ippGetOctetString@, @code ippGetRange@, * @code ippGetResolution@, @code ippGetString@, and @code ippGetValueTag@ * functions to inspect the default value(s) as needed. * * @since CUPS 1.7/macOS 10.9@ */ ipp_attribute_t * /* O - Default attribute or @code NULL@ for none */ cupsFindDestSupported( 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/attribute name */ { char name[IPP_MAX_NAME]; /* Attribute name */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo || !option) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Find and return the attribute... */ snprintf(name, sizeof(name), "%s-supported", option); return (ippFindAttribute(dinfo->attrs, name, IPP_TAG_ZERO)); } /* * 'cupsFreeDestInfo()' - Free destination information obtained using * @link cupsCopyDestInfo@. * * @since CUPS 1.6/macOS 10.8@ */ void cupsFreeDestInfo(cups_dinfo_t *dinfo) /* I - Destination information */ { /* * Range check input... */ if (!dinfo) return; /* * Free memory and return... */ _cupsStrFree(dinfo->resource); cupsArrayDelete(dinfo->constraints); cupsArrayDelete(dinfo->resolvers); cupsArrayDelete(dinfo->localizations); cupsArrayDelete(dinfo->media_db); cupsArrayDelete(dinfo->cached_db); ippDelete(dinfo->ready_attrs); cupsArrayDelete(dinfo->ready_db); ippDelete(dinfo->attrs); free(dinfo); } /* * 'cupsGetDestMediaByIndex()' - Get a media name, dimension, and margins for a * specific size. * * The @code flags@ parameter determines which set of media are indexed. For * example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will get the Nth * borderless size supported by the printer. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ cupsGetDestMediaByIndex( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ int n, /* I - Media size number (0-based) */ unsigned flags, /* I - Media flags */ cups_size_t *size) /* O - Media size information */ { _cups_media_db_t *nsize; /* Size for N */ pwg_media_t *pwg; /* PWG media name for size */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (size) memset(size, 0, sizeof(cups_size_t)); if (!http || !dest || !dinfo || n < 0 || !size) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Load media list as needed... */ if (flags & CUPS_MEDIA_FLAGS_READY) cups_update_ready(http, dinfo); if (!dinfo->cached_db || dinfo->cached_flags != flags) cups_create_cached(http, dinfo, flags); /* * Copy the size over and return... */ if ((nsize = (_cups_media_db_t *)cupsArrayIndex(dinfo->cached_db, n)) == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } if (nsize->key) strlcpy(size->media, nsize->key, sizeof(size->media)); else if (nsize->size_name) strlcpy(size->media, nsize->size_name, sizeof(size->media)); else if ((pwg = pwgMediaForSize(nsize->width, nsize->length)) != NULL) strlcpy(size->media, pwg->pwg, sizeof(size->media)); else { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } size->width = nsize->width; size->length = nsize->length; size->bottom = nsize->bottom; size->left = nsize->left; size->right = nsize->right; size->top = nsize->top; return (1); } /* * 'cupsGetDestMediaByName()' - Get media names, dimensions, and margins. * * The "media" string is a PWG media name. "Flags" provides some matching * guidance (multiple flags can be combined): * * CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, * CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size, * CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing, * CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size, and * CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the * size amongst the "ready" media. * * The matching result (if any) is returned in the "cups_size_t" structure. * * Returns 1 when there is a match and 0 if there is not a match. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on match, 0 on failure */ cupsGetDestMediaByName( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ const char *media, /* I - Media name */ unsigned flags, /* I - Media matching flags */ cups_size_t *size) /* O - Media size information */ { pwg_media_t *pwg; /* PWG media info */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (size) memset(size, 0, sizeof(cups_size_t)); if (!http || !dest || !dinfo || !media || !size) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Lookup the media size name... */ if ((pwg = pwgMediaForPWG(media)) == NULL) if ((pwg = pwgMediaForLegacy(media)) == NULL) { DEBUG_printf(("1cupsGetDestMediaByName: Unknown size '%s'.", media)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown media size name."), 1); return (0); } /* * Lookup the size... */ return (cups_get_media_db(http, dinfo, pwg, flags, size)); } /* * 'cupsGetDestMediaBySize()' - Get media names, dimensions, and margins. * * "Width" and "length" are the dimensions in hundredths of millimeters. * "Flags" provides some matching guidance (multiple flags can be combined): * * CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, * CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size, * CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing, * CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size, and * CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the * size amongst the "ready" media. * * The matching result (if any) is returned in the "cups_size_t" structure. * * Returns 1 when there is a match and 0 if there is not a match. * * @since CUPS 1.6/macOS 10.8@ */ int /* O - 1 on match, 0 on failure */ cupsGetDestMediaBySize( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ int width, /* I - Media width in hundredths of * of millimeters */ int length, /* I - Media length in hundredths of * of millimeters */ unsigned flags, /* I - Media matching flags */ cups_size_t *size) /* O - Media size information */ { pwg_media_t *pwg; /* PWG media info */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (size) memset(size, 0, sizeof(cups_size_t)); if (!http || !dest || !dinfo || width <= 0 || length <= 0 || !size) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Lookup the media size name... */ if ((pwg = pwgMediaForSize(width, length)) == NULL) { DEBUG_printf(("1cupsGetDestMediaBySize: Invalid size %dx%d.", width, length)); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media size."), 1); return (0); } /* * Lookup the size... */ return (cups_get_media_db(http, dinfo, pwg, flags, size)); } /* * 'cupsGetDestMediaCount()' - Get the number of sizes supported by a * destination. * * The @code flags@ parameter determines the set of media sizes that are * counted. For example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will return * the number of borderless sizes. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - Number of sizes */ cupsGetDestMediaCount( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags) /* I - Media flags */ { /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (!http || !dest || !dinfo) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Load media list as needed... */ if (flags & CUPS_MEDIA_FLAGS_READY) cups_update_ready(http, dinfo); if (!dinfo->cached_db || dinfo->cached_flags != flags) cups_create_cached(http, dinfo, flags); return (cupsArrayCount(dinfo->cached_db)); } /* * 'cupsGetDestMediaDefault()' - Get the default size for a destination. * * The @code flags@ parameter determines which default size is returned. For * example, passing @code CUPS_MEDIA_FLAGS_BORDERLESS@ will return the default * borderless size, typically US Letter or A4, but sometimes 4x6 photo media. * * @since CUPS 1.7/macOS 10.9@ */ int /* O - 1 on success, 0 on failure */ cupsGetDestMediaDefault( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags, /* I - Media flags */ cups_size_t *size) /* O - Media size information */ { const char *media; /* Default media size */ /* * Get the default connection as needed... */ if (!http) http = _cupsConnect(); /* * Range check input... */ if (size) memset(size, 0, sizeof(cups_size_t)); if (!http || !dest || !dinfo || !size) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (0); } /* * Get the default media size, if any... */ if ((media = cupsGetOption("media", dest->num_options, dest->options)) == NULL) media = "na_letter_8.5x11in"; if (cupsGetDestMediaByName(http, dest, dinfo, media, flags, size)) return (1); if (strcmp(media, "na_letter_8.5x11in") && cupsGetDestMediaByName(http, dest, dinfo, "iso_a4_210x297mm", flags, size)) return (1); if (strcmp(media, "iso_a4_210x297mm") && cupsGetDestMediaByName(http, dest, dinfo, "na_letter_8.5x11in", flags, size)) return (1); if ((flags & CUPS_MEDIA_FLAGS_BORDERLESS) && cupsGetDestMediaByName(http, dest, dinfo, "na_index_4x6in", flags, size)) return (1); /* * Fall back to the first matching media size... */ return (cupsGetDestMediaByIndex(http, dest, dinfo, 0, flags, size)); } /* * 'cups_add_dconstres()' - Add a constraint or resolver to an array. */ static void cups_add_dconstres( cups_array_t *a, /* I - Array */ ipp_t *collection) /* I - Collection value */ { ipp_attribute_t *attr; /* Attribute */ _cups_dconstres_t *temp; /* Current constraint/resolver */ if ((attr = ippFindAttribute(collection, "resolver-name", IPP_TAG_NAME)) == NULL) return; if ((temp = calloc(1, sizeof(_cups_dconstres_t))) == NULL) return; temp->name = attr->values[0].string.text; temp->collection = collection; cupsArrayAdd(a, temp); } /* * 'cups_collection_contains()' - Check whether test collection is contained in the matching collection. */ static int /* O - 1 on a match, 0 on a non-match */ cups_collection_contains(ipp_t *test, /* I - Collection to test */ ipp_t *match) /* I - Matching values */ { int i, j, /* Looping vars */ mcount, /* Number of match values */ tcount; /* Number of test values */ ipp_attribute_t *tattr, /* Testing attribute */ *mattr; /* Matching attribute */ const char *tval; /* Testing string value */ for (mattr = ippFirstAttribute(match); mattr; mattr = ippNextAttribute(match)) { if ((tattr = ippFindAttribute(test, ippGetName(mattr), IPP_TAG_ZERO)) == NULL) return (0); tcount = ippGetCount(tattr); switch (ippGetValueTag(mattr)) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : if (ippGetValueTag(tattr) != ippGetValueTag(mattr)) return (0); for (i = 0; i < tcount; i ++) { if (!ippContainsInteger(mattr, ippGetInteger(tattr, i))) return (0); } break; case IPP_TAG_RANGE : if (ippGetValueTag(tattr) != IPP_TAG_INTEGER) return (0); for (i = 0; i < tcount; i ++) { if (!ippContainsInteger(mattr, ippGetInteger(tattr, i))) return (0); } break; case IPP_TAG_BOOLEAN : if (ippGetValueTag(tattr) != IPP_TAG_BOOLEAN || ippGetBoolean(tattr, 0) != ippGetBoolean(mattr, 0)) return (0); break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : for (i = 0; i < tcount; i ++) { if ((tval = ippGetString(tattr, i, NULL)) == NULL || !ippContainsString(mattr, tval)) return (0); } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0; i < tcount; i ++) { ipp_t *tcol = ippGetCollection(tattr, i); /* Testing collection */ for (j = 0, mcount = ippGetCount(mattr); j < mcount; j ++) if (!cups_collection_contains(tcol, ippGetCollection(mattr, j))) return (0); } break; default : return (0); } } return (1); } /* * 'cups_collection_string()' - Convert an IPP collection to an option string. */ static size_t /* O - Number of bytes needed */ cups_collection_string( ipp_attribute_t *attr, /* I - Collection attribute */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of buffer */ { int i, j, /* Looping vars */ count, /* Number of collection values */ mcount; /* Number of member values */ ipp_t *col; /* Collection */ ipp_attribute_t *first, /* First member attribute */ *member; /* Member attribute */ char *bufptr, /* Pointer into buffer */ *bufend, /* End of buffer */ temp[100]; /* Temporary string */ const char *mptr; /* Pointer into member value */ int mlen; /* Length of octetString */ bufptr = buffer; bufend = buffer + bufsize - 1; for (i = 0, count = ippGetCount(attr); i < count; i ++) { col = ippGetCollection(attr, i); if (i) { if (bufptr < bufend) *bufptr++ = ','; else bufptr ++; } if (bufptr < bufend) *bufptr++ = '{'; else bufptr ++; for (member = first = ippFirstAttribute(col); member; member = ippNextAttribute(col)) { const char *mname = ippGetName(member); if (member != first) { if (bufptr < bufend) *bufptr++ = ' '; else bufptr ++; } if (ippGetValueTag(member) == IPP_TAG_BOOLEAN) { if (!ippGetBoolean(member, 0)) { if (bufptr < bufend) strlcpy(bufptr, "no", (size_t)(bufend - bufptr + 1)); bufptr += 2; } if (bufptr < bufend) strlcpy(bufptr, mname, (size_t)(bufend - bufptr + 1)); bufptr += strlen(mname); continue; } if (bufptr < bufend) strlcpy(bufptr, mname, (size_t)(bufend - bufptr + 1)); bufptr += strlen(mname); if (bufptr < bufend) *bufptr++ = '='; else bufptr ++; if (ippGetValueTag(member) == IPP_TAG_BEGIN_COLLECTION) { /* * Convert sub-collection... */ bufptr += cups_collection_string(member, bufptr, bufptr < bufend ? (size_t)(bufend - bufptr + 1) : 0); } else { /* * Convert simple type... */ for (j = 0, mcount = ippGetCount(member); j < mcount; j ++) { if (j) { if (bufptr < bufend) *bufptr++ = ','; else bufptr ++; } switch (ippGetValueTag(member)) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : bufptr += snprintf(bufptr, bufptr < bufend ? (size_t)(bufend - bufptr + 1) : 0, "%d", ippGetInteger(member, j)); break; case IPP_TAG_STRING : if (bufptr < bufend) *bufptr++ = '\"'; else bufptr ++; for (mptr = (const char *)ippGetOctetString(member, j, &mlen); mlen > 0; mlen --, mptr ++) { if (*mptr == '\"' || *mptr == '\\') { if (bufptr < bufend) *bufptr++ = '\\'; else bufptr ++; } if (bufptr < bufend) *bufptr++ = *mptr; else bufptr ++; } if (bufptr < bufend) *bufptr++ = '\"'; else bufptr ++; break; case IPP_TAG_DATE : { unsigned year; /* Year */ const ipp_uchar_t *date = ippGetDate(member, j); /* Date value */ year = ((unsigned)date[0] << 8) + (unsigned)date[1]; if (date[9] == 0 && date[10] == 0) snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ", year, date[2], date[3], date[4], date[5], date[6]); else snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u", year, date[2], date[3], date[4], date[5], date[6], date[8], date[9], date[10]); if (bufptr < bufend) strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } break; case IPP_TAG_RESOLUTION : { int xres, /* Horizontal resolution */ yres; /* Vertical resolution */ ipp_res_t units; /* Resolution units */ xres = ippGetResolution(member, j, &yres, &units); if (xres == yres) snprintf(temp, sizeof(temp), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else snprintf(temp, sizeof(temp), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); if (bufptr < bufend) strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } break; case IPP_TAG_RANGE : { int lower, /* Lower bound */ upper; /* Upper bound */ lower = ippGetRange(member, j, &upper); snprintf(temp, sizeof(temp), "%d-%d", lower, upper); if (bufptr < bufend) strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : if (bufptr < bufend) *bufptr++ = '\"'; else bufptr ++; for (mptr = ippGetString(member, j, NULL); *mptr; mptr ++) { if (*mptr == '\"' || *mptr == '\\') { if (bufptr < bufend) *bufptr++ = '\\'; else bufptr ++; } if (bufptr < bufend) *bufptr++ = *mptr; else bufptr ++; } if (bufptr < bufend) *bufptr++ = '\"'; else bufptr ++; break; default : break; } } } } if (bufptr < bufend) *bufptr++ = '}'; else bufptr ++; } *bufptr = '\0'; return ((size_t)(bufptr - buffer + 1)); } /* * 'cups_compare_dconstres()' - Compare to resolver entries. */ static int /* O - Result of comparison */ cups_compare_dconstres( _cups_dconstres_t *a, /* I - First resolver */ _cups_dconstres_t *b) /* I - Second resolver */ { return (strcmp(a->name, b->name)); } /* * 'cups_compare_media_db()' - Compare two media entries. */ static int /* O - Result of comparison */ cups_compare_media_db( _cups_media_db_t *a, /* I - First media entries */ _cups_media_db_t *b) /* I - Second media entries */ { int result; /* Result of comparison */ if ((result = a->width - b->width) == 0) result = a->length - b->length; return (result); } /* * 'cups_copy_media_db()' - Copy a media entry. */ static _cups_media_db_t * /* O - New media entry */ cups_copy_media_db( _cups_media_db_t *mdb) /* I - Media entry to copy */ { _cups_media_db_t *temp; /* New media entry */ if ((temp = calloc(1, sizeof(_cups_media_db_t))) == NULL) return (NULL); if (mdb->color) temp->color = _cupsStrAlloc(mdb->color); if (mdb->key) temp->key = _cupsStrAlloc(mdb->key); if (mdb->info) temp->info = _cupsStrAlloc(mdb->info); if (mdb->size_name) temp->size_name = _cupsStrAlloc(mdb->size_name); if (mdb->source) temp->source = _cupsStrAlloc(mdb->source); if (mdb->type) temp->type = _cupsStrAlloc(mdb->type); temp->width = mdb->width; temp->length = mdb->length; temp->bottom = mdb->bottom; temp->left = mdb->left; temp->right = mdb->right; temp->top = mdb->top; return (temp); } /* * 'cups_create_cached()' - Create the media selection cache. */ static void cups_create_cached(http_t *http, /* I - Connection to destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags) /* I - Media selection flags */ { cups_array_t *db; /* Media database array to use */ _cups_media_db_t *mdb, /* Media database entry */ *first; /* First entry this size */ DEBUG_printf(("3cups_create_cached(http=%p, dinfo=%p, flags=%u)", (void *)http, (void *)dinfo, flags)); if (dinfo->cached_db) cupsArrayDelete(dinfo->cached_db); dinfo->cached_db = cupsArrayNew(NULL, NULL); dinfo->cached_flags = flags; if (flags & CUPS_MEDIA_FLAGS_READY) { DEBUG_puts("4cups_create_cached: ready media"); cups_update_ready(http, dinfo); db = dinfo->ready_db; } else { DEBUG_puts("4cups_create_cached: supported media"); if (!dinfo->media_db) cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_DEFAULT); db = dinfo->media_db; } for (mdb = (_cups_media_db_t *)cupsArrayFirst(db), first = mdb; mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { DEBUG_printf(("4cups_create_cached: %p key=\"%s\", type=\"%s\", %dx%d, B%d L%d R%d T%d", (void *)mdb, mdb->key, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top)); if (flags & CUPS_MEDIA_FLAGS_BORDERLESS) { if (!mdb->left && !mdb->right && !mdb->top && !mdb->bottom) { DEBUG_printf(("4cups_create_cached: add %p", (void *)mdb)); cupsArrayAdd(dinfo->cached_db, mdb); } } else if (flags & CUPS_MEDIA_FLAGS_DUPLEX) { if (first->width != mdb->width || first->length != mdb->length) { DEBUG_printf(("4cups_create_cached: add %p", (void *)first)); cupsArrayAdd(dinfo->cached_db, first); first = mdb; } else if (mdb->left >= first->left && mdb->right >= first->right && mdb->top >= first->top && mdb->bottom >= first->bottom && (mdb->left != first->left || mdb->right != first->right || mdb->top != first->top || mdb->bottom != first->bottom)) first = mdb; } else { DEBUG_printf(("4cups_create_cached: add %p", (void *)mdb)); cupsArrayAdd(dinfo->cached_db, mdb); } } if (flags & CUPS_MEDIA_FLAGS_DUPLEX) { DEBUG_printf(("4cups_create_cached: add %p", (void *)first)); cupsArrayAdd(dinfo->cached_db, first); } } /* * 'cups_create_constraints()' - Create the constraints and resolvers arrays. */ static void cups_create_constraints( cups_dinfo_t *dinfo) /* I - Destination information */ { int i; /* Looping var */ ipp_attribute_t *attr; /* Attribute */ _ipp_value_t *val; /* Current value */ dinfo->constraints = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)free); dinfo->resolvers = cupsArrayNew3((cups_array_func_t)cups_compare_dconstres, NULL, NULL, 0, NULL, (cups_afree_func_t)free); if ((attr = ippFindAttribute(dinfo->attrs, "job-constraints-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = attr->num_values, val = attr->values; i > 0; i --, val ++) cups_add_dconstres(dinfo->constraints, val->collection); } if ((attr = ippFindAttribute(dinfo->attrs, "job-resolvers-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = attr->num_values, val = attr->values; i > 0; i --, val ++) cups_add_dconstres(dinfo->resolvers, val->collection); } } /* * 'cups_create_defaults()' - Create the -default option array. */ static void cups_create_defaults( cups_dinfo_t *dinfo) /* I - Destination information */ { ipp_attribute_t *attr; /* Current attribute */ char name[IPP_MAX_NAME + 1], /* Current name */ *nameptr, /* Pointer into current name */ value[2048]; /* Current value */ /* * Iterate through the printer attributes looking for xxx-default and adding * xxx=value to the defaults option array. */ for (attr = ippFirstAttribute(dinfo->attrs); attr; attr = ippNextAttribute(dinfo->attrs)) { if (!ippGetName(attr) || ippGetGroupTag(attr) != IPP_TAG_PRINTER) continue; strlcpy(name, ippGetName(attr), sizeof(name)); if ((nameptr = name + strlen(name) - 8) <= name || strcmp(nameptr, "-default")) continue; *nameptr = '\0'; if (ippGetValueTag(attr) == IPP_TAG_BEGIN_COLLECTION) { if (cups_collection_string(attr, value, sizeof(value)) >= sizeof(value)) continue; } else if (ippAttributeString(attr, value, sizeof(value)) >= sizeof(value)) continue; dinfo->num_defaults = cupsAddOption(name, value, dinfo->num_defaults, &dinfo->defaults); } } /* * 'cups_create_media_db()' - Create the media database. */ static void cups_create_media_db( cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags) /* I - Media flags */ { int i; /* Looping var */ _ipp_value_t *val; /* Current value */ ipp_attribute_t *media_col_db, /* media-col-database */ *media_attr, /* media-xxx */ *x_dimension, /* x-dimension */ *y_dimension; /* y-dimension */ pwg_media_t *pwg; /* PWG media info */ cups_array_t *db; /* New media database array */ _cups_media_db_t mdb; /* Media entry */ char media_key[256]; /* Synthesized media-key value */ db = cupsArrayNew3((cups_array_func_t)cups_compare_media_db, NULL, NULL, 0, (cups_acopy_func_t)cups_copy_media_db, (cups_afree_func_t)cups_free_media_db); if (flags == CUPS_MEDIA_FLAGS_READY) { dinfo->ready_db = db; media_col_db = ippFindAttribute(dinfo->ready_attrs, "media-col-ready", IPP_TAG_BEGIN_COLLECTION); media_attr = ippFindAttribute(dinfo->ready_attrs, "media-ready", IPP_TAG_ZERO); } else { dinfo->media_db = db; dinfo->min_size.width = INT_MAX; dinfo->min_size.length = INT_MAX; dinfo->max_size.width = 0; dinfo->max_size.length = 0; media_col_db = ippFindAttribute(dinfo->attrs, "media-col-database", IPP_TAG_BEGIN_COLLECTION); media_attr = ippFindAttribute(dinfo->attrs, "media-supported", IPP_TAG_ZERO); } if (media_col_db) { _ipp_value_t *custom = NULL; /* Custom size range value */ for (i = media_col_db->num_values, val = media_col_db->values; i > 0; i --, val ++) { memset(&mdb, 0, sizeof(mdb)); if ((media_attr = ippFindAttribute(val->collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL) { ipp_t *media_size = media_attr->values[0].collection; /* media-size collection value */ if ((x_dimension = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER)) != NULL && (y_dimension = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER)) != NULL) { /* * Fixed size... */ mdb.width = x_dimension->values[0].integer; mdb.length = y_dimension->values[0].integer; } else if ((x_dimension = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER)) != NULL && (y_dimension = ippFindAttribute(media_size, "y-dimension", IPP_TAG_RANGE)) != NULL) { /* * Roll limits... */ mdb.width = x_dimension->values[0].integer; mdb.length = y_dimension->values[0].range.upper; } else if (flags != CUPS_MEDIA_FLAGS_READY && (x_dimension = ippFindAttribute(media_size, "x-dimension", IPP_TAG_RANGE)) != NULL && (y_dimension = ippFindAttribute(media_size, "y-dimension", IPP_TAG_RANGE)) != NULL) { /* * Custom size range; save this as the custom size value with default * margins, then continue; we'll capture the real margins below... */ custom = val; dinfo->min_size.width = x_dimension->values[0].range.lower; dinfo->min_size.length = y_dimension->values[0].range.lower; dinfo->min_size.left = dinfo->min_size.right = 635; /* Default 1/4" side margins */ dinfo->min_size.top = dinfo->min_size.bottom = 1270; /* Default 1/2" top/bottom margins */ dinfo->max_size.width = x_dimension->values[0].range.upper; dinfo->max_size.length = y_dimension->values[0].range.upper; dinfo->max_size.left = dinfo->max_size.right = 635; /* Default 1/4" side margins */ dinfo->max_size.top = dinfo->max_size.bottom = 1270; /* Default 1/2" top/bottom margins */ continue; } } if ((media_attr = ippFindAttribute(val->collection, "media-color", IPP_TAG_ZERO)) != NULL && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) mdb.color = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-info", IPP_TAG_TEXT)) != NULL) mdb.info = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-key", IPP_TAG_ZERO)) != NULL && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) mdb.key = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-size-name", IPP_TAG_ZERO)) != NULL && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) mdb.size_name = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-source", IPP_TAG_ZERO)) != NULL && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) mdb.source = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-type", IPP_TAG_ZERO)) != NULL && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) mdb.type = media_attr->values[0].string.text; if ((media_attr = ippFindAttribute(val->collection, "media-bottom-margin", IPP_TAG_INTEGER)) != NULL) mdb.bottom = media_attr->values[0].integer; if ((media_attr = ippFindAttribute(val->collection, "media-left-margin", IPP_TAG_INTEGER)) != NULL) mdb.left = media_attr->values[0].integer; if ((media_attr = ippFindAttribute(val->collection, "media-right-margin", IPP_TAG_INTEGER)) != NULL) mdb.right = media_attr->values[0].integer; if ((media_attr = ippFindAttribute(val->collection, "media-top-margin", IPP_TAG_INTEGER)) != NULL) mdb.top = media_attr->values[0].integer; if (!mdb.key) { if (!mdb.size_name && (pwg = pwgMediaForSize(mdb.width, mdb.length)) != NULL) mdb.size_name = (char *)pwg->pwg; if (!mdb.size_name) { /* * Use a CUPS-specific identifier if we don't have a size name... */ if (flags & CUPS_MEDIA_FLAGS_READY) snprintf(media_key, sizeof(media_key), "cups-media-ready-%d", i + 1); else snprintf(media_key, sizeof(media_key), "cups-media-%d", i + 1); } else if (mdb.source) { /* * Generate key using size name, source, and type (if set)... */ if (mdb.type) snprintf(media_key, sizeof(media_key), "%s_%s_%s", mdb.size_name, mdb.source, mdb.type); else snprintf(media_key, sizeof(media_key), "%s_%s", mdb.size_name, mdb.source); } else if (mdb.type) { /* * Generate key using size name and type... */ snprintf(media_key, sizeof(media_key), "%s_%s", mdb.size_name, mdb.type); } else { /* * Key is just the size name... */ strlcpy(media_key, mdb.size_name, sizeof(media_key)); } /* * Append "_borderless" for borderless media... */ if (!mdb.bottom && !mdb.left && !mdb.right && !mdb.top) strlcat(media_key, "_borderless", sizeof(media_key)); mdb.key = media_key; } DEBUG_printf(("1cups_create_media_db: Adding media: key=\"%s\", width=%d, length=%d, source=\"%s\", type=\"%s\".", mdb.key, mdb.width, mdb.length, mdb.source, mdb.type)); cupsArrayAdd(db, &mdb); } if (custom) { if ((media_attr = ippFindAttribute(custom->collection, "media-bottom-margin", IPP_TAG_INTEGER)) != NULL) { dinfo->min_size.top = dinfo->max_size.top = media_attr->values[0].integer; } if ((media_attr = ippFindAttribute(custom->collection, "media-left-margin", IPP_TAG_INTEGER)) != NULL) { dinfo->min_size.left = dinfo->max_size.left = media_attr->values[0].integer; } if ((media_attr = ippFindAttribute(custom->collection, "media-right-margin", IPP_TAG_INTEGER)) != NULL) { dinfo->min_size.right = dinfo->max_size.right = media_attr->values[0].integer; } if ((media_attr = ippFindAttribute(custom->collection, "media-top-margin", IPP_TAG_INTEGER)) != NULL) { dinfo->min_size.top = dinfo->max_size.top = media_attr->values[0].integer; } } } else if (media_attr && (media_attr->value_tag == IPP_TAG_NAME || media_attr->value_tag == IPP_TAG_NAMELANG || media_attr->value_tag == IPP_TAG_KEYWORD)) { memset(&mdb, 0, sizeof(mdb)); mdb.left = mdb.right = 635; /* Default 1/4" side margins */ mdb.top = mdb.bottom = 1270; /* Default 1/2" top/bottom margins */ for (i = media_attr->num_values, val = media_attr->values; i > 0; i --, val ++) { if ((pwg = pwgMediaForPWG(val->string.text)) == NULL) if ((pwg = pwgMediaForLegacy(val->string.text)) == NULL) { DEBUG_printf(("3cups_create_media_db: Ignoring unknown size '%s'.", val->string.text)); continue; } mdb.width = pwg->width; mdb.length = pwg->length; if (flags != CUPS_MEDIA_FLAGS_READY && !strncmp(val->string.text, "custom_min_", 11)) { mdb.size_name = NULL; dinfo->min_size = mdb; } else if (flags != CUPS_MEDIA_FLAGS_READY && !strncmp(val->string.text, "custom_max_", 11)) { mdb.size_name = NULL; dinfo->max_size = mdb; } else { mdb.size_name = val->string.text; cupsArrayAdd(db, &mdb); } } } } /* * 'cups_free_media_cb()' - Free a media entry. */ static void cups_free_media_db( _cups_media_db_t *mdb) /* I - Media entry to free */ { if (mdb->color) _cupsStrFree(mdb->color); if (mdb->key) _cupsStrFree(mdb->key); if (mdb->info) _cupsStrFree(mdb->info); if (mdb->size_name) _cupsStrFree(mdb->size_name); if (mdb->source) _cupsStrFree(mdb->source); if (mdb->type) _cupsStrFree(mdb->type); free(mdb); } /* * 'cups_get_media_db()' - Lookup the media entry for a given size. */ static int /* O - 1 on match, 0 on failure */ cups_get_media_db(http_t *http, /* I - Connection to destination */ cups_dinfo_t *dinfo, /* I - Destination information */ pwg_media_t *pwg, /* I - PWG media info */ unsigned flags, /* I - Media matching flags */ cups_size_t *size) /* O - Media size/margin/name info */ { cups_array_t *db; /* Which media database to query */ _cups_media_db_t *mdb, /* Current media database entry */ *best = NULL, /* Best matching entry */ key; /* Search key */ /* * Create the media database as needed... */ if (flags & CUPS_MEDIA_FLAGS_READY) { cups_update_ready(http, dinfo); db = dinfo->ready_db; } else { if (!dinfo->media_db) cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_DEFAULT); db = dinfo->media_db; } /* * Find a match... */ memset(&key, 0, sizeof(key)); key.width = pwg->width; key.length = pwg->length; if ((mdb = cupsArrayFind(db, &key)) != NULL) { /* * Found an exact match, let's figure out the best margins for the flags * supplied... */ best = mdb; if (flags & CUPS_MEDIA_FLAGS_BORDERLESS) { /* * Look for the smallest margins... */ if (best->left != 0 || best->right != 0 || best->top != 0 || best->bottom != 0) { for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && !cups_compare_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->left <= best->left && mdb->right <= best->right && mdb->top <= best->top && mdb->bottom <= best->bottom) { best = mdb; if (mdb->left == 0 && mdb->right == 0 && mdb->bottom == 0 && mdb->top == 0) break; } } } /* * If we need an exact match, return no-match if the size is not * borderless. */ if ((flags & CUPS_MEDIA_FLAGS_EXACT) && (best->left || best->right || best->top || best->bottom)) return (0); } else if (flags & CUPS_MEDIA_FLAGS_DUPLEX) { /* * Look for the largest margins... */ for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && !cups_compare_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->left >= best->left && mdb->right >= best->right && mdb->top >= best->top && mdb->bottom >= best->bottom && (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top)) best = mdb; } } else { /* * Look for the smallest non-zero margins... */ for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && !cups_compare_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) && ((mdb->right > 0 && mdb->right <= best->right) || best->right == 0) && ((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) && ((mdb->bottom > 0 && mdb->bottom <= best->bottom) || best->bottom == 0) && (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top)) best = mdb; } } } else if (flags & CUPS_MEDIA_FLAGS_EXACT) { /* * See if we can do this as a custom size... */ if (pwg->width < dinfo->min_size.width || pwg->width > dinfo->max_size.width || pwg->length < dinfo->min_size.length || pwg->length > dinfo->max_size.length) return (0); /* Out of range */ if ((flags & CUPS_MEDIA_FLAGS_BORDERLESS) && (dinfo->min_size.left > 0 || dinfo->min_size.right > 0 || dinfo->min_size.top > 0 || dinfo->min_size.bottom > 0)) return (0); /* Not borderless */ key.size_name = (char *)pwg->pwg; key.bottom = dinfo->min_size.bottom; key.left = dinfo->min_size.left; key.right = dinfo->min_size.right; key.top = dinfo->min_size.top; best = &key; } else if (pwg->width >= dinfo->min_size.width && pwg->width <= dinfo->max_size.width && pwg->length >= dinfo->min_size.length && pwg->length <= dinfo->max_size.length) { /* * Map to custom size... */ key.size_name = (char *)pwg->pwg; key.bottom = dinfo->min_size.bottom; key.left = dinfo->min_size.left; key.right = dinfo->min_size.right; key.top = dinfo->min_size.top; best = &key; } else { /* * Find a close size... */ for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) if (cups_is_close_media_db(mdb, &key)) break; if (!mdb) return (0); best = mdb; if (flags & CUPS_MEDIA_FLAGS_BORDERLESS) { /* * Look for the smallest margins... */ if (best->left != 0 || best->right != 0 || best->top != 0 || best->bottom != 0) { for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && cups_is_close_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->left <= best->left && mdb->right <= best->right && mdb->top <= best->top && mdb->bottom <= best->bottom && (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top)) { best = mdb; if (mdb->left == 0 && mdb->right == 0 && mdb->bottom == 0 && mdb->top == 0) break; } } } } else if (flags & CUPS_MEDIA_FLAGS_DUPLEX) { /* * Look for the largest margins... */ for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && cups_is_close_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->left >= best->left && mdb->right >= best->right && mdb->top >= best->top && mdb->bottom >= best->bottom && (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top)) best = mdb; } } else { /* * Look for the smallest non-zero margins... */ for (mdb = (_cups_media_db_t *)cupsArrayNext(db); mdb && cups_is_close_media_db(mdb, &key); mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (((mdb->left > 0 && mdb->left <= best->left) || best->left == 0) && ((mdb->right > 0 && mdb->right <= best->right) || best->right == 0) && ((mdb->top > 0 && mdb->top <= best->top) || best->top == 0) && ((mdb->bottom > 0 && mdb->bottom <= best->bottom) || best->bottom == 0) && (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top)) best = mdb; } } } if (best) { /* * Return the matching size... */ if (best->key) strlcpy(size->media, best->key, sizeof(size->media)); else if (best->size_name) strlcpy(size->media, best->size_name, sizeof(size->media)); else if (pwg && pwg->pwg) strlcpy(size->media, pwg->pwg, sizeof(size->media)); else strlcpy(size->media, "unknown", sizeof(size->media)); size->width = best->width; size->length = best->length; size->bottom = best->bottom; size->left = best->left; size->right = best->right; size->top = best->top; return (1); } return (0); } /* * 'cups_is_close_media_db()' - Compare two media entries to see if they are * close to the same size. * * Currently we use 5 points (from PostScript) as the matching range... */ static int /* O - 1 if the sizes are close */ cups_is_close_media_db( _cups_media_db_t *a, /* I - First media entries */ _cups_media_db_t *b) /* I - Second media entries */ { int dwidth, /* Difference in width */ dlength; /* Difference in length */ dwidth = a->width - b->width; dlength = a->length - b->length; return (dwidth >= -176 && dwidth <= 176 && dlength >= -176 && dlength <= 176); } /* * 'cups_test_constraints()' - Test constraints. */ static cups_array_t * /* O - Active constraints */ cups_test_constraints( cups_dinfo_t *dinfo, /* I - Destination information */ const char *new_option, /* I - Newly selected option */ const char *new_value, /* I - Newly selected value */ int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ int *num_conflicts, /* O - Number of conflicting options */ cups_option_t **conflicts) /* O - Conflicting options */ { int i, /* Looping var */ count, /* Number of values */ match; /* Value matches? */ int num_matching; /* Number of matching options */ cups_option_t *matching; /* Matching options */ _cups_dconstres_t *c; /* Current constraint */ cups_array_t *active = NULL; /* Active constraints */ ipp_t *col; /* Collection value */ ipp_attribute_t *attr; /* Current attribute */ _ipp_value_t *attrval; /* Current attribute value */ const char *value; /* Current value */ char temp[1024]; /* Temporary string */ int int_value; /* Integer value */ int xres_value, /* Horizontal resolution */ yres_value; /* Vertical resolution */ ipp_res_t units_value; /* Resolution units */ for (c = (_cups_dconstres_t *)cupsArrayFirst(dinfo->constraints); c; c = (_cups_dconstres_t *)cupsArrayNext(dinfo->constraints)) { num_matching = 0; matching = NULL; for (attr = ippFirstAttribute(c->collection); attr; attr = ippNextAttribute(c->collection)) { /* * Get the value for the current attribute in the constraint... */ if (new_option && new_value && !strcmp(attr->name, new_option)) value = new_value; else if ((value = cupsGetOption(attr->name, num_options, options)) == NULL) value = cupsGetOption(attr->name, dinfo->num_defaults, dinfo->defaults); if (!value) { /* * Not set so this constraint does not apply... */ break; } match = 0; switch (attr->value_tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : int_value = atoi(value); for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (attrval->integer == int_value) { match = 1; break; } } break; case IPP_TAG_BOOLEAN : int_value = !strcmp(value, "true"); for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (attrval->boolean == int_value) { match = 1; break; } } break; case IPP_TAG_RANGE : int_value = atoi(value); for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (int_value >= attrval->range.lower && int_value <= attrval->range.upper) { match = 1; break; } } break; case IPP_TAG_RESOLUTION : if (sscanf(value, "%dx%d%15s", &xres_value, &yres_value, temp) != 3) { if (sscanf(value, "%d%15s", &xres_value, temp) != 2) break; yres_value = xres_value; } if (!strcmp(temp, "dpi")) units_value = IPP_RES_PER_INCH; else if (!strcmp(temp, "dpc") || !strcmp(temp, "dpcm")) units_value = IPP_RES_PER_CM; else break; for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (attrval->resolution.xres == xres_value && attrval->resolution.yres == yres_value && attrval->resolution.units == units_value) { match = 1; break; } } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_CHARSET : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_MIMETYPE : case IPP_TAG_LANGUAGE : case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : for (i = attr->num_values, attrval = attr->values; i > 0; i --, attrval ++) { if (!strcmp(attrval->string.text, value)) { match = 1; break; } } break; case IPP_TAG_BEGIN_COLLECTION : col = ippNew(); _cupsEncodeOption(col, IPP_TAG_ZERO, NULL, ippGetName(attr), value); for (i = 0, count = ippGetCount(attr); i < count; i ++) { if (cups_collection_contains(col, ippGetCollection(attr, i))) { match = 1; break; } } ippDelete(col); break; default : break; } if (!match) break; num_matching = cupsAddOption(attr->name, value, num_matching, &matching); } if (!attr) { if (!active) active = cupsArrayNew(NULL, NULL); cupsArrayAdd(active, c); if (num_conflicts && conflicts) { cups_option_t *moption; /* Matching option */ for (i = num_matching, moption = matching; i > 0; i --, moption ++) *num_conflicts = cupsAddOption(moption->name, moption->value, *num_conflicts, conflicts); } } cupsFreeOptions(num_matching, matching); } return (active); } /* * 'cups_update_ready()' - Update xxx-ready attributes for the printer. */ static void cups_update_ready(http_t *http, /* I - Connection to destination */ cups_dinfo_t *dinfo) /* I - Destination information */ { ipp_t *request; /* Get-Printer-Attributes request */ static const char * const pattrs[] = /* Printer attributes we want */ { "finishings-col-ready", "finishings-ready", "job-finishings-col-ready", "job-finishings-ready", "media-col-ready", "media-ready" }; /* * Don't update more than once every 30 seconds... */ if ((time(NULL) - dinfo->ready_time) < _CUPS_MEDIA_READY_TTL) return; /* * Free any previous results... */ if (dinfo->cached_flags & CUPS_MEDIA_FLAGS_READY) { cupsArrayDelete(dinfo->cached_db); dinfo->cached_db = NULL; dinfo->cached_flags = CUPS_MEDIA_FLAGS_DEFAULT; } ippDelete(dinfo->ready_attrs); dinfo->ready_attrs = NULL; cupsArrayDelete(dinfo->ready_db); dinfo->ready_db = NULL; /* * Query the xxx-ready values... */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippSetVersion(request, dinfo->version / 10, dinfo->version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, dinfo->uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); dinfo->ready_attrs = cupsDoRequest(http, request, dinfo->resource); /* * Update the ready media database... */ cups_create_media_db(dinfo, CUPS_MEDIA_FLAGS_READY); /* * Update last lookup time and return... */ dinfo->ready_time = time(NULL); } cups-2.3.1/cups/raster-private.h000664 000765 000024 00000006132 13574721672 016674 0ustar00mikestaff000000 000000 /* * Private image library definitions for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 1993-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_RASTER_PRIVATE_H_ # define _CUPS_RASTER_PRIVATE_H_ /* * Include necessary headers... */ # include "raster.h" # include # include # include # ifdef _WIN32 # include # include /* for htonl() definition */ # else # include # include # endif /* _WIN32 */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Structure... */ struct _cups_raster_s /**** Raster stream data ****/ { unsigned sync; /* Sync word from start of stream */ void *ctx; /* File descriptor */ cups_raster_iocb_t iocb; /* IO callback */ cups_mode_t mode; /* Read/write mode */ cups_page_header2_t header; /* Raster header for current page */ unsigned rowheight, /* Row height in lines */ count, /* Current row run-length count */ remaining, /* Remaining rows in page image */ bpp; /* Bytes per pixel/color */ unsigned char *pixels, /* Pixels for current row */ *pend, /* End of pixel buffer */ *pcurrent; /* Current byte in pixel buffer */ int compressed, /* Non-zero if data is compressed */ swapped; /* Non-zero if data is byte-swapped */ unsigned char *buffer, /* Read/write buffer */ *bufptr, /* Current (read) position in buffer */ *bufend; /* End of current (read) buffer */ size_t bufsize; /* Buffer size */ # ifdef DEBUG size_t iostart, /* Start of read/write buffer */ iocount; /* Number of bytes read/written */ # endif /* DEBUG */ unsigned apple_page_count;/* Apple raster page count */ }; #if 0 /* * min/max macros... */ # ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) # endif /* !max */ # ifndef min # define min(a,b) ((a) < (b) ? (a) : (b)) # endif /* !min */ #endif // 0 /* * Prototypes... */ extern void _cupsRasterAddError(const char *f, ...) _CUPS_FORMAT(1,2) _CUPS_PRIVATE; extern void _cupsRasterClearError(void) _CUPS_PRIVATE; extern const char *_cupsRasterColorSpaceString(cups_cspace_t cspace) _CUPS_PRIVATE; extern void _cupsRasterDelete(cups_raster_t *r) _CUPS_PRIVATE; extern const char *_cupsRasterErrorString(void) _CUPS_PRIVATE; extern int _cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back) _CUPS_PRIVATE; extern cups_raster_t *_cupsRasterNew(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode) _CUPS_PRIVATE; extern unsigned _cupsRasterReadHeader(cups_raster_t *r) _CUPS_PRIVATE; extern unsigned _cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PRIVATE; extern unsigned _cupsRasterWriteHeader(cups_raster_t *r) _CUPS_PRIVATE; extern unsigned _cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PRIVATE; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_RASTER_PRIVATE_H_ */ cups-2.3.1/cups/rasterbench.c000664 000765 000024 00000015264 13574721672 016225 0ustar00mikestaff000000 000000 /* * Raster benchmark program for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include #include /* * Constants... */ #define TEST_WIDTH 1024 #define TEST_HEIGHT 1024 #define TEST_PAGES 16 #define TEST_PASSES 20 /* * Local functions... */ static double compute_median(double *secs); static double get_time(void); static void read_test(int fd); static int run_read_test(void); static void write_test(int fd, cups_mode_t mode); /* * 'main()' - Benchmark the raster read/write functions. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int ras_fd, /* File descriptor for read process */ status; /* Exit status of read process */ double start_secs, /* Start time */ write_secs, /* Write time */ read_secs, /* Read time */ pass_secs[TEST_PASSES]; /* Total test times */ cups_mode_t mode; /* Write mode */ /* * See if we have anything on the command-line... */ if (argc > 2 || (argc == 2 && strcmp(argv[1], "-z"))) { puts("Usage: rasterbench [-z]"); return (1); } mode = argc > 1 ? CUPS_RASTER_WRITE_COMPRESSED : CUPS_RASTER_WRITE; /* * Ignore SIGPIPE... */ signal(SIGPIPE, SIG_IGN); /* * Run the tests several times to get a good average... */ printf("Test read/write speed of %d pages, %dx%d pixels...\n\n", TEST_PAGES, TEST_WIDTH, TEST_HEIGHT); for (i = 0; i < TEST_PASSES; i ++) { printf("PASS %2d: ", i + 1); fflush(stdout); ras_fd = run_read_test(); start_secs = get_time(); write_test(ras_fd, mode); write_secs = get_time(); printf(" %.3f write,", write_secs - start_secs); fflush(stdout); close(ras_fd); wait(&status); read_secs = get_time(); pass_secs[i] = read_secs - start_secs; printf(" %.3f read, %.3f total\n", read_secs - write_secs, pass_secs[i]); } printf("\nMedian Total Time: %.3f seconds per document\n", compute_median(pass_secs)); return (0); } /* * 'compute_median()' - Compute the median time for a test. */ static double /* O - Median time in seconds */ compute_median(double *secs) /* I - Array of time samples */ { int i, j; /* Looping vars */ double temp; /* Swap variable */ /* * Sort the array into ascending order using a quicky bubble sort... */ for (i = 0; i < (TEST_PASSES - 1); i ++) for (j = i + 1; j < TEST_PASSES; j ++) if (secs[i] > secs[j]) { temp = secs[i]; secs[i] = secs[j]; secs[j] = temp; } /* * Return the average of the middle two samples... */ return (0.5 * (secs[TEST_PASSES / 2 - 1] + secs[TEST_PASSES / 2])); } /* * 'get_time()' - Get the current time in seconds. */ static double /* O - Time in seconds */ get_time(void) { struct timeval curtime; /* Current time */ gettimeofday(&curtime, NULL); return (curtime.tv_sec + 0.000001 * curtime.tv_usec); } /* * 'read_test()' - Benchmark the raster read functions. */ static void read_test(int fd) /* I - File descriptor to read from */ { unsigned y; /* Looping var */ cups_raster_t *r; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned char buffer[8 * TEST_WIDTH]; /* Read buffer */ /* * Test read speed... */ if ((r = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) { perror("Unable to create raster input stream"); return; } while (cupsRasterReadHeader2(r, &header)) { for (y = 0; y < header.cupsHeight; y ++) cupsRasterReadPixels(r, buffer, header.cupsBytesPerLine); } cupsRasterClose(r); } /* * 'run_read_test()' - Run the read test as a child process via pipes. */ static int /* O - Standard input of child */ run_read_test(void) { int ras_pipes[2]; /* Raster data pipes */ int pid; /* Child process ID */ if (pipe(ras_pipes)) return (-1); if ((pid = fork()) < 0) { /* * Fork error - return -1 on error... */ close(ras_pipes[0]); close(ras_pipes[1]); return (-1); } else if (pid == 0) { /* * Child comes here - read data from the input pipe... */ close(ras_pipes[1]); read_test(ras_pipes[0]); exit(0); } else { /* * Parent comes here - return the output pipe... */ close(ras_pipes[0]); return (ras_pipes[1]); } } /* * 'write_test()' - Benchmark the raster write functions. */ static void write_test(int fd, /* I - File descriptor to write to */ cups_mode_t mode) /* I - Write mode */ { unsigned page, x, y; /* Looping vars */ unsigned count; /* Number of bytes to set */ cups_raster_t *r; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned char data[32][8 * TEST_WIDTH]; /* Raster data to write */ /* * Create a combination of random data and repeated data to simulate * text with some whitespace. */ CUPS_SRAND(time(NULL)); memset(data, 0, sizeof(data)); for (y = 0; y < 28; y ++) { for (x = CUPS_RAND() & 127, count = (CUPS_RAND() & 15) + 1; x < sizeof(data[0]); x ++, count --) { if (count <= 0) { x += (CUPS_RAND() & 15) + 1; count = (CUPS_RAND() & 15) + 1; if (x >= sizeof(data[0])) break; } data[y][x] = (unsigned char)CUPS_RAND(); } } /* * Test write speed... */ if ((r = cupsRasterOpen(fd, mode)) == NULL) { perror("Unable to create raster output stream"); return; } for (page = 0; page < TEST_PAGES; page ++) { memset(&header, 0, sizeof(header)); header.cupsWidth = TEST_WIDTH; header.cupsHeight = TEST_HEIGHT; header.cupsBytesPerLine = TEST_WIDTH; if (page & 1) { header.cupsBytesPerLine *= 4; header.cupsColorSpace = CUPS_CSPACE_CMYK; header.cupsColorOrder = CUPS_ORDER_CHUNKED; } else { header.cupsColorSpace = CUPS_CSPACE_K; header.cupsColorOrder = CUPS_ORDER_BANDED; } if (page & 2) { header.cupsBytesPerLine *= 2; header.cupsBitsPerColor = 16; header.cupsBitsPerPixel = (page & 1) ? 64 : 16; } else { header.cupsBitsPerColor = 8; header.cupsBitsPerPixel = (page & 1) ? 32 : 8; } cupsRasterWriteHeader2(r, &header); for (y = 0; y < TEST_HEIGHT; y ++) cupsRasterWritePixels(r, data[y & 31], header.cupsBytesPerLine); } cupsRasterClose(r); } cups-2.3.1/cups/sidechannel.h000664 000765 000024 00000011665 13574721672 016210 0ustar00mikestaff000000 000000 /* * Side-channel API definitions for CUPS. * * 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. */ #ifndef _CUPS_SIDECHANNEL_H_ # define _CUPS_SIDECHANNEL_H_ /* * Include necessary headers... */ # include "versioning.h" # include # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include /* Windows does not support the ssize_t type, so map it to long... */ typedef long ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ #define CUPS_SC_FD 4 /* File descriptor for select/poll */ /* * Enumerations... */ enum cups_sc_bidi_e /**** Bidirectional capability values ****/ { CUPS_SC_BIDI_NOT_SUPPORTED = 0, /* Bidirectional I/O is not supported */ CUPS_SC_BIDI_SUPPORTED = 1 /* Bidirectional I/O is supported */ }; typedef enum cups_sc_bidi_e cups_sc_bidi_t; /**** Bidirectional capabilities ****/ enum cups_sc_command_e /**** Request command codes ****/ { CUPS_SC_CMD_NONE = 0, /* No command @private@ */ CUPS_SC_CMD_SOFT_RESET = 1, /* Do a soft reset */ CUPS_SC_CMD_DRAIN_OUTPUT = 2, /* Drain all pending output */ CUPS_SC_CMD_GET_BIDI = 3, /* Return bidirectional capabilities */ CUPS_SC_CMD_GET_DEVICE_ID = 4, /* Return the IEEE-1284 device ID */ CUPS_SC_CMD_GET_STATE = 5, /* Return the device state */ CUPS_SC_CMD_SNMP_GET = 6, /* Query an SNMP OID @since CUPS 1.4/macOS 10.6@ */ CUPS_SC_CMD_SNMP_GET_NEXT = 7, /* Query the next SNMP OID @since CUPS 1.4/macOS 10.6@ */ CUPS_SC_CMD_GET_CONNECTED = 8, /* Return whether the backend is "connected" to the printer @since CUPS 1.5/macOS 10.7@ */ CUPS_SC_CMD_MAX /* End of valid values @private@ */ }; typedef enum cups_sc_command_e cups_sc_command_t; /**** Request command codes ****/ enum cups_sc_connected_e /**** Connectivity values ****/ { CUPS_SC_NOT_CONNECTED = 0, /* Backend is not "connected" to printer */ CUPS_SC_CONNECTED = 1 /* Backend is "connected" to printer */ }; typedef enum cups_sc_connected_e cups_sc_connected_t; /**** Connectivity values ****/ enum cups_sc_state_e /**** Printer state bits ****/ { CUPS_SC_STATE_OFFLINE = 0, /* Device is offline */ CUPS_SC_STATE_ONLINE = 1, /* Device is online */ CUPS_SC_STATE_BUSY = 2, /* Device is busy */ CUPS_SC_STATE_ERROR = 4, /* Other error condition */ CUPS_SC_STATE_MEDIA_LOW = 16, /* Paper low condition */ CUPS_SC_STATE_MEDIA_EMPTY = 32, /* Paper out condition */ CUPS_SC_STATE_MARKER_LOW = 64, /* Toner/ink low condition */ CUPS_SC_STATE_MARKER_EMPTY = 128 /* Toner/ink out condition */ }; typedef enum cups_sc_state_e cups_sc_state_t; /**** Printer state bits ****/ enum cups_sc_status_e /**** Response status codes ****/ { CUPS_SC_STATUS_NONE, /* No status */ CUPS_SC_STATUS_OK, /* Operation succeeded */ CUPS_SC_STATUS_IO_ERROR, /* An I/O error occurred */ CUPS_SC_STATUS_TIMEOUT, /* The backend did not respond */ CUPS_SC_STATUS_NO_RESPONSE, /* The device did not respond */ CUPS_SC_STATUS_BAD_MESSAGE, /* The command/response message was invalid */ CUPS_SC_STATUS_TOO_BIG, /* Response too big */ CUPS_SC_STATUS_NOT_IMPLEMENTED /* Command not implemented */ }; typedef enum cups_sc_status_e cups_sc_status_t; /**** Response status codes ****/ typedef void (*cups_sc_walk_func_t)(const char *oid, const char *data, int datalen, void *context); /**** SNMP walk callback ****/ /* * Prototypes... */ /**** New in CUPS 1.2/macOS 10.5 ****/ extern ssize_t cupsBackChannelRead(char *buffer, size_t bytes, double timeout) _CUPS_API_1_2; extern ssize_t cupsBackChannelWrite(const char *buffer, size_t bytes, double timeout) _CUPS_API_1_2; /**** New in CUPS 1.3/macOS 10.5 ****/ extern cups_sc_status_t cupsSideChannelDoRequest(cups_sc_command_t command, char *data, int *datalen, double timeout) _CUPS_API_1_3; extern int cupsSideChannelRead(cups_sc_command_t *command, cups_sc_status_t *status, char *data, int *datalen, double timeout) _CUPS_API_1_3; extern int cupsSideChannelWrite(cups_sc_command_t command, cups_sc_status_t status, const char *data, int datalen, double timeout) _CUPS_API_1_3; /**** New in CUPS 1.4/macOS 10.6 ****/ extern cups_sc_status_t cupsSideChannelSNMPGet(const char *oid, char *data, int *datalen, double timeout) _CUPS_API_1_4; extern cups_sc_status_t cupsSideChannelSNMPWalk(const char *oid, double timeout, cups_sc_walk_func_t cb, void *context) _CUPS_API_1_4; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_SIDECHANNEL_H_ */ cups-2.3.1/cups/string-private.h000664 000765 000024 00000012751 13574721672 016706 0ustar00mikestaff000000 000000 /* * Private string definitions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_STRING_PRIVATE_H_ # define _CUPS_STRING_PRIVATE_H_ /* * Include necessary headers... */ # include "config.h" # include # include # include # include # include # include # include # include # ifdef HAVE_STRING_H # include # endif /* HAVE_STRING_H */ # ifdef HAVE_STRINGS_H # include # endif /* HAVE_STRINGS_H */ # ifdef HAVE_BSTRING_H # include # endif /* HAVE_BSTRING_H */ # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include /* Windows does not support the ssize_t type, so map it to long... */ typedef long ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * String pool structures... */ # define _CUPS_STR_GUARD 0x12344321 typedef struct _cups_sp_item_s /**** String Pool Item ****/ { # ifdef DEBUG_GUARDS unsigned int guard; /* Guard word */ # endif /* DEBUG_GUARDS */ unsigned int ref_count; /* Reference count */ char str[1]; /* String */ } _cups_sp_item_t; /* * Replacements for the ctype macros that are not affected by locale, since we * really only care about testing for ASCII characters when parsing files, etc. * * The _CUPS_INLINE definition controls whether we get an inline function body, * and external function body, or an external definition. */ # if defined(__GNUC__) || __STDC_VERSION__ >= 199901L # define _CUPS_INLINE static inline # elif defined(_MSC_VER) # define _CUPS_INLINE static __inline # elif defined(_CUPS_STRING_C_) # define _CUPS_INLINE # endif /* __GNUC__ || __STDC_VERSION__ */ # ifdef _CUPS_INLINE _CUPS_INLINE int /* O - 1 on match, 0 otherwise */ _cups_isalnum(int ch) /* I - Character to test */ { return ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')); } _CUPS_INLINE int /* O - 1 on match, 0 otherwise */ _cups_isalpha(int ch) /* I - Character to test */ { return ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')); } _CUPS_INLINE int /* O - 1 on match, 0 otherwise */ _cups_islower(int ch) /* I - Character to test */ { return (ch >= 'a' && ch <= 'z'); } _CUPS_INLINE int /* O - 1 on match, 0 otherwise */ _cups_isspace(int ch) /* I - Character to test */ { return (ch == ' ' || ch == '\f' || ch == '\n' || ch == '\r' || ch == '\t' || ch == '\v'); } _CUPS_INLINE int /* O - 1 on match, 0 otherwise */ _cups_isupper(int ch) /* I - Character to test */ { return (ch >= 'A' && ch <= 'Z'); } _CUPS_INLINE int /* O - Converted character */ _cups_tolower(int ch) /* I - Character to convert */ { return (_cups_isupper(ch) ? ch - 'A' + 'a' : ch); } _CUPS_INLINE int /* O - Converted character */ _cups_toupper(int ch) /* I - Character to convert */ { return (_cups_islower(ch) ? ch - 'a' + 'A' : ch); } # else extern int _cups_isalnum(int ch); extern int _cups_isalpha(int ch); extern int _cups_islower(int ch); extern int _cups_isspace(int ch); extern int _cups_isupper(int ch); extern int _cups_tolower(int ch); extern int _cups_toupper(int ch); # endif /* _CUPS_INLINE */ /* * Prototypes... */ extern ssize_t _cups_safe_vsnprintf(char *buffer, size_t bufsize, const char *format, va_list args) _CUPS_PRIVATE; extern void _cups_strcpy(char *dst, const char *src) _CUPS_PRIVATE; # ifndef HAVE_STRDUP extern char *_cups_strdup(const char *) _CUPS_PRIVATE; # define strdup _cups_strdup # endif /* !HAVE_STRDUP */ extern int _cups_strcasecmp(const char *, const char *) _CUPS_PRIVATE; extern int _cups_strncasecmp(const char *, const char *, size_t n) _CUPS_PRIVATE; # ifndef HAVE_STRLCAT extern size_t _cups_strlcat(char *, const char *, size_t) _CUPS_PRIVATE; # define strlcat _cups_strlcat # endif /* !HAVE_STRLCAT */ # ifndef HAVE_STRLCPY extern size_t _cups_strlcpy(char *, const char *, size_t) _CUPS_PRIVATE; # define strlcpy _cups_strlcpy # endif /* !HAVE_STRLCPY */ # ifndef HAVE_SNPRINTF extern int _cups_snprintf(char *, size_t, const char *, ...) _CUPS_FORMAT(3, 4) _CUPS_PRIVATE; # define snprintf _cups_snprintf # endif /* !HAVE_SNPRINTF */ # ifndef HAVE_VSNPRINTF extern int _cups_vsnprintf(char *, size_t, const char *, va_list) _CUPS_PRIVATE; # define vsnprintf _cups_vsnprintf # endif /* !HAVE_VSNPRINTF */ /* * String pool functions... */ extern char *_cupsStrAlloc(const char *s) _CUPS_PRIVATE; extern void _cupsStrFlush(void) _CUPS_PRIVATE; extern void _cupsStrFree(const char *s) _CUPS_PRIVATE; extern char *_cupsStrRetain(const char *s) _CUPS_PRIVATE; extern size_t _cupsStrStatistics(size_t *alloc_bytes, size_t *total_bytes) _CUPS_PRIVATE; /* * Floating point number functions... */ extern char *_cupsStrFormatd(char *buf, char *bufend, double number, struct lconv *loc) _CUPS_PRIVATE; extern double _cupsStrScand(const char *buf, char **bufptr, struct lconv *loc) _CUPS_PRIVATE; /* * Date function... */ extern char *_cupsStrDate(char *buf, size_t bufsize, time_t timeval) _CUPS_PRIVATE; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_STRING_H_ */ cups-2.3.1/cups/md5.c000664 000765 000024 00000023676 13574721672 014420 0ustar00mikestaff000000 000000 /* * Private MD5 implementation for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 2005 by Easy Software Products * Copyright (C) 1999 Aladdin Enterprises. All rights reserved. * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 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. * * L. Peter Deutsch * ghost@aladdin.com */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321. It is derived directly from the text of the RFC and not from the reference implementation. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ #include "md5-internal.h" #include "string-private.h" #if !defined(__APPLE__) # define T1 0xd76aa478 # define T2 0xe8c7b756 # define T3 0x242070db # define T4 0xc1bdceee # define T5 0xf57c0faf # define T6 0x4787c62a # define T7 0xa8304613 # define T8 0xfd469501 # define T9 0x698098d8 # define T10 0x8b44f7af # define T11 0xffff5bb1 # define T12 0x895cd7be # define T13 0x6b901122 # define T14 0xfd987193 # define T15 0xa679438e # define T16 0x49b40821 # define T17 0xf61e2562 # define T18 0xc040b340 # define T19 0x265e5a51 # define T20 0xe9b6c7aa # define T21 0xd62f105d # define T22 0x02441453 # define T23 0xd8a1e681 # define T24 0xe7d3fbc8 # define T25 0x21e1cde6 # define T26 0xc33707d6 # define T27 0xf4d50d87 # define T28 0x455a14ed # define T29 0xa9e3e905 # define T30 0xfcefa3f8 # define T31 0x676f02d9 # define T32 0x8d2a4c8a # define T33 0xfffa3942 # define T34 0x8771f681 # define T35 0x6d9d6122 # define T36 0xfde5380c # define T37 0xa4beea44 # define T38 0x4bdecfa9 # define T39 0xf6bb4b60 # define T40 0xbebfbc70 # define T41 0x289b7ec6 # define T42 0xeaa127fa # define T43 0xd4ef3085 # define T44 0x04881d05 # define T45 0xd9d4d039 # define T46 0xe6db99e5 # define T47 0x1fa27cf8 # define T48 0xc4ac5665 # define T49 0xf4292244 # define T50 0x432aff97 # define T51 0xab9423a7 # define T52 0xfc93a039 # define T53 0x655b59c3 # define T54 0x8f0ccc92 # define T55 0xffeff47d # define T56 0x85845dd1 # define T57 0x6fa87e4f # define T58 0xfe2ce6e0 # define T59 0xa3014314 # define T60 0x4e0811a1 # define T61 0xf7537e82 # define T62 0xbd3af235 # define T63 0x2ad7d2bb # define T64 0xeb86d391 static void _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/) { unsigned int a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; unsigned int t; # ifndef ARCH_IS_BIG_ENDIAN # define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */ # endif # if ARCH_IS_BIG_ENDIAN /* * On big-endian machines, we must arrange the bytes in the right * order. (This also works on machines of unknown byte order.) */ unsigned int X[16]; const unsigned char *xp = data; int i; for (i = 0; i < 16; ++i, xp += 4) X[i] = (unsigned)xp[0] + ((unsigned)xp[1] << 8) + ((unsigned)xp[2] << 16) + ((unsigned)xp[3] << 24); # else /* !ARCH_IS_BIG_ENDIAN */ /* * On little-endian machines, we can process properly aligned data * without copying it. */ unsigned int xbuf[16]; const unsigned int *X; if (!((data - (const unsigned char *)0) & 3)) { /* data are properly aligned */ X = (const unsigned int *)data; } else { /* not aligned */ memcpy(xbuf, data, 64); X = xbuf; } # endif # define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ # define F(x, y, z) (((x) & (y)) | (~(x) & (z))) # define SET(a, b, c, d, k, s, Ti)\ t = a + F(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); # undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ # define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) # define SET(a, b, c, d, k, s, Ti)\ t = a + G(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); # undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ # define H(x, y, z) ((x) ^ (y) ^ (z)) # define SET(a, b, c, d, k, s, Ti)\ t = a + H(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); # undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ # define I(x, y, z) ((y) ^ ((x) | ~(z))) # define SET(a, b, c, d, k, s, Ti)\ t = a + I(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); # undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ pms->abcd[0] += a; pms->abcd[1] += b; pms->abcd[2] += c; pms->abcd[3] += d; } void _cupsMD5Init(_cups_md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = 0xefcdab89; pms->abcd[2] = 0x98badcfe; pms->abcd[3] = 0x10325476; } void _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes) { const unsigned char *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; unsigned int nbits = (unsigned int)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += (unsigned)nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); memcpy(pms->buf + offset, p, (size_t)copy); if (offset + copy < 64) return; p += copy; left -= copy; _cups_md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) _cups_md5_process(pms, p); /* Process a final partial block. */ if (left) memcpy(pms->buf, p, (size_t)left); } void _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]) { static const unsigned char pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; unsigned char data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (unsigned char)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ _cupsMD5Append(pms, pad, (int)((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ _cupsMD5Append(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (unsigned char)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } #endif /* !__APPLE__ */ cups-2.3.1/cups/language.c000664 000765 000024 00000126742 13574721672 015514 0ustar00mikestaff000000 000000 /* * I18N/language support for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #ifdef HAVE_LANGINFO_H # include #endif /* HAVE_LANGINFO_H */ #ifdef _WIN32 # include #else # include #endif /* _WIN32 */ #ifdef HAVE_COREFOUNDATION_H # include #endif /* HAVE_COREFOUNDATION_H */ /* * Local globals... */ static _cups_mutex_t lang_mutex = _CUPS_MUTEX_INITIALIZER; /* Mutex to control access to cache */ static cups_lang_t *lang_cache = NULL; /* Language string cache */ static const char * const lang_encodings[] = { /* Encoding strings */ "us-ascii", "iso-8859-1", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-9", "iso-8859-10", "utf-8", "iso-8859-13", "iso-8859-14", "iso-8859-15", "cp874", "cp1250", "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257", "cp1258", "koi8-r", "koi8-u", "iso-8859-11", "iso-8859-16", "mac", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "cp932", "cp936", "cp949", "cp950", "cp1361", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", "euc-cn", "euc-jp", "euc-kr", "euc-tw", "shift_jisx0213" }; #ifdef __APPLE__ typedef struct { const char * const language; /* Language ID */ const char * const locale; /* Locale ID */ } _apple_language_locale_t; static const _apple_language_locale_t apple_language_locale[] = { /* Language to locale ID LUT */ { "en", "en_US" }, { "nb", "no" }, { "nb_NO", "no" }, { "zh-Hans", "zh_CN" }, { "zh_HANS", "zh_CN" }, { "zh-Hant", "zh_TW" }, { "zh_HANT", "zh_TW" }, { "zh-Hant_CN", "zh_TW" } }; #endif /* __APPLE__ */ /* * Local functions... */ #ifdef __APPLE__ static const char *appleLangDefault(void); # ifdef CUPS_BUNDLEDIR # ifndef CF_RETURNS_RETAINED # if __has_feature(attribute_cf_returns_retained) # define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) # else # define CF_RETURNS_RETAINED # endif /* __has_feature(attribute_cf_returns_retained) */ # endif /* !CF_RETURNED_RETAINED */ static cups_array_t *appleMessageLoad(const char *locale) CF_RETURNS_RETAINED; # endif /* CUPS_BUNDLEDIR */ #endif /* __APPLE__ */ static cups_lang_t *cups_cache_lookup(const char *name, cups_encoding_t encoding); static int cups_message_compare(_cups_message_t *m1, _cups_message_t *m2); static void cups_message_free(_cups_message_t *m); static void cups_message_load(cups_lang_t *lang); static void cups_message_puts(cups_file_t *fp, const char *s); static int cups_read_strings(cups_file_t *fp, int flags, cups_array_t *a); static void cups_unquote(char *d, const char *s); #ifdef __APPLE__ /* * '_cupsAppleLanguage()' - Get the Apple language identifier associated with a * locale ID. */ const char * /* O - Language ID */ _cupsAppleLanguage(const char *locale, /* I - Locale ID */ char *language,/* I - Language ID buffer */ size_t langsize) /* I - Size of language ID buffer */ { int i; /* Looping var */ CFStringRef localeid, /* CF locale identifier */ langid; /* CF language identifier */ /* * Copy the locale name and convert, as needed, to the Apple-specific * locale identifier... */ switch (strlen(locale)) { default : /* * Invalid locale... */ strlcpy(language, "en", langsize); break; case 2 : strlcpy(language, locale, langsize); break; case 5 : strlcpy(language, locale, langsize); if (language[2] == '-') { /* * Convert ll-cc to ll_CC... */ language[2] = '_'; language[3] = (char)toupper(language[3] & 255); language[4] = (char)toupper(language[4] & 255); } break; } for (i = 0; i < (int)(sizeof(apple_language_locale) / sizeof(apple_language_locale[0])); i ++) if (!strcmp(locale, apple_language_locale[i].locale)) { strlcpy(language, apple_language_locale[i].language, sizeof(language)); break; } /* * Attempt to map the locale ID to a language ID... */ if ((localeid = CFStringCreateWithCString(kCFAllocatorDefault, language, kCFStringEncodingASCII)) != NULL) { if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString( kCFAllocatorDefault, localeid)) != NULL) { CFStringGetCString(langid, language, (CFIndex)langsize, kCFStringEncodingASCII); CFRelease(langid); } CFRelease(localeid); } /* * Return what we got... */ return (language); } /* * '_cupsAppleLocale()' - Get the locale associated with an Apple language ID. */ const char * /* O - Locale */ _cupsAppleLocale(CFStringRef languageName, /* I - Apple language ID */ char *locale, /* I - Buffer for locale */ size_t localesize) /* I - Size of buffer */ { int i; /* Looping var */ CFStringRef localeName; /* Locale as a CF string */ #ifdef DEBUG char temp[1024]; /* Temporary string */ if (!CFStringGetCString(languageName, temp, (CFIndex)sizeof(temp), kCFStringEncodingASCII)) temp[0] = '\0'; DEBUG_printf(("_cupsAppleLocale(languageName=%p(%s), locale=%p, localsize=%d)", (void *)languageName, temp, (void *)locale, (int)localesize)); #endif /* DEBUG */ localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, languageName); if (localeName) { /* * Copy the locale name and tweak as needed... */ if (!CFStringGetCString(localeName, locale, (CFIndex)localesize, kCFStringEncodingASCII)) *locale = '\0'; DEBUG_printf(("_cupsAppleLocale: locale=\"%s\"", locale)); CFRelease(localeName); /* * Map new language identifiers to locales... */ for (i = 0; i < (int)(sizeof(apple_language_locale) / sizeof(apple_language_locale[0])); i ++) { size_t len = strlen(apple_language_locale[i].language); if (!strcmp(locale, apple_language_locale[i].language) || (!strncmp(locale, apple_language_locale[i].language, len) && (locale[len] == '_' || locale[len] == '-'))) { DEBUG_printf(("_cupsAppleLocale: Updating locale to \"%s\".", apple_language_locale[i].locale)); strlcpy(locale, apple_language_locale[i].locale, localesize); break; } } } else { /* * Just try the Apple language name... */ if (!CFStringGetCString(languageName, locale, (CFIndex)localesize, kCFStringEncodingASCII)) *locale = '\0'; } if (!*locale) { DEBUG_puts("_cupsAppleLocale: Returning NULL."); return (NULL); } /* * Convert language subtag into region subtag... */ if (locale[2] == '-') locale[2] = '_'; else if (locale[3] == '-') locale[3] = '_'; if (!strchr(locale, '.')) strlcat(locale, ".UTF-8", localesize); DEBUG_printf(("_cupsAppleLocale: Returning \"%s\".", locale)); return (locale); } #endif /* __APPLE__ */ /* * '_cupsEncodingName()' - Return the character encoding name string * for the given encoding enumeration. */ const char * /* O - Character encoding */ _cupsEncodingName( cups_encoding_t encoding) /* I - Encoding value */ { if (encoding < CUPS_US_ASCII || encoding >= (cups_encoding_t)(sizeof(lang_encodings) / sizeof(lang_encodings[0]))) { DEBUG_printf(("1_cupsEncodingName(encoding=%d) = out of range (\"%s\")", encoding, lang_encodings[0])); return (lang_encodings[0]); } else { DEBUG_printf(("1_cupsEncodingName(encoding=%d) = \"%s\"", encoding, lang_encodings[encoding])); return (lang_encodings[encoding]); } } /* * 'cupsLangDefault()' - Return the default language. */ cups_lang_t * /* O - Language data */ cupsLangDefault(void) { return (cupsLangGet(NULL)); } /* * 'cupsLangEncoding()' - Return the character encoding (us-ascii, etc.) * for the given language. */ const char * /* O - Character encoding */ cupsLangEncoding(cups_lang_t *lang) /* I - Language data */ { if (lang == NULL) return ((char*)lang_encodings[0]); else return ((char*)lang_encodings[lang->encoding]); } /* * 'cupsLangFlush()' - Flush all language data out of the cache. */ void cupsLangFlush(void) { cups_lang_t *lang, /* Current language */ *next; /* Next language */ /* * Free all languages in the cache... */ _cupsMutexLock(&lang_mutex); for (lang = lang_cache; lang != NULL; lang = next) { /* * Free all messages... */ _cupsMessageFree(lang->strings); /* * Then free the language structure itself... */ next = lang->next; free(lang); } lang_cache = NULL; _cupsMutexUnlock(&lang_mutex); } /* * 'cupsLangFree()' - Free language data. * * This does not actually free anything; use @link cupsLangFlush@ for that. */ void cupsLangFree(cups_lang_t *lang) /* I - Language to free */ { _cupsMutexLock(&lang_mutex); if (lang != NULL && lang->used > 0) lang->used --; _cupsMutexUnlock(&lang_mutex); } /* * 'cupsLangGet()' - Get a language. */ cups_lang_t * /* O - Language data */ cupsLangGet(const char *language) /* I - Language or locale */ { int i; /* Looping var */ #ifndef __APPLE__ char locale[255]; /* Copy of locale name */ #endif /* !__APPLE__ */ char langname[16], /* Requested language name */ country[16], /* Country code */ charset[16], /* Character set */ *csptr, /* Pointer to CODESET string */ *ptr, /* Pointer into language/charset */ real[48]; /* Real language name */ cups_encoding_t encoding; /* Encoding to use */ cups_lang_t *lang; /* Current language... */ static const char * const locale_encodings[] = { /* Locale charset names */ "ASCII", "ISO88591", "ISO88592", "ISO88593", "ISO88594", "ISO88595", "ISO88596", "ISO88597", "ISO88598", "ISO88599", "ISO885910", "UTF8", "ISO885913", "ISO885914", "ISO885915", "CP874", "CP1250", "CP1251", "CP1252", "CP1253", "CP1254", "CP1255", "CP1256", "CP1257", "CP1258", "KOI8R", "KOI8U", "ISO885911", "ISO885916", "MACROMAN", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "CP932", "CP936", "CP949", "CP950", "CP1361", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "EUCCN", "EUCJP", "EUCKR", "EUCTW", "SHIFT_JISX0213" }; DEBUG_printf(("2cupsLangGet(language=\"%s\")", language)); #ifdef __APPLE__ /* * Set the character set to UTF-8... */ strlcpy(charset, "UTF8", sizeof(charset)); /* * Apple's setlocale doesn't give us the user's localization * preference so we have to look it up this way... */ if (!language) { if (!getenv("SOFTWARE") || (language = getenv("LANG")) == NULL) language = appleLangDefault(); DEBUG_printf(("4cupsLangGet: language=\"%s\"", language)); } #else /* * Set the charset to "unknown"... */ charset[0] = '\0'; /* * Use setlocale() to determine the currently set locale, and then * fallback to environment variables to avoid setting the locale, * since setlocale() is not thread-safe! */ if (!language) { /* * First see if the locale has been set; if it is still "C" or * "POSIX", use the environment to get the default... */ # ifdef LC_MESSAGES ptr = setlocale(LC_MESSAGES, NULL); # else ptr = setlocale(LC_ALL, NULL); # endif /* LC_MESSAGES */ DEBUG_printf(("4cupsLangGet: current locale is \"%s\"", ptr)); if (!ptr || !strcmp(ptr, "C") || !strcmp(ptr, "POSIX")) { /* * Get the character set from the LC_CTYPE locale setting... */ if ((ptr = getenv("LC_CTYPE")) == NULL) if ((ptr = getenv("LC_ALL")) == NULL) if ((ptr = getenv("LANG")) == NULL) ptr = "en_US"; if ((csptr = strchr(ptr, '.')) != NULL) { /* * Extract the character set from the environment... */ for (ptr = charset, csptr ++; *csptr; csptr ++) if (ptr < (charset + sizeof(charset) - 1) && _cups_isalnum(*csptr)) *ptr++ = *csptr; *ptr = '\0'; } /* * Get the locale for messages from the LC_MESSAGES locale setting... */ if ((ptr = getenv("LC_MESSAGES")) == NULL) if ((ptr = getenv("LC_ALL")) == NULL) if ((ptr = getenv("LANG")) == NULL) ptr = "en_US"; } if (ptr) { strlcpy(locale, ptr, sizeof(locale)); language = locale; /* * CUPS STR #2575: Map "nb" to "no" for back-compatibility... */ if (!strncmp(locale, "nb", 2)) locale[1] = 'o'; DEBUG_printf(("4cupsLangGet: new language value is \"%s\"", language)); } } #endif /* __APPLE__ */ /* * If "language" is NULL at this point, then chances are we are using * a language that is not installed for the base OS. */ if (!language) { /* * Switch to the POSIX ("C") locale... */ language = "C"; } #ifdef CODESET /* * On systems that support the nl_langinfo(CODESET) call, use * this value as the character set... */ if (!charset[0] && (csptr = nl_langinfo(CODESET)) != NULL) { /* * Copy all of the letters and numbers in the CODESET string... */ for (ptr = charset; *csptr; csptr ++) if (_cups_isalnum(*csptr) && ptr < (charset + sizeof(charset) - 1)) *ptr++ = *csptr; *ptr = '\0'; DEBUG_printf(("4cupsLangGet: charset set to \"%s\" via " "nl_langinfo(CODESET)...", charset)); } #endif /* CODESET */ /* * If we don't have a character set by now, default to UTF-8... */ if (!charset[0]) strlcpy(charset, "UTF8", sizeof(charset)); /* * Parse the language string passed in to a locale string. "C" is the * standard POSIX locale and is copied unchanged. Otherwise the * language string is converted from ll-cc[.charset] (language-country) * to ll_CC[.CHARSET] to match the file naming convention used by all * POSIX-compliant operating systems. Invalid language names are mapped * to the POSIX locale. */ country[0] = '\0'; if (language == NULL || !language[0] || !strcmp(language, "POSIX")) strlcpy(langname, "C", sizeof(langname)); else { /* * Copy the parts of the locale string over safely... */ for (ptr = langname; *language; language ++) if (*language == '_' || *language == '-' || *language == '.') break; else if (ptr < (langname + sizeof(langname) - 1)) *ptr++ = (char)tolower(*language & 255); *ptr = '\0'; if (*language == '_' || *language == '-') { /* * Copy the country code... */ for (language ++, ptr = country; *language; language ++) if (*language == '.') break; else if (ptr < (country + sizeof(country) - 1)) *ptr++ = (char)toupper(*language & 255); *ptr = '\0'; /* * Map Chinese region codes to legacy country codes. */ if (!strcmp(language, "zh") && !strcmp(country, "HANS")) strlcpy(country, "CN", sizeof(country)); if (!strcmp(language, "zh") && !strcmp(country, "HANT")) strlcpy(country, "TW", sizeof(country)); } if (*language == '.' && !charset[0]) { /* * Copy the encoding... */ for (language ++, ptr = charset; *language; language ++) if (_cups_isalnum(*language) && ptr < (charset + sizeof(charset) - 1)) *ptr++ = (char)toupper(*language & 255); *ptr = '\0'; } /* * Force a POSIX locale for an invalid language name... */ if (strlen(langname) != 2 && strlen(langname) != 3) { strlcpy(langname, "C", sizeof(langname)); country[0] = '\0'; charset[0] = '\0'; } } DEBUG_printf(("4cupsLangGet: langname=\"%s\", country=\"%s\", charset=\"%s\"", langname, country, charset)); /* * Figure out the desired encoding... */ encoding = CUPS_AUTO_ENCODING; if (charset[0]) { for (i = 0; i < (int)(sizeof(locale_encodings) / sizeof(locale_encodings[0])); i ++) if (!_cups_strcasecmp(charset, locale_encodings[i])) { encoding = (cups_encoding_t)i; break; } if (encoding == CUPS_AUTO_ENCODING) { /* * Map alternate names for various character sets... */ if (!_cups_strcasecmp(charset, "iso-2022-jp") || !_cups_strcasecmp(charset, "sjis")) encoding = CUPS_WINDOWS_932; else if (!_cups_strcasecmp(charset, "iso-2022-cn")) encoding = CUPS_WINDOWS_936; else if (!_cups_strcasecmp(charset, "iso-2022-kr")) encoding = CUPS_WINDOWS_949; else if (!_cups_strcasecmp(charset, "big5")) encoding = CUPS_WINDOWS_950; } } DEBUG_printf(("4cupsLangGet: encoding=%d(%s)", encoding, encoding == CUPS_AUTO_ENCODING ? "auto" : lang_encodings[encoding])); /* * See if we already have this language/country loaded... */ if (country[0]) snprintf(real, sizeof(real), "%s_%s", langname, country); else strlcpy(real, langname, sizeof(real)); _cupsMutexLock(&lang_mutex); if ((lang = cups_cache_lookup(real, encoding)) != NULL) { _cupsMutexUnlock(&lang_mutex); DEBUG_printf(("3cupsLangGet: Using cached copy of \"%s\"...", real)); return (lang); } /* * See if there is a free language available; if so, use that * record... */ for (lang = lang_cache; lang != NULL; lang = lang->next) if (lang->used == 0) break; if (lang == NULL) { /* * Allocate memory for the language and add it to the cache. */ if ((lang = calloc(sizeof(cups_lang_t), 1)) == NULL) { _cupsMutexUnlock(&lang_mutex); return (NULL); } lang->next = lang_cache; lang_cache = lang; } else { /* * Free all old strings as needed... */ _cupsMessageFree(lang->strings); lang->strings = NULL; } /* * Then assign the language and encoding fields... */ lang->used ++; strlcpy(lang->language, real, sizeof(lang->language)); if (encoding != CUPS_AUTO_ENCODING) lang->encoding = encoding; else lang->encoding = CUPS_UTF8; /* * Return... */ _cupsMutexUnlock(&lang_mutex); return (lang); } /* * '_cupsLangString()' - Get a message string. * * The returned string is UTF-8 encoded; use cupsUTF8ToCharset() to * convert the string to the language encoding. */ const char * /* O - Localized message */ _cupsLangString(cups_lang_t *lang, /* I - Language */ const char *message) /* I - Message */ { const char *s; /* Localized message */ DEBUG_printf(("_cupsLangString(lang=%p, message=\"%s\")", (void *)lang, message)); /* * Range check input... */ if (!lang || !message || !*message) return (message); _cupsMutexLock(&lang_mutex); /* * Load the message catalog if needed... */ if (!lang->strings) cups_message_load(lang); s = _cupsMessageLookup(lang->strings, message); _cupsMutexUnlock(&lang_mutex); return (s); } /* * '_cupsMessageFree()' - Free a messages array. */ void _cupsMessageFree(cups_array_t *a) /* I - Message array */ { #if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) /* * Release the cups.strings dictionary as needed... */ if (cupsArrayUserData(a)) CFRelease((CFDictionaryRef)cupsArrayUserData(a)); #endif /* __APPLE__ && CUPS_BUNDLEDIR */ /* * Free the array... */ cupsArrayDelete(a); } /* * '_cupsMessageLoad()' - Load a .po or .strings file into a messages array. */ cups_array_t * /* O - New message array */ _cupsMessageLoad(const char *filename, /* I - Message catalog to load */ int flags) /* I - Load flags */ { cups_file_t *fp; /* Message file */ cups_array_t *a; /* Message array */ _cups_message_t *m; /* Current message */ char s[4096], /* String buffer */ *ptr, /* Pointer into buffer */ *temp; /* New string */ size_t length, /* Length of combined strings */ ptrlen; /* Length of string */ DEBUG_printf(("4_cupsMessageLoad(filename=\"%s\")", filename)); /* * Create an array to hold the messages... */ if ((a = _cupsMessageNew(NULL)) == NULL) { DEBUG_puts("5_cupsMessageLoad: Unable to allocate array!"); return (NULL); } /* * Open the message catalog file... */ if ((fp = cupsFileOpen(filename, "r")) == NULL) { DEBUG_printf(("5_cupsMessageLoad: Unable to open file: %s", strerror(errno))); return (a); } if (flags & _CUPS_MESSAGE_STRINGS) { while (cups_read_strings(fp, flags, a)); } else { /* * Read messages from the catalog file until EOF... * * The format is the GNU gettext .po format, which is fairly simple: * * msgid "some text" * msgstr "localized text" * * The ID and localized text can span multiple lines using the form: * * msgid "" * "some long text" * msgstr "" * "localized text spanning " * "multiple lines" */ m = NULL; while (cupsFileGets(fp, s, sizeof(s)) != NULL) { /* * Skip blank and comment lines... */ if (s[0] == '#' || !s[0]) continue; /* * Strip the trailing quote... */ if ((ptr = strrchr(s, '\"')) == NULL) continue; *ptr = '\0'; /* * Find start of value... */ if ((ptr = strchr(s, '\"')) == NULL) continue; ptr ++; /* * Unquote the text... */ if (flags & _CUPS_MESSAGE_UNQUOTE) cups_unquote(ptr, ptr); /* * Create or add to a message... */ if (!strncmp(s, "msgid", 5)) { /* * Add previous message as needed... */ if (m) { if (m->str && (m->str[0] || (flags & _CUPS_MESSAGE_EMPTY))) { cupsArrayAdd(a, m); } else { /* * Translation is empty, don't add it... (STR #4033) */ free(m->msg); if (m->str) free(m->str); free(m); } } /* * Create a new message with the given msgid string... */ if ((m = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL) break; if ((m->msg = strdup(ptr)) == NULL) { free(m); m = NULL; break; } } else if (s[0] == '\"' && m) { /* * Append to current string... */ length = strlen(m->str ? m->str : m->msg); ptrlen = strlen(ptr); if ((temp = realloc(m->str ? m->str : m->msg, length + ptrlen + 1)) == NULL) { if (m->str) free(m->str); free(m->msg); free(m); m = NULL; break; } if (m->str) { /* * Copy the new portion to the end of the msgstr string - safe * to use memcpy because the buffer is allocated to the correct * size... */ m->str = temp; memcpy(m->str + length, ptr, ptrlen + 1); } else { /* * Copy the new portion to the end of the msgid string - safe * to use memcpy because the buffer is allocated to the correct * size... */ m->msg = temp; memcpy(m->msg + length, ptr, ptrlen + 1); } } else if (!strncmp(s, "msgstr", 6) && m) { /* * Set the string... */ if ((m->str = strdup(ptr)) == NULL) { free(m->msg); free(m); m = NULL; break; } } } /* * Add the last message string to the array as needed... */ if (m) { if (m->str && (m->str[0] || (flags & _CUPS_MESSAGE_EMPTY))) { cupsArrayAdd(a, m); } else { /* * Translation is empty, don't add it... (STR #4033) */ free(m->msg); if (m->str) free(m->str); free(m); } } } /* * Close the message catalog file and return the new array... */ cupsFileClose(fp); DEBUG_printf(("5_cupsMessageLoad: Returning %d messages...", cupsArrayCount(a))); return (a); } /* * '_cupsMessageLookup()' - Lookup a message string. */ const char * /* O - Localized message */ _cupsMessageLookup(cups_array_t *a, /* I - Message array */ const char *m) /* I - Message */ { _cups_message_t key, /* Search key */ *match; /* Matching message */ DEBUG_printf(("_cupsMessageLookup(a=%p, m=\"%s\")", (void *)a, m)); /* * Lookup the message string; if it doesn't exist in the catalog, * then return the message that was passed to us... */ key.msg = (char *)m; match = (_cups_message_t *)cupsArrayFind(a, &key); #if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) if (!match && cupsArrayUserData(a)) { /* * Try looking the string up in the cups.strings dictionary... */ CFDictionaryRef dict; /* cups.strings dictionary */ CFStringRef cfm, /* Message as a CF string */ cfstr; /* Localized text as a CF string */ dict = (CFDictionaryRef)cupsArrayUserData(a); cfm = CFStringCreateWithCString(kCFAllocatorDefault, m, kCFStringEncodingUTF8); match = calloc(1, sizeof(_cups_message_t)); match->msg = strdup(m); cfstr = cfm ? CFDictionaryGetValue(dict, cfm) : NULL; if (cfstr) { char buffer[1024]; /* Message buffer */ CFStringGetCString(cfstr, buffer, sizeof(buffer), kCFStringEncodingUTF8); match->str = strdup(buffer); DEBUG_printf(("1_cupsMessageLookup: Found \"%s\" as \"%s\"...", m, buffer)); } else { match->str = strdup(m); DEBUG_printf(("1_cupsMessageLookup: Did not find \"%s\"...", m)); } cupsArrayAdd(a, match); if (cfm) CFRelease(cfm); } #endif /* __APPLE__ && CUPS_BUNDLEDIR */ if (match && match->str) return (match->str); else return (m); } /* * '_cupsMessageNew()' - Make a new message catalog array. */ cups_array_t * /* O - Array */ _cupsMessageNew(void *context) /* I - User data */ { return (cupsArrayNew3((cups_array_func_t)cups_message_compare, context, (cups_ahash_func_t)NULL, 0, (cups_acopy_func_t)NULL, (cups_afree_func_t)cups_message_free)); } /* * '_cupsMessageSave()' - Save a message catalog array. */ int /* O - 0 on success, -1 on failure */ _cupsMessageSave(const char *filename,/* I - Output filename */ int flags, /* I - Format flags */ cups_array_t *a) /* I - Message array */ { cups_file_t *fp; /* Output file */ _cups_message_t *m; /* Current message */ /* * Output message catalog file... */ if ((fp = cupsFileOpen(filename, "w")) == NULL) return (-1); /* * Write each message... */ if (flags & _CUPS_MESSAGE_STRINGS) { for (m = (_cups_message_t *)cupsArrayFirst(a); m; m = (_cups_message_t *)cupsArrayNext(a)) { cupsFilePuts(fp, "\""); cups_message_puts(fp, m->msg); cupsFilePuts(fp, "\" = \""); cups_message_puts(fp, m->str); cupsFilePuts(fp, "\";\n"); } } else { for (m = (_cups_message_t *)cupsArrayFirst(a); m; m = (_cups_message_t *)cupsArrayNext(a)) { cupsFilePuts(fp, "msgid \""); cups_message_puts(fp, m->msg); cupsFilePuts(fp, "\"\nmsgstr \""); cups_message_puts(fp, m->str); cupsFilePuts(fp, "\"\n"); } } return (cupsFileClose(fp)); } #ifdef __APPLE__ /* * 'appleLangDefault()' - Get the default locale string. */ static const char * /* O - Locale string */ appleLangDefault(void) { CFBundleRef bundle; /* Main bundle (if any) */ CFArrayRef bundleList; /* List of localizations in bundle */ CFPropertyListRef localizationList = NULL; /* List of localization data */ CFStringRef languageName; /* Current name */ char *lang; /* LANG environment variable */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_puts("2appleLangDefault()"); /* * Only do the lookup and translation the first time. */ if (!cg->language[0]) { if (getenv("SOFTWARE") != NULL && (lang = getenv("LANG")) != NULL) { DEBUG_printf(("3appleLangDefault: Using LANG=%s", lang)); strlcpy(cg->language, lang, sizeof(cg->language)); return (cg->language); } else if ((bundle = CFBundleGetMainBundle()) != NULL && (bundleList = CFBundleCopyBundleLocalizations(bundle)) != NULL) { CFURLRef resources = CFBundleCopyResourcesDirectoryURL(bundle); DEBUG_puts("3appleLangDefault: Getting localizationList from bundle."); if (resources) { CFStringRef cfpath = CFURLCopyPath(resources); char path[1024]; if (cfpath) { /* * See if we have an Info.plist file in the bundle... */ CFStringGetCString(cfpath, path, sizeof(path), kCFStringEncodingUTF8); DEBUG_printf(("3appleLangDefault: Got a resource URL (\"%s\")", path)); strlcat(path, "Contents/Info.plist", sizeof(path)); if (!access(path, R_OK)) localizationList = CFBundleCopyPreferredLocalizationsFromArray(bundleList); else DEBUG_puts("3appleLangDefault: No Info.plist, ignoring resource URL..."); CFRelease(cfpath); } CFRelease(resources); } else DEBUG_puts("3appleLangDefault: No resource URL."); CFRelease(bundleList); } if (!localizationList) { DEBUG_puts("3appleLangDefault: Getting localizationList from preferences."); localizationList = CFPreferencesCopyAppValue(CFSTR("AppleLanguages"), kCFPreferencesCurrentApplication); } if (localizationList) { #ifdef DEBUG if (CFGetTypeID(localizationList) == CFArrayGetTypeID()) DEBUG_printf(("3appleLangDefault: Got localizationList, %d entries.", (int)CFArrayGetCount(localizationList))); else DEBUG_puts("3appleLangDefault: Got localizationList but not an array."); #endif /* DEBUG */ if (CFGetTypeID(localizationList) == CFArrayGetTypeID() && CFArrayGetCount(localizationList) > 0) { languageName = CFArrayGetValueAtIndex(localizationList, 0); if (languageName && CFGetTypeID(languageName) == CFStringGetTypeID()) { if (_cupsAppleLocale(languageName, cg->language, sizeof(cg->language))) DEBUG_printf(("3appleLangDefault: cg->language=\"%s\"", cg->language)); else DEBUG_puts("3appleLangDefault: Unable to get locale."); } } CFRelease(localizationList); } /* * If we didn't find the language, default to en_US... */ if (!cg->language[0]) { DEBUG_puts("3appleLangDefault: Defaulting to en_US."); strlcpy(cg->language, "en_US.UTF-8", sizeof(cg->language)); } } else DEBUG_printf(("3appleLangDefault: Using previous locale \"%s\".", cg->language)); /* * Return the cached locale... */ return (cg->language); } # ifdef CUPS_BUNDLEDIR /* * 'appleMessageLoad()' - Load a message catalog from a localizable bundle. */ static cups_array_t * /* O - Message catalog */ appleMessageLoad(const char *locale) /* I - Locale ID */ { char filename[1024], /* Path to cups.strings file */ applelang[256], /* Apple language ID */ baselang[4]; /* Base language */ CFURLRef url; /* URL to cups.strings file */ CFReadStreamRef stream = NULL; /* File stream */ CFPropertyListRef plist = NULL; /* Localization file */ #ifdef DEBUG const char *cups_strings = getenv("CUPS_STRINGS"); /* Test strings file */ CFErrorRef error = NULL; /* Error when opening file */ #endif /* DEBUG */ DEBUG_printf(("appleMessageLoad(locale=\"%s\")", locale)); /* * Load the cups.strings file... */ #ifdef DEBUG if (cups_strings) { DEBUG_puts("1appleMessageLoad: Using debug CUPS_STRINGS file."); strlcpy(filename, cups_strings, sizeof(filename)); } else #endif /* DEBUG */ snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", _cupsAppleLanguage(locale, applelang, sizeof(applelang))); if (access(filename, 0)) { /* * * * Try with original locale string... */ DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno))); snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale); } if (access(filename, 0)) { /* * * * Try with just the language code... */ DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno))); strlcpy(baselang, locale, sizeof(baselang)); if (baselang[3] == '-' || baselang[3] == '_') baselang[3] = '\0'; snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", baselang); } if (access(filename, 0)) { /* * Try alternate lproj directory names... */ DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno))); if (!strncmp(locale, "en", 2)) locale = "English"; else if (!strncmp(locale, "nb", 2)) locale = "no"; else if (!strncmp(locale, "nl", 2)) locale = "Dutch"; else if (!strncmp(locale, "fr", 2)) locale = "French"; else if (!strncmp(locale, "de", 2)) locale = "German"; else if (!strncmp(locale, "it", 2)) locale = "Italian"; else if (!strncmp(locale, "ja", 2)) locale = "Japanese"; else if (!strncmp(locale, "es", 2)) locale = "Spanish"; else if (!strcmp(locale, "zh_HK") || !strncasecmp(locale, "zh-Hant", 7) || !strncasecmp(locale, "zh_Hant", 7)) { /* * * * * Try zh_TW first, then zh... Sigh... */ if (!access(CUPS_BUNDLEDIR "/Resources/zh_TW.lproj/cups.strings", 0)) locale = "zh_TW"; else locale = "zh"; } else if (strstr(locale, "_") != NULL || strstr(locale, "-") != NULL) { /* * Drop country code, just try language... */ strlcpy(baselang, locale, sizeof(baselang)); if (baselang[2] == '-' || baselang[2] == '_') baselang[2] = '\0'; locale = baselang; } snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale); } DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename)); url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)filename, (CFIndex)strlen(filename), false); if (url) { stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url); if (stream) { /* * Read the property list containing the localization data. * * NOTE: This code currently generates a clang "potential leak" * warning, but the object is released in _cupsMessageFree(). */ CFReadStreamOpen(stream); #ifdef DEBUG plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, kCFPropertyListImmutable, NULL, &error); if (error) { CFStringRef msg = CFErrorCopyDescription(error); /* Error message */ CFStringGetCString(msg, filename, sizeof(filename), kCFStringEncodingUTF8); DEBUG_printf(("1appleMessageLoad: %s", filename)); CFRelease(msg); CFRelease(error); } #else plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, kCFPropertyListImmutable, NULL, NULL); #endif /* DEBUG */ if (plist && CFGetTypeID(plist) != CFDictionaryGetTypeID()) { CFRelease(plist); plist = NULL; } CFRelease(stream); } CFRelease(url); } DEBUG_printf(("1appleMessageLoad: url=%p, stream=%p, plist=%p", url, stream, plist)); /* * Create and return an empty array to act as a cache for messages, passing the * plist as the user data. */ return (_cupsMessageNew((void *)plist)); } # endif /* CUPS_BUNDLEDIR */ #endif /* __APPLE__ */ /* * 'cups_cache_lookup()' - Lookup a language in the cache... */ static cups_lang_t * /* O - Language data or NULL */ cups_cache_lookup( const char *name, /* I - Name of locale */ cups_encoding_t encoding) /* I - Encoding of locale */ { cups_lang_t *lang; /* Current language */ DEBUG_printf(("7cups_cache_lookup(name=\"%s\", encoding=%d(%s))", name, encoding, encoding == CUPS_AUTO_ENCODING ? "auto" : lang_encodings[encoding])); /* * Loop through the cache and return a match if found... */ for (lang = lang_cache; lang != NULL; lang = lang->next) { DEBUG_printf(("9cups_cache_lookup: lang=%p, language=\"%s\", " "encoding=%d(%s)", (void *)lang, lang->language, lang->encoding, lang_encodings[lang->encoding])); if (!strcmp(lang->language, name) && (encoding == CUPS_AUTO_ENCODING || encoding == lang->encoding)) { lang->used ++; DEBUG_puts("8cups_cache_lookup: returning match!"); return (lang); } } DEBUG_puts("8cups_cache_lookup: returning NULL!"); return (NULL); } /* * 'cups_message_compare()' - Compare two messages. */ static int /* O - Result of comparison */ cups_message_compare( _cups_message_t *m1, /* I - First message */ _cups_message_t *m2) /* I - Second message */ { return (strcmp(m1->msg, m2->msg)); } /* * 'cups_message_free()' - Free a message. */ static void cups_message_free(_cups_message_t *m) /* I - Message */ { if (m->msg) free(m->msg); if (m->str) free(m->str); free(m); } /* * 'cups_message_load()' - Load the message catalog for a language. */ static void cups_message_load(cups_lang_t *lang) /* I - Language */ { #if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) lang->strings = appleMessageLoad(lang->language); #else char filename[1024]; /* Filename for language locale file */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ snprintf(filename, sizeof(filename), "%s/%s/cups_%s.po", cg->localedir, lang->language, lang->language); if (strchr(lang->language, '_') && access(filename, 0)) { /* * Country localization not available, look for generic localization... */ snprintf(filename, sizeof(filename), "%s/%.2s/cups_%.2s.po", cg->localedir, lang->language, lang->language); if (access(filename, 0)) { /* * No generic localization, so use POSIX... */ DEBUG_printf(("4cups_message_load: access(\"%s\", 0): %s", filename, strerror(errno))); snprintf(filename, sizeof(filename), "%s/C/cups_C.po", cg->localedir); } } /* * Read the strings from the file... */ lang->strings = _cupsMessageLoad(filename, _CUPS_MESSAGE_UNQUOTE); #endif /* __APPLE__ && CUPS_BUNDLEDIR */ } /* * 'cups_message_puts()' - Write a message string with quoting. */ static void cups_message_puts(cups_file_t *fp, /* I - File to write to */ const char *s) /* I - String to write */ { const char *start, /* Start of substring */ *ptr; /* Pointer into string */ for (start = s, ptr = s; *ptr; ptr ++) { if (strchr("\\\"\n\t", *ptr)) { if (ptr > start) { cupsFileWrite(fp, start, (size_t)(ptr - start)); start = ptr + 1; } if (*ptr == '\\') cupsFileWrite(fp, "\\\\", 2); else if (*ptr == '\"') cupsFileWrite(fp, "\\\"", 2); else if (*ptr == '\n') cupsFileWrite(fp, "\\n", 2); else /* if (*ptr == '\t') */ cupsFileWrite(fp, "\\t", 2); } } if (ptr > start) cupsFileWrite(fp, start, (size_t)(ptr - start)); } /* * 'cups_read_strings()' - Read a pair of strings from a .strings file. */ static int /* O - 1 on success, 0 on failure */ cups_read_strings(cups_file_t *fp, /* I - .strings file */ int flags, /* I - CUPS_MESSAGE_xxx flags */ cups_array_t *a) /* I - Message catalog array */ { char buffer[8192], /* Line buffer */ *bufptr, /* Pointer into buffer */ *msg, /* Pointer to start of message */ *str; /* Pointer to start of translation string */ _cups_message_t *m; /* New message */ while (cupsFileGets(fp, buffer, sizeof(buffer))) { /* * Skip any line (comments, blanks, etc.) that isn't: * * "message" = "translation"; */ for (bufptr = buffer; *bufptr && isspace(*bufptr & 255); bufptr ++); if (*bufptr != '\"') continue; /* * Find the end of the message... */ bufptr ++; for (msg = bufptr; *bufptr && *bufptr != '\"'; bufptr ++) if (*bufptr == '\\' && bufptr[1]) bufptr ++; if (!*bufptr) continue; *bufptr++ = '\0'; if (flags & _CUPS_MESSAGE_UNQUOTE) cups_unquote(msg, msg); /* * Find the start of the translation... */ while (*bufptr && isspace(*bufptr & 255)) bufptr ++; if (*bufptr != '=') continue; bufptr ++; while (*bufptr && isspace(*bufptr & 255)) bufptr ++; if (*bufptr != '\"') continue; /* * Find the end of the translation... */ bufptr ++; for (str = bufptr; *bufptr && *bufptr != '\"'; bufptr ++) if (*bufptr == '\\' && bufptr[1]) bufptr ++; if (!*bufptr) continue; *bufptr++ = '\0'; if (flags & _CUPS_MESSAGE_UNQUOTE) cups_unquote(str, str); /* * If we get this far we have a valid pair of strings, add them... */ if ((m = malloc(sizeof(_cups_message_t))) == NULL) break; m->msg = strdup(msg); m->str = strdup(str); if (m->msg && m->str) { cupsArrayAdd(a, m); } else { if (m->msg) free(m->msg); if (m->str) free(m->str); free(m); break; } return (1); } /* * No more strings... */ return (0); } /* * 'cups_unquote()' - Unquote characters in strings... */ static void cups_unquote(char *d, /* O - Unquoted string */ const char *s) /* I - Original string */ { while (*s) { if (*s == '\\') { s ++; if (isdigit(*s)) { *d = 0; while (isdigit(*s)) { *d = *d * 8 + *s - '0'; s ++; } d ++; } else { if (*s == 'n') *d ++ = '\n'; else if (*s == 'r') *d ++ = '\r'; else if (*s == 't') *d ++ = '\t'; else *d++ = *s; s ++; } } else *d++ = *s++; } *d = '\0'; } cups-2.3.1/cups/file.c000664 000765 000024 00000161142 13574721672 014641 0ustar00mikestaff000000 000000 /* * File functions for CUPS. * * Since stdio files max out at 256 files on many systems, we have to * write similar functions without this limit. At the same time, using * our own file functions allows us to provide transparent support of * different line endings, gzip'd print files, PPD files, etc. * * 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. */ /* * Include necessary headers... */ #include "file-private.h" #include "debug-internal.h" #include #include # ifdef HAVE_LIBZ # include # endif /* HAVE_LIBZ */ /* * Internal structures... */ struct _cups_file_s /**** CUPS file structure... ****/ { int fd; /* File descriptor */ char mode, /* Mode ('r' or 'w') */ compressed, /* Compression used? */ is_stdio, /* stdin/out/err? */ eof, /* End of file? */ buf[4096], /* Buffer */ *ptr, /* Pointer into buffer */ *end; /* End of buffer data */ off_t pos, /* Position in file */ bufpos; /* File position for start of buffer */ #ifdef HAVE_LIBZ z_stream stream; /* (De)compression stream */ Bytef cbuf[4096]; /* (De)compression buffer */ uLong crc; /* (De)compression CRC */ #endif /* HAVE_LIBZ */ char *printf_buffer; /* cupsFilePrintf buffer */ size_t printf_size; /* Size of cupsFilePrintf buffer */ }; /* * Local functions... */ #ifdef HAVE_LIBZ static ssize_t cups_compress(cups_file_t *fp, const char *buf, size_t bytes); #endif /* HAVE_LIBZ */ static ssize_t cups_fill(cups_file_t *fp); static int cups_open(const char *filename, int mode); static ssize_t cups_read(cups_file_t *fp, char *buf, size_t bytes); static ssize_t cups_write(cups_file_t *fp, const char *buf, size_t bytes); #ifndef _WIN32 /* * '_cupsFileCheck()' - Check the permissions of the given filename. */ _cups_fc_result_t /* O - Check result */ _cupsFileCheck( const char *filename, /* I - Filename to check */ _cups_fc_filetype_t filetype, /* I - Type of file checks? */ int dorootchecks, /* I - Check for root permissions? */ _cups_fc_func_t cb, /* I - Callback function */ void *context) /* I - Context pointer for callback */ { struct stat fileinfo; /* File information */ char message[1024], /* Message string */ temp[1024], /* Parent directory filename */ *ptr; /* Pointer into parent directory */ _cups_fc_result_t result; /* Check result */ /* * Does the filename contain a relative path ("../")? */ if (strstr(filename, "../")) { /* * Yes, fail it! */ result = _CUPS_FILE_CHECK_RELATIVE_PATH; goto finishup; } /* * Does the program even exist and is it accessible? */ if (stat(filename, &fileinfo)) { /* * Nope... */ result = _CUPS_FILE_CHECK_MISSING; goto finishup; } /* * Check the execute bit... */ result = _CUPS_FILE_CHECK_OK; switch (filetype) { case _CUPS_FILE_CHECK_DIRECTORY : if (!S_ISDIR(fileinfo.st_mode)) result = _CUPS_FILE_CHECK_WRONG_TYPE; break; default : if (!S_ISREG(fileinfo.st_mode)) result = _CUPS_FILE_CHECK_WRONG_TYPE; break; } if (result) goto finishup; /* * Are we doing root checks? */ if (!dorootchecks) { /* * Nope, so anything (else) goes... */ goto finishup; } /* * Verify permission of the file itself: * * 1. Must be owned by root * 2. Must not be writable by group * 3. Must not be setuid * 4. Must not be writable by others */ if (fileinfo.st_uid || /* 1. Must be owned by root */ (fileinfo.st_mode & S_IWGRP) || /* 2. Must not be writable by group */ (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ { result = _CUPS_FILE_CHECK_PERMISSIONS; goto finishup; } if (filetype == _CUPS_FILE_CHECK_DIRECTORY || filetype == _CUPS_FILE_CHECK_FILE_ONLY) goto finishup; /* * Now check the containing directory... */ strlcpy(temp, filename, sizeof(temp)); if ((ptr = strrchr(temp, '/')) != NULL) { if (ptr == temp) ptr[1] = '\0'; else *ptr = '\0'; } if (stat(temp, &fileinfo)) { /* * Doesn't exist?!? */ result = _CUPS_FILE_CHECK_MISSING; filetype = _CUPS_FILE_CHECK_DIRECTORY; filename = temp; goto finishup; } if (fileinfo.st_uid || /* 1. Must be owned by root */ (fileinfo.st_mode & S_IWGRP) || /* 2. Must not be writable by group */ (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ { result = _CUPS_FILE_CHECK_PERMISSIONS; filetype = _CUPS_FILE_CHECK_DIRECTORY; filename = temp; } /* * Common return point... */ finishup: if (cb) { cups_lang_t *lang = cupsLangDefault(); /* Localization information */ switch (result) { case _CUPS_FILE_CHECK_OK : if (filetype == _CUPS_FILE_CHECK_DIRECTORY) snprintf(message, sizeof(message), _cupsLangString(lang, _("Directory \"%s\" permissions OK " "(0%o/uid=%d/gid=%d).")), filename, fileinfo.st_mode, (int)fileinfo.st_uid, (int)fileinfo.st_gid); else snprintf(message, sizeof(message), _cupsLangString(lang, _("File \"%s\" permissions OK " "(0%o/uid=%d/gid=%d).")), filename, fileinfo.st_mode, (int)fileinfo.st_uid, (int)fileinfo.st_gid); break; case _CUPS_FILE_CHECK_MISSING : if (filetype == _CUPS_FILE_CHECK_DIRECTORY) snprintf(message, sizeof(message), _cupsLangString(lang, _("Directory \"%s\" not available: " "%s")), filename, strerror(errno)); else snprintf(message, sizeof(message), _cupsLangString(lang, _("File \"%s\" not available: %s")), filename, strerror(errno)); break; case _CUPS_FILE_CHECK_PERMISSIONS : if (filetype == _CUPS_FILE_CHECK_DIRECTORY) snprintf(message, sizeof(message), _cupsLangString(lang, _("Directory \"%s\" has insecure " "permissions " "(0%o/uid=%d/gid=%d).")), filename, fileinfo.st_mode, (int)fileinfo.st_uid, (int)fileinfo.st_gid); else snprintf(message, sizeof(message), _cupsLangString(lang, _("File \"%s\" has insecure " "permissions " "(0%o/uid=%d/gid=%d).")), filename, fileinfo.st_mode, (int)fileinfo.st_uid, (int)fileinfo.st_gid); break; case _CUPS_FILE_CHECK_WRONG_TYPE : if (filetype == _CUPS_FILE_CHECK_DIRECTORY) snprintf(message, sizeof(message), _cupsLangString(lang, _("Directory \"%s\" is a file.")), filename); else snprintf(message, sizeof(message), _cupsLangString(lang, _("File \"%s\" is a directory.")), filename); break; case _CUPS_FILE_CHECK_RELATIVE_PATH : if (filetype == _CUPS_FILE_CHECK_DIRECTORY) snprintf(message, sizeof(message), _cupsLangString(lang, _("Directory \"%s\" contains a " "relative path.")), filename); else snprintf(message, sizeof(message), _cupsLangString(lang, _("File \"%s\" contains a relative " "path.")), filename); break; } (*cb)(context, result, message); } return (result); } /* * '_cupsFileCheckFilter()' - Report file check results as CUPS filter messages. */ void _cupsFileCheckFilter( void *context, /* I - Context pointer (unused) */ _cups_fc_result_t result, /* I - Result code */ const char *message) /* I - Message text */ { const char *prefix; /* Messaging prefix */ (void)context; switch (result) { default : case _CUPS_FILE_CHECK_OK : prefix = "DEBUG2"; break; case _CUPS_FILE_CHECK_MISSING : case _CUPS_FILE_CHECK_WRONG_TYPE : prefix = "ERROR"; fputs("STATE: +cups-missing-filter-warning\n", stderr); break; case _CUPS_FILE_CHECK_PERMISSIONS : case _CUPS_FILE_CHECK_RELATIVE_PATH : prefix = "ERROR"; fputs("STATE: +cups-insecure-filter-warning\n", stderr); break; } fprintf(stderr, "%s: %s\n", prefix, message); } #endif /* !_WIN32 */ /* * 'cupsFileClose()' - Close a CUPS file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsFileClose(cups_file_t *fp) /* I - CUPS file */ { int fd; /* File descriptor */ char mode; /* Open mode */ int status; /* Return status */ DEBUG_printf(("cupsFileClose(fp=%p)", (void *)fp)); /* * Range check... */ if (!fp) return (-1); /* * Flush pending write data... */ if (fp->mode == 'w') status = cupsFileFlush(fp); else status = 0; #ifdef HAVE_LIBZ if (fp->compressed && status >= 0) { if (fp->mode == 'r') { /* * Free decompression data... */ inflateEnd(&fp->stream); } else { /* * Flush any remaining compressed data... */ unsigned char trailer[8]; /* Trailer CRC and length */ int done; /* Done writing... */ fp->stream.avail_in = 0; for (done = 0;;) { if (fp->stream.next_out > fp->cbuf) { if (cups_write(fp, (char *)fp->cbuf, (size_t)(fp->stream.next_out - fp->cbuf)) < 0) status = -1; fp->stream.next_out = fp->cbuf; fp->stream.avail_out = sizeof(fp->cbuf); } if (done || status < 0) break; done = deflate(&fp->stream, Z_FINISH) == Z_STREAM_END && fp->stream.next_out == fp->cbuf; } /* * Write the CRC and length... */ trailer[0] = (unsigned char)fp->crc; trailer[1] = (unsigned char)(fp->crc >> 8); trailer[2] = (unsigned char)(fp->crc >> 16); trailer[3] = (unsigned char)(fp->crc >> 24); trailer[4] = (unsigned char)fp->pos; trailer[5] = (unsigned char)(fp->pos >> 8); trailer[6] = (unsigned char)(fp->pos >> 16); trailer[7] = (unsigned char)(fp->pos >> 24); if (cups_write(fp, (char *)trailer, 8) < 0) status = -1; /* * Free all memory used by the compression stream... */ deflateEnd(&(fp->stream)); } } #endif /* HAVE_LIBZ */ /* * If this is one of the cupsFileStdin/out/err files, return now and don't * actually free memory or close (these last the life of the process...) */ if (fp->is_stdio) return (status); /* * Save the file descriptor we used and free memory... */ fd = fp->fd; mode = fp->mode; if (fp->printf_buffer) free(fp->printf_buffer); free(fp); /* * Close the file, returning the close status... */ if (mode == 's') { if (httpAddrClose(NULL, fd) < 0) status = -1; } else if (close(fd) < 0) status = -1; return (status); } /* * 'cupsFileCompression()' - Return whether a file is compressed. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - @code CUPS_FILE_NONE@ or @code CUPS_FILE_GZIP@ */ cupsFileCompression(cups_file_t *fp) /* I - CUPS file */ { return (fp ? fp->compressed : CUPS_FILE_NONE); } /* * 'cupsFileEOF()' - Return the end-of-file status. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 1 on end of file, 0 otherwise */ cupsFileEOF(cups_file_t *fp) /* I - CUPS file */ { return (fp ? fp->eof : 1); } /* * 'cupsFileFind()' - Find a file using the specified path. * * This function allows the paths in the path string to be separated by * colons (UNIX standard) or semicolons (Windows standard) and stores the * result in the buffer supplied. If the file cannot be found in any of * the supplied paths, @code NULL@ is returned. A @code NULL@ path only * matches the current directory. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Full path to file or @code NULL@ if not found */ cupsFileFind(const char *filename, /* I - File to find */ const char *path, /* I - Colon/semicolon-separated path */ int executable, /* I - 1 = executable files, 0 = any file/dir */ char *buffer, /* I - Filename buffer */ int bufsize) /* I - Size of filename buffer */ { char *bufptr, /* Current position in buffer */ *bufend; /* End of buffer */ /* * Range check input... */ DEBUG_printf(("cupsFileFind(filename=\"%s\", path=\"%s\", executable=%d, buffer=%p, bufsize=%d)", filename, path, executable, (void *)buffer, bufsize)); if (!filename || !buffer || bufsize < 2) return (NULL); if (!path) { /* * No path, so check current directory... */ if (!access(filename, 0)) { strlcpy(buffer, filename, (size_t)bufsize); return (buffer); } else return (NULL); } /* * Now check each path and return the first match... */ bufend = buffer + bufsize - 1; bufptr = buffer; while (*path) { #ifdef _WIN32 if (*path == ';' || (*path == ':' && ((bufptr - buffer) > 1 || !isalpha(buffer[0] & 255)))) #else if (*path == ';' || *path == ':') #endif /* _WIN32 */ { if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) *bufptr++ = '/'; strlcpy(bufptr, filename, (size_t)(bufend - bufptr)); #ifdef _WIN32 if (!access(buffer, 0)) #else if (!access(buffer, executable ? X_OK : 0)) #endif /* _WIN32 */ { DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); return (buffer); } bufptr = buffer; } else if (bufptr < bufend) *bufptr++ = *path; path ++; } /* * Check the last path... */ if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) *bufptr++ = '/'; strlcpy(bufptr, filename, (size_t)(bufend - bufptr)); if (!access(buffer, 0)) { DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); return (buffer); } else { DEBUG_puts("1cupsFileFind: Returning NULL"); return (NULL); } } /* * 'cupsFileFlush()' - Flush pending output. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsFileFlush(cups_file_t *fp) /* I - CUPS file */ { ssize_t bytes; /* Bytes to write */ DEBUG_printf(("cupsFileFlush(fp=%p)", (void *)fp)); /* * Range check input... */ if (!fp || fp->mode != 'w') { DEBUG_puts("1cupsFileFlush: Attempt to flush a read-only file..."); return (-1); } bytes = (ssize_t)(fp->ptr - fp->buf); DEBUG_printf(("2cupsFileFlush: Flushing " CUPS_LLFMT " bytes...", CUPS_LLCAST bytes)); if (bytes > 0) { #ifdef HAVE_LIBZ if (fp->compressed) bytes = cups_compress(fp, fp->buf, (size_t)bytes); else #endif /* HAVE_LIBZ */ bytes = cups_write(fp, fp->buf, (size_t)bytes); if (bytes < 0) return (-1); fp->ptr = fp->buf; } return (0); } /* * 'cupsFileGetChar()' - Get a single character from a file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Character or -1 on end of file */ cupsFileGetChar(cups_file_t *fp) /* I - CUPS file */ { /* * Range check input... */ DEBUG_printf(("4cupsFileGetChar(fp=%p)", (void *)fp)); if (!fp || (fp->mode != 'r' && fp->mode != 's')) { DEBUG_puts("5cupsFileGetChar: Bad arguments!"); return (-1); } if (fp->eof) { DEBUG_puts("5cupsFileGetChar: End-of-file!"); return (-1); } /* * If the input buffer is empty, try to read more data... */ DEBUG_printf(("5cupsFileGetChar: fp->eof=%d, fp->ptr=%p, fp->end=%p", fp->eof, (void *)fp->ptr, (void *)fp->end)); if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) { DEBUG_puts("5cupsFileGetChar: Unable to fill buffer!"); return (-1); } /* * Return the next character in the buffer... */ DEBUG_printf(("5cupsFileGetChar: Returning %d...", *(fp->ptr) & 255)); fp->pos ++; DEBUG_printf(("6cupsFileGetChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (*(fp->ptr)++ & 255); } /* * 'cupsFileGetConf()' - Get a line from a configuration file. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Line read or @code NULL@ on end of file or error */ cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */ char *buf, /* O - String buffer */ size_t buflen, /* I - Size of string buffer */ char **value, /* O - Pointer to value */ int *linenum) /* IO - Current line number */ { char *ptr; /* Pointer into line */ /* * Range check input... */ DEBUG_printf(("2cupsFileGetConf(fp=%p, buf=%p, buflen=" CUPS_LLFMT ", value=%p, linenum=%p)", (void *)fp, (void *)buf, CUPS_LLCAST buflen, (void *)value, (void *)linenum)); if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 2 || !value) { if (value) *value = NULL; return (NULL); } /* * Read the next non-comment line... */ *value = NULL; while (cupsFileGets(fp, buf, buflen)) { (*linenum) ++; /* * Strip any comments... */ if ((ptr = strchr(buf, '#')) != NULL) { if (ptr > buf && ptr[-1] == '\\') { // Unquote the #... _cups_strcpy(ptr - 1, ptr); } else { // Strip the comment and any trailing whitespace... while (ptr > buf) { if (!_cups_isspace(ptr[-1])) break; ptr --; } *ptr = '\0'; } } /* * Strip leading whitespace... */ for (ptr = buf; _cups_isspace(*ptr); ptr ++); if (ptr > buf) _cups_strcpy(buf, ptr); /* * See if there is anything left... */ if (buf[0]) { /* * Yes, grab any value and return... */ for (ptr = buf; *ptr; ptr ++) if (_cups_isspace(*ptr)) break; if (*ptr) { /* * Have a value, skip any other spaces... */ while (_cups_isspace(*ptr)) *ptr++ = '\0'; if (*ptr) *value = ptr; /* * Strip trailing whitespace and > for lines that begin with <... */ ptr += strlen(ptr) - 1; if (buf[0] == '<' && *ptr == '>') *ptr-- = '\0'; else if (buf[0] == '<' && *ptr != '>') { /* * Syntax error... */ *value = NULL; return (buf); } while (ptr > *value && _cups_isspace(*ptr)) *ptr-- = '\0'; } /* * Return the line... */ return (buf); } } return (NULL); } /* * 'cupsFileGetLine()' - Get a CR and/or LF-terminated line that may * contain binary data. * * This function differs from @link cupsFileGets@ in that the trailing CR * and LF are preserved, as is any binary data on the line. The buffer is * nul-terminated, however you should use the returned length to determine * the number of bytes on the line. * * @since CUPS 1.2/macOS 10.5@ */ size_t /* O - Number of bytes on line or 0 on end of file */ cupsFileGetLine(cups_file_t *fp, /* I - File to read from */ char *buf, /* I - Buffer */ size_t buflen) /* I - Size of buffer */ { int ch; /* Character from file */ char *ptr, /* Current position in line buffer */ *end; /* End of line buffer */ /* * Range check input... */ DEBUG_printf(("2cupsFileGetLine(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST buflen)); if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 3) return (0); /* * Now loop until we have a valid line... */ for (ptr = buf, end = buf + buflen - 2; ptr < end ;) { if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) break; *ptr++ = ch = *(fp->ptr)++; fp->pos ++; if (ch == '\r') { /* * Check for CR LF... */ if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) break; if (*(fp->ptr) == '\n') { *ptr++ = *(fp->ptr)++; fp->pos ++; } break; } else if (ch == '\n') { /* * Line feed ends a line... */ break; } } *ptr = '\0'; DEBUG_printf(("4cupsFileGetLine: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return ((size_t)(ptr - buf)); } /* * 'cupsFileGets()' - Get a CR and/or LF-terminated line. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Line read or @code NULL@ on end of file or error */ cupsFileGets(cups_file_t *fp, /* I - CUPS file */ char *buf, /* O - String buffer */ size_t buflen) /* I - Size of string buffer */ { int ch; /* Character from file */ char *ptr, /* Current position in line buffer */ *end; /* End of line buffer */ /* * Range check input... */ DEBUG_printf(("2cupsFileGets(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST buflen)); if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 2) return (NULL); /* * Now loop until we have a valid line... */ for (ptr = buf, end = buf + buflen - 1; ptr < end ;) { if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) { if (ptr == buf) return (NULL); else break; } ch = *(fp->ptr)++; fp->pos ++; if (ch == '\r') { /* * Check for CR LF... */ if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) break; if (*(fp->ptr) == '\n') { fp->ptr ++; fp->pos ++; } break; } else if (ch == '\n') { /* * Line feed ends a line... */ break; } else *ptr++ = (char)ch; } *ptr = '\0'; DEBUG_printf(("4cupsFileGets: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (buf); } /* * 'cupsFileLock()' - Temporarily lock access to a file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsFileLock(cups_file_t *fp, /* I - CUPS file */ int block) /* I - 1 to wait for the lock, 0 to fail right away */ { /* * Range check... */ if (!fp || fp->mode == 's') return (-1); /* * Try the lock... */ #ifdef _WIN32 return (_locking(fp->fd, block ? _LK_LOCK : _LK_NBLCK, 0)); #else return (lockf(fp->fd, block ? F_LOCK : F_TLOCK, 0)); #endif /* _WIN32 */ } /* * 'cupsFileNumber()' - Return the file descriptor associated with a CUPS file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - File descriptor */ cupsFileNumber(cups_file_t *fp) /* I - CUPS file */ { if (fp) return (fp->fd); else return (-1); } /* * 'cupsFileOpen()' - Open a CUPS file. * * The "mode" parameter can be "r" to read, "w" to write, overwriting any * existing file, "a" to append to an existing file or create a new file, * or "s" to open a socket connection. * * When opening for writing ("w"), an optional number from 1 to 9 can be * supplied which enables Flate compression of the file. Compression is * not supported for the "a" (append) mode. * * When opening a socket connection, the filename is a string of the form * "address:port" or "hostname:port". The socket will make an IPv4 or IPv6 * connection as needed, generally preferring IPv6 connections when there is * a choice. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file or @code NULL@ if the file or socket cannot be opened */ cupsFileOpen(const char *filename, /* I - Name of file */ const char *mode) /* I - Open mode */ { cups_file_t *fp; /* New CUPS file */ int fd; /* File descriptor */ char hostname[1024], /* Hostname */ *portname; /* Port "name" (number or service) */ http_addrlist_t *addrlist; /* Host address list */ DEBUG_printf(("cupsFileOpen(filename=\"%s\", mode=\"%s\")", filename, mode)); /* * Range check input... */ if (!filename || !mode || (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || (*mode == 'a' && isdigit(mode[1] & 255))) return (NULL); /* * Open the file... */ switch (*mode) { case 'a' : /* Append file */ fd = cups_open(filename, O_RDWR | O_CREAT | O_APPEND | O_LARGEFILE | O_BINARY); break; case 'r' : /* Read file */ fd = open(filename, O_RDONLY | O_LARGEFILE | O_BINARY, 0); break; case 'w' : /* Write file */ fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); if (fd < 0 && errno == ENOENT) { fd = cups_open(filename, O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE | O_BINARY); if (fd < 0 && errno == EEXIST) fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); } if (fd >= 0) #ifdef _WIN32 _chsize(fd, 0); #else ftruncate(fd, 0); #endif /* _WIN32 */ break; case 's' : /* Read/write socket */ strlcpy(hostname, filename, sizeof(hostname)); if ((portname = strrchr(hostname, ':')) != NULL) *portname++ = '\0'; else return (NULL); /* * Lookup the hostname and service... */ if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) return (NULL); /* * Connect to the server... */ if (!httpAddrConnect(addrlist, &fd)) { httpAddrFreeList(addrlist); return (NULL); } httpAddrFreeList(addrlist); break; default : /* Remove bogus compiler warning... */ return (NULL); } if (fd < 0) return (NULL); /* * Create the CUPS file structure... */ if ((fp = cupsFileOpenFd(fd, mode)) == NULL) { if (*mode == 's') httpAddrClose(NULL, fd); else close(fd); } /* * Return it... */ return (fp); } /* * 'cupsFileOpenFd()' - Open a CUPS file using a file descriptor. * * The "mode" parameter can be "r" to read, "w" to write, "a" to append, * or "s" to treat the file descriptor as a bidirectional socket connection. * * When opening for writing ("w"), an optional number from 1 to 9 can be * supplied which enables Flate compression of the file. Compression is * not supported for the "a" (append) mode. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file or @code NULL@ if the file could not be opened */ cupsFileOpenFd(int fd, /* I - File descriptor */ const char *mode) /* I - Open mode */ { cups_file_t *fp; /* New CUPS file */ DEBUG_printf(("cupsFileOpenFd(fd=%d, mode=\"%s\")", fd, mode)); /* * Range check input... */ if (fd < 0 || !mode || (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || (*mode == 'a' && isdigit(mode[1] & 255))) return (NULL); /* * Allocate memory... */ if ((fp = calloc(1, sizeof(cups_file_t))) == NULL) return (NULL); /* * Open the file... */ fp->fd = fd; switch (*mode) { case 'a' : fp->pos = lseek(fd, 0, SEEK_END); case 'w' : fp->mode = 'w'; fp->ptr = fp->buf; fp->end = fp->buf + sizeof(fp->buf); #ifdef HAVE_LIBZ if (mode[1] >= '1' && mode[1] <= '9') { /* * Open a compressed stream, so write the standard gzip file * header... */ unsigned char header[10]; /* gzip file header */ time_t curtime; /* Current time */ curtime = time(NULL); header[0] = 0x1f; header[1] = 0x8b; header[2] = Z_DEFLATED; header[3] = 0; header[4] = (unsigned char)curtime; header[5] = (unsigned char)(curtime >> 8); header[6] = (unsigned char)(curtime >> 16); header[7] = (unsigned char)(curtime >> 24); header[8] = 0; header[9] = 0x03; cups_write(fp, (char *)header, 10); /* * Initialize the compressor... */ deflateInit2(&(fp->stream), mode[1] - '0', Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); fp->stream.next_out = fp->cbuf; fp->stream.avail_out = sizeof(fp->cbuf); fp->compressed = 1; fp->crc = crc32(0L, Z_NULL, 0); } #endif /* HAVE_LIBZ */ break; case 'r' : fp->mode = 'r'; break; case 's' : fp->mode = 's'; break; default : /* Remove bogus compiler warning... */ return (NULL); } /* * Don't pass this file to child processes... */ #ifndef _WIN32 fcntl(fp->fd, F_SETFD, fcntl(fp->fd, F_GETFD) | FD_CLOEXEC); #endif /* !_WIN32 */ return (fp); } /* * '_cupsFilePeekAhead()' - See if the requested character is buffered up. */ int /* O - 1 if present, 0 otherwise */ _cupsFilePeekAhead(cups_file_t *fp, /* I - CUPS file */ int ch) /* I - Character */ { return (fp && fp->ptr && memchr(fp->ptr, ch, (size_t)(fp->end - fp->ptr))); } /* * 'cupsFilePeekChar()' - Peek at the next character from a file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Character or -1 on end of file */ cupsFilePeekChar(cups_file_t *fp) /* I - CUPS file */ { /* * Range check input... */ if (!fp || (fp->mode != 'r' && fp->mode != 's')) return (-1); /* * If the input buffer is empty, try to read more data... */ if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) return (-1); /* * Return the next character in the buffer... */ return (*(fp->ptr) & 255); } /* * 'cupsFilePrintf()' - Write a formatted string. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Number of bytes written or -1 on error */ cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */ const char *format, /* I - Printf-style format string */ ...) /* I - Additional args as necessary */ { va_list ap; /* Argument list */ ssize_t bytes; /* Formatted size */ DEBUG_printf(("2cupsFilePrintf(fp=%p, format=\"%s\", ...)", (void *)fp, format)); if (!fp || !format || (fp->mode != 'w' && fp->mode != 's')) return (-1); if (!fp->printf_buffer) { /* * Start with an 1k printf buffer... */ if ((fp->printf_buffer = malloc(1024)) == NULL) return (-1); fp->printf_size = 1024; } va_start(ap, format); bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); va_end(ap); if (bytes >= (ssize_t)fp->printf_size) { /* * Expand the printf buffer... */ char *temp; /* Temporary buffer pointer */ if (bytes > 65535) return (-1); if ((temp = realloc(fp->printf_buffer, (size_t)(bytes + 1))) == NULL) return (-1); fp->printf_buffer = temp; fp->printf_size = (size_t)(bytes + 1); va_start(ap, format); bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); va_end(ap); } if (fp->mode == 's') { if (cups_write(fp, fp->printf_buffer, (size_t)bytes) < 0) return (-1); fp->pos += bytes; DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return ((int)bytes); } if ((fp->ptr + bytes) > fp->end) if (cupsFileFlush(fp)) return (-1); fp->pos += bytes; DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); if ((size_t)bytes > sizeof(fp->buf)) { #ifdef HAVE_LIBZ if (fp->compressed) return ((int)cups_compress(fp, fp->printf_buffer, (size_t)bytes)); else #endif /* HAVE_LIBZ */ return ((int)cups_write(fp, fp->printf_buffer, (size_t)bytes)); } else { memcpy(fp->ptr, fp->printf_buffer, (size_t)bytes); fp->ptr += bytes; if (fp->is_stdio && cupsFileFlush(fp)) return (-1); else return ((int)bytes); } } /* * 'cupsFilePutChar()' - Write a character. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsFilePutChar(cups_file_t *fp, /* I - CUPS file */ int c) /* I - Character to write */ { /* * Range check input... */ if (!fp || (fp->mode != 'w' && fp->mode != 's')) return (-1); if (fp->mode == 's') { /* * Send character immediately over socket... */ char ch; /* Output character */ ch = (char)c; if (send(fp->fd, &ch, 1, 0) < 1) return (-1); } else { /* * Buffer it up... */ if (fp->ptr >= fp->end) if (cupsFileFlush(fp)) return (-1); *(fp->ptr) ++ = (char)c; } fp->pos ++; DEBUG_printf(("4cupsFilePutChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (0); } /* * 'cupsFilePutConf()' - Write a configuration line. * * This function handles any comment escaping of the value. * * @since CUPS 1.4/macOS 10.6@ */ ssize_t /* O - Number of bytes written or -1 on error */ cupsFilePutConf(cups_file_t *fp, /* I - CUPS file */ const char *directive, /* I - Directive */ const char *value) /* I - Value */ { ssize_t bytes, /* Number of bytes written */ temp; /* Temporary byte count */ const char *ptr; /* Pointer into value */ if (!fp || !directive || !*directive) return (-1); if ((bytes = cupsFilePuts(fp, directive)) < 0) return (-1); if (cupsFilePutChar(fp, ' ') < 0) return (-1); bytes ++; if (value && *value) { if ((ptr = strchr(value, '#')) != NULL) { /* * Need to quote the first # in the info string... */ if ((temp = cupsFileWrite(fp, value, (size_t)(ptr - value))) < 0) return (-1); bytes += temp; if (cupsFilePutChar(fp, '\\') < 0) return (-1); bytes ++; if ((temp = cupsFilePuts(fp, ptr)) < 0) return (-1); bytes += temp; } else if ((temp = cupsFilePuts(fp, value)) < 0) return (-1); else bytes += temp; } if (cupsFilePutChar(fp, '\n') < 0) return (-1); else return (bytes + 1); } /* * 'cupsFilePuts()' - Write a string. * * Like the @code fputs@ function, no newline is appended to the string. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - Number of bytes written or -1 on error */ cupsFilePuts(cups_file_t *fp, /* I - CUPS file */ const char *s) /* I - String to write */ { ssize_t bytes; /* Bytes to write */ /* * Range check input... */ if (!fp || !s || (fp->mode != 'w' && fp->mode != 's')) return (-1); /* * Write the string... */ bytes = (ssize_t)strlen(s); if (fp->mode == 's') { if (cups_write(fp, s, (size_t)bytes) < 0) return (-1); fp->pos += bytes; DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return ((int)bytes); } if ((fp->ptr + bytes) > fp->end) if (cupsFileFlush(fp)) return (-1); fp->pos += bytes; DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); if ((size_t)bytes > sizeof(fp->buf)) { #ifdef HAVE_LIBZ if (fp->compressed) return ((int)cups_compress(fp, s, (size_t)bytes)); else #endif /* HAVE_LIBZ */ return ((int)cups_write(fp, s, (size_t)bytes)); } else { memcpy(fp->ptr, s, (size_t)bytes); fp->ptr += bytes; if (fp->is_stdio && cupsFileFlush(fp)) return (-1); else return ((int)bytes); } } /* * 'cupsFileRead()' - Read from a file. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Number of bytes read or -1 on error */ cupsFileRead(cups_file_t *fp, /* I - CUPS file */ char *buf, /* O - Buffer */ size_t bytes) /* I - Number of bytes to read */ { size_t total; /* Total bytes read */ ssize_t count; /* Bytes read */ DEBUG_printf(("2cupsFileRead(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); /* * Range check input... */ if (!fp || !buf || (fp->mode != 'r' && fp->mode != 's')) return (-1); if (bytes == 0) return (0); if (fp->eof) { DEBUG_puts("5cupsFileRead: End-of-file!"); return (-1); } /* * Loop until all bytes are read... */ total = 0; while (bytes > 0) { if (fp->ptr >= fp->end) if (cups_fill(fp) <= 0) { DEBUG_printf(("4cupsFileRead: cups_fill() returned -1, total=" CUPS_LLFMT, CUPS_LLCAST total)); if (total > 0) return ((ssize_t)total); else return (-1); } count = (ssize_t)(fp->end - fp->ptr); if (count > (ssize_t)bytes) count = (ssize_t)bytes; memcpy(buf, fp->ptr,(size_t) count); fp->ptr += count; fp->pos += count; DEBUG_printf(("4cupsFileRead: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); /* * Update the counts for the last read... */ bytes -= (size_t)count; total += (size_t)count; buf += count; } /* * Return the total number of bytes read... */ DEBUG_printf(("3cupsFileRead: total=" CUPS_LLFMT, CUPS_LLCAST total)); return ((ssize_t)total); } /* * 'cupsFileRewind()' - Set the current file position to the beginning of the * file. * * @since CUPS 1.2/macOS 10.5@ */ off_t /* O - New file position or -1 on error */ cupsFileRewind(cups_file_t *fp) /* I - CUPS file */ { /* * Range check input... */ DEBUG_printf(("cupsFileRewind(fp=%p)", (void *)fp)); DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); if (!fp || fp->mode != 'r') return (-1); /* * Handle special cases... */ if (fp->bufpos == 0) { /* * No seeking necessary... */ fp->pos = 0; if (fp->ptr) { fp->ptr = fp->buf; fp->eof = 0; } DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (0); } /* * Otherwise, seek in the file and cleanup any compression buffers... */ #ifdef HAVE_LIBZ if (fp->compressed) { inflateEnd(&fp->stream); fp->compressed = 0; } #endif /* HAVE_LIBZ */ if (lseek(fp->fd, 0, SEEK_SET)) { DEBUG_printf(("1cupsFileRewind: lseek failed: %s", strerror(errno))); return (-1); } fp->bufpos = 0; fp->pos = 0; fp->ptr = NULL; fp->end = NULL; fp->eof = 0; DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (0); } /* * 'cupsFileSeek()' - Seek in a file. * * @since CUPS 1.2/macOS 10.5@ */ off_t /* O - New file position or -1 on error */ cupsFileSeek(cups_file_t *fp, /* I - CUPS file */ off_t pos) /* I - Position in file */ { ssize_t bytes; /* Number bytes in buffer */ DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")", (void *)fp, CUPS_LLCAST pos)); DEBUG_printf(("2cupsFileSeek: fp->pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); DEBUG_printf(("2cupsFileSeek: fp->ptr=%p, fp->end=%p", (void *)fp->ptr, (void *)fp->end)); /* * Range check input... */ if (!fp || pos < 0 || fp->mode != 'r') return (-1); /* * Handle special cases... */ if (pos == 0) return (cupsFileRewind(fp)); if (fp->ptr) { bytes = (ssize_t)(fp->end - fp->buf); DEBUG_printf(("2cupsFileSeek: bytes=" CUPS_LLFMT, CUPS_LLCAST bytes)); if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) { /* * No seeking necessary... */ fp->pos = pos; fp->ptr = fp->buf + pos - fp->bufpos; fp->eof = 0; return (pos); } } #ifdef HAVE_LIBZ if (!fp->compressed && !fp->ptr) { /* * Preload a buffer to determine whether the file is compressed... */ if (cups_fill(fp) <= 0) return (-1); } #endif /* HAVE_LIBZ */ /* * Seek forwards or backwards... */ fp->eof = 0; if (pos < fp->bufpos) { /* * Need to seek backwards... */ DEBUG_puts("2cupsFileSeek: SEEK BACKWARDS"); #ifdef HAVE_LIBZ if (fp->compressed) { inflateEnd(&fp->stream); lseek(fp->fd, 0, SEEK_SET); fp->bufpos = 0; fp->pos = 0; fp->ptr = NULL; fp->end = NULL; while ((bytes = cups_fill(fp)) > 0) if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) break; if (bytes <= 0) return (-1); fp->ptr = fp->buf + pos - fp->bufpos; fp->pos = pos; } else #endif /* HAVE_LIBZ */ { fp->bufpos = lseek(fp->fd, pos, SEEK_SET); fp->pos = fp->bufpos; fp->ptr = NULL; fp->end = NULL; DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, CUPS_LLCAST fp->pos)); } } else { /* * Need to seek forwards... */ DEBUG_puts("2cupsFileSeek: SEEK FORWARDS"); #ifdef HAVE_LIBZ if (fp->compressed) { while ((bytes = cups_fill(fp)) > 0) { if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) break; } if (bytes <= 0) return (-1); fp->ptr = fp->buf + pos - fp->bufpos; fp->pos = pos; } else #endif /* HAVE_LIBZ */ { fp->bufpos = lseek(fp->fd, pos, SEEK_SET); fp->pos = fp->bufpos; fp->ptr = NULL; fp->end = NULL; DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, CUPS_LLCAST fp->pos)); } } DEBUG_printf(("2cupsFileSeek: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return (fp->pos); } /* * 'cupsFileStderr()' - Return a CUPS file associated with stderr. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file */ cupsFileStderr(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ /* * Open file descriptor 2 as needed... */ if (!cg->stdio_files[2]) { /* * Flush any pending output on the stdio file... */ fflush(stderr); /* * Open file descriptor 2... */ if ((cg->stdio_files[2] = cupsFileOpenFd(2, "w")) != NULL) cg->stdio_files[2]->is_stdio = 1; } return (cg->stdio_files[2]); } /* * 'cupsFileStdin()' - Return a CUPS file associated with stdin. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file */ cupsFileStdin(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ /* * Open file descriptor 0 as needed... */ if (!cg->stdio_files[0]) { /* * Open file descriptor 0... */ if ((cg->stdio_files[0] = cupsFileOpenFd(0, "r")) != NULL) cg->stdio_files[0]->is_stdio = 1; } return (cg->stdio_files[0]); } /* * 'cupsFileStdout()' - Return a CUPS file associated with stdout. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file */ cupsFileStdout(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ /* * Open file descriptor 1 as needed... */ if (!cg->stdio_files[1]) { /* * Flush any pending output on the stdio file... */ fflush(stdout); /* * Open file descriptor 1... */ if ((cg->stdio_files[1] = cupsFileOpenFd(1, "w")) != NULL) cg->stdio_files[1]->is_stdio = 1; } return (cg->stdio_files[1]); } /* * 'cupsFileTell()' - Return the current file position. * * @since CUPS 1.2/macOS 10.5@ */ off_t /* O - File position */ cupsFileTell(cups_file_t *fp) /* I - CUPS file */ { DEBUG_printf(("2cupsFileTell(fp=%p)", (void *)fp)); DEBUG_printf(("3cupsFileTell: pos=" CUPS_LLFMT, CUPS_LLCAST (fp ? fp->pos : -1))); return (fp ? fp->pos : 0); } /* * 'cupsFileUnlock()' - Unlock access to a file. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - 0 on success, -1 on error */ cupsFileUnlock(cups_file_t *fp) /* I - CUPS file */ { /* * Range check... */ DEBUG_printf(("cupsFileUnlock(fp=%p)", (void *)fp)); if (!fp || fp->mode == 's') return (-1); /* * Unlock... */ #ifdef _WIN32 return (_locking(fp->fd, _LK_UNLCK, 0)); #else return (lockf(fp->fd, F_ULOCK, 0)); #endif /* _WIN32 */ } /* * 'cupsFileWrite()' - Write to a file. * * @since CUPS 1.2/macOS 10.5@ */ ssize_t /* O - Number of bytes written or -1 on error */ cupsFileWrite(cups_file_t *fp, /* I - CUPS file */ const char *buf, /* I - Buffer */ size_t bytes) /* I - Number of bytes to write */ { /* * Range check input... */ DEBUG_printf(("2cupsFileWrite(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); if (!fp || !buf || (fp->mode != 'w' && fp->mode != 's')) return (-1); if (bytes == 0) return (0); /* * Write the buffer... */ if (fp->mode == 's') { if (cups_write(fp, buf, bytes) < 0) return (-1); fp->pos += (off_t)bytes; DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); return ((ssize_t)bytes); } if ((fp->ptr + bytes) > fp->end) if (cupsFileFlush(fp)) return (-1); fp->pos += (off_t)bytes; DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); if (bytes > sizeof(fp->buf)) { #ifdef HAVE_LIBZ if (fp->compressed) return (cups_compress(fp, buf, bytes)); else #endif /* HAVE_LIBZ */ return (cups_write(fp, buf, bytes)); } else { memcpy(fp->ptr, buf, bytes); fp->ptr += bytes; return ((ssize_t)bytes); } } #ifdef HAVE_LIBZ /* * 'cups_compress()' - Compress a buffer of data. */ static ssize_t /* O - Number of bytes written or -1 */ cups_compress(cups_file_t *fp, /* I - CUPS file */ const char *buf, /* I - Buffer */ size_t bytes) /* I - Number bytes */ { DEBUG_printf(("7cups_compress(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); /* * Update the CRC... */ fp->crc = crc32(fp->crc, (const Bytef *)buf, (uInt)bytes); /* * Deflate the bytes... */ fp->stream.next_in = (Bytef *)buf; fp->stream.avail_in = (uInt)bytes; while (fp->stream.avail_in > 0) { /* * Flush the current buffer... */ DEBUG_printf(("9cups_compress: avail_in=%d, avail_out=%d", fp->stream.avail_in, fp->stream.avail_out)); if (fp->stream.avail_out < (uInt)(sizeof(fp->cbuf) / 8)) { if (cups_write(fp, (char *)fp->cbuf, (size_t)(fp->stream.next_out - fp->cbuf)) < 0) return (-1); fp->stream.next_out = fp->cbuf; fp->stream.avail_out = sizeof(fp->cbuf); } deflate(&(fp->stream), Z_NO_FLUSH); } return ((ssize_t)bytes); } #endif /* HAVE_LIBZ */ /* * 'cups_fill()' - Fill the input buffer. */ static ssize_t /* O - Number of bytes or -1 */ cups_fill(cups_file_t *fp) /* I - CUPS file */ { ssize_t bytes; /* Number of bytes read */ #ifdef HAVE_LIBZ int status; /* Decompression status */ const unsigned char *ptr, /* Pointer into buffer */ *end; /* End of buffer */ #endif /* HAVE_LIBZ */ DEBUG_printf(("7cups_fill(fp=%p)", (void *)fp)); DEBUG_printf(("9cups_fill: fp->ptr=%p, fp->end=%p, fp->buf=%p, fp->bufpos=" CUPS_LLFMT ", fp->eof=%d", (void *)fp->ptr, (void *)fp->end, (void *)fp->buf, CUPS_LLCAST fp->bufpos, fp->eof)); if (fp->ptr && fp->end) fp->bufpos += fp->end - fp->buf; #ifdef HAVE_LIBZ DEBUG_printf(("9cups_fill: fp->compressed=%d", fp->compressed)); while (!fp->ptr || fp->compressed) { /* * Check to see if we have read any data yet; if not, see if we have a * compressed file... */ if (!fp->ptr) { /* * Reset the file position in case we are seeking... */ fp->compressed = 0; /* * Read the first bytes in the file to determine if we have a gzip'd * file... */ if ((bytes = cups_read(fp, (char *)fp->buf, sizeof(fp->buf))) < 0) { /* * Can't read from file! */ DEBUG_printf(("9cups_fill: cups_read() returned " CUPS_LLFMT, CUPS_LLCAST bytes)); fp->eof = 1; return (-1); } if (bytes < 10 || fp->buf[0] != 0x1f || (fp->buf[1] & 255) != 0x8b || fp->buf[2] != 8 || (fp->buf[3] & 0xe0) != 0) { /* * Not a gzip'd file! */ fp->ptr = fp->buf; fp->end = fp->buf + bytes; DEBUG_printf(("9cups_fill: Returning " CUPS_LLFMT, CUPS_LLCAST bytes)); return (bytes); } /* * Parse header junk: extra data, original name, and comment... */ ptr = (unsigned char *)fp->buf + 10; end = (unsigned char *)fp->buf + bytes; if (fp->buf[3] & 0x04) { /* * Skip extra data... */ if ((ptr + 2) > end) { /* * Can't read from file! */ DEBUG_puts("9cups_fill: Extra gzip header data missing, returning -1."); fp->eof = 1; errno = EIO; return (-1); } bytes = ((unsigned char)ptr[1] << 8) | (unsigned char)ptr[0]; ptr += 2 + bytes; if (ptr > end) { /* * Can't read from file! */ DEBUG_puts("9cups_fill: Extra gzip header data does not fit in initial buffer, returning -1."); fp->eof = 1; errno = EIO; return (-1); } } if (fp->buf[3] & 0x08) { /* * Skip original name data... */ while (ptr < end && *ptr) ptr ++; if (ptr < end) ptr ++; else { /* * Can't read from file! */ DEBUG_puts("9cups_fill: Original filename in gzip header data does not fit in initial buffer, returning -1."); fp->eof = 1; errno = EIO; return (-1); } } if (fp->buf[3] & 0x10) { /* * Skip comment data... */ while (ptr < end && *ptr) ptr ++; if (ptr < end) ptr ++; else { /* * Can't read from file! */ DEBUG_puts("9cups_fill: Comment in gzip header data does not fit in initial buffer, returning -1."); fp->eof = 1; errno = EIO; return (-1); } } if (fp->buf[3] & 0x02) { /* * Skip header CRC data... */ ptr += 2; if (ptr > end) { /* * Can't read from file! */ DEBUG_puts("9cups_fill: Header CRC in gzip header data does not fit in initial buffer, returning -1."); fp->eof = 1; errno = EIO; return (-1); } } /* * Copy the flate-compressed data to the compression buffer... */ if ((bytes = end - ptr) > 0) memcpy(fp->cbuf, ptr, (size_t)bytes); /* * Setup the decompressor data... */ fp->stream.zalloc = (alloc_func)0; fp->stream.zfree = (free_func)0; fp->stream.opaque = (voidpf)0; fp->stream.next_in = (Bytef *)fp->cbuf; fp->stream.next_out = NULL; fp->stream.avail_in = (uInt)bytes; fp->stream.avail_out = 0; fp->crc = crc32(0L, Z_NULL, 0); if ((status = inflateInit2(&(fp->stream), -15)) != Z_OK) { DEBUG_printf(("9cups_fill: inflateInit2 returned %d, returning -1.", status)); fp->eof = 1; errno = EIO; return (-1); } fp->compressed = 1; } if (fp->compressed) { /* * If we have reached end-of-file, return immediately... */ if (fp->eof) { DEBUG_puts("9cups_fill: EOF, returning 0."); return (0); } /* * Fill the decompression buffer as needed... */ if (fp->stream.avail_in == 0) { if ((bytes = cups_read(fp, (char *)fp->cbuf, sizeof(fp->cbuf))) <= 0) { DEBUG_printf(("9cups_fill: cups_read error, returning %d.", (int)bytes)); fp->eof = 1; return (bytes); } fp->stream.next_in = fp->cbuf; fp->stream.avail_in = (uInt)bytes; } /* * Decompress data from the buffer... */ fp->stream.next_out = (Bytef *)fp->buf; fp->stream.avail_out = sizeof(fp->buf); status = inflate(&(fp->stream), Z_NO_FLUSH); if (fp->stream.next_out > (Bytef *)fp->buf) fp->crc = crc32(fp->crc, (Bytef *)fp->buf, (uInt)(fp->stream.next_out - (Bytef *)fp->buf)); if (status == Z_STREAM_END) { /* * Read the CRC and length... */ unsigned char trailer[8]; /* Trailer bytes */ uLong tcrc; /* Trailer CRC */ ssize_t tbytes = 0; /* Number of bytes */ if (fp->stream.avail_in > 0) { if (fp->stream.avail_in > sizeof(trailer)) tbytes = (ssize_t)sizeof(trailer); else tbytes = (ssize_t)fp->stream.avail_in; memcpy(trailer, fp->stream.next_in, (size_t)tbytes); fp->stream.next_in += tbytes; fp->stream.avail_in -= (size_t)tbytes; } if (tbytes < (ssize_t)sizeof(trailer)) { if (read(fp->fd, trailer + tbytes, sizeof(trailer) - (size_t)tbytes) < ((ssize_t)sizeof(trailer) - tbytes)) { /* * Can't get it, so mark end-of-file... */ DEBUG_puts("9cups_fill: Unable to read gzip CRC trailer, returning -1."); fp->eof = 1; errno = EIO; return (-1); } } tcrc = ((((((uLong)trailer[3] << 8) | (uLong)trailer[2]) << 8) | (uLong)trailer[1]) << 8) | (uLong)trailer[0]; if (tcrc != fp->crc) { /* * Bad CRC, mark end-of-file... */ DEBUG_printf(("9cups_fill: tcrc=%08x != fp->crc=%08x, returning -1.", (unsigned int)tcrc, (unsigned int)fp->crc)); fp->eof = 1; errno = EIO; return (-1); } /* * Otherwise, reset the compressed flag so that we re-read the * file header... */ inflateEnd(&fp->stream); fp->compressed = 0; } else if (status < Z_OK) { DEBUG_printf(("9cups_fill: inflate returned %d, returning -1.", status)); fp->eof = 1; errno = EIO; return (-1); } bytes = (ssize_t)sizeof(fp->buf) - (ssize_t)fp->stream.avail_out; /* * Return the decompressed data... */ fp->ptr = fp->buf; fp->end = fp->buf + bytes; if (bytes) { DEBUG_printf(("9cups_fill: Returning %d.", (int)bytes)); return (bytes); } } } #endif /* HAVE_LIBZ */ /* * Read a buffer's full of data... */ if ((bytes = cups_read(fp, fp->buf, sizeof(fp->buf))) <= 0) { /* * Can't read from file! */ fp->eof = 1; fp->ptr = fp->buf; fp->end = fp->buf; } else { /* * Return the bytes we read... */ fp->eof = 0; fp->ptr = fp->buf; fp->end = fp->buf + bytes; } DEBUG_printf(("9cups_fill: Not gzip, returning %d.", (int)bytes)); return (bytes); } /* * 'cups_open()' - Safely open a file for writing. * * We don't allow appending to directories or files that are hard-linked or * symlinked. */ static int /* O - File descriptor or -1 otherwise */ cups_open(const char *filename, /* I - Filename */ int mode) /* I - Open mode */ { int fd; /* File descriptor */ struct stat fileinfo; /* File information */ #ifndef _WIN32 struct stat linkinfo; /* Link information */ #endif /* !_WIN32 */ /* * Open the file... */ if ((fd = open(filename, mode, 0666)) < 0) return (-1); /* * Then verify that the file descriptor doesn't point to a directory or hard- * linked file. */ if (fstat(fd, &fileinfo)) { close(fd); return (-1); } if (fileinfo.st_nlink != 1) { close(fd); errno = EPERM; return (-1); } #ifdef _WIN32 if (fileinfo.st_mode & _S_IFDIR) #else if (S_ISDIR(fileinfo.st_mode)) #endif /* _WIN32 */ { close(fd); errno = EISDIR; return (-1); } #ifndef _WIN32 /* * Then use lstat to determine whether the filename is a symlink... */ if (lstat(filename, &linkinfo)) { close(fd); return (-1); } if (S_ISLNK(linkinfo.st_mode) || fileinfo.st_dev != linkinfo.st_dev || fileinfo.st_ino != linkinfo.st_ino || #ifdef HAVE_ST_GEN fileinfo.st_gen != linkinfo.st_gen || #endif /* HAVE_ST_GEN */ fileinfo.st_nlink != linkinfo.st_nlink || fileinfo.st_mode != linkinfo.st_mode) { /* * Yes, don't allow! */ close(fd); errno = EPERM; return (-1); } #endif /* !_WIN32 */ return (fd); } /* * 'cups_read()' - Read from a file descriptor. */ static ssize_t /* O - Number of bytes read or -1 */ cups_read(cups_file_t *fp, /* I - CUPS file */ char *buf, /* I - Buffer */ size_t bytes) /* I - Number bytes */ { ssize_t total; /* Total bytes read */ DEBUG_printf(("7cups_read(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); /* * Loop until we read at least 0 bytes... */ for (;;) { #ifdef _WIN32 if (fp->mode == 's') total = (ssize_t)recv(fp->fd, buf, (unsigned)bytes, 0); else total = (ssize_t)read(fp->fd, buf, (unsigned)bytes); #else if (fp->mode == 's') total = recv(fp->fd, buf, bytes, 0); else total = read(fp->fd, buf, bytes); #endif /* _WIN32 */ DEBUG_printf(("9cups_read: total=" CUPS_LLFMT, CUPS_LLCAST total)); if (total >= 0) break; /* * Reads can be interrupted by signals and unavailable resources... */ if (errno == EAGAIN || errno == EINTR) continue; else return (-1); } /* * Return the total number of bytes read... */ return (total); } /* * 'cups_write()' - Write to a file descriptor. */ static ssize_t /* O - Number of bytes written or -1 */ cups_write(cups_file_t *fp, /* I - CUPS file */ const char *buf, /* I - Buffer */ size_t bytes) /* I - Number bytes */ { size_t total; /* Total bytes written */ ssize_t count; /* Count this time */ DEBUG_printf(("7cups_write(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); /* * Loop until all bytes are written... */ total = 0; while (bytes > 0) { #ifdef _WIN32 if (fp->mode == 's') count = (ssize_t)send(fp->fd, buf, (unsigned)bytes, 0); else count = (ssize_t)write(fp->fd, buf, (unsigned)bytes); #else if (fp->mode == 's') count = send(fp->fd, buf, bytes, 0); else count = write(fp->fd, buf, bytes); #endif /* _WIN32 */ DEBUG_printf(("9cups_write: count=" CUPS_LLFMT, CUPS_LLCAST count)); if (count < 0) { /* * Writes can be interrupted by signals and unavailable resources... */ if (errno == EAGAIN || errno == EINTR) continue; else return (-1); } /* * Update the counts for the last write call... */ bytes -= (size_t)count; total += (size_t)count; buf += count; } /* * Return the total number of bytes written... */ return ((ssize_t)total); } cups-2.3.1/cups/utf8demo.txt000664 000765 000024 00000033325 13574721672 016053 0ustar00mikestaff000000 000000 UTF-8 encoded sample plain-text file ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Markus Kuhn [ˈmaʳkʊs kuːn] — 2002-07-25 The ASCII compatible UTF-8 encoding used in this plain-text file is defined in Unicode, ISO 10646-1, and RFC 2279. Using Unicode/UTF-8, you can write in emails and source code things such as Mathematics and sciences: ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫ ⎪⎢⎜│a²+b³ ⎟⎥⎪ ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ ⎪⎢⎜⎷ c₈ ⎟⎥⎪ ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬ ⎪⎢⎜ ∞ ⎟⎥⎪ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭ Linguistics and dictionaries: ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] APL: ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ Nicer typography in plain text files: ╔══════════════════════════════════════════╗ ║ ║ ║ • ‘single’ and “double” quotes ║ ║ ║ ║ • Curly apostrophes: “We’ve been here” ║ ║ ║ ║ • Latin-1 apostrophe and accents: '´` ║ ║ ║ ║ • ‚deutsche‘ „Anführungszeichen“ ║ ║ ║ ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║ ║ ║ ║ • ASCII safety test: 1lI|, 0OD, 8B ║ ║ ╭─────────╮ ║ ║ • the euro symbol: │ 14.95 € │ ║ ║ ╰─────────╯ ║ ╚══════════════════════════════════════════╝ Combining characters: STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ Greek (in Polytonic): The Greek anthem: Σὲ γνωρίζω ἀπὸ τὴν κόψη τοῦ σπαθιοῦ τὴν τρομερή, σὲ γνωρίζω ἀπὸ τὴν ὄψη ποὺ μὲ βία μετράει τὴ γῆ. ᾿Απ᾿ τὰ κόκκαλα βγαλμένη τῶν ῾Ελλήνων τὰ ἱερά καὶ σὰν πρῶτα ἀνδρειωμένη χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! From a speech of Demosthenes in the 4th century BC: Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. Δημοσθένους, Γ´ ᾿Ολυνθιακὸς Georgian: From a Unicode conference invitation: გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. Russian: From a Unicode conference invitation: Зарегистрируйтесь сейчас на Десятую Международную Конференцию по Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. Конференция соберет широкий круг экспертов по вопросам глобального Интернета и Unicode, локализации и интернационализации, воплощению и применению Unicode в различных операционных системах и программных приложениях, шрифтах, верстке и многоязычных компьютерных системах. Thai (UCS Level 2): Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese classic 'San Gua'): [----------------------------|------------------------] ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ (The above is a two-column text. If combining characters are handled correctly, the lines of the second column should be aligned with the | character above.) Ethiopian: Proverbs in the Amharic language: ሰማይ አይታረስ ንጉሥ አይከሰስ። ብላ ካለኝ እንደአባቴ በቆመጠኝ። ጌጥ ያለቤቱ ቁምጥና ነው። ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። የአፍ ወለምታ በቅቤ አይታሽም። አይጥ በበላ ዳዋ ተመታ። ሲተረጉሙ ይደረግሙ። ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። ድር ቢያብር አንበሳ ያስር። ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። ሥራ ከመፍታት ልጄን ላፋታት። ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። ተንጋሎ ቢተፉ ተመልሶ ባፉ። ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። እግርህን በፍራሽህ ልክ ዘርጋ። Runes: ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ (Old English, which transcribed into Latin reads 'He cwaeth that he bude thaem lande northweardum with tha Westsae.' and means 'He said that he lived in the northern land near the Western Sea.') Braille: ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ (The first couple of paragraphs of "A Christmas Carol" by Dickens) Compact font selection example text: ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi?⑀₂ἠḂӥẄɐː⍎אԱა Greetings in various languages: Hello world, Καλημέρα κόσμε, コンニチハ Box drawing alignment tests: █ ▉ ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ ▝▀▘▙▄▟ cups-2.3.1/cups/testgetdests.c000664 000765 000024 00000001775 13574721672 016451 0ustar00mikestaff000000 000000 /* * CUPS cupsGetDests API test program for CUPS. * * Copyright 2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include "cups.h" #include /* * 'main()' - Loop calling cupsGetDests. */ int /* O - Exit status */ main(void) { int num_dests; /* Number of destinations */ cups_dest_t *dests; /* Destinations */ struct timeval start, end; /* Start and stop time */ double secs; /* Total seconds to run cupsGetDests */ for (;;) { gettimeofday(&start, NULL); num_dests = cupsGetDests(&dests); gettimeofday(&end, NULL); secs = end.tv_sec - start.tv_sec + 0.000001 * (end.tv_usec - start.tv_usec); printf("Found %d printers in %.3f seconds...\n", num_dests, secs); cupsFreeDests(num_dests, dests); sleep(1); } return (0); } cups-2.3.1/cups/tls-sspi.c000664 000765 000024 00000211033 13574721672 015473 0ustar00mikestaff000000 000000 /* * TLS support for CUPS on Windows using the Security Support Provider * Interface (SSPI). * * Copyright 2010-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /**** This file is included from tls.c ****/ /* * Include necessary headers... */ #include "debug-private.h" /* * Include necessary libraries... */ #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "Secur32.lib") #pragma comment(lib, "Ws2_32.lib") /* * Constants... */ #ifndef SECURITY_FLAG_IGNORE_UNKNOWN_CA # define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 /* Untrusted root */ #endif /* SECURITY_FLAG_IGNORE_UNKNOWN_CA */ #ifndef SECURITY_FLAG_IGNORE_CERT_CN_INVALID # define SECURITY_FLAG_IGNORE_CERT_CN_INVALID 0x00001000 /* Common name does not match */ #endif /* !SECURITY_FLAG_IGNORE_CERT_CN_INVALID */ #ifndef SECURITY_FLAG_IGNORE_CERT_DATE_INVALID # define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 /* Expired X509 Cert. */ #endif /* !SECURITY_FLAG_IGNORE_CERT_DATE_INVALID */ /* * Local globals... */ static int tls_options = -1,/* Options for TLS connections */ tls_min_version = _HTTP_TLS_1_0, tls_max_version = _HTTP_TLS_MAX; /* * Local functions... */ static _http_sspi_t *http_sspi_alloc(void); static int http_sspi_client(http_t *http, const char *hostname); static PCCERT_CONTEXT http_sspi_create_credential(http_credential_t *cred); static BOOL http_sspi_find_credentials(http_t *http, const LPWSTR containerName, const char *common_name); static void http_sspi_free(_http_sspi_t *sspi); static BOOL http_sspi_make_credentials(_http_sspi_t *sspi, const LPWSTR containerName, const char *common_name, _http_mode_t mode, int years); static int http_sspi_server(http_t *http, const char *hostname); static void http_sspi_set_allows_any_root(_http_sspi_t *sspi, BOOL allow); static void http_sspi_set_allows_expired_certs(_http_sspi_t *sspi, BOOL allow); static const char *http_sspi_strerror(char *buffer, size_t bufsize, DWORD code); static DWORD http_sspi_verify(PCCERT_CONTEXT cert, const char *common_name, DWORD dwCertFlags); /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsMakeServerCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ const char *common_name, /* I - Common name */ int num_alt_names, /* I - Number of subject alternate names */ const char **alt_names, /* I - Subject Alternate Names */ time_t expiration_date) /* I - Expiration date */ { _http_sspi_t *sspi; /* SSPI data */ int ret; /* Return value */ DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date)); (void)path; (void)num_alt_names; (void)alt_names; sspi = http_sspi_alloc(); ret = http_sspi_make_credentials(sspi, L"ServerContainer", common_name, _HTTP_MODE_SERVER, (int)((expiration_date - time(NULL) + 86399) / 86400 / 365)); http_sspi_free(sspi); return (ret); } /* * 'cupsSetServerCredentials()' - Set the default server credentials. * * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ cupsSetServerCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ const char *common_name, /* I - Default common name for server */ int auto_create) /* I - 1 = automatically create self-signed certificates */ { DEBUG_printf(("cupsSetServerCredentials(path=\"%s\", common_name=\"%s\", auto_create=%d)", path, common_name, auto_create)); (void)path; (void)common_name; (void)auto_create; return (0); } /* * 'httpCopyCredentials()' - Copy the credentials associated with the peer in * an encrypted connection. * * @since CUPS 1.5/macOS 10.7@ */ int /* O - Status of call (0 = success) */ httpCopyCredentials( http_t *http, /* I - Connection to server */ cups_array_t **credentials) /* O - Array of credentials */ { DEBUG_printf(("httpCopyCredentials(http=%p, credentials=%p)", http, credentials)); if (!http || !http->tls || !http->tls->remoteCert || !credentials) { if (credentials) *credentials = NULL; return (-1); } *credentials = cupsArrayNew(NULL, NULL); httpAddCredential(*credentials, http->tls->remoteCert->pbCertEncoded, http->tls->remoteCert->cbCertEncoded); return (0); } /* * '_httpCreateCredentials()' - Create credentials in the internal format. */ http_tls_credentials_t /* O - Internal credentials */ _httpCreateCredentials( cups_array_t *credentials) /* I - Array of credentials */ { return (http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials))); } /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if valid, 0 otherwise */ httpCredentialsAreValidForName( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Name to check */ { int valid = 1; /* Valid name? */ PCCERT_CONTEXT cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials)); /* Certificate */ char cert_name[1024]; /* Name from certificate */ if (cert) { if (CertNameToStrA(X509_ASN_ENCODING, &(cert->pCertInfo->Subject), CERT_SIMPLE_NAME_STR, cert_name, sizeof(cert_name))) { /* * Extract common name at end... */ char *ptr = strrchr(cert_name, ','); if (ptr && ptr[1]) _cups_strcpy(cert_name, ptr + 2); } else strlcpy(cert_name, "unknown", sizeof(cert_name)); CertFreeCertificateContext(cert); } else strlcpy(cert_name, "unknown", sizeof(cert_name)); /* * Compare the common names... */ if (_cups_strcasecmp(common_name, cert_name)) { /* * Not an exact match for the common name, check for wildcard certs... */ const char *domain = strchr(common_name, '.'); /* Domain in common name */ if (strncmp(cert_name, "*.", 2) || !domain || _cups_strcasecmp(domain, cert_name + 1)) { /* * Not a wildcard match. */ /* TODO: Check subject alternate names */ valid = 0; } } return (valid); } /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * * @since CUPS 2.0/OS 10.10@ */ http_trust_t /* O - Level of trust */ httpCredentialsGetTrust( cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for trust lookup */ { http_trust_t trust = HTTP_TRUST_OK; /* Level of trust */ PCCERT_CONTEXT cert = NULL; /* Certificate to validate */ DWORD certFlags = 0; /* Cert verification flags */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread global data */ if (!common_name) return (HTTP_TRUST_UNKNOWN); cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials)); if (!cert) return (HTTP_TRUST_UNKNOWN); if (cg->any_root < 0) _cupsSetDefaults(); if (cg->any_root) certFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; if (cg->expired_certs) certFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID; if (!cg->validate_certs) certFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID; if (http_sspi_verify(cert, common_name, certFlags) != SEC_E_OK) trust = HTTP_TRUST_INVALID; CertFreeCertificateContext(cert); return (trust); } /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Expiration date of credentials */ httpCredentialsGetExpiration( cups_array_t *credentials) /* I - Credentials */ { time_t expiration_date = 0; /* Expiration data of credentials */ PCCERT_CONTEXT cert = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials)); /* Certificate */ if (cert) { SYSTEMTIME systime; /* System time */ struct tm tm; /* UNIX date/time */ FileTimeToSystemTime(&(cert->pCertInfo->NotAfter), &systime); tm.tm_year = systime.wYear - 1900; tm.tm_mon = systime.wMonth - 1; tm.tm_mday = systime.wDay; tm.tm_hour = systime.wHour; tm.tm_min = systime.wMinute; tm.tm_sec = systime.wSecond; expiration_date = mktime(&tm); CertFreeCertificateContext(cert); } return (expiration_date); } /* * 'httpCredentialsString()' - Return a string representing the credentials. * * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Total size of credentials string */ httpCredentialsString( cups_array_t *credentials, /* I - Credentials */ char *buffer, /* I - Buffer or @code NULL@ */ size_t bufsize) /* I - Size of buffer */ { http_credential_t *first = (http_credential_t *)cupsArrayFirst(credentials); /* First certificate */ PCCERT_CONTEXT cert; /* Certificate */ DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize)); if (!buffer) return (0); if (buffer && bufsize > 0) *buffer = '\0'; cert = http_sspi_create_credential(first); if (cert) { char cert_name[256]; /* Common name */ SYSTEMTIME systime; /* System time */ struct tm tm; /* UNIX date/time */ time_t expiration; /* Expiration date of cert */ unsigned char md5_digest[16]; /* MD5 result */ FileTimeToSystemTime(&(cert->pCertInfo->NotAfter), &systime); tm.tm_year = systime.wYear - 1900; tm.tm_mon = systime.wMonth - 1; tm.tm_mday = systime.wDay; tm.tm_hour = systime.wHour; tm.tm_min = systime.wMinute; tm.tm_sec = systime.wSecond; expiration = mktime(&tm); if (CertNameToStrA(X509_ASN_ENCODING, &(cert->pCertInfo->Subject), CERT_SIMPLE_NAME_STR, cert_name, sizeof(cert_name))) { /* * Extract common name at end... */ char *ptr = strrchr(cert_name, ','); if (ptr && ptr[1]) _cups_strcpy(cert_name, ptr + 2); } else strlcpy(cert_name, "unknown", sizeof(cert_name)); cupsHashData("md5", first->data, first->datalen, md5_digest, sizeof(md5_digest)); snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", cert_name, httpGetDateString(expiration), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]); CertFreeCertificateContext(cert); } DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer)); return (strlen(buffer)); } /* * '_httpFreeCredentials()' - Free internal credentials. */ void _httpFreeCredentials( http_tls_credentials_t credentials) /* I - Internal credentials */ { if (!credentials) return; CertFreeCertificateContext(credentials); } /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ httpLoadCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ cups_array_t **credentials, /* IO - Credentials */ const char *common_name) /* I - Common name for credentials */ { HCERTSTORE store = NULL; /* Certificate store */ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */ DWORD dwSize = 0; /* 32 bit size */ PBYTE p = NULL; /* Temporary storage */ HCRYPTPROV hProv = (HCRYPTPROV)NULL; /* Handle to a CSP */ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */ #ifdef DEBUG char error[1024]; /* Error message buffer */ #endif /* DEBUG */ DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name)); (void)path; if (credentials) { *credentials = NULL; } else { DEBUG_puts("1httpLoadCredentials: NULL credentials pointer, returning -1."); return (-1); } if (!common_name) { DEBUG_puts("1httpLoadCredentials: Bad common name, returning -1."); return (-1); } if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)) { if (GetLastError() == NTE_EXISTS) { if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { DEBUG_printf(("1httpLoadCredentials: CryptAcquireContext failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } } } store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY"); if (!store) { DEBUG_printf(("1httpLoadCredentials: CertOpenSystemStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } dwSize = 0; if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) { DEBUG_printf(("1httpLoadCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } p = (PBYTE)malloc(dwSize); if (!p) { DEBUG_printf(("1httpLoadCredentials: malloc failed for %d bytes.", dwSize)); goto cleanup; } if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) { DEBUG_printf(("1httpLoadCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } sib.cbData = dwSize; sib.pbData = p; storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL); if (!storedContext) { DEBUG_printf(("1httpLoadCredentials: Unable to find credentials for \"%s\".", common_name)); goto cleanup; } *credentials = cupsArrayNew(NULL, NULL); httpAddCredential(*credentials, storedContext->pbCertEncoded, storedContext->cbCertEncoded); cleanup: /* * Cleanup */ if (storedContext) CertFreeCertificateContext(storedContext); if (p) free(p); if (store) CertCloseStore(store, 0); if (hProv) CryptReleaseContext(hProv, 0); DEBUG_printf(("1httpLoadCredentials: Returning %d.", *credentials ? 0 : -1)); return (*credentials ? 0 : -1); } /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ httpSaveCredentials( const char *path, /* I - Keychain path or @code NULL@ for default */ cups_array_t *credentials, /* I - Credentials */ const char *common_name) /* I - Common name for credentials */ { HCERTSTORE store = NULL; /* Certificate store */ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */ PCCERT_CONTEXT createdContext = NULL; /* Context created by us */ DWORD dwSize = 0; /* 32 bit size */ PBYTE p = NULL; /* Temporary storage */ HCRYPTPROV hProv = (HCRYPTPROV)NULL; /* Handle to a CSP */ CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */ int ret = -1; /* Return value */ #ifdef DEBUG char error[1024]; /* Error message buffer */ #endif /* DEBUG */ DEBUG_printf(("httpSaveCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name)); (void)path; if (!common_name) { DEBUG_puts("1httpSaveCredentials: Bad common name, returning -1."); return (-1); } createdContext = http_sspi_create_credential((http_credential_t *)cupsArrayFirst(credentials)); if (!createdContext) { DEBUG_puts("1httpSaveCredentials: Bad credentials, returning -1."); return (-1); } if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)) { if (GetLastError() == NTE_EXISTS) { if (!CryptAcquireContextW(&hProv, L"RememberedContainer", MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { DEBUG_printf(("1httpSaveCredentials: CryptAcquireContext failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } } } store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY"); if (!store) { DEBUG_printf(("1httpSaveCredentials: CertOpenSystemStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } dwSize = 0; if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) { DEBUG_printf(("1httpSaveCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } p = (PBYTE)malloc(dwSize); if (!p) { DEBUG_printf(("1httpSaveCredentials: malloc failed for %d bytes.", dwSize)); goto cleanup; } if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) { DEBUG_printf(("1httpSaveCredentials: CertStrToName failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } /* * Add the created context to the named store, and associate it with the named * container... */ if (!CertAddCertificateContextToStore(store, createdContext, CERT_STORE_ADD_REPLACE_EXISTING, &storedContext)) { DEBUG_printf(("1httpSaveCredentials: CertAddCertificateContextToStore failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } ZeroMemory(&ckp, sizeof(ckp)); ckp.pwszContainerName = L"RememberedContainer"; ckp.pwszProvName = MS_DEF_PROV_W; ckp.dwProvType = PROV_RSA_FULL; ckp.dwFlags = CRYPT_MACHINE_KEYSET; ckp.dwKeySpec = AT_KEYEXCHANGE; if (!CertSetCertificateContextProperty(storedContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &ckp)) { DEBUG_printf(("1httpSaveCredentials: CertSetCertificateContextProperty failed: %s", http_sspi_strerror(error, sizeof(error), GetLastError()))); goto cleanup; } ret = 0; cleanup: /* * Cleanup */ if (createdContext) CertFreeCertificateContext(createdContext); if (storedContext) CertFreeCertificateContext(storedContext); if (p) free(p); if (store) CertCloseStore(store, 0); if (hProv) CryptReleaseContext(hProv, 0); DEBUG_printf(("1httpSaveCredentials: Returning %d.", ret)); return (ret); } /* * '_httpTLSInitialize()' - Initialize the TLS stack. */ void _httpTLSInitialize(void) { /* * Nothing to do... */ } /* * '_httpTLSPending()' - Return the number of pending TLS-encrypted bytes. */ size_t /* O - Bytes available */ _httpTLSPending(http_t *http) /* I - HTTP connection */ { if (http->tls) return (http->tls->readBufferUsed); else return (0); } /* * '_httpTLSRead()' - Read from a SSL/TLS connection. */ int /* O - Bytes read */ _httpTLSRead(http_t *http, /* I - HTTP connection */ char *buf, /* I - Buffer to store data */ int len) /* I - Length of buffer */ { int i; /* Looping var */ _http_sspi_t *sspi = http->tls; /* SSPI data */ SecBufferDesc message; /* Array of SecBuffer struct */ SecBuffer buffers[4] = { 0 }; /* Security package buffer */ int num = 0; /* Return value */ PSecBuffer pDataBuffer; /* Data buffer */ PSecBuffer pExtraBuffer; /* Excess data buffer */ SECURITY_STATUS scRet; /* SSPI status */ DEBUG_printf(("4_httpTLSRead(http=%p, buf=%p, len=%d)", http, buf, len)); /* * If there are bytes that have already been decrypted and have not yet been * read, return those... */ if (sspi->readBufferUsed > 0) { int bytesToCopy = min(sspi->readBufferUsed, len); /* Number of bytes to copy */ memcpy(buf, sspi->readBuffer, bytesToCopy); sspi->readBufferUsed -= bytesToCopy; if (sspi->readBufferUsed > 0) memmove(sspi->readBuffer, sspi->readBuffer + bytesToCopy, sspi->readBufferUsed); DEBUG_printf(("5_httpTLSRead: Returning %d bytes previously decrypted.", bytesToCopy)); return (bytesToCopy); } /* * Initialize security buffer structs */ message.ulVersion = SECBUFFER_VERSION; message.cBuffers = 4; message.pBuffers = buffers; do { /* * If there is not enough space in the buffer, then increase its size... */ if (sspi->decryptBufferLength <= sspi->decryptBufferUsed) { BYTE *temp; /* New buffer */ if (sspi->decryptBufferLength >= 262144) { WSASetLastError(E_OUTOFMEMORY); DEBUG_puts("_httpTLSRead: Decryption buffer too large (>256k)"); return (-1); } if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL) { DEBUG_printf(("_httpTLSRead: Unable to allocate %d byte decryption buffer.", sspi->decryptBufferLength + 4096)); WSASetLastError(E_OUTOFMEMORY); return (-1); } sspi->decryptBufferLength += 4096; sspi->decryptBuffer = temp; DEBUG_printf(("_httpTLSRead: Resized decryption buffer to %d bytes.", sspi->decryptBufferLength)); } buffers[0].pvBuffer = sspi->decryptBuffer; buffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed; buffers[0].BufferType = SECBUFFER_DATA; buffers[1].BufferType = SECBUFFER_EMPTY; buffers[2].BufferType = SECBUFFER_EMPTY; buffers[3].BufferType = SECBUFFER_EMPTY; DEBUG_printf(("5_httpTLSRead: decryptBufferUsed=%d", sspi->decryptBufferUsed)); scRet = DecryptMessage(&sspi->context, &message, 0, NULL); if (scRet == SEC_E_INCOMPLETE_MESSAGE) { num = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0); if (num < 0) { DEBUG_printf(("5_httpTLSRead: recv failed: %d", WSAGetLastError())); return (-1); } else if (num == 0) { DEBUG_puts("5_httpTLSRead: Server disconnected."); return (0); } DEBUG_printf(("5_httpTLSRead: Read %d bytes into decryption buffer.", num)); sspi->decryptBufferUsed += num; } } while (scRet == SEC_E_INCOMPLETE_MESSAGE); if (scRet == SEC_I_CONTEXT_EXPIRED) { DEBUG_puts("5_httpTLSRead: Context expired."); WSASetLastError(WSAECONNRESET); return (-1); } else if (scRet != SEC_E_OK) { DEBUG_printf(("5_httpTLSRead: DecryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); WSASetLastError(WSASYSCALLFAILURE); return (-1); } /* * The decryption worked. Now, locate data buffer. */ pDataBuffer = NULL; pExtraBuffer = NULL; for (i = 1; i < 4; i++) { if (buffers[i].BufferType == SECBUFFER_DATA) pDataBuffer = &buffers[i]; else if (!pExtraBuffer && (buffers[i].BufferType == SECBUFFER_EXTRA)) pExtraBuffer = &buffers[i]; } /* * If a data buffer is found, then copy the decrypted bytes to the passed-in * buffer... */ if (pDataBuffer) { int bytesToCopy = min((int)pDataBuffer->cbBuffer, len); /* Number of bytes to copy into buf */ int bytesToSave = pDataBuffer->cbBuffer - bytesToCopy; /* Number of bytes to save in our read buffer */ if (bytesToCopy) memcpy(buf, pDataBuffer->pvBuffer, bytesToCopy); /* * If there are more decrypted bytes than can be copied to the passed in * buffer, then save them... */ if (bytesToSave) { if ((sspi->readBufferLength - sspi->readBufferUsed) < bytesToSave) { BYTE *temp; /* New buffer pointer */ if ((temp = realloc(sspi->readBuffer, sspi->readBufferUsed + bytesToSave)) == NULL) { DEBUG_printf(("_httpTLSRead: Unable to allocate %d bytes.", sspi->readBufferUsed + bytesToSave)); WSASetLastError(E_OUTOFMEMORY); return (-1); } sspi->readBufferLength = sspi->readBufferUsed + bytesToSave; sspi->readBuffer = temp; } memcpy(((BYTE *)sspi->readBuffer) + sspi->readBufferUsed, ((BYTE *)pDataBuffer->pvBuffer) + bytesToCopy, bytesToSave); sspi->readBufferUsed += bytesToSave; } num = bytesToCopy; } else { DEBUG_puts("_httpTLSRead: Unable to find data buffer."); WSASetLastError(WSASYSCALLFAILURE); return (-1); } /* * If the decryption process left extra bytes, then save those back in * decryptBuffer. They will be processed the next time through the loop. */ if (pExtraBuffer) { memmove(sspi->decryptBuffer, pExtraBuffer->pvBuffer, pExtraBuffer->cbBuffer); sspi->decryptBufferUsed = pExtraBuffer->cbBuffer; } else { sspi->decryptBufferUsed = 0; } return (num); } /* * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options. */ void _httpTLSSetOptions(int options, /* I - Options */ int min_version, /* I - Minimum TLS version */ int max_version) /* I - Maximum TLS version */ { if (!(options & _HTTP_TLS_SET_DEFAULT) || tls_options < 0) { tls_options = options; tls_min_version = min_version; tls_max_version = max_version; } } /* * '_httpTLSStart()' - Set up SSL/TLS support on a connection. */ int /* O - 0 on success, -1 on failure */ _httpTLSStart(http_t *http) /* I - HTTP connection */ { char hostname[256], /* Hostname */ *hostptr; /* Pointer into hostname */ DEBUG_printf(("3_httpTLSStart(http=%p)", http)); if (tls_options < 0) { DEBUG_puts("4_httpTLSStart: Setting defaults."); _cupsSetDefaults(); DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options)); } if ((http->tls = http_sspi_alloc()) == NULL) return (-1); if (http->mode == _HTTP_MODE_CLIENT) { /* * Client: determine hostname... */ if (httpAddrLocalhost(http->hostaddr)) { strlcpy(hostname, "localhost", sizeof(hostname)); } else { /* * Otherwise make sure the hostname we have does not end in a trailing dot. */ strlcpy(hostname, http->hostname, sizeof(hostname)); if ((hostptr = hostname + strlen(hostname) - 1) >= hostname && *hostptr == '.') *hostptr = '\0'; } return (http_sspi_client(http, hostname)); } else { /* * Server: determine hostname to use... */ if (http->fields[HTTP_FIELD_HOST]) { /* * Use hostname for TLS upgrade... */ strlcpy(hostname, http->fields[HTTP_FIELD_HOST], sizeof(hostname)); } else { /* * Resolve hostname from connection address... */ http_addr_t addr; /* Connection address */ socklen_t addrlen; /* Length of address */ addrlen = sizeof(addr); if (getsockname(http->fd, (struct sockaddr *)&addr, &addrlen)) { DEBUG_printf(("4_httpTLSStart: Unable to get socket address: %s", strerror(errno))); hostname[0] = '\0'; } else if (httpAddrLocalhost(&addr)) hostname[0] = '\0'; else { httpAddrLookup(&addr, hostname, sizeof(hostname)); DEBUG_printf(("4_httpTLSStart: Resolved socket address to \"%s\".", hostname)); } } return (http_sspi_server(http, hostname)); } } /* * '_httpTLSStop()' - Shut down SSL/TLS on a connection. */ void _httpTLSStop(http_t *http) /* I - HTTP connection */ { _http_sspi_t *sspi = http->tls; /* SSPI data */ if (sspi->contextInitialized && http->fd >= 0) { SecBufferDesc message; /* Array of SecBuffer struct */ SecBuffer buffers[1] = { 0 }; /* Security package buffer */ DWORD dwType; /* Type */ DWORD status; /* Status */ /* * Notify schannel that we are about to close the connection. */ dwType = SCHANNEL_SHUTDOWN; buffers[0].pvBuffer = &dwType; buffers[0].BufferType = SECBUFFER_TOKEN; buffers[0].cbBuffer = sizeof(dwType); message.cBuffers = 1; message.pBuffers = buffers; message.ulVersion = SECBUFFER_VERSION; status = ApplyControlToken(&sspi->context, &message); if (SUCCEEDED(status)) { PBYTE pbMessage; /* Message buffer */ DWORD cbMessage; /* Message buffer count */ DWORD cbData; /* Data count */ DWORD dwSSPIFlags; /* SSL attributes we requested */ DWORD dwSSPIOutFlags; /* SSL attributes we received */ TimeStamp tsExpiry; /* Time stamp */ dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT | ASC_REQ_REPLAY_DETECT | ASC_REQ_CONFIDENTIALITY | ASC_REQ_EXTENDED_ERROR | ASC_REQ_ALLOCATE_MEMORY | ASC_REQ_STREAM; buffers[0].pvBuffer = NULL; buffers[0].BufferType = SECBUFFER_TOKEN; buffers[0].cbBuffer = 0; message.cBuffers = 1; message.pBuffers = buffers; message.ulVersion = SECBUFFER_VERSION; status = AcceptSecurityContext(&sspi->creds, &sspi->context, NULL, dwSSPIFlags, SECURITY_NATIVE_DREP, NULL, &message, &dwSSPIOutFlags, &tsExpiry); if (SUCCEEDED(status)) { pbMessage = buffers[0].pvBuffer; cbMessage = buffers[0].cbBuffer; /* * Send the close notify message to the client. */ if (pbMessage && cbMessage) { cbData = send(http->fd, pbMessage, cbMessage, 0); if ((cbData == SOCKET_ERROR) || (cbData == 0)) { status = WSAGetLastError(); DEBUG_printf(("_httpTLSStop: sending close notify failed: %d", status)); } else { FreeContextBuffer(pbMessage); } } } else { DEBUG_printf(("_httpTLSStop: AcceptSecurityContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status))); } } else { DEBUG_printf(("_httpTLSStop: ApplyControlToken failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status))); } } http_sspi_free(sspi); http->tls = NULL; } /* * '_httpTLSWrite()' - Write to a SSL/TLS connection. */ int /* O - Bytes written */ _httpTLSWrite(http_t *http, /* I - HTTP connection */ const char *buf, /* I - Buffer holding data */ int len) /* I - Length of buffer */ { _http_sspi_t *sspi = http->tls; /* SSPI data */ SecBufferDesc message; /* Array of SecBuffer struct */ SecBuffer buffers[4] = { 0 }; /* Security package buffer */ int bufferLen; /* Buffer length */ int bytesLeft; /* Bytes left to write */ const char *bufptr; /* Pointer into buffer */ int num = 0; /* Return value */ bufferLen = sspi->streamSizes.cbMaximumMessage + sspi->streamSizes.cbHeader + sspi->streamSizes.cbTrailer; if (bufferLen > sspi->writeBufferLength) { BYTE *temp; /* New buffer pointer */ if ((temp = (BYTE *)realloc(sspi->writeBuffer, bufferLen)) == NULL) { DEBUG_printf(("_httpTLSWrite: Unable to allocate buffer of %d bytes.", bufferLen)); WSASetLastError(E_OUTOFMEMORY); return (-1); } sspi->writeBuffer = temp; sspi->writeBufferLength = bufferLen; } bytesLeft = len; bufptr = buf; while (bytesLeft) { int chunk = min((int)sspi->streamSizes.cbMaximumMessage, bytesLeft); /* Size of data to write */ SECURITY_STATUS scRet; /* SSPI status */ /* * Copy user data into the buffer, starting just past the header... */ memcpy(sspi->writeBuffer + sspi->streamSizes.cbHeader, bufptr, chunk); /* * Setup the SSPI buffers */ message.ulVersion = SECBUFFER_VERSION; message.cBuffers = 4; message.pBuffers = buffers; buffers[0].pvBuffer = sspi->writeBuffer; buffers[0].cbBuffer = sspi->streamSizes.cbHeader; buffers[0].BufferType = SECBUFFER_STREAM_HEADER; buffers[1].pvBuffer = sspi->writeBuffer + sspi->streamSizes.cbHeader; buffers[1].cbBuffer = (unsigned long) chunk; buffers[1].BufferType = SECBUFFER_DATA; buffers[2].pvBuffer = sspi->writeBuffer + sspi->streamSizes.cbHeader + chunk; buffers[2].cbBuffer = sspi->streamSizes.cbTrailer; buffers[2].BufferType = SECBUFFER_STREAM_TRAILER; buffers[3].BufferType = SECBUFFER_EMPTY; /* * Encrypt the data */ scRet = EncryptMessage(&sspi->context, 0, &message, 0); if (FAILED(scRet)) { DEBUG_printf(("_httpTLSWrite: EncryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); WSASetLastError(WSASYSCALLFAILURE); return (-1); } /* * Send the data. Remember the size of the total data to send is the size * of the header, the size of the data the caller passed in and the size * of the trailer... */ num = send(http->fd, sspi->writeBuffer, buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer, 0); if (num <= 0) { DEBUG_printf(("_httpTLSWrite: send failed: %ld", WSAGetLastError())); return (num); } bytesLeft -= chunk; bufptr += chunk; } return (len); } #if 0 /* * 'http_setup_ssl()' - Set up SSL/TLS support on a connection. */ static int /* O - 0 on success, -1 on failure */ http_setup_ssl(http_t *http) /* I - Connection to server */ { char hostname[256], /* Hostname */ *hostptr; /* Pointer into hostname */ TCHAR username[256]; /* Username returned from GetUserName() */ TCHAR commonName[256];/* Common name for certificate */ DWORD dwSize; /* 32 bit size */ DEBUG_printf(("7http_setup_ssl(http=%p)", http)); /* * Get the hostname to use for SSL... */ if (httpAddrLocalhost(http->hostaddr)) { strlcpy(hostname, "localhost", sizeof(hostname)); } else { /* * Otherwise make sure the hostname we have does not end in a trailing dot. */ strlcpy(hostname, http->hostname, sizeof(hostname)); if ((hostptr = hostname + strlen(hostname) - 1) >= hostname && *hostptr == '.') *hostptr = '\0'; } http->tls = http_sspi_alloc(); if (!http->tls) { _cupsSetHTTPError(HTTP_STATUS_ERROR); return (-1); } dwSize = sizeof(username) / sizeof(TCHAR); GetUserName(username, &dwSize); _sntprintf_s(commonName, sizeof(commonName) / sizeof(TCHAR), sizeof(commonName) / sizeof(TCHAR), TEXT("CN=%s"), username); if (!_sspiGetCredentials(http->tls, L"ClientContainer", commonName, FALSE)) { _sspiFree(http->tls); http->tls = NULL; http->error = EIO; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Unable to establish a secure connection to host."), 1); return (-1); } _sspiSetAllowsAnyRoot(http->tls, TRUE); _sspiSetAllowsExpiredCerts(http->tls, TRUE); if (!_sspiConnect(http->tls, hostname)) { _sspiFree(http->tls); http->tls = NULL; http->error = EIO; http->status = HTTP_STATUS_ERROR; _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Unable to establish a secure connection to host."), 1); return (-1); } return (0); } #endif // 0 /* * 'http_sspi_alloc()' - Allocate SSPI object. */ static _http_sspi_t * /* O - New SSPI/SSL object */ http_sspi_alloc(void) { return ((_http_sspi_t *)calloc(sizeof(_http_sspi_t), 1)); } /* * 'http_sspi_client()' - Negotiate a TLS connection as a client. */ static int /* O - 0 on success, -1 on failure */ http_sspi_client(http_t *http, /* I - Client connection */ const char *hostname) /* I - Server hostname */ { _http_sspi_t *sspi = http->tls; /* SSPI data */ DWORD dwSize; /* Size for buffer */ DWORD dwSSPIFlags; /* SSL connection attributes we want */ DWORD dwSSPIOutFlags; /* SSL connection attributes we got */ TimeStamp tsExpiry; /* Time stamp */ SECURITY_STATUS scRet; /* Status */ int cbData; /* Data count */ SecBufferDesc inBuffer; /* Array of SecBuffer structs */ SecBuffer inBuffers[2]; /* Security package buffer */ SecBufferDesc outBuffer; /* Array of SecBuffer structs */ SecBuffer outBuffers[1]; /* Security package buffer */ int ret = 0; /* Return value */ char username[1024], /* Current username */ common_name[1024]; /* CN=username */ DEBUG_printf(("4http_sspi_client(http=%p, hostname=\"%s\")", http, hostname)); dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; /* * Lookup the client certificate... */ dwSize = sizeof(username); GetUserNameA(username, &dwSize); snprintf(common_name, sizeof(common_name), "CN=%s", username); if (!http_sspi_find_credentials(http, L"ClientContainer", common_name)) if (!http_sspi_make_credentials(http->tls, L"ClientContainer", common_name, _HTTP_MODE_CLIENT, 10)) { DEBUG_puts("5http_sspi_client: Unable to get client credentials."); return (-1); } /* * Initiate a ClientHello message and generate a token. */ outBuffers[0].pvBuffer = NULL; outBuffers[0].BufferType = SECBUFFER_TOKEN; outBuffers[0].cbBuffer = 0; outBuffer.cBuffers = 1; outBuffer.pBuffers = outBuffers; outBuffer.ulVersion = SECBUFFER_VERSION; scRet = InitializeSecurityContext(&sspi->creds, NULL, TEXT(""), dwSSPIFlags, 0, SECURITY_NATIVE_DREP, NULL, 0, &sspi->context, &outBuffer, &dwSSPIOutFlags, &tsExpiry); if (scRet != SEC_I_CONTINUE_NEEDED) { DEBUG_printf(("5http_sspi_client: InitializeSecurityContext(1) failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); return (-1); } /* * Send response to server if there is one. */ if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) { if ((cbData = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0)) <= 0) { DEBUG_printf(("5http_sspi_client: send failed: %d", WSAGetLastError())); FreeContextBuffer(outBuffers[0].pvBuffer); DeleteSecurityContext(&sspi->context); return (-1); } DEBUG_printf(("5http_sspi_client: %d bytes of handshake data sent.", cbData)); FreeContextBuffer(outBuffers[0].pvBuffer); outBuffers[0].pvBuffer = NULL; } dwSSPIFlags = ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; sspi->decryptBufferUsed = 0; /* * Loop until the handshake is finished or an error occurs. */ scRet = SEC_I_CONTINUE_NEEDED; while(scRet == SEC_I_CONTINUE_NEEDED || scRet == SEC_E_INCOMPLETE_MESSAGE || scRet == SEC_I_INCOMPLETE_CREDENTIALS) { if (sspi->decryptBufferUsed == 0 || scRet == SEC_E_INCOMPLETE_MESSAGE) { if (sspi->decryptBufferLength <= sspi->decryptBufferUsed) { BYTE *temp; /* New buffer */ if (sspi->decryptBufferLength >= 262144) { WSASetLastError(E_OUTOFMEMORY); DEBUG_puts("5http_sspi_client: Decryption buffer too large (>256k)"); return (-1); } if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL) { DEBUG_printf(("5http_sspi_client: Unable to allocate %d byte buffer.", sspi->decryptBufferLength + 4096)); WSASetLastError(E_OUTOFMEMORY); return (-1); } sspi->decryptBufferLength += 4096; sspi->decryptBuffer = temp; } cbData = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0); if (cbData < 0) { DEBUG_printf(("5http_sspi_client: recv failed: %d", WSAGetLastError())); return (-1); } else if (cbData == 0) { DEBUG_printf(("5http_sspi_client: Server unexpectedly disconnected.")); return (-1); } DEBUG_printf(("5http_sspi_client: %d bytes of handshake data received", cbData)); sspi->decryptBufferUsed += cbData; } /* * Set up the input buffers. Buffer 0 is used to pass in data received from * the server. Schannel will consume some or all of this. Leftover data * (if any) will be placed in buffer 1 and given a buffer type of * SECBUFFER_EXTRA. */ inBuffers[0].pvBuffer = sspi->decryptBuffer; inBuffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed; inBuffers[0].BufferType = SECBUFFER_TOKEN; inBuffers[1].pvBuffer = NULL; inBuffers[1].cbBuffer = 0; inBuffers[1].BufferType = SECBUFFER_EMPTY; inBuffer.cBuffers = 2; inBuffer.pBuffers = inBuffers; inBuffer.ulVersion = SECBUFFER_VERSION; /* * Set up the output buffers. These are initialized to NULL so as to make it * less likely we'll attempt to free random garbage later. */ outBuffers[0].pvBuffer = NULL; outBuffers[0].BufferType = SECBUFFER_TOKEN; outBuffers[0].cbBuffer = 0; outBuffer.cBuffers = 1; outBuffer.pBuffers = outBuffers; outBuffer.ulVersion = SECBUFFER_VERSION; /* * Call InitializeSecurityContext. */ scRet = InitializeSecurityContext(&sspi->creds, &sspi->context, NULL, dwSSPIFlags, 0, SECURITY_NATIVE_DREP, &inBuffer, 0, NULL, &outBuffer, &dwSSPIOutFlags, &tsExpiry); /* * If InitializeSecurityContext was successful (or if the error was one of * the special extended ones), send the contents of the output buffer to the * server. */ if (scRet == SEC_E_OK || scRet == SEC_I_CONTINUE_NEEDED || FAILED(scRet) && (dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR)) { if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) { cbData = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0); if (cbData <= 0) { DEBUG_printf(("5http_sspi_client: send failed: %d", WSAGetLastError())); FreeContextBuffer(outBuffers[0].pvBuffer); DeleteSecurityContext(&sspi->context); return (-1); } DEBUG_printf(("5http_sspi_client: %d bytes of handshake data sent.", cbData)); /* * Free output buffer. */ FreeContextBuffer(outBuffers[0].pvBuffer); outBuffers[0].pvBuffer = NULL; } } /* * If InitializeSecurityContext returned SEC_E_INCOMPLETE_MESSAGE, then we * need to read more data from the server and try again. */ if (scRet == SEC_E_INCOMPLETE_MESSAGE) continue; /* * If InitializeSecurityContext returned SEC_E_OK, then the handshake * completed successfully. */ if (scRet == SEC_E_OK) { /* * If the "extra" buffer contains data, this is encrypted application * protocol layer stuff. It needs to be saved. The application layer will * later decrypt it with DecryptMessage. */ DEBUG_puts("5http_sspi_client: Handshake was successful."); if (inBuffers[1].BufferType == SECBUFFER_EXTRA) { memmove(sspi->decryptBuffer, sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer, inBuffers[1].cbBuffer); sspi->decryptBufferUsed = inBuffers[1].cbBuffer; DEBUG_printf(("5http_sspi_client: %d bytes of app data was bundled with handshake data", sspi->decryptBufferUsed)); } else sspi->decryptBufferUsed = 0; /* * Bail out to quit */ break; } /* * Check for fatal error. */ if (FAILED(scRet)) { DEBUG_printf(("5http_sspi_client: InitializeSecurityContext(2) failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); ret = -1; break; } /* * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS, * then the server just requested client authentication. */ if (scRet == SEC_I_INCOMPLETE_CREDENTIALS) { /* * Unimplemented */ DEBUG_printf(("5http_sspi_client: server requested client credentials.")); ret = -1; break; } /* * Copy any leftover data from the "extra" buffer, and go around again. */ if (inBuffers[1].BufferType == SECBUFFER_EXTRA) { memmove(sspi->decryptBuffer, sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer, inBuffers[1].cbBuffer); sspi->decryptBufferUsed = inBuffers[1].cbBuffer; } else { sspi->decryptBufferUsed = 0; } } if (!ret) { /* * Success! Get the server cert */ sspi->contextInitialized = TRUE; scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (VOID *)&(sspi->remoteCert)); if (scRet != SEC_E_OK) { DEBUG_printf(("5http_sspi_client: QueryContextAttributes failed(SECPKG_ATTR_REMOTE_CERT_CONTEXT): %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); return (-1); } /* * Find out how big the header/trailer will be: */ scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_STREAM_SIZES, &sspi->streamSizes); if (scRet != SEC_E_OK) { DEBUG_printf(("5http_sspi_client: QueryContextAttributes failed(SECPKG_ATTR_STREAM_SIZES): %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); ret = -1; } } return (ret); } /* * 'http_sspi_create_credential()' - Create an SSPI certificate context. */ static PCCERT_CONTEXT /* O - Certificate context */ http_sspi_create_credential( http_credential_t *cred) /* I - Credential */ { if (cred) return (CertCreateCertificateContext(X509_ASN_ENCODING, cred->data, cred->datalen)); else return (NULL); } /* * 'http_sspi_find_credentials()' - Retrieve a TLS certificate from the system store. */ static BOOL /* O - 1 on success, 0 on failure */ http_sspi_find_credentials( http_t *http, /* I - HTTP connection */ const LPWSTR container, /* I - Cert container name */ const char *common_name) /* I - Common name of certificate */ { _http_sspi_t *sspi = http->tls; /* SSPI data */ HCERTSTORE store = NULL; /* Certificate store */ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */ DWORD dwSize = 0; /* 32 bit size */ PBYTE p = NULL; /* Temporary storage */ HCRYPTPROV hProv = (HCRYPTPROV)NULL; /* Handle to a CSP */ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */ SCHANNEL_CRED SchannelCred; /* Schannel credential data */ TimeStamp tsExpiry; /* Time stamp */ SECURITY_STATUS Status; /* Status */ BOOL ok = TRUE; /* Return value */ if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)) { if (GetLastError() == NTE_EXISTS) { if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { DEBUG_printf(("5http_sspi_find_credentials: CryptAcquireContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } } } store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY"); if (!store) { DEBUG_printf(("5http_sspi_find_credentials: CertOpenSystemStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } dwSize = 0; if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) { DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } p = (PBYTE)malloc(dwSize); if (!p) { DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize)); ok = FALSE; goto cleanup; } if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) { DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } sib.cbData = dwSize; sib.pbData = p; storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL); if (!storedContext) { DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name)); ok = FALSE; goto cleanup; } ZeroMemory(&SchannelCred, sizeof(SchannelCred)); SchannelCred.dwVersion = SCHANNEL_CRED_VERSION; SchannelCred.cCreds = 1; SchannelCred.paCred = &storedContext; /* * Set supported protocols (can also be overriden in the registry...) */ #ifdef SP_PROT_TLS1_2_SERVER if (http->mode == _HTTP_MODE_SERVER) { if (tls_min_version > _HTTP_TLS_1_1) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER; else if (tls_min_version > _HTTP_TLS_1_0) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER; else if (tls_min_version == _HTTP_TLS_SSL3) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER | SP_PROT_TLS1_0_SERVER | SP_PROT_SSL3_SERVER; else SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER | SP_PROT_TLS1_0_SERVER; } else { if (tls_min_version > _HTTP_TLS_1_1) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT; else if (tls_min_version > _HTTP_TLS_1_0) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT; else if (tls_min_version == _HTTP_TLS_SSL3) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_0_CLIENT | SP_PROT_SSL3_CLIENT; else SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_0_CLIENT; } #else if (http->mode == _HTTP_MODE_SERVER) { if (tls_min_version == _HTTP_TLS_SSL3) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER | SP_PROT_SSL3_SERVER; else SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER; } else { if (tls_min_version == _HTTP_TLS_SSL3) SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT | SP_PROT_SSL3_CLIENT; else SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT; } #endif /* SP_PROT_TLS1_2_SERVER */ /* TODO: Support _HTTP_TLS_ALLOW_RC4, _HTTP_TLS_ALLOW_DH, and _HTTP_TLS_DENY_CBC options; right now we'll rely on Windows registry to enable/disable RC4/DH/CBC... */ /* * Create an SSPI credential. */ Status = AcquireCredentialsHandle(NULL, UNISP_NAME, http->mode == _HTTP_MODE_SERVER ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND, NULL, &SchannelCred, NULL, NULL, &sspi->creds, &tsExpiry); if (Status != SEC_E_OK) { DEBUG_printf(("5http_sspi_find_credentials: AcquireCredentialsHandle failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status))); ok = FALSE; goto cleanup; } cleanup: /* * Cleanup */ if (storedContext) CertFreeCertificateContext(storedContext); if (p) free(p); if (store) CertCloseStore(store, 0); if (hProv) CryptReleaseContext(hProv, 0); return (ok); } /* * 'http_sspi_free()' - Close a connection and free resources. */ static void http_sspi_free(_http_sspi_t *sspi) /* I - SSPI data */ { if (!sspi) return; if (sspi->contextInitialized) DeleteSecurityContext(&sspi->context); if (sspi->decryptBuffer) free(sspi->decryptBuffer); if (sspi->readBuffer) free(sspi->readBuffer); if (sspi->writeBuffer) free(sspi->writeBuffer); if (sspi->localCert) CertFreeCertificateContext(sspi->localCert); if (sspi->remoteCert) CertFreeCertificateContext(sspi->remoteCert); free(sspi); } /* * 'http_sspi_make_credentials()' - Create a TLS certificate in the system store. */ static BOOL /* O - 1 on success, 0 on failure */ http_sspi_make_credentials( _http_sspi_t *sspi, /* I - SSPI data */ const LPWSTR container, /* I - Cert container name */ const char *common_name, /* I - Common name of certificate */ _http_mode_t mode, /* I - Client or server? */ int years) /* I - Years until expiration */ { HCERTSTORE store = NULL; /* Certificate store */ PCCERT_CONTEXT storedContext = NULL; /* Context created from the store */ PCCERT_CONTEXT createdContext = NULL; /* Context created by us */ DWORD dwSize = 0; /* 32 bit size */ PBYTE p = NULL; /* Temporary storage */ HCRYPTPROV hProv = (HCRYPTPROV)NULL; /* Handle to a CSP */ CERT_NAME_BLOB sib; /* Arbitrary array of bytes */ SCHANNEL_CRED SchannelCred; /* Schannel credential data */ TimeStamp tsExpiry; /* Time stamp */ SECURITY_STATUS Status; /* Status */ HCRYPTKEY hKey = (HCRYPTKEY)NULL; /* Handle to crypto key */ CRYPT_KEY_PROV_INFO kpi; /* Key container info */ SYSTEMTIME et; /* System time */ CERT_EXTENSIONS exts; /* Array of cert extensions */ CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */ BOOL ok = TRUE; /* Return value */ DEBUG_printf(("4http_sspi_make_credentials(sspi=%p, container=%p, common_name=\"%s\", mode=%d, years=%d)", sspi, container, common_name, mode, years)); if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)) { if (GetLastError() == NTE_EXISTS) { if (!CryptAcquireContextW(&hProv, (LPWSTR)container, MS_DEF_PROV_W, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { DEBUG_printf(("5http_sspi_make_credentials: CryptAcquireContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } } } store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY"); if (!store) { DEBUG_printf(("5http_sspi_make_credentials: CertOpenSystemStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } dwSize = 0; if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) { DEBUG_printf(("5http_sspi_make_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } p = (PBYTE)malloc(dwSize); if (!p) { DEBUG_printf(("5http_sspi_make_credentials: malloc failed for %d bytes", dwSize)); ok = FALSE; goto cleanup; } if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) { DEBUG_printf(("5http_sspi_make_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } /* * Create a private key and self-signed certificate... */ if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey)) { DEBUG_printf(("5http_sspi_make_credentials: CryptGenKey failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } ZeroMemory(&kpi, sizeof(kpi)); kpi.pwszContainerName = (LPWSTR)container; kpi.pwszProvName = MS_DEF_PROV_W; kpi.dwProvType = PROV_RSA_FULL; kpi.dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID; kpi.dwKeySpec = AT_KEYEXCHANGE; GetSystemTime(&et); et.wYear += years; if (et.wMonth == 2 && et.wDay == 29) et.wDay = 28; /* Avoid Feb 29th due to leap years */ ZeroMemory(&exts, sizeof(exts)); createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, NULL, NULL, &et, &exts); if (!createdContext) { DEBUG_printf(("5http_sspi_make_credentials: CertCreateSelfSignCertificate failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } /* * Add the created context to the named store, and associate it with the named * container... */ if (!CertAddCertificateContextToStore(store, createdContext, CERT_STORE_ADD_REPLACE_EXISTING, &storedContext)) { DEBUG_printf(("5http_sspi_make_credentials: CertAddCertificateContextToStore failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } ZeroMemory(&ckp, sizeof(ckp)); ckp.pwszContainerName = (LPWSTR) container; ckp.pwszProvName = MS_DEF_PROV_W; ckp.dwProvType = PROV_RSA_FULL; ckp.dwFlags = CRYPT_MACHINE_KEYSET; ckp.dwKeySpec = AT_KEYEXCHANGE; if (!CertSetCertificateContextProperty(storedContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &ckp)) { DEBUG_printf(("5http_sspi_make_credentials: CertSetCertificateContextProperty failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); ok = FALSE; goto cleanup; } /* * Get a handle to use the certificate... */ ZeroMemory(&SchannelCred, sizeof(SchannelCred)); SchannelCred.dwVersion = SCHANNEL_CRED_VERSION; SchannelCred.cCreds = 1; SchannelCred.paCred = &storedContext; /* * SSPI doesn't seem to like it if grbitEnabledProtocols is set for a client. */ if (mode == _HTTP_MODE_SERVER) SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1; /* * Create an SSPI credential. */ Status = AcquireCredentialsHandle(NULL, UNISP_NAME, mode == _HTTP_MODE_SERVER ? SECPKG_CRED_INBOUND : SECPKG_CRED_OUTBOUND, NULL, &SchannelCred, NULL, NULL, &sspi->creds, &tsExpiry); if (Status != SEC_E_OK) { DEBUG_printf(("5http_sspi_make_credentials: AcquireCredentialsHandle failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status))); ok = FALSE; goto cleanup; } cleanup: /* * Cleanup */ if (hKey) CryptDestroyKey(hKey); if (createdContext) CertFreeCertificateContext(createdContext); if (storedContext) CertFreeCertificateContext(storedContext); if (p) free(p); if (store) CertCloseStore(store, 0); if (hProv) CryptReleaseContext(hProv, 0); return (ok); } /* * 'http_sspi_server()' - Negotiate a TLS connection as a server. */ static int /* O - 0 on success, -1 on failure */ http_sspi_server(http_t *http, /* I - HTTP connection */ const char *hostname) /* I - Hostname of server */ { _http_sspi_t *sspi = http->tls; /* I - SSPI data */ char common_name[512]; /* Common name for cert */ DWORD dwSSPIFlags; /* SSL connection attributes we want */ DWORD dwSSPIOutFlags; /* SSL connection attributes we got */ TimeStamp tsExpiry; /* Time stamp */ SECURITY_STATUS scRet; /* SSPI Status */ SecBufferDesc inBuffer; /* Array of SecBuffer structs */ SecBuffer inBuffers[2]; /* Security package buffer */ SecBufferDesc outBuffer; /* Array of SecBuffer structs */ SecBuffer outBuffers[1]; /* Security package buffer */ int num = 0; /* 32 bit status value */ BOOL fInitContext = TRUE; /* Has the context been init'd? */ int ret = 0; /* Return value */ DEBUG_printf(("4http_sspi_server(http=%p, hostname=\"%s\")", http, hostname)); dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT | ASC_REQ_REPLAY_DETECT | ASC_REQ_CONFIDENTIALITY | ASC_REQ_EXTENDED_ERROR | ASC_REQ_ALLOCATE_MEMORY | ASC_REQ_STREAM; sspi->decryptBufferUsed = 0; /* * Lookup the server certificate... */ snprintf(common_name, sizeof(common_name), "CN=%s", hostname); if (!http_sspi_find_credentials(http, L"ServerContainer", common_name)) if (!http_sspi_make_credentials(http->tls, L"ServerContainer", common_name, _HTTP_MODE_SERVER, 10)) { DEBUG_puts("5http_sspi_server: Unable to get server credentials."); return (-1); } /* * Set OutBuffer for AcceptSecurityContext call */ outBuffer.cBuffers = 1; outBuffer.pBuffers = outBuffers; outBuffer.ulVersion = SECBUFFER_VERSION; scRet = SEC_I_CONTINUE_NEEDED; while (scRet == SEC_I_CONTINUE_NEEDED || scRet == SEC_E_INCOMPLETE_MESSAGE || scRet == SEC_I_INCOMPLETE_CREDENTIALS) { if (sspi->decryptBufferUsed == 0 || scRet == SEC_E_INCOMPLETE_MESSAGE) { if (sspi->decryptBufferLength <= sspi->decryptBufferUsed) { BYTE *temp; /* New buffer */ if (sspi->decryptBufferLength >= 262144) { WSASetLastError(E_OUTOFMEMORY); DEBUG_puts("5http_sspi_server: Decryption buffer too large (>256k)"); return (-1); } if ((temp = realloc(sspi->decryptBuffer, sspi->decryptBufferLength + 4096)) == NULL) { DEBUG_printf(("5http_sspi_server: Unable to allocate %d byte buffer.", sspi->decryptBufferLength + 4096)); WSASetLastError(E_OUTOFMEMORY); return (-1); } sspi->decryptBufferLength += 4096; sspi->decryptBuffer = temp; } for (;;) { num = recv(http->fd, sspi->decryptBuffer + sspi->decryptBufferUsed, (int)(sspi->decryptBufferLength - sspi->decryptBufferUsed), 0); if (num == -1 && WSAGetLastError() == WSAEWOULDBLOCK) Sleep(1); else break; } if (num < 0) { DEBUG_printf(("5http_sspi_server: recv failed: %d", WSAGetLastError())); return (-1); } else if (num == 0) { DEBUG_puts("5http_sspi_server: client disconnected"); return (-1); } DEBUG_printf(("5http_sspi_server: received %d (handshake) bytes from client.", num)); sspi->decryptBufferUsed += num; } /* * InBuffers[1] is for getting extra data that SSPI/SCHANNEL doesn't process * on this run around the loop. */ inBuffers[0].pvBuffer = sspi->decryptBuffer; inBuffers[0].cbBuffer = (unsigned long)sspi->decryptBufferUsed; inBuffers[0].BufferType = SECBUFFER_TOKEN; inBuffers[1].pvBuffer = NULL; inBuffers[1].cbBuffer = 0; inBuffers[1].BufferType = SECBUFFER_EMPTY; inBuffer.cBuffers = 2; inBuffer.pBuffers = inBuffers; inBuffer.ulVersion = SECBUFFER_VERSION; /* * Initialize these so if we fail, pvBuffer contains NULL, so we don't try to * free random garbage at the quit. */ outBuffers[0].pvBuffer = NULL; outBuffers[0].BufferType = SECBUFFER_TOKEN; outBuffers[0].cbBuffer = 0; scRet = AcceptSecurityContext(&sspi->creds, (fInitContext?NULL:&sspi->context), &inBuffer, dwSSPIFlags, SECURITY_NATIVE_DREP, (fInitContext?&sspi->context:NULL), &outBuffer, &dwSSPIOutFlags, &tsExpiry); fInitContext = FALSE; if (scRet == SEC_E_OK || scRet == SEC_I_CONTINUE_NEEDED || (FAILED(scRet) && ((dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR) != 0))) { if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) { /* * Send response to server if there is one. */ num = send(http->fd, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0); if (num <= 0) { DEBUG_printf(("5http_sspi_server: handshake send failed: %d", WSAGetLastError())); return (-1); } DEBUG_printf(("5http_sspi_server: sent %d handshake bytes to client.", outBuffers[0].cbBuffer)); FreeContextBuffer(outBuffers[0].pvBuffer); outBuffers[0].pvBuffer = NULL; } } if (scRet == SEC_E_OK) { /* * If there's extra data then save it for next time we go to decrypt. */ if (inBuffers[1].BufferType == SECBUFFER_EXTRA) { memcpy(sspi->decryptBuffer, (LPBYTE)(sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer), inBuffers[1].cbBuffer); sspi->decryptBufferUsed = inBuffers[1].cbBuffer; } else { sspi->decryptBufferUsed = 0; } break; } else if (FAILED(scRet) && scRet != SEC_E_INCOMPLETE_MESSAGE) { DEBUG_printf(("5http_sspi_server: AcceptSecurityContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); ret = -1; break; } if (scRet != SEC_E_INCOMPLETE_MESSAGE && scRet != SEC_I_INCOMPLETE_CREDENTIALS) { if (inBuffers[1].BufferType == SECBUFFER_EXTRA) { memcpy(sspi->decryptBuffer, (LPBYTE)(sspi->decryptBuffer + sspi->decryptBufferUsed - inBuffers[1].cbBuffer), inBuffers[1].cbBuffer); sspi->decryptBufferUsed = inBuffers[1].cbBuffer; } else { sspi->decryptBufferUsed = 0; } } } if (!ret) { sspi->contextInitialized = TRUE; /* * Find out how big the header will be: */ scRet = QueryContextAttributes(&sspi->context, SECPKG_ATTR_STREAM_SIZES, &sspi->streamSizes); if (scRet != SEC_E_OK) { DEBUG_printf(("5http_sspi_server: QueryContextAttributes failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); ret = -1; } } return (ret); } /* * 'http_sspi_strerror()' - Return a string for the specified error code. */ static const char * /* O - String for error */ http_sspi_strerror(char *buffer, /* I - Error message buffer */ size_t bufsize, /* I - Size of buffer */ DWORD code) /* I - Error code */ { if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, 0, buffer, bufsize, NULL)) { /* * Strip trailing CR + LF... */ char *ptr; /* Pointer into error message */ for (ptr = buffer + strlen(buffer) - 1; ptr >= buffer; ptr --) if (*ptr == '\n' || *ptr == '\r') *ptr = '\0'; else break; } else snprintf(buffer, bufsize, "Unknown error %x", code); return (buffer); } /* * 'http_sspi_verify()' - Verify a certificate. */ static DWORD /* O - Error code (0 == No error) */ http_sspi_verify( PCCERT_CONTEXT cert, /* I - Server certificate */ const char *common_name, /* I - Common name */ DWORD dwCertFlags) /* I - Verification flags */ { HTTPSPolicyCallbackData httpsPolicy; /* HTTPS Policy Struct */ CERT_CHAIN_POLICY_PARA policyPara; /* Cert chain policy parameters */ CERT_CHAIN_POLICY_STATUS policyStatus;/* Cert chain policy status */ CERT_CHAIN_PARA chainPara; /* Used for searching and matching criteria */ PCCERT_CHAIN_CONTEXT chainContext = NULL; /* Certificate chain */ PWSTR commonNameUnicode = NULL; /* Unicode common name */ LPSTR rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH, szOID_SERVER_GATED_CRYPTO, szOID_SGC_NETSCAPE }; /* How are we using this certificate? */ DWORD cUsages = sizeof(rgszUsages) / sizeof(LPSTR); /* Number of ites in rgszUsages */ DWORD count; /* 32 bit count variable */ DWORD status; /* Return value */ #ifdef DEBUG char error[1024]; /* Error message string */ #endif /* DEBUG */ if (!cert) return (SEC_E_WRONG_PRINCIPAL); /* * Convert common name to Unicode. */ if (!common_name || !*common_name) return (SEC_E_WRONG_PRINCIPAL); count = MultiByteToWideChar(CP_ACP, 0, common_name, -1, NULL, 0); commonNameUnicode = LocalAlloc(LMEM_FIXED, count * sizeof(WCHAR)); if (!commonNameUnicode) return (SEC_E_INSUFFICIENT_MEMORY); if (!MultiByteToWideChar(CP_ACP, 0, common_name, -1, commonNameUnicode, count)) { LocalFree(commonNameUnicode); return (SEC_E_WRONG_PRINCIPAL); } /* * Build certificate chain. */ ZeroMemory(&chainPara, sizeof(chainPara)); chainPara.cbSize = sizeof(chainPara); chainPara.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; chainPara.RequestedUsage.Usage.cUsageIdentifier = cUsages; chainPara.RequestedUsage.Usage.rgpszUsageIdentifier = rgszUsages; if (!CertGetCertificateChain(NULL, cert, NULL, cert->hCertStore, &chainPara, 0, NULL, &chainContext)) { status = GetLastError(); DEBUG_printf(("CertGetCertificateChain returned: %s", http_sspi_strerror(error, sizeof(error), status))); LocalFree(commonNameUnicode); return (status); } /* * Validate certificate chain. */ ZeroMemory(&httpsPolicy, sizeof(HTTPSPolicyCallbackData)); httpsPolicy.cbStruct = sizeof(HTTPSPolicyCallbackData); httpsPolicy.dwAuthType = AUTHTYPE_SERVER; httpsPolicy.fdwChecks = dwCertFlags; httpsPolicy.pwszServerName = commonNameUnicode; memset(&policyPara, 0, sizeof(policyPara)); policyPara.cbSize = sizeof(policyPara); policyPara.pvExtraPolicyPara = &httpsPolicy; memset(&policyStatus, 0, sizeof(policyStatus)); policyStatus.cbSize = sizeof(policyStatus); if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chainContext, &policyPara, &policyStatus)) { status = GetLastError(); DEBUG_printf(("CertVerifyCertificateChainPolicy returned %s", http_sspi_strerror(error, sizeof(error), status))); } else if (policyStatus.dwError) status = policyStatus.dwError; else status = SEC_E_OK; if (chainContext) CertFreeCertificateChain(chainContext); if (commonNameUnicode) LocalFree(commonNameUnicode); return (status); } cups-2.3.1/cups/raster-error.c000664 000765 000024 00000005036 13574721672 016350 0ustar00mikestaff000000 000000 /* * Raster error handling for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "raster-private.h" #include "debug-internal.h" /* * '_cupsRasterAddError()' - Add an error message to the error buffer. */ void _cupsRasterAddError(const char *f, /* I - Printf-style error message */ ...) /* I - Additional arguments as needed */ { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ va_list ap; /* Pointer to additional arguments */ char s[2048]; /* Message string */ ssize_t bytes; /* Bytes in message string */ DEBUG_printf(("_cupsRasterAddError(f=\"%s\", ...)", f)); va_start(ap, f); bytes = vsnprintf(s, sizeof(s), f, ap); va_end(ap); if (bytes <= 0) return; DEBUG_printf(("1_cupsRasterAddError: %s", s)); bytes ++; if ((size_t)bytes >= sizeof(s)) return; if (bytes > (ssize_t)(buf->end - buf->current)) { /* * Allocate more memory... */ char *temp; /* New buffer */ size_t size; /* Size of buffer */ size = (size_t)(buf->end - buf->start + 2 * bytes + 1024); if (buf->start) temp = realloc(buf->start, size); else temp = malloc(size); if (!temp) return; /* * Update pointers... */ buf->end = temp + size; buf->current = temp + (buf->current - buf->start); buf->start = temp; } /* * Append the message to the end of the current string... */ memcpy(buf->current, s, (size_t)bytes); buf->current += bytes - 1; } /* * '_cupsRasterClearError()' - Clear the error buffer. */ void _cupsRasterClearError(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ buf->current = buf->start; if (buf->start) *(buf->start) = '\0'; } /* * '_cupsRasterErrorString()' - Return the last error from a raster function. * * If there are no recent errors, NULL is returned. * * @since CUPS 1.3/macOS 10.5@ */ const char * /* O - Last error */ _cupsRasterErrorString(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ if (buf->current == buf->start) return (NULL); else return (buf->start); } cups-2.3.1/cups/testfile.txt000664 000765 000024 00000075344 13574721672 016146 0ustar00mikestaff000000 000000 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi faucibus viverra nibh ut molestie. Sed aliquet vestibulum dignissim. Praesent dignissim mauris arcu. Donec porta velit quis nibh rutrum sollicitudin. Aliquam vel tellus vulputate, sollicitudin turpis in, luctus quam. Donec hendrerit enim dignissim varius tincidunt. Phasellus mi felis, ultrices nec magna in, ultrices interdum justo. Nulla aliquam sem ac porta tincidunt. Praesent nec fermentum mauris. Suspendisse ullamcorper mauris orci, eu ornare dui mollis quis. In vitae lorem id nulla pellentesque sagittis. Duis aliquet ligula nisl, sed mollis sapien commodo nec. Etiam placerat arcu turpis, eget viverra magna ultrices sed. Nullam dapibus urna et tristique consectetur. Curabitur iaculis nisl lobortis condimentum accumsan. Praesent sagittis purus nunc, vitae bibendum leo ornare a. Maecenas neque mauris, mollis a sem ut, rhoncus posuere orci. Aliquam luctus suscipit erat ut semper. In neque augue, vulputate ornare massa fermentum, sodales faucibus mauris. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque mattis ante nunc, sit amet blandit felis cursus sed. Quisque pellentesque ipsum ac mauris fringilla, a rhoncus nunc lacinia. Vestibulum tempor orci ut nisl cursus, at euismod sem sodales. Integer ornare tellus at sapien tincidunt ultrices. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer placerat eleifend magna, eget volutpat nibh vulputate eget. Donec cursus orci nisl, eget malesuada sem porta at. Sed maximus eleifend leo, posuere pellentesque urna viverra id. Aenean pharetra nunc ut suscipit aliquam. Sed dolor massa, ultrices sed sollicitudin nec, dapibus vitae tortor. Cras in scelerisque tellus. Sed eu felis vitae neque tempor eleifend vitae ac augue. Nunc felis ex, fringilla quis sapien vel, tempor congue nibh. Nullam placerat sit amet lacus quis facilisis. Sed semper nisi eget auctor semper. Phasellus sodales tempus massa ut suscipit. Integer malesuada convallis neque, sed pretium leo rhoncus ac. In hac habitasse platea dictumst. Nullam efficitur mollis lorem. Integer convallis lobortis dictum. Suspendisse euismod in mauris vel pharetra. Sed vitae magna ut turpis viverra rhoncus ut sit amet mauris. Nam vel lacinia metus. Proin ut elementum felis. Nullam massa velit, euismod vel metus eget, feugiat aliquet odio. Fusce venenatis lorem ut lectus ultricies, vitae accumsan nibh dictum. Maecenas porta euismod cursus. Nunc at ligula congue, lobortis quam id, volutpat felis. Proin blandit pulvinar ligula, at dapibus dui rutrum dictum. Etiam non finibus urna. Pellentesque semper pharetra arcu non dapibus. Vestibulum gravida dictum libero, quis dictum odio hendrerit sit amet. Aenean a venenatis ante, tincidunt convallis orci. Morbi tincidunt, orci vitae suscipit lacinia, nisl nunc rutrum ex, vitae convallis nulla libero ut mauris. Donec ac pellentesque sapien. Phasellus elementum orci a nisl feugiat tempus. Quisque id justo sed tellus ultricies porttitor. Fusce elementum mauris nunc. Nullam vel elit ultrices, rhoncus elit id, scelerisque erat. Pellentesque molestie efficitur purus, at malesuada orci efficitur et. Curabitur blandit nisi a ante viverra, vel ornare turpis molestie. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras scelerisque est non velit placerat, eu volutpat sem fermentum. Cras vitae gravida nisi, non vestibulum velit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras sollicitudin rutrum tincidunt. Pellentesque non nisl condimentum, commodo turpis non, fringilla ante. Nunc non ante vel est porttitor tempor sed vitae nunc. Donec bibendum orci justo, lobortis laoreet purus accumsan vel. Phasellus non posuere orci. In hac habitasse platea dictumst. Praesent nec mi sit amet urna ornare pulvinar faucibus at sem. Vestibulum vel cursus nisl, vel ultricies justo. Proin sed consequat odio, eget dignissim dolor. Fusce mattis porttitor nulla rutrum aliquet. Duis vehicula enim nec condimentum dignissim. Phasellus viverra ex at erat lacinia varius. Nullam rutrum felis ac lacus dignissim elementum quis sit amet felis. Phasellus eget sapien sit amet sapien maximus tincidunt elementum ut ante. Mauris dictum pulvinar diam ac lobortis. Duis vitae dui metus. Donec imperdiet risus vitae augue placerat ultrices. Integer euismod, sapien sit amet faucibus venenatis, nisl lacus rhoncus lacus, a auctor justo ante sed turpis. Integer facilisis est non venenatis hendrerit. Vivamus quis ante sodales, mollis turpis in, bibendum turpis. In hac habitasse platea dictumst. Phasellus nisl est, porta feugiat eros ut, scelerisque efficitur diam. Suspendisse sit amet magna libero. Quisque eu arcu vel orci iaculis sagittis nec id orci. Mauris mattis nunc id quam tristique pellentesque. Vestibulum vehicula, mauris ac venenatis lobortis, ex risus bibendum nunc, eu bibendum dolor metus vitae purus. Ut bibendum sed ante viverra tincidunt. Vestibulum id semper lacus. Fusce lacinia dignissim semper. Proin diam enim, pellentesque vel dui eu, maximus tincidunt mauris. Cras lorem lectus, malesuada non dui ac, iaculis elementum justo. Fusce fringilla tempor arcu. Proin vel turpis vitae purus facilisis dapibus condimentum sed ipsum. Duis mollis justo at ante convallis ornare. Suspendisse accumsan eleifend mauris, ut aliquet eros scelerisque eget. Proin ornare elit eu felis dapibus, sit amet posuere est porttitor. Vivamus tincidunt metus ac nisl pharetra, vel mollis neque egestas. Quisque turpis ligula, lacinia id suscipit eget, cursus eget mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales, urna eget luctus congue, metus magna viverra nisl, ut eleifend nulla urna eu arcu. Pellentesque interdum interdum erat, et hendrerit arcu rhoncus ut. Nulla congue tortor nec egestas aliquam. Nulla elementum augue eu est imperdiet, nec maximus sapien ornare. Donec aliquam blandit felis, sed vulputate orci ultrices non. Vivamus rutrum dapibus ligula, non ullamcorper ante eleifend vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam sed lacus condimentum odio commodo tristique. Proin ultrices non tellus sit amet condimentum. Ut aliquam nulla eget viverra aliquet. Fusce aliquet orci nec finibus tempor. Etiam luctus eleifend diam vitae tempor. Fusce sagittis porttitor dignissim. Morbi euismod pellentesque mi vel malesuada. Praesent cursus rutrum diam sit amet auctor. Praesent non leo consequat, dapibus massa pellentesque, egestas nulla. Nulla efficitur luctus purus eu aliquet. Phasellus sed enim pharetra, molestie felis eget, tempor neque. Proin efficitur vestibulum libero ut hendrerit. Mauris vitae vestibulum augue, in pellentesque ligula. Phasellus at libero dictum, pretium mauris vitae, elementum ex. Pellentesque ut euismod orci. In ac elit vel nisl bibendum fermentum eget in dui. Donec fringilla, nisl vitae tincidunt varius, tellus sapien accumsan lectus, ac tincidunt eros ipsum nec libero. Sed mollis purus nec magna tempus, vitae laoreet purus luctus. Morbi accumsan, urna eget placerat volutpat, nunc magna mattis mi, vitae efficitur eros quam quis lacus. Etiam eros ligula, tempus vel consectetur non, consectetur quis risus. Phasellus venenatis lectus arcu, quis bibendum diam dignissim a. Donec tristique, felis quis dignissim tempor, justo sapien faucibus odio, at venenatis arcu purus et justo. Nunc vel ex a augue luctus pharetra ac ac turpis. Proin auctor turpis lobortis, scelerisque mi sit amet, elementum dui. Duis blandit arcu eros, eu dapibus enim imperdiet sed. Sed auctor urna sed lectus condimentum rhoncus. Mauris luctus dolor rhoncus suscipit semper. Sed molestie felis ut laoreet porta. Duis at purus viverra, faucibus elit eu, fringilla odio. Suspendisse sit amet sodales urna. In hac habitasse platea dictumst. Integer a sem sed augue sodales dictum. Quisque ut nisi pellentesque, lobortis lectus et, hendrerit eros. Phasellus posuere metus sit amet orci viverra vehicula. Nulla urna est, pellentesque in placerat ut, congue a ligula. Maecenas non viverra arcu. Vivamus fermentum odio tincidunt tellus tempus, ut suscipit justo hendrerit. Nunc quis sapien eget turpis mollis porta. Curabitur ultrices est molestie lacus finibus, vel sodales leo aliquam. Quisque ultrices semper porta. Nulla facilisi. Aenean nunc leo, ultrices quis augue non, hendrerit semper lectus. Nulla facilisi. In in volutpat tellus. Sed tincidunt efficitur sem, vel bibendum ex pharetra eleifend. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed nec erat at ipsum fringilla commodo eget eu est. Donec suscipit ligula eu ipsum lobortis tristique. Nulla dignissim nisi quis dignissim faucibus. Nunc finibus lacus eget est laoreet ultrices. Fusce molestie mattis facilisis. Fusce dictum blandit sem ac tincidunt. Suspendisse aliquam, dolor ac tincidunt scelerisque, lacus leo luctus quam, ac auctor ligula neque quis dolor. Maecenas laoreet viverra lectus, eget hendrerit urna congue ac. Donec convallis, erat ut consectetur ornare, diam diam accumsan lacus, at consectetur mauris nisi vitae massa. Vestibulum vestibulum dictum volutpat. Quisque et commodo velit. Praesent in odio nunc. Vivamus consectetur leo sem, sit amet auctor arcu blandit vitae. Donec non auctor mauris. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin nibh tellus, fermentum quis erat in, vulputate faucibus nunc. Vestibulum imperdiet ipsum purus, eget efficitur mi hendrerit vel. Aenean iaculis elementum metus nec consectetur. Suspendisse felis turpis, maximus sit amet diam at, elementum vestibulum nulla. Quisque et lacinia elit. Pellentesque tincidunt bibendum neque, non molestie massa ultrices eget. Duis scelerisque magna in blandit dictum. Pellentesque lacinia augue vitae fermentum mollis. Etiam mi velit, tempor at risus vel, luctus vestibulum odio. Phasellus vel ipsum sit amet velit malesuada hendrerit. Donec consequat laoreet enim. Aliquam sed justo eget ex rhoncus laoreet. Duis maximus tortor at odio suscipit, non accumsan arcu efficitur. Nunc pharetra id neque nec dignissim. Sed condimentum magna ut viverra porttitor. Pellentesque rutrum magna et pretium semper. Fusce tincidunt ipsum at auctor commodo. Duis et ipsum nec turpis pharetra pulvinar a nec risus. Praesent in enim et ligula maximus consectetur. Aenean nec turpis turpis. Quisque mollis dignissim elit, sit amet interdum urna venenatis sit amet. Quisque interdum, diam eu ullamcorper suscipit, augue purus fermentum purus, nec consequat purus nibh laoreet lectus. Ut nisi mauris, ultrices non euismod ac, mollis id libero. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras vitae tristique mi. Mauris ut bibendum dolor. Suspendisse potenti. Ut tempus ultricies erat, a molestie sapien aliquet non. Aliquam sagittis nisi vel enim rhoncus eleifend. Proin aliquam eros ut metus consectetur suscipit. Curabitur ornare mi eget faucibus aliquam. Praesent ultricies libero est, eget porttitor risus ornare nec. Curabitur pharetra ex ut eleifend lacinia. Nam nec finibus nunc. Sed hendrerit risus nisi, eu sollicitudin tellus sollicitudin nec. Proin vel est leo. Fusce et orci finibus, auctor purus eu, varius magna. Sed sollicitudin elit vitae turpis tincidunt, at suscipit lacus ultricies. Mauris pretium, nisi sed cursus ullamcorper, sem sem vulputate neque, a pellentesque lectus massa vel metus. Sed tincidunt iaculis lectus, non facilisis elit finibus at. Nunc odio purus, eleifend ac pretium nec, malesuada condimentum eros. Aenean interdum dolor et malesuada auctor. Donec placerat velit ex, vel cursus metus posuere sed. Phasellus rutrum nisl vel imperdiet egestas. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam volutpat quam ut risus ultricies blandit. Mauris commodo ullamcorper pretium. Nam interdum lobortis eleifend. Fusce quam nisl, feugiat vitae dui non, egestas eleifend erat. Mauris in ligula purus. Morbi vel mollis diam. Praesent leo felis, luctus ac blandit sit amet, aliquam at enim. Duis sit amet augue enim. Donec feugiat ultricies neque, ut porttitor lectus sagittis ut. Sed ante sem, mollis ut dui quis, finibus rutrum justo. Phasellus ornare nibh ac scelerisque fringilla. Donec rhoncus luctus elit sed accumsan. Maecenas fermentum quam nec eros consequat, vitae sollicitudin elit facilisis. Phasellus urna metus, viverra at nibh ac, euismod fringilla mi. Aliquam nec odio neque. Duis pulvinar congue aliquam. Suspendisse laoreet bibendum sapien, non ultricies velit porta id. Vivamus dignissim rhoncus mi, sit amet mollis arcu cursus nec. Maecenas sagittis cursus dictum. Nam fermentum tincidunt pellentesque. Vivamus tempus tincidunt rutrum. Mauris semper orci non scelerisque accumsan. Nulla fermentum in lacus at aliquet. Proin ut ligula venenatis, maximus elit a, finibus felis. Nam euismod arcu vel diam laoreet, sed hendrerit urna pharetra. Phasellus non hendrerit tortor. Donec ut congue odio. Nunc pellentesque ipsum et est venenatis, sed vehicula magna convallis. Quisque eget euismod orci. In ut nulla ac augue auctor dapibus a vel arcu. Duis elementum, libero at ullamcorper consequat, libero nulla vestibulum elit, vel congue lacus nulla quis nulla. Nulla vel dolor vulputate, dictum nunc nec, pellentesque lacus. Nulla nibh mi, gravida vel velit vel, tempus dapibus magna. Mauris ornare elementum feugiat. Vestibulum non finibus lorem, a ullamcorper quam. Duis eget velit sodales, rhoncus odio nec, laoreet lorem. Donec fermentum est eu ornare placerat. Sed interdum metus ac metus hendrerit rhoncus. In molestie diam sem, et faucibus purus lacinia eu. Donec quam arcu, tempus ac commodo sit amet, porttitor sit amet urna. Suspendisse pellentesque placerat mi, at semper orci tincidunt non. Fusce ut mattis nisi. Pellentesque vel nisi quis massa volutpat aliquam vel nec tortor. Maecenas vitae risus quis nibh vestibulum rutrum. Vestibulum egestas dolor ullamcorper lorem placerat tincidunt. Curabitur massa urna, pharetra sed gravida vitae, venenatis a tellus. Duis condimentum lectus tellus, ut sodales ipsum hendrerit ac. Nullam sed accumsan arcu, ut sollicitudin diam. Integer eu ligula vitae purus vehicula vulputate nec et metus. Aenean mollis tempor lectus eu elementum. Integer in dui tempus, porttitor erat sed, malesuada magna. Cras nec orci sed tellus porta tristique a ac dui. Nam eu faucibus mi. Praesent condimentum laoreet augue id pellentesque. In malesuada ex sed turpis consectetur, non sodales mi cursus. Nunc id sem luctus, mattis lorem vel, tempus ipsum. Nunc efficitur augue et nunc hendrerit, non tincidunt magna commodo. Aenean sodales porta mi. Sed semper accumsan turpis vitae aliquam. Phasellus vitae ex faucibus, suscipit ante non, commodo ligula. Aliquam erat volutpat. Etiam odio sem, fringilla in sem eu, bibendum ornare est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec fringilla magna. Morbi eu cursus sem. Fusce euismod eget turpis et bibendum. Donec vel tincidunt neque. Suspendisse commodo euismod sodales. Integer pretium congue tortor nec ullamcorper. Nam imperdiet, urna auctor pretium facilisis, sem arcu malesuada turpis, sit amet sodales nisi lectus sollicitudin tellus. Praesent consequat leo in dui congue, euismod ornare risus malesuada. Nunc id tincidunt tortor. Vestibulum sit amet sapien urna. Donec quis tristique elit, non facilisis neque. Donec gravida molestie tellus, sagittis accumsan metus varius eu. Duis nec est vitae augue laoreet rhoncus non nec mi. Phasellus pretium pharetra magna, et congue urna posuere eget. Sed finibus arcu magna, sed luctus ante suscipit quis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce at accumsan quam. Mauris dolor lectus, tempus auctor ante ut, auctor maximus turpis. Proin pulvinar dolor in consectetur aliquam. Fusce sagittis elementum fermentum. Aliquam nec posuere ipsum. Nulla commodo est at magna fringilla lobortis. Etiam diam orci, venenatis non erat iaculis, commodo hendrerit diam. Nam imperdiet justo vitae massa consectetur, ornare feugiat ipsum molestie. Curabitur dignissim vitae augue et euismod. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent justo nunc, pellentesque vel ante vitae, dignissim maximus felis. Proin vel congue nisl. Quisque ac tempus libero. In at placerat tellus. Integer lobortis ligula vel dolor ornare finibus. Donec semper nisl mauris, eu consectetur lacus sollicitudin a. Integer sem enim, consectetur sed tincidunt id, dignissim at mauris. In a justo non erat cursus tincidunt et sed sapien. Aenean vulputate placerat ornare. Etiam id lectus lacus. Donec a sodales sapien. Duis in suscipit est, ultrices mollis magna. Etiam blandit diam vitae sollicitudin sodales. Proin vel diam nec neque ullamcorper ullamcorper ut at sapien. Sed quis sollicitudin libero. Nulla sed arcu consequat, egestas libero viverra, dignissim magna. Nullam semper turpis a sem tincidunt, ut molestie ante tincidunt. Curabitur efficitur nisl quis aliquam tristique. Proin a auctor lectus. Donec dictum mauris a leo consequat, eu bibendum neque efficitur. Donec euismod, mi nec faucibus ornare, elit est tincidunt ligula, at molestie neque augue non justo. Vestibulum condimentum varius felis non pretium. Praesent maximus ex sed justo tristique elementum. Phasellus nec feugiat dolor. Nulla sed odio quam. Nulla nec massa sit amet tellus efficitur accumsan sed et orci. Nullam sed mollis augue, eget dictum metus. Etiam ut velit elit. Nullam nibh eros, commodo vitae maximus sit amet, convallis sit amet elit. Nullam faucibus arcu tortor, vitae tincidunt augue ullamcorper in. Praesent quis metus et purus volutpat pulvinar. Sed commodo vehicula sodales. Phasellus fringilla vehicula placerat. Vestibulum sit amet ante in ante condimentum laoreet. Sed id purus diam. Suspendisse in libero in risus eleifend fringilla. Cras non sapien vel sapien condimentum tristique. Integer non semper mi, a aliquet enim. Phasellus congue erat sed lorem molestie consectetur. Integer iaculis nisi et nisi blandit auctor. Nullam magna diam, hendrerit sollicitudin urna vel, gravida congue diam. Curabitur finibus ipsum ex, ac feugiat massa posuere at. Pellentesque in molestie lorem. Fusce rhoncus velit at magna accumsan convallis. Aliquam posuere elementum turpis, eget eleifend quam auctor et. Mauris a diam vitae magna malesuada fermentum sit amet ut justo. Quisque in purus et erat rhoncus accumsan. Donec feugiat, ipsum vel pulvinar suscipit, nibh nisi volutpat felis, nec rutrum nisi turpis at diam. Suspendisse posuere, ante ut imperdiet tempor, tortor magna maximus risus, id fermentum urna mauris hendrerit magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut eu faucibus neque. Fusce tempus luctus dui ut ullamcorper. Suspendisse in velit a turpis facilisis scelerisque. Nullam ultricies sodales convallis. Proin viverra vulputate justo sit amet interdum. Donec mi neque, dapibus ac ex at, dignissim tincidunt lacus. Praesent ultricies, erat ac sagittis tempor, justo turpis porta tortor, eget consectetur turpis odio sed nibh. Vestibulum vitae porta lorem, efficitur viverra enim. Nullam sodales sagittis tristique. Duis ac velit ultrices, efficitur tortor sit amet, varius lacus. Praesent blandit et arcu sit amet tempus. Quisque neque lectus, congue at rutrum at, commodo eu velit. Aliquam sed mi a ante condimentum consectetur. Morbi feugiat risus dolor, ac auctor massa ultrices in. Praesent laoreet metus non urna rhoncus, vel lacinia ex dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vitae arcu vel enim feugiat rhoncus. Nullam nec neque sed nulla hendrerit iaculis sed non erat. Pellentesque orci lacus, ullamcorper posuere odio vel, efficitur elementum ipsum. Morbi justo risus, faucibus sit amet urna eu, facilisis consequat ipsum. Quisque et congue ipsum, at ornare lacus. Nunc laoreet elit nec arcu lobortis consectetur. Sed consectetur ultrices risus, quis tincidunt lectus fermentum at. Nunc libero sem, dignissim pharetra lacinia eu, posuere quis libero. Sed at lacus consectetur, molestie nisi quis, scelerisque tortor. Etiam accumsan placerat nulla, vel consectetur felis aliquam et. Cras pellentesque massa a ex commodo condimentum. Integer nec nulla sed metus dignissim placerat. Ut vel urna augue. Donec pharetra justo ac ex pretium, ut condimentum erat lacinia. Nunc id porta nunc, ac dapibus massa. Suspendisse accumsan justo quis felis pharetra tempus. Donec rutrum nulla in consectetur tincidunt. Sed eu orci eu ligula maximus aliquet eget sed ex. Donec rhoncus fringilla tellus, a bibendum mi placerat eu. Pellentesque luctus finibus neque blandit pharetra. Aenean nec elit pretium, sodales lacus sed, mollis felis. Duis commodo pellentesque risus et semper. Praesent pretium, libero pharetra fringilla faucibus, ipsum urna porta nunc, nec euismod dolor risus eget lacus. Curabitur malesuada dapibus tellus ut luctus. Aliquam gravida mauris tellus, ut vestibulum massa dignissim vestibulum. Sed pulvinar, ex et consequat malesuada, erat tellus bibendum mi, nec auctor nulla massa eu justo. Suspendisse imperdiet interdum ligula. Donec at pretium urna. Donec quis diam leo. Aenean ac lectus non justo aliquam consequat vitae mattis ipsum. Integer at consectetur felis, et volutpat sapien. Suspendisse efficitur libero eu pulvinar cursus. Suspendisse interdum enim id nibh imperdiet, et pulvinar lectus aliquet. Donec ultricies mattis lorem eget malesuada. Sed hendrerit massa in rutrum auctor. Suspendisse interdum mauris in sem vestibulum volutpat. Maecenas interdum facilisis dui, posuere volutpat eros suscipit eget. Curabitur blandit odio turpis, non dignissim magna varius sit amet. Suspendisse cursus ipsum id metus venenatis, eu malesuada arcu congue. Nulla vitae mi ut nibh pretium cursus in vitae turpis. In hac habitasse platea dictumst. Phasellus consectetur, metus at tempus sollicitudin, nibh est molestie nunc, sed imperdiet purus sapien in lorem. Etiam eget leo nec sem efficitur luctus. Vestibulum mattis a odio ut volutpat. Duis consequat magna eget luctus vulputate. Nam viverra posuere ultricies. Duis sagittis nunc et sem sagittis venenatis. Sed massa lacus, vestibulum eget convallis ac, facilisis nec turpis. Morbi ac ornare ex. Quisque non laoreet lectus, sed tempus libero. Sed non neque risus. Sed gravida, mauris ac aliquam porttitor, dolor massa faucibus est, eget vestibulum eros eros et risus. Morbi sit amet tincidunt eros, ut cursus mauris. Integer a lectus pharetra, molestie massa vel, laoreet sem. Suspendisse et enim libero. Nam molestie risus nec ex laoreet, a faucibus massa rhoncus. Vivamus faucibus sapien eget lorem efficitur auctor. Curabitur sit amet leo non massa tempor bibendum. Nunc in tristique est. Donec id mollis mauris, vel porta magna. Nulla vulputate eleifend lacus sed tincidunt. Maecenas vitae sapien eu neque hendrerit venenatis sit amet nec nulla. Morbi vestibulum dui lectus, id commodo dui vehicula eget. Nulla laoreet turpis vitae lacus vehicula lacinia. Integer rhoncus tellus mi, vitae gravida metus convallis quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris et accumsan sem. Sed elementum egestas tellus eget eleifend. Sed finibus luctus felis. Maecenas ultrices sodales orci non dapibus. Phasellus vitae lacus at diam ultrices mattis porta non ipsum. Aliquam erat volutpat. Vestibulum auctor diam vehicula gravida volutpat. In rhoncus, dui sit amet consequat convallis, odio mauris tincidunt mi, vestibulum imperdiet lacus erat sed metus. Aenean in augue eu tortor dictum tempor a ac magna. Mauris aliquet justo eget sem sollicitudin, congue facilisis velit mollis. Proin dignissim, nulla a efficitur fringilla, orci nulla malesuada velit, eget cursus dolor metus vitae nisl. Phasellus non neque ipsum. Pellentesque porta vehicula ipsum, nec posuere urna bibendum et. Etiam nec nisl eu nulla tempus placerat. Pellentesque risus magna, accumsan vitae sem vitae, cursus fermentum elit. Ut varius efficitur turpis, et pellentesque libero rutrum hendrerit. Maecenas condimentum lobortis eros, a euismod metus. Ut risus sapien, pulvinar quis euismod id, vestibulum ac erat. Donec feugiat tempor commodo. Donec ligula est, aliquet eu sagittis eu, posuere vel eros. Nullam sollicitudin diam eget libero malesuada, vel tempus lectus congue. Praesent a odio risus. Nullam maximus tellus sed ligula eleifend, sed mollis nunc consequat. Quisque eros mi, imperdiet nec ipsum in, pretium feugiat nibh. Pellentesque cursus justo at metus condimentum consectetur. Nulla facilisi. Ut tincidunt sem eget diam rhoncus, vitae gravida ipsum facilisis. Integer et condimentum purus. Sed faucibus tempus orci, id cursus eros volutpat non. Nam pulvinar ex nec enim egestas ultricies. Suspendisse at eros ac metus sodales varius eu in ante. Cras sed est quis magna tempus mollis id faucibus nibh. Curabitur convallis nisi dolor, in imperdiet ante tempor eu. Quisque placerat leo et leo cursus, nec eleifend urna scelerisque. Duis consequat ex a sapien facilisis consectetur. Vivamus et aliquam lacus. Praesent consequat lacus in aliquam ultricies. Sed consectetur vehicula aliquet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus tellus neque, eleifend sed purus quis, elementum luctus mi. Nullam elit lacus, finibus a sollicitudin in, suscipit non nunc. Nulla vulputate odio vitae mauris tristique, ac interdum urna interdum. Phasellus nec tortor hendrerit, mattis ante non, pharetra tortor. Pellentesque vitae tempor urna, ut gravida enim. Sed eget sem purus. Nunc semper quam mi, sed mollis ligula feugiat at. Pellentesque finibus augue risus, et ultricies lacus scelerisque vel. Proin euismod tortor quam, et cursus ipsum dictum ac. Suspendisse laoreet velit consequat ullamcorper cursus. Nam ultricies gravida viverra. Vivamus non sodales quam, eget rutrum quam. Suspendisse venenatis lorem sodales lectus eleifend, ac consequat odio finibus. Morbi id maximus metus, a molestie neque. Integer eget felis sit amet sem tempor placerat. Suspendisse lobortis congue justo eu accumsan. Nullam accumsan laoreet purus. Nulla quis efficitur risus. Ut ac leo libero. Nam nec nisi iaculis, ornare nunc fringilla, sodales lectus. Nulla laoreet mauris sodales, sagittis enim non, vestibulum orci. Fusce orci dui, dapibus nec ligula vitae, vulputate maximus ante. Mauris vitae felis tincidunt, ullamcorper neque quis, pulvinar nisl. Fusce ut augue ac nisl posuere tristique ac sed leo. Nunc pellentesque pretium turpis. Integer maximus rutrum felis, ut molestie mauris mattis non. Morbi ac risus ut mauris porta pharetra. Fusce mollis pharetra turpis nec consequat. Aenean tincidunt felis vel nulla porta, faucibus egestas ligula efficitur. Morbi et dictum velit. Proin scelerisque justo in tristique congue. Maecenas consequat ante dapibus justo vehicula pretium. Sed consequat turpis ac orci suscipit malesuada non a risus. In id leo molestie, venenatis risus quis, dignissim nulla. Nulla aliquet risus nulla, a convallis sem tincidunt ac. Pellentesque scelerisque, elit eu finibus eleifend, orci lectus egestas lorem, nec bibendum libero est non leo. Nullam nisl ante, ullamcorper in efficitur a, consectetur sit amet tellus. Ut et pellentesque eros. Etiam mattis nulla justo, sed ultricies dui commodo vel. Ut tristique posuere leo, ac facilisis massa lobortis nec. Quisque leo ligula, venenatis vel facilisis vel, volutpat ac sapien. Fusce sed porttitor urna. Phasellus tempus semper condimentum. Aliquam sit amet felis vel nulla porta luctus id vel leo. Ut ut odio tincidunt, ultrices enim at, pellentesque sem. Proin bibendum ligula lacus, ut tempus mauris tincidunt id. Praesent sollicitudin interdum tellus, vel tincidunt nisi ultrices a. Aliquam cursus faucibus elit, quis lacinia erat elementum eu. Duis sollicitudin lectus lectus, ut ultrices elit malesuada quis. Phasellus viverra turpis sit amet erat iaculis dapibus. Donec semper turpis sed risus pharetra pharetra. Donec ut ante ac orci blandit interdum. Pellentesque facilisis id purus egestas placerat. Suspendisse sit amet euismod velit, et rutrum ipsum. Maecenas at mi pulvinar, dignissim erat quis, blandit libero. Praesent quam tortor, tempus et laoreet nec, aliquet sed libero. Duis vestibulum est sed risus venenatis rhoncus. Phasellus arcu libero, commodo eget tincidunt non, aliquam in velit. Phasellus imperdiet ante a laoreet gravida. Cras faucibus semper nulla eu facilisis. Praesent non sem sem. Nulla tempus ullamcorper sollicitudin. Ut eget nisi eget augue fermentum consequat. Proin congue a nisi eget ullamcorper. Pellentesque luctus diam felis, a pharetra nunc cursus in. Vivamus a quam dolor. Curabitur fermentum elit sit amet purus ultricies, ut placerat nisl finibus. Nunc sed ligula diam. Ut efficitur risus tortor. Suspendisse sem elit, posuere sit amet nisi et, placerat tristique ipsum. Ut nunc ex, fermentum sed tempor vitae, scelerisque quis nulla. Duis ac aliquam lectus. Curabitur consequat maximus leo sed cursus. Maecenas cursus lectus non porttitor consectetur. Vivamus ultricies, lectus non tempor porttitor, turpis velit auctor leo, at auctor nibh justo ut mi. Vivamus interdum massa at fermentum cursus. Nulla suscipit purus nulla, vel condimentum eros rhoncus eget. Nulla malesuada aliquet maximus. Nulla blandit ipsum finibus leo rhoncus, non lobortis felis scelerisque. Duis blandit massa quis velit efficitur cursus. Aliquam nibh arcu, dictum et feugiat eget, iaculis ac risus. Nunc facilisis pellentesque mauris, a aliquet libero eleifend eu. Pellentesque a turpis et justo blandit maximus. Phasellus imperdiet dui odio, eu facilisis quam porttitor id. Morbi accumsan, mauris eget fermentum porta, mi risus sagittis nisi, in semper odio orci a magna. Praesent maximus accumsan odio, vitae bibendum ipsum ultrices eu. Vestibulum laoreet purus nec neque fringilla dignissim. Morbi interdum diam eget ornare vestibulum. Etiam egestas at ipsum eget dapibus. Nullam feugiat mi ex, et varius odio ornare id. Sed sagittis augue quam, in maximus orci tincidunt vel. Duis molestie felis nunc, et feugiat risus vestibulum et. Integer efficitur augue elit, id commodo lorem volutpat sed. Fusce quam velit, suscipit a posuere sit amet, pulvinar sed nisi. Fusce lacinia accumsan nunc vitae lobortis. Vivamus eu fringilla velit. Cras hendrerit efficitur faucibus. Praesent facilisis a nulla non efficitur. Etiam quis est ac neque pharetra bibendum a vitae neque. Phasellus dui dui, pellentesque in facilisis quis, vulputate non nibh. Integer in lobortis velit. Curabitur efficitur imperdiet dolor, vel tempus dui fermentum quis. Maecenas porttitor nibh at nibh cursus mattis. In dolor neque, efficitur at ligula nec, lobortis aliquam ipsum. Phasellus quam magna, imperdiet at nunc a, suscipit aliquam metus. Cras consequat, enim vitae feugiat venenatis, enim urna venenatis ligula, vel cursus odio lectus id purus. Integer sit amet finibus diam. Fusce aliquet vehicula mauris, a varius metus semper in. Cras sodales malesuada consectetur.cups-2.3.1/cups/testcups.c000664 000765 000024 00000034523 13574721672 015576 0ustar00mikestaff000000 000000 /* * CUPS API test program for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #undef _CUPS_NO_DEPRECATED #include "cups-private.h" #include "ppd.h" #include /* * Local functions... */ static int dests_equal(cups_dest_t *a, cups_dest_t *b); static int enum_cb(void *user_data, unsigned flags, cups_dest_t *dest); static void show_diffs(cups_dest_t *a, cups_dest_t *b); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { http_t *http, /* First HTTP connection */ *http2; /* Second HTTP connection */ int status = 0, /* Exit status */ i, /* Looping var */ num_dests; /* Number of destinations */ cups_dest_t *dests, /* Destinations */ *dest, /* Current destination */ *named_dest; /* Current named destination */ const char *dest_name, /* Destination name */ *dval, /* Destination value */ *ppdfile; /* PPD file */ ppd_file_t *ppd; /* PPD file data */ int num_jobs; /* Number of jobs for queue */ cups_job_t *jobs; /* Jobs for queue */ if (argc > 1) { if (!strcmp(argv[1], "enum")) { cups_ptype_t mask = CUPS_PRINTER_LOCAL, /* Printer type mask */ type = CUPS_PRINTER_LOCAL; /* Printer type */ int msec = 0; /* Timeout in milliseconds */ for (i = 2; i < argc; i ++) if (isdigit(argv[i][0] & 255) || argv[i][0] == '.') msec = (int)(atof(argv[i]) * 1000); else if (!_cups_strcasecmp(argv[i], "bw")) { mask |= CUPS_PRINTER_BW; type |= CUPS_PRINTER_BW; } else if (!_cups_strcasecmp(argv[i], "color")) { mask |= CUPS_PRINTER_COLOR; type |= CUPS_PRINTER_COLOR; } else if (!_cups_strcasecmp(argv[i], "mono")) { mask |= CUPS_PRINTER_COLOR; } else if (!_cups_strcasecmp(argv[i], "duplex")) { mask |= CUPS_PRINTER_DUPLEX; type |= CUPS_PRINTER_DUPLEX; } else if (!_cups_strcasecmp(argv[i], "simplex")) { mask |= CUPS_PRINTER_DUPLEX; } else if (!_cups_strcasecmp(argv[i], "staple")) { mask |= CUPS_PRINTER_STAPLE; type |= CUPS_PRINTER_STAPLE; } else if (!_cups_strcasecmp(argv[i], "copies")) { mask |= CUPS_PRINTER_COPIES; type |= CUPS_PRINTER_COPIES; } else if (!_cups_strcasecmp(argv[i], "collate")) { mask |= CUPS_PRINTER_COLLATE; type |= CUPS_PRINTER_COLLATE; } else if (!_cups_strcasecmp(argv[i], "punch")) { mask |= CUPS_PRINTER_PUNCH; type |= CUPS_PRINTER_PUNCH; } else if (!_cups_strcasecmp(argv[i], "cover")) { mask |= CUPS_PRINTER_COVER; type |= CUPS_PRINTER_COVER; } else if (!_cups_strcasecmp(argv[i], "bind")) { mask |= CUPS_PRINTER_BIND; type |= CUPS_PRINTER_BIND; } else if (!_cups_strcasecmp(argv[i], "sort")) { mask |= CUPS_PRINTER_SORT; type |= CUPS_PRINTER_SORT; } else if (!_cups_strcasecmp(argv[i], "mfp")) { mask |= CUPS_PRINTER_MFP; type |= CUPS_PRINTER_MFP; } else if (!_cups_strcasecmp(argv[i], "printer")) { mask |= CUPS_PRINTER_MFP; } else if (!_cups_strcasecmp(argv[i], "large")) { mask |= CUPS_PRINTER_LARGE; type |= CUPS_PRINTER_LARGE; } else if (!_cups_strcasecmp(argv[i], "medium")) { mask |= CUPS_PRINTER_MEDIUM; type |= CUPS_PRINTER_MEDIUM; } else if (!_cups_strcasecmp(argv[i], "small")) { mask |= CUPS_PRINTER_SMALL; type |= CUPS_PRINTER_SMALL; } else fprintf(stderr, "Unknown argument \"%s\" ignored...\n", argv[i]); cupsEnumDests(CUPS_DEST_FLAGS_NONE, msec, NULL, type, mask, enum_cb, NULL); } else if (!strcmp(argv[1], "password")) { const char *pass = cupsGetPassword("Password:"); /* Password string */ if (pass) printf("Password entered: %s\n", pass); else puts("No password entered."); } else if (!strcmp(argv[1], "ppd") && argc == 3) { /* * ./testcups ppd printer */ http_status_t http_status; /* Status */ char buffer[1024]; /* PPD filename */ time_t modtime = 0; /* Last modified */ if ((http_status = cupsGetPPD3(CUPS_HTTP_DEFAULT, argv[2], &modtime, buffer, sizeof(buffer))) != HTTP_STATUS_OK) printf("Unable to get PPD: %d (%s)\n", (int)http_status, cupsLastErrorString()); else puts(buffer); } else if (!strcmp(argv[1], "print") && argc == 5) { /* * ./testcups print printer file interval */ int interval, /* Interval between writes */ job_id; /* Job ID */ cups_file_t *fp; /* Print file */ char buffer[16384]; /* Read/write buffer */ ssize_t bytes; /* Bytes read/written */ if ((fp = cupsFileOpen(argv[3], "r")) == NULL) { printf("Unable to open \"%s\": %s\n", argv[2], strerror(errno)); return (1); } if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, argv[2], "testcups", 0, NULL)) <= 0) { printf("Unable to create print job on %s: %s\n", argv[1], cupsLastErrorString()); return (1); } interval = atoi(argv[4]); if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2], CUPS_FORMAT_AUTO, 1) != HTTP_STATUS_CONTINUE) { puts("Unable to start document!"); return (1); } while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) { printf("Writing %d bytes...\n", (int)bytes); if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE) { puts("Unable to write bytes!"); return (1); } if (interval > 0) sleep((unsigned)interval); } cupsFileClose(fp); if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { puts("Unable to finish document!"); return (1); } } else { puts("Usage:"); puts(""); puts("Run basic unit tests:"); puts(""); puts(" ./testcups"); puts(""); puts("Enumerate printers (for N seconds, -1 for indefinitely):"); puts(""); puts(" ./testcups enum [seconds]"); puts(""); puts("Ask for a password:"); puts(""); puts(" ./testcups password"); puts(""); puts("Get the PPD file:"); puts(""); puts(" ./testcups ppd printer"); puts(""); puts("Print a file (interval controls delay between buffers in seconds):"); puts(""); puts(" ./testcups print printer file interval"); return (1); } return (0); } /* * _cupsConnect() connection reuse... */ fputs("_cupsConnect: ", stdout); http = _cupsConnect(); http2 = _cupsConnect(); if (http == http2) { puts("PASS"); } else { puts("FAIL (different connections)"); return (1); } /* * cupsGetDests() */ fputs("cupsGetDests: ", stdout); fflush(stdout); num_dests = cupsGetDests(&dests); if (num_dests == 0) { puts("FAIL"); return (1); } else { printf("PASS (%d dests)\n", num_dests); for (i = num_dests, dest = dests; i > 0; i --, dest ++) { printf(" %s", dest->name); if (dest->instance) printf(" /%s", dest->instance); if (dest->is_default) puts(" ***DEFAULT***"); else putchar('\n'); } } /* * cupsGetDest(NULL) */ fputs("cupsGetDest(NULL): ", stdout); fflush(stdout); if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) { for (i = num_dests, dest = dests; i > 0; i --, dest ++) if (dest->is_default) break; if (i) { status = 1; puts("FAIL"); } else puts("PASS (no default)"); dest = NULL; } else printf("PASS (%s)\n", dest->name); /* * cupsGetNamedDest(NULL, NULL, NULL) */ fputs("cupsGetNamedDest(NULL, NULL, NULL): ", stdout); fflush(stdout); if ((named_dest = cupsGetNamedDest(NULL, NULL, NULL)) == NULL || !dests_equal(dest, named_dest)) { if (!dest) puts("PASS (no default)"); else if (named_dest) { puts("FAIL (different values)"); show_diffs(dest, named_dest); status = 1; } else { puts("FAIL (no default)"); status = 1; } } else printf("PASS (%s)\n", named_dest->name); if (named_dest) cupsFreeDests(1, named_dest); /* * cupsGetDest(printer) */ for (i = 0, dest_name = NULL; i < num_dests; i ++) { if ((dval = cupsGetOption("printer-is-temporary", dests[i].num_options, dest[i].options)) != NULL && !strcmp(dval, "false")) { dest_name = dests[i].name; break; } } printf("cupsGetDest(\"%s\"): ", dest_name ? dest_name : "(null)"); fflush(stdout); if ((dest = cupsGetDest(dest_name, NULL, num_dests, dests)) == NULL) { puts("FAIL"); return (1); } else puts("PASS"); /* * cupsGetNamedDest(NULL, printer, instance) */ printf("cupsGetNamedDest(NULL, \"%s\", \"%s\"): ", dest->name, dest->instance ? dest->instance : "(null)"); fflush(stdout); if ((named_dest = cupsGetNamedDest(NULL, dest->name, dest->instance)) == NULL || !dests_equal(dest, named_dest)) { if (named_dest) { puts("FAIL (different values)"); show_diffs(dest, named_dest); } else puts("FAIL (no destination)"); status = 1; } else puts("PASS"); if (named_dest) cupsFreeDests(1, named_dest); /* * cupsPrintFile() */ fputs("cupsPrintFile: ", stdout); fflush(stdout); if (cupsPrintFile(dest->name, "../test/testfile.pdf", "Test Page", dest->num_options, dest->options) <= 0) { printf("FAIL (%s)\n", cupsLastErrorString()); return (1); } else puts("PASS"); /* * cupsGetPPD(printer) */ fputs("cupsGetPPD: ", stdout); fflush(stdout); if ((ppdfile = cupsGetPPD(dest->name)) == NULL) { puts("FAIL"); } else { puts("PASS"); /* * ppdOpenFile() */ fputs("ppdOpenFile: ", stdout); fflush(stdout); if ((ppd = ppdOpenFile(ppdfile)) == NULL) { puts("FAIL"); return (1); } else puts("PASS"); ppdClose(ppd); unlink(ppdfile); } /* * cupsGetJobs() */ fputs("cupsGetJobs: ", stdout); fflush(stdout); num_jobs = cupsGetJobs(&jobs, NULL, 0, -1); if (num_jobs == 0) { puts("FAIL"); return (1); } else puts("PASS"); cupsFreeJobs(num_jobs, jobs); cupsFreeDests(num_dests, dests); return (status); } /* * 'dests_equal()' - Determine whether two destinations are equal. */ static int /* O - 1 if equal, 0 if not equal */ dests_equal(cups_dest_t *a, /* I - First destination */ cups_dest_t *b) /* I - Second destination */ { int i; /* Looping var */ cups_option_t *aoption; /* Current option */ const char *bval; /* Option value */ if (a == b) return (1); if (!a || !b) return (0); if (_cups_strcasecmp(a->name, b->name) || (a->instance && !b->instance) || (!a->instance && b->instance) || (a->instance && _cups_strcasecmp(a->instance, b->instance)) || a->num_options != b->num_options) return (0); for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++) if ((bval = cupsGetOption(aoption->name, b->num_options, b->options)) == NULL || strcmp(aoption->value, bval)) return (0); return (1); } /* * 'enum_cb()' - Report additions and removals. */ static int /* O - 1 to continue, 0 to stop */ enum_cb(void *user_data, /* I - User data (unused) */ unsigned flags, /* I - Destination flags */ cups_dest_t *dest) /* I - Destination */ { int i; /* Looping var */ cups_option_t *option; /* Current option */ (void)user_data; if (flags & CUPS_DEST_FLAGS_REMOVED) printf("Removed '%s':\n", dest->name); else printf("Added '%s':\n", dest->name); for (i = dest->num_options, option = dest->options; i > 0; i --, option ++) printf(" %s=\"%s\"\n", option->name, option->value); putchar('\n'); return (1); } /* * 'show_diffs()' - Show differences between two destinations. */ static void show_diffs(cups_dest_t *a, /* I - First destination */ cups_dest_t *b) /* I - Second destination */ { int i; /* Looping var */ cups_option_t *aoption; /* Current option */ cups_option_t *boption; /* Current option */ const char *bval; /* Option value */ if (!a || !b) return; puts(" Item cupsGetDest cupsGetNamedDest"); puts(" -------------------- ------------------------ ------------------------"); if (_cups_strcasecmp(a->name, b->name)) printf(" name %-24.24s %-24.24s\n", a->name, b->name); if ((a->instance && !b->instance) || (!a->instance && b->instance) || (a->instance && _cups_strcasecmp(a->instance, b->instance))) printf(" instance %-24.24s %-24.24s\n", a->instance ? a->instance : "(null)", b->instance ? b->instance : "(null)"); if (a->num_options != b->num_options) printf(" num_options %-24d %-24d\n", a->num_options, b->num_options); for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++) if ((bval = cupsGetOption(aoption->name, b->num_options, b->options)) == NULL || strcmp(aoption->value, bval)) printf(" %-20.20s %-24.24s %-24.24s\n", aoption->name, aoption->value, bval ? bval : "(null)"); for (i = b->num_options, boption = b->options; i > 0; i --, boption ++) if (!cupsGetOption(boption->name, a->num_options, a->options)) printf(" %-20.20s %-24.24s %-24.24s\n", boption->name, boption->value, "(null)"); } cups-2.3.1/cups/transcode.h000664 000765 000024 00000003210 13574721672 015700 0ustar00mikestaff000000 000000 /* * Transcoding definitions for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_TRANSCODE_H_ # define _CUPS_TRANSCODE_H_ /* * Include necessary headers... */ # include "language.h" # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define CUPS_MAX_USTRING 8192 /* Max size of Unicode string */ /* * Types... */ typedef unsigned char cups_utf8_t; /* UTF-8 Unicode/ISO-10646 unit */ typedef unsigned long cups_utf32_t; /* UTF-32 Unicode/ISO-10646 unit */ typedef unsigned short cups_ucs2_t; /* UCS-2 Unicode/ISO-10646 unit */ typedef unsigned long cups_ucs4_t; /* UCS-4 Unicode/ISO-10646 unit */ typedef unsigned char cups_sbcs_t; /* SBCS Legacy 8-bit unit */ typedef unsigned short cups_dbcs_t; /* DBCS Legacy 16-bit unit */ typedef unsigned long cups_vbcs_t; /* VBCS Legacy 32-bit unit */ /* EUC uses 8, 16, 24, 32-bit */ /* * Prototypes... */ extern int cupsCharsetToUTF8(cups_utf8_t *dest, const char *src, const int maxout, const cups_encoding_t encoding) _CUPS_API_1_2; extern int cupsUTF8ToCharset(char *dest, const cups_utf8_t *src, const int maxout, const cups_encoding_t encoding) _CUPS_API_1_2; extern int cupsUTF8ToUTF32(cups_utf32_t *dest, const cups_utf8_t *src, const int maxout) _CUPS_API_1_2; extern int cupsUTF32ToUTF8(cups_utf8_t *dest, const cups_utf32_t *src, const int maxout) _CUPS_API_1_2; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_TRANSCODE_H_ */ cups-2.3.1/cups/getdevices.c000664 000765 000024 00000017260 13574721672 016045 0ustar00mikestaff000000 000000 /* * cupsGetDevices implementation for CUPS. * * Copyright 2008-2016 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include "adminutil.h" /* * 'cupsGetDevices()' - Get available printer devices. * * This function sends a CUPS-Get-Devices request and streams the discovered * devices to the specified callback function. The "timeout" parameter controls * how long the request lasts, while the "include_schemes" and "exclude_schemes" * parameters provide comma-delimited lists of backends to include or omit from * the request respectively. * * This function is deprecated with the IPP printer discovery functionality * being provided by the @link cupsEnumDests@ and @cupsGetDests@ functions. * * @deprecated@ */ ipp_status_t /* O - Request status - @code IPP_OK@ on success. */ cupsGetDevices( http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ int timeout, /* I - Timeout in seconds or @code CUPS_TIMEOUT_DEFAULT@ */ const char *include_schemes, /* I - Comma-separated URI schemes to include or @code CUPS_INCLUDE_ALL@ */ const char *exclude_schemes, /* I - Comma-separated URI schemes to exclude or @code CUPS_EXCLUDE_NONE@ */ cups_device_cb_t callback, /* I - Callback function */ void *user_data) /* I - User data pointer */ { ipp_t *request, /* CUPS-Get-Devices request */ *response; /* CUPS-Get-Devices response */ ipp_attribute_t *attr; /* Current attribute */ const char *device_class, /* device-class value */ *device_id, /* device-id value */ *device_info, /* device-info value */ *device_location, /* device-location value */ *device_make_and_model, /* device-make-and-model value */ *device_uri; /* device-uri value */ int blocking; /* Current blocking-IO mode */ cups_option_t option; /* in/exclude-schemes option */ http_status_t status; /* HTTP status of request */ ipp_state_t state; /* IPP response state */ /* * Range check input... */ DEBUG_printf(("cupsGetDevices(http=%p, timeout=%d, include_schemes=\"%s\", exclude_schemes=\"%s\", callback=%p, user_data=%p)", (void *)http, timeout, include_schemes, exclude_schemes, (void *)callback, user_data)); if (!callback) return (IPP_STATUS_ERROR_INTERNAL); if (!http) http = _cupsConnect(); if (!http) return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE); /* * Create a CUPS-Get-Devices request... */ request = ippNewRequest(IPP_OP_CUPS_GET_DEVICES); if (timeout > 0) ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "timeout", timeout); if (include_schemes) { option.name = "include-schemes"; option.value = (char *)include_schemes; cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); } if (exclude_schemes) { option.name = "exclude-schemes"; option.value = (char *)exclude_schemes; cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); } /* * Send the request and do any necessary authentication... */ do { DEBUG_puts("2cupsGetDevices: Sending request..."); status = cupsSendRequest(http, request, "/", ippLength(request)); DEBUG_puts("2cupsGetDevices: Waiting for response status..."); while (status == HTTP_STATUS_CONTINUE) status = httpUpdate(http); if (status != HTTP_STATUS_OK) { httpFlush(http); if (status == HTTP_STATUS_UNAUTHORIZED) { /* * See if we can do authentication... */ DEBUG_puts("2cupsGetDevices: Need authorization..."); if (!cupsDoAuthentication(http, "POST", "/")) httpReconnect2(http, 30000, NULL); else { status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; } } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* * Force a reconnect with encryption... */ DEBUG_puts("2cupsGetDevices: Need encryption..."); if (!httpReconnect2(http, 30000, NULL)) httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); } #endif /* HAVE_SSL */ } } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); DEBUG_printf(("2cupsGetDevices: status=%d", status)); ippDelete(request); if (status != HTTP_STATUS_OK) { _cupsSetHTTPError(status); return (cupsLastError()); } /* * Read the response in non-blocking mode... */ blocking = httpGetBlocking(http); httpBlocking(http, 0); response = ippNew(); device_class = NULL; device_id = NULL; device_info = NULL; device_location = ""; device_make_and_model = NULL; device_uri = NULL; attr = NULL; DEBUG_puts("2cupsGetDevices: Reading response..."); do { if ((state = ippRead(http, response)) == IPP_STATE_ERROR) break; DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state, (void *)response->last)); if (!response->attrs) continue; while (attr != response->last) { if (!attr) attr = response->attrs; else attr = attr->next; DEBUG_printf(("2cupsGetDevices: attr->name=\"%s\", attr->value_tag=%d", attr->name, attr->value_tag)); if (!attr->name) { if (device_class && device_id && device_info && device_make_and_model && device_uri) (*callback)(device_class, device_id, device_info, device_make_and_model, device_uri, device_location, user_data); device_class = NULL; device_id = NULL; device_info = NULL; device_location = ""; device_make_and_model = NULL; device_uri = NULL; } else if (!strcmp(attr->name, "device-class") && attr->value_tag == IPP_TAG_KEYWORD) device_class = attr->values[0].string.text; else if (!strcmp(attr->name, "device-id") && attr->value_tag == IPP_TAG_TEXT) device_id = attr->values[0].string.text; else if (!strcmp(attr->name, "device-info") && attr->value_tag == IPP_TAG_TEXT) device_info = attr->values[0].string.text; else if (!strcmp(attr->name, "device-location") && attr->value_tag == IPP_TAG_TEXT) device_location = attr->values[0].string.text; else if (!strcmp(attr->name, "device-make-and-model") && attr->value_tag == IPP_TAG_TEXT) device_make_and_model = attr->values[0].string.text; else if (!strcmp(attr->name, "device-uri") && attr->value_tag == IPP_TAG_URI) device_uri = attr->values[0].string.text; } } while (state != IPP_STATE_DATA); DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state, (void *)response->last)); if (device_class && device_id && device_info && device_make_and_model && device_uri) (*callback)(device_class, device_id, device_info, device_make_and_model, device_uri, device_location, user_data); /* * Set the IPP status and return... */ httpBlocking(http, blocking); httpFlush(http); if (status == HTTP_STATUS_ERROR) _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0); else { attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"", ippErrorString(response->request.status.status_code), attr ? attr->values[0].string.text : "")); _cupsSetError(response->request.status.status_code, attr ? attr->values[0].string.text : ippErrorString(response->request.status.status_code), 0); } ippDelete(response); return (cupsLastError()); } cups-2.3.1/cups/md5-internal.h000664 000765 000024 00000005160 13574721672 016223 0ustar00mikestaff000000 000000 /* * Private MD5 definitions for CUPS. * * Copyright 2007-2010 by Apple Inc. * Copyright 2005 by Easy Software Products * * Copyright (C) 1999 Aladdin Enterprises. All rights reserved. * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 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. * * L. Peter Deutsch * ghost@aladdin.com */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321. It is derived directly from the text of the RFC and not from the reference implementation. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef _CUPS_MD5_INTERNAL_H_ # define _CUPS_MD5_INTERNAL_H_ # include /* Define the state of the MD5 Algorithm. */ typedef struct _cups_md5_state_s { unsigned int count[2]; /* message length in bits, lsw first */ unsigned int abcd[4]; /* digest buffer */ unsigned char buf[64]; /* accumulate block */ } _cups_md5_state_t; # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* Initialize the algorithm. */ void _cupsMD5Init(_cups_md5_state_t *pms) _CUPS_INTERNAL; /* Append a string to the message. */ void _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes) _CUPS_INTERNAL; /* Finish the message and return the digest. */ void _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]) _CUPS_INTERNAL; # ifdef __cplusplus } /* end extern "C" */ # endif /* __cplusplus */ #endif /* !_CUPS_MD5_INTERNAL_H_ */ cups-2.3.1/cups/backend.c000664 000765 000024 00000006470 13574721672 015313 0ustar00mikestaff000000 000000 /* * Backend functions for CUPS. * * Copyright 2007-2015 by Apple Inc. * Copyright 2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "backend.h" #include "ppd.h" /* * Local functions... */ static void quote_string(const char *s); /* * 'cupsBackendDeviceURI()' - Get the device URI for a backend. * * The "argv" argument is the argv argument passed to main(). This * function returns the device URI passed in the DEVICE_URI environment * variable or the device URI passed in argv[0], whichever is found * first. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Device URI or @code NULL@ */ cupsBackendDeviceURI(char **argv) /* I - Command-line arguments */ { const char *device_uri, /* Device URI */ *auth_info_required; /* AUTH_INFO_REQUIRED env var */ _cups_globals_t *cg = _cupsGlobals(); /* Global info */ int options; /* Resolve options */ ppd_file_t *ppd; /* PPD file */ ppd_attr_t *ppdattr; /* PPD attribute */ if ((device_uri = getenv("DEVICE_URI")) == NULL) { if (!argv || !argv[0] || !strchr(argv[0], ':')) return (NULL); device_uri = argv[0]; } options = _HTTP_RESOLVE_STDERR; if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) != NULL && !strcmp(auth_info_required, "negotiate")) options |= _HTTP_RESOLVE_FQDN; if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL) { if ((ppdattr = ppdFindAttr(ppd, "cupsIPPFaxOut", NULL)) != NULL && !_cups_strcasecmp(ppdattr->value, "true")) options |= _HTTP_RESOLVE_FAXOUT; ppdClose(ppd); } return (_httpResolveURI(device_uri, cg->resolved_uri, sizeof(cg->resolved_uri), options, NULL, NULL)); } /* * 'cupsBackendReport()' - Write a device line from a backend. * * This function writes a single device line to stdout for a backend. * It handles quoting of special characters in the device-make-and-model, * device-info, device-id, and device-location strings. * * @since CUPS 1.4/macOS 10.6@ */ void cupsBackendReport( const char *device_scheme, /* I - device-scheme string */ const char *device_uri, /* I - device-uri string */ const char *device_make_and_model, /* I - device-make-and-model string or @code NULL@ */ const char *device_info, /* I - device-info string or @code NULL@ */ const char *device_id, /* I - device-id string or @code NULL@ */ const char *device_location) /* I - device-location string or @code NULL@ */ { if (!device_scheme || !device_uri) return; printf("%s %s", device_scheme, device_uri); if (device_make_and_model && *device_make_and_model) quote_string(device_make_and_model); else quote_string("unknown"); quote_string(device_info); quote_string(device_id); quote_string(device_location); putchar('\n'); fflush(stdout); } /* * 'quote_string()' - Write a quoted string to stdout, escaping \ and ". */ static void quote_string(const char *s) /* I - String to write */ { fputs(" \"", stdout); if (s) { while (*s) { if (*s == '\\' || *s == '\"') putchar('\\'); if (((*s & 255) < ' ' && *s != '\t') || *s == 0x7f) putchar(' '); else putchar(*s); s ++; } } putchar('\"'); } cups-2.3.1/cups/notify.c000664 000765 000024 00000011164 13574721672 015230 0ustar00mikestaff000000 000000 /* * Notification routines for CUPS. * * Copyright 2007-2013 by Apple Inc. * Copyright 2005-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * 'cupsNotifySubject()' - Return the subject for the given notification message. * * The returned string must be freed by the caller using @code free@. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Subject string or @code NULL@ */ cupsNotifySubject(cups_lang_t *lang, /* I - Language data */ ipp_t *event) /* I - Event data */ { char buffer[1024]; /* Subject buffer */ const char *prefix, /* Prefix on subject */ *state; /* Printer/job state string */ ipp_attribute_t *job_id, /* notify-job-id */ *job_name, /* job-name */ *job_state, /* job-state */ *printer_name, /* printer-name */ *printer_state, /* printer-state */ *printer_uri, /* notify-printer-uri */ *subscribed; /* notify-subscribed-event */ /* * Range check input... */ if (!event || !lang) return (NULL); /* * Get the required attributes... */ job_id = ippFindAttribute(event, "notify-job-id", IPP_TAG_INTEGER); job_name = ippFindAttribute(event, "job-name", IPP_TAG_NAME); job_state = ippFindAttribute(event, "job-state", IPP_TAG_ENUM); printer_name = ippFindAttribute(event, "printer-name", IPP_TAG_NAME); printer_state = ippFindAttribute(event, "printer-state", IPP_TAG_ENUM); printer_uri = ippFindAttribute(event, "notify-printer-uri", IPP_TAG_URI); subscribed = ippFindAttribute(event, "notify-subscribed-event", IPP_TAG_KEYWORD); if (job_id && printer_name && printer_uri && job_state) { /* * Job event... */ prefix = _cupsLangString(lang, _("Print Job:")); switch (job_state->values[0].integer) { case IPP_JSTATE_PENDING : state = _cupsLangString(lang, _("pending")); break; case IPP_JSTATE_HELD : state = _cupsLangString(lang, _("held")); break; case IPP_JSTATE_PROCESSING : state = _cupsLangString(lang, _("processing")); break; case IPP_JSTATE_STOPPED : state = _cupsLangString(lang, _("stopped")); break; case IPP_JSTATE_CANCELED : state = _cupsLangString(lang, _("canceled")); break; case IPP_JSTATE_ABORTED : state = _cupsLangString(lang, _("aborted")); break; case IPP_JSTATE_COMPLETED : state = _cupsLangString(lang, _("completed")); break; default : state = _cupsLangString(lang, _("unknown")); break; } snprintf(buffer, sizeof(buffer), "%s %s-%d (%s) %s", prefix, printer_name->values[0].string.text, job_id->values[0].integer, job_name ? job_name->values[0].string.text : _cupsLangString(lang, _("untitled")), state); } else if (printer_uri && printer_name && printer_state) { /* * Printer event... */ prefix = _cupsLangString(lang, _("Printer:")); switch (printer_state->values[0].integer) { case IPP_PSTATE_IDLE : state = _cupsLangString(lang, _("idle")); break; case IPP_PSTATE_PROCESSING : state = _cupsLangString(lang, _("processing")); break; case IPP_PSTATE_STOPPED : state = _cupsLangString(lang, _("stopped")); break; default : state = _cupsLangString(lang, _("unknown")); break; } snprintf(buffer, sizeof(buffer), "%s %s %s", prefix, printer_name->values[0].string.text, state); } else if (subscribed) strlcpy(buffer, subscribed->values[0].string.text, sizeof(buffer)); else return (NULL); /* * Duplicate and return the subject string... */ return (strdup(buffer)); } /* * 'cupsNotifyText()' - Return the text for the given notification message. * * The returned string must be freed by the caller using @code free@. * * @since CUPS 1.2/macOS 10.5@ */ char * /* O - Message text or @code NULL@ */ cupsNotifyText(cups_lang_t *lang, /* I - Language data */ ipp_t *event) /* I - Event data */ { ipp_attribute_t *notify_text; /* notify-text */ /* * Range check input... */ if (!event || !lang) return (NULL); /* * Get the notify-text attribute from the server... */ if ((notify_text = ippFindAttribute(event, "notify-text", IPP_TAG_TEXT)) == NULL) return (NULL); /* * Return a copy... */ return (strdup(notify_text->values[0].string.text)); } cups-2.3.1/cups/debug-private.h000664 000765 000024 00000002656 13574721672 016471 0ustar00mikestaff000000 000000 /* * Private debugging APIs for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_DEBUG_PRIVATE_H_ # define _CUPS_DEBUG_PRIVATE_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * The debug macros are used if you compile with DEBUG defined. * * Usage: * * DEBUG_set("logfile", "level", "filter", 1) * * The DEBUG_set macro allows an application to programmatically enable (or * disable) debug logging. The arguments correspond to the CUPS_DEBUG_LOG, * CUPS_DEBUG_LEVEL, and CUPS_DEBUG_FILTER environment variables. The 1 on the * end forces the values to override the environment. */ # ifdef DEBUG # define DEBUG_set(logfile,level,filter) _cups_debug_set(logfile,level,filter,1) # else # define DEBUG_set(logfile,level,filter) # endif /* DEBUG */ /* * Prototypes... */ extern void _cups_debug_set(const char *logfile, const char *level, const char *filter, int force) _CUPS_PRIVATE; # ifdef _WIN32 extern int _cups_gettimeofday(struct timeval *tv, void *tz) _CUPS_PRIVATE; # define gettimeofday(a,b) _cups_gettimeofday(a, b) # endif /* _WIN32 */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_DEBUG_PRIVATE_H_ */ cups-2.3.1/cups/cupspm.opacity000664 000765 000024 00000231460 13574721672 016460 0ustar00mikestaff000000 000000 bplist00X$versionX$objectsY$archiverT$topcopqrswx :;ABNOPQRX\bfnoVsuy},/27?EJNOPQRSTUVWX^b{~ .16;@ABCDEFJ^afkpqrstuv{ !"#$%&+6BNYZ[\]^_`abcdel{ .16;@ABCDEFJ^afkpqrstuv{ "%*/456789:>RUZ_defghijoz'*/49:;<=>?DEFUhkpuz{|}~ ,789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXfu    & 2 > J V b n z   + 7 C O [ g s   $ 0 9 E Q ] i u    & 2 > J V b n z  " . : F R ^ j v  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^    (+05:;<=>?@EP\ht(4@KLMNOPQRSTUVWXYZ[\]fu %*+,-./04HKPUZ[\]^_`ep|     ,789:;<=>?@FUhkpuz{|}~ !58=BGHIJKLMR]iu  &2>JV^_`abcdefghijklmnopz-05:?@ABCDEJKLZ[_sv{  !"#69<AFKNOPQRSTXloty~  !01CSTUVWXY]aeijkorstwxy|}M  @ W: $%&'()*+567>?I@JKLMUVWXYefg9hi}~U$null0  !"#$%&'()*+,-./0123456789:;9<=>>@AB::CDEFGH:IJKLMN>PQRSI@UVWXYB[\]B>BaM9WpolySidWpixDTypSbmPUresUnTsecCUcolSpUoBgImSparVnPaStrWactLaysUsnShsWpenTTypSmodTzoomTallRVsavStDTmetaVspiDecVgenNamUorTypVpixRadTfrasUimSizUbgColVnPaFilV$classVactTraVsavPrDTtarsVcurFraSenVVlineThVautoBTUshLayXrectCRadUresiMTcurRWspiSegsTtrasWfilSensUmainCVtraTrgVcurObjVguiLinTvarsVlasModWpolyStaUbgTypP y #@HA ŀ#@T#?{ #- #@Id de"fjnWNS.keysZNS.objectsghiklm \kMDItemTitle^kMDItemAuthors_kMDItemCopyrightXNew Icone"tvu ]Michael Sweetyz{|Z$classnameX$classesWNSArray}~WNSArrayXNSObject_Copyright 2017 Michael Sweetyz_NSMutableDictionary~\NSDictionarye"vX  "SresSdel#?yz\PCResolution~\PCResolutionXPCObject"#?"I"#@"#@"#@#"#?e"vR "ATlaysUanimTUlAcLs#?yzde"nghikm e"vu e"v׀CM "::M@MRUblendWmaskTypUedMskSnamWmaskLaySvisUalConTobjsTisShTopac" #!&#@Y">B !de"n #@#"#@#yz_PCBitmapContext~_PCBitmapContextZPCDrawableXPCObjecte"v yz  ]PCNormalLayer   ~]PCNormalLayerWPCLayerZPCDrawableXPCObjectTTextde"n$% #@#"#@#e"v'< !"#$%&'(")*+ ,-.MM@V@M45V@8VMTrectTstrYSisIXstrTBndsTstrXSshXTantiSflVVattStrSshYUalPixSangSflH( ;) :_{{0, 0}, {140, 60}}<"=>?@XNSString\NSAttributes*9+_Programming Manualde"CHMDEFG,-./IJKL02478_NSParagraphStyleWNSColorVNSFontVNSKernS"T>VWZNSTabStops[NSAlignment1yzYZ_NSMutableParagraphStyleY[~_NSParagraphStyle]^"_`aUNSRGB\NSColorSpaceF1 1 13yzcdWNSColore~WNSColorghi"jklmVNSSizeXNSfFlagsVNSName#@156_HelveticaNeue-BoldyzpqVNSFontr~VNSFontyzt~yzvw_NSAttributedStringx~_NSAttributedStringz^"{9aWNSWhiteD1 03yz~\PCTextVector~\PCTextVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObject!"#$%&'(")*+ ,-MM@V@M4V@VM= ;> B_{{0, 135}, {140, 50}}<"=??9@TCUPSde"MDEFG,-./IJL02A78ghi"klm#@D56z^"9aD1 03"::M@MRHD I!L">BCE !de"nFG #@#"D#@#VMascotde"nɀJˀK #@#"C#@#e"vM݁);gxρЁ$Ntā +< !#&'("*+,-M@V@MV@VMVfConPtVconPtsWfilPropVlConPtUstrosNr O vbC _{{0, 0}, {0, 0}}"     M`:W <">$&':()`*MVrelLP2SblHWgradAngUradGCTfilTWrelRadCVfilPosSaEqStypXrelLinP1VfilColVrelLP1UfilImVothColXrelLinP2SgEqUfilGrSrEqXgradStopUpgNumSbEqSfil[#@VWXa`ZPYQM\^]R_z^"-9aB13]^"0`aL0.6 0.6 0.63e"3645SUV89:">V<>ValtColSlocScolOPTyz@A^PCGradientStopBCD~^PCGradientStopZPCDrawableXPCObject89:">$>OQTyzKL^NSMutableArrayKM~WNSArrayV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}Q0QtW100 - tS100yzYZ_PCDrawVectorProperties[\]~_PCDrawVectorPropertiesZPCDrawableXPCObjecte"_6`cVc"    def:gWhMj:kl:Wn>pq:Mt'I:\(x`*zTcapSSposUinvisSwidUdashSmijq`lkeMn^d]f_oz^"|9aB03]^"`aL0.4 0.4 0.43e"6ghV89:">`V\>cdT89:">`q>ceTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 #@ yz_PCStrokeVectorProperties~_PCStrokeVectorProperties_PCDrawVectorPropertiesZPCDrawableXPCObject" M@MM:YhasConPt1VcPLinkUisCloRptTnextYhasConPt2VconPt1VconPt2 Msz" M`M@MTprevzr Mt" M`M@Mzs~ Mu" M`MMM}zt{|Mv "M`MMMMwxyzu_({24.692968750000006, 131.27734375000003}_({24.692968750000006, 131.27734375000003}_({24.692968750000006, 131.27734375000003}yz]PCCustomPoint~]PCCustomPointZPCDrawableXPCObject_'{37.49296875000001, 126.27734375000003}_'{37.49296875000001, 126.27734375000003}_'{37.49296875000001, 126.27734375000003}_({34.419726562500003, 94.499414062500023}_({34.419726562500003, 94.499414062500023}_({34.419726562500003, 94.499414062500023}_({21.992968750000003, 101.97734375000002}_({21.992968750000003, 101.97734375000002}_({21.992968750000003, 101.97734375000002}_({24.692968750000006, 129.17734375000003}_({24.692968750000006, 129.17734375000003}_({24.692968750000006, 129.17734375000003}e"6rstuvVyz^PCCustomVector   ~^PCCustomVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObject!#&'("*+,-M@V@MV@VMN C "     M`:W"<$>&(':(+`*Ma`P^]_]^"/`aL0.6 0.6 0.63e"2634V89:">V<>PT89:">&>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"G6HVc"    def:gWKMM:Nl:WQ>ST:MW'I:\([`*]q`^d]_]^"_`aL0.4 0.4 0.43e"b6cdV89:">HV\>dT89:">HT>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"wvLp7 " M@MM: z" M`M@Mz " M`M@Mz  "M`M@M z_({71.592968750000011, 93.577343750000026}_({71.592968750000011, 93.577343750000026}_({71.592968750000011, 93.577343750000026}_({71.592968750000011, 95.477343750000017}_({71.592968750000011, 95.477343750000017}_({71.592968750000011, 95.477343750000017}_({32.692968750000006, 86.977343750000017}_({32.692968750000006, 86.977343750000017}_({32.692968750000006, 86.977343750000017}_({19.209375000000009, 94.662695312500034}_({19.209375000000009, 94.662695312500034}_({19.209375000000009, 94.662695312500034}e"6V!#&'("*+,-M@V@MV@VMN πC "     M`:W<>':(`*Ma`P^]_]^"`aL0.6 0.6 0.63e"6䀷V89:">V<>PT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M'I:\( `* ŀƀq`Ȁǀʀ^d]€_]^"`aL0.4 0.4 0.43e"6ÀĀV89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"'vLp7 " M@M01M34: ـڀۀz" M8;`<M@@M؀z̀ր " MD1G`HMMMՀz̀Ӏ "M`MMSMUV@рҀz_'{37.49296875000001, 126.27734375000003}_'{37.49296875000001, 126.27734375000003}_'{37.49296875000001, 126.27734375000003}_({70.792968750000014, 126.27734375000003}_({70.792968750000014, 126.27734375000003}_({70.792968750000014, 126.27734375000003}_({67.492968750000017, 97.077343750000026}_({67.492968750000017, 97.077343750000026}_({67.492968750000017, 97.077343750000026}_({34.834375000000009, 94.292187500000026}_({34.834375000000009, 94.292187500000026}_({34.834375000000009, 94.292187500000026}e"f61@ƀ̀̀΀πV!#&'("*+,-nMp@rV@MvwV@VMN C "     |M~`:W<>':(`*Ma`P߀݀^]_]^"`aL0.6 0.6 0.63e"6V89:">rV<>ހPT89:">r>ހ߀TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M'I:\(`*q`^d]_]^"`aL0.4 0.4 0.43e"6ĀV89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " M@MM: ݀z" Mn`M@vMz ݀ "M`M@M z_({27.686914062500001, 131.48457031250001}_({27.686914062500001, 131.48457031250001}_({27.686914062500001, 131.48457031250001}_({48.176953125000004, 130.83671875000002}_({48.176953125000004, 130.83671875000002}_({48.176953125000004, 130.83671875000002}_({70.792968750000014, 126.27734375000003}_({70.792968750000014, 126.27734375000003}_({70.792968750000014, 126.27734375000003}e"6nvV!#&'("*+,-M@V@MV@VMN(  C "     M`:W"<$>&(':(+`*M   a` P ^]_]^"/`aL0.6 0.6 0.63e"2634V89:">V<>PT89:">&>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"G6HVc"    def:gWKMM:Nl:WQ>ST:MW'I:\([`*]q`^d]_]^"_`aL0.4 0.4 0.43e"b6cdV89:">HV\>dT89:">HT>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"wvLp7 " M@MM: %&'z" M`M@M$z"#  "M`M@M  !z_({67.211328124999994, 81.120703125000006}_({67.211328124999994, 81.120703125000006}_({67.211328124999994, 81.120703125000006}_({32.975781249999997, 72.560742187500011}_({32.975781249999997, 72.560742187500011}_({32.975781249999997, 72.560742187500011}_({17.499999999999993, 83.085156250000011}_({17.499999999999993, 83.085156250000011}_({17.499999999999993, 83.085156250000011}e"6V!#&'("*+,-M@>V@MV@VMSpt1Spt2*8 9:+C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6,Vc"    def:gWM:l:W>:M'I:\(`*ԁ512q`43-)6^d]._7]^"`aL0.4 0.4 0.43e"6ہ/0V89:">V\>,dT89:">>,-TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({32.592968750000004, 86.977343750000017}_'{32.88203124999999, 72.722070312500009}yz\PCLineVector~\PCLineVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObject!#&'("*+,-M@V@MV@VMNUf < YHC "      M::W>':(`*@FBCa`E=D>;G^]?_ z^" 9aF1 0.53]^"#`aL0.6 0.6 0.63e"&6'(@AV89:">V<>><>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e";6<IVc"    def:gW?MA:Bl:WE>GH:MK'I:\(O`*QRNOq`QPJ;S^d]K_T]^"S`aL0.4 0.4 0.43e"V6WXLMV89:"><V\>IdT89:"><H>IJTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"kvLp7 " M@MtuMwx: ;cVdez" M|`M@MbzU`a ;W" Mu`M@M_zV]^ ;X" M`M@M\zWZ[ ;Y "M`@@M ; zX_({66.913704302362703, 123.62500000000003}_({66.913704302362703, 123.62500000000003}_({66.913704302362703, 123.62500000000003}_({64.569173052362714, 100.17285156250001}_({64.569173052362714, 100.17285156250001}_({64.569173052362714, 100.17285156250001}_({38.146712114862709, 97.893945312500009}_({38.146712114862709, 97.893945312500009}_({38.146712114862709, 97.893945312500009}_({40.808430864862707, 123.53730468750003}_({40.808430864862707, 123.53730468750003}_({40.808430864862707, 123.53730468750003}e"6uUVWXYV!#&'("*+,-M@>V@MV@VMhv w:iC _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6ˁjVc"    def:gWM:l:W>:M'I:\(`*sopq`rqkgt^d]l_u]^"`aL0.4 0.4 0.43e"6mnV89:">V\>jdT89:">>jkTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({43.292968750000007, 114.37734375000002}_({49.557031249999994, 116.97949218750001}!#&'("*+,-M@>V@M V@VMy :zC _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6{Vc"    def:gWM:l:W>:M 'I:\($`*&q`|x^d]}_]^"(`aL0.4 0.4 0.43e"+6,-~V89:">V\>{dT89:">>{|TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"@vLp7 _({56.892968750000009, 116.27734375000003}_({62.518359375000003, 114.21093750000001}!#&'("*+,-HMJ@LV@MPQV@VMN  C "     VMX`Y:W\<^>`b':(e`*Ma`P^]_]^"i`aL0.6 0.6 0.63e"l6mnV89:">LV<>PT89:">L`>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M'I:\(`*q`^d]_]^"`aL0.4 0.4 0.43e"6V89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " M@MM: ˁ́̀z" MH`M@Mʀzȁ " M`M@MǀzŁ " M`M@MĀz " M`M@Mz " M`M@Mz " M`M@Mz " M  `M@Mz " M`M@Mz " M"%`&M@PMz  "M`M@1M34 z_{61.318359375, 105.9109375}_{61.318359375, 105.9109375}_{61.318359375, 105.9109375}_({59.838281250000001, 103.91562500000001}_({59.838281250000001, 103.91562500000001}_({59.838281250000001, 103.91562500000001}_({58.323437499999997, 102.57363281250001}_({58.323437499999997, 102.57363281250001}_({58.323437499999997, 102.57363281250001}_({56.571874999999999, 101.42890625000001}_({56.571874999999999, 101.42890625000001}_({56.571874999999999, 101.42890625000001}_#{55.167578124999999, 100.920703125}_#{55.167578124999999, 100.920703125}_#{55.167578124999999, 100.920703125}_({53.516992187500001, 100.66718750000001}_({53.516992187500001, 100.66718750000001}_({53.516992187500001, 100.66718750000001}_${50.775195312499996, 100.8064453125}_${50.775195312499996, 100.8064453125}_${50.775195312499996, 100.8064453125}_${49.391406249999996, 100.9509765625}_${49.391406249999996, 100.9509765625}_${49.391406249999996, 100.9509765625}_({47.762304687499999, 101.78964843750001}_({47.762304687499999, 101.78964843750001}_({47.762304687499999, 101.78964843750001}_${45.963281249999994, 103.0330078125}_${45.963281249999994, 103.0330078125}_${45.963281249999994, 103.0330078125}_({43.932226562499999, 105.15937500000001}_({43.932226562499999, 105.15937500000001}_({43.932226562499999, 105.15937500000001}e"Y6HPV!#&'("*+,-hMj@lV@MpqV@VMN  PۀC "     vMx:y:W|\~>':(`*@Ձրa`؀d׀сρڀ^]Ҁ_ ]^"`aL0.4 0.4 0.43e"6ӁԀV89:">lV\>ЀdT89:">l>ЁрTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6V" MMMM:ρz" @h`MMM z܁ρ" @`@MM z݁ ρ" @`@MM zށ ρ" @`@MM z߁ ρ" @`@MM z ρ" @`@MM z ρ" @`@M M z ρ" @  ` @M M z ρ" @  ` @M M z ρ" @  ` @M $M z ρ" @ (  +` ,@M 0M z}~ ρ" @ 4 $ 7` 8@M <M |zz{ ρ" @ @ 0 C` D@M HM yzwx ρ" @ L < O` P@M TM vztu ρ" M X H [` \@M `Mszqr ρ" @ d T g` hMM lM pznoρ" @ p ` s` t@M xM mzkl ρ" @ | l ` @M M jzhi ρ" @  x ` @M M gzef ρ" @  ` @M M dzbc ρ" @  ` @M M az_` ρ" @  ` @M M ^z\] ρ" @  ` @M M [zYZ ρ" @  ` @M M XzVW ρ" @  ` @M M UzST ρ" @  ` @M M RzPQ ρ" @  ` @M M OzMN ρ" @  ` @M M LzJK ρ" @  ` @M M IzGH ρ" M  ` @M MFzDE ρ "M`@M M  z" M !  $: %MM )MCzABρ" M -  0` 1MM 5M@z>?ρ" M 9 ) <` =MM AM=z;<ρ" @ E 5 H` IMM MM :z89ρ" @ Q A T` U@M YM 7z56 ρ" @ ] M `` a@M eM 4z23 ρ" @ i Y l` m@M qM 1z/0 ρ" M u e x` y@M }M.z,- ρ" M  q ` MM M+z)*ρ" M  } ` MM M(z&'ρ" @  ` MM M %z#$ρ" @  ` @M M "z ! ρ" @  ` @M M z ρ " @  ` @M M z ρ " M  ` @M Mz  ρ  "M`@M M   z " M  : MM Mz ρ " M  ` MM Mz ρ" @  ` MM M z ρ" @  ` @M M  z  ρ" @  ` @M M  z ρ" @  ` @M "M z ρ" M &  )` *@M .Mz ρ "M`@M 5M " z" M ; . >: ?MM CMzρ" M G 5 J` KMM OMzρ" M S C V` WMM [Mzρ" M _ O b` cMM gMzρ" @ k [ n` oMM sM zρ" @ w g z` {@M M z ρ" @  s ` @M M z ρ" @   ` @M M z ρ" M  ` @M Mz ρ "M`@M M  z" M  : MM Mzρ" @  ` MM M zρ " @  ` @M M zށ ρ!" @  ` @M M ݀z ہ ρ"" @  ` @M M ڀz!؁ ρ#" @  ` @M M ׀z"Ձ ρ$" @  ` @M M Ԁz#ҁ ρ%" @  ` @M M рz$ρ ρ&" @  ` @M M ΀z%́ ρ'" @  ` @M $M ˀz&Ɂ ρ(" @ (  +` ,@M 0M Ȁz'Ɓ ρ)" @ 4 $ 7` 8@M <M ŀz(Á ρ*" @ @ 0 C` D@M HM €z) ρ+" @ L < O` P@M TM z* ρ," @ X H [` \@M `M z+ ρ-" @ d T g` h@M lM z, ρ." @ p ` s` t@M xM z- ρ/" @ | l ` @M M z. ρ0" @  x ` @M M z/ ρ1" @  ` @M M z0 ρ2" @  ` @M M z1 ρ3" @  ` @M M z2 ρ4" @  ` @M M z3 ρ5" @  ` @M M z4 ρ6" @  ` @M M z5 ρ7" M  ` @M Mz6 ρ8" @  ` MM M z7ρ9" @  ` @M M z8 ρ:" @  ` @M M z9 ρ;" @  ` @M M z: ρ<" @   ` @M M z; ρ=" @ $  '` (@M ,M z< ρ>" @ 0 3` 4@M 8M z= ρ?" @ < , ?` @@M DM z> ρ@" @ H 8 K` L@M PM z?~ ρA" @ T D W` X@M \M }z@{| ρB" @ ` P c` d@M hM zzAxy ρC" @ l \ o` p@M tM wzBuv ρD" @ x h {` |@M M tzCrs ρE" @  t ` @M M qzDop ρF" @  ` @M M nzElm ρG" @  ` @M M kzFij ρH" @  ` @M M hzGfg ρI" @  ` @M M ezHcd ρJ" @  ` @M M bzI`a ρK" @  ` @M M _zJ]^ ρL" @  ` @M M \zKZ[ ρM" @  ` @M M YzLWX ρN" M  ` @M MVzMTU ρO "M`@MpM  PzN "M:MMM   QRSzO_({66.782109375000019, 83.613734342065342}_({66.782109375000019, 83.613734342065342}_({66.782109375000019, 83.613734342065342}_({65.055109375000015, 88.754118325133973}_({64.996442415000033, 89.304703124178175}_({65.055109375000015, 88.754118325133973}_({64.444609374999999, 89.834050242715549}_({64.096274300000005, 90.003423655165463}_({64.792944450000036, 89.664676830265634}_({63.108109374999991, 89.892684981204965}_"{62.888108275, 89.839867390120716}_({63.650778754999997, 90.022968372546146}_'{62.45910937499999, 89.670873866561962}_({62.246441644999997, 89.575816641847169}_({62.671777105000011, 89.765931091276755}_({61.892609374999999, 89.314869249543094}_({61.727608550000006, 89.172588876229909}_({62.057610199999992, 89.457149622856278}_'{61.496609375000013, 88.80729806094736}_!{61.39760888, 88.611195949959424}_({61.595609869999997, 89.003400171935269}_"{61.348109375, 88.128146365223969}_"{61.348109375, 87.886145155223986}_"{61.348109375, 88.384814315223949}_'{61.562609375000015, 87.59114325904666}_({61.705610090000015, 87.475140608251436}_({61.419608660000016, 87.707145909841913}_&{62.134609375000018, 87.3599683092405}_({62.372943899999989, 87.321853556248456}_({61.896274850000019, 87.398083062232544}_({62.943109374999999, 87.317571985956775}_({63.243777544999993, 87.327422382105269}_({62.642441205000004, 87.307721589808281}_({63.861609374999993, 87.334584326171878}_({64.173277600000006, 87.336075546874568}_'{63.549941149999988, 87.33309310546916}_({64.780109375000023, 87.296596666386947}_({65.080777545000032, 87.269780212535451}_'{64.479441205000001, 87.32341312023847}_({65.588609375000019, 87.089200343103229}_({65.826943900000018, 86.977751890111179}_'{65.350274850000019, 87.20064879609528}_({66.160609375000021, 86.588525393297047}_({66.303610090000021, 86.366188877501813}_({66.017608660000022, 86.810861909092282}_({66.375109375000036, 85.672022287119731}_({66.375109375000036, 85.254020197119743}_({66.375109375000036, 86.060690897119727}_({66.094609375000019, 84.532180195197768}_({65.907608440000033, 84.190283757776157}_({66.281610310000033, 84.874076632619378}_({65.374109375000032, 83.633203449280543}_({65.080774575000035, 83.375779059501539}_({65.667444175000028, 83.890627839059576}_'{64.38960937500002, 82.989845910966167}_({64.026607560000002, 82.818363130677142}_'{64.75261119000001, 83.161328691255207}_'{63.306109374999998, 82.60322057550286}_({62.866107175000018, 82.497585393334333}_({63.665444505000004, 82.689489307607147}_({62.057609374999991, 82.468482244791318}_'{61.66527408000001, 82.484291424024406}_({62.449944670000001, 82.452673065558258}_({61.023609374999999, 82.720740807902502}_({60.726607890000018, 82.873104844938752}_({61.320610860000009, 82.568376770866251}_({60.319609374999992, 83.409725361510098}_({60.147275180000001, 83.716686656827406}_({60.491943570000011, 83.102764066192762}_({60.061109374999994, 84.585165002287894}_({60.061109374999994, 84.585165002287894}_({60.061109374999994, 84.108495952287868}_({61.051109375000003, 84.822842973777213}_({61.051109375000003, 84.492841323777199}_({61.051109375000003, 84.822842973777213}_({61.243609374999998, 84.016558134900109}_({61.371943350000002, 83.809033871365941}_({61.115275400000023, 84.224082398434305}_'{61.749609374999999, 83.54953798699465}_({61.958610420000007, 83.445713928524711}_({61.540608329999991, 83.653362045464618}_'{62.48110937500001, 83.384155599261774}_({62.759777435000011, 83.377724181301815}_({62.202441315000009, 83.390587017221705}_({63.339109375000014, 83.480143174552509}_"{63.573777215, 83.536481938375701}_({63.045774575000017, 83.409719719773491}_({64.048609375000012, 83.716479054119858}_({64.286943900000011, 83.817698331127801}_({63.810274850000006, 83.615259777111888}_({64.692109375000001, 84.096469735587888}_({64.882776995000015, 84.248578846194263}_({64.501441755000002, 83.944360624981542}_({65.154109375000033, 84.641886122282912}_({65.271443295000026, 84.853389754194538}_({65.036775455000011, 84.430382490371315}_({65.330109375000021, 85.388139983881004}_({65.330109375000021, 85.659474673881007}_({65.330109375000021, 85.102138553881005}_({65.115609375000034, 85.996643090058328}_'{64.972608660000034, 86.13097916585356}_({65.258610090000033, 85.862307014263095}_({64.543609375000017, 86.271818039864499}_({64.305274850000018, 86.320932847856554}_'{64.78194390000003, 86.222703231872444}_"{63.735109375, 86.336214363148216}_({63.434441205000006, 86.330030651999735}_({64.035777545000002, 86.342398074296725}_'{62.816609375000006, 86.31920202293314}_({62.504941150000001, 86.314044117230438}_({63.128277600000011, 86.324359928635843}_({61.898109375000011, 86.340689682718065}_({61.597441205000017, 86.360172766569562}_({62.198777545000006, 86.321206598866539}_({61.089609375000002, 86.509586006001783}_({60.851274850000003, 86.602701033993824}_({61.327943900000001, 86.416470978009713}_'{60.517609374999999, 86.95526095580793}_!{60.37460866, 87.159264046603155}_({60.660610089999999, 86.751257865012704}_'{60.303109375000012, 87.80026406198526}_({60.303109375000012, 88.196266041985226}_({60.303109375000012, 87.440928931985255}_({60.545109375000003, 88.886863121682623}_({60.706443515000011, 89.215264136811086}_'{60.383775234999995, 88.55846210655416}_({61.188609374999992, 89.756353803150674}_'{61.45627738000001, 90.007616140636529}_({60.920941370000001, 89.505091465664819}_'{62.101609375000002, 90.39354571019085}_({62.442611079999999, 90.567080101371417}_({61.760607670000006, 90.220011319010226}_({63.152109375000002, 90.783248446604503}_({63.555444724999994, 90.880080696925646}_({62.792774244999997, 90.696979714500188}_({64.274109375000023, 90.909616814292391}_({64.618777765000004, 90.897030563657708}_({63.929440985000006, 90.922203064927047}_({65.181609375000036, 90.676488288157586}_'{65.441944010000029, 90.53365474427396}_({64.921274740000015, 90.819321832041211}_({65.797609375000022, 90.048876803750957}_({65.947943460000019, 89.773300599325196}_'{65.647275290000024, 90.32445300817669}_({66.045109375000024, 88.991796296623292}_({66.045109375000024, 88.991796296623292}_({66.030442635000028, 89.420943953884304}_({65.055109375000015, 88.754118325133973}_({65.055109375000015, 88.754118325133973}_({65.055109375000015, 88.754118325133973}_({56.827109375000006, 89.077750295422746}_({57.619113334999994, 89.267893623326088}_({56.827109375000006, 89.077750295422746}_({58.625609374999996, 88.899031943628316}_({59.032611410000001, 88.589742452134246}_({58.218607339999991, 89.208321435122443}_'{59.236109374999998, 87.33510002604676}_({59.236109374999998, 86.601763026046783}_({59.236109374999998, 88.068437026046738}_({58.625609374999996, 85.472531943628368}_({58.218607339999991, 84.964150680122501}_({59.032611410000001, 85.980913207134265}_({56.827109375000006, 84.435750295422778}_({56.827109375000006, 84.435750295422778}_({57.619113334999994, 84.618560253326123}_({54.429109375000003, 83.860041431148673}_({54.429109375000003, 83.860041431148673}_({54.429109375000003, 83.860041431148673}_'{54.429109375000003, 80.64804143114867}_'{54.429109375000003, 80.64804143114867}_'{54.429109375000003, 80.64804143114867}_({53.384109375000001, 80.397159127909958}_({53.384109375000001, 80.397159127909958}_({53.384109375000001, 80.397159127909958}_({53.384109375000001, 88.251159127909901}_({53.384109375000001, 88.251159127909901}_({53.384109375000001, 88.251159127909901}_({56.475109375000002, 85.231242572226577}_({57.069112344999994, 85.366516698154086}_({56.475109375000002, 85.231242572226577}_({57.778609374999988, 85.907185234687503}_({58.053610750000004, 86.222541803542825}_{57.503608, 85.591828665832182}_({58.191109375000011, 87.084217722808049}_({58.191109375000011, 87.553553402808021}_({58.191109375000011, 86.614882042808048}_({57.778609374999988, 88.057685234687497}_{57.503608, 88.237331140832154}_({58.053610750000004, 87.878039328542783}_({56.475109375000002, 88.113242572226554}_({56.475109375000002, 88.113242572226554}_({57.069112344999994, 88.255850068154061}_({54.429109375000003, 87.622041431148645}_({54.429109375000003, 87.622041431148645}_({54.429109375000003, 87.622041431148645}_({54.429109375000003, 84.740041431148668}_({54.429109375000003, 84.740041431148668}_({54.429109375000003, 84.740041431148668}_({51.712109375000004, 82.833747442727997}_({51.712109375000004, 81.829075752728016}_({51.712109375000004, 82.833747442727997}_({50.909109375000007, 80.380464199186662}_({50.373773365000012, 79.749605549214948}_({51.444445385000002, 81.011322849158375}_'{48.62110937500001, 79.077663998411367}_({47.609104315000017, 78.834703079423747}_'{49.61111432500001, 79.315343158290517}_({46.250609375000003, 79.229057300011931}_({45.682273200000004, 79.572947591377613}_({46.818945550000002, 78.885167008646278}_'{45.398109374999997, 81.31789015789613}_'{45.398109374999997, 81.31789015789613}_({45.398109374999997, 80.269218247896134}_({45.398109374999997, 86.333890157896107}_({45.398109374999997, 86.333890157896107}_({45.398109374999997, 86.333890157896107}_({46.443109374999999, 86.584772461134818}_({46.443109374999999, 86.584772461134818}_({46.443109374999999, 86.584772461134818}_'{46.443109374999999, 81.56877246113487}_({46.443109374999999, 80.864768941134855}_'{46.443109374999999, 81.56877246113487}_({47.004109375000006, 80.102956644978804}_({47.378111245000007, 79.829744734822043}_({46.630107505000005, 80.376168555135564}_'{48.62110937500001, 79.946663998411367}_({49.288446045000008, 80.106877358033614}_'{47.91710585500001, 79.777647706941735}_({50.144609375000009, 80.856923987869919}_({50.492944450000003, 81.303553655419989}_({49.796274300000015, 80.410294320319821}_({50.667109375000003, 82.582865139489286}_({50.667109375000003, 82.582865139489286}_({50.667109375000003, 81.878861619489271}_({50.667109375000003, 87.598865139489234}_({50.667109375000003, 87.598865139489234}_({50.667109375000003, 87.598865139489234}_({51.712109375000004, 87.849747442727946}_({51.712109375000004, 87.849747442727946}_({51.712109375000004, 87.849747442727946}_({51.712109375000004, 82.833747442727997}_({51.712109375000004, 82.833747442727997}_({51.712109375000004, 82.833747442727997}_({43.022109375000007, 83.398463026321778}_({42.904775455000006, 83.927629764410156}_({43.022109375000007, 83.398463026321778}_({42.246609375000006, 84.466281948655123}_({41.846940710000005, 84.648998051518717}_({42.646278040000006, 84.283565845791529}_({40.822109375000004, 84.542289756345511}_({40.352773695000003, 84.429612228699071}_({41.372112125000008, 84.674333734056162}_({39.617609375000001, 83.989114891033481}_({39.283941040000002, 83.733007331222367}_({39.951277710000006, 84.245222450844622}_({38.792609375000005, 83.081549914792404}_({38.576274960000006, 82.732611131892895}_({39.008943790000004, 83.430488697691928}_({38.314109375000001, 81.949172228572564}_({38.211442195000004, 81.543188779399941}_({38.416776555000006, 82.355155677745216}_({38.160109375000005, 80.724200099674277}_'{38.160109375000005, 80.27686452967427}_({38.160109375000005, 81.134868819674267}_({38.314109375000001, 79.490672228572606}_({38.416776555000006, 79.115651772745252}_'{38.211442195000004, 79.86569268439996}_({38.792609375000005, 78.560549914792432}_({39.008943790000004, 78.315485727691964}_({38.576274960000006, 78.805614101892928}_({39.623109375000006, 78.050435324208479}_({39.960444395000003, 77.955421417204349}_({39.285774355000008, 78.145449231212609}_({40.833109375000006, 78.076930622695414}_({41.177777765000002, 78.159678182060759}_({40.363773695000006, 77.964253095049003}_({41.751609375000001, 78.467942962910513}_({42.019277380000013, 78.645871600396362}_({41.483941370000004, 78.290014325424636}_({42.444609375000006, 79.107317542953012}_({42.638943680000004, 79.355640756744123}_({42.250275070000008, 78.858994329161931}_({42.901109375000004, 79.937413496473084}_({43.011109925000007, 80.242490352015238}_({42.791108825000002, 79.632336640930959}_({43.099109375000005, 80.886949090770969}_({43.099109375000005, 80.886949090770969}_({43.077109265000004, 80.558999051662539}_'{44.144109375000006, 81.13783139400968}_({44.041442195000009, 80.123178234837013}_'{44.144109375000006, 81.13783139400968}_({43.121109375000003, 78.582230823470724}_({42.541773145000001, 77.893141750282155}_({43.700445605000006, 79.271319896659264}_({40.745109375000006, 77.186803691896358}_({40.136439665000005, 77.040675023229909}_({41.749781065000001, 77.428004024514479}_({39.150109375000007, 77.117378071163586}_({38.695440435000002, 77.217222761256096}_({39.604778314999997, 77.017533381071047}_({38.017109375000004, 77.708868837125806}_'{37.716441205000002, 78.00335329597732}_({38.317777545000006, 77.414384378274292}_({37.340609375000007, 78.844455556608096}_({37.190275290000002, 79.307032696033872}_({37.490943460000004, 78.381878417182349}_'{37.115109375000003, 80.39631779643554}_({37.115109374999996, 80.968320656435537}_({37.115109374999996, 79.824314936435542}_'{37.357109375000007, 82.06591685613293}_({37.518443515000008, 82.606985601261357}_({37.195775235000006, 81.524848111004474}_({38.066609375000006, 83.550752735700243}_'{38.378277600000011, 83.99957952640294}_({37.754941150000001, 83.101925944997518}_({39.232609375000003, 84.716184568787654}_({39.698278370000004, 85.044316218249335}_({38.766940380000001, 84.388052919325972}_({40.833109375000006, 85.424930622695385}_'{41.24377809500001, 85.523523459385999}_({40.231773035000003, 85.280562540398407}_({41.999109375000003, 85.539862455782796}_({42.365777875000006, 85.517891224256559}_({41.632440875000007, 85.561833687309033}_({42.978109375000003, 85.290899560922227}_({43.264110805000008, 85.146894699331781}_({42.692107945000011, 85.434904422512673}_({43.693109375000006, 84.665055873664485}_({43.883776994999998, 84.391829524270875}_({43.502441755000007, 84.938282223058152}_({44.067109375000008, 83.649345329560489}_({44.067109375000008, 83.649345329560489}_({44.008442415000012, 84.053262728604679}_({43.022109375000007, 83.398463026321778}_({43.022109375000007, 83.398463026321778}_({43.022109375000007, 83.398463026321778}e"_6uh  $ 0 < H T ` l x    ) 5 A M Y e q }  " . 5 C O [ g s   $ 0 < H T ` l x   , 8 D P \ h t p܁݁ށ߁      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPV!#&'("*+,-M@V@MV@VMN  C "     M`:W<>':(`*Ma`P^]_]^"`aL0.6 0.6 0.63e"6V89:">V<>PT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M!'I:\(%`*'q`^d]_]^")`aL0.4 0.4 0.43e",6-.V89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"AvLp7 " M@MJKMMN: ́́΀z" MRU`VMMZMˀzɁ" M^Ka`bMMfMȀzƁ" MjZm`nM@MŀzÁ  "M`M@yM{|f €z_({113.47812500000002, 96.250390625000009}_({113.47812500000002, 96.250390625000009}_({113.47812500000002, 96.250390625000009}_({99.056250000000006, 88.161328125000011}_({99.056250000000006, 88.161328125000011}_({99.056250000000006, 88.161328125000011}_({80.251562500000006, 92.976171875000006}_({80.251562500000006, 92.976171875000006}_({80.251562500000006, 92.976171875000006}_({95.893359375000003, 99.782421875000011}_({95.893359375000003, 99.782421875000011}_({95.893359375000003, 99.782421875000011}_({86.415234374999997, 93.280859375000006}_({86.415234374999997, 93.280859375000006}_({86.415234374999997, 93.280859375000006}e"6KZfV!#&'("*+,-M@V@MV@VMN  ܀C "     M`:W<>':(`*Mց׀a`ـP؀ҁЁۀ^]Ӏ_]^"`aL0.6 0.6 0.63e"6ԁՀV89:">V<>рPT89:">>сҀTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6ҁ݀Vc"    def:gWM:l:W>:M'I:\(`*q`ށ^d]߀_]^"`aL0.4 0.4 0.43e"6V89:">V\>݀dT89:">>݁ހTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " M@M  M : Ёz" M`M@Mz Ё" M !`"M@&Mz Ё" M*-`.M@2Mz Ё" M6&9`:M@Mz Ё "M`M@EMGH2 z_!{69.782812500000006, 90.69140625}_!{69.782812500000006, 90.69140625}_!{69.782812500000006, 90.69140625}_({100.79335937500001, 83.373828125000003}_({100.79335937500001, 83.373828125000003}_({100.79335937500001, 83.373828125000003}_{100.94179687500001, 55.5}_{100.94179687500001, 55.5}_{100.94179687500001, 55.5}_({68.017968749999994, 65.328906250000003}_({68.017968749999994, 65.328906250000003}_({68.017968749999994, 65.328906250000003}_({67.870703125000006, 91.667968750000014}_({67.870703125000006, 91.667968750000014}_({67.870703125000006, 91.667968750000014}_({93.776953125000006, 101.13710937499999}_({93.776953125000006, 101.13710937499999}_({93.776953125000006, 101.13710937499999}e"^6 &2V!#&'("*+,-hMj@lV@MpqV@VMN#  C "     vMx`y:W|<~>':(`*M  a` P  ^]_]^"`aL0.6 0.6 0.63e"6V89:">lV<>PT89:">l>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M'I:\(`*q`^d]_]^"`aL0.4 0.4 0.43e"6V89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " M@MpM:  !"z "M`M@Mh z_!{67.948046875000003, 71.43359375}_!{67.948046875000003, 71.43359375}_!{67.948046875000003, 71.43359375}_ {88.7890625, 65.558984374999994}_ {88.7890625, 65.558984374999994}_ {88.7890625, 65.558984374999994}e"6hpV!#&'("*+,-M@V@MV@VMN=M % @0C "     M` :W <>':(`*M.*+a`-P,&$/^]'_]^"`aL0.6 0.6 0.63e"6()V89:">V<>%PT89:">>%&TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"1621Vc"    def:gW5M7:8l:W;>=>:MA'I:\(E`*G:67q`982$;^d]3_<]^"I`aL0.4 0.4 0.43e"L6MN45V89:">2V\>1dT89:">2>>12TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"avLp7 " M@MjkMmn: $J>KLz" Mru`vM@zMIz=GH $?" M~k`M@MFz>DE $@ "M`M@Mz$ ABCz?_({102.56601562500001, 56.248828125000003}_({102.56601562500001, 56.248828125000003}_({102.56601562500001, 56.248828125000003}_({122.32773437500002, 72.188281250000003}_({122.32773437500002, 72.188281250000003}_({122.32773437500002, 72.188281250000003}_({122.15781250000002, 96.316015625000006}_({122.15781250000002, 96.316015625000006}_({122.15781250000002, 96.316015625000006}_({102.23476562500001, 84.106250000000003}_({102.23476562500001, 84.106250000000003}_({102.23476562500001, 84.106250000000003}e"6kz=>?@V!#&'("*+,-M@V@MV@VMNgs O iZC "     M`:W<>':(`*MXTUa`WPVPNY^]Q_]^"`aL0.6 0.6 0.63e"6΁RSV89:">V<>OPT89:">>OPTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6[Vc"    def:gWM:l:W>:M'I:\(`*d`aq`cb\Ne^d]]_f]^"`aL0.4 0.4 0.43e"6^_V89:">V\>[dT89:">>[\TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " MMMM:Nphqrz" M"%`&MMMozgmnNi "M`MM1M34Njklzh_({91.016015625000009, 58.502734375000003}_({91.101544851983462, 64.525836062270471}_({91.016015625000009, 58.502734375000003}_({91.349426222617225, 76.656674853478108}_({91.423054981744855, 79.089085318985383}_'{91.23316782896714, 70.599718999540968}_({91.518750000000011, 83.969531250000003}_({91.518750000000011, 83.969531250000003}_&{91.410746240872413, 81.5475374511594}e"A6ghiV!#&'("*+,-HMJ@LV@MPQV@VMN u C "     VMX`Y:W\<^>`b':(e`*M~z{a`}P|vt^]w_]^"i`aL0.6 0.6 0.63e"l6mnxyV89:">LV<>uPT89:">L`>uvTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gWM:l:W>:M'I:\(`*q`t^d]_]^"`aL0.4 0.4 0.43e"6V89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 " M@MPM: tz "M`M@MHt z_({91.569791666666674, 76.697526041666663}_({91.569791666666674, 76.697526041666663}_({91.569791666666674, 76.697526041666663}_!{100.54843750000001, 74.44140625}_!{100.54843750000001, 74.44140625}_!{100.54843750000001, 74.44140625}e"6HPV!#&'("*+,-M@V@MV@VMN  C "     M::W>':(`*@a`^]_ z^"9a_NSCustomColorSpaceE0.253"TNSIDyz\NSColorSpace~\NSColorSpace]^"`aL0.6 0.6 0.63e" 6  V89:">V<>PT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6Vc"    def:gW"M$:%l:W(>*+:M.'I:\(2`*4q`^d]_]^"6`aL0.4 0.4 0.43e"96:;V89:">V\>dT89:">+>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"NvLp7 " M@MWXMZ[: €z" M_b`cM@gMz " MkXn`oM@sMz " Mwgz`{M@Mz  "M`@@Ms  z_"{93.277734375000009, 80.302734375}_"{93.277734375000009, 80.302734375}_"{93.277734375000009, 80.302734375}_({98.163281250000011, 78.995182291666666}_({98.163281250000011, 78.995182291666666}_({98.163281250000011, 78.995182291666666}_({98.151953125000006, 81.398697916666663}_({98.151953125000006, 81.398697916666663}_({98.151953125000006, 81.398697916666663}_({93.256510416666671, 82.557942708333329}_({93.256510416666671, 82.557942708333329}_({93.256510416666671, 82.557942708333329}e"6XgsV!#&'("*+,-M@V@MV@VMN  рC "     M::W>':(`*@ˁ̀a`΁Ɓ̀ǁāЀ^]Ȁ_ z^"9aF1 0.53]^"`aL0.6 0.6 0.63e"6ȁɁʀV89:">V<>ŀPT89:">>ŁǀTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"6܁ҀVc"    def:gWM:l:W>:M'I:\(`*ׁ؀q`ڀفӁ܀^d]Ԁ_]^"`aL0.4 0.4 0.43e"6ՁրV89:">V\>ҀdT89:">>ҁӀTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vLp7 " M@MM: āz" M` M@$Mzށ ā" M(+`,M@0Mz߁ ā" M4$7`8M@<Mz ā" M@0C`DM@HMz ā" ML<O`PM@Mz ā "M`@@MH  z_({86.074739583333326, 91.577083333333334}_({86.074739583333326, 91.577083333333334}_({86.074739583333326, 91.577083333333334}_({98.426302083333326, 88.456250000000011}_({98.426302083333326, 88.456250000000011}_({98.426302083333326, 88.456250000000011}_({112.89166666666668, 97.971354166666671}_({112.89166666666668, 97.971354166666671}_({112.89166666666668, 97.971354166666671}_({118.49947916666667, 100.39791666666667}_({118.49947916666667, 100.39791666666667}_({118.49947916666667, 100.39791666666667}_({104.03880208333334, 103.20026041666668}_({104.03880208333334, 103.20026041666668}_({104.03880208333334, 103.20026041666668}_({99.073177083333348, 100.97890625000001}_({99.073177083333348, 100.97890625000001}_({99.073177083333348, 100.97890625000001}e"q6$0<Hށ߁V!#&'("*+,-{M}@>V@MV@VM :C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6Vc"    def:gWM:l:W>:M'I:\(`*q`^d]_]^"`aL0.4 0.4 0.43e"6V89:">V\>dT89:">>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({103.19296875000002, 101.37734375000002}_({109.85338541666668, 100.27942708333335}!#&'("*+,-M@>V@MV@VM  : C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6с Vc"    def:gWM:l:W>:M'I:\(`*q`  ^d]_]^"`aL0.4 0.4 0.43e"6V89:">V\> dT89:">>  TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({99.792968750000014, 99.777343750000014}_({107.37786458333335, 98.518489583333348}!#&'("*+,-M @>V@MV@VM) *:C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6Vc"    def:gWM:l:W >"#:M&'I:\(*`*,&"#q`%$'^d]_(]^".`aL0.4 0.4 0.43e"1623 !V89:">V\>dT89:">#>TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"FvLp7 _({98.092968750000011, 97.977343750000017}_({105.82682291666667, 96.658333333333346}!#&'("*+,-MMO@>V@MTVV@VM,: ;:-C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"\6].Vc"    def:gW`Mb:cl:Wf>hi:Ml'I:\(p`*r734q`65/+8^d]0_9]^"t`aL0.4 0.4 0.43e"w6xy12V89:">]V\>.dT89:">]i>./TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({95.892968750000023, 96.477343750000017}_ {103.621875, 94.742187500000014}!#&'("*+,-M@>V@MV@VM=K L:>C _*{{0.79296875, 19.177343750000006}, {0, 0}}e"6?Vc"    def:gWM:l:W>:M'I:\(`*HDEq`GF@<I^d]A_J]^"`aL0.4 0.4 0.43e"6BCV89:">V\>?dT89:">>?@TV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 _({93.092968750000011, 94.477343750000017}_({99.834895833333348, 92.602343750000003}"::M@MRTN U!X">BMO !de"nPQRS #@ia-#@#"N#@ia-"N#@#ZBackgroundde"nVW #@#"M#@#e"vY  !#&'(  "*+,-M@V@MVVV@VMUdimLKVcornRXVcornRYZ] ^ xkM de"n[\ ]cornerRadiusX]cornerRadiusY_#{{0, 0}, {140, 187.30000000000001}}"     $M&`':W*+,>.0':(3`*@iefa`h_g`Yj^]a_ ]^"7`aO0.8 0 0.013333333333]^":`aF1 0 03e"=6>?bcV89:"><>^PT89:">VI>^dT]^"L`aL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"U6VlVc"    def:gWYM[:\l:W_>ab:@e'I:\(i`*kuqrq`tsmY v^d]n_w]^"m`aL0.4 0.4 0.43e"p6qropV89:">VV\>ldT89:">Vb>lmTV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vLp7 yz\PCRectVector~\PCRectVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjecte"vրC yzWPCFrame~WPCFrame_PCMetadataObjectZPCDrawableXPCObjecte"v| "  MM>>:>@MMBYauSizCropVnewFacUapIn1TpathTapIDUcropRUapIn2UisRelUisColTcropVvarVal~}  _!{{6, 29.650000000000006}, {0, 0}}Zcupspm.png" @R>@XUcodeSUprColVprShTiSfraVcodePlVcodeFrUcodeFTsnShVexPropTpropUgenCHUgrTypVanLooCVprLinCUcodeL  |de"n<P V{JFIF}U{GIF}_"kCGImageDestinationBackgroundColorU{PNG}V{TIFF}_*kCGImageDestinationLossyCompressionQualityde"n de"n de"n de"n #?Zpublic.png]public.folderde"  n ]^"`aL0.5 0 0 0.53SiosUcocoaUtouchVMyViewVUIViewyz_PCBitmapProperties~_PCBitmapPropertiesXPCObjectyzYPCFactory ~YPCFactoryZPCDrawableXPCObject"  MM>%>:>@MM.BN  _cupspm-icon.png" 2@R7>:;@>@  de"DKnEFGHIJLM<OPQP V{JFIF}U{GIF}_"kCGImageDestinationBackgroundColorU{PNG}V{TIFF}_*kCGImageDestinationLossyCompressionQualityde"Z[n de"^_n de"bcn de"fgn #?]public.folderde"lmn ]^"p`aL0.5 0 0 0.53VMyViewVUIViewe"u6VYselection_{140, 187.30000000000001}z^"z9aE0.753_CICheckerboardGenerator" >@R>@ Áā Àde"n<P _"kCGImageDestinationBackgroundColorV{JFIF}U{GIF}V{TIFF}U{PNG}_*kCGImageDestinationLossyCompressionQualityde"n de"n de"n [Compressionde"n #?_com.likethought.opacity.opacityde"n ]^"`aJ1 0 0 0.53SmacVquartz_MyDrawingFunctionde"nρƁǁȁɁʁˁ́́ΩсρρЁсρҁӁρπ _framePickerVisibleZhideRulers[windowFrame_layerViewDimension]hideVariablesZexpansionsYprintInfo]toolbarHidden_editFrameMetadata_{{0, 0}, {1440, 849}}#@i`de"n "\NSAttributesde"nՁցׁ؁فځہܨ݁ށށ߁݁ _NSHorizontallyCentered]NSRightMargin\NSLeftMargin_NSHorizonalPagination_NSVerticalPagination_NSVerticallyCentered[NSTopMargin^NSBottomMargin "B"Byz[NSPrintInfo~[NSPrintInfode"n "| _"com.likethought.opacity.preview.ui_(com.likethought.opacity.preview.elementsWfactory_#com.likethought.opacity.preview.web_&com.likethought.opacity.preview.cursorTtype_&com.likethought.opacity.preview.iphonede",0n-/<3P Ucolor[resolutionse"869:;<V#?#?de"AEnBCDρρ݀ VstatusWtoolbarTdockde"NQnOPRS WaddressUimage_#http://likethought.com/opacity/web/_,http://likethought.com/opacity/web/image.pngde"Z_n[]-`ab<P XhotspotXXhotspotY#@#@=ffffhde"jsnk-mnopqt<vwty P     UrectXUrectHUrectWUrectYTleftStop#@4#@F#@i"yzWPCImage~WPCImage_PCMetadataObjectZPCDrawableXPCObject_NSKeyedArchiverTroot"+5:? a g * 2 : > D I O U Y ` h n v z   %+29@ELTZ\^acfhjknpy{~ "1DMVY[]kt 159;DFHQ^er{#%.02;>@B[`flnpr{~ $(.38=>@BCEGIJSUjlnprt(6>IRWdgilnpy "(,02345679;=>@AWdmz|~"<CVciv}38MZbgir!":GIKMR_hjlnpy{}  !$&)+-6CENPWdgilnpy  \cjry $)18<@IPW]dmqw{#%')+4CL[fo1<ENQSU$13<ACEG\^`bdy{}+6?lv},-/135789;=>oprtvxz{|~  ? H V _ m x !*!U!!!"","W"""""""""""""""## ##]#_#a#b#d#e#g#h#i#k#m#o#q#r#s###################$$$$$"$$$&$($=$?$A$C$E$Z$\$^$`$b$i$p$w$~$$$$$$%%%%%%%%%% %"%$%%%'%)%+%-%/%1%3%@%M%O%X%]%_%a%c%x%z%|%~%%%%%%%%%%%%%%%%%&& & & & &&&&&&&I&J&L&N&P&R&T&U&V&X&Z&[&&&&&&&&&&&&&&&&&&&&&&&''1'\'''((3(^(((((((((()B)D)F)G)I)J)L)M)N)P)R)T)V)W)X))))))))))))))))))))))*** * * *"*$*&*(***?*A*C*E*G*N*U*\*c*j*q*z*}*********+++++ + + +++++++%+2+4+=+B+D+F+H+]+_+a+c+e+z+|+~++++++++++++++++++++++++,.,/,1,3,5,7,9,:,;,=,?,@,q,r,t,v,x,z,|,},~,,,,,,,,,,,,,,,-->-i---..@.k........./$/&/(/)/,/-///0/1/3/5/7/9/:/;///////////////////////////000 0 0 0"0$0&0(0*01080?0F0M0T0]0`0b0d000000000000000000001111 1%1'1)1+1@1B1D1F1H1]1_1a1c1e1l1s1z1111111111111111111222222222 2"2$2%2R2S2T2V2W2Y2Z2\2^2`2b2223393d3333333334D4F4I4J4M4N4Q4R4S4U4X4[4]4^4_4444444444444444444455 555555456595;5=5R5T5W5Z5\5c5j5q5x5555556 6 66666666 6#6&6'6*6,6.606365686E6R6T6]6b6e6h6j666666666666666666666777777777"7%7'7X7Y7\7^7a7d7g7h7i7l7o7p7777777777778838^8889 959>9E9H9K9N9P999999999999999999999:e:h:i:l:o:q:s:v:x:{:~:::::::::::::::::::::::::;;; ;;;;%;,;5;:;<;>;@;k;;;;;;;;;<=S=U=X=Z=\=q=s=v=y={==========>)>,>->0>3>5>7>:><>?>B>E>F>I>K>M>O>R>T>W>d>q>s>|>>>>>>>>>>>>>>>>>>>>>>????1?2?3?4?7?:?=?>?A?D?F?w?x?{?}????????????????????@ @ @ @@@@@@@@ @!@B@C@D@G@H@J@K@N@y@@@A%APA{AAAB'BRB[BfBiBlBoBrBuBwBBBBBBBBBBBBBBCC C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDD!D(D/D6D=DDDKDTDYD[D]D_DDDDDDEEEEEE E EEEE>EGEJEMEOEEEEEEEEEEEEEEEEEEEEEF F FFFF F"F7F9FF@FUFWFZF]F_FfFmFtF{FFFFFFFFFG:G]?]B]E]F]w]x]{]}]]]]]]]]]]]]]]]]]]]]^ ^ ^ ^^^^^^^^ ^!^R^S^V^X^[^^^a^b^c^f^i^j^^^^^^^^^^^^^^^^^^^^^^^^_-_._1_3_6_9_<_=_>_A_D_E_v_w_z_|____________________`` ` ````````` `Q`R`U`W`Z`]```a`b`e`h`i````````````````````````a,a-a0a2a5a8a;aiAiBiCiFiIiJi{i|iiiiiiiiiiiiiiiiiiiiiij jjjjjjjjj!j$j%jVjWjZj\j_jbjejfjgjjjmjnjjjjjjjjjjjjjjjjjjjjjjjkk1k2k5k7k:k=k@kAkBkEkHkIkzk{k~kkkkkkkkkkkkkkkkkkkkkl l llllllll l#l$lUlVlYl[l^laldlelflilllmllllllllllllllllllllllllm0m1m4m6m9mo?o@oCoFoGoxoyo|o~oooooooooooooooooooop p ppppppppp!p"pSpTpWpYp\p_pbpcpdpgpjpkppppppppppppppppppppppppq.q/q2q4q7q:q=q>q?qBqEqFqwqxq{q}qqqqqqqqqqqqqqqqqqqqr r r rrrrrrrr r!rRrSrVrXr[r^rarbrcrfrirjrrrrrrrrrrrrrrrrrrrrrrrrs-s.s1s3s6s9ssAsDsEsvswszs|sssssssssssssssssssstt t ttttttttt tQtRtUtWtZt]t`tatbtethtittttttttttttttttttttu u5u`uuuv v7vbvvvww2w]wwwxx,xWx|xxxyyFyoyyyzzFzqzzz{{F{q{{{||G|r|||}}I}t}}}~~I~s~~~It Kv̀"Mx΁#Nx΂Itʃ Kv̄"Mxͅ#MrȆHsɇJtÈCnÉCmÊDoŋEpŌFqǍHsɎItʏ Kv̐ Juˑ!Lw͒#EpƓ>i@kBmÖBm×BmØDnÙDnÚDośFqǜHsɝJu˞!Lw͟#NyΠ$Nyϡ%P{Ѣ'R}ӣ)Tդ*Tզ+Vק,Wب-Xة-X٪.Yګ0[ܬ2]ެԭ׭ڭݭ "%(+.147:=@CFILORUX[^adgjmpsvy|ĮǮʮͮЮӮ֮ٮܮ߮ !$'*-035|~ "$%2?AJORUWlnqsuǰʰͰϱBEFILNPSUX[^_bdfhkmp}ձױڱݱ߱ JKLMPSVWZ]_ٲڲݲ߲"#&(+.12369:ghilmpqtwy|ҳ(S~Դ*Uֶ !$&morsvwz{|~ #02;@CFH]_bdf{}367:=?ADFILOPSUWY\^an{}Ƹȸ˸θи׸޸ ;<=>ADGHKNPʹ˹ιйӹֹٹڹ۹޹"#$'*+\]`behklmpstں"Mxݻ%P{Ѽ'R} lopsvxz}ľǾɾ޾ ")09SUX[]dkryÀÇÐÓÖØ !$'(+-/1469FSU^cfikĀĂąćĉĞĠģĦĨįĶĽ #&(YZ]_behijmpqŢţŦŨūŮűŲųŶŹź'R}ƨ)TǪ  gilmpqtuvx{~ȀȁȂ *,5:=@BWY\^`uwz}Ɇɍɔɛɢɩɲɵɸɺ-01479;>@CFIJMOQSVX[huwʀʅʈʋʍʢʤʧʩʫ5678;>ABEHJ{|ˁ˄ˇˊˋˌˏ˒˓+V̬́,U^ehknpͷ͹ͼͽ589ADFڹڼڽ .0357LNQTV]dkryۀۉێېے۔ PQTVY\_`adghܙܚܝܟܢܥܨܩܪܭܱܰ+,/147:;?lux{} +8:CHKNPegjln!dghklnopsvy{|}.1258:ADGJMP]`cehknpw}  )4BOPQS`mosy IJKMPSUWYZ\]^acu ),/147:GHJTp} %258;>ADQSVY\_bd ()*,5Wdefhu !,8M[fp~ (+.147:=@B[iv$'*-0369HKNQTWZ]_ 4AHKNQXZ]`bht} Bq~"%(+-39?EJNW`iktvycups-2.3.1/cups/dest-localization.c000664 000765 000024 00000031255 13574721672 017350 0ustar00mikestaff000000 000000 /* * Destination localization support for CUPS. * * Copyright 2012-2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * Local functions... */ static void cups_create_localizations(http_t *http, cups_dinfo_t *dinfo); /* * 'cupsLocalizeDestMedia()' - Get the localized string for a destination media * size. * * The returned string is stored in the destination information and will become * invalid if the destination information is deleted. * * @since CUPS 2.0/macOS 10.10@ */ const char * /* O - Localized string */ cupsLocalizeDestMedia( http_t *http, /* I - Connection to destination */ cups_dest_t *dest, /* I - Destination */ cups_dinfo_t *dinfo, /* I - Destination information */ unsigned flags, /* I - Media flags */ cups_size_t *size) /* I - Media size */ { cups_lang_t *lang; /* Standard localizations */ _cups_message_t key, /* Search key */ *match; /* Matching entry */ pwg_media_t *pwg; /* PWG media information */ cups_array_t *db; /* Media database */ _cups_media_db_t *mdb; /* Media database entry */ char lstr[1024], /* Localized size name */ temp[256]; /* Temporary string */ const char *lsize, /* Localized media size */ *lsource, /* Localized media source */ *ltype; /* Localized media type */ DEBUG_printf(("cupsLocalizeDestMedia(http=%p, dest=%p, dinfo=%p, flags=%x, size=%p(\"%s\"))", (void *)http, (void *)dest, (void *)dinfo, flags, (void *)size, size ? size->media : "(null)")); /* * Range check input... */ if (!http || !dest || !dinfo || !size) { DEBUG_puts("1cupsLocalizeDestMedia: Returning NULL."); _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); return (NULL); } /* * Find the matching media database entry... */ if (flags & CUPS_MEDIA_FLAGS_READY) db = dinfo->ready_db; else db = dinfo->media_db; DEBUG_printf(("1cupsLocalizeDestMedia: size->media=\"%s\"", size->media)); for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->key && !strcmp(mdb->key, size->media)) break; else if (mdb->size_name && !strcmp(mdb->size_name, size->media)) break; } if (!mdb) { for (mdb = (_cups_media_db_t *)cupsArrayFirst(db); mdb; mdb = (_cups_media_db_t *)cupsArrayNext(db)) { if (mdb->width == size->width && mdb->length == size->length && mdb->bottom == size->bottom && mdb->left == size->left && mdb->right == size->right && mdb->top == size->top) break; } } /* * See if the localization is cached... */ lang = cupsLangDefault(); if (!dinfo->localizations) cups_create_localizations(http, dinfo); snprintf(temp, sizeof(temp), "media.%s", size->media); key.msg = temp; if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL) { lsize = match->str; } else { /* * Not a media name, try a media-key name... */ snprintf(temp, sizeof(temp), "media-key.%s", size->media); if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL) lsize = match->str; else lsize = NULL; } if (!lsize && (pwg = pwgMediaForSize(size->width, size->length)) != NULL && pwg->ppd) { /* * Get a standard localization... */ snprintf(temp, sizeof(temp), "media.%s", pwg->pwg); if ((lsize = _cupsLangString(lang, temp)) == temp) lsize = NULL; } if (!lsize) { /* * Make a dimensional localization... */ if ((size->width % 635) == 0 && (size->length % 635) == 0) { /* * Use inches since the size is a multiple of 1/4 inch. */ snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g \"")), size->width / 2540.0, size->length / 2540.0); } else { /* * Use millimeters since the size is not a multiple of 1/4 inch. */ snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%d x %d mm")), (size->width + 50) / 100, (size->length + 50) / 100); } lsize = temp; } if (mdb) { DEBUG_printf(("1cupsLocalizeDestMedia: MATCH mdb%p [key=\"%s\" size_name=\"%s\" source=\"%s\" type=\"%s\" width=%d length=%d B%d L%d R%d T%d]", (void *)mdb, mdb->key, mdb->size_name, mdb->source, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top)); if ((lsource = cupsLocalizeDestValue(http, dest, dinfo, "media-source", mdb->source)) == mdb->source && mdb->source) lsource = _cupsLangString(lang, _("Other Tray")); if ((ltype = cupsLocalizeDestValue(http, dest, dinfo, "media-type", mdb->type)) == mdb->type && mdb->type) ltype = _cupsLangString(lang, _("Other Media")); } else { lsource = NULL; ltype = NULL; } if (!lsource && !ltype) { if (!size->bottom && !size->left && !size->right && !size->top) snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless)")), lsize); else strlcpy(lstr, lsize, sizeof(lstr)); } else if (!lsource) { if (!size->bottom && !size->left && !size->right && !size->top) snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, ltype); else snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s)")), lsize, ltype); } else if (!ltype) { if (!size->bottom && !size->left && !size->right && !size->top) snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, lsource); else snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s)")), lsize, lsource); } else { if (!size->bottom && !size->left && !size->right && !size->top) snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (Borderless, %s, %s)")), lsize, ltype, lsource); else snprintf(lstr, sizeof(lstr), _cupsLangString(lang, _("%s (%s, %s)")), lsize, ltype, lsource); } if ((match = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL) return (NULL); match->msg = strdup(size->media); match->str = strdup(lstr); cupsArrayAdd(dinfo->localizations, match); DEBUG_printf(("1cupsLocalizeDestMedia: Returning \"%s\".", match->str)); return (match->str); } /* * 'cupsLocalizeDestOption()' - Get the localized string for a destination * option. * * The returned string is stored in the destination information and will become * invalid if the destination information is deleted. * * @since CUPS 1.6/macOS 10.8@ */ const char * /* O - Localized string */ cupsLocalizeDestOption( 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 to localize */ { _cups_message_t key, /* Search key */ *match; /* Matching entry */ const char *localized; /* Localized string */ DEBUG_printf(("cupsLocalizeDestOption(http=%p, dest=%p, dinfo=%p, option=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option)); if (!http || !dest || !dinfo) return (option); if (!dinfo->localizations) cups_create_localizations(http, dinfo); key.msg = (char *)option; if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL) return (match->str); else if ((localized = _cupsLangString(cupsLangDefault(), option)) != NULL) return (localized); else return (option); } /* * 'cupsLocalizeDestValue()' - Get the localized string for a destination * option+value pair. * * The returned string is stored in the destination information and will become * invalid if the destination information is deleted. * * @since CUPS 1.6/macOS 10.8@ */ const char * /* O - Localized string */ cupsLocalizeDestValue( 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 to localize */ const char *value) /* I - Value to localize */ { _cups_message_t key, /* Search key */ *match; /* Matching entry */ char pair[256]; /* option.value pair */ const char *localized; /* Localized string */ DEBUG_printf(("cupsLocalizeDestValue(http=%p, dest=%p, dinfo=%p, option=\"%s\", value=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option, value)); if (!http || !dest || !dinfo) return (value); if (!strcmp(option, "media")) { pwg_media_t *media = pwgMediaForPWG(value); cups_size_t size; strlcpy(size.media, value, sizeof(size.media)); size.width = media ? media->width : 0; size.length = media ? media->length : 0; size.left = 0; size.right = 0; size.bottom = 0; size.top = 0; return (cupsLocalizeDestMedia(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size)); } if (!dinfo->localizations) cups_create_localizations(http, dinfo); snprintf(pair, sizeof(pair), "%s.%s", option, value); key.msg = pair; if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL) return (match->str); else if ((localized = _cupsLangString(cupsLangDefault(), pair)) != NULL && strcmp(localized, pair)) return (localized); else return (value); } /* * 'cups_create_localizations()' - Create the localizations array for a * destination. */ static void cups_create_localizations( http_t *http, /* I - Connection to destination */ cups_dinfo_t *dinfo) /* I - Destination informations */ { http_t *http2; /* Connection for strings file */ http_status_t status; /* Request status */ ipp_attribute_t *attr; /* "printer-strings-uri" attribute */ char scheme[32], /* URI scheme */ userpass[256], /* Username/password info */ hostname[256], /* Hostname */ resource[1024], /* Resource */ http_hostname[256], /* Hostname of connection */ tempfile[1024]; /* Temporary filename */ int port; /* Port number */ http_encryption_t encryption; /* Encryption to use */ cups_file_t *temp; /* Temporary file */ /* * See if there are any localizations... */ if ((attr = ippFindAttribute(dinfo->attrs, "printer-strings-uri", IPP_TAG_URI)) == NULL) { /* * Nope, create an empty message catalog... */ dinfo->localizations = _cupsMessageNew(NULL); DEBUG_puts("4cups_create_localizations: No printer-strings-uri (uri) value."); return; } /* * Pull apart the URI and determine whether we need to try a different * server... */ if (httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { dinfo->localizations = _cupsMessageNew(NULL); DEBUG_printf(("4cups_create_localizations: Bad printer-strings-uri value \"%s\".", attr->values[0].string.text)); return; } httpGetHostname(http, http_hostname, sizeof(http_hostname)); if (!_cups_strcasecmp(http_hostname, hostname) && port == httpAddrPort(http->hostaddr)) { /* * Use the same connection... */ http2 = http; } else { /* * Connect to the alternate host... */ if (!strcmp(scheme, "https")) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = HTTP_ENCRYPTION_IF_REQUESTED; if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)) == NULL) { DEBUG_printf(("4cups_create_localizations: Unable to connect to " "%s:%d: %s", hostname, port, cupsLastErrorString())); return; } } /* * Get a temporary file... */ if ((temp = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL) { DEBUG_printf(("4cups_create_localizations: Unable to create temporary " "file: %s", cupsLastErrorString())); if (http2 != http) httpClose(http2); return; } status = cupsGetFd(http2, resource, cupsFileNumber(temp)); cupsFileClose(temp); DEBUG_printf(("4cups_create_localizations: GET %s = %s", resource, httpStatus(status))); if (status == HTTP_STATUS_OK) { /* * Got the file, read it... */ dinfo->localizations = _cupsMessageLoad(tempfile, _CUPS_MESSAGE_STRINGS); } DEBUG_printf(("4cups_create_localizations: %d messages loaded.", cupsArrayCount(dinfo->localizations))); /* * Cleanup... */ unlink(tempfile); if (http2 != http) httpClose(http2); } cups-2.3.1/cups/globals.c000664 000765 000024 00000021700 13574721672 015340 0ustar00mikestaff000000 000000 /* * Global variable access routines for CUPS. * * 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. */ /* * Include necessary headers... */ #include "cups-private.h" #ifndef _WIN32 # include #endif /* !_WIN32 */ /* * Local globals... */ #ifdef DEBUG static int cups_global_index = 0; /* Next thread number */ #endif /* DEBUG */ static _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER; /* Thread local storage key */ #ifdef HAVE_PTHREAD_H static pthread_once_t cups_globals_key_once = PTHREAD_ONCE_INIT; /* One-time initialization object */ #endif /* HAVE_PTHREAD_H */ #if defined(HAVE_PTHREAD_H) || defined(_WIN32) static _cups_mutex_t cups_global_mutex = _CUPS_MUTEX_INITIALIZER; /* Global critical section */ #endif /* HAVE_PTHREAD_H || _WIN32 */ /* * Local functions... */ #ifdef _WIN32 static void cups_fix_path(char *path); #endif /* _WIN32 */ static _cups_globals_t *cups_globals_alloc(void); #if defined(HAVE_PTHREAD_H) || defined(_WIN32) static void cups_globals_free(_cups_globals_t *g); #endif /* HAVE_PTHREAD_H || _WIN32 */ #ifdef HAVE_PTHREAD_H static void cups_globals_init(void); #endif /* HAVE_PTHREAD_H */ /* * '_cupsGlobalLock()' - Lock the global mutex. */ void _cupsGlobalLock(void) { #ifdef HAVE_PTHREAD_H pthread_mutex_lock(&cups_global_mutex); #elif defined(_WIN32) EnterCriticalSection(&cups_global_mutex.m_criticalSection); #endif /* HAVE_PTHREAD_H */ } /* * '_cupsGlobals()' - Return a pointer to thread local storage */ _cups_globals_t * /* O - Pointer to global data */ _cupsGlobals(void) { _cups_globals_t *cg; /* Pointer to global data */ #ifdef HAVE_PTHREAD_H /* * Initialize the global data exactly once... */ pthread_once(&cups_globals_key_once, cups_globals_init); #endif /* HAVE_PTHREAD_H */ /* * See if we have allocated the data yet... */ if ((cg = (_cups_globals_t *)_cupsThreadGetData(cups_globals_key)) == NULL) { /* * No, allocate memory as set the pointer for the key... */ if ((cg = cups_globals_alloc()) != NULL) _cupsThreadSetData(cups_globals_key, cg); } /* * Return the pointer to the data... */ return (cg); } /* * '_cupsGlobalUnlock()' - Unlock the global mutex. */ void _cupsGlobalUnlock(void) { #ifdef HAVE_PTHREAD_H pthread_mutex_unlock(&cups_global_mutex); #elif defined(_WIN32) LeaveCriticalSection(&cups_global_mutex.m_criticalSection); #endif /* HAVE_PTHREAD_H */ } #ifdef _WIN32 /* * 'DllMain()' - Main entry for library. */ BOOL WINAPI /* O - Success/failure */ DllMain(HINSTANCE hinst, /* I - DLL module handle */ DWORD reason, /* I - Reason */ LPVOID reserved) /* I - Unused */ { _cups_globals_t *cg; /* Global data */ (void)hinst; (void)reserved; switch (reason) { case DLL_PROCESS_ATTACH : /* Called on library initialization */ InitializeCriticalSection(&cups_global_mutex.m_criticalSection); if ((cups_globals_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) return (FALSE); break; case DLL_THREAD_DETACH : /* Called when a thread terminates */ if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) cups_globals_free(cg); break; case DLL_PROCESS_DETACH : /* Called when library is unloaded */ if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) cups_globals_free(cg); TlsFree(cups_globals_key); DeleteCriticalSection(&cups_global_mutex.m_criticalSection); break; default: break; } return (TRUE); } #endif /* _WIN32 */ /* * 'cups_globals_alloc()' - Allocate and initialize global data. */ static _cups_globals_t * /* O - Pointer to global data */ cups_globals_alloc(void) { _cups_globals_t *cg = malloc(sizeof(_cups_globals_t)); /* Pointer to global data */ #ifdef _WIN32 HKEY key; /* Registry key */ DWORD size; /* Size of string */ static char installdir[1024] = "", /* Install directory */ confdir[1024] = "", /* Server root directory */ localedir[1024] = ""; /* Locale directory */ #endif /* _WIN32 */ if (!cg) return (NULL); /* * Clear the global storage and set the default encryption and password * callback values... */ memset(cg, 0, sizeof(_cups_globals_t)); cg->encryption = (http_encryption_t)-1; cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; cg->trust_first = -1; cg->any_root = -1; cg->expired_certs = -1; cg->validate_certs = -1; #ifdef DEBUG /* * Friendly thread ID for debugging... */ cg->thread_id = ++ cups_global_index; #endif /* DEBUG */ /* * Then set directories as appropriate... */ #ifdef _WIN32 if (!installdir[0]) { /* * Open the registry... */ strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir)); if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ, &key)) { /* * Grab the installation directory... */ char *ptr; /* Pointer into installdir */ size = sizeof(installdir); RegQueryValueExA(key, "installdir", NULL, NULL, installdir, &size); RegCloseKey(key); for (ptr = installdir; *ptr;) { if (*ptr == '\\') { if (ptr[1]) *ptr++ = '/'; else *ptr = '\0'; /* Strip trailing \ */ } else if (*ptr == '/' && !ptr[1]) *ptr = '\0'; /* Strip trailing / */ else ptr ++; } } snprintf(confdir, sizeof(confdir), "%s/conf", installdir); snprintf(localedir, sizeof(localedir), "%s/locale", installdir); } if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) cg->cups_datadir = installdir; if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) cg->cups_serverbin = installdir; if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) cg->cups_serverroot = confdir; if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) cg->cups_statedir = confdir; if ((cg->localedir = getenv("LOCALEDIR")) == NULL) cg->localedir = localedir; cg->home = getenv("HOME"); #else # ifdef HAVE_GETEUID if ((geteuid() != getuid() && getuid()) || getegid() != getgid()) # else if (!getuid()) # endif /* HAVE_GETEUID */ { /* * When running setuid/setgid, don't allow environment variables to override * the directories... */ cg->cups_datadir = CUPS_DATADIR; cg->cups_serverbin = CUPS_SERVERBIN; cg->cups_serverroot = CUPS_SERVERROOT; cg->cups_statedir = CUPS_STATEDIR; cg->localedir = CUPS_LOCALEDIR; } else { /* * Allow directories to be overridden by environment variables. */ if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) cg->cups_datadir = CUPS_DATADIR; if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) cg->cups_serverbin = CUPS_SERVERBIN; if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) cg->cups_serverroot = CUPS_SERVERROOT; if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) cg->cups_statedir = CUPS_STATEDIR; if ((cg->localedir = getenv("LOCALEDIR")) == NULL) cg->localedir = CUPS_LOCALEDIR; cg->home = getenv("HOME"); # ifdef __APPLE__ /* Sandboxing now exposes the container as the home directory */ if (cg->home && strstr(cg->home, "/Library/Containers/")) cg->home = NULL; # endif /* !__APPLE__ */ } if (!cg->home) { struct passwd *pw; /* User info */ if ((pw = getpwuid(getuid())) != NULL) cg->home = _cupsStrAlloc(pw->pw_dir); } #endif /* _WIN32 */ return (cg); } /* * 'cups_globals_free()' - Free global data. */ #if defined(HAVE_PTHREAD_H) || defined(_WIN32) static void cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */ { _cups_buffer_t *buffer, /* Current read/write buffer */ *next; /* Next buffer */ if (cg->last_status_message) _cupsStrFree(cg->last_status_message); for (buffer = cg->cups_buffers; buffer; buffer = next) { next = buffer->next; free(buffer); } cupsArrayDelete(cg->leg_size_lut); cupsArrayDelete(cg->ppd_size_lut); cupsArrayDelete(cg->pwg_size_lut); httpClose(cg->http); #ifdef HAVE_SSL _httpFreeCredentials(cg->tls_credentials); #endif /* HAVE_SSL */ cupsFileClose(cg->stdio_files[0]); cupsFileClose(cg->stdio_files[1]); cupsFileClose(cg->stdio_files[2]); cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings); if (cg->raster_error.start) free(cg->raster_error.start); free(cg); } #endif /* HAVE_PTHREAD_H || _WIN32 */ #ifdef HAVE_PTHREAD_H /* * 'cups_globals_init()' - Initialize environment variables. */ static void cups_globals_init(void) { /* * Register the global data for this thread... */ pthread_key_create(&cups_globals_key, (void (*)(void *))cups_globals_free); } #endif /* HAVE_PTHREAD_H */ cups-2.3.1/cups/dir.h000664 000765 000024 00000002206 13574721672 014500 0ustar00mikestaff000000 000000 /* * Public directory definitions for CUPS. * * This set of APIs abstracts enumeration of directory entries. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_DIR_H_ # define _CUPS_DIR_H_ /* * Include necessary headers... */ # include "versioning.h" # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Data types... */ typedef struct _cups_dir_s cups_dir_t; /**** Directory type ****/ typedef struct cups_dentry_s /**** Directory entry type ****/ { char filename[260]; /* File name */ struct stat fileinfo; /* File information */ } cups_dentry_t; /* * Prototypes... */ extern void cupsDirClose(cups_dir_t *dp) _CUPS_API_1_2; extern cups_dir_t *cupsDirOpen(const char *directory) _CUPS_API_1_2; extern cups_dentry_t *cupsDirRead(cups_dir_t *dp) _CUPS_API_1_2; extern void cupsDirRewind(cups_dir_t *dp) _CUPS_API_1_2; # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_DIR_H_ */ cups-2.3.1/cups/tempfile.c000664 000765 000024 00000011316 13574721672 015524 0ustar00mikestaff000000 000000 /* * Temp file utilities for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" #include #include #include #if defined(_WIN32) || defined(__EMX__) # include #else # include #endif /* _WIN32 || __EMX__ */ /* * 'cupsTempFd()' - Creates a temporary file. * * The temporary filename is returned in the filename buffer. * The temporary file is opened for reading and writing. */ int /* O - New file descriptor or -1 on error */ cupsTempFd(char *filename, /* I - Pointer to buffer */ int len) /* I - Size of buffer */ { int fd; /* File descriptor for temp file */ int tries; /* Number of tries */ const char *tmpdir; /* TMPDIR environment var */ #if defined(__APPLE__) || defined(_WIN32) char tmppath[1024]; /* Temporary directory */ #endif /* __APPLE__ || _WIN32 */ #ifdef _WIN32 DWORD curtime; /* Current time */ #else struct timeval curtime; /* Current time */ #endif /* _WIN32 */ /* * See if TMPDIR is defined... */ #ifdef _WIN32 if ((tmpdir = getenv("TEMP")) == NULL) { GetTempPathA(sizeof(tmppath), tmppath); tmpdir = tmppath; } #elif defined(__APPLE__) /* * On macOS and iOS, the TMPDIR environment variable is not always the best * location to place temporary files due to sandboxing. Instead, the confstr * function should be called to get the proper per-user, per-process TMPDIR * value. */ if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK)) tmpdir = NULL; if (!tmpdir) { if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath))) tmpdir = tmppath; else tmpdir = "/private/tmp"; /* This should never happen */ } #else /* * Previously we put root temporary files in the default CUPS temporary * directory under /var/spool/cups. However, since the scheduler cleans * out temporary files there and runs independently of the user apps, we * don't want to use it unless specifically told to by cupsd. */ if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = "/tmp"; #endif /* _WIN32 */ /* * Make the temporary name using the specified directory... */ tries = 0; do { #ifdef _WIN32 /* * Get the current time of day... */ curtime = GetTickCount() + tries; /* * Format a string using the hex time values... */ snprintf(filename, (size_t)len - 1, "%s/%05lx%08lx", tmpdir, GetCurrentProcessId(), curtime); #else /* * Get the current time of day... */ gettimeofday(&curtime, NULL); /* * Format a string using the hex time values... */ snprintf(filename, (size_t)len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), (unsigned)(curtime.tv_sec + curtime.tv_usec + tries)); #endif /* _WIN32 */ /* * Open the file in "exclusive" mode, making sure that we don't * stomp on an existing file or someone's symlink crack... */ #ifdef _WIN32 fd = open(filename, _O_CREAT | _O_RDWR | _O_TRUNC | _O_BINARY, _S_IREAD | _S_IWRITE); #elif defined(O_NOFOLLOW) fd = open(filename, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); #else fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600); #endif /* _WIN32 */ if (fd < 0 && errno != EEXIST) break; tries ++; } while (fd < 0 && tries < 1000); /* * Return the file descriptor... */ return (fd); } /* * 'cupsTempFile()' - Generates a temporary filename. * * The temporary filename is returned in the filename buffer. * This function is deprecated and will no longer generate a temporary * filename - use @link cupsTempFd@ or @link cupsTempFile2@ instead. * * @deprecated@ */ char * /* O - Filename or @code NULL@ on error */ cupsTempFile(char *filename, /* I - Pointer to buffer */ int len) /* I - Size of buffer */ { (void)len; if (filename) *filename = '\0'; return (NULL); } /* * 'cupsTempFile2()' - Creates a temporary CUPS file. * * The temporary filename is returned in the filename buffer. * The temporary file is opened for writing. * * @since CUPS 1.2/macOS 10.5@ */ cups_file_t * /* O - CUPS file or @code NULL@ on error */ cupsTempFile2(char *filename, /* I - Pointer to buffer */ int len) /* I - Size of buffer */ { cups_file_t *file; /* CUPS file */ int fd; /* File descriptor */ if ((fd = cupsTempFd(filename, len)) < 0) return (NULL); else if ((file = cupsFileOpenFd(fd, "w")) == NULL) { close(fd); unlink(filename); return (NULL); } else return (file); } cups-2.3.1/cups/testadmin.c000664 000765 000024 00000004150 13574721672 015705 0ustar00mikestaff000000 000000 /* * Admin function test program for CUPS. * * Copyright 2007-2013 by Apple Inc. * Copyright 2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "adminutil.h" #include "string-private.h" /* * Local functions... */ static void show_settings(int num_settings, cups_option_t *settings); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i, /* Looping var */ num_settings; /* Number of settings */ cups_option_t *settings; /* Settings */ http_t *http; /* Connection to server */ /* * Connect to the server using the defaults... */ http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL); /* * Set the current configuration if we have anything on the command-line... */ if (argc > 1) { for (i = 1, num_settings = 0, settings = NULL; i < argc; i ++) num_settings = cupsParseOptions(argv[i], num_settings, &settings); if (cupsAdminSetServerSettings(http, num_settings, settings)) { puts("New server settings:"); cupsFreeOptions(num_settings, settings); } else { printf("Server settings not changed: %s\n", cupsLastErrorString()); return (1); } } else puts("Current server settings:"); /* * Get the current configuration... */ if (cupsAdminGetServerSettings(http, &num_settings, &settings)) { show_settings(num_settings, settings); cupsFreeOptions(num_settings, settings); return (0); } else { printf(" %s\n", cupsLastErrorString()); return (1); } } /* * 'show_settings()' - Show settings in the array... */ static void show_settings( int num_settings, /* I - Number of settings */ cups_option_t *settings) /* I - Settings */ { while (num_settings > 0) { printf(" %s=%s\n", settings->name, settings->value); settings ++; num_settings --; } } cups-2.3.1/cups/options.c000664 000765 000024 00000037170 13574721672 015420 0ustar00mikestaff000000 000000 /* * Option routines for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * Local functions... */ static int cups_compare_options(cups_option_t *a, cups_option_t *b); static int cups_find_option(const char *name, int num_options, cups_option_t *option, int prev, int *rdiff); /* * 'cupsAddIntegerOption()' - Add an integer option to an option array. * * New option arrays can be initialized simply by passing 0 for the * "num_options" parameter. * * @since CUPS 2.2.4/macOS 10.13@ */ int /* O - Number of options */ cupsAddIntegerOption( const char *name, /* I - Name of option */ int value, /* I - Value of option */ int num_options, /* I - Number of options */ cups_option_t **options) /* IO - Pointer to options */ { char strvalue[32]; /* String value */ snprintf(strvalue, sizeof(strvalue), "%d", value); return (cupsAddOption(name, strvalue, num_options, options)); } /* * 'cupsAddOption()' - Add an option to an option array. * * New option arrays can be initialized simply by passing 0 for the * "num_options" parameter. */ int /* O - Number of options */ cupsAddOption(const char *name, /* I - Name of option */ const char *value, /* I - Value of option */ int num_options,/* I - Number of options */ cups_option_t **options) /* IO - Pointer to options */ { cups_option_t *temp; /* Pointer to new option */ int insert, /* Insertion point */ diff; /* Result of search */ DEBUG_printf(("2cupsAddOption(name=\"%s\", value=\"%s\", num_options=%d, options=%p)", name, value, num_options, (void *)options)); if (!name || !name[0] || !value || !options || num_options < 0) { DEBUG_printf(("3cupsAddOption: Returning %d", num_options)); return (num_options); } if (!_cups_strcasecmp(name, "cupsPrintQuality")) num_options = cupsRemoveOption("print-quality", num_options, options); else if (!_cups_strcasecmp(name, "print-quality")) num_options = cupsRemoveOption("cupsPrintQuality", num_options, options); /* * Look for an existing option with the same name... */ if (num_options == 0) { insert = 0; diff = 1; } else { insert = cups_find_option(name, num_options, *options, num_options - 1, &diff); if (diff > 0) insert ++; } if (diff) { /* * No matching option name... */ DEBUG_printf(("4cupsAddOption: New option inserted at index %d...", insert)); if (num_options == 0) temp = (cups_option_t *)malloc(sizeof(cups_option_t)); else temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) * (size_t)(num_options + 1)); if (!temp) { DEBUG_puts("3cupsAddOption: Unable to expand option array, returning 0"); return (0); } *options = temp; if (insert < num_options) { DEBUG_printf(("4cupsAddOption: Shifting %d options...", (int)(num_options - insert))); memmove(temp + insert + 1, temp + insert, (size_t)(num_options - insert) * sizeof(cups_option_t)); } temp += insert; temp->name = _cupsStrAlloc(name); num_options ++; } else { /* * Match found; free the old value... */ DEBUG_printf(("4cupsAddOption: Option already exists at index %d...", insert)); temp = *options + insert; _cupsStrFree(temp->value); } temp->value = _cupsStrAlloc(value); DEBUG_printf(("3cupsAddOption: Returning %d", num_options)); return (num_options); } /* * 'cupsFreeOptions()' - Free all memory used by options. */ void cupsFreeOptions( int num_options, /* I - Number of options */ cups_option_t *options) /* I - Pointer to options */ { int i; /* Looping var */ DEBUG_printf(("cupsFreeOptions(num_options=%d, options=%p)", num_options, (void *)options)); if (num_options <= 0 || !options) return; for (i = 0; i < num_options; i ++) { _cupsStrFree(options[i].name); _cupsStrFree(options[i].value); } free(options); } /* * 'cupsGetIntegerOption()' - Get an integer option value. * * INT_MIN is returned when the option does not exist, is not an integer, or * exceeds the range of values for the "int" type. * * @since CUPS 2.2.4/macOS 10.13@ */ int /* O - Option value or @code INT_MIN@ */ cupsGetIntegerOption( const char *name, /* I - Name of option */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { const char *value = cupsGetOption(name, num_options, options); /* String value of option */ char *ptr; /* Pointer into string value */ long intvalue; /* Integer value */ if (!value || !*value) return (INT_MIN); intvalue = strtol(value, &ptr, 10); if (intvalue < INT_MIN || intvalue > INT_MAX || *ptr) return (INT_MIN); return ((int)intvalue); } /* * 'cupsGetOption()' - Get an option value. */ const char * /* O - Option value or @code NULL@ */ cupsGetOption(const char *name, /* I - Name of option */ int num_options,/* I - Number of options */ cups_option_t *options) /* I - Options */ { int diff, /* Result of comparison */ match; /* Matching index */ DEBUG_printf(("2cupsGetOption(name=\"%s\", num_options=%d, options=%p)", name, num_options, (void *)options)); if (!name || num_options <= 0 || !options) { DEBUG_puts("3cupsGetOption: Returning NULL"); return (NULL); } match = cups_find_option(name, num_options, options, -1, &diff); if (!diff) { DEBUG_printf(("3cupsGetOption: Returning \"%s\"", options[match].value)); return (options[match].value); } DEBUG_puts("3cupsGetOption: Returning NULL"); return (NULL); } /* * 'cupsParseOptions()' - Parse options from a command-line argument. * * This function converts space-delimited name/value pairs according * to the PAPI text option ABNF specification. Collection values * ("name={a=... b=... c=...}") are stored with the curley brackets * intact - use @code cupsParseOptions@ on the value to extract the * collection attributes. */ int /* O - Number of options found */ cupsParseOptions( const char *arg, /* I - Argument to parse */ int num_options, /* I - Number of options */ cups_option_t **options) /* O - Options found */ { char *copyarg, /* Copy of input string */ *ptr, /* Pointer into string */ *name, /* Pointer to name */ *value, /* Pointer to value */ sep, /* Separator character */ quote; /* Quote character */ DEBUG_printf(("cupsParseOptions(arg=\"%s\", num_options=%d, options=%p)", arg, num_options, (void *)options)); /* * Range check input... */ if (!arg) { DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); return (num_options); } if (!options || num_options < 0) { DEBUG_puts("1cupsParseOptions: Returning 0"); return (0); } /* * Make a copy of the argument string and then divide it up... */ if ((copyarg = strdup(arg)) == NULL) { DEBUG_puts("1cupsParseOptions: Unable to copy arg string"); DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); return (num_options); } if (*copyarg == '{') { /* * Remove surrounding {} so we can parse "{name=value ... name=value}"... */ if ((ptr = copyarg + strlen(copyarg) - 1) > copyarg && *ptr == '}') { *ptr = '\0'; ptr = copyarg + 1; } else ptr = copyarg; } else ptr = copyarg; /* * Skip leading spaces... */ while (_cups_isspace(*ptr)) ptr ++; /* * Loop through the string... */ while (*ptr != '\0') { /* * Get the name up to a SPACE, =, or end-of-string... */ name = ptr; while (!strchr("\f\n\r\t\v =", *ptr) && *ptr) ptr ++; /* * Avoid an empty name... */ if (ptr == name) break; /* * Skip trailing spaces... */ while (_cups_isspace(*ptr)) *ptr++ = '\0'; if ((sep = *ptr) == '=') *ptr++ = '\0'; DEBUG_printf(("2cupsParseOptions: name=\"%s\"", name)); if (sep != '=') { /* * Boolean option... */ if (!_cups_strncasecmp(name, "no", 2)) num_options = cupsAddOption(name + 2, "false", num_options, options); else num_options = cupsAddOption(name, "true", num_options, options); continue; } /* * Remove = and parse the value... */ value = ptr; while (*ptr && !_cups_isspace(*ptr)) { if (*ptr == ',') ptr ++; else if (*ptr == '\'' || *ptr == '\"') { /* * Quoted string constant... */ quote = *ptr; _cups_strcpy(ptr, ptr + 1); while (*ptr != quote && *ptr) { if (*ptr == '\\' && ptr[1]) _cups_strcpy(ptr, ptr + 1); ptr ++; } if (*ptr) _cups_strcpy(ptr, ptr + 1); } else if (*ptr == '{') { /* * Collection value... */ int depth; for (depth = 0; *ptr; ptr ++) { if (*ptr == '{') depth ++; else if (*ptr == '}') { depth --; if (!depth) { ptr ++; break; } } else if (*ptr == '\\' && ptr[1]) _cups_strcpy(ptr, ptr + 1); } } else { /* * Normal space-delimited string... */ while (*ptr && !_cups_isspace(*ptr)) { if (*ptr == '\\' && ptr[1]) _cups_strcpy(ptr, ptr + 1); ptr ++; } } } if (*ptr != '\0') *ptr++ = '\0'; DEBUG_printf(("2cupsParseOptions: value=\"%s\"", value)); /* * Skip trailing whitespace... */ while (_cups_isspace(*ptr)) ptr ++; /* * Add the string value... */ num_options = cupsAddOption(name, value, num_options, options); } /* * Free the copy of the argument we made and return the number of options * found. */ free(copyarg); DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); return (num_options); } /* * 'cupsRemoveOption()' - Remove an option from an option array. * * @since CUPS 1.2/macOS 10.5@ */ int /* O - New number of options */ cupsRemoveOption( const char *name, /* I - Option name */ int num_options, /* I - Current number of options */ cups_option_t **options) /* IO - Options */ { int i; /* Looping var */ cups_option_t *option; /* Current option */ DEBUG_printf(("2cupsRemoveOption(name=\"%s\", num_options=%d, options=%p)", name, num_options, (void *)options)); /* * Range check input... */ if (!name || num_options < 1 || !options) { DEBUG_printf(("3cupsRemoveOption: Returning %d", num_options)); return (num_options); } /* * Loop for the option... */ for (i = num_options, option = *options; i > 0; i --, option ++) if (!_cups_strcasecmp(name, option->name)) break; if (i) { /* * Remove this option from the array... */ DEBUG_puts("4cupsRemoveOption: Found option, removing it..."); num_options --; i --; _cupsStrFree(option->name); _cupsStrFree(option->value); if (i > 0) memmove(option, option + 1, (size_t)i * sizeof(cups_option_t)); } /* * Return the new number of options... */ DEBUG_printf(("3cupsRemoveOption: Returning %d", num_options)); return (num_options); } /* * '_cupsGet1284Values()' - Get 1284 device ID keys and values. * * The returned dictionary is a CUPS option array that can be queried with * cupsGetOption and freed with cupsFreeOptions. */ int /* O - Number of key/value pairs */ _cupsGet1284Values( const char *device_id, /* I - IEEE-1284 device ID string */ cups_option_t **values) /* O - Array of key/value pairs */ { int num_values; /* Number of values */ char key[256], /* Key string */ value[256], /* Value string */ *ptr; /* Pointer into key/value */ /* * Range check input... */ if (values) *values = NULL; if (!device_id || !values) return (0); /* * Parse the 1284 device ID value into keys and values. The format is * repeating sequences of: * * [whitespace]key:value[whitespace]; */ num_values = 0; while (*device_id) { while (_cups_isspace(*device_id)) device_id ++; if (!*device_id) break; for (ptr = key; *device_id && *device_id != ':'; device_id ++) if (ptr < (key + sizeof(key) - 1)) *ptr++ = *device_id; if (!*device_id) break; while (ptr > key && _cups_isspace(ptr[-1])) ptr --; *ptr = '\0'; device_id ++; while (_cups_isspace(*device_id)) device_id ++; if (!*device_id) break; for (ptr = value; *device_id && *device_id != ';'; device_id ++) if (ptr < (value + sizeof(value) - 1)) *ptr++ = *device_id; if (!*device_id) break; while (ptr > value && _cups_isspace(ptr[-1])) ptr --; *ptr = '\0'; device_id ++; num_values = cupsAddOption(key, value, num_values, values); } return (num_values); } /* * 'cups_compare_options()' - Compare two options. */ static int /* O - Result of comparison */ cups_compare_options(cups_option_t *a, /* I - First option */ cups_option_t *b) /* I - Second option */ { return (_cups_strcasecmp(a->name, b->name)); } /* * 'cups_find_option()' - Find an option using a binary search. */ static int /* O - Index of match */ cups_find_option( const char *name, /* I - Option name */ int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ int prev, /* I - Previous index */ int *rdiff) /* O - Difference of match */ { int left, /* Low mark for binary search */ right, /* High mark for binary search */ current, /* Current index */ diff; /* Result of comparison */ cups_option_t key; /* Search key */ DEBUG_printf(("7cups_find_option(name=\"%s\", num_options=%d, options=%p, prev=%d, rdiff=%p)", name, num_options, (void *)options, prev, (void *)rdiff)); #ifdef DEBUG for (left = 0; left < num_options; left ++) DEBUG_printf(("9cups_find_option: options[%d].name=\"%s\", .value=\"%s\"", left, options[left].name, options[left].value)); #endif /* DEBUG */ key.name = (char *)name; if (prev >= 0) { /* * Start search on either side of previous... */ if ((diff = cups_compare_options(&key, options + prev)) == 0 || (diff < 0 && prev == 0) || (diff > 0 && prev == (num_options - 1))) { *rdiff = diff; return (prev); } else if (diff < 0) { /* * Start with previous on right side... */ left = 0; right = prev; } else { /* * Start wih previous on left side... */ left = prev; right = num_options - 1; } } else { /* * Start search in the middle... */ left = 0; right = num_options - 1; } do { current = (left + right) / 2; diff = cups_compare_options(&key, options + current); if (diff == 0) break; else if (diff < 0) right = current; else left = current; } while ((right - left) > 1); if (diff != 0) { /* * Check the last 1 or 2 elements... */ if ((diff = cups_compare_options(&key, options + left)) <= 0) current = left; else { diff = cups_compare_options(&key, options + right); current = right; } } /* * Return the closest destination and the difference... */ *rdiff = diff; return (current); } cups-2.3.1/cups/testsnmp.c000664 000765 000024 00000014223 13574721672 015574 0ustar00mikestaff000000 000000 /* * SNMP test program for CUPS. * * Copyright 2008-2014 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "snmp-private.h" /* * Local functions... */ static void print_packet(cups_snmp_t *packet, void *data); static int show_oid(int fd, const char *community, http_addr_t *addr, const char *s, int walk); static void usage(void) _CUPS_NORETURN; /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int fd = -1; /* SNMP socket */ http_addrlist_t *host = NULL; /* Address of host */ int walk = 0; /* Walk OIDs? */ char *oid = NULL; /* Last OID shown */ const char *community; /* Community name */ fputs("_cupsSNMPDefaultCommunity: ", stdout); if ((community = _cupsSNMPDefaultCommunity()) == NULL) { puts("FAIL (NULL community name)"); return (1); } printf("PASS (%s)\n", community); /* * Query OIDs from the command-line... */ for (i = 1; i < argc; i ++) if (!strcmp(argv[i], "-c")) { i ++; if (i >= argc) usage(); else community = argv[i]; } else if (!strcmp(argv[i], "-d")) _cupsSNMPSetDebug(10); else if (!strcmp(argv[i], "-w")) walk = 1; else if (!host) { if ((host = httpAddrGetList(argv[i], AF_UNSPEC, "161")) == NULL) { printf("testsnmp: Unable to find \"%s\"!\n", argv[1]); return (1); } if (fd < 0) { fputs("_cupsSNMPOpen: ", stdout); if ((fd = _cupsSNMPOpen(host->addr.addr.sa_family)) < 0) { printf("FAIL (%s)\n", strerror(errno)); return (1); } puts("PASS"); } } else if (!show_oid(fd, community, &(host->addr), argv[i], walk)) return (1); else oid = argv[i]; if (!host) usage(); if (!oid) { if (!show_oid(fd, community, &(host->addr), walk ? ".1.3.6.1.2.1.43" : ".1.3.6.1.2.1.43.10.2.1.4.1.1", walk)) return (1); } return (0); } /* * 'print_packet()' - Print the contents of the response packet. */ static void print_packet(cups_snmp_t *packet, /* I - SNMP response packet */ void *data) /* I - User data pointer (not used) */ { unsigned i; /* Looping var */ char temp[1024]; /* Temporary OID string */ (void)data; printf("%s = ", _cupsSNMPOIDToString(packet->object_name, temp, sizeof(temp))); switch (packet->object_type) { case CUPS_ASN1_BOOLEAN : printf("BOOLEAN %s\n", packet->object_value.boolean ? "TRUE" : "FALSE"); break; case CUPS_ASN1_INTEGER : printf("INTEGER %d\n", packet->object_value.integer); break; case CUPS_ASN1_BIT_STRING : printf("BIT-STRING \"%s\"\n", (char *)packet->object_value.string.bytes); break; case CUPS_ASN1_OCTET_STRING : printf("OCTET-STRING \"%s\"\n", (char *)packet->object_value.string.bytes); break; case CUPS_ASN1_NULL_VALUE : puts("NULL-VALUE"); break; case CUPS_ASN1_OID : printf("OID %s\n", _cupsSNMPOIDToString(packet->object_value.oid, temp, sizeof(temp))); break; case CUPS_ASN1_HEX_STRING : fputs("Hex-STRING", stdout); for (i = 0; i < packet->object_value.string.num_bytes; i ++) printf(" %02X", packet->object_value.string.bytes[i]); putchar('\n'); break; case CUPS_ASN1_COUNTER : printf("Counter %d\n", packet->object_value.counter); break; case CUPS_ASN1_GAUGE : printf("Gauge %u\n", packet->object_value.gauge); break; case CUPS_ASN1_TIMETICKS : printf("Timeticks %u days, %u:%02u:%02u.%02u\n", packet->object_value.timeticks / 8640000, (packet->object_value.timeticks / 360000) % 24, (packet->object_value.timeticks / 6000) % 60, (packet->object_value.timeticks / 100) % 60, packet->object_value.timeticks % 100); break; default : printf("Unknown-%X\n", packet->object_type); break; } } /* * 'show_oid()' - Show the specified OID. */ static int /* O - 1 on success, 0 on error */ show_oid(int fd, /* I - SNMP socket */ const char *community, /* I - Community name */ http_addr_t *addr, /* I - Address to query */ const char *s, /* I - OID to query */ int walk) /* I - Walk OIDs? */ { int i; /* Looping var */ int oid[CUPS_SNMP_MAX_OID]; /* OID */ cups_snmp_t packet; /* SNMP packet */ char temp[1024]; /* Temporary OID string */ if (!_cupsSNMPStringToOID(s, oid, sizeof(oid) / sizeof(oid[0]))) { puts("testsnmp: Bad OID"); return (0); } if (walk) { printf("_cupsSNMPWalk(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp))); if (_cupsSNMPWalk(fd, addr, CUPS_SNMP_VERSION_1, community, oid, 5.0, print_packet, NULL) < 0) { printf("FAIL (%s)\n", strerror(errno)); return (0); } } else { printf("_cupsSNMPWrite(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp))); if (!_cupsSNMPWrite(fd, addr, CUPS_SNMP_VERSION_1, community, CUPS_ASN1_GET_REQUEST, 1, oid)) { printf("FAIL (%s)\n", strerror(errno)); return (0); } puts("PASS"); fputs("_cupsSNMPRead(5.0): ", stdout); if (!_cupsSNMPRead(fd, &packet, 5.0)) { puts("FAIL (timeout)"); return (0); } if (!_cupsSNMPIsOID(&packet, oid)) { printf("FAIL (bad OID %d", packet.object_name[0]); for (i = 1; packet.object_name[i] >= 0; i ++) printf(".%d", packet.object_name[i]); puts(")"); return (0); } if (packet.error) { printf("FAIL (%s)\n", packet.error); return (0); } puts("PASS"); print_packet(&packet, NULL); } return (1); } /* * 'usage()' - Show program usage and exit. */ static void usage(void) { puts("Usage: testsnmp [options] host-or-ip [oid ...]"); puts(""); puts("Options:"); puts(""); puts(" -c community Set community name"); puts(" -d Enable debugging"); puts(" -w Walk all OIDs under the specified one"); exit (1); } cups-2.3.1/cups/testppd.c000664 000765 000024 00000143317 13574721672 015411 0ustar00mikestaff000000 000000 /* * PPD test program for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #undef _CUPS_NO_DEPRECATED #include "cups-private.h" #include "ppd-private.h" #include "raster-private.h" #include #ifdef _WIN32 # include #else # include # include #endif /* _WIN32 */ #include /* * Local functions... */ static int do_ppd_tests(const char *filename, int num_options, cups_option_t *options); static int do_ps_tests(void); static void print_changes(cups_page_header2_t *header, cups_page_header2_t *expected); /* * Test data... */ static const char *dsc_code = "[{\n" "%%BeginFeature: *PageSize Tabloid\n" "<>setpagedevice\n" "%%EndFeature\n" "} stopped cleartomark\n"; static const char *setpagedevice_code = "<<" "/MediaClass(Media Class)" "/MediaColor((Media Color))" "/MediaType(Media\\\\Type)" "/OutputType<416263>" "/AdvanceDistance 1000" "/AdvanceMedia 1" "/Collate false" "/CutMedia 2" "/Duplex true" "/HWResolution[100 200]" "/InsertSheet true" "/Jog 3" "/LeadingEdge 1" "/ManualFeed true" "/MediaPosition 8#777" "/MediaWeight 16#fe01" "/MirrorPrint true" "/NegativePrint true" "/NumCopies 1" "/Orientation 1" "/OutputFaceUp true" "/PageSize[612 792.1]" "/Separations true" "/TraySwitch true" "/Tumble true" "/cupsMediaType 2" "/cupsColorOrder 1" "/cupsColorSpace 1" "/cupsCompression 1" "/cupsRowCount 1" "/cupsRowFeed 1" "/cupsRowStep 1" "/cupsBorderlessScalingFactor 1.001" "/cupsInteger0 1" "/cupsInteger1 2" "/cupsInteger2 3" "/cupsInteger3 4" "/cupsInteger4 5" "/cupsInteger5 6" "/cupsInteger6 7" "/cupsInteger7 8" "/cupsInteger8 9" "/cupsInteger9 10" "/cupsInteger10 11" "/cupsInteger11 12" "/cupsInteger12 13" "/cupsInteger13 14" "/cupsInteger14 15" "/cupsInteger15 16" "/cupsReal0 1.1" "/cupsReal1 2.1" "/cupsReal2 3.1" "/cupsReal3 4.1" "/cupsReal4 5.1" "/cupsReal5 6.1" "/cupsReal6 7.1" "/cupsReal7 8.1" "/cupsReal8 9.1" "/cupsReal9 10.1" "/cupsReal10 11.1" "/cupsReal11 12.1" "/cupsReal12 13.1" "/cupsReal13 14.1" "/cupsReal14 15.1" "/cupsReal15 16.1" "/cupsString0(1)" "/cupsString1(2)" "/cupsString2(3)" "/cupsString3(4)" "/cupsString4(5)" "/cupsString5(6)" "/cupsString6(7)" "/cupsString7(8)" "/cupsString8(9)" "/cupsString9(10)" "/cupsString10(11)" "/cupsString11(12)" "/cupsString12(13)" "/cupsString13(14)" "/cupsString14(15)" "/cupsString15(16)" "/cupsMarkerType(Marker Type)" "/cupsRenderingIntent(Rendering Intent)" "/cupsPageSizeName(Letter)" "/cupsPreferredBitsPerColor 17" ">> setpagedevice"; static cups_page_header2_t setpagedevice_header = { "Media Class", /* MediaClass */ "(Media Color)", /* MediaColor */ "Media\\Type", /* MediaType */ "Abc", /* OutputType */ 1000, /* AdvanceDistance */ CUPS_ADVANCE_FILE, /* AdvanceMedia */ CUPS_FALSE, /* Collate */ CUPS_CUT_JOB, /* CutMedia */ CUPS_TRUE, /* Duplex */ { 100, 200 }, /* HWResolution */ { 0, 0, 0, 0 }, /* ImagingBoundingBox */ CUPS_TRUE, /* InsertSheet */ CUPS_JOG_SET, /* Jog */ CUPS_EDGE_RIGHT, /* LeadingEdge */ { 0, 0 }, /* Margins */ CUPS_TRUE, /* ManualFeed */ 0777, /* MediaPosition */ 0xfe01, /* MediaWeight */ CUPS_TRUE, /* MirrorPrint */ CUPS_TRUE, /* NegativePrint */ 1, /* NumCopies */ CUPS_ORIENT_90, /* Orientation */ CUPS_TRUE, /* OutputFaceUp */ { 612, 792 }, /* PageSize */ CUPS_TRUE, /* Separations */ CUPS_TRUE, /* TraySwitch */ CUPS_TRUE, /* Tumble */ 0, /* cupsWidth */ 0, /* cupsHeight */ 2, /* cupsMediaType */ 0, /* cupsBitsPerColor */ 0, /* cupsBitsPerPixel */ 0, /* cupsBytesPerLine */ CUPS_ORDER_BANDED, /* cupsColorOrder */ CUPS_CSPACE_RGB, /* cupsColorSpace */ 1, /* cupsCompression */ 1, /* cupsRowCount */ 1, /* cupsRowFeed */ 1, /* cupsRowStep */ 0, /* cupsNumColors */ 1.001f, /* cupsBorderlessScalingFactor */ { 612.0f, 792.1f }, /* cupsPageSize */ { 0.0f, 0.0f, 0.0f, 0.0f }, /* cupsImagingBBox */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, /* cupsInteger[16] */ { 1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f, 9.1f, 10.1f, 11.1f, 12.1f, 13.1f, 14.1f, 15.1f, 16.1f }, /* cupsReal[16] */ { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16" }, /* cupsString[16] */ "Marker Type", /* cupsMarkerType */ "Rendering Intent", /* cupsRenderingIntent */ "Letter" /* cupsPageSizeName */ }; static const char *default_code = "[{\n" "%%BeginFeature: *InstalledDuplexer False\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *PageRegion Letter\n" "PageRegion=Letter\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *InputSlot Tray\n" "InputSlot=Tray\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *OutputBin Tray1\n" "OutputBin=Tray1\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *MediaType Plain\n" "MediaType=Plain\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *IntOption None\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *StringOption None\n" "%%EndFeature\n" "} stopped cleartomark\n"; static const char *custom_code = "[{\n" "%%BeginFeature: *InstalledDuplexer False\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *InputSlot Tray\n" "InputSlot=Tray\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *MediaType Plain\n" "MediaType=Plain\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *OutputBin Tray1\n" "OutputBin=Tray1\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *IntOption None\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *CustomStringOption True\n" "(value\\0502\\051)\n" "(value 1)\n" "StringOption=Custom\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *CustomPageSize True\n" "400\n" "500\n" "0\n" "0\n" "0\n" "PageSize=Custom\n" "%%EndFeature\n" "} stopped cleartomark\n"; static const char *default2_code = "[{\n" "%%BeginFeature: *InstalledDuplexer False\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *InputSlot Tray\n" "InputSlot=Tray\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *Quality Normal\n" "Quality=Normal\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *IntOption None\n" "%%EndFeature\n" "} stopped cleartomark\n" "[{\n" "%%BeginFeature: *StringOption None\n" "%%EndFeature\n" "} stopped cleartomark\n"; /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ ppd_file_t *ppd = NULL; /* PPD file loaded from disk */ int status; /* Status of tests (0 = success, 1 = fail) */ int conflicts; /* Number of conflicts */ char *s; /* String */ char buffer[8192]; /* String buffer */ const char *text, /* Localized text */ *val; /* Option value */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ ppd_size_t minsize, /* Minimum size */ maxsize, /* Maximum size */ *size; /* Current size */ ppd_attr_t *attr; /* Current attribute */ _ppd_cache_t *pc; /* PPD cache */ status = 0; if (argc == 1) { /* * Setup directories for locale stuff... */ if (access("locale", 0)) { mkdir("locale", 0777); mkdir("locale/fr", 0777); symlink("../../../locale/cups_fr.po", "locale/fr/cups_fr.po"); mkdir("locale/zh_TW", 0777); symlink("../../../locale/cups_zh_TW.po", "locale/zh_TW/cups_zh_TW.po"); } putenv("LOCALEDIR=locale"); putenv("SOFTWARE=CUPS"); /* * Do tests with test.ppd... */ fputs("ppdOpenFile(test.ppd): ", stdout); if ((ppd = _ppdOpenFile("test.ppd", _PPD_LOCALIZATION_ALL)) != NULL) puts("PASS"); else { ppd_status_t err; /* Last error in file */ int line; /* Line number in file */ status ++; err = ppdLastError(&line); printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); } fputs("ppdFindAttr(wildcard): ", stdout); if ((attr = ppdFindAttr(ppd, "cupsTest", NULL)) == NULL) { status ++; puts("FAIL (not found)"); } else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo")) { status ++; printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); } else puts("PASS"); fputs("ppdFindNextAttr(wildcard): ", stdout); if ((attr = ppdFindNextAttr(ppd, "cupsTest", NULL)) == NULL) { status ++; puts("FAIL (not found)"); } else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Bar")) { status ++; printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); } else puts("PASS"); fputs("ppdFindAttr(Foo): ", stdout); if ((attr = ppdFindAttr(ppd, "cupsTest", "Foo")) == NULL) { status ++; puts("FAIL (not found)"); } else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo")) { status ++; printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); } else puts("PASS"); fputs("ppdFindNextAttr(Foo): ", stdout); if ((attr = ppdFindNextAttr(ppd, "cupsTest", "Foo")) != NULL) { status ++; printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); } else puts("PASS"); fputs("ppdMarkDefaults: ", stdout); ppdMarkDefaults(ppd); if ((conflicts = ppdConflicts(ppd)) == 0) puts("PASS"); else { status ++; printf("FAIL (%d conflicts)\n", conflicts); } fputs("ppdEmitString (defaults): ", stdout); if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && !strcmp(s, default_code)) puts("PASS"); else { status ++; printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, (int)strlen(default_code)); if (s) puts(s); } if (s) free(s); fputs("ppdEmitString (custom size and string): ", stdout); ppdMarkOption(ppd, "PageSize", "Custom.400x500"); ppdMarkOption(ppd, "StringOption", "{String1=\"value 1\" String2=value(2)}"); if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && !strcmp(s, custom_code)) puts("PASS"); else { status ++; printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, (int)strlen(custom_code)); if (s) puts(s); } if (s) free(s); /* * Test constraints... */ fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout); ppdMarkOption(ppd, "PageSize", "Letter"); num_options = cupsGetConflicts(ppd, "InputSlot", "Envelope", &options); if (num_options != 2 || (val = cupsGetOption("PageRegion", num_options, options)) == NULL || _cups_strcasecmp(val, "Letter") || (val = cupsGetOption("PageSize", num_options, options)) == NULL || _cups_strcasecmp(val, "Letter")) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); status ++; } else puts("PASS"); fputs("ppdConflicts(): ", stdout); ppdMarkOption(ppd, "InputSlot", "Envelope"); if ((conflicts = ppdConflicts(ppd)) == 2) puts("PASS (2)"); else { printf("FAIL (%d)\n", conflicts); status ++; } fputs("cupsResolveConflicts(InputSlot=Envelope): ", stdout); num_options = 0; options = NULL; if (!cupsResolveConflicts(ppd, "InputSlot", "Envelope", &num_options, &options)) { puts("FAIL (Unable to resolve)"); status ++; } else if (num_options != 2 || !cupsGetOption("PageSize", num_options, options)) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); status ++; } else puts("PASS (Resolved by changing PageSize)"); cupsFreeOptions(num_options, options); fputs("cupsResolveConflicts(No option/choice): ", stdout); num_options = 0; options = NULL; if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) && num_options == 1 && !_cups_strcasecmp(options[0].name, "InputSlot") && !_cups_strcasecmp(options[0].value, "Tray")) puts("PASS (Resolved by changing InputSlot)"); else if (num_options > 0) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); status ++; } else { puts("FAIL (Unable to resolve)"); status ++; } cupsFreeOptions(num_options, options); fputs("ppdInstallableConflict(): ", stdout); if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") && !ppdInstallableConflict(ppd, "Duplex", "None")) puts("PASS"); else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble")) { puts("FAIL (Duplex=DuplexNoTumble did not conflict)"); status ++; } else { puts("FAIL (Duplex=None conflicted)"); status ++; } /* * ppdPageSizeLimits */ fputs("ppdPageSizeLimits: ", stdout); if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) { if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 || fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001) { printf("FAIL (got min=%.3fx%.3f, max=%.3fx%.3f, " "expected min=36x36, max=1080x86400)\n", minsize.width, minsize.length, maxsize.width, maxsize.length); status ++; } else puts("PASS"); } else { puts("FAIL (returned 0)"); status ++; } /* * cupsMarkOptions with PWG and IPP size names. */ fputs("cupsMarkOptions(media=iso-a4): ", stdout); num_options = cupsAddOption("media", "iso-a4", 0, &options); cupsMarkOptions(ppd, num_options, options); cupsFreeOptions(num_options, options); size = ppdPageSize(ppd, NULL); if (!size || strcmp(size->name, "A4")) { printf("FAIL (%s)\n", size ? size->name : "unknown"); status ++; } else puts("PASS"); fputs("cupsMarkOptions(media=na_letter_8.5x11in): ", stdout); num_options = cupsAddOption("media", "na_letter_8.5x11in", 0, &options); cupsMarkOptions(ppd, num_options, options); cupsFreeOptions(num_options, options); size = ppdPageSize(ppd, NULL); if (!size || strcmp(size->name, "Letter")) { printf("FAIL (%s)\n", size ? size->name : "unknown"); status ++; } else puts("PASS"); fputs("cupsMarkOptions(media=oe_letter-fullbleed_8.5x11in): ", stdout); num_options = cupsAddOption("media", "oe_letter-fullbleed_8.5x11in", 0, &options); cupsMarkOptions(ppd, num_options, options); cupsFreeOptions(num_options, options); size = ppdPageSize(ppd, NULL); if (!size || strcmp(size->name, "Letter.Fullbleed")) { printf("FAIL (%s)\n", size ? size->name : "unknown"); status ++; } else puts("PASS"); fputs("cupsMarkOptions(media=A4): ", stdout); num_options = cupsAddOption("media", "A4", 0, &options); cupsMarkOptions(ppd, num_options, options); cupsFreeOptions(num_options, options); size = ppdPageSize(ppd, NULL); if (!size || strcmp(size->name, "A4")) { printf("FAIL (%s)\n", size ? size->name : "unknown"); status ++; } else puts("PASS"); /* * Custom sizes... */ fputs("cupsMarkOptions(media=Custom.8x10in): ", stdout); num_options = cupsAddOption("media", "Custom.8x10in", 0, &options); cupsMarkOptions(ppd, num_options, options); cupsFreeOptions(num_options, options); size = ppdPageSize(ppd, NULL); if (!size || strcmp(size->name, "Custom") || fabs(size->width - 576.0) > 0.001 || fabs(size->length - 720.0) > 0.001) { printf("FAIL (%s - %gx%g)\n", size ? size->name : "unknown", size ? size->width : 0.0, size ? size->length : 0.0); status ++; } else puts("PASS"); /* * Test localization... */ fputs("ppdLocalizeIPPReason(text): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && !strcmp(buffer, "Foo Reason")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer); } fputs("ppdLocalizeIPPReason(http): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) && !strcmp(buffer, "http://foo/bar.html")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer); } fputs("ppdLocalizeIPPReason(help): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) && !strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer); } fputs("ppdLocalizeIPPReason(file): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) && !strcmp(buffer, "/help/foo/bar.html")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer); } putenv("LANG=fr"); putenv("LC_ALL=fr"); putenv("LC_CTYPE=fr"); putenv("LC_MESSAGES=fr"); fputs("ppdLocalizeIPPReason(fr text): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && !strcmp(buffer, "La Long Foo Reason")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer); } putenv("LANG=zh_TW"); putenv("LC_ALL=zh_TW"); putenv("LC_CTYPE=zh_TW"); putenv("LC_MESSAGES=zh_TW"); fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout); if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && !strcmp(buffer, "Number 1 Foo Reason")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer); } /* * cupsMarkerName localization... */ putenv("LANG=en"); putenv("LC_ALL=en"); putenv("LC_CTYPE=en"); putenv("LC_MESSAGES=en"); fputs("ppdLocalizeMarkerName(bogus): ", stdout); if ((text = ppdLocalizeMarkerName(ppd, "bogus")) != NULL) { status ++; printf("FAIL (\"%s\" instead of NULL)\n", text); } else puts("PASS"); fputs("ppdLocalizeMarkerName(cyan): ", stdout); if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && !strcmp(text, "Cyan Toner")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"Cyan Toner\")\n", text ? text : "(null)"); } putenv("LANG=fr"); putenv("LC_ALL=fr"); putenv("LC_CTYPE=fr"); putenv("LC_MESSAGES=fr"); fputs("ppdLocalizeMarkerName(fr cyan): ", stdout); if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && !strcmp(text, "La Toner Cyan")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"La Toner Cyan\")\n", text ? text : "(null)"); } putenv("LANG=zh_TW"); putenv("LC_ALL=zh_TW"); putenv("LC_CTYPE=zh_TW"); putenv("LC_MESSAGES=zh_TW"); fputs("ppdLocalizeMarkerName(zh_TW cyan): ", stdout); if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && !strcmp(text, "Number 1 Cyan Toner")) puts("PASS"); else { status ++; printf("FAIL (\"%s\" instead of \"Number 1 Cyan Toner\")\n", text ? text : "(null)"); } ppdClose(ppd); /* * Test new constraints... */ fputs("ppdOpenFile(test2.ppd): ", stdout); if ((ppd = ppdOpenFile("test2.ppd")) != NULL) puts("PASS"); else { ppd_status_t err; /* Last error in file */ int line; /* Line number in file */ status ++; err = ppdLastError(&line); printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); } fputs("ppdMarkDefaults: ", stdout); ppdMarkDefaults(ppd); if ((conflicts = ppdConflicts(ppd)) == 0) puts("PASS"); else { status ++; printf("FAIL (%d conflicts)\n", conflicts); } fputs("ppdEmitString (defaults): ", stdout); if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && !strcmp(s, default2_code)) puts("PASS"); else { status ++; printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, (int)strlen(default2_code)); if (s) puts(s); } if (s) free(s); fputs("ppdConflicts(): ", stdout); ppdMarkOption(ppd, "PageSize", "Env10"); ppdMarkOption(ppd, "InputSlot", "Envelope"); ppdMarkOption(ppd, "Quality", "Photo"); if ((conflicts = ppdConflicts(ppd)) == 1) puts("PASS (1)"); else { printf("FAIL (%d)\n", conflicts); status ++; } fputs("cupsResolveConflicts(Quality=Photo): ", stdout); num_options = 0; options = NULL; if (cupsResolveConflicts(ppd, "Quality", "Photo", &num_options, &options)) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); status ++; } else puts("PASS (Unable to resolve)"); cupsFreeOptions(num_options, options); fputs("cupsResolveConflicts(No option/choice): ", stdout); num_options = 0; options = NULL; if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) && num_options == 1 && !_cups_strcasecmp(options->name, "Quality") && !_cups_strcasecmp(options->value, "Normal")) puts("PASS"); else if (num_options > 0) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); status ++; } else { puts("FAIL (Unable to resolve!)"); status ++; } cupsFreeOptions(num_options, options); fputs("cupsResolveConflicts(loop test): ", stdout); ppdMarkOption(ppd, "PageSize", "A4"); ppdMarkOption(ppd, "InputSlot", "Tray"); ppdMarkOption(ppd, "Quality", "Photo"); num_options = 0; options = NULL; if (!cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options)) puts("PASS"); else if (num_options > 0) { printf("FAIL (%d options:", num_options); for (i = 0; i < num_options; i ++) printf(" %s=%s", options[i].name, options[i].value); puts(")"); } else puts("FAIL (No conflicts!)"); fputs("ppdInstallableConflict(): ", stdout); if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") && !ppdInstallableConflict(ppd, "Duplex", "None")) puts("PASS"); else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble")) { puts("FAIL (Duplex=DuplexNoTumble did not conflict)"); status ++; } else { puts("FAIL (Duplex=None conflicted)"); status ++; } /* * ppdPageSizeLimits */ ppdMarkDefaults(ppd); fputs("ppdPageSizeLimits(default): ", stdout); if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) { if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 || fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001) { printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " "expected min=36x36, max=1080x86400)\n", minsize.width, minsize.length, maxsize.width, maxsize.length); status ++; } else puts("PASS"); } else { puts("FAIL (returned 0)"); status ++; } ppdMarkOption(ppd, "InputSlot", "Manual"); fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout); if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) { if (fabs(minsize.width - 100.0) > 0.001 || fabs(minsize.length - 100.0) > 0.001 || fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001) { printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " "expected min=100x100, max=1000x1000)\n", minsize.width, minsize.length, maxsize.width, maxsize.length); status ++; } else puts("PASS"); } else { puts("FAIL (returned 0)"); status ++; } ppdMarkOption(ppd, "Quality", "Photo"); fputs("ppdPageSizeLimits(Quality=Photo): ", stdout); if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) { if (fabs(minsize.width - 200.0) > 0.001 || fabs(minsize.length - 200.0) > 0.001 || fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001) { printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " "expected min=200x200, max=1000x1000)\n", minsize.width, minsize.length, maxsize.width, maxsize.length); status ++; } else puts("PASS"); } else { puts("FAIL (returned 0)"); status ++; } ppdMarkOption(ppd, "InputSlot", "Tray"); fputs("ppdPageSizeLimits(Quality=Photo): ", stdout); if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) { if (fabs(minsize.width - 300.0) > 0.001 || fabs(minsize.length - 300.0) > 0.001 || fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001) { printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " "expected min=300x300, max=1080x86400)\n", minsize.width, minsize.length, maxsize.width, maxsize.length); status ++; } else puts("PASS"); } else { puts("FAIL (returned 0)"); status ++; } status += do_ps_tests(); } else if (!strcmp(argv[1], "--raster")) { for (status = 0, num_options = 0, options = NULL, i = 1; i < argc; i ++) { if (argv[i][0] == '-') { if (argv[i][1] == 'o') { if (argv[i][2]) num_options = cupsParseOptions(argv[i] + 2, num_options, &options); else { i ++; if (i < argc) num_options = cupsParseOptions(argv[i], num_options, &options); else { puts("Usage: testppd --raster [-o name=value ...] [filename.ppd ...]"); return (1); } } } else { puts("Usage: testppd --raster [-o name=value ...] [filename.ppd ...]"); return (1); } } else status += do_ppd_tests(argv[i], num_options, options); } cupsFreeOptions(num_options, options); } else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7)) { /* * ipp://... or ipps://... */ http_t *http; /* Connection to printer */ ipp_t *request, /* Get-Printer-Attributes request */ *response; /* Get-Printer-Attributes response */ char scheme[32], /* URI scheme */ userpass[256], /* Username:password */ host[256], /* Hostname */ resource[256]; /* Resource path */ int port; /* Port number */ static const char * const pattrs[] =/* Requested printer attributes */ { "job-template", "printer-defaults", "printer-description", "media-col-database" }; if (httpSeparateURI(HTTP_URI_CODING_ALL, argv[1], scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { printf("Bad URI \"%s\".\n", argv[1]); return (1); } http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL); if (!http) { printf("Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString()); return (1); } request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, argv[1]); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), NULL, pattrs); response = cupsDoRequest(http, request, resource); if (_ppdCreateFromIPP(buffer, sizeof(buffer), response)) printf("Created PPD: %s\n", buffer); else puts("Unable to create PPD."); ippDelete(response); httpClose(http); return (0); } else { const char *filename; /* PPD filename */ struct stat fileinfo; /* File information */ if (strchr(argv[1], ':')) { /* * Server PPD... */ if ((filename = cupsGetServerPPD(CUPS_HTTP_DEFAULT, argv[1])) == NULL) { printf("%s: %s\n", argv[1], cupsLastErrorString()); return (1); } } else if (!strncmp(argv[1], "-d", 2)) { const char *printer; /* Printer name */ if (argv[1][2]) printer = argv[1] + 2; else if (argv[2]) printer = argv[2]; else { puts("Usage: ./testppd -d printer"); return (1); } filename = cupsGetPPD(printer); if (!filename) { printf("%s: %s\n", printer, cupsLastErrorString()); return (1); } } else filename = argv[1]; if (lstat(filename, &fileinfo)) { printf("%s: %s\n", filename, strerror(errno)); return (1); } if (S_ISLNK(fileinfo.st_mode)) { char realfile[1024]; /* Real file path */ ssize_t realsize; /* Size of real file path */ if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0) strlcpy(realfile, "Unknown", sizeof(realfile)); else realfile[realsize] = '\0'; if (stat(realfile, &fileinfo)) printf("%s: symlink to \"%s\", %s\n", filename, realfile, strerror(errno)); else printf("%s: symlink to \"%s\", %ld bytes\n", filename, realfile, (long)fileinfo.st_size); } else printf("%s: regular file, %ld bytes\n", filename, (long)fileinfo.st_size); if ((ppd = ppdOpenFile(filename)) == NULL) { ppd_status_t err; /* Last error in file */ int line; /* Line number in file */ status ++; err = ppdLastError(&line); printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line); } else { int j, k; /* Looping vars */ ppd_group_t *group; /* Option group */ ppd_option_t *option; /* Option */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ ppd_const_t *c; /* UIConstraints */ char lang[255], /* LANG environment variable */ lc_all[255], /* LC_ALL environment variable */ lc_ctype[255], /* LC_CTYPE environment variable */ lc_messages[255];/* LC_MESSAGES environment variable */ if (argc > 2) { snprintf(lang, sizeof(lang), "LANG=%s", argv[2]); putenv(lang); snprintf(lc_all, sizeof(lc_all), "LC_ALL=%s", argv[2]); putenv(lc_all); snprintf(lc_ctype, sizeof(lc_ctype), "LC_CTYPE=%s", argv[2]); putenv(lc_ctype); snprintf(lc_messages, sizeof(lc_messages), "LC_MESSAGES=%s", argv[2]); putenv(lc_messages); } ppdLocalize(ppd); ppdMarkDefaults(ppd); if (argc > 3) { text = ppdLocalizeIPPReason(ppd, argv[3], NULL, buffer, sizeof(buffer)); printf("ppdLocalizeIPPReason(%s)=%s\n", argv[3], text ? text : "(null)"); return (text == NULL); } for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) { printf("%s (%s):\n", group->name, group->text); for (j = group->num_options, option = group->options; j > 0; j --, option ++) { printf(" %s (%s):\n", option->keyword, option->text); for (k = 0; k < option->num_choices; k ++) printf(" - %s%s (%s)\n", option->choices[k].marked ? "*" : "", option->choices[k].choice, option->choices[k].text); if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL) { for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); cparam; cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) { 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, cparam->minimum.custom_curve, cparam->maximum.custom_curve); break; case PPD_CUSTOM_INT : printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n", cparam->name, cparam->text, cparam->minimum.custom_int, cparam->maximum.custom_int); break; case PPD_CUSTOM_INVCURVE : printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n", cparam->name, cparam->text, cparam->minimum.custom_invcurve, cparam->maximum.custom_invcurve); break; case PPD_CUSTOM_PASSCODE : printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n", cparam->name, cparam->text, cparam->minimum.custom_passcode, cparam->maximum.custom_passcode); break; case PPD_CUSTOM_PASSWORD : printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n", cparam->name, cparam->text, cparam->minimum.custom_password, cparam->maximum.custom_password); break; case PPD_CUSTOM_POINTS : printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n", cparam->name, cparam->text, cparam->minimum.custom_points, cparam->maximum.custom_points); break; case PPD_CUSTOM_REAL : printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n", cparam->name, cparam->text, cparam->minimum.custom_real, cparam->maximum.custom_real); break; case PPD_CUSTOM_STRING : printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n", cparam->name, cparam->text, cparam->minimum.custom_string, cparam->maximum.custom_string); break; } } } } } puts("\nSizes:"); for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) printf(" %s = %gx%g, [%g %g %g %g]\n", size->name, size->width, size->length, size->left, size->bottom, size->right, size->top); puts("\nConstraints:"); for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++) printf(" *UIConstraints: *%s %s *%s %s\n", c->option1, c->choice1, c->option2, c->choice2); if (ppd->num_consts == 0) puts(" NO CONSTRAINTS"); puts("\nFilters:"); for (i = 0; i < ppd->num_filters; i ++) printf(" %s\n", ppd->filters[i]); if (ppd->num_filters == 0) puts(" NO FILTERS"); puts("\nAttributes:"); for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs); attr; attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec, attr->text, attr->value ? attr->value : ""); puts("\nPPD Cache:"); if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL) printf(" Unable to create: %s\n", cupsLastErrorString()); else { _ppdCacheWriteFile(pc, "t.cache", NULL); puts(" Wrote t.cache."); } } if (!strncmp(argv[1], "-d", 2)) unlink(filename); } #ifdef __APPLE__ if (getenv("MallocStackLogging") && getenv("MallocStackLoggingNoCompact")) { char command[1024]; /* malloc_history command */ snprintf(command, sizeof(command), "malloc_history %d -all_by_size", getpid()); fflush(stdout); system(command); } #endif /* __APPLE__ */ ppdClose(ppd); return (status); } /* * 'do_ppd_tests()' - Test the default option commands in a PPD file. */ static int /* O - Number of errors */ do_ppd_tests(const char *filename, /* I - PPD file */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { ppd_file_t *ppd; /* PPD file data */ cups_page_header2_t header; /* Page header */ printf("\"%s\": ", filename); fflush(stdout); if ((ppd = ppdOpenFile(filename)) == NULL) { ppd_status_t status; /* Status from PPD loader */ int line; /* Line number containing error */ status = ppdLastError(&line); puts("FAIL (bad PPD file)"); printf(" %s on line %d\n", ppdErrorString(status), line); return (1); } ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, NULL)) { puts("FAIL (error from function)"); puts(cupsRasterErrorString()); return (1); } else { puts("PASS"); return (0); } } /* * 'do_ps_tests()' - Test standard PostScript commands. */ static int do_ps_tests(void) { cups_page_header2_t header; /* Page header */ int preferred_bits; /* Preferred bits */ int errors = 0; /* Number of errors */ /* * Test PS exec code... */ fputs("_cupsRasterExecPS(\"setpagedevice\"): ", stdout); fflush(stdout); memset(&header, 0, sizeof(header)); header.Collate = CUPS_TRUE; preferred_bits = 0; if (_cupsRasterExecPS(&header, &preferred_bits, setpagedevice_code)) { puts("FAIL (error from function)"); puts(cupsRasterErrorString()); errors ++; } else if (preferred_bits != 17 || memcmp(&header, &setpagedevice_header, sizeof(header))) { puts("FAIL (bad header)"); if (preferred_bits != 17) printf(" cupsPreferredBitsPerColor %d, expected 17\n", preferred_bits); print_changes(&setpagedevice_header, &header); errors ++; } else puts("PASS"); fputs("_cupsRasterExecPS(\"roll\"): ", stdout); fflush(stdout); if (_cupsRasterExecPS(&header, &preferred_bits, "792 612 0 0 0\n" "pop pop pop\n" "<>" "setpagedevice\n")) { puts("FAIL (error from function)"); puts(cupsRasterErrorString()); errors ++; } else if (header.PageSize[0] != 792 || header.PageSize[1] != 612) { printf("FAIL (PageSize [%d %d], expected [792 612])\n", header.PageSize[0], header.PageSize[1]); errors ++; } else puts("PASS"); fputs("_cupsRasterExecPS(\"dup index\"): ", stdout); fflush(stdout); if (_cupsRasterExecPS(&header, &preferred_bits, "true false dup\n" "<>setpagedevice\n" "pop pop pop")) { puts("FAIL (error from function)"); puts(cupsRasterErrorString()); errors ++; } else { if (!header.Collate) { printf("FAIL (Collate false, expected true)\n"); errors ++; } if (header.Duplex) { printf("FAIL (Duplex true, expected false)\n"); errors ++; } if (header.Tumble) { printf("FAIL (Tumble true, expected false)\n"); errors ++; } if(header.Collate && !header.Duplex && !header.Tumble) puts("PASS"); } fputs("_cupsRasterExecPS(\"%%Begin/EndFeature code\"): ", stdout); fflush(stdout); if (_cupsRasterExecPS(&header, &preferred_bits, dsc_code)) { puts("FAIL (error from function)"); puts(cupsRasterErrorString()); errors ++; } else if (header.PageSize[0] != 792 || header.PageSize[1] != 1224) { printf("FAIL (bad PageSize [%d %d], expected [792 1224])\n", header.PageSize[0], header.PageSize[1]); errors ++; } else puts("PASS"); return (errors); } /* * 'print_changes()' - Print differences in the page header. */ static void print_changes( cups_page_header2_t *header, /* I - Actual page header */ cups_page_header2_t *expected) /* I - Expected page header */ { int i; /* Looping var */ if (strcmp(header->MediaClass, expected->MediaClass)) printf(" MediaClass (%s), expected (%s)\n", header->MediaClass, expected->MediaClass); if (strcmp(header->MediaColor, expected->MediaColor)) printf(" MediaColor (%s), expected (%s)\n", header->MediaColor, expected->MediaColor); if (strcmp(header->MediaType, expected->MediaType)) printf(" MediaType (%s), expected (%s)\n", header->MediaType, expected->MediaType); if (strcmp(header->OutputType, expected->OutputType)) printf(" OutputType (%s), expected (%s)\n", header->OutputType, expected->OutputType); if (header->AdvanceDistance != expected->AdvanceDistance) printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance, expected->AdvanceDistance); if (header->AdvanceMedia != expected->AdvanceMedia) printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia, expected->AdvanceMedia); if (header->Collate != expected->Collate) printf(" Collate %d, expected %d\n", header->Collate, expected->Collate); if (header->CutMedia != expected->CutMedia) printf(" CutMedia %d, expected %d\n", header->CutMedia, expected->CutMedia); if (header->Duplex != expected->Duplex) printf(" Duplex %d, expected %d\n", header->Duplex, expected->Duplex); if (header->HWResolution[0] != expected->HWResolution[0] || header->HWResolution[1] != expected->HWResolution[1]) printf(" HWResolution [%d %d], expected [%d %d]\n", header->HWResolution[0], header->HWResolution[1], expected->HWResolution[0], expected->HWResolution[1]); if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox, sizeof(header->ImagingBoundingBox))) printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3], expected->ImagingBoundingBox[0], expected->ImagingBoundingBox[1], expected->ImagingBoundingBox[2], expected->ImagingBoundingBox[3]); if (header->InsertSheet != expected->InsertSheet) printf(" InsertSheet %d, expected %d\n", header->InsertSheet, expected->InsertSheet); if (header->Jog != expected->Jog) printf(" Jog %d, expected %d\n", header->Jog, expected->Jog); if (header->LeadingEdge != expected->LeadingEdge) printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge, expected->LeadingEdge); if (header->Margins[0] != expected->Margins[0] || header->Margins[1] != expected->Margins[1]) printf(" Margins [%d %d], expected [%d %d]\n", header->Margins[0], header->Margins[1], expected->Margins[0], expected->Margins[1]); if (header->ManualFeed != expected->ManualFeed) printf(" ManualFeed %d, expected %d\n", header->ManualFeed, expected->ManualFeed); if (header->MediaPosition != expected->MediaPosition) printf(" MediaPosition %d, expected %d\n", header->MediaPosition, expected->MediaPosition); if (header->MediaWeight != expected->MediaWeight) printf(" MediaWeight %d, expected %d\n", header->MediaWeight, expected->MediaWeight); if (header->MirrorPrint != expected->MirrorPrint) printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint, expected->MirrorPrint); if (header->NegativePrint != expected->NegativePrint) printf(" NegativePrint %d, expected %d\n", header->NegativePrint, expected->NegativePrint); if (header->NumCopies != expected->NumCopies) printf(" NumCopies %d, expected %d\n", header->NumCopies, expected->NumCopies); if (header->Orientation != expected->Orientation) printf(" Orientation %d, expected %d\n", header->Orientation, expected->Orientation); if (header->OutputFaceUp != expected->OutputFaceUp) printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp, expected->OutputFaceUp); if (header->PageSize[0] != expected->PageSize[0] || header->PageSize[1] != expected->PageSize[1]) printf(" PageSize [%d %d], expected [%d %d]\n", header->PageSize[0], header->PageSize[1], expected->PageSize[0], expected->PageSize[1]); if (header->Separations != expected->Separations) printf(" Separations %d, expected %d\n", header->Separations, expected->Separations); if (header->TraySwitch != expected->TraySwitch) printf(" TraySwitch %d, expected %d\n", header->TraySwitch, expected->TraySwitch); if (header->Tumble != expected->Tumble) printf(" Tumble %d, expected %d\n", header->Tumble, expected->Tumble); if (header->cupsWidth != expected->cupsWidth) printf(" cupsWidth %d, expected %d\n", header->cupsWidth, expected->cupsWidth); if (header->cupsHeight != expected->cupsHeight) printf(" cupsHeight %d, expected %d\n", header->cupsHeight, expected->cupsHeight); if (header->cupsMediaType != expected->cupsMediaType) printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType, expected->cupsMediaType); if (header->cupsBitsPerColor != expected->cupsBitsPerColor) printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor, expected->cupsBitsPerColor); if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel) printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel, expected->cupsBitsPerPixel); if (header->cupsBytesPerLine != expected->cupsBytesPerLine) printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine, expected->cupsBytesPerLine); if (header->cupsColorOrder != expected->cupsColorOrder) printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder, expected->cupsColorOrder); if (header->cupsColorSpace != expected->cupsColorSpace) printf(" cupsColorSpace %s, expected %s\n", _cupsRasterColorSpaceString(header->cupsColorSpace), _cupsRasterColorSpaceString(expected->cupsColorSpace)); if (header->cupsCompression != expected->cupsCompression) printf(" cupsCompression %d, expected %d\n", header->cupsCompression, expected->cupsCompression); if (header->cupsRowCount != expected->cupsRowCount) printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount, expected->cupsRowCount); if (header->cupsRowFeed != expected->cupsRowFeed) printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed, expected->cupsRowFeed); if (header->cupsRowStep != expected->cupsRowStep) printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep, expected->cupsRowStep); if (header->cupsNumColors != expected->cupsNumColors) printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors, expected->cupsNumColors); if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001) printf(" cupsBorderlessScalingFactor %g, expected %g\n", header->cupsBorderlessScalingFactor, expected->cupsBorderlessScalingFactor); if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 || fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001) printf(" cupsPageSize [%g %g], expected [%g %g]\n", header->cupsPageSize[0], header->cupsPageSize[1], expected->cupsPageSize[0], expected->cupsPageSize[1]); if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 || fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 || fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 || fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001) printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n", header->cupsImagingBBox[0], header->cupsImagingBBox[1], header->cupsImagingBBox[2], header->cupsImagingBBox[3], expected->cupsImagingBBox[0], expected->cupsImagingBBox[1], expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]); for (i = 0; i < 16; i ++) if (header->cupsInteger[i] != expected->cupsInteger[i]) printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i], expected->cupsInteger[i]); for (i = 0; i < 16; i ++) if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001) printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i], expected->cupsReal[i]); for (i = 0; i < 16; i ++) if (strcmp(header->cupsString[i], expected->cupsString[i])) printf(" cupsString%d (%s), expected (%s)\n", i, header->cupsString[i], expected->cupsString[i]); if (strcmp(header->cupsMarkerType, expected->cupsMarkerType)) printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType, expected->cupsMarkerType); if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent)) printf(" cupsRenderingIntent (%s), expected (%s)\n", header->cupsRenderingIntent, expected->cupsRenderingIntent); if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName)) printf(" cupsPageSizeName (%s), expected (%s)\n", header->cupsPageSizeName, expected->cupsPageSizeName); } cups-2.3.1/cups/ppd.h000664 000765 000024 00000052451 13574721672 014514 0ustar00mikestaff000000 000000 /* * PostScript Printer Description definitions for CUPS. * * THESE APIS ARE DEPRECATED. THIS HEADER AND THESE FUNCTIONS WILL BE REMOVED * IN A FUTURE RELEASE OF CUPS. * * 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. * * PostScript is a trademark of Adobe Systems, Inc. */ #ifndef _CUPS_PPD_H_ # define _CUPS_PPD_H_ /* * Include necessary headers... */ # include # include "cups.h" # include "array.h" # include "file.h" # include "raster.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * PPD version... */ # define PPD_VERSION 4.3 /* Kept in sync with Adobe version number */ /* * PPD size limits (defined in Adobe spec) */ # define PPD_MAX_NAME 41 /* Maximum size of name + 1 for nul */ # define PPD_MAX_TEXT 81 /* Maximum size of text + 1 for nul */ # define PPD_MAX_LINE 256 /* Maximum size of line + 1 for nul */ /* * Types and structures... */ typedef int (*cups_interpret_cb_t)(cups_page_header2_t *header, int preferred_bits); /**** cupsRasterInterpretPPD callback function * * This function is called by * @link cupsRasterInterpretPPD@ to * validate (and update, as needed) * the page header attributes. The * "preferred_bits" argument provides * the value of the * @code cupsPreferredBitsPerColor@ * key from the PostScript page device * dictionary and is 0 if undefined. ****/ typedef enum ppd_ui_e /**** UI Types @deprecated@ ****/ { PPD_UI_BOOLEAN, /* True or False option */ PPD_UI_PICKONE, /* Pick one from a list */ PPD_UI_PICKMANY /* Pick zero or more from a list */ } ppd_ui_t; typedef enum ppd_section_e /**** Order dependency sections @deprecated@ ****/ { PPD_ORDER_ANY, /* Option code can be anywhere in the file */ PPD_ORDER_DOCUMENT, /* ... must be in the DocumentSetup section */ PPD_ORDER_EXIT, /* ... must be sent prior to the document */ PPD_ORDER_JCL, /* ... must be sent as a JCL command */ PPD_ORDER_PAGE, /* ... must be in the PageSetup section */ PPD_ORDER_PROLOG /* ... must be in the Prolog section */ } ppd_section_t; typedef enum ppd_cs_e /**** Colorspaces @deprecated@ ****/ { PPD_CS_CMYK = -4, /* CMYK colorspace */ PPD_CS_CMY, /* CMY colorspace */ PPD_CS_GRAY = 1, /* Grayscale colorspace */ PPD_CS_RGB = 3, /* RGB colorspace */ PPD_CS_RGBK, /* RGBK (K = gray) colorspace */ PPD_CS_N /* DeviceN colorspace */ } ppd_cs_t; typedef enum ppd_status_e /**** Status Codes @deprecated@ ****/ { PPD_OK = 0, /* OK */ PPD_FILE_OPEN_ERROR, /* Unable to open PPD file */ PPD_NULL_FILE, /* NULL PPD file pointer */ PPD_ALLOC_ERROR, /* Memory allocation error */ PPD_MISSING_PPDADOBE4, /* Missing PPD-Adobe-4.x header */ PPD_MISSING_VALUE, /* Missing value string */ PPD_INTERNAL_ERROR, /* Internal error */ PPD_BAD_OPEN_GROUP, /* Bad OpenGroup */ PPD_NESTED_OPEN_GROUP, /* OpenGroup without a CloseGroup first */ PPD_BAD_OPEN_UI, /* Bad OpenUI/JCLOpenUI */ PPD_NESTED_OPEN_UI, /* OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first */ PPD_BAD_ORDER_DEPENDENCY, /* Bad OrderDependency */ PPD_BAD_UI_CONSTRAINTS, /* Bad UIConstraints */ PPD_MISSING_ASTERISK, /* Missing asterisk in column 0 */ PPD_LINE_TOO_LONG, /* Line longer than 255 chars */ PPD_ILLEGAL_CHARACTER, /* Illegal control character */ PPD_ILLEGAL_MAIN_KEYWORD, /* Illegal main keyword string */ PPD_ILLEGAL_OPTION_KEYWORD, /* Illegal option keyword string */ PPD_ILLEGAL_TRANSLATION, /* Illegal translation string */ PPD_ILLEGAL_WHITESPACE, /* Illegal whitespace character */ PPD_BAD_CUSTOM_PARAM, /* Bad custom parameter */ PPD_MISSING_OPTION_KEYWORD, /* Missing option keyword */ PPD_BAD_VALUE, /* Bad value string */ PPD_MISSING_CLOSE_GROUP, /* Missing CloseGroup */ PPD_BAD_CLOSE_UI, /* Bad CloseUI/JCLCloseUI */ PPD_MISSING_CLOSE_UI, /* Missing CloseUI/JCLCloseUI */ PPD_MAX_STATUS /* @private@ */ } ppd_status_t; enum ppd_conform_e /**** Conformance Levels @deprecated@ ****/ { PPD_CONFORM_RELAXED, /* Relax whitespace and control char */ PPD_CONFORM_STRICT /* Require strict conformance */ }; typedef enum ppd_conform_e ppd_conform_t; /**** Conformance Levels @deprecated@ ****/ typedef struct ppd_attr_s /**** PPD Attribute Structure @deprecated@ ****/ { char name[PPD_MAX_NAME]; /* Name of attribute (cupsXYZ) */ char spec[PPD_MAX_NAME]; /* Specifier string, if any */ char text[PPD_MAX_TEXT]; /* Human-readable text, if any */ char *value; /* Value string */ } ppd_attr_t; typedef struct ppd_option_s ppd_option_t; /**** Options @deprecated@ ****/ typedef struct ppd_choice_s /**** Option choices @deprecated@ ****/ { char marked; /* 0 if not selected, 1 otherwise */ char choice[PPD_MAX_NAME]; /* Computer-readable option name */ char text[PPD_MAX_TEXT]; /* Human-readable option name */ char *code; /* Code to send for this option */ ppd_option_t *option; /* Pointer to parent option structure */ } ppd_choice_t; struct ppd_option_s /**** Options @deprecated@ ****/ { char conflicted; /* 0 if no conflicts exist, 1 otherwise */ char keyword[PPD_MAX_NAME]; /* Option keyword name ("PageSize", etc.) */ char defchoice[PPD_MAX_NAME];/* Default option choice */ char text[PPD_MAX_TEXT]; /* Human-readable text */ ppd_ui_t ui; /* Type of UI option */ ppd_section_t section; /* Section for command */ float order; /* Order number */ int num_choices; /* Number of option choices */ ppd_choice_t *choices; /* Option choices */ }; typedef struct ppd_group_s /**** Groups @deprecated@ ****/ { /**** Group text strings are limited to 39 chars + nul in order to **** preserve binary compatibility and allow applications to get **** the group's keyword name. ****/ char text[PPD_MAX_TEXT - PPD_MAX_NAME]; /* Human-readable group name */ char name[PPD_MAX_NAME]; /* Group name @since CUPS 1.1.18/macOS 10.3@ */ int num_options; /* Number of options */ ppd_option_t *options; /* Options */ int num_subgroups; /* Number of sub-groups */ struct ppd_group_s *subgroups; /* Sub-groups (max depth = 1) */ } ppd_group_t; typedef struct ppd_const_s /**** Constraints @deprecated@ ****/ { char option1[PPD_MAX_NAME]; /* First keyword */ char choice1[PPD_MAX_NAME]; /* First option/choice (blank for all) */ char option2[PPD_MAX_NAME]; /* Second keyword */ char choice2[PPD_MAX_NAME]; /* Second option/choice (blank for all) */ } ppd_const_t; typedef struct ppd_size_s /**** Page Sizes @deprecated@ ****/ { int marked; /* Page size selected? */ char name[PPD_MAX_NAME]; /* Media size option */ float width; /* Width of media in points */ float length; /* Length of media in points */ float left; /* Left printable margin in points */ float bottom; /* Bottom printable margin in points */ float right; /* Right printable margin in points */ float top; /* Top printable margin in points */ } ppd_size_t; typedef struct ppd_emul_s /**** Emulators @deprecated@ ****/ { char name[PPD_MAX_NAME]; /* Emulator name */ char *start; /* Code to switch to this emulation */ char *stop; /* Code to stop this emulation */ } ppd_emul_t; typedef struct ppd_profile_s /**** sRGB Color Profiles @deprecated@ ****/ { char resolution[PPD_MAX_NAME]; /* Resolution or "-" */ char media_type[PPD_MAX_NAME]; /* Media type or "-" */ float density; /* Ink density to use */ float gamma; /* Gamma correction to use */ float matrix[3][3]; /* Transform matrix */ } ppd_profile_t; /**** 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) */ PPD_CUSTOM_PASSCODE, /* String of (hidden) numbers */ PPD_CUSTOM_PASSWORD, /* String of (hidden) characters */ PPD_CUSTOM_POINTS, /* Measurement value in points */ PPD_CUSTOM_REAL, /* Real number value */ PPD_CUSTOM_STRING /* String of characters */ } ppd_cptype_t; typedef union ppd_cplimit_u /**** Custom Parameter Limit @deprecated@ ****/ { float custom_curve; /* Gamma value */ int custom_int; /* Integer value */ float custom_invcurve; /* Gamma value */ int custom_passcode; /* Passcode length */ int custom_password; /* Password length */ float custom_points; /* Measurement value */ float custom_real; /* Real value */ int custom_string; /* String length */ } ppd_cplimit_t; typedef union ppd_cpvalue_u /**** Custom Parameter Value @deprecated@ ****/ { float custom_curve; /* Gamma value */ int custom_int; /* Integer value */ float custom_invcurve; /* Gamma value */ char *custom_passcode; /* Passcode value */ char *custom_password; /* Password value */ float custom_points; /* Measurement value */ float custom_real; /* Real value */ char *custom_string; /* String value */ } ppd_cpvalue_t; typedef struct ppd_cparam_s /**** Custom Parameter @deprecated@ ****/ { char name[PPD_MAX_NAME]; /* Parameter name */ char text[PPD_MAX_TEXT]; /* Human-readable text */ int order; /* Order (0 to N) */ ppd_cptype_t type; /* Parameter type */ ppd_cplimit_t minimum, /* Minimum value */ maximum; /* Maximum value */ ppd_cpvalue_t current; /* Current value */ } ppd_cparam_t; typedef struct ppd_coption_s /**** Custom Option @deprecated@ ****/ { char keyword[PPD_MAX_NAME]; /* Name of option that is being extended... */ ppd_option_t *option; /* Option that is being extended... */ int marked; /* Extended option is marked */ cups_array_t *params; /* Parameters */ } ppd_coption_t; typedef struct _ppd_cache_s _ppd_cache_t; /**** PPD cache and mapping data @deprecated@ ****/ typedef struct ppd_file_s /**** PPD File @deprecated@ ****/ { int language_level; /* Language level of device */ int color_device; /* 1 = color device, 0 = grayscale */ int variable_sizes; /* 1 = supports variable sizes, 0 = doesn't */ int accurate_screens; /* 1 = supports accurate screens, 0 = not */ int contone_only; /* 1 = continuous tone only, 0 = not */ int landscape; /* -90 or 90 */ int model_number; /* Device-specific model number */ int manual_copies; /* 1 = Copies done manually, 0 = hardware */ int throughput; /* Pages per minute */ ppd_cs_t colorspace; /* Default colorspace */ char *patches; /* Patch commands to be sent to printer */ int num_emulations; /* Number of emulations supported (no longer supported) @private@ */ ppd_emul_t *emulations; /* Emulations and the code to invoke them (no longer supported) @private@ */ char *jcl_begin; /* Start JCL commands */ char *jcl_ps; /* Enter PostScript interpreter */ char *jcl_end; /* End JCL commands */ char *lang_encoding; /* Language encoding */ char *lang_version; /* Language version (English, Spanish, etc.) */ char *modelname; /* Model name (general) */ char *ttrasterizer; /* Truetype rasterizer */ char *manufacturer; /* Manufacturer name */ char *product; /* Product name (from PS RIP/interpreter) */ char *nickname; /* Nickname (specific) */ char *shortnickname; /* Short version of nickname */ int num_groups; /* Number of UI groups */ ppd_group_t *groups; /* UI groups */ int num_sizes; /* Number of page sizes */ ppd_size_t *sizes; /* Page sizes */ float custom_min[2]; /* Minimum variable page size */ float custom_max[2]; /* Maximum variable page size */ float custom_margins[4]; /* Margins around page */ int num_consts; /* Number of UI/Non-UI constraints */ ppd_const_t *consts; /* UI/Non-UI constraints */ int num_fonts; /* Number of pre-loaded fonts */ char **fonts; /* Pre-loaded fonts */ int num_profiles; /* Number of sRGB color profiles @deprecated@ */ ppd_profile_t *profiles; /* sRGB color profiles @deprecated@ */ int num_filters; /* Number of filters */ char **filters; /* Filter strings... */ /**** New in CUPS 1.1 ****/ int flip_duplex; /* 1 = Flip page for back sides @deprecated@ */ /**** New in CUPS 1.1.19 ****/ char *protocols; /* Protocols (BCP, TBCP) string @since CUPS 1.1.19/macOS 10.3@ */ char *pcfilename; /* PCFileName string @since CUPS 1.1.19/macOS 10.3@ */ int num_attrs; /* Number of attributes @since CUPS 1.1.19/macOS 10.3@ @private@ */ int cur_attr; /* Current attribute @since CUPS 1.1.19/macOS 10.3@ @private@ */ ppd_attr_t **attrs; /* Attributes @since CUPS 1.1.19/macOS 10.3@ @private@ */ /**** New in CUPS 1.2/macOS 10.5 ****/ cups_array_t *sorted_attrs; /* Attribute lookup array @since CUPS 1.2/macOS 10.5@ @private@ */ cups_array_t *options; /* Option lookup array @since CUPS 1.2/macOS 10.5@ @private@ */ cups_array_t *coptions; /* Custom options array @since CUPS 1.2/macOS 10.5@ @private@ */ /**** New in CUPS 1.3/macOS 10.5 ****/ cups_array_t *marked; /* Marked choices @since CUPS 1.3/macOS 10.5@ @private@ */ /**** New in CUPS 1.4/macOS 10.6 ****/ cups_array_t *cups_uiconstraints; /* cupsUIConstraints @since CUPS 1.4/macOS 10.6@ @private@ */ /**** New in CUPS 1.5 ****/ _ppd_cache_t *cache; /* PPD cache and mapping data @since CUPS 1.5/macOS 10.7@ @private@ */ } ppd_file_t; /* * Prototypes... */ extern const char *cupsGetPPD(const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern const char *cupsGetPPD2(http_t *http, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern http_status_t cupsGetPPD3(http_t *http, const char *name, time_t *modtime, char *buffer, size_t bufsize) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern char *cupsGetServerPPD(http_t *http, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int cupsMarkOptions(ppd_file_t *ppd, int num_options, cups_option_t *options) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern void ppdClose(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdCollect(ppd_file_t *ppd, ppd_section_t section, ppd_choice_t ***choices) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdConflicts(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdEmit(ppd_file_t *ppd, FILE *fp, ppd_section_t section) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdEmitFd(ppd_file_t *ppd, int fd, ppd_section_t section) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id, const char *user, const char *title) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdIsMarked(ppd_file_t *ppd, const char *keyword, const char *option) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern void ppdMarkDefaults(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdMarkOption(ppd_file_t *ppd, const char *keyword, const char *option) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_file_t *ppdOpen(FILE *fp) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_file_t *ppdOpenFd(int fd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_file_t *ppdOpenFile(const char *filename) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern float ppdPageLength(ppd_file_t *ppd, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern float ppdPageWidth(ppd_file_t *ppd, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /**** New in CUPS 1.1.19 ****/ extern const char *ppdErrorString(ppd_status_t status) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_attr_t *ppdFindAttr(ppd_file_t *ppd, const char *name, const char *spec) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_attr_t *ppdFindNextAttr(ppd_file_t *ppd, const char *name, const char *spec) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_status_t ppdLastError(int *line) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /**** New in CUPS 1.1.20 ****/ extern void ppdSetConformance(ppd_conform_t c) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /**** New in CUPS 1.2 ****/ extern int cupsRasterInterpretPPD(cups_page_header2_t *h, ppd_file_t *ppd, int num_options, cups_option_t *options, cups_interpret_cb_t func) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdCollect2(ppd_file_t *ppd, ppd_section_t section, float min_order, ppd_choice_t ***choices) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp, ppd_section_t section, int limit, float min_order) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern char *ppdEmitString(ppd_file_t *ppd, ppd_section_t section, float min_order) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_coption_t *ppdFindCustomOption(ppd_file_t *ppd, const char *keyword) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_cparam_t *ppdFindCustomParam(ppd_coption_t *opt, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_option_t *ppdFirstOption(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_cparam_t *ppdNextCustomParam(ppd_coption_t *opt) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_option_t *ppdNextOption(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdLocalize(ppd_file_t *ppd) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_file_t *ppdOpen2(cups_file_t *fp) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /**** New in CUPS 1.3/macOS 10.5 ****/ extern const char *ppdLocalizeIPPReason(ppd_file_t *ppd, const char *reason, const char *scheme, char *buffer, size_t bufsize) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /**** New in CUPS 1.4/macOS 10.6 ****/ extern int cupsGetConflicts(ppd_file_t *ppd, const char *option, const char *choice, cups_option_t **options) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int cupsResolveConflicts(ppd_file_t *ppd, const char *option, const char *choice, int *num_options, cups_option_t **options) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdInstallableConflict(ppd_file_t *ppd, const char *option, const char *choice) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern ppd_attr_t *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword, const char *spec) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern const char *ppdLocalizeMarkerName(ppd_file_t *ppd, const char *name) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); extern int ppdPageSizeLimits(ppd_file_t *ppd, ppd_size_t *minimum, ppd_size_t *maximum) _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead."); /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_PPD_H_ */ cups-2.3.1/cups/libcups2.rc000664 000765 000024 00000003642 13574721672 015627 0ustar00mikestaff000000 000000 // Microsoft Visual C++ generated resource script. // #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" #include "WinVersRes.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION MASTER_PROD_VERS PRODUCTVERSION MASTER_PROD_VERS FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", MASTER_COMPANY_NAME VALUE "FileDescription", "CUPS Library" VALUE "FileVersion", MASTER_PROD_VERS_STR VALUE "InternalName", "libcups2.dll" VALUE "LegalCopyright", MASTER_LEGAL_COPYRIGHT VALUE "OriginalFilename", "libcups2.dll" VALUE "ProductName", MASTER_PROD_NAME VALUE "ProductVersion", MASTER_PROD_VERS_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED cups-2.3.1/cups/testhttp.c000664 000765 000024 00000065223 13574721672 015604 0ustar00mikestaff000000 000000 /* * HTTP test program for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" /* * Types and structures... */ typedef struct uri_test_s /**** URI test cases ****/ { http_uri_status_t result; /* Expected return value */ const char *uri, /* URI */ *scheme, /* Scheme string */ *username, /* Username:password string */ *hostname, /* Hostname string */ *resource; /* Resource string */ int port, /* Port number */ assemble_port; /* Port number for httpAssembleURI() */ http_uri_coding_t assemble_coding;/* Coding for httpAssembleURI() */ } uri_test_t; /* * Local globals... */ static uri_test_t uri_tests[] = /* URI test data */ { /* Start with valid URIs */ { HTTP_URI_STATUS_OK, "file:/filename", "file", "", "", "/filename", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "file:/filename%20with%20spaces", "file", "", "", "/filename with spaces", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "file:///filename", "file", "", "", "/filename", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "file:///filename%20with%20spaces", "file", "", "", "/filename with spaces", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "file://localhost/filename", "file", "", "localhost", "/filename", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "file://localhost/filename%20with%20spaces", "file", "", "localhost", "/filename with spaces", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://server/", "http", "", "server", "/", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://username@server/", "http", "username", "server", "/", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://username:passwor%64@server/", "http", "username:password", "server", "/", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://username:passwor%64@server:8080/", "http", "username:password", "server", "/", 8080, 8080, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://username:passwor%64@server:8080/directory/filename", "http", "username:password", "server", "/directory/filename", 8080, 8080, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "http://[2000::10:100]:631/ipp", "http", "", "2000::10:100", "/ipp", 631, 631, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "https://username:passwor%64@server/directory/filename", "https", "username:password", "server", "/directory/filename", 443, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "ipp://username:passwor%64@[::1]/ipp", "ipp", "username:password", "::1", "/ipp", 631, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "lpd://server/queue?reserve=yes", "lpd", "", "server", "/queue?reserve=yes", 515, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "mailto:user@domain.com", "mailto", "", "", "user@domain.com", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "socket://server/", "socket", "", "server", "/", 9100, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "socket://192.168.1.1:9101/", "socket", "", "192.168.1.1", "/", 9101, 9101, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "tel:8005551212", "tel", "", "", "8005551212", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "ipp://username:password@[v1.fe80::200:1234:5678:9abc+eth0]:999/ipp", "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "ipp://username:password@[fe80::200:1234:5678:9abc%25eth0]:999/ipp", "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999, (http_uri_coding_t)(HTTP_URI_CODING_MOST | HTTP_URI_CODING_RFC6874) }, { HTTP_URI_STATUS_OK, "http://server/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", "http", "", "server", "/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "lpd://Acme%20Laser%20(01%3A23%3A45).local._tcp._printer/", "lpd", "", "Acme Laser (01:23:45).local._tcp._printer", "/", 515, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "ipp://HP%20Officejet%204500%20G510n-z%20%40%20Will's%20MacBook%20Pro%2015%22._ipp._tcp.local./", "ipp", "", "HP Officejet 4500 G510n-z @ Will's MacBook Pro 15\"._ipp._tcp.local.", "/", 631, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_OK, "ipp://%22%23%2F%3A%3C%3E%3F%40%5B%5C%5D%5E%60%7B%7C%7D/", "ipp", "", "\"#/:<>?@[\\]^`{|}", "/", 631, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_UNKNOWN_SCHEME, "smb://server/Some%20Printer", "smb", "", "server", "/Some Printer", 0, 0, HTTP_URI_CODING_ALL }, /* Missing scheme */ { HTTP_URI_STATUS_MISSING_SCHEME, "/path/to/file/index.html", "file", "", "", "/path/to/file/index.html", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_MISSING_SCHEME, "//server/ipp", "ipp", "", "server", "/ipp", 631, 0, HTTP_URI_CODING_MOST }, /* Unknown scheme */ { HTTP_URI_STATUS_UNKNOWN_SCHEME, "vendor://server/resource", "vendor", "", "server", "/resource", 0, 0, HTTP_URI_CODING_MOST }, /* Missing resource */ { HTTP_URI_STATUS_MISSING_RESOURCE, "socket://[::192.168.2.1]", "socket", "", "::192.168.2.1", "/", 9100, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_MISSING_RESOURCE, "socket://192.168.1.1:9101", "socket", "", "192.168.1.1", "/", 9101, 0, HTTP_URI_CODING_MOST }, /* Bad URI */ { HTTP_URI_STATUS_BAD_URI, "", "", "", "", "", 0, 0, HTTP_URI_CODING_MOST }, /* Bad scheme */ { HTTP_URI_STATUS_BAD_SCHEME, "://server/ipp", "", "", "", "", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_SCHEME, "bad_scheme://server/resource", "", "", "", "", 0, 0, HTTP_URI_CODING_MOST }, /* Bad username */ { HTTP_URI_STATUS_BAD_USERNAME, "http://username:passwor%6@server/resource", "http", "", "", "", 80, 0, HTTP_URI_CODING_MOST }, /* Bad hostname */ { HTTP_URI_STATUS_BAD_HOSTNAME, "http://[/::1]/index.html", "http", "", "", "", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_HOSTNAME, "http://[", "http", "", "", "", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_HOSTNAME, "http://serve%7/index.html", "http", "", "", "", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_HOSTNAME, "http://server with spaces/index.html", "http", "", "", "", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_HOSTNAME, "ipp://\"#/:<>?@[\\]^`{|}/", "ipp", "", "", "", 631, 0, HTTP_URI_CODING_MOST }, /* Bad port number */ { HTTP_URI_STATUS_BAD_PORT, "http://127.0.0.1:9999a/index.html", "http", "", "127.0.0.1", "", 0, 0, HTTP_URI_CODING_MOST }, /* Bad resource */ { HTTP_URI_STATUS_BAD_RESOURCE, "mailto:\r\nbla", "mailto", "", "", "", 0, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_RESOURCE, "http://server/index.html%", "http", "", "server", "", 80, 0, HTTP_URI_CODING_MOST }, { HTTP_URI_STATUS_BAD_RESOURCE, "http://server/index with spaces.html", "http", "", "server", "", 80, 0, HTTP_URI_CODING_MOST } }; static const char * const base64_tests[][2] = { { "A", "QQ==" }, /* 010000 01 */ { "AB", "QUI=" }, /* 010000 010100 0010 */ { "ABC", "QUJD" }, /* 010000 010100 001001 000011 */ { "ABCD", "QUJDRA==" }, /* 010000 010100 001001 000011 010001 00 */ { "ABCDE", "QUJDREU=" }, /* 010000 010100 001001 000011 010001 000100 0101 */ { "ABCDEF", "QUJDREVG" }, /* 010000 010100 001001 000011 010001 000100 010101 000110 */ }; /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i, j, k; /* Looping vars */ http_t *http; /* HTTP connection */ http_encryption_t encryption; /* Encryption type */ http_status_t status; /* Status of GET command */ int failures; /* Number of test failures */ char buffer[8192]; /* Input buffer */ long bytes; /* Number of bytes read */ FILE *out; /* Output file */ char encode[256], /* Base64-encoded string */ decode[256]; /* Base64-decoded string */ int decodelen; /* Length of decoded string */ char scheme[HTTP_MAX_URI], /* Scheme from URI */ hostname[HTTP_MAX_URI], /* Hostname from URI */ username[HTTP_MAX_URI], /* Username:password from URI */ resource[HTTP_MAX_URI]; /* Resource from URI */ int port; /* Port number from URI */ http_uri_status_t uri_status; /* Status of URI separation */ http_addrlist_t *addrlist, /* Address list */ *addr; /* Current address */ off_t length, total; /* Length and total bytes */ time_t start, current; /* Start and end time */ const char *encoding; /* Negotiated Content-Encoding */ static const char * const uri_status_strings[] = { "HTTP_URI_STATUS_OVERFLOW", "HTTP_URI_STATUS_BAD_ARGUMENTS", "HTTP_URI_STATUS_BAD_RESOURCE", "HTTP_URI_STATUS_BAD_PORT", "HTTP_URI_STATUS_BAD_HOSTNAME", "HTTP_URI_STATUS_BAD_USERNAME", "HTTP_URI_STATUS_BAD_SCHEME", "HTTP_URI_STATUS_BAD_URI", "HTTP_URI_STATUS_OK", "HTTP_URI_STATUS_MISSING_SCHEME", "HTTP_URI_STATUS_UNKNOWN_SCHEME", "HTTP_URI_STATUS_MISSING_RESOURCE" }; /* * Do API tests if we don't have a URL on the command-line... */ if (argc == 1) { failures = 0; /* * httpGetDateString()/httpGetDateTime() */ fputs("httpGetDateString()/httpGetDateTime(): ", stdout); start = time(NULL); strlcpy(buffer, httpGetDateString(start), sizeof(buffer)); current = httpGetDateTime(buffer); i = (int)(current - start); if (i < 0) i = -i; if (!i) puts("PASS"); else { failures ++; puts("FAIL"); printf(" Difference is %d seconds, %02d:%02d:%02d...\n", i, i / 3600, (i / 60) % 60, i % 60); printf(" httpGetDateString(%d) returned \"%s\"\n", (int)start, buffer); printf(" httpGetDateTime(\"%s\") returned %d\n", buffer, (int)current); printf(" httpGetDateString(%d) returned \"%s\"\n", (int)current, httpGetDateString(current)); } /* * httpDecode64_2()/httpEncode64_2() */ fputs("httpDecode64_2()/httpEncode64_2(): ", stdout); for (i = 0, j = 0; i < (int)(sizeof(base64_tests) / sizeof(base64_tests[0])); i ++) { httpEncode64_2(encode, sizeof(encode), base64_tests[i][0], (int)strlen(base64_tests[i][0])); decodelen = (int)sizeof(decode); httpDecode64_2(decode, &decodelen, base64_tests[i][1]); if (strcmp(decode, base64_tests[i][0])) { failures ++; if (j) { puts("FAIL"); j = 1; } printf(" httpDecode64_2() returned \"%s\", expected \"%s\"...\n", decode, base64_tests[i][0]); } if (strcmp(encode, base64_tests[i][1])) { failures ++; if (j) { puts("FAIL"); j = 1; } printf(" httpEncode64_2() returned \"%s\", expected \"%s\"...\n", encode, base64_tests[i][1]); } } if (!j) puts("PASS"); #if 0 /* * _httpDigest() */ fputs("_httpDigest(MD5): ", stdout); if (!_httpDigest(buffer, sizeof(buffer), "MD5", "Mufasa", "http-auth@example.org", "Circle of Life", "7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v", 1, "f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ", "auth", "GET", "/dir/index.html")) { failures ++; puts("FAIL (unable to calculate hash)"); } else if (strcmp(buffer, "8ca523f5e9506fed4657c9700eebdbec")) { failures ++; printf("FAIL (got \"%s\", expected \"8ca523f5e9506fed4657c9700eebdbec\")\n", buffer); } else puts("PASS"); fputs("_httpDigest(SHA-256): ", stdout); if (!_httpDigest(buffer, sizeof(buffer), "SHA-256", "Mufasa", "http-auth@example.org", "Circle of Life", "7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v", 1, "f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ", "auth", "GET", "/dir/index.html")) { failures ++; puts("FAIL (unable to calculate hash)"); } else if (strcmp(buffer, "753927fa0e85d155564e2e272a28d1802ca10daf4496794697cf8db5856cb6c1")) { failures ++; printf("FAIL (got \"%s\", expected \"753927fa0e85d155564e2e272a28d1802ca10daf4496794697cf8db5856cb6c1\")\n", buffer); } else puts("PASS"); #endif /* 0 */ /* * httpGetHostname() */ fputs("httpGetHostname(): ", stdout); if (httpGetHostname(NULL, hostname, sizeof(hostname))) printf("PASS (%s)\n", hostname); else { failures ++; puts("FAIL"); } /* * httpAddrGetList() */ printf("httpAddrGetList(%s): ", hostname); addrlist = httpAddrGetList(hostname, AF_UNSPEC, NULL); if (addrlist) { for (i = 0, addr = addrlist; addr; i ++, addr = addr->next) { char numeric[1024]; /* Numeric IP address */ httpAddrString(&(addr->addr), numeric, sizeof(numeric)); if (!strcmp(numeric, "UNKNOWN")) break; } if (addr) printf("FAIL (bad address for %s)\n", hostname); else printf("PASS (%d address(es) for %s)\n", i, hostname); httpAddrFreeList(addrlist); } else if (isdigit(hostname[0] & 255)) { puts("FAIL (ignored because hostname is numeric)"); } else { failures ++; puts("FAIL"); } /* * Test httpSeparateURI()... */ fputs("httpSeparateURI(): ", stdout); for (i = 0, j = 0; i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0])); i ++) { uri_status = httpSeparateURI(HTTP_URI_CODING_MOST, uri_tests[i].uri, scheme, sizeof(scheme), username, sizeof(username), hostname, sizeof(hostname), &port, resource, sizeof(resource)); if (uri_status != uri_tests[i].result || strcmp(scheme, uri_tests[i].scheme) || strcmp(username, uri_tests[i].username) || strcmp(hostname, uri_tests[i].hostname) || port != uri_tests[i].port || strcmp(resource, uri_tests[i].resource)) { failures ++; if (!j) { puts("FAIL"); j = 1; } printf(" \"%s\":\n", uri_tests[i].uri); if (uri_status != uri_tests[i].result) printf(" Returned %s instead of %s\n", uri_status_strings[uri_status + 8], uri_status_strings[uri_tests[i].result + 8]); if (strcmp(scheme, uri_tests[i].scheme)) printf(" Scheme \"%s\" instead of \"%s\"\n", scheme, uri_tests[i].scheme); if (strcmp(username, uri_tests[i].username)) printf(" Username \"%s\" instead of \"%s\"\n", username, uri_tests[i].username); if (strcmp(hostname, uri_tests[i].hostname)) printf(" Hostname \"%s\" instead of \"%s\"\n", hostname, uri_tests[i].hostname); if (port != uri_tests[i].port) printf(" Port %d instead of %d\n", port, uri_tests[i].port); if (strcmp(resource, uri_tests[i].resource)) printf(" Resource \"%s\" instead of \"%s\"\n", resource, uri_tests[i].resource); } } if (!j) printf("PASS (%d URIs tested)\n", (int)(sizeof(uri_tests) / sizeof(uri_tests[0]))); /* * Test httpAssembleURI()... */ fputs("httpAssembleURI(): ", stdout); for (i = 0, j = 0, k = 0; i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0])); i ++) if (uri_tests[i].result == HTTP_URI_STATUS_OK && !strstr(uri_tests[i].uri, "%64") && strstr(uri_tests[i].uri, "//")) { k ++; uri_status = httpAssembleURI(uri_tests[i].assemble_coding, buffer, sizeof(buffer), uri_tests[i].scheme, uri_tests[i].username, uri_tests[i].hostname, uri_tests[i].assemble_port, uri_tests[i].resource); if (uri_status != HTTP_URI_STATUS_OK) { failures ++; if (!j) { puts("FAIL"); j = 1; } printf(" \"%s\": %s\n", uri_tests[i].uri, uri_status_strings[uri_status + 8]); } else if (strcmp(buffer, uri_tests[i].uri)) { failures ++; if (!j) { puts("FAIL"); j = 1; } printf(" \"%s\": assembled = \"%s\"\n", uri_tests[i].uri, buffer); } } if (!j) printf("PASS (%d URIs tested)\n", k); /* * httpAssembleUUID */ fputs("httpAssembleUUID: ", stdout); httpAssembleUUID("hostname.example.com", 631, "printer", 12345, buffer, sizeof(buffer)); if (strncmp(buffer, "urn:uuid:", 9)) { printf("FAIL (%s)\n", buffer); failures ++; } else printf("PASS (%s)\n", buffer); /* * Show a summary and return... */ if (failures) printf("\n%d TESTS FAILED!\n", failures); else puts("\nALL TESTS PASSED!"); return (failures); } else if (strstr(argv[1], "._tcp")) { /* * Test resolving an mDNS name. */ char resolved[1024]; /* Resolved URI */ printf("_httpResolveURI(%s, _HTTP_RESOLVE_DEFAULT): ", argv[1]); fflush(stdout); if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL)) { puts("FAIL"); return (1); } else printf("PASS (%s)\n", resolved); printf("_httpResolveURI(%s, _HTTP_RESOLVE_FQDN): ", argv[1]); fflush(stdout); if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), _HTTP_RESOLVE_FQDN, NULL, NULL)) { puts("FAIL"); return (1); } else if (strstr(resolved, ".local:")) { printf("FAIL (%s)\n", resolved); return (1); } else { printf("PASS (%s)\n", resolved); return (0); } } else if (!strcmp(argv[1], "-u") && argc == 3) { /* * Test URI separation... */ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, argv[2], scheme, sizeof(scheme), username, sizeof(username), hostname, sizeof(hostname), &port, resource, sizeof(resource)); printf("uri_status = %s\n", uri_status_strings[uri_status + 8]); printf("scheme = \"%s\"\n", scheme); printf("username = \"%s\"\n", username); printf("hostname = \"%s\"\n", hostname); printf("port = %d\n", port); printf("resource = \"%s\"\n", resource); return (0); } /* * Test HTTP GET requests... */ http = NULL; out = stdout; for (i = 1; i < argc; i ++) { int new_auth; if (!strcmp(argv[i], "-o")) { i ++; if (i >= argc) break; out = fopen(argv[i], "wb"); continue; } httpSeparateURI(HTTP_URI_CODING_MOST, argv[i], scheme, sizeof(scheme), username, sizeof(username), hostname, sizeof(hostname), &port, resource, sizeof(resource)); if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || port == 443) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = HTTP_ENCRYPTION_IF_REQUESTED; http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL); if (http == NULL) { perror(hostname); continue; } if (httpIsEncrypted(http)) { cups_array_t *creds; char info[1024]; static const char *trusts[] = { "OK", "Invalid", "Changed", "Expired", "Renewed", "Unknown" }; if (!httpCopyCredentials(http, &creds)) { cups_array_t *lcreds; http_trust_t trust = httpCredentialsGetTrust(creds, hostname); httpCredentialsString(creds, info, sizeof(info)); printf("Count: %d\n", cupsArrayCount(creds)); printf("Trust: %s\n", trusts[trust]); printf("Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(creds))); printf("IsValidName: %d\n", httpCredentialsAreValidForName(creds, hostname)); printf("String: \"%s\"\n", info); printf("LoadCredentials: %d\n", httpLoadCredentials(NULL, &lcreds, hostname)); httpCredentialsString(lcreds, info, sizeof(info)); printf(" Count: %d\n", cupsArrayCount(lcreds)); printf(" String: \"%s\"\n", info); if (lcreds && cupsArrayCount(creds) == cupsArrayCount(lcreds)) { http_credential_t *cred, *lcred; for (i = 1, cred = (http_credential_t *)cupsArrayFirst(creds), lcred = (http_credential_t *)cupsArrayFirst(lcreds); cred && lcred; i ++, cred = (http_credential_t *)cupsArrayNext(creds), lcred = (http_credential_t *)cupsArrayNext(lcreds)) { if (cred->datalen != lcred->datalen) printf(" Credential #%d: Different lengths (saved=%d, current=%d)\n", i, (int)cred->datalen, (int)lcred->datalen); else if (memcmp(cred->data, lcred->data, cred->datalen)) printf(" Credential #%d: Different data\n", i); else printf(" Credential #%d: Matches\n", i); } } if (trust != HTTP_TRUST_OK) { printf("SaveCredentials: %d\n", httpSaveCredentials(NULL, creds, hostname)); trust = httpCredentialsGetTrust(creds, hostname); printf("New Trust: %s\n", trusts[trust]); } httpFreeCredentials(creds); } else puts("No credentials!"); } printf("Checking file \"%s\"...\n", resource); new_auth = 0; do { if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) { httpClearFields(http); if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } } if (http->authstring && !strncmp(http->authstring, "Digest ", 7) && !new_auth) _httpSetDigestAuthString(http, http->nextnonce, "HEAD", resource); httpClearFields(http); httpSetField(http, HTTP_FIELD_AUTHORIZATION, httpGetAuthString(http)); httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en"); if (httpHead(http, resource)) { if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } else { status = HTTP_STATUS_UNAUTHORIZED; continue; } } while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); new_auth = 0; if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... */ httpFlush(http); /* * See if we can do authentication... */ new_auth = 1; if (cupsDoAuthentication(http, "HEAD", resource)) { status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; } if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); if (status == HTTP_STATUS_OK) puts("HEAD OK:"); else printf("HEAD failed with status %d...\n", status); encoding = httpGetContentEncoding(http); printf("Requesting file \"%s\" (Accept-Encoding: %s)...\n", resource, encoding ? encoding : "identity"); new_auth = 0; do { if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_CONNECTION), "close")) { httpClearFields(http); if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } } if (http->authstring && !strncmp(http->authstring, "Digest ", 7) && !new_auth) _httpSetDigestAuthString(http, http->nextnonce, "GET", resource); httpClearFields(http); httpSetField(http, HTTP_FIELD_AUTHORIZATION, httpGetAuthString(http)); httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en"); httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING, encoding); if (httpGet(http, resource)) { if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } else { status = HTTP_STATUS_UNAUTHORIZED; continue; } } while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); new_auth = 0; if (status == HTTP_STATUS_UNAUTHORIZED) { /* * Flush any error message... */ httpFlush(http); /* * See if we can do authentication... */ new_auth = 1; if (cupsDoAuthentication(http, "GET", resource)) { status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; break; } if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } continue; } #ifdef HAVE_SSL else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ httpFlush(http); /* Reconnect... */ if (httpReconnect2(http, 30000, NULL)) { status = HTTP_STATUS_ERROR; break; } /* Upgrade with encryption... */ httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); /* Try again, this time with encryption enabled... */ continue; } #endif /* HAVE_SSL */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); if (status == HTTP_STATUS_OK) puts("GET OK:"); else printf("GET failed with status %d...\n", status); start = time(NULL); length = httpGetLength2(http); total = 0; while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) { total += bytes; fwrite(buffer, (size_t)bytes, 1, out); if (out != stdout) { current = time(NULL); if (current == start) current ++; printf("\r" CUPS_LLFMT "/" CUPS_LLFMT " bytes (" CUPS_LLFMT " bytes/sec) ", CUPS_LLCAST total, CUPS_LLCAST length, CUPS_LLCAST (total / (current - start))); fflush(stdout); } } } if (out != stdout) putchar('\n'); puts("Closing connection to server..."); httpClose(http); if (out != stdout) fclose(out); return (0); } cups-2.3.1/conf/mime.convs.in000664 000765 000024 00000003006 13574721672 016131 0ustar00mikestaff000000 000000 # # DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW # VERSIONS OF CUPS. Instead, create a "local.convs" file that # reflects your local configuration changes. # # Base MIME conversions file for CUPS. # # Copyright © 2007-2016 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # ######################################################################## # # Format of Lines: # # source/type destination/type cost filter # # General Notes: # # The "cost" field is used to find the least costly filters to run # when converting a job file to a printable format. # # All filters *must* accept the standard command-line arguments # (job-id, user, title, copies, options, [filename or stdin]) to # work with CUPS. # ######################################################################## # # PostScript filters # application/postscript application/vnd.cups-postscript 66 pstops ######################################################################## # # Raster filters... # # PWG Raster filter for IPP Everywhere... application/vnd.cups-raster image/pwg-raster 100 rastertopwg application/vnd.cups-raster image/urf 100 rastertopwg ######################################################################## # # Raw filter... # # Uncomment the following filter to allow printing of arbitrary files # without the -oraw option. # @DEFAULT_RAW_PRINTING@application/octet-stream application/vnd.cups-raw 0 - cups-2.3.1/conf/cupsd.conf.in000664 000765 000024 00000014557 13574721672 016132 0ustar00mikestaff000000 000000 # # Configuration file for the CUPS scheduler. See "man cupsd.conf" for a # complete description of this file. # # Log general information in error_log - change "@CUPS_LOG_LEVEL@" to "debug" # for troubleshooting... LogLevel @CUPS_LOG_LEVEL@ @CUPS_PAGE_LOG_FORMAT@ # Only listen for connections from the local machine. Listen localhost:@DEFAULT_IPP_PORT@ @CUPS_LISTEN_DOMAINSOCKET@ # Show shared printers on the local network. Browsing On BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ # Default authentication type, when authentication is required... DefaultAuthType Basic # Web interface setting... WebInterface @CUPS_WEBIF@ # Restrict access to the server... Order allow,deny # Restrict access to the admin pages... Order allow,deny # Restrict access to configuration files... AuthType Default Require user @SYSTEM Order allow,deny # Restrict access to log files... AuthType Default Require user @SYSTEM Order allow,deny # Set the default printer/job policies... # Job/subscription privacy... JobPrivateAccess default JobPrivateValues default SubscriptionPrivateAccess default SubscriptionPrivateValues default # Job-related operations must be done by the owner or an administrator... Order deny,allow Require user @OWNER @SYSTEM Order deny,allow # All administration operations require an administrator to authenticate... AuthType Default Require user @SYSTEM Order deny,allow # All printer operations require a printer operator to authenticate... AuthType Default Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow # Only the owner or an administrator can cancel or authenticate a job... Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow Order deny,allow # Set the authenticated printer/job policies... # Job/subscription privacy... JobPrivateAccess default JobPrivateValues default SubscriptionPrivateAccess default SubscriptionPrivateValues default # Job-related operations must be done by the owner or an administrator... AuthType Default Order deny,allow AuthType Default Require user @OWNER @SYSTEM Order deny,allow # All administration operations require an administrator to authenticate... AuthType Default Require user @SYSTEM Order deny,allow # All printer operations require a printer operator to authenticate... AuthType Default Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow # Only the owner or an administrator can cancel or authenticate a job... AuthType Default Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow Order deny,allow # Set the kerberized printer/job policies... # Job/subscription privacy... JobPrivateAccess default JobPrivateValues default SubscriptionPrivateAccess default SubscriptionPrivateValues default # Job-related operations must be done by the owner or an administrator... AuthType Negotiate Order deny,allow AuthType Negotiate Require user @OWNER @SYSTEM Order deny,allow # All administration operations require an administrator to authenticate... AuthType Default Require user @SYSTEM Order deny,allow # All printer operations require a printer operator to authenticate... AuthType Default Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow # Only the owner or an administrator can cancel or authenticate a job... AuthType Negotiate Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow Order deny,allow cups-2.3.1/conf/Makefile000664 000765 000024 00000004075 13574721672 015172 0ustar00mikestaff000000 000000 # # Configuration file makefile for CUPS. # # Copyright 2007-2015 by Apple Inc. # Copyright 1993-2006 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more information. # include ../Makedefs # # Config files... # KEEP = cups-files.conf cupsd.conf snmp.conf REPLACE = mime.convs mime.types # # Make everything... # all: # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all config and object files... # clean: # # Dummy depend... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: for file in $(KEEP); do \ if test -r $(SERVERROOT)/$$file ; then \ $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.N ; \ else \ $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \ fi ; \ $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.default; \ done $(INSTALL_DIR) -m 755 $(DATADIR)/mime for file in $(REPLACE); do \ if test -r $(DATADIR)/mime/$$file ; then \ $(MV) $(DATADIR)/mime/$$file $(DATADIR)/mime/$$file.O ; \ fi ; \ if test -r $(SERVERROOT)/$$file ; then \ $(MV) $(SERVERROOT)/$$file $(DATADIR)/mime/$$file.O ; \ fi ; \ $(INSTALL_DATA) $$file $(DATADIR)/mime ; \ done -if test x$(PAMDIR) != x; then \ $(INSTALL_DIR) -m 755 $(BUILDROOT)$(PAMDIR); \ if test -r $(BUILDROOT)$(PAMDIR)/cups ; then \ $(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups.N ; \ else \ $(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups ; \ fi ; \ fi # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: for file in $(KEEP) $(REPLACE) cupsd.conf.default; do \ $(RM) $(SERVERROOT)/$$file; \ done -$(RMDIR) $(SERVERROOT) for file in $(REPLACE); do \ $(RM) $(DATADIR)/mime/$$file; \ done -$(RMDIR) $(DATADIR)/mime -if test x$(PAMDIR) != x; then \ $(RM) $(BUILDROOT)$(PAMDIR)/cups; \ $(RMDIR) $(BUILDROOT)$(PAMDIR); \ fi cups-2.3.1/conf/snmp.conf.in000664 000765 000024 00000000230 13574721672 015750 0ustar00mikestaff000000 000000 # # SNMP configuration file for CUPS. See "man cups-snmp.conf" for a complete # description of this file. # @CUPS_SNMP_ADDRESS@ @CUPS_SNMP_COMMUNITY@ cups-2.3.1/conf/pam.securityserver000664 000765 000024 00000000430 13574721672 017316 0ustar00mikestaff000000 000000 # cups: auth account password session auth sufficient pam_securityserver.so auth sufficient pam_unix.so auth required pam_deny.so account required pam_permit.so password required pam_deny.so session required pam_permit.so cups-2.3.1/conf/pam.opendirectory000664 000765 000024 00000000313 13574721672 017106 0ustar00mikestaff000000 000000 # cups: auth account password session auth required pam_opendirectory.so account required pam_permit.so password required pam_deny.so session required pam_permit.so cups-2.3.1/conf/pam.std.in000664 000765 000024 00000000065 13574721672 015423 0ustar00mikestaff000000 000000 auth required @PAMMODAUTH@ account required @PAMMOD@ cups-2.3.1/conf/mime.types000664 000765 000024 00000014100 13574721672 015535 0ustar00mikestaff000000 000000 # # Base MIME types file for CUPS. # # DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW # VERSIONS OF CUPS. Instead, create a "local.types" file that # reflects your local configuration changes. # # Copyright © 2007-2017 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # ######################################################################## # # Format of Lines: # # super/type rules # # "rules" can be any combination of: # # ( expr ) Parenthesis for expression grouping # + Logical AND # , or whitespace Logical OR # ! Logical NOT # match("pattern") Pattern match on filename # extension Pattern match on "*.extension" # ascii(offset,length) True if bytes are valid printable ASCII # (CR, NL, TAB, BS, 32-126) # priority(number) Sets priority of type (0=lowest, # 100=default, 200=highest) # printable(offset,length) True if bytes are printable 8-bit chars # (CR, NL, TAB, BS, 32-126, 128-254) # regex(offset,"regex") True if bytes match regular expression # string(offset,"string") True if bytes are identical to string # istring(offset,"string") True if bytes are identical to # case-insensitive string # char(offset,value) True if byte is identical # short(offset,value) True if 16-bit integer is identical # int(offset,value) True if 32-bit integer is identical # locale("string") True if current locale matches string # contains(offset,range,"string") True if the range contains the string # # General Notes: # # MIME type names are case-insensitive. Internally they are converted # to lowercase. Multiple occurrences of a type will cause the provided # rules to be appended to the existing definition. If two types use the same # rules to resolve a type and have the same priority, e.g. "doc" extension for # "text/bar" and "text/foo", the returned type will be the first type as # sorted in alphanumerically ascending order without regard to case. Thus, # the "text/bar" type will match the "doc" extension first unless the # "text/foo" type has specified a higher priority. # # The "printable" rule differs from the "ascii" rule in that it also # accepts 8-bit characters in the range 128-255. # # String constants must be surrounded by "" if they contain whitespace. # To insert binary data into a string, use the notation. # ######################################################################## # # Application-generated files... # #application/msword doc string(0,) application/pdf pdf regex(0,^[\n\r]*%PDF) application/postscript ai eps ps string(0,%!) string(0,<04>%!) \ contains(0,128,<1B>%-12345X) + \ (contains(0,4096,"LANGUAGE=POSTSCRIPT") \ contains(0,4096,"LANGUAGE = Postscript") \ contains(0,4096,"LANGUAGE = PostScript") \ contains(0,4096,"LANGUAGE = POSTSCRIPT") \ (contains(0,4096,<0a>%!) + \ !contains(0,4096,"ENTER LANGUAGE"))) ######################################################################## # # Image files... # image/gif gif string(0,GIF87a) string(0,GIF89a) image/png png string(0,<89>PNG) image/jpeg jpeg jpg jpe string(0,) +\ (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\ char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\ char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\ char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef)) image/pwg-raster string(0,"RaS2") + string(4,PwgRaster<00>) priority(150) image/tiff tiff tif string(0,MM<002A>) string(0,II<2A00>) image/x-photocd pcd string(2048,PCD_IPI) image/x-portable-anymap pnm image/x-portable-bitmap pbm string(0,P1) string(0,P4) image/x-portable-graymap pgm string(0,P2) string(0,P5) image/x-portable-pixmap ppm string(0,P3) string(0,P6) image/x-sgi-rgb rgb sgi bw icon short(0,474) image/x-xbitmap xbm image/x-xpixmap xpm ascii(0,1024) + string(3,"XPM") #image/x-xwindowdump xwd string(4,<00000007>) image/x-sun-raster ras string(0,<59a66a95>) #image/fpx fpx image/urf urf string(0,UNIRAST<00>) image/x-alias pix short(8,8) short(8,24) image/x-bitmap bmp string(0,BM) + !printable(2,14) image/x-icon ico ######################################################################## # # Text files... # application/x-cshell csh printable(0,1024) + string(0,#!) +\ (contains(2,80,/csh) contains(2,80,/tcsh)) application/x-perl pl printable(0,1024) + string(0,#!) +\ contains(2,80,/perl) application/x-shell sh printable(0,1024) + string(0,#!) +\ (contains(2,80,/bash) contains(2,80,/ksh)\ contains(2,80,/sh) contains(2,80,/zsh)) application/x-csource c cxx cpp cc C h hpp \ printable(0,1024) + ! css + \ (string(0,/*) string(0,//) \ string(0,#include) contains(0,1024,<0a>#include) \ string(0,#define) contains(0,1024,<0a>#define)) text/html html htm printable(0,1024) +\ (istring(0,"") istring(0,")) string(0,"2SaR") \ string(0,"RaS3") string(0,"3SaR") application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \ string(0,<1B>@) \ (contains(0,128,<1B>%-12345X) + \ (contains(0,4096,"LANGUAGE=PCL") \ contains(0,4096,"LANGUAGE = PCL"))) ######################################################################## # # Raw print file support... # # Comment the following type to prevent raw file printing. # application/octet-stream cups-2.3.1/conf/cups-files.conf.in000664 000765 000024 00000006043 13574721672 017055 0ustar00mikestaff000000 000000 # # File/directory/user/group configuration file for the CUPS scheduler. # See "man cups-files.conf" for a complete description of this file. # # List of events that are considered fatal errors for the scheduler... #FatalErrors @CUPS_FATAL_ERRORS@ # Do we call fsync() after writing configuration or status files? #SyncOnClose No # Default user and group for filters/backends/helper programs; this cannot be # any user or group that resolves to ID 0 for security reasons... #User @CUPS_USER@ #Group @CUPS_GROUP@ # Administrator user group, used to match @SYSTEM in cupsd.conf policy rules... # This cannot contain the Group value for security reasons... SystemGroup @CUPS_SYSTEM_GROUPS@ @CUPS_SYSTEM_AUTHKEY@ # User that is substituted for unauthenticated (remote) root accesses... #RemoteRoot remroot # Do we allow file: device URIs other than to /dev/null? #FileDevice No # Permissions for configuration and log files... #ConfigFilePerm 0@CUPS_CONFIG_FILE_PERM@ #LogFilePerm 0@CUPS_LOG_FILE_PERM@ # Location of the file logging all access to the scheduler; may be the name # "syslog". If not an absolute path, the value of ServerRoot is used as the # root directory. Also see the "AccessLogLevel" directive in cupsd.conf. AccessLog @CUPS_LOGDIR@/access_log # Location of cache files used by the scheduler... #CacheDir @CUPS_CACHEDIR@ # Location of data files used by the scheduler... #DataDir @CUPS_DATADIR@ # Location of the static web content served by the scheduler... #DocumentRoot @CUPS_DOCROOT@ # Location of the file logging all messages produced by the scheduler and any # helper programs; may be the name "syslog". If not an absolute path, the value # of ServerRoot is used as the root directory. Also see the "LogLevel" # directive in cupsd.conf. ErrorLog @CUPS_LOGDIR@/error_log # Location of fonts used by older print filters... #FontPath @CUPS_FONTPATH@ # Location of LPD configuration #LPDConfigFile @CUPS_DEFAULT_LPD_CONFIG_FILE@ # Location of the file logging all pages printed by the scheduler and any # helper programs; may be the name "syslog". If not an absolute path, the value # of ServerRoot is used as the root directory. Also see the "PageLogFormat" # directive in cupsd.conf. PageLog @CUPS_LOGDIR@/page_log # Location of the file listing all of the local printers... #Printcap @CUPS_DEFAULT_PRINTCAP@ # Format of the Printcap file... #PrintcapFormat bsd #PrintcapFormat plist #PrintcapFormat solaris # Location of all spool files... #RequestRoot @CUPS_REQUESTS@ # Location of helper programs... #ServerBin @CUPS_SERVERBIN@ # SSL/TLS keychain for the scheduler... #ServerKeychain @CUPS_SERVERKEYCHAIN@ # Location of other configuration files... #ServerRoot @CUPS_SERVERROOT@ # Location of Samba configuration file... #SMBConfigFile @CUPS_DEFAULT_SMB_CONFIG_FILE@ # Location of scheduler state files... #StateDir @CUPS_STATEDIR@ # Location of scheduler/helper temporary files. This directory is emptied on # scheduler startup and cannot be one of the standard (public) temporary # directory locations for security reasons... #TempDir @CUPS_REQUESTS@/tmp cups-2.3.1/conf/pam.common000664 000765 000024 00000000105 13574721672 015507 0ustar00mikestaff000000 000000 @include common-auth @include common-account @include common-session cups-2.3.1/data/label.h000664 000765 000024 00000001270 13574721672 014740 0ustar00mikestaff000000 000000 /* * This file contains model number definitions for the CUPS sample * label printer driver. * * Copyright 2007 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #define DYMO_3x0 0 /* Dymo Labelwriter 300/330/330 Turbo */ #define ZEBRA_EPL_LINE 0x10 /* Zebra EPL line mode printers */ #define ZEBRA_EPL_PAGE 0x11 /* Zebra EPL page mode printers */ #define ZEBRA_ZPL 0x12 /* Zebra ZPL-based printers */ #define ZEBRA_CPCL 0x13 /* Zebra CPCL-based printers */ #define INTELLITECH_PCL 0x20 /* Intellitech PCL-based printers */ cups-2.3.1/data/cups.suse000664 000765 000024 00000000107 13574721672 015361 0ustar00mikestaff000000 000000 auth required pam_unix2.so nullok shadow account required pam_unix2.so cups-2.3.1/data/Makefile000664 000765 000024 00000002537 13574721672 015157 0ustar00mikestaff000000 000000 # # Datafile makefile for CUPS. # # Copyright 2007-2014 by Apple Inc. # Copyright 1993-2006 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more information. # include ../Makedefs # # Data files... # PPDCFILES = \ epson.h \ font.defs \ hp.h \ label.h \ media.defs \ raster.defs # # Make everything... # all: # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all config and object files... # clean: # # Dummy depend... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: $(INSTALL_DIR) -m 755 $(DATADIR)/banners $(INSTALL_DIR) -m 755 $(DATADIR)/data $(INSTALL_DIR) -m 755 $(DATADIR)/model $(INSTALL_DIR) -m 755 $(DATADIR)/ppdc for file in $(PPDCFILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/ppdc; \ done $(INSTALL_DIR) -m 755 $(DATADIR)/profiles # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: for file in $(PPDCFILES); do \ $(RM) $(DATADIR)/ppdc/$$file; \ done -$(RMDIR) $(DATADIR)/profiles -$(RMDIR) $(DATADIR)/ppdc -$(RMDIR) $(DATADIR)/model -$(RMDIR) $(DATADIR)/data -$(RMDIR) $(DATADIR)/banners -$(RMDIR) $(DATADIR) cups-2.3.1/data/smiley.ps000664 000765 000024 00000001034 13574721672 015354 0ustar00mikestaff000000 000000 %!PS-Adobe-3.0 %%BoundingBox: 36 36 576 756 %%Pages: 1 %%LanguageLevel: 2 %%EndComments %%Page: (1) 1 % Draw a black box around the page 0 setgray 1 setlinewidth 36 36 540 720 rectstroke % Draw a two inch blue circle in the middle of the page 0 0 1 setrgbcolor 306 396 144 0 360 arc closepath fill % Draw two half inch yellow circles for eyes 1 1 0 setrgbcolor 252 432 36 0 360 arc closepath fill 360 432 36 0 360 arc closepath fill % Draw the smile 1 setlinecap 18 setlinewidth 306 396 99 200 340 arc stroke % Print it! showpage %%EOF cups-2.3.1/data/cups.irix000664 000765 000024 00000000127 13574721672 015357 0ustar00mikestaff000000 000000 #%PAM-1.0 auth required pam_unix.so shadow nodelay nullok account required pam_unix.so cups-2.3.1/data/cups.pam000664 000765 000024 00000000141 13574721672 015155 0ustar00mikestaff000000 000000 auth required /lib/security/pam_pwdb.so nullok shadow account required /lib/security/pam_pwdb.so cups-2.3.1/data/raster.defs000664 000765 000024 00000007305 13574721672 015660 0ustar00mikestaff000000 000000 /* * This file contains the standard definitions for enumerated attributes * in the CUPS raster page device dictionary. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* Jog values */ #define CUPS_JOG_NONE 0 /* Never move pages */ #define CUPS_JOG_FILE 1 /* Move pages after this file */ #define CUPS_JOG_JOB 2 /* Move pages after this job */ #define CUPS_JOG_SET 3 /* Move pages after this set */ /* Orientation values */ #define CUPS_ORIENT_0 0 /* Don't rotate the page */ #define CUPS_ORIENT_90 1 /* Rotate the page counter-clockwise */ #define CUPS_ORIENT_180 2 /* Turn the page upside down */ #define CUPS_ORIENT_270 3 /* Rotate the page clockwise */ /* CutMedia values */ #define CUPS_CUT_NONE 0 /* Never cut the roll */ #define CUPS_CUT_FILE 1 /* Cut the roll after this file */ #define CUPS_CUT_JOB 2 /* Cut the roll after this job */ #define CUPS_CUT_SET 3 /* Cut the roll after this set */ #define CUPS_CUT_PAGE 4 /* Cut the roll after this page */ /* AdvanceMedia values */ #define CUPS_ADVANCE_NONE 0 /* Never advance the roll */ #define CUPS_ADVANCE_FILE 1 /* Advance the roll after this file */ #define CUPS_ADVANCE_JOB 2 /* Advance the roll after this job */ #define CUPS_ADVANCE_SET 3 /* Advance the roll after this set */ #define CUPS_ADVANCE_PAGE 4 /* Advance the roll after this page */ /* LeadingEdge values */ #define CUPS_EDGE_TOP 0 /* Leading edge is the top of the page */ #define CUPS_EDGE_RIGHT 1 /* Leading edge is the right of the page */ #define CUPS_EDGE_BOTTOM 2 /* Leading edge is the bottom of the page */ #define CUPS_EDGE_LEFT 3 /* Leading edge is the left of the page */ /* cupsColorOrder values */ #define CUPS_ORDER_CHUNKED 0 /* CMYK CMYK CMYK ... */ #define CUPS_ORDER_BANDED 1 /* CCC MMM YYY KKK ... */ #define CUPS_ORDER_PLANAR 2 /* CCC ... MMM ... YYY ... KKK ... */ /* cupsColorSpace values */ #define CUPS_CSPACE_W 0 /* Luminance */ #define CUPS_CSPACE_RGB 1 /* Red, green, blue */ #define CUPS_CSPACE_RGBA 2 /* Red, green, blue, alpha */ #define CUPS_CSPACE_K 3 /* Black */ #define CUPS_CSPACE_CMY 4 /* Cyan, magenta, yellow */ #define CUPS_CSPACE_YMC 5 /* Yellow, magenta, cyan */ #define CUPS_CSPACE_CMYK 6 /* Cyan, magenta, yellow, black */ #define CUPS_CSPACE_YMCK 7 /* Yellow, magenta, cyan, black */ #define CUPS_CSPACE_KCMY 8 /* Black, cyan, magenta, yellow */ #define CUPS_CSPACE_KCMYcm 9 /* Black, cyan, magenta, yellow, * * light-cyan, light-magenta */ #define CUPS_CSPACE_GMCK 10 /* Gold, magenta, yellow, black */ #define CUPS_CSPACE_GMCS 11 /* Gold, magenta, yellow, silver */ #define CUPS_CSPACE_WHITE 12 /* White ink (as black) */ #define CUPS_CSPACE_GOLD 13 /* Gold foil */ #define CUPS_CSPACE_SILVER 14 /* Silver foil */ #define CUPS_CSPACE_CIEXYZ 15 /* CIE XYZ */ #define CUPS_CSPACE_CIELab 16 /* CIE Lab */ #define CUPS_CSPACE_ICC1 32 /* ICC-based, 1 color */ #define CUPS_CSPACE_ICC2 33 /* ICC-based, 2 colors */ #define CUPS_CSPACE_ICC3 34 /* ICC-based, 3 colors */ #define CUPS_CSPACE_ICC4 35 /* ICC-based, 4 colors */ #define CUPS_CSPACE_ICC5 36 /* ICC-based, 5 colors */ #define CUPS_CSPACE_ICC6 37 /* ICC-based, 6 colors */ #define CUPS_CSPACE_ICC7 38 /* ICC-based, 7 colors */ #define CUPS_CSPACE_ICC8 39 /* ICC-based, 8 colors */ #define CUPS_CSPACE_ICC9 40 /* ICC-based, 9 colors */ #define CUPS_CSPACE_ICCA 41 /* ICC-based, 10 colors */ #define CUPS_CSPACE_ICCB 42 /* ICC-based, 11 colors */ #define CUPS_CSPACE_ICCC 43 /* ICC-based, 12 colors */ #define CUPS_CSPACE_ICCD 44 /* ICC-based, 13 colors */ #define CUPS_CSPACE_ICCE 45 /* ICC-based, 14 colors */ #define CUPS_CSPACE_ICCF 46 /* ICC-based, 15 colors */ cups-2.3.1/data/hp.h000664 000765 000024 00000000640 13574721672 014270 0ustar00mikestaff000000 000000 /* * This file contains model number definitions for the CUPS sample * HP driver. * * Copyright 2007 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #define HP_LASERJET 0 /* HP LaserJet */ #define HP_DESKJET 1 /* HP DeskJet with simple color */ #define HP_DESKJET2 2 /* HP DeskJet with CRet color */ cups-2.3.1/data/font.defs000664 000765 000024 00000004172 13574721672 015325 0ustar00mikestaff000000 000000 /* * Standard font definitions for the CUPS PPD file compiler. * * Copyright © 2007 by Apple Inc. * Copyright © 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #font AvantGarde-Book Standard "(1.05)" Standard ROM #font AvantGarde-BookOblique Standard "(1.05)" Standard ROM #font AvantGarde-Demi Standard "(1.05)" Standard ROM #font AvantGarde-DemiOblique Standard "(1.05)" Standard ROM #font Bookman-Demi Standard "(1.05)" Standard ROM #font Bookman-DemiItalic Standard "(1.05)" Standard ROM #font Bookman-Light Standard "(1.05)" Standard ROM #font Bookman-LightItalic Standard "(1.05)" Standard ROM #font Courier Standard "(1.05)" Standard ROM #font Courier-Bold Standard "(1.05)" Standard ROM #font Courier-BoldOblique Standard "(1.05)" Standard ROM #font Courier-Oblique Standard "(1.05)" Standard ROM #font Helvetica Standard "(1.05)" Standard ROM #font Helvetica-Bold Standard "(1.05)" Standard ROM #font Helvetica-BoldOblique Standard "(1.05)" Standard ROM #font Helvetica-Narrow Standard "(1.05)" Standard ROM #font Helvetica-Narrow-Bold Standard "(1.05)" Standard ROM #font Helvetica-Narrow-BoldOblique Standard "(1.05)" Standard ROM #font Helvetica-Narrow-Oblique Standard "(1.05)" Standard ROM #font Helvetica-Oblique Standard "(1.05)" Standard ROM #font NewCenturySchlbk-Bold Standard "(1.05)" Standard ROM #font NewCenturySchlbk-BoldItalic Standard "(1.05)" Standard ROM #font NewCenturySchlbk-Italic Standard "(1.05)" Standard ROM #font NewCenturySchlbk-Roman Standard "(1.05)" Standard ROM #font Palatino-Bold Standard "(1.05)" Standard ROM #font Palatino-BoldItalic Standard "(1.05)" Standard ROM #font Palatino-Italic Standard "(1.05)" Standard ROM #font Palatino-Roman Standard "(1.05)" Standard ROM #font Symbol Special "(001.005)" Special ROM #font Times-Bold Standard "(1.05)" Standard ROM #font Times-BoldItalic Standard "(1.05)" Standard ROM #font Times-Italic Standard "(1.05)" Standard ROM #font Times-Roman Standard "(1.05)" Standard ROM #font ZapfChancery-MediumItalic Standard "(1.05)" Standard ROM #font ZapfDingbats Special "(001.005)" Special ROM cups-2.3.1/data/epson.h000664 000765 000024 00000001123 13574721672 015002 0ustar00mikestaff000000 000000 /* * This file contains model number definitions for the CUPS sample * ESC/P driver. * * Copyright 2007 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #define EPSON_9PIN 0 /* 9-pin dot matrix */ #define EPSON_24PIN 1 /* 24-pin dot matrix */ #define EPSON_COLOR 2 /* Epson Stylus Color with ESC . */ #define EPSON_PHOTO 3 /* Epson Stylus Photo with ESC . */ #define EPSON_ICOLOR 4 /* Epson Stylus Color with ESC i */ #define EPSON_IPHOTO 5 /* Epson Stylus Photo with ESC i */ cups-2.3.1/data/media.defs000664 000765 000024 00000016334 13574721672 015441 0ustar00mikestaff000000 000000 /* * Adobe standard media size definitions for the CUPS PPD file compiler. * * Copyright © 2007-2016 by Apple Inc. * Copyright © 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #media "3x5/3 x 5" 216 360 #media "3.5x5/3.5 x 5" 252 360 #media "5x7/5 x 7" 360 504 #media "10x11/10 x 11" 720 792 #media "10x13/10 x 13" 720 936 #media "10x14/10 x 14" 720 1008 #media "12x11/12 x 11" 864 792 #media "15x11/15 x 11" 1080 792 #media "7x9/7 x 9" 504 648 #media "8x10/8 x 10" 576 720 #media "9x11/9 x 11" 648 792 #media "9x12/9 x 12" 648 864 #media "A0/A0" 2384 3370 #media "A0.Transverse/A0 Long Edge" 3370 2384 #media "A1/A1" 1684 2384 #media "A1.Transverse/A1 Long Edge" 2384 1684 #media "A2/A2" 1191 1684 #media "A2.Transverse/A2 Long Edge" 1684 1191 #media "A3/A3" 842 1191 #media "A3.Transverse/A3 Long Edge" 1191 842 #media "A3Extra/A3 Oversize" 913 1262 #media "A3Extra.Transverse/A3 Oversize Long Edge" 913 1262 #media "A3Rotated/A3 Long Edge" 1191 842 #media "A4/A4" 595 842 #media "A4Extra/A4 Oversize" 667 914 #media "A4Plus/A4 Oversize" 595 936 #media "A4Rotated/A4 Long Edge" 842 595 #media "A4Small/A4 Small" 595 842 #media "A4.Transverse/A4 Long Edge" 842 595 #media "A5/A5" 420 595 #media "A5Extra/A5 Oversize" 492 668 #media "A5Rotated/A5 Long Edge" 595 420 #media "A5.Transverse/A5 Long Edge" 595 420 #media "A6/A6" 297 420 #media "A6Rotated/A6 Long Edge" 420 297 #media "A7/A7" 210 297 #media "A8/A8" 148 210 #media "A9/A9" 105 148 #media "A10/A10" 73 105 #media "AnsiA/ANSI A" 612 792 #media "AnsiB/ANSI B" 792 1224 #media "AnsiC/ANSI C" 1224 1584 #media "AnsiD/ANSI D" 1584 2448 #media "AnsiE/ANSI E" 2448 3168 #media "ARCHA/Letter Oversize" 648 864 #media "ARCHA.Transverse/Letter Oversize Long Edge" 864 648 #media "ARCHB/Tabloid Oversize" 864 1296 #media "ARCHB.Transverse/Tabloid Oversize Long Edge" 1296 864 #media "ARCHC/ARCH C" 1296 1728 #media "ARCHC.Transverse/ARCH C Long Edge" 1728 1296 #media "ARCHD/ARCH D" 1728 2592 #media "ARCHD.Transverse/ARCH D Long Edge" 2592 1728 #media "ARCHE/ARCH E" 2592 3456 #media "ARCHE.Transverse/ARCH E Long Edge" 3456 2592 #media "B0/JIS B0" 2920 4127 #media "B10/JIS B10" 91 127 #media "B1/JIS B1" 2064 2918 #media "B1/JIS B1" 2064 2920 #media "B2/JIS B2" 1460 2064 #media "B3/JIS B3" 1032 1460 #media "B4/JIS B4" 729 1032 #media "B4Rotated/JIS B4 Long Edge" 1032 729 #media "B5/JIS B5" 516 729 #media "B5Rotated/JIS B5 Long Edge" 729 516 #media "B5.Transverse/JIS B5 Long Edge" 516 729 #media "B6/JIS B6" 363 516 #media "B6Rotated/JIS B6 Long Edge" 516 363 #media "B7/JIS B7" 258 363 #media "B8/JIS B8" 181 258 #media "B9/JIS B9" 127 181 #media "C4/Envelope C4" 649 918 #media "C5/Envelope C5" 459 649 #media "C6/Envelope C6" 323 459 #media "DL/Envelope DL" 312 624 #media "DoublePostcard/Postcard Double" 567 420 #media "DoublePostcardRotated/Postcard Double Long Edge" 420 567 #media "Env10/Envelope #10" 297 684 #media "Env11/Envelope #11" 324 747 #media "Env12/Envelope #12" 342 792 #media "Env14/Envelope #14" 360 828 #media "Env9/Envelope #9" 279 639 #media "EnvC0/Envelope C0" 2599 3676 #media "EnvC1/Envelope C1" 1837 2599 #media "EnvC2/Envelope C2" 1298 1837 #media "EnvC3/Envelope C3" 918 1296 #media "EnvC4/Envelope C4" 649 918 #media "EnvC5/Envelope C5" 459 649 #media "EnvC65/Envelope C65" 324 648 #media "EnvC6/Envelope C6" 323 459 #media "EnvC7/Envelope C7" 230 323 #media "EnvChou3/Envelope Choukei 3" 340 666 #media "EnvChou3Rotated/Envelope Choukei 3 Long Edge" 666 340 #media "EnvChou4/Envelope Choukei 4" 255 581 #media "EnvChou4Rotated/Envelope Choukei 4 Long Edge" 581 255 #media "EnvDL/Envelope DL" 312 624 #media "EnvInvite/Envelope Invite" 624 624 #media "EnvISOB4/Envelope B4" 708 1001 #media "EnvISOB5/Envelope B5" 499 709 #media "EnvISOB6/Envelope B6" 499 354 #media "EnvItalian/Envelope Italian" 312 652 #media "EnvKaku2/Envelope Kaku2" 680 941 #media "EnvKaku2Rotated/Envelope Kaku2 Long Edge" 941 680 #media "EnvKaku3/Envelope Kaku3" 612 785 #media "EnvKaku3Rotated/Envelope Kaku3 Long Edge" 785 612 #media "EnvMonarch/Envelope Monarch" 279 540 #media "EnvPersonal/Envelope Personal" 261 468 #media "EnvPRC1/Envelope PRC1" 289 468 #media "EnvPRC1Rotated/Envelope PRC1 Long Edge" 468 289 #media "EnvPRC2/Envelope PRC2" 289 499 #media "EnvPRC2Rotated/Envelope PRC2 Long Edge" 499 289 #media "EnvPRC3/Envelope PRC3" 354 499 #media "EnvPRC3Rotated/Envelope PRC3 Long Edge" 499 354 #media "EnvPRC4/Envelope PRC4" 312 590 #media "EnvPRC4Rotated/Envelope PRC4 Long Edge" 590 312 #media "EnvPRC5/Envelope PRC5PRC5" 312 624 #media "EnvPRC5Rotated/Envelope PRC5 Long Edge" 624 312 #media "EnvPRC6/Envelope PRC6" 340 652 #media "EnvPRC6Rotated/Envelope PRC6 Long Edge" 652 340 #media "EnvPRC7/Envelope PRC7" 454 652 #media "EnvPRC7Rotated/Envelope PRC7 Long Edge" 652 454 #media "EnvPRC8/Envelope PRC8" 340 876 #media "EnvPRC8Rotated/Envelope PRC8 Long Edge" 876 340 #media "EnvPRC9/Envelope PRC9" 649 918 #media "EnvPRC9Rotated/Envelope PRC9 Long Edge" 918 649 #media "EnvPRC10/Envelope PRC10" 918 1298 #media "EnvPRC10Rotated/Envelope PRC10 Long Edge" 1298 918 #media "EnvYou4/Envelope You4" 298 666 #media "EnvYou4Rotated/Envelope You4 Long Edge" 666 298 #media "Executive/Executive" 522 756 #media "FanFoldGerman/European Fanfold" 612 864 #media "FanFoldGermanLegal/European Fanfold Legal" 612 936 #media "FanFoldUS/US Fanfold" 1071 792 #media "Folio/Folio" 595 935 #media "ISOB0/B0" 2835 4008 #media "ISOB1/B1" 2004 2835 #media "ISOB2/B2" 1417 2004 #media "ISOB3/B3" 1001 1417 #media "ISOB4/B4" 709 1001 #media "ISOB5/B5" 499 709 #media "ISOB5Extra/B5 Oversize" 570 782 #media "ISOB6/B6" 354 499 #media "ISOB7/B7" 249 354 #media "ISOB8/B8" 176 249 #media "ISOB9/B9" 125 176 #media "ISOB10/B10" 88 125 #media "Ledger/US Ledger" 1224 792 #media "Legal/US Legal" 612 1008 #media "LegalExtra/US Legal Oversize" 684 1080 #media "Letter/US Letter" 612 792 #media "Letter.Transverse/US Letter Long Edge" 792 612 #media "LetterExtra/US Letter Oversize" 684 864 #media "LetterExtra.Transverse/US Letter Oversize Long Edge" 864 684 #media "LetterPlus/US Letter Oversize" 612 914 #media "LetterRotated/US Letter Long Edge" 792 612 #media "LetterSmall/US Letter Small" 612 792 #media "Monarch/Envelope Monarch" 279 540 #media "Note/Note" 612 792 #media "Postcard/Postcard" 284 419 #media "PostcardRotated/Postcard Long Edge" 419 284 #media "PRC16K/PRC16K" 414 610 #media "PRC16KRotated/PRC16K Long Edge" 610 414 #media "PRC32K/PRC32K" 275 428 #media "PRC32KBig/PRC32K Oversize" 275 428 #media "PRC32KBigRotated/PRC32K Oversize Long Edge" 428 275 #media "PRC32KRotated/PRC32K Long Edge" 428 275 #media "Quarto/Quarto" 610 780 #media "Statement/Statement" 396 612 #media "SuperA/Super A" 643 1009 #media "SuperB/Super B" 864 1380 #media "Tabloid/Tabloid" 792 1224 #media "TabloidExtra/Tabloid Oversize" 864 1296 /* * Non-standard sizes... */ #media "Photo4x6/Photo" 288 432 #media "PhotoLabel/Photo Labels" 288 468 #media "w936h1368/Super B/A3" 936 1368 #media "w81h252/Address" 81 252 #media "w101h252/Large Address" 101 252 #media "w54h144/Return Address" 54 144 #media "w167h288/Shipping Address" 167 288 #media "w162h540/Internet Postage 2-Part" 162 540 #media "w162h504/Internet Postage 3-Part" 162 504 #media "w41h248/File Folder" 41 248 #media "w41h144/Hanging Folder" 41 144 #media "w153h198/3.5\" Disk" 153 198 cups-2.3.1/filter/common.c000664 000765 000024 00000026535 13574721672 015533 0ustar00mikestaff000000 000000 /* * Common filter routines for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "common.h" #include /* * Globals... */ int Orientation = 0, /* 0 = portrait, 1 = landscape, etc. */ Duplex = 0, /* Duplexed? */ LanguageLevel = 1, /* Language level of printer */ ColorDevice = 1; /* Do color text? */ float PageLeft = 18.0f, /* Left margin */ PageRight = 594.0f, /* Right margin */ PageBottom = 36.0f, /* Bottom margin */ PageTop = 756.0f, /* Top margin */ PageWidth = 612.0f, /* Total page width */ PageLength = 792.0f; /* Total page length */ /* * 'SetCommonOptions()' - Set common filter options for media size, etc. */ ppd_file_t * /* O - PPD file */ SetCommonOptions( int num_options, /* I - Number of options */ cups_option_t *options, /* I - Options */ int change_size) /* I - Change page size? */ { ppd_file_t *ppd; /* PPD file */ ppd_size_t *pagesize; /* Current page size */ const char *val; /* Option value */ #ifdef LC_TIME setlocale(LC_TIME, ""); #endif /* LC_TIME */ ppd = ppdOpenFile(getenv("PPD")); ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); if ((pagesize = ppdPageSize(ppd, NULL)) != NULL) { PageWidth = pagesize->width; PageLength = pagesize->length; PageTop = pagesize->top; PageBottom = pagesize->bottom; PageLeft = pagesize->left; PageRight = pagesize->right; fprintf(stderr, "DEBUG: Page = %.0fx%.0f; %.0f,%.0f to %.0f,%.0f\n", PageWidth, PageLength, PageLeft, PageBottom, PageRight, PageTop); } if (ppd != NULL) { ColorDevice = ppd->color_device; LanguageLevel = ppd->language_level; } if ((val = cupsGetOption("landscape", num_options, options)) != NULL) { if (_cups_strcasecmp(val, "no") != 0 && _cups_strcasecmp(val, "off") != 0 && _cups_strcasecmp(val, "false") != 0) { if (ppd && ppd->landscape > 0) Orientation = 1; else Orientation = 3; } } else if ((val = cupsGetOption("orientation-requested", num_options, options)) != NULL) { /* * Map IPP orientation values to 0 to 3: * * 3 = 0 degrees = 0 * 4 = 90 degrees = 1 * 5 = -90 degrees = 3 * 6 = 180 degrees = 2 */ Orientation = atoi(val) - 3; if (Orientation >= 2) Orientation ^= 1; } if ((val = cupsGetOption("page-left", num_options, options)) != NULL) { switch (Orientation & 3) { case 0 : PageLeft = (float)atof(val); break; case 1 : PageBottom = (float)atof(val); break; case 2 : PageRight = PageWidth - (float)atof(val); break; case 3 : PageTop = PageLength - (float)atof(val); break; } } if ((val = cupsGetOption("page-right", num_options, options)) != NULL) { switch (Orientation & 3) { case 0 : PageRight = PageWidth - (float)atof(val); break; case 1 : PageTop = PageLength - (float)atof(val); break; case 2 : PageLeft = (float)atof(val); break; case 3 : PageBottom = (float)atof(val); break; } } if ((val = cupsGetOption("page-bottom", num_options, options)) != NULL) { switch (Orientation & 3) { case 0 : PageBottom = (float)atof(val); break; case 1 : PageLeft = (float)atof(val); break; case 2 : PageTop = PageLength - (float)atof(val); break; case 3 : PageRight = PageWidth - (float)atof(val); break; } } if ((val = cupsGetOption("page-top", num_options, options)) != NULL) { switch (Orientation & 3) { case 0 : PageTop = PageLength - (float)atof(val); break; case 1 : PageRight = PageWidth - (float)atof(val); break; case 2 : PageBottom = (float)atof(val); break; case 3 : PageLeft = (float)atof(val); break; } } if (change_size) UpdatePageVars(); if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble") || ppdIsMarked(ppd, "Duplex", "DuplexTumble") || ppdIsMarked(ppd, "JCLDuplex", "DuplexNoTumble") || ppdIsMarked(ppd, "JCLDuplex", "DuplexTumble") || ppdIsMarked(ppd, "EFDuplex", "DuplexNoTumble") || ppdIsMarked(ppd, "EFDuplex", "DuplexTumble") || ppdIsMarked(ppd, "KD03Duplex", "DuplexNoTumble") || ppdIsMarked(ppd, "KD03Duplex", "DuplexTumble")) Duplex = 1; return (ppd); } /* * 'UpdatePageVars()' - Update the page variables for the orientation. */ void UpdatePageVars(void) { float temp; /* Swapping variable */ switch (Orientation & 3) { case 0 : /* Portait */ break; case 1 : /* Landscape */ temp = PageLeft; PageLeft = PageBottom; PageBottom = temp; temp = PageRight; PageRight = PageTop; PageTop = temp; temp = PageWidth; PageWidth = PageLength; PageLength = temp; break; case 2 : /* Reverse Portrait */ temp = PageWidth - PageLeft; PageLeft = PageWidth - PageRight; PageRight = temp; temp = PageLength - PageBottom; PageBottom = PageLength - PageTop; PageTop = temp; break; case 3 : /* Reverse Landscape */ temp = PageWidth - PageLeft; PageLeft = PageWidth - PageRight; PageRight = temp; temp = PageLength - PageBottom; PageBottom = PageLength - PageTop; PageTop = temp; temp = PageLeft; PageLeft = PageBottom; PageBottom = temp; temp = PageRight; PageRight = PageTop; PageTop = temp; temp = PageWidth; PageWidth = PageLength; PageLength = temp; break; } } /* * 'WriteCommon()' - Write common procedures... */ void WriteCommon(void) { puts("% x y w h ESPrc - Clip to a rectangle.\n" "userdict/ESPrc/rectclip where{pop/rectclip load}\n" "{{newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath clip newpath}bind}ifelse put"); puts("% x y w h ESPrf - Fill a rectangle.\n" "userdict/ESPrf/rectfill where{pop/rectfill load}\n" "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath fill grestore}bind}ifelse put"); puts("% x y w h ESPrs - Stroke a rectangle.\n" "userdict/ESPrs/rectstroke where{pop/rectstroke load}\n" "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath stroke grestore}bind}ifelse put"); } /* * 'WriteLabelProlog()' - Write the prolog with the classification * and page label. */ void WriteLabelProlog(const char *label, /* I - Page label */ float bottom, /* I - Bottom position in points */ float top, /* I - Top position in points */ float width) /* I - Width in points */ { const char *classification; /* CLASSIFICATION environment variable */ const char *ptr; /* Temporary string pointer */ /* * First get the current classification... */ if ((classification = getenv("CLASSIFICATION")) == NULL) classification = ""; if (strcmp(classification, "none") == 0) classification = ""; /* * If there is nothing to show, bind an empty 'write labels' procedure * and return... */ if (!classification[0] && (label == NULL || !label[0])) { puts("userdict/ESPwl{}bind put"); return; } /* * Set the classification + page label string... */ printf("userdict"); if (strcmp(classification, "confidential") == 0) printf("/ESPpl(CONFIDENTIAL"); else if (strcmp(classification, "classified") == 0) printf("/ESPpl(CLASSIFIED"); else if (strcmp(classification, "secret") == 0) printf("/ESPpl(SECRET"); else if (strcmp(classification, "topsecret") == 0) printf("/ESPpl(TOP SECRET"); else if (strcmp(classification, "unclassified") == 0) printf("/ESPpl(UNCLASSIFIED"); else { printf("/ESPpl("); for (ptr = classification; *ptr; ptr ++) if (*ptr < 32 || *ptr > 126) printf("\\%03o", *ptr); else if (*ptr == '_') putchar(' '); else { if (*ptr == '(' || *ptr == ')' || *ptr == '\\') putchar('\\'); putchar(*ptr); } } if (label) { if (classification[0]) printf(" - "); /* * Quote the label string as needed... */ for (ptr = label; *ptr; ptr ++) if (*ptr < 32 || *ptr > 126) printf("\\%03o", *ptr); else { if (*ptr == '(' || *ptr == ')' || *ptr == '\\') putchar('\\'); putchar(*ptr); } } puts(")put"); /* * Then get a 14 point Helvetica-Bold font... */ puts("userdict/ESPpf /Helvetica-Bold findfont 14 scalefont put"); /* * Finally, the procedure to write the labels on the page... */ puts("userdict/ESPwl{"); puts(" ESPpf setfont"); printf(" ESPpl stringwidth pop dup 12 add exch -0.5 mul %.0f add\n", width * 0.5f); puts(" 1 setgray"); printf(" dup 6 sub %.0f 3 index 20 ESPrf\n", bottom - 2.0); printf(" dup 6 sub %.0f 3 index 20 ESPrf\n", top - 18.0); puts(" 0 setgray"); printf(" dup 6 sub %.0f 3 index 20 ESPrs\n", bottom - 2.0); printf(" dup 6 sub %.0f 3 index 20 ESPrs\n", top - 18.0); printf(" dup %.0f moveto ESPpl show\n", bottom + 2.0); printf(" %.0f moveto ESPpl show\n", top - 14.0); puts("pop"); puts("}bind put"); } /* * 'WriteLabels()' - Write the actual page labels. */ void WriteLabels(int orient) /* I - Orientation of the page */ { float width, /* Width of page */ length; /* Length of page */ puts("gsave"); if ((orient ^ Orientation) & 1) { width = PageLength; length = PageWidth; } else { width = PageWidth; length = PageLength; } switch (orient & 3) { case 1 : /* Landscape */ printf("%.1f 0.0 translate 90 rotate\n", length); break; case 2 : /* Reverse Portrait */ printf("%.1f %.1f translate 180 rotate\n", width, length); break; case 3 : /* Reverse Landscape */ printf("0.0 %.1f translate -90 rotate\n", width); break; } puts("ESPwl"); puts("grestore"); } /* * 'WriteTextComment()' - Write a DSC text comment. */ void WriteTextComment(const char *name, /* I - Comment name ("Title", etc.) */ const char *value) /* I - Comment value */ { int len; /* Current line length */ /* * DSC comments are of the form: * * %%name: value * * The name and value must be limited to 7-bit ASCII for most printers, * so we escape all non-ASCII and ASCII control characters as described * in the Adobe Document Structuring Conventions specification. */ printf("%%%%%s: (", name); len = 5 + (int)strlen(name); while (*value) { if (*value < ' ' || *value >= 127) { /* * Escape this character value... */ if (len >= 251) /* Keep line < 254 chars */ break; printf("\\%03o", *value & 255); len += 4; } else if (*value == '\\') { /* * Escape the backslash... */ if (len >= 253) /* Keep line < 254 chars */ break; putchar('\\'); putchar('\\'); len += 2; } else { /* * Put this character literally... */ if (len >= 254) /* Keep line < 254 chars */ break; putchar(*value); len ++; } value ++; } puts(")"); } cups-2.3.1/filter/raster-driver.header000664 000765 000024 00000002320 13574721672 020024 0ustar00mikestaff000000 000000

Developing Raster Printer Drivers

This document describes how to develop printer drivers for raster printers. Topics include: printer driver basics, creating new PPD files, using filters, implementing color management, and adding macOS features.

cups-2.3.1/filter/ppd-compiler.shtml000664 000765 000024 00000107516 13574721672 017542 0ustar00mikestaff000000 000000

The Basics

The PPD compiler, ppdc(1), is a simple command-line tool that takes a single driver information file, which by convention uses the extension .drv, and produces one or more PPD files that may be distributed with your printer drivers for use with CUPS. For example, you would run the following command to create the English language PPD files defined by the driver information file mydrivers.drv:

ppdc mydrivers.drv

The PPD files are placed in a subdirectory called ppd. The -d option is used to put the PPD files in a different location, for example:

ppdc -d myppds mydrivers.drv

places the PPD files in a subdirectory named myppds. Finally, use the -l option to specify the language localization for the PPD files that are created, for example:

ppdc -d myppds/de -l de mydrivers.drv
ppdc -d myppds/en -l en mydrivers.drv
ppdc -d myppds/es -l es mydrivers.drv
ppdc -d myppds/fr -l fr mydrivers.drv
ppdc -d myppds/it -l it mydrivers.drv

creates PPD files in German (de), English (en), Spanish (es), French (fr), and Italian (it) in the corresponding subdirectories. Specify multiple languages (separated by commas) to produce "globalized" PPD files:

ppdc -d myppds -l de,en,es,fr,it mydrivers.drv

Driver Information Files

The driver information files accepted by the PPD compiler are plain text files that define the various attributes and options that are included in the PPD files that are generated. A driver information file can define the information for one or more printers and their corresponding PPD files.

Listing 1: "examples/minimum.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

A Simple Example

The example in Listing 1 shows a driver information file which defines the minimum required attributes to provide a valid PPD file. The first part of the file includes standard definition files for fonts and media sizes:

#include <font.defs>
#include <media.defs>

The #include directive works just like the C/C++ include directive; files included using the angle brackets (<filename>) are found in any of the standard include directories and files included using quotes ("filename") are found in the same directory as the source or include file. The <font.defs> include file defines the standard fonts which are included with GPL Ghostscript and the Apple PDF RIP, while the <media.defs> include file defines the standard media sizes listed in Appendix B of the Adobe PostScript Printer Description File Format Specification.

CUPS provides several other standard include files:

  • <epson.h> - Defines all of the rastertoepson driver constants.
  • <escp.h> - Defines all of the rastertoescpx driver constants.
  • <hp.h> - Defines all of the rastertohp driver constants.
  • <label.h> - Defines all of the rastertolabel driver constants.
  • <pcl.h> - Defines all of the rastertopclx driver constants.
  • <raster.defs> - Defines all of the CUPS raster format constants.

Next we list all of the fonts that are available in the driver; for CUPS raster drivers, the following line is all that is usually supplied:

Font *

The Font directive specifies the name of a single font or the asterisk to specify all fonts. For example, you would use the following line to define an additional bar code font that you are supplying with your printer driver:

//   name         encoding  version  charset  status
Font Barcode-Foo  Special   "(1.0)"  Special  ROM

The name of the font is Barcode-Foo. Since it is not a standard text font, the encoding and charset name Special is used. The version number is 1.0 and the status (where the font is located) is ROM to indicate that the font does not need to be embedded in documents that use the font for this printer.

Third comes the manufacturer, model name, and version number information strings:

Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

These strings are used when the user (or auto-configuration program) selects the printer driver for a newly connected device.

The list of filters comes after the information strings; for the example in Listing 1, we have a single filter that takes CUPS raster data:

Filter application/vnd.cups-raster 100 rastertofoo

Each filter specified in the driver information file is the equivalent of a printer driver for that format; if a user submits a print job in a different format, CUPS figures out the sequence of commands that will produce a supported format for the least relative cost.

Once we have defined the driver information we specify the supported options. For the example driver we support a single resolution of 600 dots per inch and two media sizes, A4 and Letter:

*MediaSize Letter
MediaSize A4

*Resolution k 8 0 0 0 "600dpi/600 DPI"

The asterisk in front of the MediaSize and Resolution directives specify that those option choices are the default. The MediaSize directive is followed by a media size name which is normally defined in the <media.defs> file and corresponds to a standard Adobe media size name. If the default media size is Letter, the PPD compiler will override it to be A4 for non-English localizations for you automatically.

The Resolution directive accepts several values after it as follows:

  1. Colorspace for this resolution, if any. In the example file, the colorspace k is used which corresponds to black. For printer drivers that support color printing, this field is usually specified as "-" for "no change".
  2. Bits per color. In the example file, we define 8 bits per color, for a continuous-tone grayscale output. All versions of CUPS support 1 and 8 bits per color. CUPS 1.2 and higher (macOS 10.5 and higher) also supports 16 bits per color.
  3. Rows per band. In the example file, we define 0 rows per band to indicate that our printer driver does not process the page in bands.
  4. Row feed. In the example, we define the feed value to be 0 to indicate that our printer driver does not interleave the output.
  5. Row step. In the example, we define the step value to be 0 to indicate that our printer driver does not interleave the output. This value normally indicates the spacing between the nozzles of an inkjet printer - when combined with the previous two values, it informs the driver how to stagger the output on the page to produce interleaved lines on the page for higher-resolution output.
  6. Choice name and text. In the example, we define the choice name and text to be "600dpi/600 DPI". The name and text are separated by slash (/) character; if no text is specified, then the name is used as the text. The PPD compiler parses the name to determine the actual resolution; the name can be of the form RESOLUTIONdpi for resolutions that are equal horizontally and vertically or HRESxVRESdpi for isometric resolutions. Only integer resolution values are supported, so a resolution name of 300dpi is valid while 300.1dpi is not.

Finally, the PCFileName directive specifies that the named PPD file should be written for the current driver definitions:

PCFileName "foojet2k.ppd"

The filename follows the directive and must conform to the Adobe filename requirements in the Adobe Postscript Printer Description File Format Specification. Specifically, the filename may not exceed 8 characters followed by the extension .ppd. The FileName directive can be used to specify longer filenames:

FileName "FooJet 2000"

Grouping and Inheritance

The previous example created a single PPD file. Driver information files can also define multiple printers by using the PPD compiler grouping functionality. Directives are grouped using the curly braces ({ and }) and every group that uses the PCFileName or FileName directives produces a PPD file with that name. Listing 2 shows a variation of the original example that uses two groups to define two printers that share the same printer driver filter but provide two different resolution options.

Listing 2: "examples/grouping.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and version
Manufacturer "Foo"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "1200dpi/1200 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2001"
  PCFileName "foojt2k1.ppd"
}

The second example is essentially the same as the first, except that each printer model is defined inside of a pair of curly braces. For example, the first printer is defined using:

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

The printer inherits all of the definitions from the parent group (the top part of the file) and adds the additional definitions inside the curly braces for that printer driver. When we define the second group, it also inherits the same definitions from the parent group but none of the definitions from the first driver. Groups can be nested to any number of levels to support variations of similar models without duplication of information.

Color Support

For printer drivers that support color printing, the ColorDevice and ColorModel directives should be used to tell the printing system that color output is desired and in what formats. Listing 3 shows a variation of the previous example which includes a color printer that supports printing at 300 and 600 DPI.

The key changes are the addition of the ColorDevice directive:

ColorDevice true

which tells the printing system that the printer supports color printing, and the ColorModel directives:

ColorModel Gray/Grayscale w chunky 0
*ColorModel RGB/Color rgb chunky 0

which tell the printing system which colorspaces are supported by the printer driver for color printing. Each of the ColorModel directives is followed by the option name and text (Gray/Grayscale and RGB/Color), the colorspace name (w and rgb), the color organization (chunky), and the compression mode number (0) to be passed to the driver. The option name can be any of the standard Adobe ColorModel names:

  • Gray - Grayscale output.
  • RGB - Color output, typically using the RGB colorspace, but without a separate black channel.
  • CMYK - Color output with a separate black channel.

Custom names can be used, however it is recommended that you use your vendor prefix for any custom names, for example "fooName".

The colorspace name can be any of the following universally supported colorspaces:

  • w - Luminance
  • rgb - Red, green, blue
  • k - Black
  • cmy - Cyan, magenta, yellow
  • cmyk - Cyan, magenta, yellow, black

The color organization can be any of the following values:

  • chunky - Color values are passed together on a line as RGB RGB RGB RGB
  • banded - Color values are passed separately on a line as RRRR GGGG BBBB; not supported by the Apple RIP filters
  • planar - Color values are passed separately on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB BBBB BBBB; not supported by the Apple RIP filters

The compression mode value is passed to the driver in the cupsCompression attribute. It is traditionally used to select an appropriate compression mode for the color model but can be used for any purpose, such as specifying a photo mode vs. standard mode.

Listing 3: "examples/color.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and version
Manufacturer "Foo"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

{
  // Supports color printing
  ColorDevice true

  // Supported colorspaces
  ColorModel Gray/Grayscale w chunky 0
  *ColorModel RGB/Color rgb chunky 0

  // Supported resolutions
  *Resolution - 8 0 0 0 "300dpi/300 DPI"
  Resolution - 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet Color"
  PCFileName "foojetco.ppd"
}

Defining Custom Options and Option Groups

The Group, Option, and Choice directives are used to define or select a group, option, or choice. Listing 4 shows a variation of the first example that provides two custom options in a group named "Footasm".

Listing 4: "examples/custom.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Option Group
Group "Footasm"

  // Boolean option
  Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
    *Choice True/Yes "<</cupsCompression 1>>setpagedevice"
    Choice False/No "<</cupsCompression 0>>setpagedevice"

  // Multiple choice option
  Option "fooOutputType/Output Quality" PickOne AnySetup 10
    *Choice "Auto/Automatic Selection"
            "<</OutputType(Auto)>>setpagedevice""
    Choice "Text/Optimize for Text"
            "<</OutputType(Text)>>setpagedevice""
    Choice "Graph/Optimize for Graphics"
            "<</OutputType(Graph)>>setpagedevice""
    Choice "Photo/Optimize for Photos"
            "<</OutputType(Photo)>>setpagedevice""

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

The custom group is introduced by the Group directive which is followed by the name and optionally text for the user:

Group "Footasm/Footastic Options"

The group name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length. The groups General, Extra, and InstallableOptions are predefined by CUPS; the general and extra groups are filled by the UI options defined by the PPD specification. The InstallableOptions group is reserved for options that define whether accessories for the printer (duplexer unit, finisher, stapler, etc.) are installed.

Once the group is specified, the Option directive is used to introduce a new option:

Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10

The directive is followed by the name of the option and any optional user text, the option type, the PostScript document group, and the sort order number. The option name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length.

The option type can be Boolean for true/false selections, PickOne for picking one of many choices, or PickMany for picking zero or more choices. Boolean options can have at most two choices with the names False and True. Pick options can have any number of choices, although for Windows compatibility reasons the number of choices should not exceed 255.

The PostScript document group is typically AnySetup, meaning that the option can be introduced at any point in the PostScript document. Other values include PageSetup to include the option before each page and DocumentSetup to include the option once at the beginning of the document.

The sort order number is used to sort the printer commands associated with each option choice within the PostScript document. This allows you to setup certain options before others as required by the printer. For most CUPS raster printer drivers, the value 10 can be used for all options.

Once the option is specified, each option choice can be listed using the Choice directive:

*Choice True/Yes "<</cupsCompression 1>>setpagedevice"
Choice False/No "<</cupsCompression 0>>setpagedevice"

The directive is followed by the choice name and optionally user text, and the PostScript commands that should be inserted when printing a file to this printer. The option name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length.

The PostScript commands are also interpreted by any RIP filters, so these commands typically must be present for all option choices. Most commands take the form:

<</name value>>setpagedevice

where name is the name of the PostScript page device attribute and value is the numeric or string value for that attribute.

Defining Constants

Sometimes you will want to define constants for your drivers so that you can share values in different groups within the same driver information file, or to share values between different driver information files using the #include directive. The #define directive is used to define constants for use in your printer definitions:

#define NAME value

The NAME is any sequence of letters, numbers, and the underscore. The value is a number or string; if the value contains spaces you must put double quotes around it, for example:

#define FOO "My String Value"

Constants can also be defined on the command-line using the -D option:

ppdc -DNAME="value" filename.drv

Once defined, you use the notation $NAME to substitute the value of the constant in the file, for example:

#define MANUFACTURER "Foo"
#define FOO_600      0
#define FOO_1200     1

{
  Manufacturer "$MANUFACTURER"
  ModelNumber $FOO_600
  ModelName "FooJet 2000"
  ...
}

{
  Manufacturer "$MANUFACTURER"
  ModelNumber $FOO_1200
  ModelName "FooJet 2001"
  ...
}

Numeric constants can be bitwise OR'd together by placing the constants inside parenthesis, for example:

// ModelNumber capability bits
#define DUPLEX 1
#define COLOR  2

...

{
  // Define a model number specifying the capabilities of the printer...
  ModelNumber ($DUPLEX $COLOR)
  ...
}

Conditional Statements

The PPD compiler supports conditional compilation using the #if, #elif, #else, and #endif directives. The #if and #elif directives are followed by a constant name or an expression. For example, to include a group of options when "ADVANCED" is defined:

#if ADVANCED
Group "Advanced/Advanced Options"
  Option "fooCyanAdjust/Cyan Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooMagentaAdjust/Magenta Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooYellowAdjust/Yellow Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooBlackAdjust/Black Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
#endif

Defining Constraints

Constraints are strings that are used to specify that one or more option choices are incompatible, for example two-sided printing on transparency media. Constraints are also used to prevent the use of uninstalled features such as the duplexer unit, additional media trays, and so forth.

The UIConstraints directive is used to specify a constraint that is placed in the PPD file. The directive is followed by a string using one of the following formats:

UIConstraints "*Option1 *Option2"
UIConstraints "*Option1 Choice1 *Option2"
UIConstraints "*Option1 *Option2 Choice2"
UIConstraints "*Option1 Choice1 *Option2 Choice2"

Each option name is preceded by the asterisk (*). If no choice is given for an option, then all choices except False and None will conflict with the other option and choice(s). Since the PPD compiler automatically adds reciprocal constraints (option A conflicts with option B, so therefore option B conflicts with option A), you need only specify the constraint once.

Listing 5: "examples/constraint.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Installable Option Group
Group "InstallableOptions/Options Installed"

  // Duplexing unit option
  Option "OptionDuplexer/Duplexing Unit" Boolean AnySetup 10
    Choice True/Installed ""
    *Choice "False/Not Installed" ""

// General Option Group
Group General

  // Duplexing option
  Option "Duplex/Two-Sided Printing" PickOne AnySetup 10
    *Choice "None/No" "<</Duplex false>>setpagedevice""
    Choice "DuplexNoTumble/Long Edge Binding"
           "<</Duplex true/Tumble false>>setpagedevice""
    Choice "DuplexTumble/Short Edge Binding"
           "<</Duplex true/Tumble true>>setpagedevice""

// Only allow duplexing if the duplexer is installed
UIConstraints "*Duplex *OptionDuplexer False"

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

Listing 5 shows a variation of the first example with an added Duplex option and installable option for the duplexer, OptionDuplex. A constraint is added at the end to specify that any choice of the Duplex option that is not None is incompatible with the "Duplexer Installed" option set to "Not Installed" (False):

UIConstraints "*Duplex *OptionDuplexer False"

Enhanced Constraints

CUPS 1.4 supports constraints between 2 or more options using the Attribute directive. cupsUIConstraints attributes define the constraints, while cupsUIResolver attributes define option changes to resolve constraints. For example, we can specify the previous duplex constraint with a resolver that turns off duplexing with the following two lines:

Attribute cupsUIConstraints DuplexOff "*Duplex *OptionDuplexer False"
Attribute cupsUIResolver DuplexOff "*Duplex None"

Localization

The PPD compiler provides localization of PPD files in different languages through message catalog files in the GNU gettext or Apple .strings formats. Each user text string and several key PPD attribute values such as LanguageVersion and LanguageEncoding are looked up in the corresponding message catalog and the translated text is substituted in the generated PPD files. One message catalog file can be used by multiple driver information files, and each file contains a single language translation.

The ppdpo Utility

While CUPS includes localizations of all standard media sizes and options in several languages, your driver information files may provide their own media sizes and options that need to be localized. CUPS provides a utility program to aid in the localization of drivers called ppdpo(1). The ppdpo program creates or updates a message catalog file based upon one or more driver information files. New messages are added with the word "TRANSLATE" added to the front of the translation string to make locating new strings for translation easier. The program accepts the message catalog filename and one or more driver information files.

For example, run the following command to create a new German message catalog called de.po for all of the driver information files in the current directory:

ppdpo -o de.po *.drv

If the file de.po already exists, ppdpo will update the contents of the file with any new messages that need to be translated. To create an Apple .strings file instead, specify the output filename with a .strings extension, for example:

ppdpo -o de.strings *.drv

Using Message Catalogs with the PPD Compiler

Once you have created a message catalog, use the #po directive to declare it in each driver information file. For example, to declare the German message catalog for a driver use:

#po de "de.po"  // German

In fact, you can use the #po directive as many times as needed:

#po de "de.po"  // German
#po es "es.po"  // Spanish
#po fr "fr.po"  // French
#po it "it.po"  // Italian
#po ja "ja.po"  // Japanese

The filename ("de.po", etc.) can be relative to the location of the driver information file or an absolute path. Once defined, the PPD compiler will automatically generate a globalized PPD for every language declared in your driver information file. To generate a single-language PPD file, simply use the -l option to list the corresponding locale, for example:

ppdc -l de -d ppd/de mydrivers.drv

to generate German PPD files.

cups-2.3.1/filter/rastertolabel.c000664 000765 000024 00000065042 13574721672 017102 0ustar00mikestaff000000 000000 /* * Label printer filter for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 2001-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include #include /* * This driver filter currently supports DYMO, Intellitech, and Zebra * label printers. * * The DYMO portion of the driver has been tested with the 300, 330, * 330 Turbo, and 450 Twin Turbo label printers; it may also work with other * models. The DYMO printers support printing at 136, 203, and 300 DPI. * * The Intellitech portion of the driver has been tested with the * Intellibar 408, 412, and 808 and supports their PCL variant. * * The Zebra portion of the driver has been tested with the LP-2844, * LP-2844Z, QL-320, and QL-420 label printers; it may also work with * other models. The driver supports EPL line mode, EPL page mode, * ZPL, and CPCL as defined in Zebra's online developer documentation. */ /* * Model number constants... */ #define DYMO_3x0 0 /* DYMO Labelwriter 300/330/330 Turbo */ #define ZEBRA_EPL_LINE 0x10 /* Zebra EPL line mode printers */ #define ZEBRA_EPL_PAGE 0x11 /* Zebra EPL page mode printers */ #define ZEBRA_ZPL 0x12 /* Zebra ZPL-based printers */ #define ZEBRA_CPCL 0x13 /* Zebra CPCL-based printers */ #define INTELLITECH_PCL 0x20 /* Intellitech PCL-based printers */ /* * Globals... */ unsigned char *Buffer; /* Output buffer */ unsigned char *CompBuffer; /* Compression buffer */ unsigned char *LastBuffer; /* Last buffer */ unsigned Feed; /* Number of lines to skip */ int LastSet; /* Number of repeat characters */ int ModelNumber, /* cupsModelNumber attribute */ Page, /* Current page */ Canceled; /* Non-zero if job is canceled */ /* * Prototypes... */ void Setup(ppd_file_t *ppd); void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); void CancelJob(int sig); void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, unsigned y); void PCLCompress(unsigned char *line, unsigned length); void ZPLCompress(unsigned char repeat_char, unsigned repeat_count); /* * 'Setup()' - Prepare the printer for printing. */ void Setup(ppd_file_t *ppd) /* I - PPD file */ { int i; /* Looping var */ /* * Get the model number from the PPD file... */ if (ppd) ModelNumber = ppd->model_number; /* * Initialize based on the model number... */ switch (ModelNumber) { case DYMO_3x0 : /* * Clear any remaining data... */ for (i = 0; i < 100; i ++) putchar(0x1b); /* * Reset the printer... */ fputs("\033@", stdout); break; case ZEBRA_EPL_LINE : break; case ZEBRA_EPL_PAGE : break; case ZEBRA_ZPL : break; case ZEBRA_CPCL : break; case INTELLITECH_PCL : /* * Send a PCL reset sequence. */ putchar(0x1b); putchar('E'); break; } } /* * 'StartPage()' - Start a page of graphics. */ void StartPage(ppd_file_t *ppd, /* I - PPD file */ cups_page_header2_t *header) /* I - Page header */ { ppd_choice_t *choice; /* Marked choice */ unsigned length; /* Actual label length */ /* * Show page device dictionary... */ fprintf(stderr, "DEBUG: StartPage...\n"); fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]); fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]); fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]); fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); switch (ModelNumber) { case DYMO_3x0 : /* * Setup printer/job attributes... */ length = header->PageSize[1] * header->HWResolution[1] / 72; printf("\033L%c%c", length >> 8, length); printf("\033D%c", header->cupsBytesPerLine); printf("\033%c", header->cupsCompression + 'c'); /* Darkness */ printf("\033q%d", header->MediaPosition + 1); /* Roll Select */ break; case ZEBRA_EPL_LINE : /* * Set print rate... */ if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && strcmp(choice->choice, "Default")) printf("\033S%.0f", atof(choice->choice) * 2.0 - 2.0); /* * Set darkness... */ if (header->cupsCompression > 0 && header->cupsCompression <= 100) printf("\033D%d", 7 * header->cupsCompression / 100); /* * Set left margin to 0... */ fputs("\033M01", stdout); /* * Start buffered output... */ fputs("\033B", stdout); break; case ZEBRA_EPL_PAGE : /* * Start a new label... */ puts(""); puts("N"); /* * Set hardware options... */ if (!strcmp(header->MediaType, "Direct")) puts("OD"); /* * Set print rate... */ if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && strcmp(choice->choice, "Default")) { double val = atof(choice->choice); if (val >= 3.0) printf("S%.0f\n", val); else printf("S%.0f\n", val * 2.0 - 2.0); } /* * Set darkness... */ if (header->cupsCompression > 0 && header->cupsCompression <= 100) printf("D%u\n", 15 * header->cupsCompression / 100); /* * Set label size... */ printf("q%u\n", (header->cupsWidth + 7) & ~7U); break; case ZEBRA_ZPL : /* * Set darkness... */ if (header->cupsCompression > 0 && header->cupsCompression <= 100) printf("~SD%02u\n", 30 * header->cupsCompression / 100); /* * Start bitmap graphics... */ printf("~DGR:CUPS.GRF,%u,%u,\n", header->cupsHeight * header->cupsBytesPerLine, header->cupsBytesPerLine); /* * Allocate compression buffers... */ CompBuffer = malloc(2 * header->cupsBytesPerLine + 1); LastBuffer = malloc(header->cupsBytesPerLine); LastSet = 0; break; case ZEBRA_CPCL : /* * Start label... */ printf("! 0 %u %u %u %u\r\n", header->HWResolution[0], header->HWResolution[1], header->cupsHeight, header->NumCopies); printf("PAGE-WIDTH %u\r\n", header->cupsWidth); printf("PAGE-HEIGHT %u\r\n", header->cupsHeight); break; case INTELLITECH_PCL : /* * Set the media size... */ printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ printf("\033&l0O"); /* Set portrait orientation */ switch (header->PageSize[1]) { case 540 : /* Monarch Envelope */ printf("\033&l80A"); /* Set page size */ break; case 624 : /* DL Envelope */ printf("\033&l90A"); /* Set page size */ break; case 649 : /* C5 Envelope */ printf("\033&l91A"); /* Set page size */ break; case 684 : /* COM-10 Envelope */ printf("\033&l81A"); /* Set page size */ break; case 756 : /* Executive */ printf("\033&l1A"); /* Set page size */ break; case 792 : /* Letter */ printf("\033&l2A"); /* Set page size */ break; case 842 : /* A4 */ printf("\033&l26A"); /* Set page size */ break; case 1008 : /* Legal */ printf("\033&l3A"); /* Set page size */ break; default : /* Custom size */ printf("\033!f%uZ", header->PageSize[1] * 300 / 72); break; } printf("\033&l%uP", /* Set page length */ header->PageSize[1] / 12); printf("\033&l0E"); /* Set top margin to 0 */ if (header->NumCopies) printf("\033&l%uX", header->NumCopies); /* Set number copies */ printf("\033&l0L"); /* Turn off perforation skip */ /* * Print settings... */ if (Page == 1) { if (header->cupsRowFeed) /* inPrintRate */ printf("\033!p%uS", header->cupsRowFeed); if (header->cupsCompression != ~0U) /* inPrintDensity */ printf("\033&d%dA", 30 * header->cupsCompression / 100 - 15); if ((choice = ppdFindMarkedChoice(ppd, "inPrintMode")) != NULL) { if (!strcmp(choice->choice, "Standard")) fputs("\033!p0M", stdout); else if (!strcmp(choice->choice, "Tear")) { fputs("\033!p1M", stdout); if (header->cupsRowCount) /* inTearInterval */ printf("\033!n%uT", header->cupsRowCount); } else { fputs("\033!p2M", stdout); if (header->cupsRowStep) /* inCutInterval */ printf("\033!n%uC", header->cupsRowStep); } } } /* * Setup graphics... */ printf("\033*t%uR", header->HWResolution[0]); /* Set resolution */ printf("\033*r%uS", header->cupsWidth); /* Set width */ printf("\033*r%uT", header->cupsHeight); /* Set height */ printf("\033&a0H"); /* Set horizontal position */ printf("\033&a0V"); /* Set vertical position */ printf("\033*r1A"); /* Start graphics */ printf("\033*b3M"); /* Set compression */ /* * Allocate compression buffers... */ CompBuffer = malloc(2 * header->cupsBytesPerLine + 1); LastBuffer = malloc(header->cupsBytesPerLine); LastSet = 0; break; } /* * Allocate memory for a line of graphics... */ Buffer = malloc(header->cupsBytesPerLine); Feed = 0; } /* * 'EndPage()' - Finish a page of graphics. */ void EndPage(ppd_file_t *ppd, /* I - PPD file */ cups_page_header2_t *header) /* I - Page header */ { int val; /* Option value */ ppd_choice_t *choice; /* Marked choice */ switch (ModelNumber) { case DYMO_3x0 : /* * Eject the current page... */ fputs("\033E", stdout); break; case ZEBRA_EPL_LINE : /* * End buffered output, eject the label... */ fputs("\033E\014", stdout); break; case ZEBRA_EPL_PAGE : /* * Print the label... */ puts("P1"); /* * Cut the label as needed... */ if (header->CutMedia) puts("C"); break; case ZEBRA_ZPL : if (Canceled) { /* * Cancel bitmap download... */ puts("~DN"); break; } /* * Start label... */ puts("^XA"); /* * Rotate 180 degrees so that the top of the label/page is at the * leading edge... */ puts("^POI"); /* * Set print width... */ printf("^PW%u\n", header->cupsWidth); /* * Set print rate... */ if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && strcmp(choice->choice, "Default")) { val = atoi(choice->choice); printf("^PR%d,%d,%d\n", val, val, val); } /* * Put label home in default position (0,0)... */ printf("^LH0,0\n"); /* * Set media tracking... */ if (ppdIsMarked(ppd, "zeMediaTracking", "Continuous")) { /* * Add label length command for continuous... */ printf("^LL%d\n", header->cupsHeight); printf("^MNN\n"); } else if (ppdIsMarked(ppd, "zeMediaTracking", "Web")) printf("^MNY\n"); else if (ppdIsMarked(ppd, "zeMediaTracking", "Mark")) printf("^MNM\n"); /* * Set label top */ if (header->cupsRowStep != 200) printf("^LT%d\n", header->cupsRowStep); /* * Set media type... */ if (!strcmp(header->MediaType, "Thermal")) printf("^MTT\n"); else if (!strcmp(header->MediaType, "Direct")) printf("^MTD\n"); /* * Set print mode... */ if ((choice = ppdFindMarkedChoice(ppd, "zePrintMode")) != NULL && strcmp(choice->choice, "Saved")) { printf("^MM"); if (!strcmp(choice->choice, "Tear")) printf("T,Y\n"); else if (!strcmp(choice->choice, "Peel")) printf("P,Y\n"); else if (!strcmp(choice->choice, "Rewind")) printf("R,Y\n"); else if (!strcmp(choice->choice, "Applicator")) printf("A,Y\n"); else printf("C,Y\n"); } /* * Set tear-off adjust position... */ if (header->AdvanceDistance != 1000) { if ((int)header->AdvanceDistance < 0) printf("~TA%04d\n", (int)header->AdvanceDistance); else printf("~TA%03d\n", (int)header->AdvanceDistance); } /* * Allow for reprinting after an error... */ if (ppdIsMarked(ppd, "zeErrorReprint", "Always")) printf("^JZY\n"); else if (ppdIsMarked(ppd, "zeErrorReprint", "Never")) printf("^JZN\n"); /* * Print multiple copies */ if (header->NumCopies > 1) printf("^PQ%d, 0, 0, N\n", header->NumCopies); /* * Display the label image... */ puts("^FO0,0^XGR:CUPS.GRF,1,1^FS"); /* * End the label and eject... */ puts("^XZ"); /* * Delete the label image... */ puts("^XA"); puts("^IDR:CUPS.GRF^FS"); puts("^XZ"); /* * Cut the label as needed... */ if (header->CutMedia) puts("^CN1"); break; case ZEBRA_CPCL : /* * Set tear-off adjust position... */ if (header->AdvanceDistance != 1000) printf("PRESENT-AT %d 1\r\n", (int)header->AdvanceDistance); /* * Allow for reprinting after an error... */ if (ppdIsMarked(ppd, "zeErrorReprint", "Always")) puts("ON-OUT-OF-PAPER WAIT\r"); else if (ppdIsMarked(ppd, "zeErrorReprint", "Never")) puts("ON-OUT-OF-PAPER PURGE\r"); /* * Cut label? */ if (header->CutMedia) puts("CUT\r"); /* * Set darkness... */ if (header->cupsCompression > 0) printf("TONE %u\r\n", 2 * header->cupsCompression); /* * Set print rate... */ if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && strcmp(choice->choice, "Default")) { val = atoi(choice->choice); printf("SPEED %d\r\n", val); } /* * Print the label... */ if ((choice = ppdFindMarkedChoice(ppd, "zeMediaTracking")) == NULL || strcmp(choice->choice, "Continuous")) puts("FORM\r"); puts("PRINT\r"); break; case INTELLITECH_PCL : printf("\033*rB"); /* End GFX */ printf("\014"); /* Eject current page */ break; } fflush(stdout); /* * Free memory... */ free(Buffer); if (CompBuffer) { free(CompBuffer); CompBuffer = NULL; } if (LastBuffer) { free(LastBuffer); LastBuffer = NULL; } } /* * 'CancelJob()' - Cancel the current job... */ void CancelJob(int sig) /* I - Signal */ { /* * Tell the main loop to stop... */ (void)sig; Canceled = 1; } /* * 'OutputLine()' - Output a line of graphics... */ void OutputLine(ppd_file_t *ppd, /* I - PPD file */ cups_page_header2_t *header, /* I - Page header */ unsigned y) /* I - Line number */ { unsigned i; /* Looping var */ unsigned char *ptr; /* Pointer into buffer */ unsigned char *compptr; /* Pointer into compression buffer */ unsigned char repeat_char; /* Repeated character */ unsigned repeat_count; /* Number of repeated characters */ static const unsigned char *hex = (const unsigned char *)"0123456789ABCDEF"; /* Hex digits */ (void)ppd; switch (ModelNumber) { case DYMO_3x0 : /* * See if the line is blank; if not, write it to the printer... */ if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine - 1)) { if (Feed) { while (Feed > 255) { printf("\033f\001%c", 255); Feed -= 255; } printf("\033f\001%c", Feed); Feed = 0; } putchar(0x16); fwrite(Buffer, header->cupsBytesPerLine, 1, stdout); fflush(stdout); } else Feed ++; break; case ZEBRA_EPL_LINE : printf("\033g%03d", header->cupsBytesPerLine); fwrite(Buffer, 1, header->cupsBytesPerLine, stdout); fflush(stdout); break; case ZEBRA_EPL_PAGE : if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine)) { printf("GW0,%d,%d,1\n", y, header->cupsBytesPerLine); for (i = header->cupsBytesPerLine, ptr = Buffer; i > 0; i --, ptr ++) putchar(~*ptr); putchar('\n'); fflush(stdout); } break; case ZEBRA_ZPL : /* * Determine if this row is the same as the previous line. * If so, output a ':' and return... */ if (LastSet) { if (!memcmp(Buffer, LastBuffer, header->cupsBytesPerLine)) { putchar(':'); return; } } /* * Convert the line to hex digits... */ for (ptr = Buffer, compptr = CompBuffer, i = header->cupsBytesPerLine; i > 0; i --, ptr ++) { *compptr++ = hex[*ptr >> 4]; *compptr++ = hex[*ptr & 15]; } *compptr = '\0'; /* * Run-length compress the graphics... */ for (compptr = CompBuffer + 1, repeat_char = CompBuffer[0], repeat_count = 1; *compptr; compptr ++) if (*compptr == repeat_char) repeat_count ++; else { ZPLCompress(repeat_char, repeat_count); repeat_char = *compptr; repeat_count = 1; } if (repeat_char == '0') { /* * Handle 0's on the end of the line... */ if (repeat_count & 1) { repeat_count --; putchar('0'); } if (repeat_count > 0) putchar(','); } else ZPLCompress(repeat_char, repeat_count); fflush(stdout); /* * Save this line for the next round... */ memcpy(LastBuffer, Buffer, header->cupsBytesPerLine); LastSet = 1; break; case ZEBRA_CPCL : if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine)) { printf("CG %u 1 0 %d ", header->cupsBytesPerLine, y); fwrite(Buffer, 1, header->cupsBytesPerLine, stdout); puts("\r"); fflush(stdout); } break; case INTELLITECH_PCL : if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine - 1)) { if (Feed) { printf("\033*b%dY", Feed); Feed = 0; LastSet = 0; } PCLCompress(Buffer, header->cupsBytesPerLine); } else Feed ++; break; } } /* * 'PCLCompress()' - Output a PCL (mode 3) compressed line. */ void PCLCompress(unsigned char *line, /* I - Line to compress */ unsigned length) /* I - Length of line */ { unsigned char *line_ptr, /* Current byte pointer */ *line_end, /* End-of-line byte pointer */ *comp_ptr, /* Pointer into compression buffer */ *start, /* Start of compression sequence */ *seed; /* Seed buffer pointer */ unsigned count, /* Count of bytes for output */ offset; /* Offset of bytes for output */ /* * Do delta-row compression... */ line_ptr = line; line_end = line + length; comp_ptr = CompBuffer; seed = LastBuffer; while (line_ptr < line_end) { /* * Find the next non-matching sequence... */ start = line_ptr; if (!LastSet) { /* * The seed buffer is invalid, so do the next 8 bytes, max... */ offset = 0; if ((count = (unsigned)(line_end - line_ptr)) > 8) count = 8; line_ptr += count; } else { /* * The seed buffer is valid, so compare against it... */ while (*line_ptr == *seed && line_ptr < line_end) { line_ptr ++; seed ++; } if (line_ptr == line_end) break; offset = (unsigned)(line_ptr - start); /* * Find up to 8 non-matching bytes... */ start = line_ptr; count = 0; while (*line_ptr != *seed && line_ptr < line_end && count < 8) { line_ptr ++; seed ++; count ++; } } /* * Place mode 3 compression data in the buffer; see HP manuals * for details... */ if (offset >= 31) { /* * Output multi-byte offset... */ *comp_ptr++ = (unsigned char)(((count - 1) << 5) | 31); offset -= 31; while (offset >= 255) { *comp_ptr++ = 255; offset -= 255; } *comp_ptr++ = (unsigned char)offset; } else { /* * Output single-byte offset... */ *comp_ptr++ = (unsigned char)(((count - 1) << 5) | offset); } memcpy(comp_ptr, start, count); comp_ptr += count; } /* * Set the length of the data and write it... */ printf("\033*b%dW", (int)(comp_ptr - CompBuffer)); fwrite(CompBuffer, (size_t)(comp_ptr - CompBuffer), 1, stdout); /* * Save this line as a "seed" buffer for the next... */ memcpy(LastBuffer, line, length); LastSet = 1; } /* * 'ZPLCompress()' - Output a run-length compression sequence. */ void ZPLCompress(unsigned char repeat_char, /* I - Character to repeat */ unsigned repeat_count) /* I - Number of repeated characters */ { if (repeat_count > 1) { /* * Print as many z's as possible - they are the largest denomination * representing 400 characters (zC stands for 400 adjacent C's) */ while (repeat_count >= 400) { putchar('z'); repeat_count -= 400; } /* * Then print 'g' through 'y' as multiples of 20 characters... */ if (repeat_count >= 20) { putchar((int)('f' + repeat_count / 20)); repeat_count %= 20; } /* * Finally, print 'G' through 'Y' as 1 through 19 characters... */ if (repeat_count > 0) putchar((int)('F' + repeat_count)); } /* * Then the character to be repeated... */ putchar((int)repeat_char); } /* * 'main()' - Main entry and processing of driver. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream for printing */ cups_page_header2_t header; /* Page header from file */ unsigned y; /* Current line */ ppd_file_t *ppd; /* PPD file */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* * Make sure status messages are not buffered... */ setbuf(stderr, NULL); /* * Check command-line... */ if (argc < 6 || argc > 7) { /* * We don't have the correct number of arguments; write an error message * and return. */ _cupsLangPrintFilter(stderr, "ERROR", _("%s job-id user title copies options [file]"), "rastertolabel"); return (1); } /* * Open the page stream... */ if (argc == 7) { if ((fd = open(argv[6], O_RDONLY)) == -1) { _cupsLangPrintError("ERROR", _("Unable to open raster file")); sleep(1); return (1); } } else fd = 0; ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* * Register a signal handler to eject the current page if the * job is cancelled. */ Canceled = 0; #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, CancelJob); #elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_handler = CancelJob; sigaction(SIGTERM, &action, NULL); #else signal(SIGTERM, CancelJob); #endif /* HAVE_SIGSET */ /* * Open the PPD file and apply options... */ num_options = cupsParseOptions(argv[5], 0, &options); ppd = ppdOpenFile(getenv("PPD")); if (!ppd) { ppd_status_t status; /* PPD error */ int linenum; /* Line number */ _cupsLangPrintFilter(stderr, "ERROR", _("The PPD file could not be opened.")); status = ppdLastError(&linenum); fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); return (1); } ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); /* * Initialize the print device... */ Setup(ppd); /* * Process pages as needed... */ Page = 0; while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ if (Canceled) break; Page ++; fprintf(stderr, "PAGE: %d 1\n", Page); _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); /* * Start the page... */ StartPage(ppd, &header); /* * Loop for each line on the page... */ for (y = 0; y < header.cupsHeight && !Canceled; y ++) { /* * Let the user know how far we have progressed... */ if (Canceled) break; if ((y & 15) == 0) { _cupsLangPrintFilter(stderr, "INFO", _("Printing page %d, %u%% complete."), Page, 100 * y / header.cupsHeight); fprintf(stderr, "ATTR: job-media-progress=%u\n", 100 * y / header.cupsHeight); } /* * Read a line of graphics... */ if (cupsRasterReadPixels(ras, Buffer, header.cupsBytesPerLine) < 1) break; /* * Write it to the printer... */ OutputLine(ppd, &header, y); } /* * Eject the page... */ _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); EndPage(ppd, &header); if (Canceled) break; } /* * Close the raster stream... */ cupsRasterClose(ras); if (fd != 0) close(fd); /* * Close the PPD file and free the options... */ ppdClose(ppd); cupsFreeOptions(num_options, options); /* * If no pages were printed, send an error message... */ if (Page == 0) { _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); return (1); } else return (0); } cups-2.3.1/filter/postscript-driver.header000664 000765 000024 00000002417 13574721672 020745 0ustar00mikestaff000000 000000

Developing PostScript Printer Drivers

This document describes how to develop printer drivers for PostScript printers. Topics include: printer driver basics, creating new PPD files, importing existing PPD files, using custom filters, implementing color management, and adding macOS features.

cups-2.3.1/filter/Makefile000664 000765 000024 00000007725 13574721672 015537 0ustar00mikestaff000000 000000 # # Filter makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2006 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs TARGETS = \ commandtops \ gziptoany \ pstops \ rastertoepson \ rastertohp \ rastertolabel \ rastertopwg OBJS = commandtops.o gziptoany.o common.o pstops.o \ rastertoepson.o rastertohp.o rastertolabel.o \ rastertopwg.o # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all object files... # clean: $(RM) $(OBJS) $(TARGETS) # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: $(INSTALL_DIR) -m 755 $(SERVERBIN)/filter for file in $(TARGETS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/filter; \ done if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ for file in $(TARGETS); do \ cp $$file $(SYMROOT); \ dsymutil $(SYMROOT)/$$file; \ done \ fi # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall all targets... # uninstall: for file in $(TARGETS); do \ $(RM) $(SERVERBIN)/filter/$$file; \ done -$(RMDIR) $(SERVERBIN)/filter -$(RMDIR) $(SERVERBIN) # # Automatic API help files... # apihelp: echo Generating CUPS API help files... codedoc --section "Programming" \ --title "Developing PostScript Printer Drivers" \ --css ../doc/cups-printable.css \ --header postscript-driver.header \ --body postscript-driver.shtml \ >../doc/help/postscript-driver.html codedoc --section "Programming" \ --title "Introduction to the PPD Compiler" \ --css ../doc/cups-printable.css \ --header ppd-compiler.header \ --body ppd-compiler.shtml \ >../doc/help/ppd-compiler.html codedoc --section "Programming" \ --title "Developing Raster Printer Drivers" \ --css ../doc/cups-printable.css \ --header raster-driver.header \ --body raster-driver.shtml \ >../doc/help/raster-driver.html codedoc --section "Specifications" \ --title "CUPS PPD Extensions" \ --css ../doc/cups-printable.css \ --header spec-ppd.header \ --body spec-ppd.shtml \ >../doc/help/spec-ppd.html # # commandtops # commandtops: commandtops.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ commandtops.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # gziptoany # gziptoany: gziptoany.o ../Makedefs ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ gziptoany.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # pstops # pstops: pstops.o common.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ pstops.o common.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # rastertoepson # rastertoepson: rastertoepson.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rastertoepson.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # rastertohp # rastertohp: rastertohp.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rastertohp.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # rastertolabel # rastertolabel: rastertolabel.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rastertolabel.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # rastertopwg # rastertopwg: rastertopwg.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rastertopwg.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ rastertopwg-static: rastertopwg.o ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ rastertopwg.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Dependencies... # include Dependencies cups-2.3.1/filter/gziptoany.c000664 000765 000024 00000003766 13574721672 016270 0ustar00mikestaff000000 000000 /* * GZIP/raw pre-filter for CUPS. * * Copyright 2007-2015 by Apple Inc. * Copyright 1993-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include /* * 'main()' - Copy (and uncompress) files to stdout. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { cups_file_t *fp; /* File */ char buffer[8192]; /* Data buffer */ ssize_t bytes; /* Number of bytes read/written */ int copies; /* Number of copies */ /* * Check command-line... */ if (argc < 6 || argc > 7) { _cupsLangPrintf(stderr, _("Usage: %s job-id user title copies options [file]"), argv[0]); return (1); } /* * Get the copy count; if we have no final content type, this is a * raw queue or raw print file, so we need to make copies... */ if (!getenv("FINAL_CONTENT_TYPE")) copies = atoi(argv[4]); else copies = 1; /* * Open the file... */ if (argc == 6) { copies = 1; fp = cupsFileStdin(); } else if ((fp = cupsFileOpen(argv[6], "r")) == NULL) { fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", argv[6]); _cupsLangPrintError("ERROR", _("Unable to open print file")); return (1); } /* * Copy the file to stdout... */ while (copies > 0) { if (!getenv("FINAL_CONTENT_TYPE")) fputs("PAGE: 1 1\n", stderr); cupsFileRewind(fp); while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) if (write(1, buffer, (size_t)bytes) < bytes) { _cupsLangPrintFilter(stderr, "ERROR", _("Unable to write uncompressed print data: %s"), strerror(errno)); if (argc == 7) cupsFileClose(fp); return (1); } copies --; } /* * Close the file and return... */ if (argc == 7) cupsFileClose(fp); return (0); } cups-2.3.1/filter/spec-ppd.header000664 000765 000024 00000002502 13574721672 016750 0ustar00mikestaff000000 000000

CUPS PPD Extensions

This specification describes the attributes and extensions that CUPS adds to Adobe TechNote #5003: PostScript Printer Description File Format Specification Version 4.3. PostScript Printer Description ("PPD") files describe the capabilities of each printer and are used by CUPS to support printer-specific features and intelligent filtering.

cups-2.3.1/filter/Dependencies000664 000765 000024 00000005237 13574721672 016404 0ustar00mikestaff000000 000000 commandtops.o: commandtops.c ../cups/cups-private.h \ ../cups/string-private.h ../config.h ../cups/versioning.h \ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \ ../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \ ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h ../cups/ppd.h ../cups/raster.h \ ../cups/sidechannel.h gziptoany.o: gziptoany.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h common.o: common.c common.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \ ../cups/ppd.h ../cups/raster.h pstops.o: pstops.c common.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \ ../cups/ppd.h ../cups/raster.h ../cups/language-private.h \ ../cups/transcode.h rastertoepson.o: rastertoepson.c ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h ../cups/ppd.h ../cups/raster.h \ ../cups/string-private.h ../config.h ../cups/language-private.h \ ../cups/transcode.h rastertohp.o: rastertohp.c ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h ../cups/ppd.h ../cups/raster.h \ ../cups/string-private.h ../config.h ../cups/language-private.h \ ../cups/transcode.h rastertolabel.o: rastertolabel.c ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h ../cups/ppd.h ../cups/raster.h \ ../cups/string-private.h ../config.h ../cups/language-private.h \ ../cups/transcode.h rastertopwg.o: rastertopwg.c ../cups/cups-private.h \ ../cups/string-private.h ../config.h ../cups/versioning.h \ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \ ../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \ ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h ../cups/ppd-private.h ../cups/ppd.h \ ../cups/raster.h cups-2.3.1/filter/postscript-driver.shtml000664 000765 000024 00000034555 13574721672 020654 0ustar00mikestaff000000 000000

Printer Driver Basics

A CUPS PostScript printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, zero or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into device-independent PostScript, and then from device-independent PostScript to device-dependent PostScript. Figure 1 shows the data flow of a typical print job.

The optional PostScript filter can be provided to add printer-specific commands to the PostScript output that cannot be represented in the PPD file or to reorganize the output for special printer features. Typically this is used to support advanced job management or finishing functions on the printer. CUPS includes a generic PostScript filter that handles all PPD-defined commands.

The optional port monitor handles interface-specific protocol or encoding issues. For example, many PostScript printers support the Binary Communications Protocol (BCP) and Tagged Binary Communications Protocol (TBCP) to allow applications to print 8-bit ("binary") PostScript jobs. CUPS includes port monitors for BCP and TBCP, and you can supply your own port monitors as needed.

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

PostScript printer drivers typically do not require their own command filter since CUPS includes a generic PostScript command filter that supports all of the standard functions using PPD-defined commands.

Creating New PPD Files

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for a black-and-white PostScript printer.

Listing 1: "examples/postscript.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// Specify this is a PostScript printer driver
DriverType ps

// List the fonts that are supported, in this case all standard fonts
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "Foo LaserProofer 2000"
Version 1.0

// PostScript printer attributes
Attribute DefaultColorSpace "" Gray
Attribute LandscapeOrientation "" Minus90
Attribute LanguageLevel "" "3"
Attribute Product "" "(Foo LaserProofer 2000)"
Attribute PSVersion "" "(3010) 0"
Attribute TTRasterizer "" Type42

// Supported page sizes
*MediaSize Letter
MediaSize Legal
MediaSize A4

// Query command for page size
Attribute "?PageSize" "" "
      save
      currentpagedevice /PageSize get aload pop
      2 copy gt {exch} if (Unknown)
      23 dict
              dup [612 792] (Letter) put
              dup [612 1008] (Legal) put
              dup [595 842] (A4) put
              {exch aload pop 4 index sub abs 5 le exch
               5 index sub abs 5 le and
              {exch pop exit} {pop} ifelse
      } bind forall = flush pop pop
      restore"

// Specify the name of the PPD file we want to generate
PCFileName "fooproof.ppd"

Required Attributes

PostScript drivers require the attributes listed in Table 1. If not specified, the defaults for CUPS drivers are used. A typical PostScript driver information file would include the following attributes:

Attribute DefaultColorSpace "" Gray
Attribute LandscapeOrientation "" Minus90
Attribute LanguageLevel "" "3"
Attribute Product "" "(Foo LaserProofer 2000)"
Attribute PSVersion "" "(3010) 0"
Attribute TTRasterizer "" Type42
Table 1: Required PostScript Printer Driver Attributes
Attribute Description
DefaultColorSpace The default colorspace: Gray, RGB, CMY, or CMYK. If not specified, then RGB is assumed.
LandscapeOrientation The preferred landscape orientation: Plus90, Minus90, or Any. If not specified, Plus90 is assumed.
LanguageLevel The PostScript language level supported by the device: 1, 2, or 3. If not specified, 2 is assumed.
Product The string returned by the PostScript product operator, which must include parenthesis to conform with PostScript syntax rules for strings. Multiple Product attributes may be specified to support multiple products with the same PPD file. If not specified, "(ESP Ghostscript)" and "(GNU Ghostscript)" are assumed.
PSVersion The PostScript interpreter version numbers as returned by the version and revision operators. The required format is "(version) revision". Multiple PSVersion attributes may be specified to support multiple interpreter version numbers. If not specified, "(3010) 705" and "(3010) 707" are assumed.
TTRasterizer The type of TrueType font rasterizer supported by the device, if any. The supported values are None, Accept68k, Type42, and TrueImage. If not specified, None is assumed.

Query Commands

Most PostScript printer PPD files include query commands (?PageSize, etc.) that allow applications to query the printer for its current settings and configuration. Query commands are included in driver information files as attributes. For example, the example in Listing 1 uses the following definition for the PageSize query command:

Attribute "?PageSize" "" "
      save
      currentpagedevice /PageSize get aload pop
      2 copy gt {exch} if (Unknown)
      23 dict
              dup [612 792] (Letter) put
              dup [612 1008] (Legal) put
              dup [595 842] (A4) put
              {exch aload pop 4 index sub abs 5 le exch
               5 index sub abs 5 le and
              {exch pop exit} {pop} ifelse
      } bind forall = flush pop pop
      restore"

Query commands can span multiple lines, however no single line may contain more than 255 characters.

Importing Existing PPD Files

CUPS includes a utility called ppdi(1) which allows you to import existing PPD files into the driver information file format used by the PPD compiler ppdc(1). Once imported, you can modify, localize, and regenerate the PPD files easily. Type the following command to import the PPD file mydevice.ppd into the driver information file mydevice.drv:

ppdi -o mydevice.drv mydevice.ppd

If you have a whole directory of PPD files that you would like to import, you can list multiple filenames or use shell wildcards to import more than one PPD file on the command-line:

ppdi -o mydevice.drv mydevice1.ppd mydevice2.ppd
ppdi -o mydevice.drv *.ppd

If the driver information file already exists, the new PPD file entries are appended to the end of the file. Each PPD file is placed in its own group of curly braces within the driver information file.

Using Custom Filters

Normally a PostScript printer driver will not utilize any additional print filters. For drivers that provide additional filters such as a CUPS command file filter for doing printer maintenance, you must also list the following Filter directive to handle printing PostScript files:

Filter application/vnd.cups-postscript 0 -

Custom Command Filters

The application/vnd.cups-command file type is used for CUPS command files. Use the following Filter directive to handle CUPS command files:

Filter application/vnd.cups-command 100 /path/to/command/filter

To use the standard PostScript command filter, specify commandtops as the path to the command filter.

Custom PDF Filters

The application/pdf file type is used for unfiltered PDF files while the application/vnd.cups-pdf file type is used for filtered PDF files. Use the following Filter directive to handle filtered PDF files:

Filter application/vnd.cups-pdf 100 /path/to/pdf/filter

For unfiltered PDF files, use:

Filter application/pdf 100 /path/to/pdf/filter

Custom PDF filters that accept filtered data do not need to perform number-up processing and other types of page imposition, while those that accept unfiltered data MUST do the number-up processing themselves.

Custom PostScript Filters

The application/vnd.cups-postscript file type is used for filtered PostScript files. Use the following Filter directive to handle PostScript files:

Filter application/vnd.cups-postscript 100 /path/to/postscript/filter

Implementing Color Management

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

Adding macOS Features

macOS printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
Attribute APPrinterPreset "name/text" "*option choice ..."
cups-2.3.1/filter/rastertohp.c000664 000765 000024 00000045041 13574721672 016427 0ustar00mikestaff000000 000000 /* * Hewlett-Packard Page Control Language filter for CUPS. * * Copyright 2007-2015 by Apple Inc. * Copyright 1993-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include #include /* * Globals... */ unsigned char *Planes[4], /* Output buffers */ *CompBuffer, /* Compression buffer */ *BitBuffer; /* Buffer for output bits */ unsigned NumPlanes, /* Number of color planes */ ColorBits, /* Number of bits per color */ Feed; /* Number of lines to skip */ cups_bool_t Duplex; /* Current duplex mode */ int Page, /* Current page number */ Canceled; /* Has the current job been canceled? */ /* * Prototypes... */ void Setup(void); void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); void EndPage(void); void Shutdown(void); void CancelJob(int sig); void CompressData(unsigned char *line, unsigned length, unsigned plane, unsigned type); void OutputLine(cups_page_header2_t *header); /* * 'Setup()' - Prepare the printer for printing. */ void Setup(void) { /* * Send a PCL reset sequence. */ putchar(0x1b); putchar('E'); } /* * 'StartPage()' - Start a page of graphics. */ void StartPage(ppd_file_t *ppd, /* I - PPD file */ cups_page_header2_t *header) /* I - Page header */ { unsigned plane; /* Looping var */ /* * Show page device dictionary... */ fprintf(stderr, "DEBUG: StartPage...\n"); fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]); fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]); fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]); fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); /* * Setup printer/job attributes... */ Duplex = header->Duplex; ColorBits = header->cupsBitsPerColor; if ((!Duplex || (Page & 1)) && header->MediaPosition) printf("\033&l%dH", /* Set media position */ header->MediaPosition); if (Duplex && ppd && ppd->model_number == 2) { /* * Handle duplexing on new DeskJet printers... */ printf("\033&l-2H"); /* Load media */ if (Page & 1) printf("\033&l2S"); /* Set duplex mode */ } if (!Duplex || (Page & 1) || (ppd && ppd->model_number == 2)) { /* * Set the media size... */ printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ printf("\033&l0O"); /* Set portrait orientation */ switch (header->PageSize[1]) { case 540 : /* Monarch Envelope */ printf("\033&l80A"); /* Set page size */ break; case 595 : /* A5 */ printf("\033&l25A"); /* Set page size */ break; case 624 : /* DL Envelope */ printf("\033&l90A"); /* Set page size */ break; case 649 : /* C5 Envelope */ printf("\033&l91A"); /* Set page size */ break; case 684 : /* COM-10 Envelope */ printf("\033&l81A"); /* Set page size */ break; case 709 : /* B5 Envelope */ printf("\033&l100A"); /* Set page size */ break; case 756 : /* Executive */ printf("\033&l1A"); /* Set page size */ break; case 792 : /* Letter */ printf("\033&l2A"); /* Set page size */ break; case 842 : /* A4 */ printf("\033&l26A"); /* Set page size */ break; case 1008 : /* Legal */ printf("\033&l3A"); /* Set page size */ break; case 1191 : /* A3 */ printf("\033&l27A"); /* Set page size */ break; case 1224 : /* Tabloid */ printf("\033&l6A"); /* Set page size */ break; } printf("\033&l%dP", /* Set page length */ header->PageSize[1] / 12); printf("\033&l0E"); /* Set top margin to 0 */ } if (!Duplex || (Page & 1)) { /* * Set other job options... */ printf("\033&l%dX", header->NumCopies); /* Set number copies */ if (header->cupsMediaType && (!ppd || ppd->model_number != 2 || header->HWResolution[0] == 600)) printf("\033&l%dM", /* Set media type */ header->cupsMediaType); if (!ppd || ppd->model_number != 2) { int mode = Duplex ? 1 + header->Tumble != 0 : 0; printf("\033&l%dS", mode); /* Set duplex mode */ printf("\033&l0L"); /* Turn off perforation skip */ } } else if (!ppd || ppd->model_number != 2) printf("\033&a2G"); /* Set back side */ /* * Set graphics mode... */ if (ppd && ppd->model_number == 2) { /* * Figure out the number of color planes... */ if (header->cupsColorSpace == CUPS_CSPACE_KCMY) NumPlanes = 4; else NumPlanes = 1; /* * Set the resolution and top-of-form... */ printf("\033&u%dD", header->HWResolution[0]); /* Resolution */ printf("\033&l0e0L"); /* Reset top and don't skip */ printf("\033*p0Y\033*p0X"); /* Set top of form */ /* * Send 26-byte configure image data command with horizontal and * vertical resolutions as well as a color count... */ printf("\033*g26W"); putchar(2); /* Format 2 */ putchar((int)NumPlanes); /* Output planes */ putchar((int)(header->HWResolution[0] >> 8));/* Black resolution */ putchar((int)header->HWResolution[0]); putchar((int)(header->HWResolution[1] >> 8)); putchar((int)header->HWResolution[1]); putchar(0); putchar(1 << ColorBits); /* # of black levels */ putchar((int)(header->HWResolution[0] >> 8));/* Cyan resolution */ putchar((int)header->HWResolution[0]); putchar((int)(header->HWResolution[1] >> 8)); putchar((int)header->HWResolution[1]); putchar(0); putchar(1 << ColorBits); /* # of cyan levels */ putchar((int)(header->HWResolution[0] >> 8));/* Magenta resolution */ putchar((int)header->HWResolution[0]); putchar((int)(header->HWResolution[1] >> 8)); putchar((int)header->HWResolution[1]); putchar(0); putchar(1 << ColorBits); /* # of magenta levels */ putchar((int)(header->HWResolution[0] >> 8));/* Yellow resolution */ putchar((int)header->HWResolution[0]); putchar((int)(header->HWResolution[1] >> 8)); putchar((int)header->HWResolution[1]); putchar(0); putchar(1 << ColorBits); /* # of yellow levels */ printf("\033&l0H"); /* Set media position */ } else { printf("\033*t%uR", header->HWResolution[0]); /* Set resolution */ if (header->cupsColorSpace == CUPS_CSPACE_KCMY) { NumPlanes = 4; printf("\033*r-4U"); /* Set KCMY graphics */ } else if (header->cupsColorSpace == CUPS_CSPACE_CMY) { NumPlanes = 3; printf("\033*r-3U"); /* Set CMY graphics */ } else NumPlanes = 1; /* Black&white graphics */ /* * Set size and position of graphics... */ printf("\033*r%uS", header->cupsWidth); /* Set width */ printf("\033*r%uT", header->cupsHeight); /* Set height */ printf("\033&a0H"); /* Set horizontal position */ if (ppd) printf("\033&a%.0fV", /* Set vertical position */ 10.0 * (ppd->sizes[0].length - ppd->sizes[0].top)); else printf("\033&a0V"); /* Set top-of-page */ } printf("\033*r1A"); /* Start graphics */ if (header->cupsCompression) printf("\033*b%uM", /* Set compression */ header->cupsCompression); Feed = 0; /* No blank lines yet */ /* * Allocate memory for a line of graphics... */ if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL) { fputs("ERROR: Unable to allocate memory\n", stderr); exit(1); } for (plane = 1; plane < NumPlanes; plane ++) Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes; if (ColorBits > 1) BitBuffer = malloc(ColorBits * ((header->cupsWidth + 7) / 8)); else BitBuffer = NULL; if (header->cupsCompression) CompBuffer = malloc(header->cupsBytesPerLine * 2 + 2); else CompBuffer = NULL; } /* * 'EndPage()' - Finish a page of graphics. */ void EndPage(void) { /* * Eject the current page... */ if (NumPlanes > 1) { printf("\033*rC"); /* End color GFX */ if (!(Duplex && (Page & 1))) printf("\033&l0H"); /* Eject current page */ } else { printf("\033*r0B"); /* End GFX */ if (!(Duplex && (Page & 1))) printf("\014"); /* Eject current page */ } fflush(stdout); /* * Free memory... */ free(Planes[0]); if (BitBuffer) free(BitBuffer); if (CompBuffer) free(CompBuffer); } /* * 'Shutdown()' - Shutdown the printer. */ void Shutdown(void) { /* * Send a PCL reset sequence. */ putchar(0x1b); putchar('E'); } /* * 'CancelJob()' - Cancel the current job... */ void CancelJob(int sig) /* I - Signal */ { (void)sig; Canceled = 1; } /* * 'CompressData()' - Compress a line of graphics. */ void CompressData(unsigned char *line, /* I - Data to compress */ unsigned length, /* I - Number of bytes */ unsigned plane, /* I - Color plane */ unsigned type) /* I - Type of compression */ { unsigned char *line_ptr, /* Current byte pointer */ *line_end, /* End-of-line byte pointer */ *comp_ptr, /* Pointer into compression buffer */ *start; /* Start of compression sequence */ unsigned count; /* Count of bytes for output */ switch (type) { default : /* * Do no compression... */ line_ptr = line; line_end = line + length; break; case 1 : /* * Do run-length encoding... */ line_end = line + length; for (line_ptr = line, comp_ptr = CompBuffer; line_ptr < line_end; comp_ptr += 2, line_ptr += count) { for (count = 1; (line_ptr + count) < line_end && line_ptr[0] == line_ptr[count] && count < 256; count ++); comp_ptr[0] = (unsigned char)(count - 1); comp_ptr[1] = line_ptr[0]; } line_ptr = CompBuffer; line_end = comp_ptr; break; case 2 : /* * Do TIFF pack-bits encoding... */ line_ptr = line; line_end = line + length; comp_ptr = CompBuffer; while (line_ptr < line_end) { if ((line_ptr + 1) >= line_end) { /* * Single byte on the end... */ *comp_ptr++ = 0x00; *comp_ptr++ = *line_ptr++; } else if (line_ptr[0] == line_ptr[1]) { /* * Repeated sequence... */ line_ptr ++; count = 2; while (line_ptr < (line_end - 1) && line_ptr[0] == line_ptr[1] && count < 127) { line_ptr ++; count ++; } *comp_ptr++ = (unsigned char)(257 - count); *comp_ptr++ = *line_ptr++; } else { /* * Non-repeated sequence... */ start = line_ptr; line_ptr ++; count = 1; while (line_ptr < (line_end - 1) && line_ptr[0] != line_ptr[1] && count < 127) { line_ptr ++; count ++; } *comp_ptr++ = (unsigned char)(count - 1); memcpy(comp_ptr, start, count); comp_ptr += count; } } line_ptr = CompBuffer; line_end = comp_ptr; break; } /* * Set the length of the data and write a raster plane... */ printf("\033*b%d%c", (int)(line_end - line_ptr), plane); fwrite(line_ptr, (size_t)(line_end - line_ptr), 1, stdout); } /* * 'OutputLine()' - Output a line of graphics. */ void OutputLine(cups_page_header2_t *header) /* I - Page header */ { unsigned plane, /* Current plane */ bytes, /* Bytes to write */ count; /* Bytes to convert */ unsigned char bit, /* Current plane data */ bit0, /* Current low bit data */ bit1, /* Current high bit data */ *plane_ptr, /* Pointer into Planes */ *bit_ptr; /* Pointer into BitBuffer */ /* * Output whitespace as needed... */ if (Feed > 0) { printf("\033*b%dY", Feed); Feed = 0; } /* * Write bitmap data as needed... */ bytes = (header->cupsWidth + 7) / 8; for (plane = 0; plane < NumPlanes; plane ++) if (ColorBits == 1) { /* * Send bits as-is... */ CompressData(Planes[plane], bytes, plane < (NumPlanes - 1) ? 'V' : 'W', header->cupsCompression); } else { /* * Separate low and high bit data into separate buffers. */ for (count = header->cupsBytesPerLine / NumPlanes, plane_ptr = Planes[plane], bit_ptr = BitBuffer; count > 0; count -= 2, plane_ptr += 2, bit_ptr ++) { bit = plane_ptr[0]; bit0 = (unsigned char)(((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4)); bit1 = (unsigned char)((bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3)); if (count > 1) { bit = plane_ptr[1]; bit0 |= (unsigned char)((bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3)); bit1 |= (unsigned char)(((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4)); } bit_ptr[0] = bit0; bit_ptr[bytes] = bit1; } /* * Send low and high bits... */ CompressData(BitBuffer, bytes, 'V', header->cupsCompression); CompressData(BitBuffer + bytes, bytes, plane < (NumPlanes - 1) ? 'V' : 'W', header->cupsCompression); } fflush(stdout); } /* * 'main()' - Main entry and processing of driver. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream for printing */ cups_page_header2_t header; /* Page header from file */ unsigned y; /* Current line */ ppd_file_t *ppd; /* PPD file */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* * Make sure status messages are not buffered... */ setbuf(stderr, NULL); /* * Check command-line... */ if (argc < 6 || argc > 7) { /* * We don't have the correct number of arguments; write an error message * and return. */ _cupsLangPrintFilter(stderr, "ERROR", _("%s job-id user title copies options [file]"), "rastertohp"); return (1); } /* * Open the page stream... */ if (argc == 7) { if ((fd = open(argv[6], O_RDONLY)) == -1) { _cupsLangPrintError("ERROR", _("Unable to open raster file")); sleep(1); return (1); } } else fd = 0; ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* * Register a signal handler to eject the current page if the * job is cancelled. */ Canceled = 0; #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, CancelJob); #elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_handler = CancelJob; sigaction(SIGTERM, &action, NULL); #else signal(SIGTERM, CancelJob); #endif /* HAVE_SIGSET */ /* * Initialize the print device... */ ppd = ppdOpenFile(getenv("PPD")); if (!ppd) { ppd_status_t status; /* PPD error */ int linenum; /* Line number */ _cupsLangPrintFilter(stderr, "ERROR", _("The PPD file could not be opened.")); status = ppdLastError(&linenum); fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); return (1); } Setup(); /* * Process pages as needed... */ Page = 0; while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ if (Canceled) break; Page ++; fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies); _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); /* * Start the page... */ StartPage(ppd, &header); /* * Loop for each line on the page... */ for (y = 0; y < header.cupsHeight; y ++) { /* * Let the user know how far we have progressed... */ if (Canceled) break; if ((y & 127) == 0) { _cupsLangPrintFilter(stderr, "INFO", _("Printing page %d, %u%% complete."), Page, 100 * y / header.cupsHeight); fprintf(stderr, "ATTR: job-media-progress=%u\n", 100 * y / header.cupsHeight); } /* * Read a line of graphics... */ if (cupsRasterReadPixels(ras, Planes[0], header.cupsBytesPerLine) < 1) break; /* * See if the line is blank; if not, write it to the printer... */ if (Planes[0][0] || memcmp(Planes[0], Planes[0] + 1, header.cupsBytesPerLine - 1)) OutputLine(&header); else Feed ++; } /* * Eject the page... */ _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); EndPage(); if (Canceled) break; } /* * Shutdown the printer... */ Shutdown(); if (ppd) ppdClose(ppd); /* * Close the raster stream... */ cupsRasterClose(ras); if (fd != 0) close(fd); /* * If no pages were printed, send an error message... */ if (Page == 0) { _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); return (1); } else return (0); } cups-2.3.1/filter/common.h000664 000765 000024 00000002500 13574721672 015522 0ustar00mikestaff000000 000000 /* * Common filter definitions for CUPS. * * Copyright 2007-2010 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include #include #include /* * C++ magic... */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* * Globals... */ extern int Orientation, /* 0 = portrait, 1 = landscape, etc. */ Duplex, /* Duplexed? */ LanguageLevel, /* Language level of printer */ ColorDevice; /* Do color text? */ extern float PageLeft, /* Left margin */ PageRight, /* Right margin */ PageBottom, /* Bottom margin */ PageTop, /* Top margin */ PageWidth, /* Total page width */ PageLength; /* Total page length */ /* * Prototypes... */ extern ppd_file_t *SetCommonOptions(int num_options, cups_option_t *options, int change_size); extern void UpdatePageVars(void); extern void WriteCommon(void); extern void WriteLabelProlog(const char *label, float bottom, float top, float width); extern void WriteLabels(int orient); extern void WriteTextComment(const char *name, const char *value); /* * C++ magic... */ #ifdef __cplusplus } #endif /* __cplusplus */ cups-2.3.1/filter/commandtops.c000664 000765 000024 00000026425 13574721672 016565 0ustar00mikestaff000000 000000 /* * PostScript command filter for CUPS. * * Copyright 2008-2014 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include #include /* * Local functions... */ static int auto_configure(ppd_file_t *ppd, const char *user); static void begin_ps(ppd_file_t *ppd, const char *user); static void end_ps(ppd_file_t *ppd); static void print_self_test_page(ppd_file_t *ppd, const char *user); static void report_levels(ppd_file_t *ppd, const char *user); /* * 'main()' - Process a CUPS command file. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int status = 0; /* Exit status */ cups_file_t *fp; /* Command file */ char line[1024], /* Line from file */ *value; /* Value on line */ int linenum; /* Line number in file */ ppd_file_t *ppd; /* PPD file */ /* * Check for valid arguments... */ if (argc < 6 || argc > 7) { /* * We don't have the correct number of arguments; write an error message * and return. */ _cupsLangPrintf(stderr, _("Usage: %s job-id user title copies options [file]"), argv[0]); return (1); } /* * Open the PPD file... */ if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) { fputs("ERROR: Unable to open PPD file!\n", stderr); return (1); } /* * Open the command file as needed... */ if (argc == 7) { if ((fp = cupsFileOpen(argv[6], "r")) == NULL) { perror("ERROR: Unable to open command file - "); return (1); } } else fp = cupsFileStdin(); /* * Read the commands from the file and send the appropriate commands... */ linenum = 0; while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { /* * Parse the command... */ if (!_cups_strcasecmp(line, "AutoConfigure")) status |= auto_configure(ppd, argv[2]); else if (!_cups_strcasecmp(line, "PrintSelfTestPage")) print_self_test_page(ppd, argv[2]); else if (!_cups_strcasecmp(line, "ReportLevels")) report_levels(ppd, argv[2]); else { _cupsLangPrintFilter(stderr, "ERROR", _("Invalid printer command \"%s\"."), line); status = 1; } } return (status); } /* * 'auto_configure()' - Automatically configure the printer using PostScript * query commands and/or SNMP lookups. */ static int /* O - Exit status */ auto_configure(ppd_file_t *ppd, /* I - PPD file */ const char *user) /* I - Printing user */ { int status = 0; /* Exit status */ ppd_option_t *option; /* Current option in PPD */ ppd_attr_t *attr; /* Query command attribute */ const char *valptr; /* Pointer into attribute value */ char buffer[1024], /* String buffer */ *bufptr; /* Pointer into buffer */ ssize_t bytes; /* Number of bytes read */ int datalen; /* Side-channel data length */ /* * See if the backend supports bidirectional I/O... */ datalen = 1; if (cupsSideChannelDoRequest(CUPS_SC_CMD_GET_BIDI, buffer, &datalen, 30.0) != CUPS_SC_STATUS_OK || buffer[0] != CUPS_SC_BIDI_SUPPORTED) { fputs("DEBUG: Unable to auto-configure PostScript Printer - no " "bidirectional I/O available!\n", stderr); return (1); } /* * Put the printer in PostScript mode... */ begin_ps(ppd, user); /* * (STR #4028) * * As a lot of PPDs contain bad PostScript query code, we need to prevent one * bad query sequence from affecting all auto-configuration. The following * error handler allows us to log PostScript errors to cupsd. */ puts("/cups_handleerror {\n" " $error /newerror false put\n" " (:PostScript error in \") print cups_query_keyword print (\": ) " "print\n" " $error /errorname get 128 string cvs print\n" " (; offending command:) print $error /command get 128 string cvs " "print (\n) print flush\n" "} bind def\n" "errordict /timeout {} put\n" "/cups_query_keyword (?Unknown) def\n"); fflush(stdout); /* * Wait for the printer to become connected... */ do { sleep(1); datalen = 1; } while (cupsSideChannelDoRequest(CUPS_SC_CMD_GET_CONNECTED, buffer, &datalen, 5.0) == CUPS_SC_STATUS_OK && !buffer[0]); /* * Then loop through every option in the PPD file and ask for the current * value... */ fputs("DEBUG: Auto-configuring PostScript printer...\n", stderr); for (option = ppdFirstOption(ppd); option; option = ppdNextOption(ppd)) { /* * See if we have a query command for this option... */ snprintf(buffer, sizeof(buffer), "?%s", option->keyword); if ((attr = ppdFindAttr(ppd, buffer, NULL)) == NULL || !attr->value) { fprintf(stderr, "DEBUG: Skipping %s option...\n", option->keyword); continue; } /* * Send the query code to the printer... */ fprintf(stderr, "DEBUG: Querying %s...\n", option->keyword); for (bufptr = buffer, valptr = attr->value; *valptr; valptr ++) { /* * Log the query code, breaking at newlines... */ if (*valptr == '\n') { *bufptr = '\0'; fprintf(stderr, "DEBUG: %s\\n\n", buffer); bufptr = buffer; } else if (*valptr < ' ') { if (bufptr >= (buffer + sizeof(buffer) - 4)) { *bufptr = '\0'; fprintf(stderr, "DEBUG: %s\n", buffer); bufptr = buffer; } if (*valptr == '\r') { *bufptr++ = '\\'; *bufptr++ = 'r'; } else if (*valptr == '\t') { *bufptr++ = '\\'; *bufptr++ = 't'; } else { *bufptr++ = '\\'; *bufptr++ = '0' + ((*valptr / 64) & 7); *bufptr++ = '0' + ((*valptr / 8) & 7); *bufptr++ = '0' + (*valptr & 7); } } else { if (bufptr >= (buffer + sizeof(buffer) - 1)) { *bufptr = '\0'; fprintf(stderr, "DEBUG: %s\n", buffer); bufptr = buffer; } *bufptr++ = *valptr; } } if (bufptr > buffer) { *bufptr = '\0'; fprintf(stderr, "DEBUG: %s\n", buffer); } printf("/cups_query_keyword (?%s) def\n", option->keyword); /* Set keyword for error reporting */ fputs("{ (", stdout); for (valptr = attr->value; *valptr; valptr ++) { if (*valptr == '(' || *valptr == ')' || *valptr == '\\') putchar('\\'); putchar(*valptr); } fputs(") cvx exec } stopped { cups_handleerror } if clear\n", stdout); /* Send query code */ fflush(stdout); datalen = 0; cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, buffer, &datalen, 5.0); /* * Read the response data... */ bufptr = buffer; buffer[0] = '\0'; while ((bytes = cupsBackChannelRead(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer) - 1, 10.0)) > 0) { /* * No newline at the end? Go on reading ... */ bufptr += bytes; *bufptr = '\0'; if (bytes == 0 || (bufptr > buffer && bufptr[-1] != '\r' && bufptr[-1] != '\n')) continue; /* * Trim whitespace and control characters from both ends... */ bytes = bufptr - buffer; for (bufptr --; bufptr >= buffer; bufptr --) if (isspace(*bufptr & 255) || iscntrl(*bufptr & 255)) *bufptr = '\0'; else break; for (bufptr = buffer; isspace(*bufptr & 255) || iscntrl(*bufptr & 255); bufptr ++); if (bufptr > buffer) { _cups_strcpy(buffer, bufptr); bufptr = buffer; } fprintf(stderr, "DEBUG: Got %d bytes.\n", (int)bytes); /* * Skip blank lines... */ if (!buffer[0]) continue; /* * Check the response... */ if ((bufptr = strchr(buffer, ':')) != NULL) { /* * PostScript code for this option in the PPD is broken; show the * interpreter's error message that came back... */ fprintf(stderr, "DEBUG%s\n", bufptr); break; } /* * Verify the result is a valid option choice... */ if (!ppdFindChoice(option, buffer)) { if (!strcasecmp(buffer, "Unknown")) break; bufptr = buffer; buffer[0] = '\0'; continue; } /* * Write out the result and move on to the next option... */ fprintf(stderr, "PPD: Default%s=%s\n", option->keyword, buffer); break; } /* * Printer did not answer this option's query */ if (bytes <= 0) { fprintf(stderr, "DEBUG: No answer to query for option %s within 10 seconds.\n", option->keyword); status = 1; } } /* * Finish the job... */ fflush(stdout); end_ps(ppd); /* * Return... */ if (status) _cupsLangPrintFilter(stderr, "WARNING", _("Unable to configure printer options.")); return (0); } /* * 'begin_ps()' - Send the standard PostScript prolog. */ static void begin_ps(ppd_file_t *ppd, /* I - PPD file */ const char *user) /* I - Username */ { (void)user; if (ppd->jcl_begin) { fputs(ppd->jcl_begin, stdout); fputs(ppd->jcl_ps, stdout); } puts("%!"); puts("userdict dup(\\004)cvn{}put (\\004\\004)cvn{}put\n"); fflush(stdout); } /* * 'end_ps()' - Send the standard PostScript trailer. */ static void end_ps(ppd_file_t *ppd) /* I - PPD file */ { if (ppd->jcl_end) fputs(ppd->jcl_end, stdout); else putchar(0x04); fflush(stdout); } /* * 'print_self_test_page()' - Print a self-test page. */ static void print_self_test_page(ppd_file_t *ppd, /* I - PPD file */ const char *user) /* I - Printing user */ { /* * Put the printer in PostScript mode... */ begin_ps(ppd, user); /* * Send a simple file the draws a box around the imageable area and shows * the product/interpreter information... */ puts("\r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" "%%%%%%%%%%%%%\n" "\r%%%% If you can read this, you are using the wrong driver for your " "printer. %%%%\n" "\r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" "%%%%%%%%%%%%%\n" "0 setgray\n" "2 setlinewidth\n" "initclip newpath clippath gsave stroke grestore pathbbox\n" "exch pop exch pop exch 9 add exch 9 sub moveto\n" "/Courier findfont 12 scalefont setfont\n" "0 -12 rmoveto gsave product show grestore\n" "0 -12 rmoveto gsave version show ( ) show revision 20 string cvs show " "grestore\n" "0 -12 rmoveto gsave serialnumber 20 string cvs show grestore\n" "showpage"); /* * Finish the job... */ end_ps(ppd); } /* * 'report_levels()' - Report supply levels. */ static void report_levels(ppd_file_t *ppd, /* I - PPD file */ const char *user) /* I - Printing user */ { /* * Put the printer in PostScript mode... */ begin_ps(ppd, user); /* * Don't bother sending any additional PostScript commands, since we just * want the backend to have enough time to collect the supply info. */ /* * Finish the job... */ end_ps(ppd); } cups-2.3.1/filter/raster-driver.shtml000664 000765 000024 00000027135 13574721672 017736 0ustar00mikestaff000000 000000

Printer Driver Basics

A CUPS raster printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, one or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into CUPS raster data. Figure 1 shows the data flow of a typical print job.

The raster filter converts CUPS raster data into a format the printer understands, for example HP-PCL. CUPS includes several sample raster filters supporting standard page description languages (PDLs). Table 1 shows the raster filters that are bundled with CUPS and the languages they support.

Table 1: Standard CUPS Raster Filters
FilterPDLsppdc DriverTypeppdc #include file
rastertoepsonESC/P, ESC/P2epsonepson.h
rastertoescpxESC/P, ESC/P2, EPSON Remote Modeescpescp.h
rastertohpHP-PCL3, HP-PCL5hphp.h
rastertolabelCPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPLlabellabel.h
rastertopclxHP-RTL, HP-PCL3, HP-PCL3GUI, HP-PCL5, HP-PCL5c, HP-PCL5epclpcl.h

The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

Raster printer drivers must provide their own command filter.

Creating New PPD Files

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for several similar black-and-white HP-PCL5 laser printers.

Listing 1: "examples/laserjet-basic.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// Include HP-PCL driver definitions
#include <pcl.h>

// Specify that this driver uses the HP-PCL driver...
DriverType pcl

// Specify the driver options via the model number...
ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and driver version
Manufacturer "HP"
Version 1.0

// Supported page sizes and their margins
HWMargins 18 12 18 12
*MediaSize Letter
MediaSize Legal
MediaSize Executive
MediaSize Monarch
MediaSize Statement
MediaSize FanFoldGermanLegal

HWMargins 18 12.72 18 12.72
MediaSize Env10

HWMargins 9.72 12 9.72 12
MediaSize A4
MediaSize A5
MediaSize B5
MediaSize EnvC5
MediaSize EnvDL
MediaSize EnvISOB5
MediaSize Postcard
MediaSize DoublePostcard

// Only black-and-white output with mode 3 compression...
ColorModel Gray k chunky 3

// Supported resolutions
Resolution - 1 0 0 0 "300dpi/300 DPI"
*Resolution - 8 0 0 0 "600dpi/600 DPI"

// Supported input slots
*InputSlot 7 "Auto/Automatic Selection"
InputSlot 2 "Manual/Tray 1 - Manual Feed"
InputSlot 4 "Upper/Tray 1"
InputSlot 1 "Lower/Tray 2"
InputSlot 5 "LargeCapacity/Tray 3"

// Tray 3 is an option...
Installable "OptionLargeCapacity/Tray 3 Installed"
UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity"

{
  // HP LaserJet 2100 Series
  Throughput 10
  ModelName "LaserJet 2100 Series"
  PCFileName "hpljt211.ppd"
}

{
  // LaserJet 2200 and 2300 series have duplexer option...
  Duplex normal
  Installable "OptionDuplex/Duplexer Installed"
  UIConstraints "*OptionDuplex False *Duplex"

  {
    // HP LaserJet 2200 Series
    Throughput 19
    ModelName "LaserJet 2200 Series"
    PCFileName "hpljt221.ppd"
  }

  {
    // HP LaserJet 2300 Series
    Throughput 25
    ModelName "LaserJet 2300 Series"
    PCFileName "hpljt231.ppd"
  }
}

Using Filters

The standard CUPS raster filters can be specified using the DriverType directive, for example:

// Specify that this driver uses the HP-PCL driver...
DriverType pcl

Table 1 shows the driver types for each of the standard CUPS raster filters. For drivers that do not use the standard raster filters, the "custom" type is used with Filter directives:

DriverType custom
Filter application/vnd.cups-raster 100 /path/to/raster/filter
Filter application/vnd.cups-command 100 /path/to/command/filter

Implementing Color Management

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

Since macOS 10.5Custom Color Matching Support

macOS printer drivers that are based on an existing standard RGB colorspace can tell the system to use the corresponding colorspace instead of an arbitrary ICC color profile when doing color management. The APSupportsCustomColorMatching and APDefaultCustomColorMatchingProfile attributes can be used to enable this mode:

Attribute APSupportsCustomColorMatching "" true
Attribute APDefaultCustomColorMatchingProfile "" sRGB

Adding macOS Features

macOS printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
Attribute APPrinterPreset "name/text" "*option choice ..."
cups-2.3.1/filter/rastertopwg.c000664 000765 000024 00000040550 13574721672 016615 0ustar00mikestaff000000 000000 /* * CUPS raster to PWG raster format filter for CUPS. * * Copyright © 2011, 2014-2017 Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include #include #include /* * 'main()' - Main entry for filter. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { const char *final_content_type; /* FINAL_CONTENT_TYPE env var */ int fd; /* Raster file */ cups_raster_t *inras, /* Input raster stream */ *outras; /* Output raster stream */ cups_page_header2_t inheader, /* Input raster page header */ outheader; /* Output raster page header */ unsigned y; /* Current line */ unsigned char *line; /* Line buffer */ unsigned page = 0, /* Current page */ page_width, /* Actual page width */ page_height, /* Actual page height */ page_top, /* Top margin */ page_bottom, /* Bottom margin */ page_left, /* Left margin */ linesize, /* Bytes per line */ lineoffset; /* Offset into line */ unsigned char white; /* White pixel */ ppd_file_t *ppd; /* PPD file */ ppd_attr_t *back; /* cupsBackSide attribute */ _ppd_cache_t *cache; /* PPD cache */ pwg_size_t *pwg_size; /* PWG media size */ pwg_media_t *pwg_media; /* PWG media name */ int num_options; /* Number of options */ cups_option_t *options = NULL;/* Options */ const char *val; /* Option value */ if (argc < 6 || argc > 7) { puts("Usage: rastertopwg job user title copies options [filename]"); return (1); } else if (argc == 7) { if ((fd = open(argv[6], O_RDONLY)) < 0) { perror("ERROR: Unable to open print file"); return (1); } } else fd = 0; if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) final_content_type = "image/pwg-raster"; inras = cupsRasterOpen(fd, CUPS_RASTER_READ); outras = cupsRasterOpen(1, !strcmp(final_content_type, "image/pwg-raster") ? CUPS_RASTER_WRITE_PWG : CUPS_RASTER_WRITE_APPLE); ppd = ppdOpenFile(getenv("PPD")); back = ppdFindAttr(ppd, "cupsBackSide", NULL); num_options = cupsParseOptions(argv[5], 0, &options); ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); cache = ppd ? ppd->cache : NULL; while (cupsRasterReadHeader2(inras, &inheader)) { /* * Show page device dictionary... */ fprintf(stderr, "DEBUG: Duplex = %d\n", inheader.Duplex); fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", inheader.HWResolution[0], inheader.HWResolution[1]); fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", inheader.ImagingBoundingBox[0], inheader.ImagingBoundingBox[1], inheader.ImagingBoundingBox[2], inheader.ImagingBoundingBox[3]); fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", inheader.Margins[0], inheader.Margins[1]); fprintf(stderr, "DEBUG: ManualFeed = %d\n", inheader.ManualFeed); fprintf(stderr, "DEBUG: MediaPosition = %d\n", inheader.MediaPosition); fprintf(stderr, "DEBUG: NumCopies = %d\n", inheader.NumCopies); fprintf(stderr, "DEBUG: Orientation = %d\n", inheader.Orientation); fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", inheader.PageSize[0], inheader.PageSize[1]); fprintf(stderr, "DEBUG: cupsWidth = %d\n", inheader.cupsWidth); fprintf(stderr, "DEBUG: cupsHeight = %d\n", inheader.cupsHeight); fprintf(stderr, "DEBUG: cupsMediaType = %d\n", inheader.cupsMediaType); fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", inheader.cupsBitsPerColor); fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", inheader.cupsBitsPerPixel); fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", inheader.cupsBytesPerLine); fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", inheader.cupsColorOrder); fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", inheader.cupsColorSpace); fprintf(stderr, "DEBUG: cupsCompression = %d\n", inheader.cupsCompression); /* * Compute the real raster size... */ page ++; fprintf(stderr, "PAGE: %d %d\n", page, inheader.NumCopies); page_width = (unsigned)(inheader.cupsPageSize[0] * inheader.HWResolution[0] / 72.0); page_height = (unsigned)(inheader.cupsPageSize[1] * inheader.HWResolution[1] / 72.0); page_left = (unsigned)(inheader.cupsImagingBBox[0] * inheader.HWResolution[0] / 72.0); page_bottom = (unsigned)(inheader.cupsImagingBBox[1] * inheader.HWResolution[1] / 72.0); page_top = page_height - page_bottom - inheader.cupsHeight; linesize = (page_width * inheader.cupsBitsPerPixel + 7) / 8; lineoffset = page_left * inheader.cupsBitsPerPixel / 8; /* Round down */ if (page_left > page_width || page_top > page_height || page_bottom > page_height) { _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); fprintf(stderr, "DEBUG: Bad bottom/left/top margin on page %d.\n", page); return (1); } switch (inheader.cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_RGB : case CUPS_CSPACE_SW : case CUPS_CSPACE_SRGB : case CUPS_CSPACE_ADOBERGB : white = 255; break; case CUPS_CSPACE_K : case CUPS_CSPACE_CMYK : case CUPS_CSPACE_DEVICE1 : case CUPS_CSPACE_DEVICE2 : case CUPS_CSPACE_DEVICE3 : case CUPS_CSPACE_DEVICE4 : case CUPS_CSPACE_DEVICE5 : case CUPS_CSPACE_DEVICE6 : case CUPS_CSPACE_DEVICE7 : case CUPS_CSPACE_DEVICE8 : case CUPS_CSPACE_DEVICE9 : case CUPS_CSPACE_DEVICEA : case CUPS_CSPACE_DEVICEB : case CUPS_CSPACE_DEVICEC : case CUPS_CSPACE_DEVICED : case CUPS_CSPACE_DEVICEE : case CUPS_CSPACE_DEVICEF : white = 0; break; default : _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); fprintf(stderr, "DEBUG: Unsupported cupsColorSpace %d on page %d.\n", inheader.cupsColorSpace, page); return (1); } if (inheader.cupsColorOrder != CUPS_ORDER_CHUNKED) { _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); fprintf(stderr, "DEBUG: Unsupported cupsColorOrder %d on page %d.\n", inheader.cupsColorOrder, page); return (1); } if (inheader.cupsBitsPerPixel != 1 && inheader.cupsBitsPerColor != 8 && inheader.cupsBitsPerColor != 16) { _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); fprintf(stderr, "DEBUG: Unsupported cupsBitsPerColor %d on page %d.\n", inheader.cupsBitsPerColor, page); return (1); } memcpy(&outheader, &inheader, sizeof(outheader)); outheader.cupsWidth = page_width; outheader.cupsHeight = page_height; outheader.cupsBytesPerLine = linesize; outheader.cupsInteger[14] = 0; /* VendorIdentifier */ outheader.cupsInteger[15] = 0; /* VendorLength */ if ((val = cupsGetOption("print-content-optimize", num_options, options)) != NULL) { if (!strcmp(val, "automatic")) strlcpy(outheader.OutputType, "Automatic", sizeof(outheader.OutputType)); else if (!strcmp(val, "graphics")) strlcpy(outheader.OutputType, "Graphics", sizeof(outheader.OutputType)); else if (!strcmp(val, "photo")) strlcpy(outheader.OutputType, "Photo", sizeof(outheader.OutputType)); else if (!strcmp(val, "text")) strlcpy(outheader.OutputType, "Text", sizeof(outheader.OutputType)); else if (!strcmp(val, "text-and-graphics")) strlcpy(outheader.OutputType, "TextAndGraphics", sizeof(outheader.OutputType)); else { fputs("DEBUG: Unsupported print-content-optimize value.\n", stderr); outheader.OutputType[0] = '\0'; } } if ((val = cupsGetOption("print-quality", num_options, options)) != NULL) { unsigned quality = (unsigned)atoi(val); /* print-quality value */ if (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH) outheader.cupsInteger[8] = quality; else { fprintf(stderr, "DEBUG: Unsupported print-quality %d.\n", quality); outheader.cupsInteger[8] = 0; } } if ((val = cupsGetOption("print-rendering-intent", num_options, options)) != NULL) { if (!strcmp(val, "absolute")) strlcpy(outheader.cupsRenderingIntent, "Absolute", sizeof(outheader.cupsRenderingIntent)); else if (!strcmp(val, "automatic")) strlcpy(outheader.cupsRenderingIntent, "Automatic", sizeof(outheader.cupsRenderingIntent)); else if (!strcmp(val, "perceptual")) strlcpy(outheader.cupsRenderingIntent, "Perceptual", sizeof(outheader.cupsRenderingIntent)); else if (!strcmp(val, "relative")) strlcpy(outheader.cupsRenderingIntent, "Relative", sizeof(outheader.cupsRenderingIntent)); else if (!strcmp(val, "relative-bpc")) strlcpy(outheader.cupsRenderingIntent, "RelativeBpc", sizeof(outheader.cupsRenderingIntent)); else if (!strcmp(val, "saturation")) strlcpy(outheader.cupsRenderingIntent, "Saturation", sizeof(outheader.cupsRenderingIntent)); else { fputs("DEBUG: Unsupported print-rendering-intent value.\n", stderr); outheader.cupsRenderingIntent[0] = '\0'; } } if (inheader.cupsPageSizeName[0] && (pwg_size = _ppdCacheGetSize(cache, inheader.cupsPageSizeName)) != NULL) { strlcpy(outheader.cupsPageSizeName, pwg_size->map.pwg, sizeof(outheader.cupsPageSizeName)); } else { pwg_media = pwgMediaForSize((int)(2540.0 * inheader.cupsPageSize[0] / 72.0), (int)(2540.0 * inheader.cupsPageSize[1] / 72.0)); if (pwg_media) strlcpy(outheader.cupsPageSizeName, pwg_media->pwg, sizeof(outheader.cupsPageSizeName)); else { fprintf(stderr, "DEBUG: Unsupported PageSize %.2fx%.2f.\n", inheader.cupsPageSize[0], inheader.cupsPageSize[1]); outheader.cupsPageSizeName[0] = '\0'; } } if (inheader.Duplex && !(page & 1) && back && _cups_strcasecmp(back->value, "Normal")) { if (_cups_strcasecmp(back->value, "Flipped")) { if (inheader.Tumble) { outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */ outheader.cupsInteger[2] = 1; /* FeedTransform */ outheader.cupsInteger[3] = page_width - page_left - inheader.cupsWidth; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_top; /* ImageBoxTop */ outheader.cupsInteger[5] = page_width - page_left; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_bottom; /* ImageBoxBottom */ } else { outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ outheader.cupsInteger[2] = ~0U;/* FeedTransform */ outheader.cupsInteger[3] = page_left; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_bottom; /* ImageBoxTop */ outheader.cupsInteger[5] = page_left + inheader.cupsWidth; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_top; /* ImageBoxBottom */ } } else if (_cups_strcasecmp(back->value, "ManualTumble")) { if (inheader.Tumble) { outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */ outheader.cupsInteger[2] = ~0U;/* FeedTransform */ outheader.cupsInteger[3] = page_width - page_left - inheader.cupsWidth; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_bottom; /* ImageBoxTop */ outheader.cupsInteger[5] = page_width - page_left; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_top; /* ImageBoxBottom */ } else { outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ outheader.cupsInteger[2] = 1; /* FeedTransform */ outheader.cupsInteger[3] = page_left; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_top; /* ImageBoxTop */ outheader.cupsInteger[5] = page_left + inheader.cupsWidth; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_bottom; /* ImageBoxBottom */ } } else if (_cups_strcasecmp(back->value, "Rotated")) { if (inheader.Tumble) { outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */ outheader.cupsInteger[2] = ~0U;/* FeedTransform */ outheader.cupsInteger[3] = page_width - page_left - inheader.cupsWidth; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_bottom; /* ImageBoxTop */ outheader.cupsInteger[5] = page_width - page_left; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_top; /* ImageBoxBottom */ } else { outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ outheader.cupsInteger[2] = 1; /* FeedTransform */ outheader.cupsInteger[3] = page_left; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_top; /* ImageBoxTop */ outheader.cupsInteger[5] = page_left + inheader.cupsWidth; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_bottom; /* ImageBoxBottom */ } } else { /* * Unsupported value... */ fputs("DEBUG: Unsupported cupsBackSide value.\n", stderr); outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ outheader.cupsInteger[2] = 1; /* FeedTransform */ outheader.cupsInteger[3] = page_left; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_top; /* ImageBoxTop */ outheader.cupsInteger[5] = page_left + inheader.cupsWidth; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_bottom; /* ImageBoxBottom */ } } else { outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ outheader.cupsInteger[2] = 1; /* FeedTransform */ outheader.cupsInteger[3] = page_left; /* ImageBoxLeft */ outheader.cupsInteger[4] = page_top; /* ImageBoxTop */ outheader.cupsInteger[5] = page_left + inheader.cupsWidth; /* ImageBoxRight */ outheader.cupsInteger[6] = page_height - page_bottom; /* ImageBoxBottom */ } if (!cupsRasterWriteHeader2(outras, &outheader)) { _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); fprintf(stderr, "DEBUG: Unable to write header for page %d.\n", page); return (1); } /* * Copy raster data... */ if (linesize < inheader.cupsBytesPerLine) linesize = inheader.cupsBytesPerLine; if ((lineoffset + inheader.cupsBytesPerLine) > linesize) lineoffset = linesize - inheader.cupsBytesPerLine; line = malloc(linesize); memset(line, white, linesize); for (y = page_top; y > 0; y --) if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) { _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", page_top - y + 1, page); return (1); } for (y = inheader.cupsHeight; y > 0; y --) { if (cupsRasterReadPixels(inras, line + lineoffset, inheader.cupsBytesPerLine) != inheader.cupsBytesPerLine) { _cupsLangPrintFilter(stderr, "ERROR", _("Error reading raster data.")); fprintf(stderr, "DEBUG: Unable to read line %d for page %d.\n", inheader.cupsHeight - y + page_top + 1, page); return (1); } if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) { _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", inheader.cupsHeight - y + page_top + 1, page); return (1); } } memset(line, white, linesize); for (y = page_bottom; y > 0; y --) if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) { _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", page_bottom - y + page_top + inheader.cupsHeight + 1, page); return (1); } free(line); } cupsRasterClose(inras); if (fd) close(fd); cupsRasterClose(outras); return (0); } cups-2.3.1/filter/pstops.c000664 000765 000024 00000250757 13574721672 015600 0ustar00mikestaff000000 000000 /* * PostScript filter for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1993-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "common.h" #include #include #include #include #include #include /* * Constants... */ #define PSTOPS_BORDERNONE 0 /* No border or hairline border */ #define PSTOPS_BORDERTHICK 1 /* Think border */ #define PSTOPS_BORDERSINGLE 2 /* Single-line hairline border */ #define PSTOPS_BORDERSINGLE2 3 /* Single-line thick border */ #define PSTOPS_BORDERDOUBLE 4 /* Double-line hairline border */ #define PSTOPS_BORDERDOUBLE2 5 /* Double-line thick border */ #define PSTOPS_LAYOUT_LRBT 0 /* Left to right, bottom to top */ #define PSTOPS_LAYOUT_LRTB 1 /* Left to right, top to bottom */ #define PSTOPS_LAYOUT_RLBT 2 /* Right to left, bottom to top */ #define PSTOPS_LAYOUT_RLTB 3 /* Right to left, top to bottom */ #define PSTOPS_LAYOUT_BTLR 4 /* Bottom to top, left to right */ #define PSTOPS_LAYOUT_TBLR 5 /* Top to bottom, left to right */ #define PSTOPS_LAYOUT_BTRL 6 /* Bottom to top, right to left */ #define PSTOPS_LAYOUT_TBRL 7 /* Top to bottom, right to left */ #define PSTOPS_LAYOUT_NEGATEY 1 /* The bits for the layout */ #define PSTOPS_LAYOUT_NEGATEX 2 /* definitions above... */ #define PSTOPS_LAYOUT_VERTICAL 4 /* * Types... */ typedef struct /**** Page information ****/ { char *label; /* Page label */ int bounding_box[4]; /* PageBoundingBox */ off_t offset; /* Offset to start of page */ ssize_t length; /* Number of bytes for page */ int num_options; /* Number of options for this page */ cups_option_t *options; /* Options for this page */ } pstops_page_t; typedef struct /**** Document information ****/ { int page; /* Current page */ int bounding_box[4]; /* BoundingBox from header */ int new_bounding_box[4]; /* New composite bounding box */ int num_options; /* Number of document-wide options */ cups_option_t *options; /* Document-wide options */ int normal_landscape, /* Normal rotation for landscape? */ saw_eof, /* Saw the %%EOF comment? */ slow_collate, /* Collate copies by hand? */ slow_duplex, /* Duplex pages slowly? */ slow_order, /* Reverse pages slowly? */ use_ESPshowpage; /* Use ESPshowpage? */ cups_array_t *pages; /* Pages in document */ cups_file_t *temp; /* Temporary file, if any */ char tempfile[1024]; /* Temporary filename */ int job_id; /* Job ID */ const char *user, /* User name */ *title; /* Job name */ int copies; /* Number of copies */ const char *ap_input_slot, /* AP_FIRSTPAGE_InputSlot value */ *ap_manual_feed, /* AP_FIRSTPAGE_ManualFeed value */ *ap_media_color, /* AP_FIRSTPAGE_MediaColor value */ *ap_media_type, /* AP_FIRSTPAGE_MediaType value */ *ap_page_region, /* AP_FIRSTPAGE_PageRegion value */ *ap_page_size; /* AP_FIRSTPAGE_PageSize value */ int collate, /* Collate copies? */ emit_jcl, /* Emit JCL commands? */ fit_to_page; /* Fit pages to media */ const char *input_slot, /* InputSlot value */ *manual_feed, /* ManualFeed value */ *media_color, /* MediaColor value */ *media_type, /* MediaType value */ *page_region, /* PageRegion value */ *page_size; /* PageSize value */ int mirror, /* doc->mirror/mirror pages */ number_up, /* Number of pages on each sheet */ number_up_layout, /* doc->number_up_layout of N-up pages */ output_order, /* Requested reverse output order? */ page_border; /* doc->page_border around pages */ const char *page_label, /* page-label option, if any */ *page_ranges, /* page-ranges option, if any */ *page_set; /* page-set option, if any */ } pstops_doc_t; /* * Convenience macros... */ #define is_first_page(p) (doc->number_up == 1 || \ ((p) % doc->number_up) == 1) #define is_last_page(p) (doc->number_up == 1 || \ ((p) % doc->number_up) == 0) #define is_not_last_page(p) (doc->number_up > 1 && \ ((p) % doc->number_up) != 0) /* * Local globals... */ static int JobCanceled = 0;/* Set to 1 on SIGTERM */ /* * Local functions... */ static pstops_page_t *add_page(pstops_doc_t *doc, const char *label); static void cancel_job(int sig); static int check_range(pstops_doc_t *doc, int page); static void copy_bytes(cups_file_t *fp, off_t offset, size_t length); static ssize_t copy_comments(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, char *line, ssize_t linelen, size_t linesize); static void copy_dsc(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, char *line, ssize_t linelen, size_t linesize); static void copy_non_dsc(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, char *line, ssize_t linelen, size_t linesize); static ssize_t copy_page(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, int number, char *line, ssize_t linelen, size_t linesize); static ssize_t copy_prolog(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, char *line, ssize_t linelen, size_t linesize); static ssize_t copy_setup(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, char *line, ssize_t linelen, size_t linesize); static ssize_t copy_trailer(cups_file_t *fp, pstops_doc_t *doc, ppd_file_t *ppd, int number, char *line, ssize_t linelen, size_t linesize); static void do_prolog(pstops_doc_t *doc, ppd_file_t *ppd); static void do_setup(pstops_doc_t *doc, ppd_file_t *ppd); static void doc_printf(pstops_doc_t *doc, const char *format, ...) _CUPS_FORMAT(2, 3); static void doc_puts(pstops_doc_t *doc, const char *s); static void doc_write(pstops_doc_t *doc, const char *s, size_t len); static void end_nup(pstops_doc_t *doc, int number); static int include_feature(ppd_file_t *ppd, const char *line, int num_options, cups_option_t **options); static char *parse_text(const char *start, char **end, char *buffer, size_t bufsize); static void set_pstops_options(pstops_doc_t *doc, ppd_file_t *ppd, char *argv[], int num_options, cups_option_t *options); static ssize_t skip_page(cups_file_t *fp, char *line, ssize_t linelen, size_t linesize); static void start_nup(pstops_doc_t *doc, int number, int show_border, const int *bounding_box); static void write_label_prolog(pstops_doc_t *doc, const char *label, float bottom, float top, float width); static void write_labels(pstops_doc_t *doc, int orient); static void write_options(pstops_doc_t *doc, ppd_file_t *ppd, int num_options, cups_option_t *options); /* * 'main()' - Main entry. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { pstops_doc_t doc; /* Document information */ cups_file_t *fp; /* Print file */ ppd_file_t *ppd; /* PPD file */ int num_options; /* Number of print options */ cups_option_t *options; /* Print options */ char line[8192]; /* Line buffer */ ssize_t len; /* Length of line buffer */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* * Make sure status messages are not buffered... */ setbuf(stderr, NULL); /* * Ignore broken pipe signals... */ signal(SIGPIPE, SIG_IGN); /* * Check command-line... */ if (argc < 6 || argc > 7) { _cupsLangPrintf(stderr, _("Usage: %s job-id user title copies options [file]"), argv[0]); return (1); } /* * Register a signal handler to cleanly cancel a job. */ #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, cancel_job); #elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_handler = cancel_job; sigaction(SIGTERM, &action, NULL); #else signal(SIGTERM, cancel_job); #endif /* HAVE_SIGSET */ /* * If we have 7 arguments, print the file named on the command-line. * Otherwise, send stdin instead... */ if (argc == 6) fp = cupsFileStdin(); else { /* * Try to open the print file... */ if ((fp = cupsFileOpen(argv[6], "r")) == NULL) { if (!JobCanceled) { fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", argv[6]); _cupsLangPrintError("ERROR", _("Unable to open print file")); } return (1); } } /* * Read the first line to see if we have DSC comments... */ if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0) { fputs("DEBUG: The print file is empty.\n", stderr); return (1); } /* * Process command-line options... */ options = NULL; num_options = cupsParseOptions(argv[5], 0, &options); ppd = SetCommonOptions(num_options, options, 1); set_pstops_options(&doc, ppd, argv, num_options, options); /* * Write any "exit server" options that have been selected... */ ppdEmit(ppd, stdout, PPD_ORDER_EXIT); /* * Write any JCL commands that are needed to print PostScript code... */ if (doc.emit_jcl) ppdEmitJCL(ppd, stdout, doc.job_id, doc.user, doc.title); /* * Start with a DSC header... */ puts("%!PS-Adobe-3.0"); /* * Skip leading PJL in the document... */ while (!strncmp(line, "\033%-12345X", 9) || !strncmp(line, "@PJL ", 5)) { /* * Yup, we have leading PJL fun, so skip it until we hit the line * with "ENTER LANGUAGE"... */ fputs("DEBUG: Skipping PJL header...\n", stderr); while (strstr(line, "ENTER LANGUAGE") == NULL && strncmp(line, "%!", 2)) if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0) break; if (!strncmp(line, "%!", 2)) break; if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0) break; } /* * Now see if the document conforms to the Adobe Document Structuring * Conventions... */ if (!strncmp(line, "%!PS-Adobe-", 11)) { /* * Yes, filter the document... */ copy_dsc(fp, &doc, ppd, line, len, sizeof(line)); } else { /* * No, display an error message and treat the file as if it contains * a single page... */ copy_non_dsc(fp, &doc, ppd, line, len, sizeof(line)); } /* * Send %%EOF as needed... */ if (!doc.saw_eof) puts("%%EOF"); /* * End the job with the appropriate JCL command or CTRL-D... */ if (doc.emit_jcl) { if (ppd && ppd->jcl_end) ppdEmitJCLEnd(ppd, stdout); else putchar(0x04); } /* * Close files and remove the temporary file if needed... */ if (doc.temp) { cupsFileClose(doc.temp); unlink(doc.tempfile); } ppdClose(ppd); cupsFreeOptions(num_options, options); cupsFileClose(fp); return (0); } /* * 'add_page()' - Add a page to the pages array. */ static pstops_page_t * /* O - New page info object */ add_page(pstops_doc_t *doc, /* I - Document information */ const char *label) /* I - Page label */ { pstops_page_t *pageinfo; /* New page info object */ if (!doc->pages) doc->pages = cupsArrayNew(NULL, NULL); if (!doc->pages) { _cupsLangPrintError("EMERG", _("Unable to allocate memory for pages array")); exit(1); } if ((pageinfo = calloc(1, sizeof(pstops_page_t))) == NULL) { _cupsLangPrintError("EMERG", _("Unable to allocate memory for page info")); exit(1); } pageinfo->label = strdup(label); pageinfo->offset = cupsFileTell(doc->temp); cupsArrayAdd(doc->pages, pageinfo); doc->page ++; return (pageinfo); } /* * 'cancel_job()' - Flag the job as canceled. */ static void cancel_job(int sig) /* I - Signal number (unused) */ { (void)sig; JobCanceled = 1; } /* * 'check_range()' - Check to see if the current page is selected for * printing. */ static int /* O - 1 if selected, 0 otherwise */ check_range(pstops_doc_t *doc, /* I - Document information */ int page) /* I - Page number */ { const char *range; /* Pointer into range string */ int lower, upper; /* Lower and upper page numbers */ if (doc->page_set) { /* * See if we only print even or odd pages... */ if (!_cups_strcasecmp(doc->page_set, "even") && (page & 1)) return (0); if (!_cups_strcasecmp(doc->page_set, "odd") && !(page & 1)) return (0); } if (!doc->page_ranges) return (1); /* No range, print all pages... */ for (range = doc->page_ranges; *range != '\0';) { if (*range == '-') { lower = 1; range ++; upper = (int)strtol(range, (char **)&range, 10); } else { lower = (int)strtol(range, (char **)&range, 10); if (*range == '-') { range ++; if (!isdigit(*range & 255)) upper = 65535; else upper = (int)strtol(range, (char **)&range, 10); } else upper = lower; } if (page >= lower && page <= upper) return (1); if (*range == ',') range ++; else break; } return (0); } /* * 'copy_bytes()' - Copy bytes from the input file to stdout. */ static void copy_bytes(cups_file_t *fp, /* I - File to read from */ off_t offset, /* I - Offset to page data */ size_t length) /* I - Length of page data */ { char buffer[8192]; /* Data buffer */ ssize_t nbytes; /* Number of bytes read */ size_t nleft; /* Number of bytes left/remaining */ nleft = length; if (cupsFileSeek(fp, offset) < 0) { _cupsLangPrintError("ERROR", _("Unable to see in file")); return; } while (nleft > 0 || length == 0) { if (nleft > sizeof(buffer) || length == 0) nbytes = sizeof(buffer); else nbytes = (ssize_t)nleft; if ((nbytes = cupsFileRead(fp, buffer, (size_t)nbytes)) < 1) return; nleft -= (size_t)nbytes; fwrite(buffer, 1, (size_t)nbytes, stdout); } } /* * 'copy_comments()' - Copy all of the comments section. * * This function expects "line" to be filled with a comment line. * On return, "line" will contain the next line in the file, if any. */ static ssize_t /* O - Length of next line */ copy_comments(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { int saw_bounding_box, /* Saw %%BoundingBox: comment? */ saw_for, /* Saw %%For: comment? */ saw_pages, /* Saw %%Pages: comment? */ saw_title; /* Saw %%Title: comment? */ /* * Loop until we see %%EndComments or a non-comment line... */ saw_bounding_box = 0; saw_for = 0; saw_pages = 0; saw_title = 0; while (line[0] == '%') { /* * Strip trailing whitespace... */ while (linelen > 0) { linelen --; if (!isspace(line[linelen] & 255)) break; else line[linelen] = '\0'; } /* * Log the header... */ fprintf(stderr, "DEBUG: %s\n", line); /* * Pull the headers out... */ if (!strncmp(line, "%%Pages:", 8)) { int pages; /* Number of pages */ if (saw_pages) fputs("DEBUG: A duplicate %%Pages: comment was seen.\n", stderr); saw_pages = 1; if (Duplex && (pages = atoi(line + 8)) > 0 && pages <= doc->number_up) { /* * Since we will only be printing on a single page, disable duplexing. */ Duplex = 0; doc->slow_duplex = 0; if (cupsGetOption("sides", doc->num_options, doc->options)) doc->num_options = cupsAddOption("sides", "one-sided", doc->num_options, &(doc->options)); if (cupsGetOption("Duplex", doc->num_options, doc->options)) doc->num_options = cupsAddOption("Duplex", "None", doc->num_options, &(doc->options)); if (cupsGetOption("EFDuplex", doc->num_options, doc->options)) doc->num_options = cupsAddOption("EFDuplex", "None", doc->num_options, &(doc->options)); if (cupsGetOption("EFDuplexing", doc->num_options, doc->options)) doc->num_options = cupsAddOption("EFDuplexing", "False", doc->num_options, &(doc->options)); if (cupsGetOption("KD03Duplex", doc->num_options, doc->options)) doc->num_options = cupsAddOption("KD03Duplex", "None", doc->num_options, &(doc->options)); if (cupsGetOption("JCLDuplex", doc->num_options, doc->options)) doc->num_options = cupsAddOption("JCLDuplex", "None", doc->num_options, &(doc->options)); ppdMarkOption(ppd, "Duplex", "None"); ppdMarkOption(ppd, "EFDuplex", "None"); ppdMarkOption(ppd, "EFDuplexing", "False"); ppdMarkOption(ppd, "KD03Duplex", "None"); ppdMarkOption(ppd, "JCLDuplex", "None"); } } else if (!strncmp(line, "%%BoundingBox:", 14)) { if (saw_bounding_box) fputs("DEBUG: A duplicate %%BoundingBox: comment was seen.\n", stderr); else if (strstr(line + 14, "(atend)")) { /* * Do nothing for now but use the default imageable area... */ } else if (sscanf(line + 14, "%d%d%d%d", doc->bounding_box + 0, doc->bounding_box + 1, doc->bounding_box + 2, doc->bounding_box + 3) != 4) { fputs("DEBUG: A bad %%BoundingBox: comment was seen.\n", stderr); doc->bounding_box[0] = (int)PageLeft; doc->bounding_box[1] = (int)PageBottom; doc->bounding_box[2] = (int)PageRight; doc->bounding_box[3] = (int)PageTop; } saw_bounding_box = 1; } else if (!strncmp(line, "%%For:", 6)) { saw_for = 1; doc_printf(doc, "%s\n", line); } else if (!strncmp(line, "%%Title:", 8)) { saw_title = 1; doc_printf(doc, "%s\n", line); } else if (!strncmp(line, "%cupsRotation:", 14)) { /* * Reset orientation of document? */ int orient = (atoi(line + 14) / 90) & 3; if (orient != Orientation) { /* * Yes, update things so that the pages come out right... */ Orientation = (4 - Orientation + orient) & 3; UpdatePageVars(); Orientation = orient; } } else if (!strcmp(line, "%%EndComments")) { linelen = (ssize_t)cupsFileGetLine(fp, line, linesize); break; } else if (strncmp(line, "%!", 2) && strncmp(line, "%cups", 5)) doc_printf(doc, "%s\n", line); if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0) break; } if (!saw_bounding_box) fputs("DEBUG: There wasn't a %%BoundingBox: comment in the header.\n", stderr); if (!saw_pages) fputs("DEBUG: There wasn't a %%Pages: comment in the header.\n", stderr); if (!saw_for) WriteTextComment("For", doc->user); if (!saw_title) WriteTextComment("Title", doc->title); if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) { /* * Tell the document processor the copy and duplex options * that are required... */ doc_printf(doc, "%%%%Requirements: numcopies(%d)%s%s\n", doc->copies, doc->collate ? " collate" : "", Duplex ? " duplex" : ""); /* * Apple uses RBI comments for various non-PPD options... */ doc_printf(doc, "%%RBINumCopies: %d\n", doc->copies); } else { /* * Tell the document processor the duplex option that is required... */ if (Duplex) doc_puts(doc, "%%Requirements: duplex\n"); /* * Apple uses RBI comments for various non-PPD options... */ doc_puts(doc, "%RBINumCopies: 1\n"); } doc_puts(doc, "%%Pages: (atend)\n"); doc_puts(doc, "%%BoundingBox: (atend)\n"); doc_puts(doc, "%%EndComments\n"); return (linelen); } /* * 'copy_dsc()' - Copy a DSC-conforming document. * * This function expects "line" to be filled with the %!PS-Adobe comment line. */ static void copy_dsc(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { int number; /* Page number */ pstops_page_t *pageinfo; /* Page information */ /* * Make sure we use ESPshowpage for EPS files... */ if (strstr(line, "EPSF")) { doc->use_ESPshowpage = 1; doc->number_up = 1; } /* * Start sending the document with any commands needed... */ fprintf(stderr, "DEBUG: Before copy_comments - %s", line); linelen = copy_comments(fp, doc, ppd, line, linelen, linesize); /* * Now find the prolog section, if any... */ fprintf(stderr, "DEBUG: Before copy_prolog - %s", line); linelen = copy_prolog(fp, doc, ppd, line, linelen, linesize); /* * Then the document setup section... */ fprintf(stderr, "DEBUG: Before copy_setup - %s", line); linelen = copy_setup(fp, doc, ppd, line, linelen, linesize); /* * Copy until we see %%Page:... */ while (strncmp(line, "%%Page:", 7) && strncmp(line, "%%Trailer", 9)) { doc_write(doc, line, (size_t)linelen); if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0) break; } /* * Then process pages until we have no more... */ number = 0; fprintf(stderr, "DEBUG: Before page loop - %s", line); while (!strncmp(line, "%%Page:", 7)) { if (JobCanceled) break; number ++; if (check_range(doc, (number - 1) / doc->number_up + 1)) { fprintf(stderr, "DEBUG: Copying page %d...\n", number); linelen = copy_page(fp, doc, ppd, number, line, linelen, linesize); } else { fprintf(stderr, "DEBUG: Skipping page %d...\n", number); linelen = skip_page(fp, line, linelen, linesize); } } /* * Finish up the last page(s)... */ if (number && is_not_last_page(number) && cupsArrayLast(doc->pages) && check_range(doc, (number - 1) / doc->number_up + 1)) { pageinfo = (pstops_page_t *)cupsArrayLast(doc->pages); start_nup(doc, doc->number_up, 0, doc->bounding_box); doc_puts(doc, "showpage\n"); end_nup(doc, doc->number_up); pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset); } if (doc->slow_duplex && (doc->page & 1)) { /* * Make sure we have an even number of pages... */ pageinfo = add_page(doc, "(filler)"); if (!doc->slow_order) { if (!ppd || !ppd->num_filters) fprintf(stderr, "PAGE: %d %d\n", doc->page, doc->slow_collate ? 1 : doc->copies); printf("%%%%Page: (filler) %d\n", doc->page); } start_nup(doc, doc->number_up, 0, doc->bounding_box); doc_puts(doc, "showpage\n"); end_nup(doc, doc->number_up); pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset); } /* * Make additional copies as necessary... */ number = doc->slow_order ? 0 : doc->page; if (doc->temp && !JobCanceled && cupsArrayCount(doc->pages) > 0) { int copy; /* Current copy */ /* * Reopen the temporary file for reading... */ cupsFileClose(doc->temp); doc->temp = cupsFileOpen(doc->tempfile, "r"); /* * Make the copies... */ if (doc->slow_collate) copy = !doc->slow_order; else copy = doc->copies - 1; for (; copy < doc->copies; copy ++) { if (JobCanceled) break; /* * Send end-of-job stuff followed by any start-of-job stuff required * for the JCL options... */ if (number && doc->emit_jcl && ppd && ppd->jcl_end) { /* * Send the trailer... */ puts("%%Trailer"); printf("%%%%Pages: %d\n", cupsArrayCount(doc->pages)); if (doc->number_up > 1 || doc->fit_to_page) printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, PageRight, PageTop); else printf("%%%%BoundingBox: %d %d %d %d\n", doc->new_bounding_box[0], doc->new_bounding_box[1], doc->new_bounding_box[2], doc->new_bounding_box[3]); puts("%%EOF"); /* * Start a new document... */ ppdEmitJCLEnd(ppd, stdout); ppdEmitJCL(ppd, stdout, doc->job_id, doc->user, doc->title); puts("%!PS-Adobe-3.0"); number = 0; } /* * Copy the prolog as needed... */ if (!number) { pageinfo = (pstops_page_t *)cupsArrayFirst(doc->pages); copy_bytes(doc->temp, 0, (size_t)pageinfo->offset); } /* * Then copy all of the pages... */ pageinfo = doc->slow_order ? (pstops_page_t *)cupsArrayLast(doc->pages) : (pstops_page_t *)cupsArrayFirst(doc->pages); while (pageinfo) { if (JobCanceled) break; number ++; if (!ppd || !ppd->num_filters) fprintf(stderr, "PAGE: %d %d\n", number, doc->slow_collate ? 1 : doc->copies); if (doc->number_up > 1) { printf("%%%%Page: (%d) %d\n", number, number); printf("%%%%PageBoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, PageRight, PageTop); } else { printf("%%%%Page: %s %d\n", pageinfo->label, number); printf("%%%%PageBoundingBox: %d %d %d %d\n", pageinfo->bounding_box[0], pageinfo->bounding_box[1], pageinfo->bounding_box[2], pageinfo->bounding_box[3]); } copy_bytes(doc->temp, pageinfo->offset, (size_t)pageinfo->length); pageinfo = doc->slow_order ? (pstops_page_t *)cupsArrayPrev(doc->pages) : (pstops_page_t *)cupsArrayNext(doc->pages); } } } /* * Restore the old showpage operator as needed... */ if (doc->use_ESPshowpage) puts("userdict/showpage/ESPshowpage load put\n"); /* * Write/copy the trailer... */ if (!JobCanceled) copy_trailer(fp, doc, ppd, number, line, linelen, linesize); } /* * 'copy_non_dsc()' - Copy a document that does not conform to the DSC. * * This function expects "line" to be filled with the %! comment line. */ static void copy_non_dsc(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { int copy; /* Current copy */ char buffer[8192]; /* Copy buffer */ ssize_t bytes; /* Number of bytes copied */ (void)linesize; /* * First let the user know that they are attempting to print a file * that may not print correctly... */ fputs("DEBUG: This document does not conform to the Adobe Document " "Structuring Conventions and may not print correctly.\n", stderr); /* * Then write a standard DSC comment section... */ printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, PageRight, PageTop); if (doc->slow_collate && doc->copies > 1) printf("%%%%Pages: %d\n", doc->copies); else puts("%%Pages: 1"); WriteTextComment("For", doc->user); WriteTextComment("Title", doc->title); if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) { /* * Tell the document processor the copy and duplex options * that are required... */ printf("%%%%Requirements: numcopies(%d)%s%s\n", doc->copies, doc->collate ? " collate" : "", Duplex ? " duplex" : ""); /* * Apple uses RBI comments for various non-PPD options... */ printf("%%RBINumCopies: %d\n", doc->copies); } else { /* * Tell the document processor the duplex option that is required... */ if (Duplex) puts("%%Requirements: duplex"); /* * Apple uses RBI comments for various non-PPD options... */ puts("%RBINumCopies: 1"); } puts("%%EndComments"); /* * Then the prolog... */ puts("%%BeginProlog"); do_prolog(doc, ppd); puts("%%EndProlog"); /* * Then the setup section... */ puts("%%BeginSetup"); do_setup(doc, ppd); puts("%%EndSetup"); /* * Finally, embed a copy of the file inside a %%Page... */ if (!ppd || !ppd->num_filters) fprintf(stderr, "PAGE: 1 %d\n", doc->temp ? 1 : doc->copies); puts("%%Page: 1 1"); puts("%%BeginPageSetup"); ppdEmit(ppd, stdout, PPD_ORDER_PAGE); puts("%%EndPageSetup"); puts("%%BeginDocument: nondsc"); fwrite(line, (size_t)linelen, 1, stdout); if (doc->temp) cupsFileWrite(doc->temp, line, (size_t)linelen); while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) { fwrite(buffer, 1, (size_t)bytes, stdout); if (doc->temp) cupsFileWrite(doc->temp, buffer, (size_t)bytes); } puts("%%EndDocument"); if (doc->use_ESPshowpage) { WriteLabels(Orientation); puts("ESPshowpage"); } if (doc->temp && !JobCanceled) { /* * Reopen the temporary file for reading... */ cupsFileClose(doc->temp); doc->temp = cupsFileOpen(doc->tempfile, "r"); /* * Make the additional copies as needed... */ for (copy = 1; copy < doc->copies; copy ++) { if (JobCanceled) break; if (!ppd || !ppd->num_filters) fputs("PAGE: 1 1\n", stderr); printf("%%%%Page: %d %d\n", copy + 1, copy + 1); puts("%%BeginPageSetup"); ppdEmit(ppd, stdout, PPD_ORDER_PAGE); puts("%%EndPageSetup"); puts("%%BeginDocument: nondsc"); copy_bytes(doc->temp, 0, 0); puts("%%EndDocument"); if (doc->use_ESPshowpage) { WriteLabels(Orientation); puts("ESPshowpage"); } } } /* * Restore the old showpage operator as needed... */ if (doc->use_ESPshowpage) puts("userdict/showpage/ESPshowpage load put\n"); } /* * 'copy_page()' - Copy a page description. * * This function expects "line" to be filled with a %%Page comment line. * On return, "line" will contain the next line in the file, if any. */ static ssize_t /* O - Length of next line */ copy_page(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ int number, /* I - Current page number */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { char label[256], /* Page label string */ *ptr; /* Pointer into line */ int level; /* Embedded document level */ pstops_page_t *pageinfo; /* Page information */ int first_page; /* First page on N-up output? */ int has_page_setup = 0; /* Does the page have %%Begin/EndPageSetup? */ int bounding_box[4]; /* PageBoundingBox */ /* * Get the page label for this page... */ first_page = is_first_page(number); if (!parse_text(line + 7, &ptr, label, sizeof(label))) { fputs("DEBUG: There was a bad %%Page: comment in the file.\n", stderr); label[0] = '\0'; number = doc->page; } else if (strtol(ptr, &ptr, 10) == LONG_MAX || !isspace(*ptr & 255)) { fputs("DEBUG: There was a bad %%Page: comment in the file.\n", stderr); number = doc->page; } /* * Create or update the current output page... */ if (first_page) pageinfo = add_page(doc, label); else pageinfo = (pstops_page_t *)cupsArrayLast(doc->pages); /* * Handle first page override... */ if (doc->ap_input_slot || doc->ap_manual_feed) { if ((doc->page == 1 && (!doc->slow_order || !Duplex)) || (doc->page == 2 && doc->slow_order && Duplex)) { /* * First page/sheet gets AP_FIRSTPAGE_* options... */ pageinfo->num_options = cupsAddOption("InputSlot", doc->ap_input_slot, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("ManualFeed", doc->ap_input_slot ? "False" : doc->ap_manual_feed, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("MediaColor", doc->ap_media_color, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("MediaType", doc->ap_media_type, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("PageRegion", doc->ap_page_region, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("PageSize", doc->ap_page_size, pageinfo->num_options, &(pageinfo->options)); } else if (doc->page == (Duplex + 2)) { /* * Second page/sheet gets default options... */ pageinfo->num_options = cupsAddOption("InputSlot", doc->input_slot, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("ManualFeed", doc->input_slot ? "False" : doc->manual_feed, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("MediaColor", doc->media_color, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("MediaType", doc->media_type, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("PageRegion", doc->page_region, pageinfo->num_options, &(pageinfo->options)); pageinfo->num_options = cupsAddOption("PageSize", doc->page_size, pageinfo->num_options, &(pageinfo->options)); } } /* * Scan comments until we see something other than %%Page*: or * %%Include*... */ memcpy(bounding_box, doc->bounding_box, sizeof(bounding_box)); while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0) { if (!strncmp(line, "%%PageBoundingBox:", 18)) { /* * %%PageBoundingBox: llx lly urx ury */ if (sscanf(line + 18, "%d%d%d%d", bounding_box + 0, bounding_box + 1, bounding_box + 2, bounding_box + 3) != 4) { fputs("DEBUG: There was a bad %%PageBoundingBox: comment in the file.\n", stderr); memcpy(bounding_box, doc->bounding_box, sizeof(bounding_box)); } else if (doc->number_up == 1 && !doc->fit_to_page && Orientation) { int temp_bbox[4]; /* Temporary bounding box */ memcpy(temp_bbox, bounding_box, sizeof(temp_bbox)); fprintf(stderr, "DEBUG: Orientation = %d\n", Orientation); fprintf(stderr, "DEBUG: original bounding_box = [ %d %d %d %d ]\n", bounding_box[0], bounding_box[1], bounding_box[2], bounding_box[3]); fprintf(stderr, "DEBUG: PageWidth = %.1f, PageLength = %.1f\n", PageWidth, PageLength); switch (Orientation) { case 1 : /* Landscape */ bounding_box[0] = (int)(PageLength - temp_bbox[3]); bounding_box[1] = temp_bbox[0]; bounding_box[2] = (int)(PageLength - temp_bbox[1]); bounding_box[3] = temp_bbox[2]; break; case 2 : /* Reverse Portrait */ bounding_box[0] = (int)(PageWidth - temp_bbox[2]); bounding_box[1] = (int)(PageLength - temp_bbox[3]); bounding_box[2] = (int)(PageWidth - temp_bbox[0]); bounding_box[3] = (int)(PageLength - temp_bbox[1]); break; case 3 : /* Reverse Landscape */ bounding_box[0] = temp_bbox[1]; bounding_box[1] = (int)(PageWidth - temp_bbox[2]); bounding_box[2] = temp_bbox[3]; bounding_box[3] = (int)(PageWidth - temp_bbox[0]); break; } fprintf(stderr, "DEBUG: updated bounding_box = [ %d %d %d %d ]\n", bounding_box[0], bounding_box[1], bounding_box[2], bounding_box[3]); } } #if 0 else if (!strncmp(line, "%%PageCustomColors:", 19) || !strncmp(line, "%%PageMedia:", 12) || !strncmp(line, "%%PageOrientation:", 18) || !strncmp(line, "%%PageProcessColors:", 20) || !strncmp(line, "%%PageRequirements:", 18) || !strncmp(line, "%%PageResources:", 16)) { /* * Copy literal... */ } #endif /* 0 */ else if (!strncmp(line, "%%PageCustomColors:", 19)) { /* * %%PageCustomColors: ... */ } else if (!strncmp(line, "%%PageMedia:", 12)) { /* * %%PageMedia: ... */ } else if (!strncmp(line, "%%PageOrientation:", 18)) { /* * %%PageOrientation: ... */ } else if (!strncmp(line, "%%PageProcessColors:", 20)) { /* * %%PageProcessColors: ... */ } else if (!strncmp(line, "%%PageRequirements:", 18)) { /* * %%PageRequirements: ... */ } else if (!strncmp(line, "%%PageResources:", 16)) { /* * %%PageResources: ... */ } else if (!strncmp(line, "%%IncludeFeature:", 17)) { /* * %%IncludeFeature: *MainKeyword OptionKeyword */ if (doc->number_up == 1 &&!doc->fit_to_page) pageinfo->num_options = include_feature(ppd, line, pageinfo->num_options, &(pageinfo->options)); } else if (!strncmp(line, "%%BeginPageSetup", 16)) { has_page_setup = 1; break; } else break; } if (doc->number_up == 1) { /* * Update the document's composite and page bounding box... */ memcpy(pageinfo->bounding_box, bounding_box, sizeof(pageinfo->bounding_box)); if (bounding_box[0] < doc->new_bounding_box[0]) doc->new_bounding_box[0] = bounding_box[0]; if (bounding_box[1] < doc->new_bounding_box[1]) doc->new_bounding_box[1] = bounding_box[1]; if (bounding_box[2] > doc->new_bounding_box[2]) doc->new_bounding_box[2] = bounding_box[2]; if (bounding_box[3] > doc->new_bounding_box[3]) doc->new_bounding_box[3] = bounding_box[3]; } /* * Output the page header as needed... */ if (!doc->slow_order && first_page) { if (!ppd || !ppd->num_filters) fprintf(stderr, "PAGE: %d %d\n", doc->page, doc->slow_collate ? 1 : doc->copies); if (doc->number_up > 1) { printf("%%%%Page: (%d) %d\n", doc->page, doc->page); printf("%%%%PageBoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, PageRight, PageTop); } else { printf("%%%%Page: %s %d\n", pageinfo->label, doc->page); printf("%%%%PageBoundingBox: %d %d %d %d\n", pageinfo->bounding_box[0], pageinfo->bounding_box[1], pageinfo->bounding_box[2], pageinfo->bounding_box[3]); } } /* * Copy any page setup commands... */ if (first_page) doc_puts(doc, "%%BeginPageSetup\n"); if (has_page_setup) { int feature = 0; /* In a Begin/EndFeature block? */ while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0) { if (!strncmp(line, "%%EndPageSetup", 14)) break; else if (!strncmp(line, "%%BeginFeature:", 15)) { feature = 1; if (doc->number_up > 1 || doc->fit_to_page) continue; } else if (!strncmp(line, "%%EndFeature", 12)) { feature = 0; if (doc->number_up > 1 || doc->fit_to_page) continue; } else if (!strncmp(line, "%%IncludeFeature:", 17)) { pageinfo->num_options = include_feature(ppd, line, pageinfo->num_options, &(pageinfo->options)); continue; } else if (!strncmp(line, "%%Include", 9)) continue; if (line[0] != '%' && !feature) break; if (!feature || (doc->number_up == 1 && !doc->fit_to_page)) doc_write(doc, line, (size_t)linelen); } /* * Skip %%EndPageSetup... */ if (linelen > 0 && !strncmp(line, "%%EndPageSetup", 14)) linelen = (ssize_t)cupsFileGetLine(fp, line, linesize); } if (first_page) { char *page_setup; /* PageSetup commands to send */ if (pageinfo->num_options > 0) write_options(doc, ppd, pageinfo->num_options, pageinfo->options); /* * Output commands for the current page... */ page_setup = ppdEmitString(ppd, PPD_ORDER_PAGE, 0); if (page_setup) { doc_puts(doc, page_setup); free(page_setup); } } /* * Prep for the start of the page description... */ start_nup(doc, number, 1, bounding_box); if (first_page) doc_puts(doc, "%%EndPageSetup\n"); /* * Read the rest of the page description... */ level = 0; do { if (level == 0 && (!strncmp(line, "%%Page:", 7) || !strncmp(line, "%%Trailer", 9) || !strncmp(line, "%%EOF", 5))) break; else if (!strncmp(line, "%%BeginDocument", 15) || !strncmp(line, "%ADO_BeginApplication", 21)) { doc_write(doc, line, (size_t)linelen); level ++; } else if ((!strncmp(line, "%%EndDocument", 13) || !strncmp(line, "%ADO_EndApplication", 19)) && level > 0) { doc_write(doc, line, (size_t)linelen); level --; } else if (!strncmp(line, "%%BeginBinary:", 14) || (!strncmp(line, "%%BeginData:", 12) && !strstr(line, "ASCII") && !strstr(line, "Hex"))) { /* * Copy binary data... */ int bytes; /* Bytes of data */ doc_write(doc, line, (size_t)linelen); bytes = atoi(strchr(line, ':') + 1); while (bytes > 0) { if ((size_t)bytes > linesize) linelen = cupsFileRead(fp, line, linesize); else linelen = cupsFileRead(fp, line, (size_t)bytes); if (linelen < 1) { line[0] = '\0'; perror("ERROR: Early end-of-file while reading binary data"); return (0); } doc_write(doc, line, (size_t)linelen); bytes -= linelen; } } else doc_write(doc, line, (size_t)linelen); } while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0); /* * Finish up this page and return... */ end_nup(doc, number); pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset); return (linelen); } /* * 'copy_prolog()' - Copy the document prolog section. * * This function expects "line" to be filled with a %%BeginProlog comment line. * On return, "line" will contain the next line in the file, if any. */ static ssize_t /* O - Length of next line */ copy_prolog(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { while (strncmp(line, "%%BeginProlog", 13)) { if (!strncmp(line, "%%BeginSetup", 12) || !strncmp(line, "%%Page:", 7)) break; doc_write(doc, line, (size_t)linelen); if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0) break; } doc_puts(doc, "%%BeginProlog\n"); do_prolog(doc, ppd); if (!strncmp(line, "%%BeginProlog", 13)) { while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0) { if (!strncmp(line, "%%EndProlog", 11) || !strncmp(line, "%%BeginSetup", 12) || !strncmp(line, "%%Page:", 7)) break; doc_write(doc, line, (size_t)linelen); } if (!strncmp(line, "%%EndProlog", 11)) linelen = (ssize_t)cupsFileGetLine(fp, line, linesize); else fputs("DEBUG: The %%EndProlog comment is missing.\n", stderr); } doc_puts(doc, "%%EndProlog\n"); return (linelen); } /* * 'copy_setup()' - Copy the document setup section. * * This function expects "line" to be filled with a %%BeginSetup comment line. * On return, "line" will contain the next line in the file, if any. */ static ssize_t /* O - Length of next line */ copy_setup(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { int num_options; /* Number of options */ cups_option_t *options; /* Options */ while (strncmp(line, "%%BeginSetup", 12)) { if (!strncmp(line, "%%Page:", 7)) break; doc_write(doc, line, (size_t)linelen); if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0) break; } doc_puts(doc, "%%BeginSetup\n"); do_setup(doc, ppd); num_options = 0; options = NULL; if (!strncmp(line, "%%BeginSetup", 12)) { while (strncmp(line, "%%EndSetup", 10)) { if (!strncmp(line, "%%Page:", 7)) break; else if (!strncmp(line, "%%IncludeFeature:", 17)) { /* * %%IncludeFeature: *MainKeyword OptionKeyword */ if (doc->number_up == 1 && !doc->fit_to_page) num_options = include_feature(ppd, line, num_options, &options); } else if (strncmp(line, "%%BeginSetup", 12)) doc_write(doc, line, (size_t)linelen); if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0) break; } if (!strncmp(line, "%%EndSetup", 10)) linelen = (ssize_t)cupsFileGetLine(fp, line, linesize); else fputs("DEBUG: The %%EndSetup comment is missing.\n", stderr); } if (num_options > 0) { write_options(doc, ppd, num_options, options); cupsFreeOptions(num_options, options); } doc_puts(doc, "%%EndSetup\n"); return (linelen); } /* * 'copy_trailer()' - Copy the document trailer. * * This function expects "line" to be filled with a %%Trailer comment line. * On return, "line" will contain the next line in the file, if any. */ static ssize_t /* O - Length of next line */ copy_trailer(cups_file_t *fp, /* I - File to read from */ pstops_doc_t *doc, /* I - Document info */ ppd_file_t *ppd, /* I - PPD file */ int number, /* I - Number of pages */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { /* * Write the trailer comments... */ (void)ppd; puts("%%Trailer"); while (linelen > 0) { if (!strncmp(line, "%%EOF", 5)) break; else if (strncmp(line, "%%Trailer", 9) && strncmp(line, "%%Pages:", 8) && strncmp(line, "%%BoundingBox:", 14)) fwrite(line, 1, (size_t)linelen, stdout); linelen = (ssize_t)cupsFileGetLine(fp, line, linesize); } fprintf(stderr, "DEBUG: Wrote %d pages...\n", number); printf("%%%%Pages: %d\n", number); if (doc->number_up > 1 || doc->fit_to_page) printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, PageRight, PageTop); else printf("%%%%BoundingBox: %d %d %d %d\n", doc->new_bounding_box[0], doc->new_bounding_box[1], doc->new_bounding_box[2], doc->new_bounding_box[3]); return (linelen); } /* * 'do_prolog()' - Send the necessary document prolog commands. */ static void do_prolog(pstops_doc_t *doc, /* I - Document information */ ppd_file_t *ppd) /* I - PPD file */ { char *ps; /* PS commands */ /* * Send the document prolog commands... */ if (ppd && ppd->patches) { doc_puts(doc, "%%BeginFeature: *JobPatchFile 1\n"); doc_puts(doc, ppd->patches); doc_puts(doc, "\n%%EndFeature\n"); } if ((ps = ppdEmitString(ppd, PPD_ORDER_PROLOG, 0.0)) != NULL) { doc_puts(doc, ps); free(ps); } /* * Define ESPshowpage here so that applications that define their * own procedure to do a showpage pick it up... */ if (doc->use_ESPshowpage) doc_puts(doc, "userdict/ESPshowpage/showpage load put\n" "userdict/showpage{}put\n"); } /* * 'do_setup()' - Send the necessary document setup commands. */ static void do_setup(pstops_doc_t *doc, /* I - Document information */ ppd_file_t *ppd) /* I - PPD file */ { char *ps; /* PS commands */ /* * Disable CTRL-D so that embedded files don't cause printing * errors... */ doc_puts(doc, "% Disable CTRL-D as an end-of-file marker...\n"); doc_puts(doc, "userdict dup(\\004)cvn{}put (\\004\\004)cvn{}put\n"); /* * Mark job options... */ cupsMarkOptions(ppd, doc->num_options, doc->options); /* * Send all the printer-specific setup commands... */ if ((ps = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, 0.0)) != NULL) { doc_puts(doc, ps); free(ps); } if ((ps = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL) { doc_puts(doc, ps); free(ps); } /* * Set the number of copies for the job... */ if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) { doc_printf(doc, "%%RBIBeginNonPPDFeature: *NumCopies %d\n", doc->copies); doc_printf(doc, "%d/languagelevel where{pop languagelevel 2 ge}{false}ifelse\n" "{1 dict begin/NumCopies exch def currentdict end " "setpagedevice}\n" "{userdict/#copies 3 -1 roll put}ifelse\n", doc->copies); doc_puts(doc, "%RBIEndNonPPDFeature\n"); } /* * If we are doing N-up printing, disable setpagedevice... */ if (doc->number_up > 1) { doc_puts(doc, "userdict/CUPSsetpagedevice/setpagedevice load put\n"); doc_puts(doc, "userdict/setpagedevice{pop}bind put\n"); } /* * Make sure we have rectclip and rectstroke procedures of some sort... */ doc_puts(doc, "% x y w h ESPrc - Clip to a rectangle.\n" "userdict/ESPrc/rectclip where{pop/rectclip load}\n" "{{newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath clip newpath}bind}ifelse put\n"); doc_puts(doc, "% x y w h ESPrf - Fill a rectangle.\n" "userdict/ESPrf/rectfill where{pop/rectfill load}\n" "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath fill grestore}bind}ifelse put\n"); doc_puts(doc, "% x y w h ESPrs - Stroke a rectangle.\n" "userdict/ESPrs/rectstroke where{pop/rectstroke load}\n" "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" "neg 0 rlineto closepath stroke grestore}bind}ifelse put\n"); /* * Write the page and label prologs... */ if (doc->number_up == 2 || doc->number_up == 6) { /* * For 2- and 6-up output, rotate the labels to match the orientation * of the pages... */ if (Orientation & 1) write_label_prolog(doc, doc->page_label, PageBottom, PageWidth - PageLength + PageTop, PageLength); else write_label_prolog(doc, doc->page_label, PageLeft, PageRight, PageLength); } else write_label_prolog(doc, doc->page_label, PageBottom, PageTop, PageWidth); } /* * 'doc_printf()' - Send a formatted string to stdout and/or the temp file. * * This function should be used for all page-level output that is affected * by ordering, collation, etc. */ static void doc_printf(pstops_doc_t *doc, /* I - Document information */ const char *format, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { va_list ap; /* Pointer to arguments */ char buffer[1024]; /* Output buffer */ ssize_t bytes; /* Number of bytes to write */ va_start(ap, format); bytes = vsnprintf(buffer, sizeof(buffer), format, ap); va_end(ap); if ((size_t)bytes > sizeof(buffer)) { _cupsLangPrintFilter(stderr, "ERROR", _("Buffer overflow detected, aborting.")); exit(1); } doc_write(doc, buffer, (size_t)bytes); } /* * 'doc_puts()' - Send a nul-terminated string to stdout and/or the temp file. * * This function should be used for all page-level output that is affected * by ordering, collation, etc. */ static void doc_puts(pstops_doc_t *doc, /* I - Document information */ const char *s) /* I - String to send */ { doc_write(doc, s, strlen(s)); } /* * 'doc_write()' - Send data to stdout and/or the temp file. */ static void doc_write(pstops_doc_t *doc, /* I - Document information */ const char *s, /* I - Data to send */ size_t len) /* I - Number of bytes to send */ { if (!doc->slow_order) fwrite(s, 1, len, stdout); if (doc->temp) cupsFileWrite(doc->temp, s, len); } /* * 'end_nup()' - End processing for N-up printing. */ static void end_nup(pstops_doc_t *doc, /* I - Document information */ int number) /* I - Page number */ { if (doc->number_up > 1) doc_puts(doc, "userdict/ESPsave get restore\n"); switch (doc->number_up) { case 1 : if (doc->use_ESPshowpage) { write_labels(doc, Orientation); doc_puts(doc, "ESPshowpage\n"); } break; case 2 : case 6 : if (is_last_page(number) && doc->use_ESPshowpage) { if (Orientation & 1) { /* * Rotate the labels back to portrait... */ write_labels(doc, Orientation - 1); } else if (Orientation == 0) { /* * Rotate the labels to landscape... */ write_labels(doc, doc->normal_landscape ? 1 : 3); } else { /* * Rotate the labels to landscape... */ write_labels(doc, doc->normal_landscape ? 3 : 1); } doc_puts(doc, "ESPshowpage\n"); } break; default : if (is_last_page(number) && doc->use_ESPshowpage) { write_labels(doc, Orientation); doc_puts(doc, "ESPshowpage\n"); } break; } fflush(stdout); } /* * 'include_feature()' - Include a printer option/feature command. */ static int /* O - New number of options */ include_feature( ppd_file_t *ppd, /* I - PPD file */ const char *line, /* I - DSC line */ int num_options, /* I - Number of options */ cups_option_t **options) /* IO - Options */ { char name[255], /* Option name */ value[255]; /* Option value */ ppd_option_t *option; /* Option in file */ /* * Get the "%%IncludeFeature: *Keyword OptionKeyword" values... */ if (sscanf(line + 17, "%254s%254s", name, value) != 2) { fputs("DEBUG: The %%IncludeFeature: comment is not valid.\n", stderr); return (num_options); } /* * Find the option and choice... */ if ((option = ppdFindOption(ppd, name + 1)) == NULL) { _cupsLangPrintFilter(stderr, "WARNING", _("Unknown option \"%s\"."), name + 1); return (num_options); } if (option->section == PPD_ORDER_EXIT || option->section == PPD_ORDER_JCL) { _cupsLangPrintFilter(stderr, "WARNING", _("Option \"%s\" cannot be included via " "%%%%IncludeFeature."), name + 1); return (num_options); } if (!ppdFindChoice(option, value)) { _cupsLangPrintFilter(stderr, "WARNING", _("Unknown choice \"%s\" for option \"%s\"."), value, name + 1); return (num_options); } /* * Add the option to the option array and return... */ return (cupsAddOption(name + 1, value, num_options, options)); } /* * 'parse_text()' - Parse a text value in a comment. * * This function parses a DSC text value as defined on page 36 of the * DSC specification. Text values are either surrounded by parenthesis * or whitespace-delimited. * * The value returned is the literal characters for the entire text * string, including any parenthesis and escape characters. */ static char * /* O - Value or NULL on error */ parse_text(const char *start, /* I - Start of text value */ char **end, /* O - End of text value */ char *buffer, /* I - Buffer */ size_t bufsize) /* I - Size of buffer */ { char *bufptr, /* Pointer in buffer */ *bufend; /* End of buffer */ int level; /* Parenthesis level */ /* * Skip leading whitespace... */ while (isspace(*start & 255)) start ++; /* * Then copy the value... */ level = 0; bufptr = buffer; bufend = buffer + bufsize - 1; while (*start && bufptr < bufend) { if (isspace(*start & 255) && !level) break; *bufptr++ = *start; if (*start == '(') level ++; else if (*start == ')') { if (!level) { start ++; break; } else level --; } else if (*start == '\\') { /* * Copy escaped character... */ int i; /* Looping var */ for (i = 1; i <= 3 && isdigit(start[i] & 255) && bufptr < bufend; *bufptr++ = start[i], i ++); } start ++; } *bufptr = '\0'; /* * Return the value and new pointer into the line... */ if (end) *end = (char *)start; if (bufptr == bufend) return (NULL); else return (buffer); } /* * 'set_pstops_options()' - Set pstops options. */ static void set_pstops_options( pstops_doc_t *doc, /* I - Document information */ ppd_file_t *ppd, /* I - PPD file */ char *argv[], /* I - Command-line arguments */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { const char *val; /* Option value */ int intval; /* Integer option value */ ppd_attr_t *attr; /* PPD attribute */ ppd_option_t *option; /* PPD option */ ppd_choice_t *choice; /* PPD choice */ const char *content_type; /* Original content type */ int max_copies; /* Maximum number of copies supported */ /* * Initialize document information structure... */ memset(doc, 0, sizeof(pstops_doc_t)); doc->job_id = atoi(argv[1]); doc->user = argv[2]; doc->title = argv[3]; doc->copies = atoi(argv[4]); if (ppd && ppd->landscape > 0) doc->normal_landscape = 1; doc->bounding_box[0] = (int)PageLeft; doc->bounding_box[1] = (int)PageBottom; doc->bounding_box[2] = (int)PageRight; doc->bounding_box[3] = (int)PageTop; doc->new_bounding_box[0] = INT_MAX; doc->new_bounding_box[1] = INT_MAX; doc->new_bounding_box[2] = INT_MIN; doc->new_bounding_box[3] = INT_MIN; /* * AP_FIRSTPAGE_* and the corresponding non-first-page options. */ doc->ap_input_slot = cupsGetOption("AP_FIRSTPAGE_InputSlot", num_options, options); doc->ap_manual_feed = cupsGetOption("AP_FIRSTPAGE_ManualFeed", num_options, options); doc->ap_media_color = cupsGetOption("AP_FIRSTPAGE_MediaColor", num_options, options); doc->ap_media_type = cupsGetOption("AP_FIRSTPAGE_MediaType", num_options, options); doc->ap_page_region = cupsGetOption("AP_FIRSTPAGE_PageRegion", num_options, options); doc->ap_page_size = cupsGetOption("AP_FIRSTPAGE_PageSize", num_options, options); if ((choice = ppdFindMarkedChoice(ppd, "InputSlot")) != NULL) doc->input_slot = choice->choice; if ((choice = ppdFindMarkedChoice(ppd, "ManualFeed")) != NULL) doc->manual_feed = choice->choice; if ((choice = ppdFindMarkedChoice(ppd, "MediaColor")) != NULL) doc->media_color = choice->choice; if ((choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) doc->media_type = choice->choice; if ((choice = ppdFindMarkedChoice(ppd, "PageRegion")) != NULL) doc->page_region = choice->choice; if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL) doc->page_size = choice->choice; /* * collate, multiple-document-handling */ if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) { /* * This IPP attribute is unnecessarily complicated... * * single-document, separate-documents-collated-copies, and * single-document-new-sheet all require collated copies. * * separate-documents-uncollated-copies allows for uncollated copies. */ doc->collate = _cups_strcasecmp(val, "separate-documents-uncollated-copies") != 0; } if ((val = cupsGetOption("Collate", num_options, options)) != NULL && (!_cups_strcasecmp(val, "true") ||!_cups_strcasecmp(val, "on") || !_cups_strcasecmp(val, "yes"))) doc->collate = 1; /* * emit-jcl */ if ((val = cupsGetOption("emit-jcl", num_options, options)) != NULL && (!_cups_strcasecmp(val, "false") || !_cups_strcasecmp(val, "off") || !_cups_strcasecmp(val, "no") || !strcmp(val, "0"))) doc->emit_jcl = 0; else doc->emit_jcl = 1; /* * fit-to-page/ipp-attribute-fidelity * * (Only for original PostScript content) */ if ((content_type = getenv("CONTENT_TYPE")) == NULL) content_type = "application/postscript"; if (!_cups_strcasecmp(content_type, "application/postscript")) { if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && !_cups_strcasecmp(val, "true")) doc->fit_to_page = 1; else if ((val = cupsGetOption("ipp-attribute-fidelity", num_options, options)) != NULL && !_cups_strcasecmp(val, "true")) doc->fit_to_page = 1; } /* * mirror/MirrorPrint */ if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) { val = choice->choice; choice->marked = 0; } else val = cupsGetOption("mirror", num_options, options); if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || !_cups_strcasecmp(val, "yes"))) doc->mirror = 1; /* * number-up */ if ((val = cupsGetOption("number-up", num_options, options)) != NULL) { switch (intval = atoi(val)) { case 1 : case 2 : case 4 : case 6 : case 9 : case 16 : doc->number_up = intval; break; default : _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported number-up value %d, using " "number-up=1."), intval); doc->number_up = 1; break; } } else doc->number_up = 1; /* * number-up-layout */ if ((val = cupsGetOption("number-up-layout", num_options, options)) != NULL) { if (!_cups_strcasecmp(val, "lrtb")) doc->number_up_layout = PSTOPS_LAYOUT_LRTB; else if (!_cups_strcasecmp(val, "lrbt")) doc->number_up_layout = PSTOPS_LAYOUT_LRBT; else if (!_cups_strcasecmp(val, "rltb")) doc->number_up_layout = PSTOPS_LAYOUT_RLTB; else if (!_cups_strcasecmp(val, "rlbt")) doc->number_up_layout = PSTOPS_LAYOUT_RLBT; else if (!_cups_strcasecmp(val, "tblr")) doc->number_up_layout = PSTOPS_LAYOUT_TBLR; else if (!_cups_strcasecmp(val, "tbrl")) doc->number_up_layout = PSTOPS_LAYOUT_TBRL; else if (!_cups_strcasecmp(val, "btlr")) doc->number_up_layout = PSTOPS_LAYOUT_BTLR; else if (!_cups_strcasecmp(val, "btrl")) doc->number_up_layout = PSTOPS_LAYOUT_BTRL; else { _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported number-up-layout value %s, using " "number-up-layout=lrtb."), val); doc->number_up_layout = PSTOPS_LAYOUT_LRTB; } } else doc->number_up_layout = PSTOPS_LAYOUT_LRTB; /* * OutputOrder */ if ((val = cupsGetOption("OutputOrder", num_options, options)) != NULL) { if (!_cups_strcasecmp(val, "Reverse")) doc->output_order = 1; } else if (ppd) { /* * Figure out the right default output order from the PPD file... */ if ((choice = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL && (attr = ppdFindAttr(ppd, "PageStackOrder", choice->choice)) != NULL && attr->value) doc->output_order = !_cups_strcasecmp(attr->value, "Reverse"); else if ((attr = ppdFindAttr(ppd, "DefaultOutputOrder", NULL)) != NULL && attr->value) doc->output_order = !_cups_strcasecmp(attr->value, "Reverse"); } /* * page-border */ if ((val = cupsGetOption("page-border", num_options, options)) != NULL) { if (!_cups_strcasecmp(val, "none")) doc->page_border = PSTOPS_BORDERNONE; else if (!_cups_strcasecmp(val, "single")) doc->page_border = PSTOPS_BORDERSINGLE; else if (!_cups_strcasecmp(val, "single-thick")) doc->page_border = PSTOPS_BORDERSINGLE2; else if (!_cups_strcasecmp(val, "double")) doc->page_border = PSTOPS_BORDERDOUBLE; else if (!_cups_strcasecmp(val, "double-thick")) doc->page_border = PSTOPS_BORDERDOUBLE2; else { _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported page-border value %s, using " "page-border=none."), val); doc->page_border = PSTOPS_BORDERNONE; } } else doc->page_border = PSTOPS_BORDERNONE; /* * page-label */ doc->page_label = cupsGetOption("page-label", num_options, options); /* * page-ranges */ doc->page_ranges = cupsGetOption("page-ranges", num_options, options); /* * page-set */ doc->page_set = cupsGetOption("page-set", num_options, options); /* * Now figure out if we have to force collated copies, etc. */ if ((attr = ppdFindAttr(ppd, "cupsMaxCopies", NULL)) != NULL) max_copies = atoi(attr->value); else if (ppd && ppd->manual_copies) max_copies = 1; else max_copies = 9999; if (doc->copies > max_copies) doc->collate = 1; else if (ppd && ppd->manual_copies && Duplex && doc->copies > 1) { /* * Force collated copies when printing a duplexed document to * a non-PS printer that doesn't do hardware copy generation. * Otherwise the copies will end up on the front/back side of * each page. */ doc->collate = 1; } /* * See if we have to filter the fast or slow way... */ if (doc->collate && doc->copies > 1) { /* * See if we need to manually collate the pages... */ doc->slow_collate = 1; if (doc->copies <= max_copies && (choice = ppdFindMarkedChoice(ppd, "Collate")) != NULL && !_cups_strcasecmp(choice->choice, "True")) { /* * Hardware collate option is selected, see if the option is * conflicting - if not, collate in hardware. Otherwise, * turn the hardware collate option off... */ if ((option = ppdFindOption(ppd, "Collate")) != NULL && !option->conflicted) doc->slow_collate = 0; else ppdMarkOption(ppd, "Collate", "False"); } } else doc->slow_collate = 0; if (!ppdFindOption(ppd, "OutputOrder") && doc->output_order) doc->slow_order = 1; else doc->slow_order = 0; if (Duplex && (doc->slow_collate || doc->slow_order || ((attr = ppdFindAttr(ppd, "cupsEvenDuplex", NULL)) != NULL && attr->value && !_cups_strcasecmp(attr->value, "true")))) doc->slow_duplex = 1; else doc->slow_duplex = 0; /* * Create a temporary file for page data if we need to filter slowly... */ if (doc->slow_order || doc->slow_collate) { if ((doc->temp = cupsTempFile2(doc->tempfile, sizeof(doc->tempfile))) == NULL) { perror("DEBUG: Unable to create temporary file"); exit(1); } } /* * Figure out if we should use ESPshowpage or not... */ if (doc->page_label || getenv("CLASSIFICATION") || doc->number_up > 1 || doc->page_border) { /* * Yes, use ESPshowpage... */ doc->use_ESPshowpage = 1; } fprintf(stderr, "DEBUG: slow_collate=%d, slow_duplex=%d, slow_order=%d\n", doc->slow_collate, doc->slow_duplex, doc->slow_order); } /* * 'skip_page()' - Skip past a page that won't be printed. */ static ssize_t /* O - Length of next line */ skip_page(cups_file_t *fp, /* I - File to read from */ char *line, /* I - Line buffer */ ssize_t linelen, /* I - Length of initial line */ size_t linesize) /* I - Size of line buffer */ { int level; /* Embedded document level */ level = 0; while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0) { if (level == 0 && (!strncmp(line, "%%Page:", 7) || !strncmp(line, "%%Trailer", 9))) break; else if (!strncmp(line, "%%BeginDocument", 15) || !strncmp(line, "%ADO_BeginApplication", 21)) level ++; else if ((!strncmp(line, "%%EndDocument", 13) || !strncmp(line, "%ADO_EndApplication", 19)) && level > 0) level --; else if (!strncmp(line, "%%BeginBinary:", 14) || (!strncmp(line, "%%BeginData:", 12) && !strstr(line, "ASCII") && !strstr(line, "Hex"))) { /* * Skip binary data... */ ssize_t bytes; /* Bytes of data */ bytes = atoi(strchr(line, ':') + 1); while (bytes > 0) { if ((size_t)bytes > linesize) linelen = (ssize_t)cupsFileRead(fp, line, linesize); else linelen = (ssize_t)cupsFileRead(fp, line, (size_t)bytes); if (linelen < 1) { line[0] = '\0'; perror("ERROR: Early end-of-file while reading binary data"); return (0); } bytes -= linelen; } } } return (linelen); } /* * 'start_nup()' - Start processing for N-up printing. */ static void start_nup(pstops_doc_t *doc, /* I - Document information */ int number, /* I - Page number */ int show_border, /* I - Show the border? */ const int *bounding_box) /* I - BoundingBox value */ { int pos; /* Position on page */ int x, y; /* Relative position of subpage */ double w, l, /* Width and length of subpage */ tx, ty; /* Translation values for subpage */ double pagew, /* Printable width of page */ pagel; /* Printable height of page */ int bboxx, /* BoundingBox X origin */ bboxy, /* BoundingBox Y origin */ bboxw, /* BoundingBox width */ bboxl; /* BoundingBox height */ double margin = 0; /* Current margin for border */ if (doc->number_up > 1) doc_puts(doc, "userdict/ESPsave save put\n"); pos = (number - 1) % doc->number_up; pagew = PageRight - PageLeft; pagel = PageTop - PageBottom; if (doc->fit_to_page) { bboxx = bounding_box[0]; bboxy = bounding_box[1]; bboxw = bounding_box[2] - bounding_box[0]; bboxl = bounding_box[3] - bounding_box[1]; } else { bboxx = 0; bboxy = 0; bboxw = (int)PageWidth; bboxl = (int)PageLength; } fprintf(stderr, "DEBUG: pagew = %.1f, pagel = %.1f\n", pagew, pagel); fprintf(stderr, "DEBUG: bboxx = %d, bboxy = %d, bboxw = %d, bboxl = %d\n", bboxx, bboxy, bboxw, bboxl); fprintf(stderr, "DEBUG: PageLeft = %.1f, PageRight = %.1f\n", PageLeft, PageRight); fprintf(stderr, "DEBUG: PageTop = %.1f, PageBottom = %.1f\n", PageTop, PageBottom); fprintf(stderr, "DEBUG: PageWidth = %.1f, PageLength = %.1f\n", PageWidth, PageLength); switch (Orientation) { case 1 : /* Landscape */ doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", PageLength); break; case 2 : /* Reverse Portrait */ doc_printf(doc, "%.1f %.1f translate 180 rotate\n", PageWidth, PageLength); break; case 3 : /* Reverse Landscape */ doc_printf(doc, "0.0 %.1f translate -90 rotate\n", PageWidth); break; } /* * Mirror the page as needed... */ if (doc->mirror) doc_printf(doc, "%.1f 0.0 translate -1 1 scale\n", PageWidth); /* * Offset and scale as necessary for fit_to_page/fit-to-page/number-up... */ if (Duplex && doc->number_up > 1 && ((number / doc->number_up) & 1)) doc_printf(doc, "%.1f %.1f translate\n", PageWidth - PageRight, PageBottom); else if (doc->number_up > 1 || doc->fit_to_page) doc_printf(doc, "%.1f %.1f translate\n", PageLeft, PageBottom); switch (doc->number_up) { default : if (doc->fit_to_page) { w = pagew; l = w * bboxl / bboxw; if (l > pagel) { l = pagel; w = l * bboxw / bboxl; } tx = 0.5 * (pagew - w); ty = 0.5 * (pagel - l); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx, ty, w / bboxw, l / bboxl); } else w = PageWidth; break; case 2 : if (Orientation & 1) { x = pos & 1; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) x = 1 - x; w = pagel; l = w * bboxl / bboxw; if (l > (pagew * 0.5)) { l = pagew * 0.5; w = l * bboxw / bboxl; } tx = 0.5 * (pagew * 0.5 - l); ty = 0.5 * (pagel - w); if (doc->normal_landscape) doc_printf(doc, "0.0 %.1f translate -90 rotate\n", pagel); else doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", pagew); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", ty, tx + pagew * 0.5 * x, w / bboxw, l / bboxl); } else { x = pos & 1; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 1 - x; l = pagew; w = l * bboxw / bboxl; if (w > (pagel * 0.5)) { w = pagel * 0.5; l = w * bboxl / bboxw; } tx = 0.5 * (pagel * 0.5 - w); ty = 0.5 * (pagew - l); if (doc->normal_landscape) doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", pagew); else doc_printf(doc, "0.0 %.1f translate -90 rotate\n", pagel); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + pagel * 0.5 * x, ty, w / bboxw, l / bboxl); } break; case 4 : if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) { x = (pos / 2) & 1; y = pos & 1; } else { x = pos & 1; y = (pos / 2) & 1; } if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 1 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 1 - y; w = pagew * 0.5; l = w * bboxl / bboxw; if (l > (pagel * 0.5)) { l = pagel * 0.5; w = l * bboxw / bboxl; } tx = 0.5 * (pagew * 0.5 - w); ty = 0.5 * (pagel * 0.5 - l); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + x * pagew * 0.5, ty + y * pagel * 0.5, w / bboxw, l / bboxl); break; case 6 : if (Orientation & 1) { if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) { x = pos / 3; y = pos % 3; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 1 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 2 - y; } else { x = pos & 1; y = pos / 2; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 1 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 2 - y; } w = pagel * 0.5; l = w * bboxl / bboxw; if (l > (pagew * 0.333)) { l = pagew * 0.333; w = l * bboxw / bboxl; } tx = 0.5 * (pagel - 2 * w); ty = 0.5 * (pagew - 3 * l); if (doc->normal_landscape) doc_printf(doc, "0 %.1f translate -90 rotate\n", pagel); else doc_printf(doc, "%.1f 0 translate 90 rotate\n", pagew); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + x * w, ty + y * l, l / bboxl, w / bboxw); } else { if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) { x = pos / 2; y = pos & 1; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 2 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 1 - y; } else { x = pos % 3; y = pos / 3; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 2 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 1 - y; } l = pagew * 0.5; w = l * bboxw / bboxl; if (w > (pagel * 0.333)) { w = pagel * 0.333; l = w * bboxl / bboxw; } tx = 0.5 * (pagel - 3 * w); ty = 0.5 * (pagew - 2 * l); if (doc->normal_landscape) doc_printf(doc, "%.1f 0 translate 90 rotate\n", pagew); else doc_printf(doc, "0 %.1f translate -90 rotate\n", pagel); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + w * x, ty + l * y, w / bboxw, l / bboxl); } break; case 9 : if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) { x = (pos / 3) % 3; y = pos % 3; } else { x = pos % 3; y = (pos / 3) % 3; } if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 2 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 2 - y; w = pagew * 0.333; l = w * bboxl / bboxw; if (l > (pagel * 0.333)) { l = pagel * 0.333; w = l * bboxw / bboxl; } tx = 0.5 * (pagew * 0.333 - w); ty = 0.5 * (pagel * 0.333 - l); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + x * pagew * 0.333, ty + y * pagel * 0.333, w / bboxw, l / bboxl); break; case 16 : if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) { x = (pos / 4) & 3; y = pos & 3; } else { x = pos & 3; y = (pos / 4) & 3; } if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) x = 3 - x; if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) y = 3 - y; w = pagew * 0.25; l = w * bboxl / bboxw; if (l > (pagel * 0.25)) { l = pagel * 0.25; w = l * bboxw / bboxl; } tx = 0.5 * (pagew * 0.25 - w); ty = 0.5 * (pagel * 0.25 - l); doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx + x * pagew * 0.25, ty + y * pagel * 0.25, w / bboxw, l / bboxl); break; } /* * Draw borders as necessary... */ if (doc->page_border && show_border) { int rects; /* Number of border rectangles */ double fscale; /* Scaling value for points */ rects = (doc->page_border & PSTOPS_BORDERDOUBLE) ? 2 : 1; fscale = PageWidth / w; margin = 2.25 * fscale; /* * Set the line width and color... */ doc_puts(doc, "gsave\n"); doc_printf(doc, "%.3f setlinewidth 0 setgray newpath\n", (doc->page_border & PSTOPS_BORDERTHICK) ? 0.5 * fscale : 0.24 * fscale); /* * Draw border boxes... */ for (; rects > 0; rects --, margin += 2 * fscale) if (doc->number_up > 1) doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrs\n", margin, margin, bboxw - 2 * margin, bboxl - 2 * margin); else doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrs\n", PageLeft + margin, PageBottom + margin, PageRight - PageLeft - 2 * margin, PageTop - PageBottom - 2 * margin); /* * Restore pen settings... */ doc_puts(doc, "grestore\n"); } if (doc->fit_to_page) { /* * Offset the page by its bounding box... */ doc_printf(doc, "%d %d translate\n", -bounding_box[0], -bounding_box[1]); } if (doc->fit_to_page || doc->number_up > 1) { /* * Clip the page to the page's bounding box... */ doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrc\n", bboxx + margin, bboxy + margin, bboxw - 2 * margin, bboxl - 2 * margin); } } /* * 'write_label_prolog()' - Write the prolog with the classification * and page label. */ static void write_label_prolog(pstops_doc_t *doc, /* I - Document info */ const char *label, /* I - Page label */ float bottom, /* I - Bottom position in points */ float top, /* I - Top position in points */ float width) /* I - Width in points */ { const char *classification; /* CLASSIFICATION environment variable */ const char *ptr; /* Temporary string pointer */ /* * First get the current classification... */ if ((classification = getenv("CLASSIFICATION")) == NULL) classification = ""; if (strcmp(classification, "none") == 0) classification = ""; /* * If there is nothing to show, bind an empty 'write labels' procedure * and return... */ if (!classification[0] && (label == NULL || !label[0])) { doc_puts(doc, "userdict/ESPwl{}bind put\n"); return; } /* * Set the classification + page label string... */ doc_puts(doc, "userdict"); if (!strcmp(classification, "confidential")) doc_puts(doc, "/ESPpl(CONFIDENTIAL"); else if (!strcmp(classification, "classified")) doc_puts(doc, "/ESPpl(CLASSIFIED"); else if (!strcmp(classification, "secret")) doc_puts(doc, "/ESPpl(SECRET"); else if (!strcmp(classification, "topsecret")) doc_puts(doc, "/ESPpl(TOP SECRET"); else if (!strcmp(classification, "unclassified")) doc_puts(doc, "/ESPpl(UNCLASSIFIED"); else { doc_puts(doc, "/ESPpl("); for (ptr = classification; *ptr; ptr ++) { if (*ptr < 32 || *ptr > 126) doc_printf(doc, "\\%03o", *ptr); else if (*ptr == '_') doc_puts(doc, " "); else if (*ptr == '(' || *ptr == ')' || *ptr == '\\') doc_printf(doc, "\\%c", *ptr); else doc_printf(doc, "%c", *ptr); } } if (label) { if (classification[0]) doc_puts(doc, " - "); /* * Quote the label string as needed... */ for (ptr = label; *ptr; ptr ++) { if (*ptr < 32 || *ptr > 126) doc_printf(doc, "\\%03o", *ptr); else if (*ptr == '(' || *ptr == ')' || *ptr == '\\') doc_printf(doc, "\\%c", *ptr); else doc_printf(doc, "%c", *ptr); } } doc_puts(doc, ")put\n"); /* * Then get a 14 point Helvetica-Bold font... */ doc_puts(doc, "userdict/ESPpf /Helvetica-Bold findfont 14 scalefont put\n"); /* * Finally, the procedure to write the labels on the page... */ doc_puts(doc, "userdict/ESPwl{\n"); doc_puts(doc, " ESPpf setfont\n"); doc_printf(doc, " ESPpl stringwidth pop dup 12 add exch -0.5 mul %.0f add\n", width * 0.5f); doc_puts(doc, " 1 setgray\n"); doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrf\n", bottom - 2.0); doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrf\n", top - 18.0); doc_puts(doc, " 0 setgray\n"); doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrs\n", bottom - 2.0); doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrs\n", top - 18.0); doc_printf(doc, " dup %.0f moveto ESPpl show\n", bottom + 2.0); doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0); doc_puts(doc, "pop\n"); doc_puts(doc, "}bind put\n"); } /* * 'write_labels()' - Write the actual page labels. * * This function is a copy of the one in common.c since we need to * use doc_puts/doc_printf instead of puts/printf... */ static void write_labels(pstops_doc_t *doc, /* I - Document information */ int orient) /* I - Orientation of the page */ { float width, /* Width of page */ length; /* Length of page */ doc_puts(doc, "gsave\n"); if ((orient ^ Orientation) & 1) { width = PageLength; length = PageWidth; } else { width = PageWidth; length = PageLength; } switch (orient & 3) { case 1 : /* Landscape */ doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", length); break; case 2 : /* Reverse Portrait */ doc_printf(doc, "%.1f %.1f translate 180 rotate\n", width, length); break; case 3 : /* Reverse Landscape */ doc_printf(doc, "0.0 %.1f translate -90 rotate\n", width); break; } doc_puts(doc, "ESPwl\n"); doc_puts(doc, "grestore\n"); } /* * 'write_options()' - Write options provided via %%IncludeFeature. */ static void write_options( pstops_doc_t *doc, /* I - Document */ ppd_file_t *ppd, /* I - PPD file */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - Options */ { int i; /* Looping var */ ppd_option_t *option; /* PPD option */ float min_order; /* Minimum OrderDependency value */ char *doc_setup, /* DocumentSetup commands to send */ *any_setup; /* AnySetup commands to send */ /* * Figure out the minimum OrderDependency value... */ if ((option = ppdFindOption(ppd, "PageRegion")) != NULL) min_order = option->order; else min_order = 999.0f; for (i = 0; i < num_options; i ++) if ((option = ppdFindOption(ppd, options[i].name)) != NULL && option->order < min_order) min_order = option->order; /* * Mark and extract them... */ cupsMarkOptions(ppd, num_options, options); doc_setup = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, min_order); any_setup = ppdEmitString(ppd, PPD_ORDER_ANY, min_order); /* * Then send them out... */ if (doc->number_up > 1) { /* * Temporarily restore setpagedevice so we can set the options... */ doc_puts(doc, "userdict/setpagedevice/CUPSsetpagedevice load put\n"); } if (doc_setup) { doc_puts(doc, doc_setup); free(doc_setup); } if (any_setup) { doc_puts(doc, any_setup); free(any_setup); } if (doc->number_up > 1) { /* * Disable setpagedevice again... */ doc_puts(doc, "userdict/setpagedevice{pop}bind put\n"); } } cups-2.3.1/filter/spec-ppd.shtml000664 000765 000024 00000232712 13574721672 016657 0ustar00mikestaff000000 000000

PPD File Syntax

The PPD format is text-based and uses lines of up to 255 characters terminated by a carriage return, linefeed, or combination of carriage return and line feed. The following ABNF definition [RFC5234] defines the general format of lines in a PPD file:

PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)

HEADER   = "*PPD-Adobe:" *WSP DQUOTE VERSION DQUOTE LINE-END

VERSION  = "4.0" / "4.1" / "4.2" / "4.3"

COMMENT  = "*%" *TCHAR LINE-END

DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
           1*(*WSP VALUE) LINE-END

VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE

KCHAR    = ALPHA / DIGIT / "_" / "." / "-"

SCHAR    = LINE-END / WSP / %x21.23-7E.A0-FF

TCHAR    = %x20-7E.A0-FF

LINE-END = CR / LF / CR LF

Auto-Configuration

CUPS supports several methods of auto-configuration via PPD keywords.

macOS 10.5APAutoSetupTool

*APAutoSetupTool: "/LibraryPrinters/vendor/filename"

This macOS keyword defines a program that sets the default option choices. It is run when a printer is added from the Add Printer window or the Nearby Printers list in the Print dialog.

The program is provided with two arguments: the printer's device URI and the PPD file to be used for the printer. The program must write an updated PPD file to stdout.

Examples:

*% Use our setup tool when adding a printer
*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"

macOS 10.2/CUPS 1.4?MainKeyword

*?MainKeyword: "
PostScript query code that writes a message using the = operator...
"
*End

The ?MainKeyword keyword defines PostScript code that determines the currently selected/enabled option keyword (choice) for the main keyword (option). It is typically used when communicating with USB, serial, Appletalk, and AppSocket (port 9100) printers.

The PostScript code typically sends its response back using the = operator.

Example:

*OpenUI OptionDuplex/Duplexer Installed: Boolean
*DuplexOptionDuplex: False
*OptionDuplex False/Not Installed: ""
*OptionDuplex True/Installed: ""

*% Query the printer for the presence of the duplexer option...
*?OptionDuplex: "
  currentpagedevice /Duplex known
  {(True)} {(False)} ifelse
  = flush
"
*End
*CloseUI: OptionDuplex

macOS 10.4/CUPS 1.5OIDMainKeyword

*?OIDMainKeyword: ".n.n.n..."
*OIDMainKeyword OptionKeyword1: "value"
...
*OIDMainKeyword OptionKeywordN: "value"

The OIDMainKeyword keyword is used to define SNMP OIDs that map to installable options. The first (query) line defines the OID to lookup on the network device. The second and subsequent keywords define a mapping from OID value to option keyword. Since SNMP is an IP-based network protocol, this method is typically only used to configure AppSocket, IPP, and LPD network printers.

Examples:

*% Get the installed memory on the printer...
*?OIDInstalledMemory: ".1.3.6.1.2.1.25.2.2.0"
*OIDInstalledMemory 16MB: "16384 KBytes"
*OIDInstalledMemory 32MB: "32768 KBytes"
*OIDInstalledMemory 48MB: "49152 KBytes"
*OIDInstalledMemory 72MB: "73728 KBytes"

Color Profiles

CUPS supports three types of color profiles. The first type is based on sRGB and is used by the standard CUPS raster filters and GPL Ghostscript. The second type is based on ICC profiles and is used by the Quartz-based filters on macOS. The final type is based on well-known colorspaces such as sRGB and Adobe RGB.

Note:

At this time, none of the CUPS raster filters support ICC profiles. This will be addressed as time and resources permit.

DeprecatedcupsColorProfile

*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"

This string keyword specifies an sRGB-based color profile consisting of gamma and density controls and a 3x3 CMY color transform matrix. This keyword is not supported on macOS.

The Resolution and MediaType values may be "-" to act as a wildcard. Otherwise they must match one of the Resolution or MediaType option keywords defined in the PPD file.

The density and gamma values define gamma and density adjustment function such that:

f(x) = density * x gamma

The m00 through m22 values define a 3x3 transformation matrix for the CMY color values. The density function is applied after the CMY transformation:

| m00 m01 m02 |
| m10 m11 m12 |
| m20 m21 m22 |

Examples:

*% Specify a profile for printing at 360dpi on all media types
*cupsColorProfile 360dpi/-: "1.0 1.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

*% Specify a profile for printing at 720dpi on Glossy media
*cupsColorProfile 720dpi/Glossy: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

*% Specify a default profile for printing at all other resolutions and media types
*cupsColorProfile -/-: "0.9 2.0 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

macOS 10.3/CUPS 1.2cupsICCProfile

*cupsICCProfile ColorModel.MediaType.Resolution/Description: "filename"

This keyword specifies an ICC color profile that is used to convert the document colors to the device colorspace. The ColorModel, MediaType, and Resolution option keywords specify a selector for color profiles. If omitted, the color profile will match any option keyword for the corresponding main keyword.

The Description specifies human-readable text that is associated with the color profile. The filename portion specifies the ICC color profile to use; if the filename is not absolute, it is loaded relative to the /usr/share/cups/profiles directory.

Examples:

*% Specify a profile for CMYK printing at 360dpi on all media types
*cupsICCProfile CMYK..360dpi/360dpi CMYK: "/Library/Printers/vendor/Profiles/foo-360-cmyk.icc"

*% Specify a profile for RGB printing at 720dpi on Glossy media
*cupsColorProfile RGB.Glossy.720dpi/720dpi Glossy: "/Library/Printers/vendor/Profiles/foo-720-glossy-rgb.icc"

*% Specify a default profile for printing at all other resolutions and media types
*cupsICCProfile ../Default: "/Library/Printers/vendor/Profiles/foo-default.icc"

Customizing the Profile Selection Keywords

The ColorModel, MediaType, and Resolution main keywords can be reassigned to different main keywords, allowing drivers to do color profile selection based on different parameters. The cupsICCQualifier1, cupsICCQualifier2, and cupsICCQualifier3 keywords define the mapping from selector to main keyword:

*cupsICCQualifier1: MainKeyword1
*cupsICCQualifier2: MainKeyword2
*cupsICCQualifier3: MainKeyword3

The default mapping is as follows:

*cupsICCQualifier1: ColorModel
*cupsICCQualifier2: MediaType
*cupsICCQualifier3: Resolution

macOS 10.4Custom Color Matching Support

*APSupportsCustomColorMatching: true
*APCustomColorMatchingName name/text: ""
*APCustomColorMatchingProfile: profile
*APDefaultCustomColorMatchingProfile: profile

These keywords tell the macOS raster filters that the printer driver provides its own custom color matching and that generic color profiles should be used when generating 1-, 3-, and 4-component raster data as requested by the driver. The APCustomColorMatchingProfile and APDefaultColorMatchingProfile keywords specify alternate color profiles (sRGB or AdobeRGB) to use for 3-color (RGB) raster data.

Note:

Prior to macOS 10.6, the default RGB color space was Apple's "GenericRGB". The new default in macOS 10.6 and later is "sRGB". For more information, see "macOS v10.6: About gamma 2.2" on Apple's support site.

macOS 10.5APCustomColorMatchingName

*APCustomColorMatchingName name/text: ""

This keyword defines an alternate name for the color matching provided by a driver in the Color Matching print panel. The default is to use the name "Vendor Matching" or its localized equivalent.

Examples:

*% Define the names for our color matching...
*APCustomColorMatchingName name/AcmeColor(tm): ""
*fr.APCustomColorMatchingName name/La AcmeColor(tm): ""

macOS 10.5APCustomColorMatchingProfile

*APCustomColorMatchingProfile: name

This keyword defines a supported RGB color profile that can be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported. If not specified, RGB data will use the GenericRGB colorspace.

Note:

If you provide multiple APCustomColorMatchingProfile keywords, you are responsible for providing the necessary user interface controls to select the profile in a print dialog pane. Add the named profile to the print settings using the key kPMCustomColorMatchingProfileKey.

Examples:

*% Use sRGB for RGB color by default, but support both sRGB and AdobeRGB
*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB
*APCustomColorMatchingProfile: sRGB
*APCustomColorMatchingProfile: AdobeRGB

macOS 10.5APDefaultCustomColorMatchingProfile

*APDefaultCustomColorMatchingProfile: name

This keyword defines the default RGB color profile that will be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported.

Examples:

*% Use sRGB for RGB color by default
*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB

macOS 10.4APSupportsCustomColorMatching

*APSupportsCustomColorMatching: boolean

This keyword specifies that the driver provides its own custom color matching. When true, the default hand-off colorspace will be GenericGray, GenericRGB, or GenericCMYK depending on the number of components the driver requests. The APDefaultCustomColorMatchingProfile keyword can be used to override the default 3-component (RGB) colorspace.

The default for APSupportsCustomColorMatching is false.

Examples:

*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB

Constraints

Constraints are option choices that are not allowed by the driver or device, for example printing 2-sided transparencies. All versions of CUPS support constraints defined by the legacy Adobe UIConstraints and NonUIConstraints keywords which support conflicts between any two option choices, for example:

*% Do not allow 2-sided printing on transparency media
*UIConstraints: "*Duplex *MediaType Transparency"
*UIConstraints: "*MediaType Transparency *Duplex"

While nearly all constraints can be expressed using these keywords, there are valid scenarios requiring constraints between more than two option choices. In addition, resolution of constraints is problematic since users and software have to guess how a particular constraint is best resolved.

CUPS 1.4 and higher define two new keywords for constraints, cupsUIConstraints and cupsUIResolver. Each cupsUIConstraints keyword points to a cupsUIResolver keyword which specifies alternate options that resolve the conflict condition. The same cupsUIResolver can be used by multiple cupsUIConstraints.

Note:

When developing PPD files that contain constraints, it is very important to use the cupstestppd(1) program to verify that your constraints are accurate and cannot result in unresolvable option selections.

CUPS 1.4/macOS 10.6cupsUIConstraints

*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 *Keyword2 OptionKeyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
*cupsUIConstraints: "*InstallableKeyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

Lists two or more options which conflict. The "resolver" string is a (possibly unique) keyword which specifies which options to change when the constraint exists. When no resolver is provided, CUPS first tries the default choice followed by testing each option choice to resolve the conflict.

Examples:

*% Specify that 2-sided printing cannot happen on transparencies
*cupsUIConstraints transparency: "*Duplex *MediaType Transparency"

*% Specify that envelope printing cannot happen from the paper trays
*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"

*% Specify an installable option constraint for the envelope feeder
*cupsUIConstraints: "*InputSlot EnvFeeder *InstalledEnvFeeder"

*% Specify that photo printing cannot happen on plain paper or transparencies at 1200dpi
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Plain *Resolution 1200dpi"
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"

CUPS 1.4/macOS 10.6cupsUIResolver

*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

Specifies two or more options to mark/select to resolve a constraint. The "resolver" string identifies a particular action to take for one or more cupsUIConstraints. The same action can be used for multiple constraints. The option keyword pairs are treated as an ordered list of option selections to try - only the first N selections will be used, where N is the minimum number of selections required. Because cupsResolveConflicts() will not change the most recent option selection passed to it, at least two options from the constraints must be listed to avoid situations where conflicts cannot be resolved.

Examples:

*% Specify the options to change for the 2-sided transparency constraint
*cupsUIResolver transparency: "*Duplex None *MediaType Plain"

*% Specify the options to change for the envelope printing constraints.  Notice
*% that we try to change the InputSlot to either the envelope feeder or the
*% manual feed first, then we change the page size...
*cupsUIResolver envelope: "*InputSlot EnvFeeder *InputSlot ManualFeed *PageSize Letter"

*% Specify the options to change for the photo printing constraints
*cupsUIResolver photo: "*OutputMode Best *Resolution 600dpi"

Globalized PPD Support

CUPS 1.2 and higher adds support for PPD files containing multiple languages by following the following additional rules:

  1. The LanguageVersion MUST be English
  2. The LanguageEncoding MUST be ISOLatin1
  3. The cupsLanguages keyword MUST be provided and list each of the supported locales in the PPD file
  4. Main and option keywords MUST NOT exceed 34 (instead of 40) characters to allow room for the locale prefixes in translation keywords
  5. The main keyword "Translation" MUST NOT be used
  6. Translation strings included with the main and option keywords MUST NOT contain characters outside the ASCII subset of ISOLatin1 and UTF-8; developers wishing to use characters outside ASCII MUST provide a separate set of English localization keywords for the affected keywords.
  7. Localizations are specified using a locale prefix of the form "ll" or "ll_CC." where "ll" is the 2-letter ISO language code and "CC" is the 2-letter ISO country code
    • A generic language translation ("ll") SHOULD be provided with country-specific differences ("ll_CC") provided only as needed
    • For historical reasons, the "zh" and "zh_CN" locales map to Simplified Chinese while the "zh_TW" locale maps to Traditional Chinese
  8. Locale-specific translation strings MUST be encoded using UTF-8.
  9. Main keywords MUST be localized using one of the following forms:

    *ll.Translation MainKeyword/translation text: ""
    *ll_CC.Translation MainKeyword/translation text: ""

  10. Option keywords MUST be localized using one of the following forms:

    *ll.MainKeyword OptionKeyword/translation text: ""
    *ll_CC.MainKeyword OptionKeyword/translation text: ""

  11. Localization keywords MAY appear anywhere after the first line of the PPD file
Note:

We use a LanguageEncoding value of ISOLatin1 and limit the allowed base translation strings to ASCII to avoid character coding issues that would otherwise occur. In addition, requiring the base translation strings to be in English allows for easier fallback translation when no localization is provided in the PPD file for a given locale.

Examples:

*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*cupsLanguages: "de fr_CA"
*ModelName: "Foobar Laser 9999"

*% Localize ModelName for French and German
*fr_CA.Translation ModelName/La Foobar Laser 9999: ""
*de.Translation ModelName/Foobar LaserDrucken 9999: ""

*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
*% Localize printer-state-reason for French and German
*fr_CA.cupsIPPReason com.vendor-error/Une erreur sèrieuse s'est produite: "/help/com.vendor/error.html"
*de.cupsIPPReason com.vendor-error/Eine ernste Störung trat: "/help/com.vendor/error.html"

...

*OpenUI *InputSlot/Paper Source: PickOne
*OrderDependency: 10 AnySetup *InputSlot
*DefaultInputSlot: Auto
*% Localize InputSlot for French and German
*fr_CA.Translation InputSlot/Papier source: ""
*de.Translation InputSlot/Papiereinzug: ""
*InputSlot Auto/Default: "<</ManualFeed false>>setpagedevice"
*% Localize InputSlot=Auto for French and German
*fr_CA.InputSlot Auto/Par Defaut: ""
*de.InputSlot Auto/Standard: ""
*InputSlot Manual/Manual Feed: "<</ManualFeed true>>setpagedevice"
*% Localize InputSlot=Manual for French and German
*fr_CA.InputSlot Manual/Manuel mecanisme de alimentation: ""
*de.InputSlot Manual/Manueller Einzug: ""
*CloseUI: *InputSlot

CUPS 1.3/macOS 10.6Custom Options

CUPS supports custom options using an extension of the CustomPageSize and ParamCustomPageSize syntax:

*CustomFoo True: "command"
*ParamCustomFoo Name1/Text 1: order type minimum maximum
*ParamCustomFoo Name2/Text 2: order type minimum maximum
...
*ParamCustomFoo NameN/Text N: order type minimum maximum

When the base option is part of the JCLSetup section, the "command" string contains JCL commands with "\order" placeholders for each numbered parameter. The CUPS API handles any necessary value quoting for HP-PJL commands. For example, if the JCL command string is "@PJL SET PASSCODE=\1" and the first option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234".

For non-JCLSetup options, the "order" value is a number from 1 to N and specifies the order of values as they are placed on the stack before the command. For example, if the PostScript command string is "<</cupsReal1 2 1 roll>>setpagedevice" and the option value is "2.0" then CUPS will output the string "2.0 <</cupsReal1 2 1 roll>>setpagedevice".

The "type" is one of the following keywords:

  • curve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x value
  • int - an integer value from "minimum" to "maximum"
  • invcurve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x 1 / value
  • passcode - a string of numbers value with a minimum of "minimum" numbers and a maximum of "maximum" numbers ("minimum" and "maximum" are numbers and passcode strings are not displayed in the user interface)
  • password - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers and password strings are not displayed in the user interface)
  • points - a measurement value in points from "minimum" to "maximum"
  • real - a real value from "minimum" to "maximum"
  • string - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers)

Examples:

*% Base JCL key code option
*JCLOpenUI JCLPasscode/Key Code: PickOne
*OrderDependency: 10 JCLSetup *JCLPasscode
*DefaultJCLPasscode: None
*JCLPasscode None/No Code: ""
*JCLPasscode 1111: "@PJL SET PASSCODE = 1111<0A>"
*JCLPasscode 2222: "@PJL SET PASSCODE = 2222<0A>"
*JCLPasscode 3333: "@PJL SET PASSCODE = 3333<0A>"
*JCLCloseUI: *JCLPasscode

*% Custom JCL key code option
*CustomJCLPasscode True: "@PJL SET PASSCODE = \1<0A>"
*ParamCustomJCLPasscode Code/Key Code: 1 passcode 4 4


*% Base PostScript watermark option
*OpenUI WatermarkText/Watermark Text: PickOne
*OrderDependency: 10 AnySetup *WatermarkText
*DefaultWatermarkText: None
*WatermarkText None: ""
*WatermarkText Draft: "<</cupsString1(Draft)>>setpagedevice"
*CloseUI: *WatermarkText

*% Custom PostScript watermark option
*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
*ParamCustomWatermarkText Text: 1 string 0 32


*% Base PostScript gamma/density option
*OpenUI GammaDensity/Gamma and Density: PickOne
*OrderDependency: 10 AnySetup *GammaDensity
*DefaultGammaDensity: Normal
*GammaDensity Normal/Normal: "<</cupsReal1 1.0/cupsReal2 1.0>>setpagedevice"
*GammaDensity Light/Lighter: "<</cupsReal1 0.9/cupsReal2 0.67>>setpagedevice"
*GammaDensity Dark/Darker: "<</cupsReal1 1.1/cupsReal2 1.5>>setpagedevice"
*CloseUI: *GammaDensity

*% Custom PostScript gamma/density option
*CustomGammaDensity True: "<</cupsReal1 3 -1 roll/cupsReal2 5 -1>>setpagedevice"
*ParamCustomGammaDensity Gamma: 1 curve 0.1 10
*ParamCustomGammaDensity Density: 2 real 0 2

Writing PostScript Option Commands for Raster Drivers

PPD files are used for both PostScript and non-PostScript printers. For CUPS raster drivers, you use a subset of the PostScript language to set page device keywords such as page size, resolution, and so forth. For example, the following code sets the page size to A4 size:

*PageSize A4: "<</PageSize[595 842]>>setpagedevice"

Custom options typically use other operators to organize the values into a key/value dictionary for setpagedevice. For example, our previous CustomWatermarkText option code uses the roll operator to move the custom string value into the dictionary for setpagedevice:

*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"

For a custom string value of "My Watermark", CUPS will produce the following PostScript code for the option:

(My Watermark)
<</cupsString1 3 -1 roll>>setpagedevice

The code moves the string value ("My Watermark") from the bottom of the stack to the top, creating a dictionary that looks like:

<</cupsString1(My Watermark)>>setpagedevice

The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.

Custom Page Size Code

There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:

*ParamCustomPageSize Width:        1 points min-width max-width
*ParamCustomPageSize Height:       2 points min-height max-height
*ParamCustomPageSize WidthOffset:  3 points 0 0
*ParamCustomPageSize HeightOffset: 4 points 0 0
*ParamCustomPageSize Orientation:  5 int 0 0
*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"

Supported PostScript Operators

CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:

  • << - Start a dictionary.
  • >> - End a dictionary.
  • [ - Start an array.
  • ] - End an array.
  • copy - Copy the top N objects on the stack.
  • dup - Copy the top object on the stack.
  • index - Copy the Nth from the top object on the stack.
  • pop - Pop the top object on the stack.
  • roll - Shift the top N objects on the stack.
  • setpagedevice - Set the page header values according to the key/value dictionary on the stack.
Note:

Never use the unsupported dict or put operators in your option code. These operators are typically used in option code dating back to Level 1 PostScript printers, which did not support the simpler << or >> operators. If you have old option code using dict or put, you can rewrite it very easily to use the newer << and >> operators instead. For example, the following code to set the page size:

1 dict dup /PageSize [612 792] put setpagedevice

can be rewritten as:

<< /PageSize [612 792] >> setpagedevice

Supported Page Device Attributes

Table 2 shows the supported page device attributes along with PostScript code examples.

Table 2: Supported Page Device Attributes
Name(s) Type Description Example(s)
AdvanceDistance Integer Specifies the number of points to advance roll media after printing. <</AdvanceDistance 18>>setpagedevice
AdvanceMedia Integer Specifies when to advance the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</AdvanceMedia 4>>setpagedevice
Collate Boolean Specifies whether collated copies are required. <</Collate true>>setpagedevice
CutMedia Integer Specifies when to cut the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</CutMedia 1>>setpagedevice
Duplex Boolean Specifies whether 2-sided printing is required. <</Duplex true>>setpagedevice
HWResolution Integer Array Specifies the resolution of the page image in pixels per inch. <</HWResolution[1200 1200]>>setpagedevice
InsertSheet Boolean Specifies whether to insert a blank sheet before the job. <</InsertSheet true>>setpagedevice
Jog Integer Specifies when to shift the media in the output bin: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</Jog 2>>setpagedevice
LeadingEdge Integer Specifies the leading edge of the media: 0 = top, 1 = right, 2 = bottom, 3 = left. <</LeadingEdge 0>>setpagedevice
ManualFeed Boolean Specifies whether media should be drawn from the manual feed tray. Note: The MediaPosition attribute is preferred over the ManualFeed attribute. <</ManualFeed true>>setpagedevice
MediaClass String Specifies a named media. <</MediaClass (Invoices)>>setpagedevice
MediaColor String Specifies the color of the media. <</MediaColor >>setpagedevice
MediaPosition Integer Specifies the tray or source of the media. <</MediaPosition 12>>setpagedevice
MediaType String Specifies the general media type. <</MediaType (Glossy)>>setpagedevice
MediaWeight Integer Specifies the media weight in grams per meter2. <</MediaWeight 100>>setpagedevice
MirrorPrint Boolean Specifies whether to flip the output image horizontally. <</MirrorPrint true>>setpagedevice
NegativePrint Boolean Specifies whether to invert the output image. <</NegativePrint true>>setpagedevice
NumCopies Integer Specifies the number of copies to produce of each page. <</NumCopies 100>>setpagedevice
Orientation Integer Specifies the orientation of the output: 0 = portrait, 1 = landscape rotated counter-clockwise, 2 = upside-down, 3 = landscape rotated clockwise. <</Orientation 3>>setpagedevice
OutputFaceUp Boolean Specifies whether to place the media face-up in the output bin/tray. <</OutputFaceUp true>>setpagedevice
OutputType String Specifies the output type name. <</OutputType (Photo)>>setpagedevice
PageSize Integer/Real Array Specifies the width and length/height of the page in points. <</PageSize[595 842]>>setpagedevice
Separations Boolean Specifies whether to produce color separations. <</Separations true>>setpagedevice
TraySwitch Boolean Specifies whether to switch trays automatically. <</TraySwitch true>>setpagedevice
Tumble Boolean Specifies whether the back sides of pages are rotated 180 degrees. <</Tumble true>>setpagedevice
cupsBorderlessScalingFactor Real Specifies the amount to scale the page image dimensions. <</cupsBorderlessScalingFactor 1.01>>setpagedevice
cupsColorOrder Integer Specifies the order of colors: 0 = chunked, 1 = banded, 2 = planar. <</cupsColorOrder 0>>setpagedevice
cupsColorSpace Integer Specifies the page image colorspace: 0 = W, 1 = RGB, 2 = RGBA, 3 = K, 4 = CMY, 5 = YMC, 6 = CMYK, 7 = YMCK, 8 = KCMY, 9 = KCMYcm, 10 = GMCK, 11 = GMCS, 12 = White, 13 = Gold, 14 = Silver, 15 = CIE XYZ, 16 = CIE Lab, 17 = RGBW, 32 to 46 = CIE Lab (1 to 15 inks) <</cupsColorSpace 1 >>setpagedevice
cupsCompression Integer Specifies a driver compression type/mode. <</cupsCompression 2>>setpagedevice
cupsInteger0
...
cupsInteger15
Integer Specifies driver integer values. <</cupsInteger11 1234>>setpagedevice
cupsMarkerType String Specifies the type of ink/toner to use. <</cupsMarkerType (Black+Color)>>setpagedevice
cupsMediaType Integer Specifies a numeric media type. <</cupsMediaType 999>>setpagedevice
cupsPageSizeName String Specifies the name of the page size. <</cupsPageSizeName (A4.Full)>>setpagedevice
cupsPreferredBitsPerColor Integer Specifies the preferred number of bits per color, typically 8 or 16. <</cupsPreferredBitsPerColor 16>>setpagedevice
cupsReal0
...
cupsReal15
Real Specifies driver real number values. <</cupsReal15 1.234>>setpagedevice
cupsRenderingIntent String Specifies the color rendering intent. <</cupsRenderingIntent (AbsoluteColorimetric)>>setpagedevice
cupsRowCount Integer Specifies the number of rows of raster data to print on each line for some drivers. <</cupsRowCount 24>>setpagedevice
cupsRowFeed Integer Specifies the number of rows to feed between passes for some drivers. <</cupsRowFeed 17>>setpagedevice
cupsRowStep Integer Specifies the number of lines between columns/rows on the print head for some drivers. <</cupsRowStep 2>>setpagedevice
cupsString0
...
cupsString15
String Specifies driver string values. <</cupsString0(String Value)>>setpagedevice

Media Keywords

The CUPS media keywords allow drivers to specify alternate custom page size limits based on up to two options.

CUPS 1.4/macOS 10.6cupsMediaQualifier2

*cupsMediaQualifier2: MainKeyword

This keyword specifies the second option to use for overriding the custom page size limits.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMediaQualifier3

*cupsMediaQualifier3: MainKeyword

This keyword specifies the third option to use for overriding the custom page size limits.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMinSize

*cupsMinSize .Qualifier2.Qualifier3: "width length"
*cupsMinSize .Qualifier2.: "width length"
*cupsMinSize ..Qualifier3: "width length"

This keyword specifies alternate minimum custom page sizes in points. The cupsMediaQualifier2 and cupsMediaQualifier3 keywords are used to identify options to use for matching.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMaxSize

*cupsMaxSize .Qualifier2.Qualifier3: "width length"
*cupsMaxSize .Qualifier2.: "width length"
*cupsMaxSize ..Qualifier3: "width length"

This keyword specifies alternate maximum custom page sizes in points. The cupsMediaQualifier2 and cupsMediaQualifier3 keywords are used to identify options to use for matching.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsPageSizeCategory

*cupsPageSizeCategory name/text: "name name2 ... nameN"

This keyword lists related paper size names that should be grouped together in the Print or Page Setup dialogs. The "name" portion of the keyword specifies the root/default size for the grouping. On macOS the grouped paper sizes are shown in a submenu of the main paper size. When omitted, sizes with the same dimensions are automatically grouped together, for example "Letter" and "Letter.Borderless".

Example:

*% Specify grouping of borderless/non-borderless sizes
*cupsPageSizeCategory Letter/US Letter: "Letter Letter.Borderless"
*cupsPageSizeCategory A4/A4: "A4 A4.Borderless"

General Attributes

CUPS 1.3/macOS 10.5cupsBackSide

*cupsBackSide: keyword

This keyword requests special handling of the back side of pages when doing duplexed (2-sided) output. Table 1 shows the supported keyword values for this keyword and their effect on the raster data sent to your driver. For example, when cupsBackSide is Rotated and Tumble is false, your driver will receive print data starting at the bottom right corner of the page, with each line going right-to-left instead of left-to-right. The default value is Normal.

Note:

cupsBackSide replaces the older cupsFlipDuplex keyword - if cupsBackSide is specified, cupsFlipDuplex will be ignored.

Table 1: Back Side Raster Coordinate System
cupsBackSide Tumble Value Image Presentation
Normal false Left-to-right, top-to-bottom
Normal true Left-to-right, top-to-bottom
ManualTumble false Left-to-right, top-to-bottom
ManualTumble true Right-to-left, bottom-to-top
Rotated false Right-to-left, bottom-to-top
Rotated true Right-to-left, top-to-bottom
Flipped * false Left-to-right, bottom-to-top
Flipped * true Right-to-left, top-to-bottom

* - Not supported in macOS 10.5.x and earlier

Figure 1: Back side images
Back side images

Examples:

*% Flip the page image for the back side of duplexed output
*cupsBackSide: Flipped

*% Rotate the page image for the back side of duplexed output
*cupsBackSide: Rotated

Also see the related APDuplexRequiresFlippedMargin keyword.

CUPS 1.4/macOS 10.6cupsCommands

*cupsCommands: "name name2 ... nameN"

This string keyword specifies the commands that are supported by the CUPS command file filter for this device. The command names are separated by whitespace.

Example:

*% Specify the list of commands we support
*cupsCommands: "AutoConfigure Clean PrintSelfTestPage ReportLevels com.vendor.foo"

CUPS 1.3/macOS 10.5cupsEvenDuplex

*cupsEvenDuplex: boolean

This boolean keyword notifies the RIP filters that the destination printer requires an even number of pages when 2-sided printing is selected. The default value is false.

Example:

*% Always send an even number of pages when duplexing
*cupsEvenDuplex: true

cupsFax

*cupsFax: boolean

This boolean keyword specifies whether the PPD defines a facsimile device. The default is false.

Examples:

*cupsFax: true

cupsFilter

*cupsFilter: "source/type cost program"

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified.

Examples:

*% Standard raster printer driver filter
*cupsFilter: "application/vnd.cups-raster 100 rastertofoo"

*% Plain text filter
*cupsFilter: "text/plain 10 texttofoo"

*% Pass-through filter for PostScript printers
*cupsFilter: "application/vnd.cups-postscript 0 -"

CUPS 1.5cupsFilter2

*cupsFilter2: "source/type destination/type cost program"

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified. The destination type is automatically created as needed and is passed to the filters and backend as the FINAL_CONTENT_TYPE value.

Note:

The presence of a single cupsFilter2 keyword in the PPD file will hide any cupsFilter keywords from the CUPS scheduler. When using cupsFilter2 to provide filters specific for CUPS 1.5 and later, provide a cupsFilter2 line for every filter and a cupsFilter line for each filter that is compatible with older versions of CUPS.

Examples:

*% Standard raster printer driver filter
*cupsFilter2: "application/vnd.cups-raster application/vnd.foo 100 rastertofoo"

*% Plain text filter
*cupsFilter2: "text/plain application/vnd.foo 10 texttofoo"

*% Pass-through filter for PostScript printers
*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"

CUPS 2.3cupsFinishingTemplate

*cupsFinishingTemplate name/text: ""

This option keyword specifies a finishing template (preset) that applies zero or more finishing processes to a job. Unlike cupsIPPFinishings, only one template can be selected by the user. PPD files also generally apply a constraint between this option and other finishing options like Booklet, FoldType, PunchMedia, and StapleWhen.

Examples:

*cupsFinishingTemplate none/None: ""
*cupsFinishingTemplate fold/Letter Fold: ""
*cupsFinishingTemplate punch/2/3-Hole Punch: ""
*cupsFinishingTemplate staple/Corner Staple: ""
*cupsFinishingTemplate staple-dual/Double Staple: ""
*cupsFinishingTemplate staple-and-fold/Corner Staple and Letter Fold: ""
*cupsFinishingTemplate staple-and-punch/Corner Staple and 2/3-Hole Punch: ""

DeprecatedcupsFlipDuplex

*cupsFlipDuplex: boolean

Due to implementation differences between macOS and Ghostscript, the cupsFlipDuplex keyword is deprecated. Instead, use the cupsBackSide keyword to specify the coordinate system (pixel layout) of the page data on the back side of duplex pages.

The value true maps to a cupsBackSide value of Rotated on macOS and Flipped with Ghostscript.

The default value is false.

Note:

macOS drivers that previously used cupsFlipDuplex may wish to provide both the old and new keywords for maximum compatibility, for example:

*cupsBackSide: Rotated
*cupsFlipDuplex: true

Similarly, drivers written for other operating systems using Ghostscript can use:

*cupsBackSide: Flipped
*cupsFlipDuplex: true

CUPS 1.3/macOS 10.5cupsIPPFinishings

*cupsIPPFinishings number/text: "*Option Choice ..."

This keyword defines a mapping from IPP finishings values to PPD options and choices.

Examples:

*cupsIPPFinishings 4/staple: "*StapleLocation SinglePortrait"
*cupsIPPFinishings 5/punch: "*PunchMedia Yes *PunchLocation LeftSide"
*cupsIPPFinishings 20/staple-top-left: "*StapleLocation SinglePortrait"
*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"

CUPS 1.3/macOS 10.5cupsIPPReason

*cupsIPPReason reason/Reason Text: "optional URIs"

This optional keyword maps custom printer-state-reasons keywords that are generated by the driver to human readable text. The optional URIs string contains zero or more URIs separated by a newline. Each URI can be a CUPS server absolute path to a help file under the scheduler's DocumentRoot directory, a full HTTP URL ("http://www.domain.com/path/to/help/page.html"), or any other valid URI which directs the user at additional information concerning the condition that is being reported.

Since the reason text is limited to 80 characters by the PPD specification, longer text strings can be included by URI-encoding the text with the "text" scheme, for example "text:some%20text". Multiple text URIs are combined by the ppdLocalizeIPPReason into a single string that can be displayed to the user.

Examples:

*% Map com.vendor-error to text but no page
*cupsIPPReason com.vendor-error/A serious error occurred: ""

*% Map com.vendor-error to more than 80 characters of text but no page
*cupsIPPReason com.vendor-error/A serious error occurred: "text:Now%20is%20the%20time
text:for%20all%20good%20men%20to%20come%20to%20the%20aid%20of%20their%20country."

*% Map com.vendor-error to text and a local page
*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"

*% Map com.vendor-error to text and a remote page
*cupsIPPReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"

*% Map com.vendor-error to text and a local, Apple help book, and remote page
*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html
help:anchor='com.vendor-error'%20bookID=Vendor%20Help
http://www.vendor.com/help"
*End

CUPS 1.5cupsIPPSupplies

*cupsIPPSupplies: boolean

This keyword tells the IPP backend whether it should report the current marker-xxx supply attribute values. The default value is True.

Example:

*% Do not use IPP marker-xxx attributes to report supply levels
*cupsIPPSupplies: False

CUPS 1.7/macOS 10.9cupsJobAccountId

*cupsJobAccountId: boolean

This keyword defines whether the printer accepts the job-account-id IPP attribute.

Example:

*% Specify the printer accepts the job-account-id IPP attribute.
*cupsJobAccountId: True

CUPS 1.7/macOS 10.9cupsJobAccountingUserId

*cupsJobAccountingUserId: boolean

This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.

Example:

*% Specify the printer accepts the job-accounting-user-id IPP attribute.
*cupsJobAccountingUserId: True

CUPS 1.7/macOS 10.9cupsJobPassword

*cupsJobPassword: "format"

This keyword defines the format of the "job-password" IPP attribute, if supported by the printer. The following format characters are supported:

  • 1: US ASCII digits.
  • A: US ASCII letters.
  • C: US ASCII letters, numbers, and punctuation.
  • .: Any US ASCII printable character (0x20 to 0x7e).
  • N: Any Unicode digit character.
  • U: Any Unicode letter character.
  • *: Any Unicode (utf-8) character.

The format characters are repeated to indicate the length of the password string. For example, "1111" indicated a 4-digit US ASCII PIN code.

Example:

*% Specify the printer supports 4-digit PIN codes.
*cupsJobPassword: "1111"

CUPS 1.2/macOS 10.5cupsLanguages

*cupsLanguages: "locale list"

This keyword describes which language localizations are included in the PPD. The "locale list" string is a space-delimited list of locale names ("en", "en_US", "fr_CA", etc.)

Example:

*% Specify Canadian, UK, and US English, and Canadian and French French
*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"

CUPS 1.7/macOS 10.9cupsMandatory

*cupsMandatory: "attribute1 attribute2 ... attributeN"

This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.

Example:

*% Specify that the user must supply a job-password
*cupsMandatory: "job-password job-password-encryption"

cupsManualCopies

*cupsManualCopies: boolean

This boolean keyword notifies the RIP filters that the destination printer does not support copy generation in hardware. The default value is false.

Example:

*% Tell the RIP filters to generate the copies for us
*cupsManualCopies: true

CUPS 1.4/macOS 10.6cupsMarkerName

*cupsMarkerName/Name Text: ""

This optional keyword maps marker-names strings that are generated by the driver to human readable text.

Examples:

*% Map cyanToner to "Cyan Toner"
*cupsMarkerName cyanToner/Cyan Toner: ""

CUPS 1.4/macOS 10.6cupsMarkerNotice

*cupsMarkerNotice: "disclaimer text"

This optional keyword provides disclaimer text for the supply level information provided by the driver, typically something like "supply levels are approximate".

Examples:

*cupsMarkerNotice: "Supply levels are approximate."

CUPS 1.6/macOS 10.8cupsMaxCopies

*cupsMaxCopies: integer

This integer keyword notifies the filters that the destination printer supports up to N copies in hardware. The default value is 9999.

Example:

*% Tell the RIP filters we can do up to 99 copies
*cupsMaxCopies: 99

cupsModelNumber

*cupsModelNumber: number

This integer keyword specifies a printer-specific model number. This number can be used by a filter program to adjust the output for a specific model of printer.

Example:

*% Specify an integer for a driver-specific model number
*cupsModelNumber: 1234

CUPS 1.3/macOS 10.5cupsPJLCharset

*cupsPJLCharset: "ISO character set name"

This string keyword specifies the character set that is used for strings in PJL commands. If not specified, US-ASCII is assumed.

Example:

*% Specify UTF-8 is used in PJL strings
*cupsPJLCharset: "UTF-8"

CUPS 1.4/macOS 10.6cupsPJLDisplay

*cupsPJLDisplay: "what"

This optional keyword specifies which command is used to display the job ID, name, and user on the printer's control panel. "What" is either "none" to disable this functionality, "job" to use "@PJL JOB DISPLAY", or "rdymsg" to use "@PJL RDYMSG DISPLAY". The default is "job".

Examples:

*% Display job information using @PJL SET RDYMSG DISPLAY="foo"
*cupsPJLDisplay: "rdymsg"

*% Display job information display
*cupsPJLDisplay: "none"

CUPS 1.2/macOS 10.5cupsPortMonitor

*cupsPortMonitor urischeme/Descriptive Text: "port monitor"

This string keyword specifies printer-specific "port monitor" filters that may be used with the printer. The CUPS scheduler also looks for the Protocols keyword to see if the BCP or TBCP protocols are supported. If so, the corresponding port monitor ("bcp" and "tbcp", respectively) is listed in the printer's port-monitor-supported keyword.

The "urischeme" portion of the keyword specifies the URI scheme that this port monitor should be used for. Typically this is used to pre-select a particular port monitor for each type of connection that is supported by the printer. The "port monitor" string can be "none" to disable the port monitor for the given URI scheme.

Examples:

*% Specify a PostScript printer that supports the TBCP protocol
*Protocols: TBCP PJL

*% Specify that TBCP should be used for socket connections but not USB
*cupsPortMonitor socket/AppSocket Printing: "tbcp"
*cupsPortMonitor usb/USB Printing: "none"

*% Specify a printer-specific port monitor for an Epson USB printer
*cupsPortMonitor usb/USB Status Monitor: "epson-usb"

CUPS 1.3/macOS 10.5cupsPreFilter

*cupsPreFilter: "source/type cost program"

This string keyword provides a pre-filter rule. The pre-filter program will be inserted in the conversion chain immediately before the filter that accepts the given MIME type.

Examples:

*% PDF pre-filter
*cupsPreFilter: "application/pdf 100 mypdfprefilter"

*% PNG pre-filter
*cupsPreFilter: "image/png 0 mypngprefilter"

CUPS 1.5cupsPrintQuality

*cupsPrintQuality keyword/text: "code"

This UI keyword defines standard print qualities that directly map from the IPP "print-quality" job template keyword. Standard keyword values are "Draft", "Normal", and "High" which are mapped from the IPP "print-quality" values 3, 4, and 5 respectively. Each cupsPrintQuality option typically sets output mode and resolution parameters in the page device dictionary, eliminating the need for separate (and sometimes confusing) output mode and resolution options.

Note:

Unlike all of the other keywords defined in this document, cupsPrintQuality is a UI keyword that MUST be enclosed inside the PPD OpenUI and CloseUI keywords.

Examples:

*OpenUI *cupsPrintQuality/Print Quality: PickOne
*OrderDependency: 10 AnySetup *cupsPrintQuality
*DefaultcupsPrintQuality: Normal
*cupsPrintQuality Draft/Draft: "code"
*cupsPrintQuality Normal/Normal: "code"
*cupsPrintQuality High/Photo: "code"
*CloseUI: *cupsPrintQuality

CUPS 1.5cupsSingleFile

*cupsSingleFile: Boolean

This boolean keyword tells the scheduler whether to print multiple files in a job together or singly. The default is "False" which uses a single instance of the backend for all files in the print job. Setting this keyword to "True" will result in separate instances of the backend for each file in the print job.

Examples:

*% Send all print data to a single backend
*cupsSingleFile: False

*% Send each file using a separate backend
*cupsSingleFile: True

CUPS 1.4/macOS 10.6cupsSNMPSupplies

*cupsSNMPSupplies: boolean

This keyword tells the standard network backends whether they should query the standard SNMP Printer MIB OIDs for supply levels. The default value is True.

Example:

*% Do not use SNMP queries to report supply levels
*cupsSNMPSupplies: False

cupsVersion

*cupsVersion: major.minor

This required keyword describes which version of the CUPS PPD file extensions was used. Currently it must be the string "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", or "1.6".

Example:

*% Specify a CUPS 1.2 driver
*cupsVersion: "1.2"

CUPS 1.6/macOS 10.8JCLToPDFInterpreter

*JCLToPDFInterpreter: "JCL"

This keyword provides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the JCLBegin value and any commands for JCL options in the PPD file.

Example:

*% PJL command to start the PDF interpreter
*JCLToPDFInterpreter: "@PJL ENTER LANGUAGE = PDF<0A>"

macOS Attributes

DeprecatedAPDialogExtension

*APDialogExtension: "/Library/Printers/vendor/filename.plugin"

This keyword defines additional option panes that are displayed in the print dialog. Each keyword adds one or more option panes. See the "OutputBinsPDE" example and Apple Technical Q&A QA1352 for information on writing your own print dialog plug-ins.

Note:

Since 2010, AirPrint has enabled the printing of full quality photos and documents from the Mac without requiring driver software. Starting with macOS 10.12, system level security features prevent print dialog plug-ins from being loaded into applications that have enabled the library validation security feature. As of macOS 10.14 the APDialogExtension attribute used to create macOS print drivers is deprecated. All new printer models should support AirPrint moving forward.

Examples:

*% Add two panes for finishing and driver options
*APDialogExtension: "/Library/Printers/vendor/finishing.plugin"
*APDialogExtension: "/Library/Printers/vendor/options.plugin"

macOS 10.4APDuplexRequiresFlippedMargin

*APDuplexRequiresFlippedMargin: boolean

This boolean keyword notifies the RIP filters that the destination printer requires the top and bottom margins of the ImageableArea to be swapped for the back page. The default is true when cupsBackSide is Flipped and false otherwise. Table 2 shows how APDuplexRequiresFlippedMargin interacts with cupsBackSide and the Tumble page attribute.

Table 2: Margin Flipping Modes
APDuplexRequiresFlippedMargin cupsBackSide Tumble Value Margins
false any any Normal
any Normal any Normal
true ManualDuplex false Normal
true ManualDuplex true Flipped
true Rotated false Flipped
true Rotated true Normal
true or unspecified Flipped any Flipped

Example:

*% Rotate the back side images
*cupsBackSide: Rotated

*% Don't swap the top and bottom margins for the back side
*APDuplexRequiresFlippedMargin: false

Also see the related cupsBackSide keyword.

APHelpBook

*APHelpBook: "bundle URL"

This string keyword specifies the Apple help book bundle to use when looking up IPP reason codes for this printer driver. The cupsIPPReason keyword maps "help" URIs to this file.

Example:

*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"

macOS 10.6APICADriver

*APICADriver: boolean

This keyword specifies whether the device has a matching Image Capture Architecture (ICA) driver for scanning. The default is False.

Examples:

*APICADriver: True
*APScanAppBundleID: "com.apple.ImageCaptureApp"

macOS 10.3APPrinterIconPath

*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"

This keyword defines the location of a printer icon file to use when displaying the printer. The file must be in the Apple icon format.

Examples:

*% Apple icon file
*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"

macOS 10.4APPrinterLowInkTool

*APPrinterLowInkTool: "/Library/Printers/vendor/program"

This keyword defines an program that checks the ink/toner/marker levels on a printer, returning an XML document with those levels. See the "InkTool" example and Apple Technical Note TN2144 for more information.

Examples:

*% Use a vendor monitoring program
*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"

macOS 10.5APPrinterPreset

*APPrinterPreset name/text: "*Option Choice ..."

This keyword defines presets for multiple options that show up in the print dialog of applications (such as iPhoto) that set the job style hint to NSPrintPhotoJobStyleHint. Each preset maps to one or more pairs of PPD options and choices as well as providing key/value data for the application. The following standard preset names are currently defined:

  • General_with_Paper_Auto-Detect; Normal quality general printing with auto-detected media.
  • General_with_Paper_Auto-Detect_-_Draft; Draft quality general printing with auto-detected media.
  • General_on_Plain_Paper; Normal quality general printing on plain paper.
  • General_on_Plain_Paper_-_Draft; Draft quality general printing on plain paper.
  • Photo_with_Paper_Auto-Detect; Normal quality photo printing with auto-detected media.
  • Photo_with_Paper_Auto-Detect_-_Fine; High quality photo printing with auto-detected media.
  • Photo_on_Plain_Paper; Normal quality photo printing on plain paper.
  • Photo_on_Plain_Paper_-_Fine; High quality photo printing on plain paper.
  • Photo_on_Photo_Paper; Normal quality photo printing on glossy photo paper.
  • Photo_on_Photo_Paper_-_Fine; High quality photo printing on glossy photo paper.
  • Photo_on_Matte_Paper; Normal quality photo printing on matte paper.
  • Photo_on_Matte_Paper_-_Fine; High quality photo printing on matte paper.

The value string consists of pairs of keywords, either an option name and choice (*MainKeyword OptionKeyword) or a preset identifier and value (com.apple.print.preset.foo value). The following preset identifiers are currently used:

  • com.apple.print.preset.graphicsType; specifies the type of printing used for this printing - "General" for general purpose printing and "Photo" for photo printing.
  • com.apple.print.preset.media-front-coating; specifies the media type selected by this preset - "none" (plain paper), "glossy", "high-gloss", "semi-gloss", "satin", "matte", and "autodetect".
  • com.apple.print.preset.output-mode; specifies the output mode for this preset - "color" (default for color printers) or "monochrome" (grayscale, default for B&W printers).
  • com.apple.print.preset.quality; specifies the overall print quality selected by this preset - "low" (draft), "mid" (normal), or "high".

Presets, like options, can also be localized in multiple languages.

Examples:

*APPrinterPreset Photo_on_Photo_Paper/Photo on Photo Paper: "
  *MediaType Glossy
  *ColorModel RGB
  *Resolution 300dpi
  com.apple.print.preset.graphicsType Photo
  com.apple.print.preset.quality mid
  com.apple.print.preset.media-front-coating glossy"
*End
*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""

macOS 10.3APPrinterUtilityPath

*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"

This keyword defines a GUI application that can be used to do printer maintenance functions such as cleaning the print head(s). See ... for more information.

Examples:

*% Define the printer utility application
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"

macOS 10.6APScannerOnly

*APScannerOnly: boolean

This keyword specifies whether the device has scanning but no printing capabilities. The default is False.

Examples:

*APICADriver: True
*APScannerOnly: True

macOS 10.3APScanAppBundleID

*APScanAppBundleID: "bundle ID"

This keyword defines the application to use when scanning pages from the device.

Examples:

*APICADriver: True
*APScanAppBundleID: "com.apple.ImageCaptureApp"

Change History

Changes in CUPS 2.3

Changes in CUPS 1.7

Changes in CUPS 1.6

Changes in CUPS 1.5

  • Changes all instances of PPD attributes to PPD keywords, to be consistent with the parent specification from Adobe.

Changes in CUPS 1.4.5

Changes in CUPS 1.4

Changes in CUPS 1.3.1

  • Added missing macOS AP keywords.
  • Added section on auto-configuration including the OIDMainKeyword and ?MainKeyword keywords.
  • Minor reorganization.

Changes in CUPS 1.3

Changes in CUPS 1.2.8

  • Added section on supported PostScript commands for raster drivers

Changes in CUPS 1.2

Changes in CUPS 1.1

cups-2.3.1/filter/rastertoepson.c000664 000765 000024 00000057716 13574721672 017160 0ustar00mikestaff000000 000000 /* * EPSON ESC/P and ESC/P2 filter for CUPS. * * Copyright 2007-2018 by Apple Inc. * Copyright 1993-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include #include /* * Model numbers... */ #define EPSON_9PIN 0 #define EPSON_24PIN 1 #define EPSON_COLOR 2 #define EPSON_PHOTO 3 #define EPSON_ICOLOR 4 #define EPSON_IPHOTO 5 /* * Macros... */ #define pwrite(s,n) fwrite((s), 1, (n), stdout) /* * Globals... */ unsigned char *Planes[6], /* Output buffers */ *CompBuffer, /* Compression buffer */ *LineBuffers[2]; /* Line bitmap buffers */ int Model, /* Model number */ EjectPage, /* Eject the page when done? */ Shingling, /* Shingle output? */ Canceled; /* Has the current job been canceled? */ unsigned NumPlanes, /* Number of color planes */ Feed, /* Number of lines to skip */ DotBit, /* Bit in buffers */ DotBytes, /* # bytes in a dot column */ DotColumns, /* # columns in 1/60 inch */ LineCount, /* # of lines processed */ EvenOffset, /* Offset into 'even' buffers */ OddOffset; /* Offset into 'odd' buffers */ /* * Prototypes... */ void Setup(void); void StartPage(const ppd_file_t *ppd, const cups_page_header2_t *header); void EndPage(const cups_page_header2_t *header); void Shutdown(void); void CancelJob(int sig); void CompressData(const unsigned char *line, unsigned length, unsigned plane, unsigned type, unsigned xstep, unsigned ystep); void OutputLine(const cups_page_header2_t *header); void OutputRows(const cups_page_header2_t *header, int row); /* * 'Setup()' - Prepare the printer for printing. */ void Setup(void) { const char *device_uri; /* The device for the printer... */ /* * EPSON USB printers need an additional command issued at the * beginning of each job to exit from "packet" mode... */ if ((device_uri = getenv("DEVICE_URI")) != NULL && strncmp(device_uri, "usb:", 4) == 0 && Model >= EPSON_ICOLOR) pwrite("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); } /* * 'StartPage()' - Start a page of graphics. */ void StartPage( const ppd_file_t *ppd, /* I - PPD file */ const cups_page_header2_t *header) /* I - Page header */ { int n, t; /* Numbers */ unsigned plane; /* Looping var */ /* * Show page device dictionary... */ fprintf(stderr, "DEBUG: StartPage...\n"); fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]); fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]); fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]); fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); /* * Send a reset sequence. */ if (ppd && ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL) printf("\033{A"); /* Set EPSON emulation mode */ printf("\033@"); /* * See which type of printer we are using... */ switch (Model) { case EPSON_9PIN : case EPSON_24PIN : printf("\033P\022"); /* Set 10 CPI */ if (header->HWResolution[0] == 360 || header->HWResolution[0] == 240) { printf("\033x1"); /* LQ printing */ printf("\033U1"); /* Unidirectional */ } else { printf("\033x0"); /* Draft printing */ printf("\033U0"); /* Bidirectional */ } printf("\033l%c\033Q%c", 0, /* Side margins */ (int)(10.0 * header->PageSize[0] / 72.0 + 0.5)); printf("\033\062\033C%c", /* Page length in 1/6th inches */ (int)(header->PageSize[1] / 12.0 + 0.5)); printf("\033N%c", 0); /* Bottom margin */ printf("\033O"); /* No perforation skip */ /* * Setup various buffer limits... */ DotBytes = header->cupsRowCount / 8; DotColumns = header->HWResolution[0] / 60; Shingling = 0; if (Model == EPSON_9PIN) printf("\033\063\030"); /* Set line feed */ else switch (header->HWResolution[0]) { case 60: case 120 : case 240 : printf("\033\063\030"); /* Set line feed */ break; case 180 : case 360 : Shingling = 1; if (header->HWResolution[1] == 180) printf("\033\063\010");/* Set line feed */ else printf("\033+\010"); /* Set line feed */ break; } break; default : /* * Set graphics mode... */ pwrite("\033(G\001\000\001", 6); /* Graphics mode */ /* * Set the media size... */ if (Model < EPSON_ICOLOR) { pwrite("\033(U\001\000", 5); /* Resolution/units */ putchar((int)(3600 / header->HWResolution[1])); } else { pwrite("\033(U\005\000", 5); putchar((int)(1440 / header->HWResolution[1])); putchar((int)(1440 / header->HWResolution[1])); putchar((int)(1440 / header->HWResolution[0])); putchar(0xa0); /* n/1440ths... */ putchar(0x05); } n = (int)(header->PageSize[1] * header->HWResolution[1] / 72.0); pwrite("\033(C\002\000", 5); /* Page length */ putchar(n); putchar(n >> 8); if (ppd) t = (int)((ppd->sizes[1].length - ppd->sizes[1].top) * header->HWResolution[1] / 72.0); else t = 0; pwrite("\033(c\004\000", 5); /* Top & bottom margins */ putchar(t); putchar(t >> 8); putchar(n); putchar(n >> 8); if (header->HWResolution[1] == 720) { pwrite("\033(i\001\000\001", 6); /* Microweave */ pwrite("\033(e\002\000\000\001", 7); /* Small dots */ } pwrite("\033(V\002\000\000\000", 7); /* Set absolute position 0 */ DotBytes = 0; DotColumns = 0; Shingling = 0; break; } /* * Set other stuff... */ if (header->cupsColorSpace == CUPS_CSPACE_CMY) NumPlanes = 3; else if (header->cupsColorSpace == CUPS_CSPACE_KCMY) NumPlanes = 4; else if (header->cupsColorSpace == CUPS_CSPACE_KCMYcm) NumPlanes = 6; else NumPlanes = 1; Feed = 0; /* No blank lines yet */ /* * Allocate memory for a line/row of graphics... */ if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL) { fputs("ERROR: Unable to allocate memory\n", stderr); exit(1); } for (plane = 1; plane < NumPlanes; plane ++) Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes; if (header->cupsCompression || DotBytes) { if ((CompBuffer = calloc(2, header->cupsWidth + 1)) == NULL) { fputs("ERROR: Unable to allocate memory\n", stderr); exit(1); } } else CompBuffer = NULL; if (DotBytes) { if ((LineBuffers[0] = calloc((size_t)DotBytes, (header->cupsWidth + 7) * (size_t)(Shingling + 1))) == NULL) { fputs("ERROR: Unable to allocate memory\n", stderr); exit(1); } LineBuffers[1] = LineBuffers[0] + DotBytes * header->cupsWidth; DotBit = 128; LineCount = 0; EvenOffset = 0; OddOffset = 0; } } /* * 'EndPage()' - Finish a page of graphics. */ void EndPage( const cups_page_header2_t *header) /* I - Page header */ { if (DotBytes && header) { /* * Flush remaining graphics as needed... */ if (!Shingling) { if (DotBit < 128 || EvenOffset) OutputRows(header, 0); } else if (OddOffset > EvenOffset) { OutputRows(header, 1); OutputRows(header, 0); } else { OutputRows(header, 0); OutputRows(header, 1); } } /* * Eject the current page... */ putchar(12); /* Form feed */ fflush(stdout); /* * Free memory... */ free(Planes[0]); if (CompBuffer) free(CompBuffer); if (DotBytes) free(LineBuffers[0]); } /* * 'Shutdown()' - Shutdown the printer. */ void Shutdown(void) { /* * Send a reset sequence. */ printf("\033@"); } /* * 'CancelJob()' - Cancel the current job... */ void CancelJob(int sig) /* I - Signal */ { (void)sig; Canceled = 1; } /* * 'CompressData()' - Compress a line of graphics. */ void CompressData(const unsigned char *line, /* I - Data to compress */ unsigned length,/* I - Number of bytes */ unsigned plane, /* I - Color plane */ unsigned type, /* I - Type of compression */ unsigned xstep, /* I - X resolution */ unsigned ystep) /* I - Y resolution */ { const unsigned char *line_ptr, /* Current byte pointer */ *line_end, /* End-of-line byte pointer */ *start; /* Start of compression sequence */ unsigned char *comp_ptr, /* Pointer into compression buffer */ temp; /* Current byte */ int count; /* Count of bytes for output */ static int ctable[6] = { 0, 2, 1, 4, 18, 17 }; /* KCMYcm color values */ /* * Setup pointers... */ line_ptr = line; line_end = line + length; /* * Do depletion for 720 DPI printing... */ if (ystep == 5) { for (comp_ptr = (unsigned char *)line; comp_ptr < line_end;) { /* * Grab the current byte... */ temp = *comp_ptr; /* * Check adjacent bits... */ if ((temp & 0xc0) == 0xc0) temp &= 0xbf; if ((temp & 0x60) == 0x60) temp &= 0xdf; if ((temp & 0x30) == 0x30) temp &= 0xef; if ((temp & 0x18) == 0x18) temp &= 0xf7; if ((temp & 0x0c) == 0x0c) temp &= 0xfb; if ((temp & 0x06) == 0x06) temp &= 0xfd; if ((temp & 0x03) == 0x03) temp &= 0xfe; *comp_ptr++ = temp; /* * Check the last bit in the current byte and the first bit in the * next byte... */ if ((temp & 0x01) && comp_ptr < line_end && *comp_ptr & 0x80) *comp_ptr &= 0x7f; } } switch (type) { case 0 : /* * Do no compression... */ break; case 1 : /* * Do TIFF pack-bits encoding... */ comp_ptr = CompBuffer; while (line_ptr < line_end) { if ((line_ptr + 1) >= line_end) { /* * Single byte on the end... */ *comp_ptr++ = 0x00; *comp_ptr++ = *line_ptr++; } else if (line_ptr[0] == line_ptr[1]) { /* * Repeated sequence... */ line_ptr ++; count = 2; while (line_ptr < (line_end - 1) && line_ptr[0] == line_ptr[1] && count < 127) { line_ptr ++; count ++; } *comp_ptr++ = (unsigned char)(257 - count); *comp_ptr++ = *line_ptr++; } else { /* * Non-repeated sequence... */ start = line_ptr; line_ptr ++; count = 1; while (line_ptr < (line_end - 1) && line_ptr[0] != line_ptr[1] && count < 127) { line_ptr ++; count ++; } *comp_ptr++ = (unsigned char)(count - 1); memcpy(comp_ptr, start, (size_t)count); comp_ptr += count; } } line_ptr = CompBuffer; line_end = comp_ptr; break; } putchar(0x0d); /* Move print head to left margin */ if (Model < EPSON_ICOLOR) { /* * Do graphics the "old" way... */ if (NumPlanes > 1) { /* * Set the color... */ if (plane > 3) printf("\033(r%c%c%c%c", 2, 0, 1, ctable[plane] & 15); /* Set extended color */ else if (NumPlanes == 3) printf("\033r%c", ctable[plane + 1]); /* Set color */ else printf("\033r%c", ctable[plane]); /* Set color */ } /* * Send a raster plane... */ length *= 8; printf("\033."); /* Raster graphics */ putchar((int)type); putchar((int)ystep); putchar((int)xstep); putchar(1); putchar((int)length); putchar((int)(length >> 8)); } else { /* * Do graphics the "new" way... */ printf("\033i"); putchar(ctable[plane]); putchar((int)type); putchar(1); putchar((int)length); putchar((int)(length >> 8)); putchar(1); putchar(0); } pwrite(line_ptr, (size_t)(line_end - line_ptr)); fflush(stdout); } /* * 'OutputLine()' - Output a line of graphics. */ void OutputLine( const cups_page_header2_t *header) /* I - Page header */ { if (header->cupsRowCount) { unsigned width; unsigned char *tempptr, *evenptr, *oddptr; unsigned int x; unsigned char bit; const unsigned char *pixel; unsigned char *temp; /* * Collect bitmap data in the line buffers and write after each buffer. */ for (x = header->cupsWidth, bit = 128, pixel = Planes[0], temp = CompBuffer; x > 0; x --, temp ++) { if (*pixel & bit) *temp |= DotBit; if (bit > 1) bit >>= 1; else { bit = 128; pixel ++; } } if (DotBit > 1) DotBit >>= 1; else { /* * Copy the holding buffer to the output buffer, shingling as necessary... */ if (Shingling && LineCount != 0) { /* * Shingle the output... */ if (LineCount & 1) { evenptr = LineBuffers[1] + OddOffset; oddptr = LineBuffers[0] + EvenOffset + DotBytes; } else { evenptr = LineBuffers[0] + EvenOffset; oddptr = LineBuffers[1] + OddOffset + DotBytes; } for (width = header->cupsWidth, tempptr = CompBuffer; width > 1; width -= 2, tempptr += 2, oddptr += DotBytes * 2, evenptr += DotBytes * 2) { evenptr[0] = tempptr[0]; oddptr[0] = tempptr[1]; } if (width == 1) { evenptr[0] = tempptr[0]; oddptr[0] = tempptr[1]; } } else { /* * Don't shingle the output... */ for (width = header->cupsWidth, tempptr = CompBuffer, evenptr = LineBuffers[0] + EvenOffset; width > 0; width --, tempptr ++, evenptr += DotBytes) *evenptr = tempptr[0]; } if (Shingling && LineCount != 0) { EvenOffset ++; OddOffset ++; if (EvenOffset == DotBytes) { EvenOffset = 0; OutputRows(header, 0); } if (OddOffset == DotBytes) { OddOffset = 0; OutputRows(header, 1); } } else { EvenOffset ++; if (EvenOffset == DotBytes) { EvenOffset = 0; OutputRows(header, 0); } } DotBit = 128; LineCount ++; memset(CompBuffer, 0, header->cupsWidth); } } else { unsigned plane; /* Current plane */ unsigned bytes; /* Bytes per plane */ unsigned xstep, ystep; /* X & Y resolutions */ /* * Write a single line of bitmap data as needed... */ xstep = 3600 / header->HWResolution[0]; ystep = 3600 / header->HWResolution[1]; bytes = header->cupsBytesPerLine / NumPlanes; for (plane = 0; plane < NumPlanes; plane ++) { /* * Skip blank data... */ if (!Planes[plane][0] && memcmp(Planes[plane], Planes[plane] + 1, (size_t)bytes - 1) == 0) continue; /* * Output whitespace as needed... */ if (Feed > 0) { pwrite("\033(v\002\000", 5); /* Relative vertical position */ putchar((int)Feed); putchar((int)(Feed >> 8)); Feed = 0; } CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep, ystep); } Feed ++; } } /* * 'OutputRows()' - Output 8, 24, or 48 rows. */ void OutputRows( const cups_page_header2_t *header, /* I - Page image header */ int row) /* I - Row number (0 or 1) */ { unsigned i, n, /* Looping vars */ dot_count, /* Number of bytes to print */ dot_min; /* Minimum number of bytes */ unsigned char *dot_ptr, /* Pointer to print data */ *ptr; /* Current data */ dot_min = DotBytes * DotColumns; if (LineBuffers[row][0] != 0 || memcmp(LineBuffers[row], LineBuffers[row] + 1, header->cupsWidth * DotBytes - 1)) { /* * Skip leading space... */ i = 0; dot_count = header->cupsWidth * DotBytes; dot_ptr = LineBuffers[row]; while (dot_count >= dot_min && dot_ptr[0] == 0 && memcmp(dot_ptr, dot_ptr + 1, dot_min - 1) == 0) { i ++; dot_ptr += dot_min; dot_count -= dot_min; } /* * Skip trailing space... */ while (dot_count >= dot_min && dot_ptr[dot_count - dot_min] == 0 && memcmp(dot_ptr + dot_count - dot_min, dot_ptr + dot_count - dot_min + 1, dot_min - 1) == 0) dot_count -= dot_min; /* * Position print head for printing... */ if (i == 0) putchar('\r'); else { putchar(0x1b); putchar('$'); putchar((int)(i & 255)); putchar((int)(i >> 8)); } /* * Start bitmap graphics for this line... */ printf("\033*"); /* Select bit image */ switch (header->HWResolution[0]) { case 60 : /* 60x60/72 DPI gfx */ putchar(0); break; case 120 : /* 120x60/72 DPI gfx */ putchar(1); break; case 180 : /* 180 DPI gfx */ putchar(39); break; case 240 : /* 240x72 DPI gfx */ putchar(3); break; case 360 : /* 360x180/360 DPI gfx */ if (header->HWResolution[1] == 180) { if (Shingling && LineCount != 0) putchar(40); /* 360x180 fast */ else putchar(41); /* 360x180 slow */ } else { if (Shingling && LineCount != 0) putchar(72); /* 360x360 fast */ else putchar(73); /* 360x360 slow */ } break; } n = dot_count / DotBytes; putchar((int)(n & 255)); putchar((int)(n / 256)); /* * Write the graphics data... */ if (header->HWResolution[0] == 120 || header->HWResolution[0] == 240) { /* * Need to interleave the dots to avoid hosing the print head... */ for (n = dot_count / 2, ptr = dot_ptr; n > 0; n --, ptr += 2) { putchar(*ptr); putchar(0); } if (dot_count & 1) putchar(*ptr); /* * Move the head back and print the odd bytes... */ if (i == 0) putchar('\r'); else { putchar(0x1b); putchar('$'); putchar((int)(i & 255)); putchar((int)(i >> 8)); } if (header->HWResolution[0] == 120) printf("\033*\001"); /* Select bit image */ else printf("\033*\003"); /* Select bit image */ n = (unsigned)dot_count / DotBytes; putchar((int)(n & 255)); putchar((int)(n / 256)); for (n = dot_count / 2, ptr = dot_ptr + 1; n > 0; n --, ptr += 2) { putchar(0); putchar(*ptr); } if (dot_count & 1) putchar(0); } else pwrite(dot_ptr, dot_count); } /* * Feed the paper... */ putchar('\n'); if (Shingling && row == 1) { if (header->HWResolution[1] == 360) printf("\n\n\n\n"); else printf("\n"); } fflush(stdout); /* * Clear the buffer... */ memset(LineBuffers[row], 0, header->cupsWidth * DotBytes); } /* * 'main()' - Main entry and processing of driver. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream for printing */ cups_page_header2_t header; /* Page header from file */ ppd_file_t *ppd; /* PPD file */ int page; /* Current page */ unsigned y; /* Current line */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* * Make sure status messages are not buffered... */ setbuf(stderr, NULL); /* * Check command-line... */ if (argc < 6 || argc > 7) { /* * We don't have the correct number of arguments; write an error message * and return. */ _cupsLangPrintFilter(stderr, "ERROR", _("%s job-id user title copies options [file]"), "rastertoepson"); return (1); } /* * Open the page stream... */ if (argc == 7) { if ((fd = open(argv[6], O_RDONLY)) == -1) { _cupsLangPrintError("ERROR", _("Unable to open raster file")); sleep(1); return (1); } } else fd = 0; ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* * Register a signal handler to eject the current page if the * job is cancelled. */ Canceled = 0; #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, CancelJob); #elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_handler = CancelJob; sigaction(SIGTERM, &action, NULL); #else signal(SIGTERM, CancelJob); #endif /* HAVE_SIGSET */ /* * Initialize the print device... */ ppd = ppdOpenFile(getenv("PPD")); if (!ppd) { ppd_status_t status; /* PPD error */ int linenum; /* Line number */ _cupsLangPrintFilter(stderr, "ERROR", _("The PPD file could not be opened.")); status = ppdLastError(&linenum); fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); return (1); } Model = ppd->model_number; Setup(); /* * Process pages as needed... */ page = 0; while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ if (Canceled) break; page ++; fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies); _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), page); /* * Start the page... */ StartPage(ppd, &header); /* * Loop for each line on the page... */ for (y = 0; y < header.cupsHeight; y ++) { /* * Let the user know how far we have progressed... */ if (Canceled) break; if ((y & 127) == 0) { _cupsLangPrintFilter(stderr, "INFO", _("Printing page %d, %u%% complete."), page, 100 * y / header.cupsHeight); fprintf(stderr, "ATTR: job-media-progress=%u\n", 100 * y / header.cupsHeight); } /* * Read a line of graphics... */ if (cupsRasterReadPixels(ras, Planes[0], header.cupsBytesPerLine) < 1) break; /* * Write it to the printer... */ OutputLine(&header); } /* * Eject the page... */ _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), page); EndPage(&header); if (Canceled) break; } /* * Shutdown the printer... */ Shutdown(); ppdClose(ppd); /* * Close the raster stream... */ cupsRasterClose(ras); if (fd != 0) close(fd); /* * If no pages were printed, send an error message... */ if (page == 0) { _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); return (1); } else return (0); } cups-2.3.1/filter/ppd-compiler.header000664 000765 000024 00000002373 13574721672 017636 0ustar00mikestaff000000 000000

Introduction to the PPD Compiler

This document describes how to use the CUPS PostScript Printer Description (PPD) file compiler. The PPD compiler generates PPD files from simple text files that describe the features and capabilities of one or more printers.

Note:

The PPD compiler and related tools are deprecated and will be removed in a future release of CUPS.

cups-2.3.1/doc/da/000775 000765 000024 00000000000 13574721672 013730 5ustar00mikestaff000000 000000 cups-2.3.1/doc/apple-touch-icon.png000664 000765 000024 00000005013 13574721672 017220 0ustar00mikestaff000000 000000 PNG  IHDR ߁(PLTE~~~}}}zzzxxxyyyvvvwwwuuuttttuusssrrrqqqpppooonnnmmmlllkkkjjjiiiggghhhfffeeedddbbbcccaaa```___^^^\\\]]][[[WWWXXXVVVUUUTTTSSSRRRPPPQQQNNNOOOLLLMMMKKKJJJHHHIIIGGGFFFDDDEEEϳZZZιCCCBBBYYY{{{ƺ񮮮|||޸Ž鲲ߪM8rIDATẋaEA.Ͻf0 Ev9Na GV1 c4vbG1ǘUpcVñX.%.$Xom|9$׿xD>^ |9;z^؟o۝<$x>/ϋK$wx4AOEq3? G" Re6 GBQEI|u]75`>, Hŏ%0# GCXp$X<jLH慇#J~Hz8ҙL:Ni$l6jpi,QcT GIUupT,AVz8 XGjVp;hC[c 1 BWp/cc:My8Bz8eZ^7*vݱg؋*jX{Η`[)3񘙙2Tffff$r.n_SFUKg^R[Vk]x+ϙo={ \߰C_sFsK3;بwmgg7~|Fa G+$!6F>ta NZ6x);!9n=IQ,Ǧ8}eǠ4[tq{*_p%<#\NjS5?} (U}!wO$SZG+m3=< *M׋VU%Mq;a{N "5vVďv +vJLFW GEI:u ;?Y%W`ɖ{)"VW%ÁOk~U:aO` ‚)&ryNK7-oE DžϢBvbbݑ-"rg2?,1U~TF1 t>k/$ݺt-ږf~%YEm.n)E2xd 8m7KpUf>,">ML Z. (B*;L'eXd:ɽ%]hQ:;Ry%-nye^\fg\/>c#+*c"2-/1h,ɒxm7G'Wp|@zdD9}s3^(L´pe΋LS x|C3ېQpd^pZ*EDZђ9ORݣ|ɴ% EO3?u/~^E^w}GwU^{2xհa}r'CZƿA4F@yMX/mK2HدxDI -=~_ƅ-_u+^o)3tX~m_H37/%bO^t;w^oEL aXP%mz~/C8OtDhz ^97u-:y|n)|f~卿MUAB. {-}rNZX +MX|\<\n?1ikz<2[< 1;:yKc7faZMq_>>{Sv `(bd$r:VoVoVo孫{{=V[}ooV[qo֯-----------'yNʜIENDB`cups-2.3.1/doc/cups.css000664 000765 000024 00000025524 13574721672 015040 0ustar00mikestaff000000 000000 /* Layout CSS */ .header { background: rgba(46,46,46,.9); box-shadow: 0px 2px 5px rgba(0,0,0,0.25); color: white; left: 0; margin-bottom: 20px; padding: 0px; position: fixed; right: 0; top: 0; width: 100%; } .header ul { list-style: none; margin: 0px; -webkit-margin-before: 0; -webkit-margin-after: 0; -webkit-margin-start: 0; -webkit-margin-end: 5px; -webkit-padding-start: 0; } .header ul li { float: left; } .header a { display: block; padding: 5px 10px !important; } .header a:link, .header a:visited { color: white !important; text-decoration: none !important; } .header a:hover { background: #cccccc !important; color: #333333 !important; text-decoration: none !important; } .header a.active { background: white !important; box-shadow: rgba(0,0,0,0.1) 0px 0px 10px 0px inset; color: black !important; text-decoration: none !important; } .body { padding: 40px 20px; } .row .body { padding: 0px; } .footer { background: rgba(46,46,46,.9); bottom: 0; box-shadow: 0px -2px 5px rgba(0,0,0,0.25); color: #cccccc; font-size: 10px; height: 20px; left: 0; padding: 10px 10px 3px; position: fixed; width: 100%; } .footer a:link, footer a:hover, .footer a:visited { color: white !important; text-decoration: none !important; } .row { width: 100%; *zoom: 1; } .row:after { clear: both; } .row .thirds { float: left; margin-left: 0.5%; margin-right: 0; padding-bottom: 40px; width: 33%; } .row .thirds:first-child { margin-left: 0; } .row .halves { float: left; margin-left: 0.5%; margin-right: 0; padding-bottom: 40px; width: 49.75%; } .row .halves:first-child { margin-left: 0; } .mobile { display: none; } .no-mobile { display: inherit; } /* Appearance CSS */ BODY { background: white; color: black; font-family: lucida grande, geneva, helvetica, arial, sans-serif; margin: 0; } H1, H2, H3, H4, H5, H6, P, TD, TH { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } H1 { font-size: 2em; } H2 { font-size: 1.75em; } H3 { font-size: 1.5em; } H4 { font-size: 1.25em; } KBD { color: #006600; font-family: monaco, courier, monospace; font-weight: bold; } PRE { font-family: monaco, courier, monospace; } BLOCKQUOTE { border-left: solid 2px #777; margin: 1em 0; padding: 10px; } BLOCKQUOTE OL LI { margin-left: -1em; } PRE.command, PRE.example { background: #eee; margin: 0 36pt; padding: 10px; } P.example { font-style: italic; margin-left: 36pt; } DL.man DD { margin-left: 5em; } DL.man DT { margin-left: 0; } PRE.man { margin: 0; } PRE.command EM, PRE.example EM { color: #3f0000; font-family: lucida grande, geneva, helvetica, arial, sans-serif; } P.command { color: #7f0000; font-family: monaco, courier, monospace; margin-left: 36pt; } P.formula { font-style: italic; margin-left: 36pt; } A IMG { border: none; } A:link:hover IMG { background: #f0f0f0; border-radius: 10px; -moz-border-radius: 10px; } A:link, A:visited { font-weight: inherit; text-decoration: none; color: #000099; } A:link:hover, A:visited:hover, A:active { text-decoration: underline; color: #990099; } TABLE.page { border: none; border-collapse: collapse; height: 100%; margin: 0; padding: 0; width: 100%; } TD.body { height: 100%; vertical-align: top; } TD.sel, TD.unsel { border-left: thin solid #cccccc; padding: 0px 5px; text-align: center; vertical-align: middle; width: 14%; } TD.sel { background: url(images/sel.gif); } TD.unsel { background: url(images/unsel.gif); } TD.sel A, TD.sel A:hover, TD.unsel A:link:hover, TD.unsel A:visited:hover, TD.unsel A:active, TD.unsel A, TD.unsel A:visited { color: #666666; display: block; font-weight: normal; padding: 8px; text-decoration: none; } TD.trailer { background: #f0f0f0; border: solid thin #e0e0e0; color: #666666; font-size: 80%; padding: 5px; } TD.trailer A { color: #666699; } FORM { display: inline; } INPUT[TYPE="TEXT"], TEXTAREA { font-family: monaco, courier, monospace; } INPUT[TYPE="IMAGE"] { border: none; padding: 2pt; vertical-align: bottom; } SUB, SUP { font-size: 50%; } TR.data, TD.data, TR.data TD { margin-top: 10pt; padding: 5pt; border-bottom: solid 1pt #999999; } TR.data TH { border-bottom: solid 1pt #999999; padding-top: 10pt; padding-left: 5pt; text-align: left; } DIV.table TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin-left: auto; margin-right: auto; } DIV.table CAPTION { caption-side: top; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } DIV.table TABLE TD { background: white; border: solid thin #bbbbbb; padding: 5pt 10pt 0; } DIV.table TABLE TH { background: #f0f0f0; border: none; border-bottom: solid thin #999999; } DIV.figure TABLE { margin-left: auto; margin-right: auto; } DIV.figure CAPTION { caption-side: bottom; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } TH.label { text-align: right; vertical-align: top; } TH.sublabel { text-align: right; font-weight: normal; } HR { border: solid thin; } SPAN.info { background: black; border: thin solid black; color: white; font-size: 80%; font-style: italic; font-weight: bold; white-space: nowrap; } H2 SPAN.info, H3 SPAN.info, H4 SPAN.info { float: right; font-size: 100%; } .conflict { background: red; color: white; } TH.conflict { text-align: right; } H1.title { display: none; } H2.title, H3.title, .row .body H2, .row .body H3 { border-bottom: solid 2pt black; } TABLE.indent { margin-top: 2em; margin-left: auto; margin-right: auto; width: 90%; } TABLE.indent { border-collapse: collapse; } TABLE.indent TD, TABLE.indent TH { padding: 0; } TABLE.list { border-collapse: collapse; margin-left: auto; margin-right: auto; width: 90%; } TABLE.list TH { background: white; border-bottom: solid thin #cccccc; color: #444444; padding-top: 10pt; padding-left: 5pt; text-align: left; vertical-align: bottom; white-space: nowrap; } TABLE.list TH A { color: #4444cc; } TABLE.list TD { border-bottom: solid thin #eeeeee; padding-top: 5pt; padding-left: 5pt; } TABLE.list TR:nth-child(even) { background: #f8f8f8; } TABLE.list TR:nth-child(odd) { background: #f4f4f4; } DIV.sidebar { float: right; min-width: 25%; margin-left: 10px; max-width: 33%; } DIV.sidebar P.l0 { margin-bottom: 0; margin-left: 0; margin-right: 0; margin-top: 12pt; } DIV.sidebar P.l1 { margin-bottom: 0; margin-left: 36pt; margin-right: 0; margin-top: 0; text-indent: -18pt; } DIV.sidebar P.l2 { font-style: italic; margin-bottom: 0; margin-left: 54pt; margin-right: 0; margin-top: 0; text-indent: -18pt; } TABLE.inset { background: #f0f0f0; border: thin solid #e0e0e0; margin-top: 1em; padding: 0; width: 100%; /* These are not implemented by all browsers, but that's OK */ border-radius: 5px; -moz-border-radius: 5px; } TABLE.inset CAPTION { caption-side: top; color: #666666; font-size: 80%; margin-left: 10px; margin-bottom: 2px; text-align: left; } TABLE.inset TD { padding: 2px; } DT { margin-left: 36pt; margin-top: 12pt; } DD { margin-left: 54pt; } DL.category DT { font-weight: bold; } P.summary { margin-left: 36pt; font-family: monaco, courier, monospace; } DIV.summary TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin: 10px; } DIV.summary TABLE TD, DIV.summary TABLE TH { background: white; border: solid thin #999999; border-spacing: 0; padding: 5px; text-align: left; vertical-align: top; } DIV.summary TABLE THEAD TH { background: #f0f0f0; } DIV.tabs { height: 480px; overflow: hidden; } DIV.tab { float: left; height: 100%; overflow-y: auto; width: 100%; } /* API documentation styles... */ div.body h1 { } div.body h2 { } div.body h3 { } div.body h4 { } div.body h5 { } div.contents { } div.contents h1 { } div.contents h2 { } div.contents ul.contents { } div.contents ul.contents li ul { display: none; } .class { 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 { 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 { padding: 10px; } p code, li code { padding: 2px 5px; } span.info { background: black; border: solid thin black; color: white; font-size: 80%; font-style: italic; font-weight: bold; white-space: nowrap; } h3 span.info, h4 span.info { border-top-left-radius: 10px; border-top-right-radius: 10px; float: right; padding: 3px 6px; } ul.code, ul.contents, ul.subcontents { list-style-type: none; margin: 0; padding-left: 0; } ul.code li { margin: 0; } ul.contents > li { margin-top: 1em; } ul.contents li ul.code, ul.contents li ul.subcontents { padding-left: 2em; } 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-right: 2px solid gray; font-family: monospace; padding: 5px 10px 5px 2px; text-align: right; vertical-align: top; } table.list td { padding: 5px 2px 5px 10px; text-align: left; vertical-align: top; } /* iPhone/iPod touch overrides */ @media only screen and (min-device-width: 320px) and (max-device-width: 480px), only screen and (min-device-width: 320px) and (max-device-width: 568px) { .mobile { display: inherit; } .no-mobile { display: none; } .header { margin: 0; position: relative; } .header ul li { float: none; } .body { paddng: 0px; } .footer { font-size: 10px; height: auto; position: relative; } .row .thirds, .row .halves { float: none; margin: 0; width: 100%; } DIV.sidebar { float: none; margin-left: 0; max-width: 100%; min-width: 100%; width: 100%; } BLOCKQUOTE { margin: 0; } P.example { margin-left: 0; } PRE.command, PRE.example, PRE.man { margin-left: 0; white-space: pre-wrap; } } /* iPad overrides */ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { .mobile { display: inherit; } .no-mobile { display: none; } } cups-2.3.1/doc/images/000775 000765 000024 00000000000 13574721672 014611 5ustar00mikestaff000000 000000 cups-2.3.1/doc/Makefile000664 000765 000024 00000011133 13574721672 015003 0ustar00mikestaff000000 000000 # # Documentation makefile for CUPS. # # 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 #s information. # include ../Makedefs # # Document files... # WEBPAGES = \ apple-touch-icon.png \ cups.css \ cups-printable.css \ index.html \ robots.txt WEBIMAGES = \ images/color-wheel.png \ images/cups.png \ images/cups-icon.png \ images/generic.png \ images/left.gif \ images/right.gif \ images/sel.gif \ images/unsel.gif \ images/wait.gif HELPIMAGES = \ images/cups-block-diagram.png \ images/cups-command-chain.png \ images/cups-postscript-chain.png \ images/cups-raster-chain.png \ images/raster.png \ images/raster-organization.png \ images/sample-image.png \ images/smiley.jpg HELPFILES = \ help/accounting.html \ help/admin.html \ help/api-admin.html \ help/api-filter.html \ help/api-ppd.html \ help/api-raster.html \ help/cgi.html \ help/cupspm.html \ help/encryption.html \ help/firewalls.html \ help/glossary.html \ help/kerberos.html \ help/license.html \ help/man-backend.html \ help/man-cancel.html \ help/man-classes.conf.html \ help/man-client.conf.html \ help/man-cups.html \ help/man-cups-config.html \ help/man-cups-files.conf.html \ help/man-cups-lpd.html \ help/man-cups-snmp.html \ help/man-cupsaccept.html \ help/man-cupsd.conf.html \ help/man-cupsd.html \ help/man-cupsd-helper.html \ help/man-cupsd-logs.html \ help/man-cupsenable.html \ help/man-cupstestppd.html \ help/man-filter.html \ help/man-ippevepcl.html \ help/man-ippeveprinter.html \ help/man-ipptool.html \ help/man-ipptoolfile.html \ help/man-lp.html \ help/man-lpadmin.html \ help/man-lpc.html \ help/man-lpinfo.html \ help/man-lpmove.html \ help/man-lpoptions.html \ help/man-lpq.html \ help/man-lpr.html \ help/man-lprm.html \ help/man-lpstat.html \ help/man-mime.convs.html \ help/man-mime.types.html \ help/man-notifier.html \ help/man-ppdc.html \ help/man-ppdhtml.html \ help/man-ppdi.html \ help/man-ppdmerge.html \ help/man-ppdpo.html \ help/man-printers.conf.html \ help/man-subscriptions.conf.html \ help/network.html \ help/options.html \ help/overview.html \ help/policies.html \ help/postscript-driver.html \ help/ppd-compiler.html \ help/raster-driver.html \ help/ref-ppdcfile.html \ help/security.html \ help/sharing.html \ help/spec-banner.html \ help/spec-command.html \ help/spec-design.html \ help/spec-ipp.html \ help/spec-ppd.html \ help/spec-raster.html \ help/spec-stp.html \ help/translation.html # # Make all documents... # all: # # Make library targets... # libs: # # Make unit tests... # unittests: # # Remove all generated files... # clean: # # Dummy depend target... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: $(INSTALL_LANGUAGES) $(INSTALL_DIR) -m 755 $(DOCDIR) for file in $(WEBPAGES); do \ $(INSTALL_MAN) $$file $(DOCDIR); \ done $(INSTALL_DIR) -m 755 $(DOCDIR)/help for file in $(HELPFILES); do \ $(INSTALL_MAN) $$file $(DOCDIR)/help; \ done if test "x$(IPPFIND_MAN)" != x; then \ $(INSTALL_MAN) help/man-ippfind.html $(DOCDIR)/help; \ fi $(INSTALL_DIR) -m 755 $(DOCDIR)/images for file in $(WEBIMAGES) $(HELPIMAGES); do \ $(INSTALL_MAN) $$file $(DOCDIR)/images; \ done install-languages: for lang in $(LANGUAGES); do \ if test -d $$lang; then \ $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang; \ $(INSTALL_DATA) $$lang/index.html $(DOCDIR)/$$lang; \ $(INSTALL_DATA) $$lang/cups.css $(DOCDIR)/$$lang >/dev/null 2>&1 || true; \ fi; \ done install-langbundle: # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall all documentation files... # uninstall: $(UNINSTALL_LANGUAGES) for file in $(WEBPAGES); do \ $(RM) $(DOCDIR)/$$file; \ done for file in $(HELPFILES); do \ $(RM) $(DOCDIR)/help/$$file; \ done if test "x$(IPPFIND_MAN)" != x; then \ $(RM) $(DOCDIR)/help/man-ippfind.html; \ done for file in $(WEBIMAGES); do \ $(RM) $(DOCDIR)/images/$$file; \ done -$(RMDIR) $(DOCDIR)/images -$(RMDIR) $(DOCDIR)/help -$(RMDIR) $(DOCDIR) uninstall-languages: -for lang in $(LANGUAGES); do \ $(RM) $(DOCDIR)/$$lang/index.html; \ $(RM) $(DOCDIR)/$$lang/cups.css; \ $(RMDIR) $(DOCDIR)/$$lang; \ done install-langbundle: cups-2.3.1/doc/pt_BR/000775 000765 000024 00000000000 13574721672 014352 5ustar00mikestaff000000 000000 cups-2.3.1/doc/ja/000775 000765 000024 00000000000 13574721672 013736 5ustar00mikestaff000000 000000 cups-2.3.1/doc/ru/000775 000765 000024 00000000000 13574721672 013772 5ustar00mikestaff000000 000000 cups-2.3.1/doc/cups-printable.css000664 000765 000024 00000015144 13574721672 017013 0ustar00mikestaff000000 000000 BODY { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } H1, H2, H3, H4, H5, H6, P, TD, TH { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } H1 { font-size: 2em; } H2 { font-size: 1.75em; } H3 { font-size: 1.5em; } H4 { font-size: 1.25em; } KBD { font-family: monaco, courier, monospace; font-weight: bold; } PRE { font-family: monaco, courier, monospace; } BLOCKQUOTE { border-left: solid 2px #777; margin: 1em 0; padding: 10px; } BLOCKQUOTE OL LI { margin-left: -1em; } PRE.command, PRE.example { background: #eee; margin: 0 36pt; padding: 10px; } P.compact { margin: 0; } P.example { font-style: italic; margin-left: 36pt; } DL.man DD { margin-left: 5em; } DL.man DT { margin-left: 0; } PRE.man { margin: 0; } PRE.command EM, PRE.example EM { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } P.command { font-family: monaco, courier, monospace; margin-left: 36pt; } P.formula { font-style: italic; margin-left: 36pt; } A IMG { border: none; } A:link:hover IMG { background: #f0f0f0; border-radius: 10px; -moz-border-radius: 10px; } A:link, A:visited { font-weight: inherit; text-decoration: none; } A:link:hover, A:visited:hover, A:active { text-decoration: underline; } SUB, SUP { font-size: 50%; } TR.data, TD.data, TR.data TD { margin-top: 10pt; padding: 5pt; border-bottom: solid 1pt #999999; } TR.data TH { border-bottom: solid 1pt #999999; padding-top: 10pt; padding-left: 5pt; text-align: left; } DIV.table TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin-left: auto; margin-right: auto; } DIV.table CAPTION { caption-side: top; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } DIV.table TABLE TD { border: solid thin #cccccc; padding: 5pt 10pt 0; } DIV.table TABLE TH { background: #cccccc; border: none; border-bottom: solid thin #999999; } DIV.figure TABLE { margin-left: auto; margin-right: auto; } DIV.figure CAPTION { caption-side: bottom; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } TH.label { text-align: right; vertical-align: top; } TH.sublabel { text-align: right; font-weight: normal; } HR { border: solid thin; } SPAN.info { background: black; border: thin solid black; color: white; font-size: 80%; font-style: italic; font-weight: bold; white-space: nowrap; } H2 SPAN.info, H3 SPAN.info, H4 SPAN.info { float: right; font-size: 100%; } H1.title { } H2.title, H3.title { border-bottom: solid 2pt #000000; } DIV.indent, TABLE.indent { margin-top: 2em; margin-left: auto; margin-right: auto; width: 90%; } TABLE.indent { border-collapse: collapse; } TABLE.indent TD, TABLE.indent TH { padding: 0; } TABLE.list { border-collapse: collapse; margin-left: auto; margin-right: auto; width: 90%; } TABLE.list TH { background: white; border-bottom: solid thin #cccccc; color: #444444; padding-top: 10pt; padding-left: 5pt; text-align: left; vertical-align: bottom; white-space: nowrap; } TABLE.list TH A { color: #4444cc; } TABLE.list TD { border-bottom: solid thin #eeeeee; padding-top: 5pt; padding-left: 5pt; } TABLE.list TR:nth-child(even) { background: #f8f8f8; } TABLE.list TR:nth-child(odd) { background: #f4f4f4; } DT { margin-left: 36pt; margin-top: 12pt; } DD { margin-left: 54pt; } DL.category DT { font-weight: bold; } P.summary { margin-left: 36pt; font-family: monaco, courier, monospace; } DIV.summary TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin: 10px; } DIV.summary TABLE TD, DIV.summary TABLE TH { border: solid thin #999999; padding: 5px; text-align: left; vertical-align: top; } DIV.summary TABLE THEAD TH { background: #eeeeee; } /* API documentation styles... */ div.body h1 { font-size: 250%; font-weight: bold; margin: 0; } div.body h2 { font-size: 250%; margin-top: 1.5em; } div.body h3 { font-size: 150%; margin-bottom: 0.5em; margin-top: 1.5em; } div.body h4 { font-size: 110%; margin-bottom: 0.5em; margin-top: 1.5em; } div.body h5 { font-size: 100%; margin-bottom: 0.5em; margin-top: 1.5em; } div.contents { background: #e8e8e8; border: solid thin black; padding: 10px; } div.contents h1 { font-size: 110%; } div.contents h2 { font-size: 100%; } div.contents ul.contents { font-size: 80%; } .class { 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); padding: 10px 10px 0px; 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; hyphens: manual; -webkit-hyphens: manual; page-break-inside: avoid; } p.code, pre, ul.code li { padding: 10px; } p code, li code { padding: 2px 5px; } a:link, a:visited { text-decoration: none; } span.info { background: black; border: solid thin black; color: white; font-size: 80%; font-style: italic; font-weight: bold; white-space: nowrap; } h2 span.info, h3 span.info, h4 span.info { border-radius: 10px; float: right; font-size: 80%; padding: 3px 6px; } h2.title span.info, h3.title span.info, h4.title span.info { border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; } h2.title span.info { padding: 4px 6px; } ul.code, ul.contents, ul.subcontents { list-style-type: none; margin: 0; padding-left: 0; } ul.code li { margin: 0; } ul.contents > li { margin-top: 1em; } ul.contents li ul.code, ul.contents li ul.subcontents { padding-left: 2em; } 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-right: 2px solid gray; font-family: monospace; padding: 5px 10px 5px 2px; text-align: right; vertical-align: top; } table.list td { padding: 5px 2px 5px 10px; text-align: left; vertical-align: top; } h1.title { } h2.title { border-bottom: solid 2px black; } h3.title { border-bottom: solid 2px black; } cups-2.3.1/doc/index.html.in000664 000765 000024 00000004430 13574721672 015747 0ustar00mikestaff000000 000000 Home - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems.

cups-2.3.1/doc/de/000775 000765 000024 00000000000 13574721672 013734 5ustar00mikestaff000000 000000 cups-2.3.1/doc/es/000775 000765 000024 00000000000 13574721672 013753 5ustar00mikestaff000000 000000 cups-2.3.1/doc/robots.txt000664 000765 000024 00000000137 13574721672 015416 0ustar00mikestaff000000 000000 # # This file tells search engines not to index your CUPS server. # User-agent: * Disallow: / cups-2.3.1/doc/help/000775 000765 000024 00000000000 13574721672 014274 5ustar00mikestaff000000 000000 cups-2.3.1/doc/apple-touch-icon.opacity000664 000765 000024 00000033132 13574721672 020107 0ustar00mikestaff000000 000000 bplist00MNX$versionX$objectsY$archiverT$topeqrstuyz"#/01238=BEMNQRTX[cntz{ ,/27=CHIJQZ^ei  !"#'+/5678<?@AWXYZ[\]^_Nabcgk@:C9 !"#$%&'()*+,-./04:>BFU$null0  !"#$%&'()*+,-./0123456789:;9<=>>@ABCCDEFGHICJKLMNO>QRSTU@WXYZ[B]^_`>BcN9WpolySidWpixDTypSbmPUresUnTsecCUcolSpUoBgImSparVnPaStrWactLaysUsnShsWpenTTypSmodTzoomTallRVsavStDTmetaVspiDecVgenNamUorTypVpixRadTfrasUimSizUbgColVnPaFilV$classVactTraVsavPrDTtarsVcurFraSenVVlineThVautoBTUshLayXrectCRadUresiMTcurRWspiSegsTtrasWfilSensUmainCVtraTrgVcurObjVguiLinTvarsVlasModWpolyStaUbgTyp, c#@ #@T#?e#? #@ -  #@IYfg"hlpWNS.keysZNS.objectsijkmno \kMDItemTitle^kMDItemAuthors_kMDItemCopyright_CUPS Web Site Icong"vxw ]Michael Sweet{|}~Z$classnameX$classesWNSArray}XNSObject_Copyright 2013 Apple Inc.{|_NSMutableDictionary\NSDictionaryg"xZ "SresSdel#?{|\PCResolution\PCResolutionXPCObjectg"xS "ATlaysUanimTUlAcLs#?cdfg"pijkmo g"xw g"x6 "CCN@NSUblendWmaskTypUedMskSnamWmaskLaySvisUalConTobjsTisShTopac  #@Y">Bƀfg"pӀՀ #?"ۀ#?{|_PCBitmapContext_PCBitmapContextZPCDrawableXPCObjectg"x {|]PCNormalLayer]PCNormalLayerWPCLayerZPCDrawableXPCObjectTCUPSfg"p #?"ۀ#?g"x! "    NN@@N@NTrectTstrYSisIXstrTBndsTstrXSshXTantiSflVVattStrSshYUalPixSangSflH"#@Y #@Y# 5## 4#_{{10, 40}, {130, 65}}" !XNSString\NSAttributes$3%TCUPSfg"$).%&'(&'()*<,-*,.12_NSParagraphStyleWNSColorVNSFontVNSKern4"5>7:ZNSTabStops[NSAlignment+{|9:_NSMutableParagraphStyle;<_NSMutableParagraphStyle_NSParagraphStyle>?"@9AWNSWhite\NSColorSpaceB1-{|CDWNSColorCFGH"IJKLVNSSizeXNSfFlagsVNSName#@F/0_HelveticaNeue-Bold{|OPVNSFontO#{|S{|UV_NSAttributedStringW_NSAttributedString>?"Y9AD1 0-{|\]\PCTextVector^_`ab\PCTextVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObject"CCNef@hjNlS;7 <?#@Y">qBƀ68fg"uwpv9x: #?"f}ۀ7#?ZBackgroundfg"p=> #?"ۀ6#?g"x@ " N@@N@NUdimLKWfilPropVcornRXVcornRYUstrosAD E# ##bW#6 #fg"pBC ]cornerRadiusX]cornerRadiusY_{{0, 0}, {150, 150}}"NCC>C@VrelLP2SblHWgradAngUradGCTfilTWrelRadCVfilPosSaEqStypXrelLinP1VfilColVrelLP1UfilImVothColXrelLinP2SgEqUfilGrSrEqXgradStopUpgNumSbEqSfilP#@VMMVUOFNG@QSRHT ?"AUNSRGBL0.2 0.2 0.2-?"AL0.6 0.6 0.6-g"IKL">ValtColSlocScolE#@Nx-͈FJ{|^PCGradientStop^PCGradientStopZPCDrawableXPCObject">E#@YGJ{|^NSMutableArray}V{0, 0}X{0, -75}X{0, -50}_{1.4210854715202004e-14, 75}_{9.473903143468002e-15, 50}Q0QtW100 - tS100{| _PCDrawVectorProperties   _PCDrawVectorPropertiesZPCDrawableXPCObjectg"XL":NCC:>!C@&C^)+TcapSSposUinvisSwidUdashSMM#@VMaUMMZ@ MS#?YR[T^>?"-9AB0-?"0AL0.4 0.4 0.4-g"345\]L">:^X#YJ">@!X#@YZJg"DxEF_` #@ #{|KL_PCStrokeVectorPropertiesMNOP_PCStrokeVectorProperties_PCDrawVectorPropertiesZPCDrawableXPCObject{|RS\PCRectVectorTUVWXY\PCRectVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectg"[x6 {|_`WPCFrameabcdWPCFrame_PCMetadataObjectZPCDrawableXPCObjectg"fxgf jklm"nopqrs tNN>xy>C{>@NNBYauSizCropVnewFacUapIn1TpathTapIDUcropRUapIn2UisRelUisColTcropVvarValhg i_{{0, 0}, {0, 0}}_apple-touch-icon.png"@SN@NgZ>:cVanLooCVprShTiVprLinCSfraUcompSUgrTypUgenCHUcodeSVdisGamTsnShVexPropUcodeLUpPNGOTpropVcodePlUprColUcodeFVcodeFr {xy f z~j|}fg"pklmnop<qr,stw V{JFIF}U{GIF}_"kCGImageDestinationBackgroundColorU{PNG}V{TIFF}_*kCGImageDestinationLossyCompressionQualityfg"p fg"p fg"p fg"pЀuҀv [Compression#?Zpublic.png]public.folderfg"p ?"AL0.5 0 0 0.5-SiosUcocoaUtouchVMyViewVUIView{|_PCBitmapProperties_PCBitmapPropertiesXPCObject{|YPCFactoryYPCFactoryZPCDrawableXPCObjectg"堀LYselectionZ{150, 150}>?"9AE0.75-_CICheckerboardGenerator"@SN@NZ>: c  y  ~|}fg"p<, V{JFIF}U{GIF}_"kCGImageDestinationBackgroundColorU{PNG}V{TIFF}_*kCGImageDestinationLossyCompressionQualityfg"$%p fg"()p fg",-p fg"02p1Ҁv [Compression#?_com.likethought.opacity.opacityfg"9:p ?"=AL0.5 0 0 0.5-VMyViewVUIViewfg"BLpCDEFGHIJKMMOPMRSMM _framePickerVisibleZhideRulers[windowFrame_layerViewDimension]hideVariablesZexpansionsYprintInfo]toolbarHidden_editFrameMetadata_{{91, 397}, {626, 523}}#@cfg"dep "hij\NSAttributesfg"lupmnopqrstvwxyzv|} _NSHorizontallyCentered]NSRightMargin\NSLeftMargin_NSHorizonalPagination_NSVerticalPagination_NSVerticallyCentered[NSTopMargin^NSBottomMargin "B"B"B"B{|[NSPrintInfo[NSPrintInfofg"p€ÀĀŪgƀȀ̀ҀfӀ؀ـ߀ _.com.likethought.opacity.preview.iPhoneSettings_(com.likethought.opacity.preview.elements_"com.likethought.opacity.preview.ui_(com.likethought.opacity.preview.appStoreWfactory_#com.likethought.opacity.preview.web_*com.likethought.opacity.preview.iphoneIcon_&com.likethought.opacity.preview.cursor_&com.likethought.opacity.preview.iphoneTtypefg"pǡM [prerenderedfg"pɀʀˣMMM VstatusWtoolbarTdockfg"pʀ̀ŀΣ<z΀,π Ucolor[resolutionsg"ՀЀрL#?#@fg"pǡM fg"pԀբր׀ WaddressUimage_#http://likethought.com/opacity/web/_,http://likethought.com/opacity/web/image.pngfg"pǡM fg"pȀڀŀۀͤ<܀݀ހ, XhotspotXXhotspotY##fg"p     ŀ̀<zzzzzz, UrectYTleftUrectW[navBarStyleUrectX_statusMenuStyle\toolbarStyleZiPhoneTypeUrectHYitemStyleStop#@4#@i#@4#@Fg"1x@ 56"789TNSIDUNSICC;"<=WNS.dataO H HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km{|?@]NSMutableData?AVNSData{|CD\NSColorSpaceE\NSColorSpace{|GHWPCImageIJKLWPCImage_PCMetadataObjectZPCDrawableXPCObject_NSKeyedArchiverOTroot"+5:?06  $(/7=EINSZ_fmsz#)+-/13578:<>GIKMVXaceghjlnprt}~'0357ENYbjox)2;>@B[`flnpr{} !',1679;<>@BCLNcegikmz}!/7BKP]`begir      ! % ' 0 1 2 3 < E F G I K T V W Y b c {    ' ) + 4 N U o   ) 2 7 @ U Z o |        ! " + - B D F H J L Y \ ^ a c e n { } & , 4 ; B H J L M N P Y Z [ d m o q z | } 6=AIOT\cgkt{  &(168:<QX\`bdmoqz 2PRT\`i;@DJNTVWYbdfhjlnprsuw  !&(*,5>Gbm%.135>FQYlw  "#%&')+>U ()+-/024578:<>@BDFHJWdfhjlnp}&'(*7:<?ACOQZes '2;DEGQ\ioq"$&(*,.;=?ACEGIPV{ 8EFGIVcels &0>RSmv &>Ulx !#T*S|  ',.02;DQTVY[]joqsxz|~!#%')+4=FO\wy{}   % ) 2 4 = ? H Q Z ] _ a n s y { }  ,,,,,-- ---+-4-<-G-O-b-m-v---Q-cups-2.3.1/doc/help/man-ppdi.html000664 000765 000024 00000003770 13574721672 016676 0ustar00mikestaff000000 000000 ppdi(1)

ppdi(1)

Name

ppdi - import ppd files (deprecated)

Synopsis

ppdi [ -I include-directory ] [ -o source-file ] ppd-file [ ... ppd-file ]

Description

ppdi imports one or more PPD files into a PPD compiler source file. Multiple languages of the same PPD file are merged into a single printer definition to facilitate accurate changes for all localizations. This program is deprecated and will be removed in a future release of CUPS.

Options

ppdi supports the following options:
-I include-directory
Specifies an alternate include directory. Multiple -I options can be supplied to add additional directories.
-o source-file
Specifies the PPD source file to update. If the source file does not exist, a new source file is created. Otherwise the existing file is merged with the new PPD file(s) on the command-line. If no source file is specified, the filename ppdi.drv is used.

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

ppdc(1), ppdhtml(1), ppdmerge(1), ppdpo(1), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpstat.html000664 000765 000024 00000011063 13574721672 017243 0ustar00mikestaff000000 000000 lpstat(1)

lpstat(1)

Name

lpstat - print cups status information

Synopsis

lpstat [ -E ] [ -H ] [ -U username ] [ -h hostname[:port] ] [ -l ] [ -W which-jobs ] [ -a [ destination(s) ] ] [ -c [ class(es) ] ] [ -d ] [ -e ] [ -o [ destination(s) ] ] [ -p [ printer(s) ] ] [ -r ] [ -R ] [ -s ] [ -t ] [ -u [ user(s) ] ] [ -v [ printer(s) ] ]

Description

lpstat displays status information about the current classes, jobs, and printers. When run with no arguments, lpstat will list active jobs queued by the current user.

Options

The lpstat command supports the following options:
-E
Forces encryption when connecting to the server.
-H
Shows the server hostname and port.
-R
Shows the ranking of print jobs.
-U username
Specifies an alternate username.
-W which-jobs
Specifies which jobs to show, "completed" or "not-completed" (the default). This option must appear before the -o option and/or any printer names, otherwise the default ("not-completed") value will be used in the request to the scheduler.
-a [printer(s)]
Shows the accepting state of printer queues. If no printers are specified then all printers are listed.
-c [class(es)]
Shows the printer classes and the printers that belong to them. If no classes are specified then all classes are listed.
-d
Shows the current default destination.
-e
Shows all available destinations on the local network.
-h server[:port]
Specifies an alternate server.
-l
Shows a long listing of printers, classes, or jobs.
-o [destination(s)]
Shows the jobs queued on the specified destinations. If no destinations are specified all jobs are shown.
-p [printer(s)]
Shows the printers and whether they are enabled for printing. If no printers are specified then all printers are listed.
-r
Shows whether the CUPS server is running.
-s
Shows a status summary, including the default destination, a list of classes and their member printers, and a list of printers and their associated devices. This is equivalent to using the -d, -c, and -v options.
-t
Shows all status information. This is equivalent to using the -r, -d, -c, -v, -a, -p, and -o options.
-u [user(s)]
Shows a list of print jobs queued by the specified users. If no users are specified, lists the jobs queued by the current user.
-v [printer(s)]
Shows the printers and what device they are attached to. If no printers are specified then all printers are listed.

Conforming To

Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", and "#". Also, printer and class names are not case-sensitive.

The -h, -e, -E, -U, and -W options are unique to CUPS.

The Solaris -f, -P, and -S options are silently ignored.

See Also

cancel(1), lp(1), lpq(1), lpr(1), lprm(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cupsfilter.html000664 000765 000024 00000010550 13574721672 020114 0ustar00mikestaff000000 000000 cupsfilter(8)

cupsfilter(8)

Name

cupsfilter - convert a file to another format using cups filters (deprecated)

Synopsis

cupsfilter [ --list-filters ] [ -D ] [ -U user ] [ -c config-file ] [ -d printer ] [ -e ] [ -i mime/type ] [ -j job-id[,N] ] [ -m mime/type ] [ -n copies ] [ -o name=value ] [ -p filename.ppd ] [ -t title ] [ -u ] filename

Description

cupsfilter is a front-end to the CUPS filter subsystem which allows you to convert a file to a specific format, just as if you had printed the file through CUPS. By default, cupsfilter generates a PDF file. The converted file is sent to the standard output.

Options

--list-filters
Do not actually run the filters, just print the filters used to stdout.
-D
Delete the input file after conversion.
-U user
Specifies the username passed to the filters. The default is the name of the current user.
-c config-file
Uses the named cups-files.conf configuration file.
-d printer
Uses information from the named printer.
-e
Use every filter from the PPD file.
-i mime/type
Specifies the source file type. The default file type is guessed using the filename and contents of the file.
-j job-id[,N]
Converts document N from the specified job. If N is omitted, document 1 is converted.
-m mime/type
Specifies the destination file type. The default file type is application/pdf. Use printer/foo to convert to the printer format defined by the filters in the PPD file.
-n copies
Specifies the number of copies to generate.
-o name=value
Specifies options to pass to the CUPS filters.
-p filename.ppd
Specifies the PPD file to use.
-t title
Specifies the document title.
-u
Delete the PPD file after conversion.

Exit Status

cupsfilter returns a non-zero exit status on any error.

Environment

All of the standard cups(1) environment variables affect the operation of cupsfilter.

Files

/etc/cups/cups-files.conf
/etc/cups/*.convs
/etc/cups/*.types
/usr/share/cups/mime/*.convs
/usr/share/cups/mime/*.types

Notes

CUPS printer drivers, filters, and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

Unlike when printing, filters run using the cupsfilter command use the current user and security session. This may result in different output or unexpected behavior.

Example

The following command will generate a PDF preview of job 42 for a printer named "myprinter" and save it to a file named "preview.pdf":

    cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf

See Also

cups(1), cupsd.conf(5), filter(7), mime.convs(7), mime.types(7), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cups.html000664 000765 000024 00000016665 13574721672 016723 0ustar00mikestaff000000 000000 cups(1)

cups(1)

Name

cups - a standards-based, open source printing system

Description

CUPS is the software you use to print from applications like word processors, email readers, photo editors, and web browsers. It converts the page descriptions produced by your application (put a paragraph here, draw a line there, and so forth) into something your printer can understand and then sends the information to the printer for printing.

Now, since every printer manufacturer does things differently, printing can be very complicated. CUPS does its best to hide this from you and your application so that you can concentrate on printing and less on how to print. Generally, the only time you need to know anything about your printer is when you use it for the first time, and even then CUPS can often figure things out on its own.

How Does It Work?

The first time you print to a printer, CUPS creates a queue to keep track of the current status of the printer (everything OK, out of paper, etc.) and any pages you have printed. Most of the time the queue points to a printer connected directly to your computer via a USB port, however it can also point to a printer on your network, a printer on the Internet, or multiple printers depending on the configuration. Regardless of where the queue points, it will look like any other printer to you and your applications.

Every time you print something, CUPS creates a job which contains the queue you are sending the print to, the name of the document you are printing, and the page descriptions. Job are numbered (queue-1, queue-2, and so forth) so you can monitor the job as it is printed or cancel it if you see a mistake. When CUPS gets a job for printing, it determines the best programs (filters, printer drivers, port monitors, and backends) to convert the pages into a printable format and then runs them to actually print the job.

When the print job is completely printed, CUPS removes the job from the queue and moves on to any other jobs you have submitted. You can also be notified when the job is finished, or if there are any errors during printing, in several different ways.

Where Do I Begin?

The easiest way to start is by using the web interface to configure your printer. Go to "http://localhost:631" and choose the Administration tab at the top of the page. Click/press on the Add Printer button and follow the prompts.

When you are asked for a username and password, enter your login username and password or the "root" username and password.

After the printer is added you will be asked to set the default printer options (paper size, output mode, etc.) for the printer. Make any changes as needed and then click/press on the Set Default Options button to save them. Some printers also support auto-configuration - click/press on the Query Printer for Default Options button to update the options automatically.

Once you have added the printer, you can print to it from any application. You can also choose Print Test Page from the maintenance menu to print a simple test page and verify that everything is working properly.

You can also use the lpadmin(8) and lpinfo(8) commands to add printers to CUPS. Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.

How Do I Get Help?

The CUPS web site (http://www.CUPS.org) provides access to the cups and cups-devel mailing lists, additional documentation and resources, and a bug report database. Most vendors also provide online discussion forums to ask printing questions for your operating system of choice.

Environment

CUPS commands use the following environment variables to override the default locations of files and so forth. For security reasons, these environment variables are ignored for setuid programs:
CUPS_ANYROOT
Whether to allow any X.509 certificate root (Y or N).
CUPS_CACHEDIR
The directory where semi-persistent cache files can be found.
CUPS_DATADIR
The directory where data files can be found.
CUPS_ENCRYPTION
The default level of encryption (Always, IfRequested, Never, Required).
CUPS_EXPIREDCERTS
Whether to allow expired X.509 certificates (Y or N).
CUPS_GSSSERVICENAME
The Kerberos service name used for authentication.
CUPS_SERVER
The hostname/IP address and port number of the CUPS scheduler (hostname:port or ipaddress:port).
CUPS_SERVERBIN
The directory where server helper programs, filters, backend, etc. can be found.
CUPS_SERVERROOT
The root directory of the server.
CUPS_STATEDIR
The directory where state files can be found.
CUPS_USER
Specifies the name of the user for print requests.
HOME
Specifies the home directory of the current user.
IPP_PORT
Specifies the default port number for IPP requests.
LOCALEDIR
Specifies the location of localization files.
LPDEST
Specifies the default print queue (System V standard).
PRINTER
Specifies the default print queue (Berkeley standard).
TMPDIR
Specifies the location of temporary files.

Files

~/.cups/client.conf
~/.cups/lpoptions

Conforming To

CUPS conforms to the Internet Printing Protocol version 2.1 and implements the Berkeley and System V UNIX print commands.

Notes

CUPS printer drivers, backends, and PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

cancel(1), client.conf(7), cupsctl(8), cupsd(8), lp(1), lpadmin(8), lpinfo(8), lpoptions(1), lpr(1), lprm(1), lpq(1), lpstat(1), CUPS Online Help (http://localhost:631/help), CUPS Web Site (http://www.CUPS.org), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/spec-banner.html000664 000765 000024 00000010062 13574721672 017356 0ustar00mikestaff000000 000000 CUPS Banner File Format

CUPS Banner File Format

Introduction

This specification describes the CUPS banner file format (application/vnd.cups-banner) which is used to generate print job cover pages and the CUPS test page. The format itself consists of a header followed by lines of UTF-8 text containing comments or keywords and values:

#CUPS-BANNER

# What to show on the cover page
Show job-id job-name job-originating-user-name time-at-creation

# The header and footer text
Header Cover Page
Footer Cover Page

# Arbitrary "notice" text
Notice All work and no play makes Johnny a dull boy.
Notice All work and no play makes Johnny a dull boy.
Notice All work and no play makes Johnny a dull boy.
Notice All work and no play makes Johnny a dull boy.

# Images to place below the rest
Image /usr/share/doc/cups/images/cups-icon.png
Image /usr/share/doc/cups/images/smiley.jpg

Standard Keywords

Footer

Footer text for footer

The Footer key defines the text that is centered at the bottom of the page. Only one Footer key can be specified.

Header

Header text for Header

The Header key defines the text that is centered at the top of the page. Only one Header key can be specified.

Image

Image /path/to/image/filename
Image relative/path/in/DocumentRoot/filename

The Image key defines images that are centered above the footer text. Multiple images are centered as a group from left to right. Images are scaled as needed to fit on the page with a nominal size of 1"/25cm.

Notice

Notice Text to display below the job information.
Notice More text to display below the job information.

The Notice key defines lines of text that are centered below the job information.

Show

Show value value ... value

The Show key lists the job information that is shown. The following values are supported:

  • imageable-area: The imageable area of the current page size
  • job-billing: Billing information for the job
  • job-id: The job ID
  • job-name: The title of the job
  • job-originating-host-name: The computer that printed the job
  • job-originating-user-name: The user that printed the job
  • job-uuid: The job UUID
  • options: The options that were provided with the job
  • paper-name: The name of the paper size used
  • paper-size: The dimensions of the paper size used.
  • printer-driver-name: The printer driver used
  • printer-driver-version: The driver version
  • printer-info: The printer description
  • printer-location: The location of the printer
  • printer-make-and-model: The make and model strings reported by the printer driver
  • printer-name: The printer used
  • time-at-creation: When the job was submitted
  • time-at-processing: The current date and time
cups-2.3.1/doc/help/man-cups-config.html000664 000765 000024 00000006463 13574721672 020161 0ustar00mikestaff000000 000000 cups-config(1)

cups-config(1)

Name

cups-config - get cups api, compiler, directory, and link information.

Synopsis

cups-config --api-version
cups-config --build
cups-config --cflags
cups-config --datadir
cups-config --help
cups-config --ldflags
cups-config [ --image ] [ --static ] --libs
cups-config --serverbin
cups-config --serverroot
cups-config --version

Description

The cups-config command allows application developers to determine the necessary command-line options for the compiler and linker, as well as the installation directories for filters, configuration files, and drivers. All values are reported to the standard output.

Options

The cups-config command accepts the following command-line options:
--api-version
Reports the current API version (major.minor).
--build
Reports a system-specific build number.
--cflags
Reports the necessary compiler options.
--datadir
Reports the default CUPS data directory.
--help
Reports the program usage message.
--ldflags
Reports the necessary linker options.
--libs
Reports the necessary libraries to link to.
--serverbin
Reports the default CUPS binary directory, where filters and backends are stored.
--serverroot
Reports the default CUPS configuration file directory.
--static
When used with --libs, reports the static libraries instead of the default (shared) libraries.
--version
Reports the full version number of the CUPS installation (major.minor.patch).

Examples

Show the currently installed version of CUPS:

    cups-config --version

Compile a simple one-file CUPS filter:

    cc `cups-config --cflags --ldflags` -o filter filter.c \
        `cups-config --libs`

Deprecated Options

The following options are deprecated but continue to work for backwards compatibility:
--image
Formerly used to add the CUPS imaging library to the list of libraries.

See Also

cups(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-filter.html000664 000765 000024 00000026564 13574721672 017235 0ustar00mikestaff000000 000000 filter(7)

filter(7)

Name

filter - cups file conversion filter interface

Synopsis

filter job user title num-copies options [ filename ]

#include <cups/cups.h>

ssize_t cupsBackChannelRead(char *buffer, size_t bytes,
                            double timeout);

cups_sc_status_t cupsSideChannelDoRequest(cups_sc_command_t command,
                                          char *data, int *datalen,
                                          double timeout);

#include <cups/ppd.h>

const char *cupsGetOption(const char *name, int num_options,
                 cups_option_t *options);

int cupsMarkOptions(ppd_file_t *ppd, int num_options,
                    cups_option_t *options);

int cupsParseOptions(const char *arg, int num_options,
                     cups_option_t **options);

ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword);

void ppdMarkDefaults(ppd_file_t *ppd);

ppd_file_t *ppdOpenFile(const char *filename);

Description

The CUPS filter interface provides a standard method for adding support for new document types or printers to CUPS. Each filter is capable of converting from one or more input formats to another format that can either be printed directly or piped into another filter to get it to a printable format.

Filters MUST be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the file format. All output MUST be sent to the standard output. Filters MUST NOT attempt to communicate directly with the printer, other processes, or other services.

The command name (argv[0]) is set to the name of the destination printer but is also available in the PRINTER environment variable.

Options

Options are passed in argv[5] and are encoded from the corresponding IPP attributes used when the job was submitted. Use the cupsParseOptions() function to load the options into a cups_option_t array and the cupsGetOption() function to get the value of a specific attribute. Be careful to look for common aliases of IPP attributes such as "landscape" for the IPP "orientation-requested" attribute.

Options passed on the command-line typically do not include the default choices the printer's PPD file. Use the ppdMarkDefaults() and cupsMarkOptions() functions in the CUPS library to apply the options to the PPD defaults and map any IPP attributes to the corresponding PPD options. Use ppdFindMarkedChoice() to get the user-selected choice for a PPD option. For example, a filter might use the following code to determine the current value of the Duplex PPD option:


    ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
    cups_option_t *options = NULL;
    int num_options = cupsParseOptions(argv[5], 0, &options);

    ppdMarkDefaults(ppd);
    cupsMarkOptions(ppd, num_options, options);

    ppd_choice_t *choice = ppdFindMarkedChoice(ppd, "Duplex");

Raster filters should use option choices set through the raster page header, as those reflect the options in effect for a given page. Options specified on the command-line determine the default values for the entire job, which can be overridden on a per-page basis.

Log Messages

Messages sent to the standard error are generally stored in the printer's "printer-state-message" attribute and the current ErrorLog file. Each line begins with a standard prefix:
ALERT: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "alert" log level.
ATTR: attribute=value [ ... attribute=value]
Sets the named job or printer attribute(s). The following job attributes can be set: "job-media-progress". The following printer attributes can be set: "auth-info-required", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", "marker-names", "marker-types", "printer-alert", and "printer-alert-description".
CRIT: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "critical" log level.
DEBUG: message
Adds the specified message to the current ErrorLog using the "debug" log level. DEBUG messages are never stored in the "printer-state-message" attribute.
DEBUG2: message

Adds the specified message to the current ErrorLog using the "debug2" log level. DEBUG2 messages are never stored in the "printer-state-message" attribute.
EMERG: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "emergency" log level.
ERROR: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "error" log level.
INFO: message
Sets the "printer-state-message" attribute. If the current LogLevel is set to "debug2", also adds the specified message to the current ErrorLog using the "info" log level.
NOTICE: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "notice" log level.
PAGE: page-number #-copies
PAGE: total #-pages
Adds an entry to the current PageLog. The first form adds #-copies to the "job-media-sheets-completed" attribute. The second form sets the "job-media-sheets-completed" attribute to #-pages.
PPD: Keyword=Value [ ... KeywordN=Value ]
Sets the named keywords in the printer's PPD file. This is typically used to update default option keywords such as DefaultPageSize and the various installable options in the PPD file.
STATE: printer-state-reason [ ... printer-state-reason ]
STATE: + printer-state-reason [ ... printer-state-reason ]
STATE: - printer-state-reason [ ... printer-state-reason ]
Sets, adds, or removes "printer-state-reason" keywords for the current queue. Typically this is used to indicate media, ink, and toner conditions on a printer.
WARNING: message
Sets the "printer-state-message" attribute and adds the specified message to the current ErrorLog using the "warning" log level.

Environment Variables

The following environment variables are defined by the CUPS server when executing the filter:
CHARSET
The default text character set, typically "utf-8".
CLASS
When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set.
CONTENT_TYPE
The MIME media type associated with the submitted job file, for example "application/postscript".
CUPS_CACHEDIR
The directory where semi-persistent cache files can be found and stored.
CUPS_DATADIR
The directory where data files can be found.
CUPS_FILETYPE
The type of file being printed: "job-sheet" for a banner page and "document" for a regular print file.
CUPS_MAX_MESSAGE
The maximum size of a message sent to stderr, including any leading prefix and the trailing newline.
CUPS_SERVERROOT
The root directory of the server.
FINAL_CONTENT_TYPE
The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript".
LANG
The default language locale (typically C or en).
PATH
The standard execution path for external programs that may be run by the filter.
PPD
The full pathname of the PostScript Printer Description (PPD) file for this printer.
PRINTER
The name of the printer.
RIP_CACHE
The recommended amount of memory to use for Raster Image Processors (RIPs).
SOFTWARE
The name and version number of the server (typically CUPS/major.minor).
TZ
The timezone of the server.
USER
The user executing the filter, typically "lp" or "root"; consult the cups-files.conf file for the current setting.

Conforming To

While the filter interface is compatible with System V interface scripts, CUPS does not support System V interface scripts.

Notes

CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

CUPS filters are not meant to be run directly by the user. Aside from the legacy System V interface issues (argv[0] is the printer name), CUPS filters also expect specific environment variables and file descriptors, and typically run in a user session that (on macOS) has additional restrictions that affect how it runs. Unless you are a developer and know what you are doing, please do not run filters directly. Instead, use the cupsfilter(8) program to use the appropriate filters to do the conversions you need.

See Also

backend(7), cups(1), cups-files.conf(5), cupsd(8), cupsfilter(8),
CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpr.html000664 000765 000024 00000013666 13574721672 016544 0ustar00mikestaff000000 000000 lpr(1)

lpr(1)

Name

lpr - print files

Synopsis

lpr [ -E ] [ -H server[:port] ] [ -U username ] [ -P destination[/instance] ] [ -# num-copies [ -h ] [ -l ] [ -m ] [ -o option[=value] ] [ -p ] [ -q ] [ -r ] [ -C title ] [ -J title ] [ -T title ] [ file(s) ]

Description

lpr submits files for printing. Files named on the command line are sent to the named printer or the default destination if no destination is specified. If no files are listed on the command-line, lpr reads the print file from the standard input.

The Default Destination

CUPS provides many ways to set the default destination. The LPDEST and PRINTER environment variables are consulted first. If neither are set, the current default set using the lpoptions(1) command is used, followed by the default set using the lpadmin(8) command.

Options

The following options are recognized by lpr:
-E
Forces encryption when connecting to the server.
-H server[:port]
Specifies an alternate server.
-C "name"
-J "name"
-T "name"
Sets the job name/title.
-P destination[/instance]
Prints files to the named printer.
-U username
Specifies an alternate username.
-# copies
Sets the number of copies to print.
-h
Disables banner printing. This option is equivalent to -o job-sheets=none.
-l
Specifies that the print file is already formatted for the destination and should be sent without filtering. This option is equivalent to -o raw.
-m
Send an email on job completion.
-o option[=value]
Sets a job option. See "COMMON JOB OPTIONS" below.
-p
Specifies that the print file should be formatted with a shaded header with the date, time, job name, and page number. This option is equivalent to -o prettyprint and is only useful when printing text files.
-q
Hold job for printing.
-r
Specifies that the named print files should be deleted after submitting them.

Common Job Options

Aside from the printer-specific options reported by the lpoptions(1) command, the following generic options are available:
-o job-sheets=name
Prints a cover page (banner) with the document. The "name" can be "classified", "confidential", "secret", "standard", "topsecret", or "unclassified".
-o media=size
Sets the page size to size. Most printers support at least the size names "a4", "letter", and "legal".
-o number-up={2|4|6|9|16}
Prints 2, 4, 6, 9, or 16 document (input) pages on each output page.
-o orientation-requested=4
Prints the job in landscape (rotated 90 degrees counter-clockwise).
-o orientation-requested=5
Prints the job in landscape (rotated 90 degrees clockwise).
-o orientation-requested=6
Prints the job in reverse portrait (rotated 180 degrees).
-o print-quality=3
-o print-quality=4
-o print-quality=5
Specifies the output quality - draft (3), normal (4), or best (5).
-o sides=one-sided
Prints on one side of the paper.
-o sides=two-sided-long-edge
Prints on both sides of the paper for portrait output.
-o sides=two-sided-short-edge
Prints on both sides of the paper for landscape output.

Notes

The -c, -d, -f, -g, -i, -n, -t, -v, and -w options are not supported by CUPS and produce a warning message if used.

Examples

Print two copies of a document to the default printer:

    lpr -# 2 filename

Print a double-sided legal document to a printer called "foo":

    lpr -P foo -o media=legal -o sides=two-sided-long-edge filename

Print a presentation document 2-up to a printer called "foo":

    lpr -P foo -o number-up=2 filename

See Also

cancel(1), lp(1), lpadmin(8), lpoptions(1), lpq(1), lprm(1), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-subscriptions.conf.html000664 000765 000024 00000002337 13574721672 021573 0ustar00mikestaff000000 000000 subscriptions.conf(5)

subscriptions.conf(5)

Name

subscriptions.conf - subscription configuration file for cups

Description

The subscriptions.conf file defines the local event notification subscriptions that are active. It is normally located in the /etc/cups directory and is maintained by the cupsd(8) program. This file is not intended to be edited or managed manually.

Notes

The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

See Also

classes.conf(5), cups-files.conf(5), cupsd(8), cupsd.conf(5), mime.convs(5), mime.types(5), printers.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/cgi.html000664 000765 000024 00000005120 13574721672 015722 0ustar00mikestaff000000 000000 Using CGI Programs

Using CGI Programs

CUPS provides a dynamic web interface through dedicated CGI programs that are executed when users open special directories on the CUPS server. Each CGI performs administration, class, help, job, and printer functions as directed by the user, but the actual programs that are run and functions that are available are limited to those that were originally designed into the scheduler.

CUPS also supports CGI programs and specific scripting languages (Java, Perl, PHP, and Python) for pages you want to provide. The interpreters for these languages are currently configured at compile time and are associated with MIME media types. Table 1 shows the MIME media types that are reserved for each type of page and are the same as those used by the Apache web server.

Table 1: CGI MIME Media Types
MIME Media Type Description
application/x-httpd-cgi CGI script/program
application/x-httpd-java Java program
application/x-httpd-perl Perl script
application/x-httpd-php PHP script
application/x-httpd-python Python script

Configuring the Server

In order to enable the corresponding type, you must create a new /etc/cups/cgi.types file which maps the filename extensions to the appropriate MIME types, for example:

application/x-httpd-cgi cgi
application/x-httpd-java class
application/x-httpd-perl pl
application/x-httpd-php php
application/x-httpd-python py

CGI scripts/programs (application/x-httpd-cgi) also must be owned by root, have execution permissions, and not have world or group write permissions to be treated as a CGI script or program.

Limitations

CUPS implements most of the CGI/1.1 specification, with the following exceptions:

  • No PATH_INFO or PATH_TRANSLATED support
  • Limited HTTP field support; only the Content-Length (CONTENT_LENGTH), Content-Type (CONTENT_TYPE), Cookie (HTTP_COOKIE), Referrer (HTTP_REFERRER), and User-Agent (HTTP_USER_AGENT) fields are placed in environment variables at this time
cups-2.3.1/doc/help/firewalls.html000664 000765 000024 00000007702 13574721672 017160 0ustar00mikestaff000000 000000 Firewalls

Firewalls

This help document describes the ports that CUPS uses so that firewall administrators can allow traffic used for printing.

Ports Used for Printer Sharing

Table 1 lists the ports that are used for IPP printer sharing via CUPS.

Table 1: Ports Used for IPP Printer Sharing
(Destination) PortTCP/UDPDirectionDescription
53 (DNS)TCP/UDPOUTDomain Name System lookups and service registrations.
631 (IPP/IPPS)TCPINInternet Printing Protocol requests and responses (print jobs, status monitoring, etc.)
5353 (mDNS)UDPIN+OUTMulticast DNS lookups and service registrations.

Table 2 lists the ports that are used for SMB (Windows) printer sharing, typically via the Samba software.

Table 2: Ports Used for SMB Printer Sharing
(Destination) Port(s)TCP/UDPDirectionDescription
137 (WINS)UDPIN+OUTWindows Internet Naming Service (name lookup for SMB printing).
139 (SMB)TCPINWindows SMB printing.
445 (SMBDS)TCPIN+OUTWindows SMB Domain Server (authenticated SMB printing).

Ports Used for Network Printers

Table 3 lists the ports for outgoing network traffic that are used for network printers.

Notes:
  1. DNS and mDNS are used for all printing protocols except SMB.
  2. SNMP is used to provide status and supply level information for AppSocket and LPD printers.
Table 3: Outgoing Ports Used for Network Printers
(Destination) Port(s)TCP/UDPDescription
53 (DNS)TCP/UDPDomain Name System lookups.
137 (WINS)UDPWindows Internet Naming Service (name lookup for SMB printing).
139 (SMB)TCPWindows SMB printing.
161 (SNMP)UDPSNMP browsing (broadcast) and status monitoring (directed to printer IP address).
443 (IPPS)TCPInternet Printing Protocol requests and responses (print jobs, status monitoring, etc.)
445 (SMBDS)TCPWindows SMB Domain Server (authenticated SMB printing).
515 (LPD)TCPLine Printer Daemon (LPD/lpr) print job submission and status monitoring.
631 (IPP/IPPS)TCPInternet Printing Protocol requests and responses (print jobs, status monitoring, etc.)
5353 (mDNS)UDPMulticast DNS lookups.
9100-9102TCPRaw print data stream (AppSocket/JetDirect).
cups-2.3.1/doc/help/man-cupsenable.html000664 000765 000024 00000005745 13574721672 020067 0ustar00mikestaff000000 000000 cupsenable(8)

cupsenable(8)

Name

cupsdisable, cupsenable - stop/start printers and classes

Synopsis

cupsdisable [ -E ] [ -U username ] [ -c ] [ -h server[:port] ] [ -r reason ] [ --hold ] destination(s)
cupsenable [ -E ] [ -U username ] [ -c ] [ -h server[:port] ] [ --release ] destination(s)

Description

cupsenable starts the named printers or classes while cupsdisable stops the named printers or classes.

Options

The following options may be used:
-E
Forces encryption of the connection to the server.
-U username
Uses the specified username when connecting to the server.
-c
Cancels all jobs on the named destination.
-h server[:port]
Uses the specified server and port.
--hold
Holds remaining jobs on the named printer. Useful for allowing the current job to complete before performing maintenance.
-r "reason"
Sets the message associated with the stopped state. If no reason is specified then the message is set to "Reason Unknown".
--release
Releases pending jobs for printing. Use after running cupsdisable with the --hold option to resume printing.

Conforming To

Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are not case-sensitive.

The System V versions of these commands are disable and enable, respectively. They have been renamed to avoid conflicts with the bash(1) build-in commands of the same names.

The CUPS versions of disable and enable may ask the user for an access password depending on the printing system configuration. This differs from the System V versions which require the root user to execute these commands.

See Also

cupsaccept(8), cupsreject(8), cancel(1), lp(1), lpadmin(8), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lprm.html000664 000765 000024 00000004124 13574721672 016706 0ustar00mikestaff000000 000000 lprm(1)

lprm(1)

Name

lprm - cancel print jobs

Synopsis

lprm [ -E ] [ -U username ] [ -h server[:port] ] [ -P destination[/instance] ] [ - ] [ job-id(s) ]

Description

lprm cancels print jobs that have been queued for printing. If no arguments are supplied, the current job on the default destination is canceled. You can specify one or more job ID numbers to cancel those jobs or use the - option to cancel all jobs.

Options

The lprm command supports the following options:
-E
Forces encryption when connecting to the server.
-P destination[/instance]
Specifies the destination printer or class.
-U username
Specifies an alternate username.
-h server[:port]
Specifies an alternate server.

Conforming To

The CUPS version of lprm is compatible with the standard Berkeley command of the same name.

Examples

Cancel the current job on the default printer:

    lprm

Cancel job 1234:

    lprm 1234

Cancel all jobs:

    lprm -

See Also

cancel(1), lp(1), lpq(1), lpr(1), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpinfo.html000664 000765 000024 00000007244 13574721672 017231 0ustar00mikestaff000000 000000 lpinfo(8)

lpinfo(8)

Name

lpinfo - show available devices or drivers (deprecated)

Synopsis

lpinfo [ -E ] [ -h server[:port] ] [ -l ] [ --device-id device-id-string ] [ --exclude-schemes scheme-list ] [ --include-schemes scheme-list ] [ --language locale ] [ --make-and-model name ] [ --product name ] -m
lpinfo [ -E ] [ -h server[:port] ] [ -l ] [ --exclude-schemes scheme-list ] [ --include-schemes scheme-list ] [ --timeout seconds ] -v

Description

lpinfo lists the available devices or drivers known to the CUPS server. The first form (-m) lists the available drivers, while the second form (-v) lists the available devices.

Options

lpinfo accepts the following options:
-E
Forces encryption when connecting to the server.
-h server[:port]
Selects an alternate server.
-l
Shows a "long" listing of devices or drivers.
--device-id device-id-string
Specifies the IEEE-1284 device ID to match when listing drivers with the -m option.
--exclude-schemes scheme-list
Specifies a comma-delimited list of device or PPD schemes that should be excluded from the results. Static PPD files use the "file" scheme.
--include-schemes scheme-list
Specifies a comma-delimited list of device or PPD schemes that should be included in the results. Static PPD files use the "file" scheme.
--language locale
Specifies the language to match when listing drivers with the -m option.
--make-and-model name
Specifies the make and model to match when listing drivers with the -m option.
--product name
Specifies the product to match when listing drivers with the -m option.
--timeout seconds
Specifies the timeout when listing devices with the -v option.

Conforming To

The lpinfo command is unique to CUPS.

Examples

List all devices:

    lpinfo -v

List all drivers:

    lpinfo -m

List drivers matching "HP LaserJet":

    lpinfo --make-and-model "HP LaserJet" -m

Notes

CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

lpadmin(8), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/admin.html000664 000765 000024 00000027241 13574721672 016260 0ustar00mikestaff000000 000000 Command-Line Printer Administration

Command-Line Printer Administration

This help document describes how to configure and manage destinations with CUPS.

Introduction

Destinations are individual printers and classes (pools) of printers. Printers use a description file with one or more driver ("filter") programs that communicate with the printer through a "backend" program. CUPS currently uses PPD (PostScript Printer Description) files to describe the printer and driver programs needed, some of which come with CUPS while others come with your operating system or Linux distribution. Backends are specified using a URI (Universal Resource Identifier) where the URI scheme is the backend name, e.g., "ipp://11.22.33.44/ipp/print" specifies the "ipp" backend - like PPD files, some backends come with CUPS while others come with your operating system.

Classes are associated with one or more printers and are typically used to distribute print jobs amongst a group of printers or provide redundancy or high availability when printing. Print jobs sent to a class are forwarded to the next available printer in the class.

The lpadmin(8) program is used to add, modify, or delete destinations, while the lpinfo(8) command is used to list the available printer drivers and backends. The cupsctl(8) program is used to manage the printing system as a whole, including things like debug logging and printer sharing. The CUPS web interface ("http://localhost:631" or "https://servername:631") can also be used, and most operating systems provide their own GUI administration tools.

Managing Printers

The lpadmin command is used to create, modify, or delete a printer. The -p option specifies a printer to create or modify:

lpadmin -p printername ...

The lpadmin accepts several additional options after -p printername when adding or modifying a printer:

-D "description"
Sets the description of the printer which is often shown instead of the printer name, for example "HP LaserJet".
-E
Enables the printer and accepts new print jobs.
-L "location"
Sets the location of the printer, for example "Conference Room".
-m model
Sets the printer driver using the model name.
-o option=value
Sets the named option.
-v device-uri
Sets the URI for the printer.

The -x option deletes the named printer:

lpadmin -x printername

Printer Drivers and PPDs

The -m option to lpadmin specifies the driver ("model") to use for the printer. You can run the lpinfo -m command to list all of the available drivers ("models") on your system:

lpinfo -m

Each line contains the driver name followed by its description, for example:

drv:///sample.drv/dymo.ppd Dymo Label Printer
drv:///sample.drv/epson9.ppd Epson 9-Pin Series
drv:///sample.drv/epson24.ppd Epson 24-Pin Series
drv:///sample.drv/generpcl.ppd Generic PCL Laser Printer
drv:///sample.drv/generic.ppd Generic PostScript Printer
drv:///sample.drv/deskjet.ppd HP DeskJet Series
drv:///sample.drv/laserjet.ppd HP LaserJet Series PCL 4/5
drv:///sample.drv/intelbar.ppd Intellitech IntelliBar Label Printer, 2.1
drv:///sample.drv/okidata9.ppd Oki 9-Pin Series
drv:///sample.drv/okidat24.ppd Oki 24-Pin Series
drv:///sample.drv/zebracpl.ppd Zebra CPCL Label Printer
drv:///sample.drv/zebraep1.ppd Zebra EPL1 Label Printer
drv:///sample.drv/zebraep2.ppd Zebra EPL2 Label Printer
drv:///sample.drv/zebra.ppd Zebra ZPL Label Printer
everywhere IPP Everywhere

The everywhere driver is used for nearly all modern networks printers sold since about 2009. For example, the following command creates a destination for a printer at IP address 11.22.33.44:

lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere

The CUPS sample drivers (the "drv:///sample.drv/..." lines above) can be used for "legacy" printers. For example, the following command creates a destination for a HP LaserJet printer at IP address 11.22.33.44:

lpadmin -p printername -E -v socket://11.22.33.44 -m drv:///sample.drv/laserjet.ppd
Note: The CUPS sample drivers are designed to provide basic printing capabilities for the broadest range of printers possible, but generally do not exercise the full potential of the printers or CUPS. Other drivers (including the everywhere driver) provide greater printing capabilities and better print quality.

Device URIs (Backends)

CUPS comes with several standard backends that communicate with printers:

  1. dnssd: The Bonjour (DNS-SD) protocol.
  2. ipp: The Internet Printing Protocol (IPP) with optional encryption.
  3. ipps: The Internet Printing Protocol with mandatory encryption.
  4. lpd: The Line Printer Daemon protocol.
  5. socket: The AppSocket (JetDirect) protocol.
  6. usb: The Universal Serial Bus (USB) printer class.

Run the lpinfo -v command to list the available backends and printers:

lpinfo -v

Each line contains the backend "class" followed by the backend name or a full printer device URI, for example:

network lpd
network ipps
network ipp
network socket
network dnssd://Acme%20Laser%20Pro._ipp._tcp.local./?uuid=545253fb-1cb7-4d8d-98ed-ab6cd607cea7
network dnssd://Bar99._printer.tcp.local./?uuid=f9efff58-9086-4c95-accb-81dee876a475
network dnssd://Example%20EX-42._ipps._tcp.local./?uuid=4a0c67ad-2824-4ddf-9115-7d4226c5fe65
network dnssd://Foo%20Fighter-1969._pdl-datastream._tcp.local./?uuid=4e216bea-c3de-4f65-a710-c99e11c80d2b
direct usb://ZP/LazerJet%20MFP?serial=42

The network class of backends is used for all network protocols. The Using Network Printers help document describes how to use the standard CUPS network backends. The direct class of backends is used for directly-connected printers such as USB and Bluetooth. Because these backends use a system-specific identifier, you should only use the reported device URIs.

Once you know the correct URI for the printer, set it using the lpadmin command's -v option:

lpadmin -p printername -v device-uri

Printer Options

The lpadmin command allows you to set various options for a printer:

-o cupsIPPSupplies=false
Turns off IPP supply level reporting for a printer.
-o cupsSNMPSupplies=false
Turns off SNMP supply level reporting for a printer.
-o name=value
Sets the default value for the named PPD option. For example, -o PageSize=Legal sets the default page size to US Legal.
-o printer-error-policy=name
Sets the policy for errors such as printers that cannot be found or accessed, don't support the format being printed, fail during submission of the print data, or cause one or more filters to crash:
abort-job
Aborts the job on error.
retry-job
Retries the job at a future time.
retry-current-job
Retries the current job immediately.
stop-printer
Stops the printer on error.
-o printer-is-shared=true/false
Enables/disables per-printer sharing. See the section on Printer Sharing for more information.
-o printer-op-policy=name
Sets the operation policy associated with the printer. See the Managing Operation Policies help document for more information.
-u allow:{user|@group}{,user|,@group}*
-u allow:all
-u deny:{user|@group}{,user|,@group}*
-u deny:none
Sets user-level access control for the printer. The allow: list defines a whitelist of users and groups while the deny: list defines a blacklist of users and groups.

Printer Sharing

CUPS supports sharing of printers with other computers and mobile devices. Two cupsctl options control the general printer sharing features:

--share-printers
Enables sharing of printers with other computers and mobile devices on your local network.
--remote-any
Expands printer sharing to any network that can reach your server.

Once you have enabled printer sharing, you then must select which printers will be shared using the lpadmin command and the -o printer-is-shared=true option.

For example, to share two printers ("foo" and "bar") on the local network, run the following commands:

cupsctl --share-printers
lpadmin -p foo -o printer-is-shared=true
lpadmin -p bar -o printer-is-shared=true

Managing Classes

The lpadmin command is used to create, modify, or delete a class. The -c option specifies a class to create or modify and is combined with the -p option:

lpadmin -p printername -c classname

The -r option specifies that the named printer is removed from the class:

lpadmin -p printername -r classname

The -x option deletes the named class:

lpadmin -x classname

Debug Logging and Troubleshooting

The printing system log files track the activity of the scheduler, printer drivers, and backends. If problems occur and the log files do not provide sufficient details to diagnose the problem, you can enable debug logging using the cupsctl command:

cupsctl --debug-logging

To disable debug logging, run the same command with the --no-debug-logging option:

cupsctl --no-debug-logging
cups-2.3.1/doc/help/api-admin.html000664 000765 000024 00000047767 13574721672 017046 0ustar00mikestaff000000 000000 Administration APIs

Administrative APIs

Header cups/adminutil.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS API
Programming: HTTP and IPP APIs

Overview

The administrative APIs provide convenience functions to perform certain administrative functions with the CUPS scheduler.

Note:

Administrative functions normally require administrative privileges to execute and must not be used in ordinary user applications!

Scheduler Settings

The cupsAdminGetServerSettings and cupsAdminSetServerSettings functions allow you to get and set simple directives and their values, respectively, in the cupsd.conf file for the CUPS scheduler. Settings are stored in CUPS option arrays which provide a simple list of string name/value pairs. While any simple cupsd.conf directive name can be specified, the following convenience names are also defined to control common complex directives:

  • CUPS_SERVER_DEBUG_LOGGING
  • : For cupsAdminGetServerSettings, a value of "1" means that the LogLevel directive is set to debug or debug2 while a value of "0" means it is set to any other value. For cupsAdminSetServerSettings a value of "1" sets the LogLeveL to debug while a value of "0" sets it to warn.
  • CUPS_SERVER_REMOTE_ADMIN
  • : A value of "1" specifies that administrative requests are accepted from remote addresses while "0" specifies that requests are only accepted from local addresses (loopback interface and domain sockets).
  • CUPS_SERVER_REMOTE_ANY
  • : A value of "1" specifies that requests are accepts from any address while "0" specifies that requests are only accepted from the local subnet (when sharing is enabled) or local addresses (loopback interface and domain sockets).
  • CUPS_SERVER_SHARE_PRINTERS
  • : A value of "1" specifies that printer sharing is enabled for selected printers and remote requests are accepted while a value of "0" specifies that printer sharing is disables and remote requests are not accepted.
  • CUPS_SERVER_USER_CANCEL_ANY
  • : A value of "1" specifies that the default security policy allows any user to cancel any print job, regardless of the owner. A value of "0" specifies that only administrative users can cancel other user's jobs.
Note:

Changing settings will restart the CUPS scheduler.

When printer sharing or the web interface are enabled, the scheduler's launch-on-demand functionality is effectively disabled. This can affect power usage, system performance, and the security profile of a system.

The recommended way to make changes to the cupsd.conf is to first call cupsAdminGetServerSettings, make any changes to the returned option array, and then call cupsAdminSetServerSettings to save those settings. For example, to enable the web interface:

#include <cups/cups.h>
#include <cups/adminutil.h>

void
enable_web_interface(void)
{
  int num_settings = 0;           /* Number of settings */
  cups_option_t *settings = NULL; /* Settings */


  if (!cupsAdminGetServerSettings(CUPS_HTTP_DEFAULT, &num_settings, &settings))
  {
    fprintf(stderr, "ERROR: Unable to get server settings: %s\n", cupsLastErrorString());
    return;
  }

  num_settings = cupsAddOption("WebInterface", "Yes", num_settings, &settings);

  if (!cupsAdminSetServerSettings(CUPS_HTTP_DEFAULT, num_settings, settings))
  {
    fprintf(stderr, "ERROR: Unable to set server settings: %s\n", cupsLastErrorString());
  }

  cupsFreeOptions(num_settings, settings);
}

Devices

Printers can be discovered through the CUPS scheduler using the cupsGetDevices API. Typically this API is used to locate printers to add the the system. Each device that is found will cause a supplied callback function to be executed. For example, to list the available printer devices that can be found within 30 seconds:

#include <cups/cups.h>
#include <cups/adminutil.h>


void
get_devices_cb(
    const char *device_class,           /* I - Class */
    const char *device_id,              /* I - 1284 device ID */
    const char *device_info,            /* I - Description */
    const char *device_make_and_model,  /* I - Make and model */
    const char *device_uri,             /* I - Device URI */
    const char *device_location,        /* I - Location */
    void       *user_data)              /* I - User data */
{
  puts(device_uri);
}


void
show_devices(void)
{
  cupsGetDevices(CUPS_HTTP_DEFAULT, 30, NULL, NULL, get_devices_cb, NULL);
}

Functions

 DEPRECATED cupsAdminCreateWindowsPPD

Create the Windows PPD file for a printer.

char *cupsAdminCreateWindowsPPD(http_t *http, const char *dest, char *buffer, int bufsize);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
dest Printer or class
buffer Filename buffer
bufsize Size of filename buffer

Return Value

PPD file or NULL

 DEPRECATED cupsAdminExportSamba

Export a printer to Samba.

int cupsAdminExportSamba(const char *dest, const char *ppd, const char *samba_server, const char *samba_user, const char *samba_password, FILE *logfile);

Parameters

dest Destination to export
ppd PPD file
samba_server Samba server
samba_user Samba username
samba_password Samba password
logfile Log file, if any

Return Value

1 on success, 0 on failure

 CUPS 1.3/macOS 10.5 cupsAdminGetServerSettings

Get settings from the server.

int cupsAdminGetServerSettings(http_t *http, int *num_settings, cups_option_t **settings);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
num_settings Number of settings
settings Settings

Return Value

1 on success, 0 on failure

Discussion

The returned settings should be freed with cupsFreeOptions() when you are done with them.

 CUPS 1.3/macOS 10.5 cupsAdminSetServerSettings

Set settings on the server.

int cupsAdminSetServerSettings(http_t *http, int num_settings, cups_option_t *settings);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
num_settings Number of settings
settings Settings

Return Value

1 on success, 0 on failure

 DEPRECATED cupsGetDevices

Get available printer devices.

ipp_status_t cupsGetDevices(http_t *http, int timeout, const char *include_schemes, const char *exclude_schemes, cups_device_cb_t callback, void *user_data);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
timeout Timeout in seconds or CUPS_TIMEOUT_DEFAULT
include_schemes Comma-separated URI schemes to include or CUPS_INCLUDE_ALL
exclude_schemes Comma-separated URI schemes to exclude or CUPS_EXCLUDE_NONE
callback Callback function
user_data User data pointer

Return Value

Request status - IPP_OK on success.

Discussion

This function sends a CUPS-Get-Devices request and streams the discovered devices to the specified callback function. The "timeout" parameter controls how long the request lasts, while the "include_schemes" and "exclude_schemes" parameters provide comma-delimited lists of backends to include or omit from the request respectively.

This function is deprecated with the IPP printer discovery functionality being provided by the cupsEnumDests and @cupsGetDests@ functions.

Data Types

 CUPS 1.4/macOS 10.6 cups_device_cb_t

Device callback

typedef void (*cups_device_cb_t)(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, void *user_data);

cups-2.3.1/doc/help/man-cups-files.conf.html000664 000765 000024 00000030415 13574721672 020734 0ustar00mikestaff000000 000000 cups-files.conf(5)

cups-files.conf(5)

Name

cups-files.conf - file and directory configuration file for cups

Description

The cups-files.conf file configures the files and directories used by the CUPS scheduler, cupsd(8). It is normally located in the /etc/cups directory.

Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character.

Directives

The following directives are understood by cupsd(8):
AccessLog
AccessLog filename
AccessLog stderr
AccessLog syslog
Defines the access log filename. Specifying a blank filename disables access log generation. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. The server name may be included in filenames using the string "%s", for example:

    AccessLog /var/log/cups/%s-access_log

The default is "/var/log/cups/access_log".
CacheDir directory
Specifies the directory to use for long-lived temporary (cache) files. The default is "/var/spool/cups/cache" or "/var/cache/cups" depending on the platform.
ConfigFilePerm mode
Specifies the permissions for all configuration files that the scheduler writes. The default is "0644" on macOS and "0640" on all other operating systems.

Note: The permissions for the printers.conf file are currently masked to only allow access from the scheduler user (typically root). This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system. There is no way to disable this security feature.

CreateSelfSignedCerts yes
CreateSelfSignedCerts no
Specifies whether the scheduler automatically creates self-signed certificates for client connections using TLS. The default is yes.
DataDir path
Specifies the directory where data files can be found. The default is usually "/usr/share/cups".
DocumentRoot directory
Specifies the root directory for the CUPS web interface content. The default is usually "/usr/share/doc/cups".
ErrorLog
ErrorLog filename
ErrorLog stderr
ErrorLog syslog
Defines the error log filename. Specifying a blank filename disables error log generation. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. The server name may be included in filenames using the string "%s", for example:

    ErrorLog /var/log/cups/%s-error_log

The default is "/var/log/cups/error_log".
FatalErrors none
FatalErrors all -kind [ ... -kind ]
FatalErrors kind [ ... kind ]
Specifies which errors are fatal, causing the scheduler to exit. The default is "config". The kind strings are:
none
No errors are fatal.
all
All of the errors below are fatal.
browse
Browsing initialization errors are fatal, for example failed connections to the DNS-SD daemon.
config
Configuration file syntax errors are fatal.
listen
Listen or Port errors are fatal, except for IPv6 failures on the loopback or "any" addresses.
log
Log file creation or write errors are fatal.
permissions
Bad startup file permissions are fatal, for example shared TLS certificate and key files with world-read permissions.
Group group-name-or-number
Specifies the group name or ID that will be used when executing external programs. The default group is operating system specific but is usually "lp" or "nobody".
LogFilePerm mode
Specifies the permissions of all log files that the scheduler writes. The default is "0644".
PageLog [ filename ]
PageLog stderr
PageLog syslog
Defines the page log filename. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. Specifying a blank filename disables page log generation. The server name may be included in filenames using the string "%s", for example:

    PageLog /var/log/cups/%s-page_log

The default is "/var/log/cups/page_log".
PassEnv variable [ ... variable ]
Passes the specified environment variable(s) to child processes. Note: the standard CUPS filter and backend environment variables cannot be overridden using this directive.
RemoteRoot username
Specifies the username that is associated with unauthenticated accesses by clients claiming to be the root user. The default is "remroot".
RequestRoot directory
Specifies the directory that contains print jobs and other HTTP request data. The default is "/var/spool/cups".
Sandboxing relaxed
Sandboxing strict
Specifies the level of security sandboxing that is applied to print filters, backends, and other child processes of the scheduler. The default is "strict". This directive is currently only used/supported on macOS.
ServerBin directory
Specifies the directory containing the backends, CGI programs, filters, helper programs, notifiers, and port monitors. The default is "/usr/lib/cups" or "/usr/libexec/cups" depending on the platform.
ServerKeychain path
Specifies the location of TLS certificates and private keys. The default is "/Library/Keychains/System.keychain" on macOS and "/etc/cups/ssl" on all other operating systems. macOS uses its keychain database to store certificates and keys while other platforms use separate files in the specified directory, *.crt for PEM-encoded certificates and *.key for PEM-encoded private keys.
ServerRoot directory
Specifies the directory containing the server configuration files. The default is "/etc/cups".
SetEnv variable value
Set the specified environment variable to be passed to child processes. Note: the standard CUPS filter and backend environment variables cannot be overridden using this directive.
StateDir directory
Specifies the directory to use for PID and local certificate files. The default is "/var/run/cups" or "/etc/cups" depending on the platform.
SyncOnClose Yes
SyncOnClose No
Specifies whether the scheduler calls fsync(2) after writing configuration or state files. The default is "No".
SystemGroup group-name [ ... group-name ]
Specifies the group(s) to use for @SYSTEM group authentication. The default contains "admin", "lpadmin", "root", "sys", and/or "system".
TempDir directory
Specifies the directory where short-term temporary files are stored. The default is "/var/spool/cups/tmp".
User username
Specifies the user name or ID that is used when running external programs. The default is "lp".

Deprecated Directives

The following directives are deprecated and will be removed from a future version of CUPS:
FileDevice Yes
FileDevice No
Specifies whether the file pseudo-device can be used for new printer queues. The URI "file:///dev/null" is always allowed. File devices cannot be used with "raw" print queues - a PPD file is required. The specified file is overwritten for every print job. Writing to directories is not supported.
FontPath directory[:...:directoryN]
Specifies a colon separated list of directories where fonts can be found. On Linux the font-config(1) mechanism is used instead. On macOS the Font Book application manages system-installed fonts.
LPDConfigFile filename
Specifies the LPD service configuration file to update.
Printcap filename
Specifies a file that is filled with a list of local print queues.
PrintcapFormat bsd
PrintcapFormat plist
PrintcapFormat solaris
Specifies the format to use for the Printcap file. "bsd" is the historical LPD printcap file format. "plist" is the Apple plist file format. "solaris" is the historical Solaris LPD printcap file format.
SMBConfigFile filename
Specifies the SMB service configuration file to update.

Notes

The scheduler MUST be restarted manually after making changes to the cups-files.conf file. On Linux this is typically done using the systemctl(8) command, while on macOS the launchctl(8) command is used instead.

See Also

classes.conf(5), cups(1), cupsd(8), cupsd.conf(5), mime.convs(5), mime.types(5), printers.conf(5), subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-ppdc.html000664 000765 000024 00000007003 13574721672 016661 0ustar00mikestaff000000 000000 ppdc(1)

ppdc(1)

Name

ppdc - cups ppd compiler (deprecated)

Synopsis

ppdc [ -D name[=value] ] [ -I include-directory ] [ -c message-catalog ] [ -d output-directory ] [ -l language(s) ] [ -m ] [ -t ] [ -v ] [ -z ] [ --cr ] [ --crlf ] [ --lf ] source-file

Description

ppdc compiles PPDC source files into one or more PPD files. This program is deprecated and will be removed in a future release of CUPS.

Options

ppdc supports the following options:
-D name[=value]
Sets the named variable for use in the source file. It is equivalent to using the #define directive in the source file.
-I include-directory
Specifies an alternate include directory. Multiple -I options can be supplied to add additional directories.
-c message-catalog
Specifies a single message catalog file in GNU gettext (filename.po) or Apple strings (filename.strings) format to be used for localization.
-d output-directory
Specifies the output directory for PPD files. The default output directory is "ppd".
-l language(s)
Specifies one or more languages to use when localizing the PPD file(s). The default language is "en" (English). Separate multiple languages with commas, for example "de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD files with German, UK English, Spanish (Spain, Mexico, and US), French (France and Canada), and Italian languages in each file.
-m
Specifies that the output filename should be based on the ModelName value instead of FileName or PCFilenName.
-t
Specifies that PPD files should be tested instead of generated.
-v
Specifies verbose output, basically a running status of which files are being loaded or written. -z Generates compressed PPD files (filename.ppd.gz). The default is to generate uncompressed PPD files.
--cr
--crlf
--lf
Specifies the line ending to use - carriage return, carriage return and line feed, or line feed alone. The default is to use the line feed character alone.

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpoptions.html000664 000765 000024 00000007600 13574721672 017765 0ustar00mikestaff000000 000000 lpoptions(1)

lpoptions(1)

Name

lpoptions - display or set printer options and defaults

Synopsis

lpoptions [ -E ] [ -h server[:port] ] -d destination[/instance] [ -l ]
lpoptions [ -E ] [ -h server[:port] ] [ -p destination[/instance] ] -o option[=value] ...
lpoptions [ -E ] [ -h server[:port] ] [ -p destination[/instance] ] -r option
lpoptions [ -E ] [ -h server[:port] ] -x destination[/instance]

Description

lpoptions displays or sets printer options and defaults. If no printer is specified using the -p option, the default printer is used as described in lp(1).

If no -l, -o, or -r options are specified, the current options are reported on the standard output.

Options set with the lpoptions command are used by the lp(1) and lpr(1) commands when submitting jobs.

When run by the root user, lpoptions gets and sets default options and instances for all users in the /etc/cups/lpoptions file. Otherwise, the per-user defaults are managed in the ~/.cups/lpoptions file.

Options

lpoptions supports the following options:
-E
Enables encryption when communicating with the CUPS server.
-d destination[/instance]
Sets the user default printer to destination. If instance is supplied then that particular instance is used. This option overrides the system default printer for the current user.
-h server[:port]
Uses an alternate server.
-l
Lists the printer specific options and their current settings.
-o option[=value]
Specifies a new option for the named destination.
-p destination[/instance]
Sets the destination and instance, if specified, for any options that follow. If the named instance does not exist then it is created. Destinations can only be created using the lpadmin(8) program.
-r option
Removes the specified option from the named destination.
-x destination[/instance]
Removes the options for the named destination and instance, if specified. If the named instance does not exist then this does nothing. Destinations can only be removed using the lpadmin(8) command.

Files

~/.cups/lpoptions - user defaults and instances created by non-root users.
/etc/cups/lpoptions - system-wide defaults and instances created by the root user.

Conforming To

The lpoptions command is unique to CUPS.

See Also

cancel(1), lp(1), lpadmin(8), lpr(1), lprm(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/spec-command.html000664 000765 000024 00000014122 13574721672 017530 0ustar00mikestaff000000 000000 CUPS Command File Format

CUPS Command File Format

Introduction

This specification describes the CUPS command file format (application/vnd.cups-command) which is used to send printer maintenance commands to a printer in a device-independent way. The current specification supports basic maintenance functions such as head cleaning and self-test pages and query functions such as auto-configure, report supply levels, and report status.

Printer drivers advertise support for the CUPS command file format by providing a filter for the application/vnd.cups-command file type. Applications can determine if a printer supports printing of CUPS command files by checking the printer-type attribute for the CUPS_PRINTER_COMMANDS capability bit.

In addition, the PPD file for a printer can contain a cupsCommands keyword that provides a list of supported commands separated by spaces, for example:

*cupsCommands: "AutoConfigure Clean PrintSelfTestPage ReportLevels ReportStatus"

If no cupsCommands keyword is provided, the command filter must support AutoConfigure, Clean, PrintSelfTestPage, and ReportLevels. The scheduler also provides the printer-commands attribute containing the list of supported commands.

File Syntax

CUPS command files are ASCII text files. The first line of a CUPS command file MUST contain:

#CUPS-COMMAND

After that, each line is either a command or a comment. Comments begin with the # character, e.g.:

# This is a comment

Commands are any sequence of letters, numbers, and punctuation characters optionally followed by parameters separated by whitespace, e.g.:

Clean all
PrintSelfTestPage

Command names are case-insensitive, so "PRINTSELFTESTPAGE", "printselftestpage", and "PrintSelfTestPage" are equivalent. Vendor-specific commands should use a domain name prefix, e.g.:

com.vendor.foo
com.vendor.bar param param2 ... paramN

Standard Commands

The following are the standard commands supported by the format. The only required command is PrintSelfTestPage.

AutoConfigure

AutoConfigure

The AutoConfigure command updates the printer's PPD file and driver state information to reflect the current configuration of the printer. There are no arguments for this command.

Example:

#CUPS-COMMAND
AutoConfigure

Clean

Clean colorname

The Clean command performs a standard print head cleaning. The "colorname" parameter specifies which color or head to clean. If a printer does not support cleaning of individual colors or cartridges, then all colors are cleaned. Command filters MUST support the "all" colorname. Other standard color names include "black", "color", "photo", "cyan", "magenta", "yellow", "light-cyan", "light-magenta", "light-black", "light-gray", and "dark-gray".

Example:

#CUPS-COMMAND
Clean all

PrintAlignmentPage

PrintAlignmentPage pass

The PrintAlignmentPage command prints a head alignment page on the printer. The "pass" parameter provides a pass number from 1 to N. The number of passes is device-dependent.

Example:

#CUPS-COMMAND
PrintAlignmentPage 1

PrintSelfTestPage

PrintSelfTestPage

The PrintSelfTestPage command prints a self-test page on the printer. Typically this page shows whether all jets on a print head are functioning and that the print feed mechanisms are working properly.

Example:

#CUPS-COMMAND
PrintSelfTestPage

ReportLevels

ReportLevels

The ReportLevels command queries the supply levels on a printer and reports "marker-colors", "marker-levels", "marker-names", and "marker-types" attributes using "ATTR:" messages sent to the scheduler. This command should also report the current printer status using "STATE:" messages like the ReportStatus command.

Example:

#CUPS-COMMAND
ReportLevels

ReportStatus

ReportStatus

The ReportStatus command queries the printer for its current status and reports it using "STATE:" messages sent to the scheduler.

Example:

#CUPS-COMMAND
ReportLevels

SetAlignment

SetAlignment pass value ... valueN

The SetAlignment command sets print head alignment values. The "pass" parameter is a number from 1 to N. All parameters are device-dependent.

Example:

#CUPS-COMMAND
SetAlignment 1 14
cups-2.3.1/doc/help/man-classes.conf.html000664 000765 000024 00000002235 13574721672 020316 0ustar00mikestaff000000 000000 classes.conf(5)

classes.conf(5)

Name

classes.conf - class configuration file for cups

Description

The classes.conf file defines the local printer classes that are available. It is normally located in the /etc/cups directory and is maintained by the cupsd(8) program. This file is not intended to be edited or managed manually.

Notes

The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

See Also

cupsd(8), cupsd.conf(5), mime.convs(5), mime.types(5), printers.conf(5), subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/license.html000664 000765 000024 00000027442 13574721672 016615 0ustar00mikestaff000000 000000 Apache License Version 2.0

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

  1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
  2. You must cause any modified files to carry prominent notices stating that You changed the files; and
  3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
  4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

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 CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

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.

cups-2.3.1/doc/help/man-cupsctl.html000664 000765 000024 00000005620 13574721672 017413 0ustar00mikestaff000000 000000 cupsctl(8)

cupsctl(8)

Name

cupsctl - configure cupsd.conf options

Synopsis

cupsctl [ -E ] [ -U username ] [ -h server[:port] ] [ --[no-]debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] [ name=value ]

Description

cupsctl updates or queries the cupsd.conf file for a server. When no changes are requested, the current configuration values are written to the standard output in the format "name=value", one per line.

Options

The following options are recognized:
-E
Enables encryption on the connection to the scheduler.
-U username
Specifies an alternate username to use when authenticating with the scheduler.
-h server[:port]
Specifies the server address.
--[no-]debug-logging
Enables (disables) debug logging to the error_log file.
--[no-]remote-admin
Enables (disables) remote administration.
--[no-]remote-any
Enables (disables) printing from any address, e.g., the Internet.
--[no-]share-printers
Enables (disables) sharing of local printers with other computers.
--[no-]user-cancel-any
Allows (prevents) users to cancel jobs owned by others.

Examples

Display the current settings:

    cupsctl

Enable debug logging:

    cupsctl --debug-logging

Get the current debug logging state:

    cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'

Disable printer sharing:

    cupsctl --no-share-printers

Known Issues

You cannot set the Listen or Port directives using cupsctl.

See Also

cupsd.conf(5), cupsd(8),
CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-ippfind.html000664 000765 000024 00000023345 13574721672 017373 0ustar00mikestaff000000 000000 ippfind(1)

ippfind(1)

Name

ippfind - find internet printing protocol printers

Synopsis

ippfind [ options ] regtype[,subtype][.domain.] ... [ expression ... ]
ippfind [ options ] name[.regtype[.domain.]] ... [ expression ... ]
ippfind --help
ippfind --version

Description

ippfind finds services registered with a DNS server or available through local devices. Its primary purpose is to find IPP printers and show their URIs, show their current status, or run commands.

Registration Types

ippfind supports the following registration types:
_http._tcp
HyperText Transport Protocol (HTTP, RFC 2616)
_https._tcp
Secure HyperText Transport Protocol (HTTPS, RFC 2818)
_ipp._tcp
Internet Printing Protocol (IPP, RFC 2911)
_ipps._tcp
Secure Internet Printing Protocol (IPPS, draft)
_printer._tcp
Line Printer Daemon (LPD, RFC 1179)

Expressions

ippfind supports expressions much like the find(1) utility. However, unlike find(1), ippfind uses POSIX regular expressions instead of shell filename matching patterns. If --exec, -l, --ls, -p, --print, --print-name, -q, --quiet, -s, or -x is not specified, ippfind adds --print to print the service URI of anything it finds. The following expressions are supported:
-d regex
--domain regex
True if the domain matches the given regular expression.
--false
Always false.
-h regex
--host regex
True is the hostname matches the given regular expression.
-l
--ls
Lists attributes returned by Get-Printer-Attributes for IPP printers and traditional find "-ls" output for HTTP URLs. The result is true if the URI is accessible, false otherwise.
--local
True if the service is local to this computer.
-N name
--literal-name name
True if the service instance name matches the given name.
-n regex
--name regex
True if the service instance name matches the given regular expression.
--path regex
True if the URI resource path matches the given regular expression.
-P number[-number]
--port number[-number]
True if the port matches the given number or range.
-p
--print
Prints the URI if the result of previous expressions is true. The result is always true.
-q
--quiet
Quiet mode - just returns the exit codes below.
-r
--remote
True if the service is not local to this computer.
-s
--print-name
Prints the service instance name if the result of previous expressions is true. The result is always true.
--true
Always true.
-t key
--txt key
True if the TXT record contains the named key.
--txt-key regex
True if the TXT record contains the named key and matches the given regular expression.
-u regex
--uri regex
True if the URI matches the given regular expression.
-x utility [ argument ... ] ;
--exec utility [ argument ... ] ;
Executes the specified program if the current result is true. "{foo}" arguments are replaced with the corresponding value - see SUBSTITUTIONS below.

Expressions may also contain modifiers:

( expression )
Group the result of expressions.
! expression
--not expression
Unary NOT of the expression.
expression expression
expression --and expression
Logical AND of expressions.
expression --or expression
Logical OR of expressions.

Substitutions

The substitutions for "{foo}" in -e and --exec are:
{service_domain}
Domain name, e.g., "example.com.", "local.", etc.
{service_hostname}
Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
{service_name}
Service instance name, e.g., "My Fine Printer".
{service_port}
Port number for server, typically 631 for IPP and 80 for HTTP.
{service_regtype}
DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
{service_scheme}
URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
{}
{service_uri}
URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc.
{txt_key}
Value of TXT record key (lowercase).

Options

ippfind supports the following options:
--help
Show program help.
--version
Show program version.
-4
Use IPv4 when listing.
-6
Use IPv6 when listing.
-T seconds
Specify find timeout in seconds. If 1 or less, ippfind stops as soon as it thinks it has found everything. The default timeout is 1 second.
-V version
Specifies the IPP version when listing. Supported values are "1.1", "2.0", "2.1", and "2.2".

Exit Status

ippfind returns 0 if the result for all processed expressions is true, 1 if the result of any processed expression is false, 2 if browsing or any query or resolution failed, 3 if an undefined option or invalid expression was specified, and 4 if it ran out of memory.

Environment

When executing a program, ippfind sets the following environment variables for the matching service registration:
IPPFIND_SERVICE_DOMAIN
Domain name, e.g., "example.com.", "local.", etc.
IPPFIND_SERVICE_HOSTNAME
Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
IPPFIND_SERVICE_NAME
Service instance name, e.g., "My Fine Printer".
IPPFIND_SERVICE_PORT
Port number for server, typically 631 for IPP and 80 for HTTP.
IPPFIND_SERVICE_REGTYPE
DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
IPPFIND_SERVICE_SCHEME
URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
IPPFIND_SERVICE_URI
URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc.
IPPFIND_TXT_fIKEYfR
Values of TXT record KEY (uppercase).

Examples

To show the status of all registered IPP printers on your network, run:

    ippfind --ls

Similarly, to send a PostScript test page to every PostScript printer, run:

    ippfind --txt-pdl application/postscript --exec ipptool
      -f onepage-letter.ps '{}' print-job.test \;

See Also

ipptool(1)

Copyright

Copyright © 2013-2019 by Apple Inc. cups-2.3.1/doc/help/network.html000664 000765 000024 00000045102 13574721672 016655 0ustar00mikestaff000000 000000 Using Network Printers

Using Network Printers

This help document describes how to discover, configure, and use TCP/IP network printers with CUPS.

Automatic Configuration Using Bonjour

Most network printers support a protocol known as Bonjour, which is a combination of zero-configuration networking ("ZeroConf"), multicast DNS (mDNS), and DNS service discovery (DNS-SD) standards published by the Internet Engineering Task Force (IETF), the same group that defined TCP/IP and all of the networking we use today.

A printer that supports Bonjour can be found automatically using the dnssd backend. Run the lpinfo(8) command to find your printer's URI:

lpinfo --include-schemes dnssd -v
network dnssd://Acme%20Laser%20Pro._ipp._tcp.local./?uuid=545253fb-1cb7-4d8d-98ed-ab6cd607cea7
network dnssd://Bar99._printer.tcp.local./?uuid=f9efff58-9086-4c95-accb-81dee876a475
network dnssd://Example%20EX-42._ipps._tcp.local./?uuid=4a0c67ad-2824-4ddf-9115-7d4226c5fe65
network dnssd://Foo%20Fighter-1969._pdl-datastream._tcp.local./?uuid=4e216bea-c3de-4f65-a710-c99e11c80d2b

You can then add a printer using the URI reported.

Manual Configuration Using IP Addresses

You can also manually configure a printer using its Internet Protocol v4 (IPv4) address. This address is either configured manually ("static IP") through the printer's control panel or set using an automatic network protocol such as the Dynamic Host Control Protocol (DHCP) or ZeroConf.

Note: Configuring a printer using an IP address set using DHCP or ZeroConf is not recommended since the address will change every time the printer is turned on or after long periods of inactivity. Thus, every time the address changes you will need to modify the print queue using the lpadmin command.

Finding the IP Address

You can normally find the IP address of a printer on the printer's control panel or by printing the configuration or status page. The Simple Network Management Protocol (SNMP) can also be used to get the IP address remotely. To test that the IP address has been successfully assigned and that the printer is properly connected to your LAN or Wi-Fi network, type:

ping ip-address

where "ip-address" is the address reported by the printer's control panel, configuration page, and/or status page. If the connection is working properly you will see something like:

ping 10.0.1.42
PING 10.0.1.42 (10.0.1.42): 56 data bytes
64 bytes from 10.0.1.42: icmp_seq=0 ttl=15 time=1.123 ms
64 bytes from 10.0.1.42: icmp_seq=1 ttl=15 time=2.034 ms
64 bytes from 10.0.1.42: icmp_seq=2 ttl=15 time=1.765 ms
64 bytes from 10.0.1.42: icmp_seq=3 ttl=15 time=1.234 ms
...

If the connection is not working properly you will see something like:

ping 10.0.1.42
PING 10.0.1.42 (10.0.1.42): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
...

Press CTRL+C to quit the ping command.

Note: If the command does not show responses from the printer, verify that the printer or print server is powered on and connected to the same LAN or Wi-Fi network as your computer. For LAN connections, also verify that your network cabling is good.

Choosing a Network Protocol (Backend)

CUPS supports most network printers using one of three TCP/IP-based protocols: AppSocket, Internet Printing Protocol, and Line Printer Daemon. The following sections describe the options for each of the backends.

AppSocket Protocol (aka JetDirect)

The AppSocket protocol (sometimes also called the JetDirect protocol, owing to its origins with the HP JetDirect network interfaces) is the simplest and fastest network protocol used for printers. AppSocket printing normally happens over port 9100 and uses the socket backend. Device URIs for the socket backend look like this:

socket://ip-address
socket://ip-address/?contimeout=30
socket://ip-address/?waiteof=false
socket://ip-address/?contimeout=30&waiteof=false
socket://ip-address:port-number/?...

The "contimeout" option controls the number of seconds that the backend will wait to obtain a connection to the printer. The default is 1 week or 604800 seconds.

The "waiteof" option controls whether the socket backend waits for the printer to complete the printing of the job. The default is to wait (waiteof=true). Add waiteof=false to the URI to tell the backend not to wait.

Note: While the AppSocket protocol is simple and fast, it also offers no security and is often an attack vector with printers. Consider using the Internet Printing Protocol which supports encryption and other security features.

Internet Printing Protocol (IPP)

IPP is the only protocol that CUPS supports natively and is supported by most network printers and print servers. IPP supports encryption and other security features over port 631 and uses the http (Windows), ipp, and ipps backends. Device URIs for these backends look like this:

http://ip-address-or-hostname:port-number/printers/name/.printer
ipp://ip-address/ipp/print
ipp://ip-address-or-hostname/printers/name
ipps://ip-address/ipp/print
ipps://ip-address:443/ipp/print
ipps://ip-address-or-hostname/printers/name

The backends supports many options, which are summarized in Table 2. Like all backends, options are added to the end of the URI using the URL form encoding format, for example:

ipp://10.0.1.42/ipp/print?version=1.1
ipps://10.0.1.42:443/ipp/print?waitjob=false&waitprinter=false
Table 2: IPP URI Options
Option Description
contimeout=seconds Specifies the number of seconds to wait for the connection to the printer to complete (default 1 week or 604800 seconds).
encryption=always Specifies that the connection to the IPP printer should be encrypted using SSL.
encryption=ifrequested Specifies that the connection to the IPP printer should only be encrypted if the printer requests it.
encryption=never Specifies that the connection to the IPP printer should not be encrypted.
encryption=required Specifies that the connection to the IPP printer should be encrypted using TLS.
version=1.0 Specifies that version 1.0 of the IPP protocol should be used instead of the default version 2.0.
version=1.1 Specifies that version 1.1 of the IPP protocol should be used instead of the default version 2.0.
version=2.1 Specifies that version 2.1 of the IPP protocol should be used instead of the default version 2.0.
waitjob=false Specifies that the IPP backend should not wait for the job to complete.
waitprinter=false Specifies that the IPP backend should not wait for the printer to become idle before sending the print job.

Line Printer Daemon (LPD) Protocol (aka lpr)

LPD is the original network printing protocol created for the Berkeley UNIX line printer daemon (spooler) and is supported by many network printers. LPD printing normally happens over port 515 and uses the lpd backend. Device URIsfor the lpd backend look like this:

lpd://ip-address/queue
lpd://ip-address/queue?format=l
lpd://ip-address/queue?format=l&reserve=rfc1179

Table 3 summarizes the options supported by the lpd backend.

Note: Due to limitations in the LPD protocol, we do not recommend using it if the printer or server supports any of the other protocols. Like AppSocket, LPD offers no security and is a common attack vector. LPD also, by default, requires that the computer save a copy of the entire print job before sending it to the printer - this can result in gigabytes of print data being saved to disk before any printing happens, delaying print jobs and shortening the life of your mass storage device!
Table 3: LPD URI Options
Option Description
banner=on Specifies that a banner page should be printed by the printer.
contimeout=seconds Specifies the number of seconds to wait for the connection to the printer to complete (default 1 week or 604800 seconds).
format=f Specifies that the print data is a plain text file.
format=o Specifies that the print data is a PostScript file.
format=p Specifies that the print data is a plain text file that should be "pretty" printed with a header and footer.
mode=stream Specifies that the backend should stream print data to the printer and not wait for confirmation that the job has been successfully printed.
order=data,control Specifies that the print data files should be sent before the control file.
reserve=none Specifies that the backend should not reserve a source port.
reserve=rfc1179 Specifies that the backend should reserve a source port from 721 to 731 as required by RFC 1179.
sanitize_title=no Specifies that the job title string should not be restricted to ASCII alphanumeric and space characters.
sanitize_title=yes Specifies that the job title string should be restricted to ASCII alphanumeric and space characters.
timeout=seconds Specifies the number of seconds to wait for LPD commands to complete (default 5 minutes or 300 seconds).

Finding Printers Using SNMP

Whenever you view the administration web page or a list of supported device URIs, the snmp backend can probe the local network(s) using Simple Network Management Protocol (SNMP) v1 broadcasts. Printers that respond to these broadcasts are then interrogated for the make, model, and supported protocols, yielding a device URI that can be used to add the printer.

The /etc/cups/snmp.conf file configures the snmp backend. Add the following line to enable discovery using the snmp backend:

Address @LOCAL

If you don't use "public" as your community name, change the Community line as well:

Community your community name
Note: The snmp backend will not be able to find any printers on your network if SNMP v1 or broadcasting are disabled on your network. Also, broadcasts are typically limited to the local subnet, so printers on different networks cannot be discovered using SNMP.

Troubleshooting SNMP Problems

The snmp backend sometimes exposes problems in vendor implementations. If you are experiencing long delays in loading the CUPS web interface administration page, or if you don't see your printer listed, the following instructions will help you to diagnose those problems and/or provide important feedback to the CUPS developers so that we can correct problems and improve the snmp backend in future releases.

The SNMP backend supports a debugging mode that is activated by running it from a shell prompt. Run the following command to get a verbose log of the snmp backend:

CUPS_DEBUG_LEVEL=2 /usr/lib/cups/backend/snmp @LOCAL 2>&1 | tee snmp.log

On macOS you'll find the backend in /usr/libexec/cups/backend instead:

CUPS_DEBUG_LEVEL=2 /usr/libexec/cups/backend/snmp @LOCAL 2>&1 | tee snmp.log

The output will look something like this:

 1  INFO: Using default SNMP Address @LOCAL
 2  INFO: Using default SNMP Community public
 3  DEBUG: Scanning for devices in "public" via "@LOCAL"...
 4  DEBUG: 0.000 Sending 46 bytes to 10.0.1.255...
 5  DEBUG: SEQUENCE 44 bytes
 6  DEBUG:     INTEGER 1 bytes 0
 7  DEBUG:     OCTET STRING 6 bytes "public"
 8  DEBUG:     Get-Request-PDU 31 bytes
 9  DEBUG:         INTEGER 4 bytes 1149539174
10  DEBUG:         INTEGER 1 bytes 0
11  DEBUG:         INTEGER 1 bytes 0
12  DEBUG:         SEQUENCE 17 bytes
13  DEBUG:             SEQUENCE 15 bytes
14  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.2.1
15  DEBUG:                 NULL VALUE 0 bytes
16  DEBUG: 0.001 Received 55 bytes from 10.0.1.42...
17  DEBUG: community="public"
18  DEBUG: request-id=1149539174
19  DEBUG: error-status=0
20  DEBUG: SEQUENCE 53 bytes
21  DEBUG:     INTEGER 1 bytes 0
22  DEBUG:     OCTET STRING 6 bytes "public"
23  DEBUG:     Get-Response-PDU 40 bytes
24  DEBUG:         INTEGER 4 bytes 1149539174
25  DEBUG:         INTEGER 1 bytes 0
26  DEBUG:         INTEGER 1 bytes 0
27  DEBUG:         SEQUENCE 26 bytes
28  DEBUG:             SEQUENCE 24 bytes
29  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.2.1
30  DEBUG:                 OID 9 bytes .1.3.6.1.2.1.25.3.1.5
31  DEBUG: add_cache(addr=0xbfffe170, addrname="10.0.1.42", uri="(null)", id="(null)", make_and_model="(null)")
32  DEBUG: 0.002 Sending 46 bytes to 10.0.1.42...
33  DEBUG: SEQUENCE 44 bytes
34  DEBUG:     INTEGER 1 bytes 0
35  DEBUG:     OCTET STRING 6 bytes "public"
36  DEBUG:     Get-Request-PDU 31 bytes
37  DEBUG:         INTEGER 4 bytes 1149539175
38  DEBUG:         INTEGER 1 bytes 0
39  DEBUG:         INTEGER 1 bytes 0
40  DEBUG:         SEQUENCE 17 bytes
41  DEBUG:             SEQUENCE 15 bytes
42  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.3.1
43  DEBUG:                 NULL VALUE 0 bytes
44  DEBUG: 0.003 Received 69 bytes from 10.0.1.42...
45  DEBUG: community="public"
46  DEBUG: request-id=1149539175
47  DEBUG: error-status=0
48  DEBUG: SEQUENCE 67 bytes
49  DEBUG:     INTEGER 1 bytes 0
50  DEBUG:     OCTET STRING 6 bytes "public"
51  DEBUG:     Get-Response-PDU 54 bytes
52  DEBUG:         INTEGER 4 bytes 1149539175
53  DEBUG:         INTEGER 1 bytes 0
54  DEBUG:         INTEGER 1 bytes 0
55  DEBUG:         SEQUENCE 40 bytes
56  DEBUG:             SEQUENCE 38 bytes
57  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.3.1
58  DEBUG:                 OCTET STRING 23 bytes "HP LaserJet 4000 Series"
59  DEBUG: 1.001 Probing 10.0.1.42...
60  DEBUG: 1.001 Trying socket://10.0.1.42:9100...
61  DEBUG: 10.0.1.42 supports AppSocket!
62  DEBUG: 1.002 Scan complete!
63  network socket://10.0.1.42 "HP LaserJet 4000 Series" "HP LaserJet 4000 Series 10.0.1.42" ""

The first two lines are just informational and let you know that the default community name and address are being used. Lines 3-15 contain the initial SNMP query for the device type OID (.1.3.6.1.2.1.25.3.2.1.2.1) from the Host MIB.

Lines 16-31 show the response we got from an HP LaserJet 4000 network printer. At this point we discover that it is a printer device and then send another SNMP query (lines 32-43) for the device description OID (.1.3.6.1.2.1.25.3.2.1.3.1) from the Host MIB as well.

Lines 44-58 show the response to the device description query, which tells us that this is an HP LaserJet 4000 Series printer.

On line 59 we start our active connection probe and discover that this print server supports the AppSocket (JetDirect) protocol on port 9100.

Finally, line 63 shows the device information line for the print server that is sent to CUPS.

If you don't see your printer listed, or the wrong information is listed, then you need to gather more information on the printer. The easiest way to do this is to run the snmpwalk command:

snmpwalk -Cc -v 1 -c public ip-address | tee snmpwalk.log

where "ip-address" is the IP address of the printer or print server. You should see a lot of values stream by - the ones you want to see are:

HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP LaserJet 4000 Series

The hrDeviceType line should show hrDevicePrinter; if not, then your printer or print server doesn't identify itself as a printer. The hrDeviceDescr line should provide a human-readable string for the make and model of the printer, although in some cases you'll just see something less useful like "Axis OfficeBASIC Parallel Print Server".

Once you have collected the snmpwalk output, you should go to the CUPS Issue Tracker page to submit a feature request to support your printer or print server. Be sure to attach those two log files you created - they will help us to identify the SNMP values we need to look for.

cups-2.3.1/doc/help/man-ipptool.html000664 000765 000024 00000017033 13574721672 017425 0ustar00mikestaff000000 000000 ipptool(1)

ipptool(1)

Name

ipptool - perform internet printing protocol requests

Synopsis

ipptool [ --help ] [ --ippserver filename ] [ --stop-after-include-error ] [ --version ] [ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -P filename.plist ] [ -S ] [ -T seconds ] [ -V version ] [ -X ] [ -c ] [ -d name=value ] [ -f filename ] [ -h ] [ -i seconds ] [ -n repeat-count ] [ -q ] [ -t ] [ -v] printer-uri testfile [ ... testfile ]

Description

ipptool sends IPP requests to the specified printer-uri and tests and/or displays the results. Each named testfile defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The testfile format is described in ipptoolfile(5).

Options

The following options are recognized by ipptool:
--help
Shows program help.
--ippserver filename
Specifies that the test results should be written to the named ippserver attributes file.
--stop-after-include-error
Tells ipptool to stop if an error occurs in an included file. Normally ipptool will continue with subsequent tests after the INCLUDE directive.
--version
Shows the version of ipptool being used.
-4
Specifies that ipptool must connect to the printer or server using IPv4.
-6
Specifies that ipptool must connect to the printer or server using IPv6.
-C
Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
-E
Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
-I
Specifies that ipptool will continue past errors.
-L
Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
-P filename.plist
Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (-t). This option is incompatible with the -i (interval) and -n (repeat-count) options.
-S
Forces (dedicated) TLS encryption when connecting to the server.
-T seconds
Specifies a timeout for IPP requests in seconds.
-V version
Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used.
-X
Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the -i (interval) and -n (repeat-count) options.
-c
Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
-d name=value
Defines the named variable.
-f filename
Defines the default request filename for tests.
-h
Validate HTTP response headers.
-i seconds
Specifies that the (last) testfile should be repeated at the specified interval. This option is incompatible with the -X (XML plist output) option.
-l
Specifies that plain text output is desired.
-n repeat-count
Specifies that the (last) testfile should be repeated the specified number of times. This option is incompatible with the -X (XML plist output) option.
-q
Be quiet and produce no output.
-t
Specifies that CUPS test report output is desired instead of the plain text output.
-v
Specifies that all request and response attributes should be output in CUPS test mode (-t). This is the default for XML output.

Exit Status

The ipptool program returns 0 if all tests were successful and 1 otherwise.

Files

The following standard files are available:
color.jpg
create-printer-subscription.test
document-a4.pdf
document-a4.ps
document-letter.pdf
document-letter.ps
get-completed-jobs.test
get-jobs.test
get-notifications.test
get-printer-attributes.test
get-subscriptions.test
gray.jpg
ipp-1.1.test
ipp-2.0.test
ipp-2.1.test
ipp-2.2.test
ipp-everywhere.test
onepage-a4.pdf
onepage-a4.ps
onepage-letter.pdf
onepage-letter.ps
print-job.test
print-job-deflate.test
print-job-gzip.test
testfile.jpg
testfile.pcl
testfile.pdf
testfile.ps
testfile.txt
validate-job.test

Conforming To

The ipptool program is unique to CUPS and conforms to the Internet Printing Protocol up to version 2.2.

Examples

Get a list of completed jobs for "myprinter":

    ipptool ipp://localhost/printers/myprinter get-completed-jobs.test

Send email notifications to "user@example.com" when "myprinter" changes:


    ipptool -d recipient=mailto:user@example.com \
        ipp://localhost/printers/myprinter create-printer-subscription.test

See Also

ipptoolfile(5), IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) RFC 8011 (http://tools.ietf.org/html/rfc8011),

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/sharing.html000664 000765 000024 00000010720 13574721672 016615 0ustar00mikestaff000000 000000 Printer Sharing

Printer Sharing

This document discusses several ways to configure printer sharing.

The Basics

A "server" is any machine that communicates directly to a printer. A "client" is any machine that sends print jobs to a server for final printing. Clients can also be servers if they communicate directly with any printers of their own.

By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from a client to a server. When printing to legacy print servers you may also use the Line Printer Daemon (LPD) protocol when printing to older UNIX-based servers or Server Message Block (SMB) when printing to Windows® servers.

Clients can automatically discover and access shared printers via DNS Service Discovery (DNS-SD a.k.a. Bonjour®). SMB browsing can also be used to manually discover and access shared printers when Samba is installed.

Configuring the Server

You must enable printer sharing on the server before clients can print through it. The simplest way to do this is to use the cupsctl(8) command on the server:

cupsctl --share-printers

By default, the above command will allow printing from other clients on the same subnet as your server. To allow printing from any subnet, use the following command instead:

cupsctl --share-printers --remote-any

Next, tag each printer that you want to share using the lpadmin(8) command on the server, for example:

lpadmin -p printer -o printer-is-shared=true

You can require authentication for shared printing by setting the policy on each printer, for example:

lpadmin -p printer -o printer-op-policy=authenticated

Automatic Configuration using IPP

Note:

This method of configuration does not work on macOS 10.7 or later because sandboxed applications do not always have direct network access.

CUPS can be configured to run without a local spooler and send all jobs to a single server. However, if that server goes down then all printing will be disabled. Use this configuration only as absolutely necessary.

The default server is normally the local system ("localhost"). To override the default server create a file named /etc/cups/client.conf with a line as follows:

ServerName server

The server name can be the hostname or IP address of the default server. If the server is not using the default IPP port (631), you can add the port number at the end like this:

ServerName server:port

The default server can also be customized on a per-user basis. To set a user-specific server create a file named ~/.cups/client.conf instead. The user client.conf file takes precedence over the system one.

Finally, you can set the CUPS_SERVER environment variable to override the default server for a single process, for example:

CUPS_SERVER=server:port firefox http://www.cups.org

will run the Firefox web browser pointed to the specified server and port. The environment variable overrides both the user and system client.conf files, if any.

Manual Configuration of Print Queues

Note:

This method of configuration does not work on macOS 10.7 or later because sandboxed applications do not always have direct network access.

The most tedious method of configuring client machines is to configure each remote queue by hand using the lpadmin(8) command:

lpadmin -p printer -E -v ipp://server/printers/printer -m everywhere

The printer name is the name of the printer on the server machine. The server name is the hostname or IP address of the server machine. Repeat the lpadmin command for each remote printer you wish to use.

cups-2.3.1/doc/help/translation.html000664 000765 000024 00000060453 13574721672 017530 0ustar00mikestaff000000 000000 Translating and Customizing CUPS

Translating and Customizing CUPS

Thanks to its extensive use of templates, images, and message catalogs, CUPS can be easily translated (or customized!) to suit your needs. This help file will guide you through the CUPS localization files so you can get the most out of it.

Getting Started

Start by downloading the CUPS source code from www.cups.org. After you extract the files from the source archive (or clone the Git repository), you will want to copy the following files and directories:

  • desktop/cups.desktop - the GNOME/KDE desktop file pointing to the CUPS web interface
  • doc/index.html.in - the web interface home page
  • locale/cups.pot - the message catalog
  • templates/*.tmpl and templates/header.tmpl.in - the web interface template files

With the exception of the message catalogs and desktop file, localization files are placed in subdirectories under the doc and templates using the locale name. Locale names are either ll or ll_CC, where "ll" is the 2-letter language code and "CC" is the 2-letter country code. CUPS does not currently use or support the newer ll-region syntax for locale names.

All non-image files must be encoded using the UTF-8 character set.

Submitting a Translation for CUPS

To submit a translation for inclusion in CUPS, translate the desktop file, all of the template files, the index.html.in file, and the message catalog. Place these files in the correct subdirectories in the CUPS source code archive and run the following command to create an archive with your files:

tar cvf ll_CC.tar.gz desktop/cups.desktop doc/ll_CC locale/cups_ll_CC.po templates/ll_CC

Replace "ll_CC" with the locale name for your translation. Once you have created the archive, go to the CUPS project page and submit a bug report, attaching the translation to the report.

Alternately, you can clone the CUPS project on Github, make your changes, and submit a pull request from the same link.

The Desktop File

The desktop/cups.desktop file provides a link to the CUPS web interface from desktop environments such as GNOME and KDE. To translate this file, add two lines to the bottom with the Name and Comment keys:

Name[ll_CC]=Translation of "Manage Printing"
Comment[ll_CC]=Translation of "CUPS Web Interface"

The Home Page

The index.html.in file is a complete HTML file that is displayed when the user visits "http://localhost:631/". Edit the existing doc/index.html.in and save it in the doc/ll_CC subdirectory so that the configure script can generate it. After configuring, run "make install" in the doc subdirectory to test the new home page.

Message Catalogs

CUPS message catalogs are GNU gettext ".po" text files that provide a list of localized message strings for the CUPS software. Message catalogs are named cups_ll.po or cups_ll_CC.po, where "ll" is the standard 2-letter abbreviation for the language and "CC" is the standard 2-letter abbreviation for the country.

When translating a new message catalog, copy the cups.pot message catalog file in the locale subdirectory of the CUPS source code. For example, to start translating the message catalog to Canadian French, you would type the following commands:

cd locale
cp cups.pot cups_fr_CA.po

Alternatively, you can copy the existing cups_fr.po message catalog and then make any necessary changes.

Once you have make your copy of the file, edit it using your favorite text editor or translation program to translate the text to the desired language.

Then validate your translation using the locale/checkpo utility:

cd locale
./checkpo cups_ll_CC.po

After fixing any errors in your translation, add your locale to the LANGUAGES variable in the Makedefs file and run the "make install" command in the locale subdirectory to test the translation. This variable is automatically updated when you run the configure script.

Template Files

The CUPS scheduler provides a web interface that can be used to do many common printing and administration tasks. The built-in web server supports localization of web pages through the use of subdirectories for each locale, e.g. "fr" for French, "de" for German, "fr_ca" for French in Canada, and so forth.

Template files are HTML files with special formatting characters in them that allow substitution of variables and arrays. The CUPS CGI programs (admin.cgi, classes.cgi, help.cgi, jobs.cgi, and printers.cgi) use these template file to provide dynamic content for the web interface. Template files are installed in the /usr/share/cups/templates directory by default. Table 1 lists the various template files and their purpose.

Translated versions of the template files should be saved in the templates/ll_CC subdirectory. For example, Canadian French template files should be saved in the templates/fr_CA subdirectory. After you have translated all of the templates, add the locale to the LANGUAGES variable in the Makedefs file and run "make install" in the templates subdirectory to test the translation.

Table 1: Web Interface Template Files
Filename Purpose
add-class.tmpl This is the initial form that is shown to add a new printer class.
add-printer.tmpl This is the initial form that is shown to add a new printer.
admin.tmpl This is the main administration page.
choose-device.tmpl This is the form that shows the list of available devices.
choose-make.tmpl This is the form that shows the list of available manufacturers.
choose-model.tmpl This is the form that shows the list of available printer models/drivers.
choose-serial.tmpl This is the form that allows the user to choose a serial port and any options.
choose-uri.tmpl This is the form that allows the user to enter a device URI for network printers.
class.tmpl This template shows information about a single class.
class-added.tmpl This template shows the "class added" message.
class-confirm.tmpl This is the template used to confirm the deletion of a class.
class-deleted.tmpl This template shows the "class deleted" message.
class-jobs-header.tmpl This template shows the "jobs" header for jobs in a class.
class-modified.tmpl This template shows the "class modified" message.
classes.tmpl This template shows one or more printer classes.
classes-header.tmpl This template shows the "showing N of M classes" header in the class list.
command.tmpl This template shows the status of a command job.
edit-config.tmpl This is the cupsd.conf editor page.
error.tmpl This template displays a generic error message.
error-op.tmpl This is the "unknown operation" error page.
header.tmpl(.in) This template is used as the standard header on all dynamic content. Edit the header.tmpl.in file and let the configure script generate the header.tmpl file.
help-header.tmpl This is the top part of the help page.
help-printable.tmpl This is the standard page header for the printable version of help files.
help-trailer.tmpl This is the bottom part of the help page.
job-cancel.tmpl This template shows "job canceled".
job-hold.tmpl This template shows "job held".
job-move.tmpl This template shows the move-job form.
job-moved.tmpl This template shows "job moved".
job-release.tmpl This template shows "job released".
job-restart.tmpl This template shows "job reprinted".
jobs.tmpl This template is used to list the print jobs on a server, class, or printer.
jobs-header.tmpl This template shows the "showing N or M jobs" header in the jobs list.
list-available-printers.tmpl This template shows a list of new printers that have been found.
modify-class.tmpl This template is used as the first form when modifying a class.
modify-printer.tmpl This template is used as the first form when modifying a printer.
norestart.tmpl This template shows "server not restarted because no changes were made to the configuration".
option-boolean.tmpl This template is used to select a boolean PPD option.
option-conflict.tmpl This template shows the conflicting options.
option-header.tmpl This template is used to start a PPD option group.
option-pickmany.tmpl This template is used to select a multi-valued PPD option.
option-pickone.tmpl This template is used to select a single-valued PPD option.
option-trailer.tmpl This template is used to end a PPD option group.
pager.tmpl This template shows the previous/next pager bar.
printer.tmpl This template shows information about a single printer.
printer-accept.tmpl This template shows "printer now accepting jobs".
printer-added.tmpl This template shows "printer added".
printer-cancel-jobs.tmpl This template shows "All jobs on printer have been canceled."
printer-configured.tmpl This template shows "printer configured".
printer-confirm.tmpl This template asks the user to confirm the deletion of a printer.
printer-default.tmpl This template shows "default printer set".
printer-deleted.tmpl This template shows "printer deleted".
printer-jobs-header.tmpl This templates shows the "jobs" header for jobs on a printer.
printer-modified.tmpl This template shows "printer modified".
printer-reject.tmpl This template shows "printer now rejecting jobs".
printer-start.tmpl This template shows "printer started".
printer-stop.tmpl This template shows "printer stopped".
printers.tmpl This template is used to list information on one or more printers.
printers-header.tmpl This template shows the "showing printer N of M" header in the printers list.
restart.tmpl This template shows "server restarting".
search.tmpl This template shows the search form.
set-printer-options-header.tmpl This template shows the first part of the set printer options form.
set-printer-options-trailer.tmpl This template shows the last part of the set printer options form.
test-page.tmpl This template shows "test page printed".
trailer.tmpl This template is used as the standard trailer on all dynamic content.
users.tmpl This template shows the set allowed users form.

Inserting Attributes and Values

Template files consist of HTML with variable substitutions for named inside curly braces "{name}". Variable names are generally the IPP attribute names with the hyphen ("-") replaced by the underscore ("_") character. For example, the job-printer-uri attribute is renamed to job_printer_uri.

Curley braces ("{" and "}") to indicate substitutions, and the backslash ("\") character for quoting. To insert any of these special characters as-is you need to use the HTML &name; mechanism or prefix each special character with the backslash ("\".)

You substitute the value of a variable using {NAME} in your template file. If the variable is undefined then the {NAME} string is output as-is.

To substitute an empty string if the variable is undefined, use {?NAME} instead.

Array Substitutions

The number of array elements can be inserted using {#NAME}. If the array is undefined then 0 is output. The current array element (starting at 1) is inserted with {#}.

Arrays are handled using {[NAME] at the beginning of a section and } at the end. The information between the closing bracket ("]") and closing brace ("}") is repeated for as many elements as are in the named array. For example, the following template will display a list of each job in the job_id array:

<TABLE>
<TR>
	<TH>Job ID</TH>
	<TH>Destination</TH>
	<TH>Title</TH>
</TR>

{[job_id]
<TR>
	<TD>{?job_id}</TD>
	<TD>{?job_printer_name}</TD>
	<TD>{?job_name}</TD>
</TR>
}
</TABLE>

Arrays can be nested, however all elements within the curly braces ("{" and "}") are indexed using the innermost array.

Conditional Tests

Templates can also test variables against specific values and conditionally include text in the template. The format is:

{variable?true:false}
{variable=value?true:false}
{variable!value?true:false}
{variable<value?true:false}
{variable>value?true:false}

where true is the text that is included if the condition is true and false is the text that is included if the condition is false. A value of # is replaced with the current element number (starting at 1.) The character after the variable name specifies the condition to test. Table 2 shows the available test conditions.

Table 2: Template Substitution Conditions
Char Condition
? True if variable exists.
= True if variable is equal to value.
! True if variable is not equal to value.
< True if variable is less than value.
> True if variable is greater than value.

What to Localize in a Template File

Because HTML contains both markup (that generally is not localized) and text (which is localized), you should carefully avoid changing the markup unless it contains human-readable text. The following HTML examples show how to correctly localize template files:

<!-- English table heading -->
<table class="list" summary="Printer List">

<!-- Correctly localized to French; the class attribute is unchanged but summary is localized -->
<table class="list" summary="Liste des imprimantes">


<!-- English hyperlink -->
<li><a {SECTION=help?class="active" :}href="/help/">Help</a></li>

<!-- Correctly localized to Danish; the href attribute is unchanged while the link text is localized -->
<li><a {SECTION=help?class="active" :}href="/help/">Hjælp</a></li>

CGI Programs

CUPS uses five CGI programs to manage the dynamic web interfaces:

  • admin.cgi
  • classes.cgi
  • help.cgi
  • jobs.cgi
  • printers.cgi

Each CGI program accepts standard form variables such as OP for the operation to perform, PRINTER_NAME for the printer or class name to operate on, QUERY for any search words,FIRST for the first class, job, or printer to display, and ORDER to control the order that classes, jobs, or printers are displayed.

In addition, the classes.cgi, jobs.cgi, and printers.cgi programs support a WHICH_JOBS variable to control which jobs are displayed. Table 3 lists the supported values.

Table 3: WHICH_JOBS Values
WHICH_JOBS Value Description
all Show all jobs
completed Show completed jobs
not-completed Show active jobs

admin.cgi

The admin.cgi program handles all of the printer and class administration functions and is run for all direct accesses to the /admin resource. For most operations it uses the PRINTER_NAME and OP form variables to specify the action requested. Table 4 shows the supported OP values.

Table 4: admin.cgi OP Values
OP Value Description
add-class Adds a new printer class.
add-printer Adds a new printer.
config-server Configures the server.
delete-class Deletes a printer class. The form variable CONFIRM may be set to any value to bypass the confirmation page.
delete-printer Deletes a printer. The form variable CONFIRM may be set to any value to bypass the confirmation page.
find-new-printers Find new printers that have not yet been added.
modify-class Modifies a printer class.
modify-printer Modifies a printer.
redirect Redirects the web browser to the location referenced by the URL form variable.
set-allowed-users Sets the allowed users for a destination.
set-as-default Sets the default destination.
set-printer-options Sets the default options for a printer.
set-sharing Sets the printer-is-shared attribute for a destination.

classes.cgi

The classes.cgi program is responsible for listing class information, including jobs destined for that class. It is for all direct accesses to the /classes resource and supports the optional form variables OP and WHICH_JOBS. If no form variables are supplied then the CGI lists all or a specific class and the active jobs on each class. Table 5 shows the supported OP values.

Table 5: classes.cgi OP Values
OP Value Description
accept-jobs Start accepting jobs for a class.
cancel-jobs Cancel all jobs for a class.
move-jobs Move all jobs to a different destination.
print-test-page Print a PostScript test page.
reject-jobs Stop accepting jobs for a class.
start-class Start processing jobs for a class.
stop-class Stop processing jobs for a class.

help.cgi

The help.cgi program handles all of the on-line help functions and is run for all direct accesses to the /help resource.

jobs.cgi

The jobs.cgi program handles all of the job functions and is run for all direct accesses to the /jobs resource. For most operations it uses the JOB_ID, OP, and WHICH_JOBS form variables to specify the action requested. Table 6 shows the supported OP values.

Table 6: jobs.cgi OP Values
OP Value Description
cancel-job Cancels a job.
hold-job Holds a job indefinitely.
move-job Moves a job to another destination.
release-job Releases a job for printing.
restart-job Restarts/reprints a stopped, canceled, completed, or aborted print job.

printers.cgi

The printers.cgi program is responsible for listing printer information, including jobs destined for that printer. It is for all direct accesses to the /printers resource and supports the optional form variables OP and WHICH_JOBS. If no form variables are supplied then the CGI lists all printers or a specific printer and the active jobs on that printer. Table 7 shows the supported OP values.

Table 7: printers.cgi OP Values
OP Value Description
accept-jobs Start accepting jobs for a printer.
cancel-jobs Cancel all jobs for a printer.
clean-print-heads Clean the print heads.
move-jobs Move all jobs to a different destination.
print-self-test-page Print a printer self-test page.
print-test-page Print a PostScript test page.
reject-jobs Stop accepting jobs for a printer.
start-printer Start processing jobs for a printer.
stop-printer Stop processing jobs for a printer.
cups-2.3.1/doc/help/raster-driver.html000664 000765 000024 00000050511 13574721672 017755 0ustar00mikestaff000000 000000 Developing Raster Printer Drivers

Developing Raster Printer Drivers

This document describes how to develop printer drivers for raster printers. Topics include: printer driver basics, creating new PPD files, using filters, implementing color management, and adding macOS features.

Printer Driver Basics

A CUPS raster printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, one or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into CUPS raster data. Figure 1 shows the data flow of a typical print job.

The raster filter converts CUPS raster data into a format the printer understands, for example HP-PCL. CUPS includes several sample raster filters supporting standard page description languages (PDLs). Table 1 shows the raster filters that are bundled with CUPS and the languages they support.

Table 1: Standard CUPS Raster Filters
FilterPDLsppdc DriverTypeppdc #include file
rastertoepsonESC/P, ESC/P2epsonepson.h
rastertoescpxESC/P, ESC/P2, EPSON Remote Modeescpescp.h
rastertohpHP-PCL3, HP-PCL5hphp.h
rastertolabelCPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPLlabellabel.h
rastertopclxHP-RTL, HP-PCL3, HP-PCL3GUI, HP-PCL5, HP-PCL5c, HP-PCL5epclpcl.h

The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

Raster printer drivers must provide their own command filter.

Creating New PPD Files

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for several similar black-and-white HP-PCL5 laser printers.

Listing 1: "examples/laserjet-basic.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// Include HP-PCL driver definitions
#include <pcl.h>

// Specify that this driver uses the HP-PCL driver...
DriverType pcl

// Specify the driver options via the model number...
ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and driver version
Manufacturer "HP"
Version 1.0

// Supported page sizes and their margins
HWMargins 18 12 18 12
*MediaSize Letter
MediaSize Legal
MediaSize Executive
MediaSize Monarch
MediaSize Statement
MediaSize FanFoldGermanLegal

HWMargins 18 12.72 18 12.72
MediaSize Env10

HWMargins 9.72 12 9.72 12
MediaSize A4
MediaSize A5
MediaSize B5
MediaSize EnvC5
MediaSize EnvDL
MediaSize EnvISOB5
MediaSize Postcard
MediaSize DoublePostcard

// Only black-and-white output with mode 3 compression...
ColorModel Gray k chunky 3

// Supported resolutions
Resolution - 1 0 0 0 "300dpi/300 DPI"
*Resolution - 8 0 0 0 "600dpi/600 DPI"

// Supported input slots
*InputSlot 7 "Auto/Automatic Selection"
InputSlot 2 "Manual/Tray 1 - Manual Feed"
InputSlot 4 "Upper/Tray 1"
InputSlot 1 "Lower/Tray 2"
InputSlot 5 "LargeCapacity/Tray 3"

// Tray 3 is an option...
Installable "OptionLargeCapacity/Tray 3 Installed"
UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity"

{
  // HP LaserJet 2100 Series
  Throughput 10
  ModelName "LaserJet 2100 Series"
  PCFileName "hpljt211.ppd"
}

{
  // LaserJet 2200 and 2300 series have duplexer option...
  Duplex normal
  Installable "OptionDuplex/Duplexer Installed"
  UIConstraints "*OptionDuplex False *Duplex"

  {
    // HP LaserJet 2200 Series
    Throughput 19
    ModelName "LaserJet 2200 Series"
    PCFileName "hpljt221.ppd"
  }

  {
    // HP LaserJet 2300 Series
    Throughput 25
    ModelName "LaserJet 2300 Series"
    PCFileName "hpljt231.ppd"
  }
}

Using Filters

The standard CUPS raster filters can be specified using the DriverType directive, for example:

// Specify that this driver uses the HP-PCL driver...
DriverType pcl

Table 1 shows the driver types for each of the standard CUPS raster filters. For drivers that do not use the standard raster filters, the "custom" type is used with Filter directives:

DriverType custom
Filter application/vnd.cups-raster 100 /path/to/raster/filter
Filter application/vnd.cups-command 100 /path/to/command/filter

Implementing Color Management

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

Since macOS 10.5Custom Color Matching Support

macOS printer drivers that are based on an existing standard RGB colorspace can tell the system to use the corresponding colorspace instead of an arbitrary ICC color profile when doing color management. The APSupportsCustomColorMatching and APDefaultCustomColorMatchingProfile attributes can be used to enable this mode:

Attribute APSupportsCustomColorMatching "" true
Attribute APDefaultCustomColorMatchingProfile "" sRGB

Adding macOS Features

macOS printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
Attribute APPrinterPreset "name/text" "*option choice ..."
cups-2.3.1/doc/help/api-raster.html000664 000765 000024 00000166024 13574721672 017242 0ustar00mikestaff000000 000000 Raster API

Raster API

Header cups/raster.h
Library -lcups
See Also Programming: CUPS Programming Manual
Programming: PPD API
References: CUPS PPD Specification

Overview

The CUPS raster API provides a standard interface for reading and writing CUPS raster streams which are used for printing to raster printers. Because the raster format is updated from time to time, it is important to use this API to avoid incompatibilities with newer versions of CUPS.

Two kinds of CUPS filters use the CUPS raster API - raster image processor (RIP) filters such as pstoraster and cgpdftoraster (macOS) that produce CUPS raster files and printer driver filters that convert CUPS raster files into a format usable by the printer. Printer driver filters are by far the most common.

CUPS raster files (application/vnd.cups-raster) consists of a stream of raster page descriptions produced by one of the RIP filters such as pstoraster, imagetoraster, or cgpdftoraster. CUPS raster files are referred to using the cups_raster_t type and are opened using the cupsRasterOpen function. For example, to read raster data from the standard input, open file descriptor 0:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);

Each page of data begins with a page dictionary structure called cups_page_header2_t. This structure contains the colorspace, bits per color, media size, media type, hardware resolution, and so forth used for the page.

Note:

Do not confuse the colorspace in the page header with the PPD ColorModel keyword. ColorModel refers to the general type of color used for a device (Gray, RGB, CMYK, DeviceN) and is often used to select a particular colorspace for the page header along with the associate color profile. The page header colorspace (cupsColorSpace) describes both the type and organization of the color data, for example KCMY (black first) instead of CMYK and RGBA (RGB + alpha) instead of RGB.

You read the page header using the cupsRasterReadHeader2 function:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
cups_page_header2_t header;

while (cupsRasterReadHeader2(ras, &header))
{
  /* setup this page */

  /* read raster data */

  /* finish this page */
}

After the page dictionary comes the page data which is a full-resolution, possibly compressed bitmap representing the page in the printer's output colorspace. You read uncompressed raster data using the cupsRasterReadPixels function. A for loop is normally used to read the page one line at a time:

#include <cups/raster.h>

cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
cups_page_header2_t header;
int page = 0;
int y;
char *buffer;

while (cupsRasterReadHeader2(ras, &header))
{
  /* setup this page */
  page ++;
  fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies);

  /* allocate memory for 1 line */
  buffer = malloc(header.cupsBytesPerLine);

  /* read raster data */
  for (y = 0; y < header.cupsHeight; y ++)
  {
    if (cupsRasterReadPixels(ras, buffer, header.cupsBytesPerLine) == 0)
      break;

    /* write raster data to printer on stdout */
  }

  /* finish this page */
}

When you are done reading the raster data, call the cupsRasterClose function to free the memory used to read the raster file:

cups_raster_t *ras;

cupsRasterClose(ras);

Functions by Task

Opening and Closing Raster Streams

Reading Raster Streams

Writing Raster Streams

Functions

cupsRasterClose

Close a raster stream.

void cupsRasterClose(cups_raster_t *r);

Parameters

r Stream to close

Discussion

The file descriptor associated with the raster stream must be closed separately as needed.

 CUPS 1.3/macOS 10.5 cupsRasterErrorString

Return the last error from a raster function.

const char *cupsRasterErrorString(void);

Return Value

Last error or NULL

Discussion

If there are no recent errors, NULL is returned.

 CUPS 2.2/macOS 10.12 cupsRasterInitPWGHeader

Initialize a page header for PWG Raster output.

int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back);

Parameters

h Page header
media PWG media information
type PWG raster type string
xdpi Cross-feed direction (horizontal) resolution
ydpi Feed direction (vertical) resolution
sides IPP "sides" option value
sheet_back Transform for back side or NULL for none

Return Value

1 on success, 0 on failure

Discussion

The "media" argument specifies the media to use.

The "type" argument specifies a "pwg-raster-document-type-supported" value that controls the color space and bit depth of the raster data.

The "xres" and "yres" arguments specify the raster resolution in dots per inch.

The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value to apply for the back side of a page. Pass NULL for the front side.

cupsRasterOpen

Open a raster stream using a file descriptor.

cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode);

Parameters

fd File descriptor
mode Mode - CUPS_RASTER_READ, CUPS_RASTER_WRITE, CUPS_RASTER_WRITE_COMPRESSED, or CUPS_RASTER_WRITE_PWG

Return Value

New stream

Discussion

This function associates a raster stream with the given file descriptor. For most printer driver filters, "fd" will be 0 (stdin). For most raster image processor (RIP) filters that generate raster data, "fd" will be 1 (stdout).

When writing raster data, the CUPS_RASTER_WRITE, CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can be used - compressed and PWG output is generally 25-50% smaller but adds a 100-300% execution time overhead.

cupsRasterOpenIO

Open a raster stream using a callback function.

cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode);

Parameters

iocb Read/write callback
ctx Context pointer for callback
mode Mode - CUPS_RASTER_READ, CUPS_RASTER_WRITE, CUPS_RASTER_WRITE_COMPRESSED, or CUPS_RASTER_WRITE_PWG

Return Value

New stream

Discussion

This function associates a raster stream with the given callback function and context pointer.

When writing raster data, the CUPS_RASTER_WRITE, CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can be used - compressed and PWG output is generally 25-50% smaller but adds a 100-300% execution time overhead.

 DEPRECATED cupsRasterReadHeader

Read a raster page header and store it in a version 1 page header structure.

unsigned cupsRasterReadHeader(cups_raster_t *r, cups_page_header_t *h);

Parameters

r Raster stream
h Pointer to header data

Return Value

1 on success, 0 on failure/end-of-file

Discussion

This function is deprecated. Use cupsRasterReadHeader2 instead.

Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset of the version 2 page header data. This function handles reading version 2 page headers and copying only the version 1 data into the provided buffer.

 CUPS 1.2/macOS 10.5 cupsRasterReadHeader2

Read a raster page header and store it in a version 2 page header structure.

unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h);

Parameters

r Raster stream
h Pointer to header data

Return Value

1 on success, 0 on failure/end-of-file

cupsRasterReadPixels

Read raster pixels.

unsigned cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len);

Parameters

r Raster stream
p Pointer to pixel buffer
len Number of bytes to read

Return Value

Number of bytes read

Discussion

For best performance, filters should read one or more whole lines. The "cupsBytesPerLine" value from the page header can be used to allocate the line buffer and as the number of bytes to read.

 DEPRECATED cupsRasterWriteHeader

Write a raster page header from a version 1 page header structure.

unsigned cupsRasterWriteHeader(cups_raster_t *r, cups_page_header_t *h);

Parameters

r Raster stream
h Raster page header

Return Value

1 on success, 0 on failure

Discussion

This function is deprecated. Use cupsRasterWriteHeader2 instead.

 CUPS 1.2/macOS 10.5 cupsRasterWriteHeader2

Write a raster page header from a version 2 page header structure.

unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h);

Parameters

r Raster stream
h Raster page header

Return Value

1 on success, 0 on failure

Discussion

The page header can be initialized using cupsRasterInitPWGHeader.

cupsRasterWritePixels

Write raster pixels.

unsigned cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len);

Parameters

r Raster stream
p Bytes to write
len Number of bytes to write

Return Value

Number of bytes written

Discussion

For best performance, filters should write one or more whole lines. The "cupsBytesPerLine" value from the page header can be used to allocate the line buffer and as the number of bytes to write.

Data Types

cups_adv_t

AdvanceMedia attribute values

typedef enum cups_adv_e cups_adv_t;

cups_bool_t

Boolean type

typedef enum cups_bool_e cups_bool_t;

cups_cspace_t

cupsColorSpace attribute values

typedef enum cups_cspace_e cups_cspace_t;

cups_cut_t

CutMedia attribute values

typedef enum cups_cut_e cups_cut_t;

cups_edge_t

LeadingEdge attribute values

typedef enum cups_edge_e cups_edge_t;

cups_jog_t

Jog attribute values

typedef enum cups_jog_e cups_jog_t;

cups_mode_t

cupsRasterOpen modes

typedef enum cups_mode_e cups_mode_t;

cups_order_t

cupsColorOrder attribute values

typedef enum cups_order_e cups_order_t;

cups_orient_t

Orientation attribute values

typedef enum cups_orient_e cups_orient_t;

 CUPS 1.2/macOS 10.5 cups_page_header2_t

Version 2 page header

typedef struct cups_page_header2_s cups_page_header2_t;

 DEPRECATED cups_page_header_t

Version 1 page header

typedef struct cups_page_header_s cups_page_header_t;

cups_raster_iocb_t

cupsRasterOpenIO callback function

typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length);

cups_raster_t

Raster stream data

typedef struct _cups_raster_s cups_raster_t;

Structures

 CUPS 1.2/macOS 10.5 cups_page_header2_s

Version 2 page header

struct cups_page_header2_s {
    unsigned AdvanceDistance;
    cups_adv_t AdvanceMedia;
    cups_bool_t Collate;
    cups_cut_t CutMedia;
    cups_bool_t Duplex;
    unsigned HWResolution[2];
    unsigned ImagingBoundingBox[4];
    cups_bool_t InsertSheet;
    cups_jog_t Jog;
    cups_edge_t LeadingEdge;
    cups_bool_t ManualFeed;
    unsigned Margins[2];
    char MediaClass[64];
    char MediaColor[64];
    unsigned MediaPosition;
    char MediaType[64];
    unsigned MediaWeight;
    cups_bool_t MirrorPrint;
    cups_bool_t NegativePrint;
    unsigned NumCopies;
    cups_orient_t Orientation;
    cups_bool_t OutputFaceUp;
    char OutputType[64];
    unsigned PageSize[2];
    cups_bool_t Separations;
    cups_bool_t TraySwitch;
    cups_bool_t Tumble;
    unsigned cupsBitsPerColor;
    unsigned cupsBitsPerPixel;
    float cupsBorderlessScalingFactor;
    unsigned cupsBytesPerLine;
    cups_order_t cupsColorOrder;
    cups_cspace_t cupsColorSpace;
    unsigned cupsCompression;
    unsigned cupsHeight;
    float cupsImagingBBox[4];
    unsigned cupsInteger[16];
    char cupsMarkerType[64];
    unsigned cupsMediaType;
    unsigned cupsNumColors;
    char cupsPageSizeName[64];
    float cupsPageSize[2];
    float cupsReal[16];
    char cupsRenderingIntent[64];
    unsigned cupsRowCount;
    unsigned cupsRowFeed;
    unsigned cupsRowStep;
    char cupsString[16][64];
    unsigned cupsWidth;
};

Members

AdvanceDistance AdvanceDistance value in points
AdvanceMedia AdvanceMedia value (cups_adv_t)
Collate Collated copies value
CutMedia CutMedia value (cups_cut_t)
Duplex Duplexed (double-sided) value
HWResolution[2] Resolution in dots-per-inch
ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
InsertSheet InsertSheet value
Jog Jog value (cups_jog_t)
LeadingEdge LeadingEdge value (cups_edge_t)
ManualFeed ManualFeed value
Margins[2] Lower-lefthand margins in points
MediaClass[64] MediaClass string
MediaColor[64] MediaColor string
MediaPosition MediaPosition value
MediaType[64] MediaType string
MediaWeight MediaWeight value in grams/m^2
MirrorPrint MirrorPrint value
NegativePrint NegativePrint value
NumCopies Number of copies to produce
Orientation Orientation value (cups_orient_t)
OutputFaceUp OutputFaceUp value
OutputType[64] OutputType string
PageSize[2] Width and length of page in points
Separations Separations value
TraySwitch TraySwitch value
Tumble Tumble value
cupsBitsPerColor Number of bits for each color
cupsBitsPerPixel Number of bits for each pixel
cupsBorderlessScalingFactor  CUPS 1.2/macOS 10.5  Scaling that was applied to page data
cupsBytesPerLine Number of bytes per line
cupsColorOrder Order of colors
cupsColorSpace True colorspace
cupsCompression Device compression to use
cupsHeight Height of page image in pixels
cupsImagingBBox[4]  CUPS 1.2/macOS 10.5  Floating point ImagingBoundingBox (scaling factor not applied, left, bottom, right, top)
cupsInteger[16]  CUPS 1.2/macOS 10.5  User-defined integer values
cupsMarkerType[64]  CUPS 1.2/macOS 10.5  Ink/toner type
cupsMediaType Media type code
cupsNumColors  CUPS 1.2/macOS 10.5  Number of color compoents
cupsPageSizeName[64]  CUPS 1.2/macOS 10.5  PageSize name
cupsPageSize[2]  CUPS 1.2/macOS 10.5  Floating point PageSize (scaling * factor not applied)
cupsReal[16]  CUPS 1.2/macOS 10.5  User-defined floating-point values
cupsRenderingIntent[64]  CUPS 1.2/macOS 10.5  Color rendering intent
cupsRowCount Rows per band
cupsRowFeed Feed between bands
cupsRowStep Spacing between lines
cupsString[16][64]  CUPS 1.2/macOS 10.5  User-defined string values
cupsWidth Width of page image in pixels

 DEPRECATED cups_page_header_s

Version 1 page header

struct cups_page_header_s {
    unsigned AdvanceDistance;
    cups_adv_t AdvanceMedia;
    cups_bool_t Collate;
    cups_cut_t CutMedia;
    cups_bool_t Duplex;
    unsigned HWResolution[2];
    unsigned ImagingBoundingBox[4];
    cups_bool_t InsertSheet;
    cups_jog_t Jog;
    cups_edge_t LeadingEdge;
    cups_bool_t ManualFeed;
    unsigned Margins[2];
    char MediaClass[64];
    char MediaColor[64];
    unsigned MediaPosition;
    char MediaType[64];
    unsigned MediaWeight;
    cups_bool_t MirrorPrint;
    cups_bool_t NegativePrint;
    unsigned NumCopies;
    cups_orient_t Orientation;
    cups_bool_t OutputFaceUp;
    char OutputType[64];
    unsigned PageSize[2];
    cups_bool_t Separations;
    cups_bool_t TraySwitch;
    cups_bool_t Tumble;
    unsigned cupsBitsPerColor;
    unsigned cupsBitsPerPixel;
    unsigned cupsBytesPerLine;
    cups_order_t cupsColorOrder;
    cups_cspace_t cupsColorSpace;
    unsigned cupsCompression;
    unsigned cupsHeight;
    unsigned cupsMediaType;
    unsigned cupsRowCount;
    unsigned cupsRowFeed;
    unsigned cupsRowStep;
    unsigned cupsWidth;
};

Members

AdvanceDistance AdvanceDistance value in points
AdvanceMedia AdvanceMedia value (cups_adv_t)
Collate Collated copies value
CutMedia CutMedia value (cups_cut_t)
Duplex Duplexed (double-sided) value
HWResolution[2] Resolution in dots-per-inch
ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
InsertSheet InsertSheet value
Jog Jog value (cups_jog_t)
LeadingEdge LeadingEdge value (cups_edge_t)
ManualFeed ManualFeed value
Margins[2] Lower-lefthand margins in points
MediaClass[64] MediaClass string
MediaColor[64] MediaColor string
MediaPosition MediaPosition value
MediaType[64] MediaType string
MediaWeight MediaWeight value in grams/m^2
MirrorPrint MirrorPrint value
NegativePrint NegativePrint value
NumCopies Number of copies to produce
Orientation Orientation value (cups_orient_t)
OutputFaceUp OutputFaceUp value
OutputType[64] OutputType string
PageSize[2] Width and length of page in points
Separations Separations value
TraySwitch TraySwitch value
Tumble Tumble value
cupsBitsPerColor Number of bits for each color
cupsBitsPerPixel Number of bits for each pixel
cupsBytesPerLine Number of bytes per line
cupsColorOrder Order of colors
cupsColorSpace True colorspace
cupsCompression Device compression to use
cupsHeight Height of page image in pixels
cupsMediaType Media type code
cupsRowCount Rows per band
cupsRowFeed Feed between bands
cupsRowStep Spacing between lines
cupsWidth Width of page image in pixels

Constants

cups_adv_e

AdvanceMedia attribute values

Constants

CUPS_ADVANCE_FILE Advance the roll after this file
CUPS_ADVANCE_JOB Advance the roll after this job
CUPS_ADVANCE_NONE Never advance the roll
CUPS_ADVANCE_PAGE Advance the roll after this page
CUPS_ADVANCE_SET Advance the roll after this set

cups_bool_e

Boolean type

Constants

CUPS_FALSE Logical false
CUPS_TRUE Logical true

cups_cspace_e

cupsColorSpace attribute values

Constants

CUPS_CSPACE_ADOBERGB  CUPS 1.4.5  Red, green, blue (Adobe RGB)
CUPS_CSPACE_CIELab  CUPS 1.1.19/macOS 10.3  CIE Lab
CUPS_CSPACE_CIEXYZ  CUPS 1.1.19/macOS 10.3  CIE XYZ
CUPS_CSPACE_CMY Cyan, magenta, yellow (DeviceCMY)
CUPS_CSPACE_CMYK Cyan, magenta, yellow, black (DeviceCMYK)
CUPS_CSPACE_DEVICE1  CUPS 1.4.5  DeviceN, 1 color
CUPS_CSPACE_DEVICE2  CUPS 1.4.5  DeviceN, 2 colors
CUPS_CSPACE_DEVICE3  CUPS 1.4.5  DeviceN, 3 colors
CUPS_CSPACE_DEVICE4  CUPS 1.4.5  DeviceN, 4 colors
CUPS_CSPACE_DEVICE5  CUPS 1.4.5  DeviceN, 5 colors
CUPS_CSPACE_DEVICE6  CUPS 1.4.5  DeviceN, 6 colors
CUPS_CSPACE_DEVICE7  CUPS 1.4.5  DeviceN, 7 colors
CUPS_CSPACE_DEVICE8  CUPS 1.4.5  DeviceN, 8 colors
CUPS_CSPACE_DEVICE9  CUPS 1.4.5  DeviceN, 9 colors
CUPS_CSPACE_DEVICEA  CUPS 1.4.5  DeviceN, 10 colors
CUPS_CSPACE_DEVICEB  CUPS 1.4.5  DeviceN, 11 colors
CUPS_CSPACE_DEVICEC  CUPS 1.4.5  DeviceN, 12 colors
CUPS_CSPACE_DEVICED  CUPS 1.4.5  DeviceN, 13 colors
CUPS_CSPACE_DEVICEE  CUPS 1.4.5  DeviceN, 14 colors
CUPS_CSPACE_DEVICEF  CUPS 1.4.5  DeviceN, 15 colors
CUPS_CSPACE_GMCK  DEPRECATED  Gold, magenta, yellow, black
CUPS_CSPACE_GMCS  DEPRECATED  Gold, magenta, yellow, silver
CUPS_CSPACE_GOLD  DEPRECATED  Gold foil
CUPS_CSPACE_ICC1  CUPS 1.1.19/macOS 10.3  ICC-based, 1 color
CUPS_CSPACE_ICC2  CUPS 1.1.19/macOS 10.3  ICC-based, 2 colors
CUPS_CSPACE_ICC3  CUPS 1.1.19/macOS 10.3  ICC-based, 3 colors
CUPS_CSPACE_ICC4  CUPS 1.1.19/macOS 10.3  ICC-based, 4 colors
CUPS_CSPACE_ICC5  CUPS 1.1.19/macOS 10.3  ICC-based, 5 colors
CUPS_CSPACE_ICC6  CUPS 1.1.19/macOS 10.3  ICC-based, 6 colors
CUPS_CSPACE_ICC7  CUPS 1.1.19/macOS 10.3  ICC-based, 7 colors
CUPS_CSPACE_ICC8  CUPS 1.1.19/macOS 10.3  ICC-based, 8 colors
CUPS_CSPACE_ICC9  CUPS 1.1.19/macOS 10.3  ICC-based, 9 colors
CUPS_CSPACE_ICCA  CUPS 1.1.19/macOS 10.3  ICC-based, 10 colors
CUPS_CSPACE_ICCB  CUPS 1.1.19/macOS 10.3  ICC-based, 11 colors
CUPS_CSPACE_ICCC  CUPS 1.1.19/macOS 10.3  ICC-based, 12 colors
CUPS_CSPACE_ICCD  CUPS 1.1.19/macOS 10.3  ICC-based, 13 colors
CUPS_CSPACE_ICCE  CUPS 1.1.19/macOS 10.3  ICC-based, 14 colors
CUPS_CSPACE_ICCF  CUPS 1.1.19/macOS 10.3  ICC-based, 15 colors
CUPS_CSPACE_K Black (DeviceK)
CUPS_CSPACE_KCMY  DEPRECATED  Black, cyan, magenta, yellow
CUPS_CSPACE_KCMYcm  DEPRECATED  Black, cyan, magenta, yellow, light-cyan, light-magenta
CUPS_CSPACE_RGB Red, green, blue (DeviceRGB, sRGB by default)
CUPS_CSPACE_RGBA Red, green, blue, alpha (DeviceRGB, sRGB by default)
CUPS_CSPACE_RGBW  CUPS 1.2/macOS 10.5  Red, green, blue, white (DeviceRGB, sRGB by default)
CUPS_CSPACE_SILVER  DEPRECATED  Silver foil
CUPS_CSPACE_SRGB  CUPS 1.4.5  Red, green, blue (sRGB)
CUPS_CSPACE_SW  CUPS 1.4.5  Luminance (gamma 2.2)
CUPS_CSPACE_W Luminance (DeviceGray, gamma 2.2 by default)
CUPS_CSPACE_WHITE  DEPRECATED  White ink (as black)
CUPS_CSPACE_YMC  DEPRECATED  Yellow, magenta, cyan
CUPS_CSPACE_YMCK  DEPRECATED  Yellow, magenta, cyan, black

cups_cut_e

CutMedia attribute values

Constants

CUPS_CUT_FILE Cut the roll after this file
CUPS_CUT_JOB Cut the roll after this job
CUPS_CUT_NONE Never cut the roll
CUPS_CUT_PAGE Cut the roll after this page
CUPS_CUT_SET Cut the roll after this set

cups_edge_e

LeadingEdge attribute values

Constants

CUPS_EDGE_BOTTOM Leading edge is the bottom of the page
CUPS_EDGE_LEFT Leading edge is the left of the page
CUPS_EDGE_RIGHT Leading edge is the right of the page
CUPS_EDGE_TOP Leading edge is the top of the page

cups_jog_e

Jog attribute values

Constants

CUPS_JOG_FILE Move pages after this file
CUPS_JOG_JOB Move pages after this job
CUPS_JOG_NONE Never move pages
CUPS_JOG_SET Move pages after this set

cups_mode_e

cupsRasterOpen modes

Constants

CUPS_RASTER_READ Open stream for reading
CUPS_RASTER_WRITE Open stream for writing
CUPS_RASTER_WRITE_COMPRESSED  CUPS 1.3/macOS 10.5  Open stream for compressed writing
CUPS_RASTER_WRITE_PWG  CUPS 1.5/macOS 10.7  Open stream for compressed writing in PWG Raster mode

cups_order_e

cupsColorOrder attribute values

Constants

CUPS_ORDER_BANDED CCC MMM YYY KKK ...
CUPS_ORDER_CHUNKED CMYK CMYK CMYK ...
CUPS_ORDER_PLANAR CCC ... MMM ... YYY ... KKK ...

cups_orient_e

Orientation attribute values

Constants

CUPS_ORIENT_0 Don't rotate the page
CUPS_ORIENT_180 Turn the page upside down
CUPS_ORIENT_270 Rotate the page clockwise
CUPS_ORIENT_90 Rotate the page counter-clockwise
cups-2.3.1/doc/help/man-ppdcfile.html000664 000765 000024 00000016512 13574721672 017526 0ustar00mikestaff000000 000000 ppdcfile(5)

ppdcfile(5)

Name

ppdcfile - cups ppd compiler source file format (deprecated)

Description

The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by ppdc(1). This man page provides a quick reference to the supported keywords and should be used in conjunction with the online help for CUPS.

The source file format is plain ASCII text that can be edited using your favorite text editor. Comments are supported using the C (/* ... */) and C++ (// ...) comment mechanisms.

Printer driver information can be grouped and shared using curly braces ({ ... }); PPD files are written when a close brace or end-of-file is seen and a PCFileName directive has been defined.

Directives may be placed anywhere on a line and are followed by one or more values. The following is a list of the available directives and the values they accept:

#define name value
#elif {name | value}
#else
#endif
#font name encoding "version" charset status
#if {name | value}
#include <filename>
#include "filename"
#media name width length
#media "name/text" width length
#po locale "filename"
Attribute name "" value
Attribute name keyword value
Attribute name "keyword/text" value
Choice name "code"
Choice "name/text" "code"
ColorDevice boolean-value
ColorModel name colorspace colororder compression
ColorModel "name/text" colorspace colororder compression
ColorProfile resolution/mediatype gamma density matrix
Copyright "text"
CustomMedia name width length left bottom right top "size-code" "region-code"
CustomMedia "name/text" width length left bottom right top "size-code" "region-code"
Cutter boolean-value
Darkness temperature name
Darkness temperature "name/text"
DriverType type
Duplex type
Filter mime-type cost program
Finishing name
Finishing "name/text"
Font *
Font name encoding "version" charset status
Group name
Group "name/text"
HWMargins left bottom right top
InputSlot position name
InputSlot position "name/text"
Installable name
Installable "name/text"
LocAttribute name "keyword/text" value
ManualCopies boolean-value
Manufacturer "name"
MaxSize width length
MediaSize name
MediaType type name
MediaType type "name/text"
MinSize width length
ModelName "name"
ModelNumber number
Option name type section order
Option "name/text" type section order
PCFileName "filename.ppd"
Resolution colorspace bits-per-color row-count row-feed row-step name
Resolution colorspace bits-per-color row-count row-feed row-step "name/text"
SimpleColorProfile resolution/mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust
Throughput pages-per-minute
UIConstraints "*Option1 *Option2"
UIConstraints "*Option1 Choice1 *Option2"
UIConstraints "*Option1 *Option2 Choice2"
UIConstraints "*Option1 Choice1 *Option2 Choice2"
VariablePaperSize boolean-value
Version number

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cupsd.html000664 000765 000024 00000006344 13574721672 017060 0ustar00mikestaff000000 000000 cupsd(8)

cupsd(8)

Name

cupsd - cups scheduler

Synopsis

cupsd [ -c cupsd.conf ] [ -f ] [ -F ] [ -h ] [ -l ] [ -s cups-files.conf ] [ -t ]

Description

cupsd is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1, and supports most of the requirements for IPP Everywhere. If no options are specified on the command-line then the default configuration file /etc/cups/cupsd.conf will be used.

Options

-c cupsd.conf
Uses the named cupsd.conf configuration file.
-f
Run cupsd in the foreground; the default is to run in the background as a "daemon".
-F
Run cupsd in the foreground but detach the process from the controlling terminal and current directory. This is useful for running cupsd from init(8).
-h
Shows the program usage.
-l
This option is passed to cupsd when it is run from launchd(8) or systemd(8).
-s cups-files.conf
Uses the named cups-files.conf configuration file.
-t
Test the configuration file for syntax errors.

Files

/etc/cups/classes.conf
/etc/cups/cups-files.conf
/etc/cups/cupsd.conf
/usr/share/cups/mime/mime.convs
/usr/share/cups/mime/mime.types
/etc/cups/printers.conf
/etc/cups/subscriptions.conf

Conforming To

cupsd implements all of the required IPP/2.1 attributes and operations. It also implements several CUPS-specific administrative operations.

Examples

Run cupsd in the background with the default configuration file:

    cupsd

Test a configuration file called test.conf:

    cupsd -t -c test.conf

Run cupsd in the foreground with a test configuration file called test.conf:

    cupsd -f -c test.conf

See Also

backend(7), classes.conf(5), cups(1), cups-files.conf(5), cups-lpd(8), cupsd.conf(5), cupsd-helper(8), cupsd-logs(8), filter(7), launchd(8), mime.convs(5), mime.types(5), printers.conf(5), systemd(8), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/encryption.html000664 000765 000024 00000010332 13574721672 017353 0ustar00mikestaff000000 000000 Managing Encryption

Managing Encryption

CUPS supports TLS encryption in two ways:

  1. Using HTTPS (always on) as soon as a connection is established, and
  2. Using HTTP Upgrade to TLS (opportunistic) after the connection is established.

CUPS supports self-signed, CA-signed, and enterprise certificates, with configurable certificate validation, cipher suite, and SSL/TLS version policies.

Out of the box, CUPS uses a Trust On First Use ("TOFU") certificate validation policy like the popular Secure Shell (ssh) software, requires TLS/1.0 or higher, only allows secure cipher suites, and automatically creates a "self-signed" certificate and private key for the scheduler so that remote administration operations and printer sharing are encrypted by default.

Configuring Client TLS Policies

The client.conf file controls the client TLS policies. The default policy is:

AllowAnyRoot Yes
AllowExpiredCerts No
Encryption IfRequested
SSLOptions None
TrustOnFirstUse Yes
ValidateCerts No

A client can be configured to only communicate with trusted TLS/1.1+ servers and printers by copying the corresponding certificates to the client (see below) and using the following policy in the client.conf file or macOS® printing preferences:

AllowAnyRoot No
AllowExpiredCerts No
Encryption Required
SSLOptions DenyTLS1.0
TrustOnFirstUse No
ValidateCerts Yes

Similarly, if a client needs to support an older server that only supports SSL/3.0 and RC4 cipher suites you can use the following policy option:

SSLOptions AllowRC4 AllowSSL3

Configuring Server TLS Policies

Two directives in the cups-files.conf file control the server (scheduler) TLS policies - CreateSelfSignedCerts and ServerKeychain. The default policy creates self-signed certificates as needed.

The DefaultEncryption and Encryption directives in the cupsd.conf file control whether encryption is used. The default configuration requires encryption for remote access whenever authentication is required.

Platform Differences

macOS®

On macOS, client configuration settings for ordinary users are stored in the ~/Library/Preferences/org.cups.PrintingPrefs.plist file. System-wide and user certificates are stored in the system and login keychains, with private CUPS keychains being used for self-signed and CUPS-managed certificates.

Windows®

On Windows, client configuration settings are controlled by the SSL/TLS Group Policy settings and certificate stores.

Other Platforms

Other platforms only use the client.conf file and PEM-encoded certificates (hostname.crt) and private keys (hostname.key) in the /etc/cups/ssl and ~/.cups/ssl directories. If present, the /etc/cups/ssl/site.crt file defines a site-wide CA certificate that is used to validate server and printer certificates. Certificates for known servers and printers are stored by CUPS in the corresponding ssl directory so they can be validated for subsequent connections.

CUPS also supports certificates created and managed by the popular Let's Encrypt certificate service, which are stored in the /etc/letsencrypt/live directory.

cups-2.3.1/doc/help/man-cupsd.conf.html000664 000765 000024 00000113446 13574721672 020006 0ustar00mikestaff000000 000000 cupsd.conf(5)

cupsd.conf(5)

Name

cupsd.conf - server configuration file for cups

Description

The cupsd.conf file configures the CUPS scheduler, cupsd(8). It is normally located in the /etc/cups directory. Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character.

Top-level Directives

The following top-level directives are understood by cupsd(8):
AccessLogLevel config
AccessLogLevel actions
AccessLogLevel all
Specifies the logging level for the AccessLog file. The "config" level logs when printers and classes are added, deleted, or modified and when configuration files are accessed or updated. The "actions" level logs when print jobs are submitted, held, released, modified, or canceled, and any of the conditions for "config". The "all" level logs all requests. The default access log level is "actions".
AutoPurgeJobs Yes
AutoPurgeJobs No

Specifies whether to purge job history data automatically when it is no longer required for quotas. The default is "No".
BrowseDNSSDSubTypes_subtype[,...]
Specifies a list of Bonjour sub-types to advertise for each shared printer. For example, "BrowseDNSSDSubTypes _cups,_print" will tell network clients that both CUPS sharing and IPP Everywhere are supported. The default is "_cups" which is necessary for printer sharing to work between systems using CUPS.
BrowseLocalProtocols all
BrowseLocalProtocols dnssd
BrowseLocalProtocols none
Specifies which protocols to use for local printer sharing. The default is "dnssd" on systems that support Bonjour and "none" otherwise.
BrowseWebIF Yes
BrowseWebIF No

Specifies whether the CUPS web interface is advertised. The default is "No".
Browsing Yes
Browsing No

Specifies whether shared printers are advertised. The default is "No".
DefaultAuthType Basic
DefaultAuthType Negotiate

Specifies the default type of authentication to use. The default is "Basic".
DefaultEncryption Never
DefaultEncryption IfRequested
DefaultEncryption Required
Specifies whether encryption will be used for authenticated requests. The default is "Required".
DefaultLanguage locale
Specifies the default language to use for text and web content. The default is "en".
DefaultPaperSize Auto
DefaultPaperSize None
DefaultPaperSize sizename
Specifies the default paper size for new print queues. "Auto" uses a locale-specific default, while "None" specifies there is no default paper size. Specific size names are typically "Letter" or "A4". The default is "Auto".
DefaultPolicy policy-name
Specifies the default access policy to use. The default access policy is "default".
DefaultShared Yes
DefaultShared No
Specifies whether local printers are shared by default. The default is "Yes".
DirtyCleanInterval seconds
Specifies the delay for updating of configuration and state files. A value of 0 causes the update to happen as soon as possible, typically within a few milliseconds. The default value is "30".
DNSSDHostNamehostname.example.com
Specifies the fully-qualified domain name for the server that is used for Bonjour sharing. The default is typically the server's ".local" hostname.
ErrorPolicy abort-job
Specifies that a failed print job should be aborted (discarded) unless otherwise specified for the printer.
ErrorPolicy retry-current-job
Specifies that a failed print job should be retried immediately unless otherwise specified for the printer.
ErrorPolicy retry-job
Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer.
ErrorPolicy stop-printer
Specifies that a failed print job should stop the printer unless otherwise specified for the printer. The 'stop-printer' error policy is the default.
FilterLimit limit
Specifies the maximum cost of filters that are run concurrently, which can be used to minimize disk, memory, and CPU resource problems. A limit of 0 disables filter limiting. An average print to a non-PostScript printer needs a filter limit of about 200. A PostScript printer needs about half that (100). Setting the limit below these thresholds will effectively limit the scheduler to printing a single job at any time. The default limit is "0".
FilterNice nice-value
Specifies the scheduling priority ( nice(8) value) of filters that are run to print a job. The nice value ranges from 0, the highest priority, to 19, the lowest priority. The default is 0.
GSSServiceName name
Specifies the service name when using Kerberos authentication. The default service name is "http."
HostNameLookups On
HostNameLookups Off
HostNameLookups Double
Specifies whether to do reverse lookups on connecting clients. The "Double" setting causes cupsd(8) to verify that the hostname resolved from the address matches one of the addresses returned for that hostname. Double lookups also prevent clients with unregistered addresses from connecting to your server. The default is "Off" to avoid the potential server performance problems with hostname lookups. Only set this option to "On" or "Double" if absolutely required.
IdleExitTimeout seconds
Specifies the length of time to wait before shutting down due to inactivity. The default is "60" seconds. Note: Only applicable when cupsd(8) is run on-demand (e.g., with -l).
JobKillDelay seconds
Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job. The default is "30".
JobRetryInterval seconds
Specifies the interval between retries of jobs in seconds. This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job". The default is "30".
JobRetryLimit count
Specifies the number of retries that are done for jobs. This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job". The default is "5".
KeepAlive Yes
KeepAlive No
Specifies whether to support HTTP keep-alive connections. The default is "Yes".
KeepAliveTimeout seconds
Specifies how long an idle client connection remains open. The default is "30".
<Limit operation ...> ... </Limit>
Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATION NAMES".
<Limit method ...> ... </Limit>
<LimitExcept method ...> ... </LimitExcept>
Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHOD NAMES".
LimitRequestBody size
Specifies the maximum size of print files, IPP requests, and HTML form data. The default is "0" which disables the limit check.
Listen ipv4-address:port
Listen [ipv6-address]:port
Listen *:port
Listen /path/to/domain/socket
Listens to the specified address and port or domain socket path for connections. Multiple Listen directives can be provided to listen on multiple addresses. The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks.
ListenBackLog number
Specifies the number of pending connections that will be allowed. This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections. When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones. The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems.
<Location /path> ... </Location>
Specifies access control for the named location. Paths are documented below in the section "LOCATION PATHS".
LogDebugHistory number
Specifies the number of debugging messages that are retained for logging if an error occurs in a print job. Debug messages are logged regardless of the LogLevel setting.
LogLevel none
LogLevel emerg
LogLevel alert
LogLevel crit
LogLevel error
LogLevel warn
LogLevel notice
LogLevel info
LogLevel debug
LogLevel debug2
Specifies the level of logging for the ErrorLog file. The value "none" stops all logging while "debug2" logs everything. The default is "warn".
LogTimeFormat standard
LogTimeFormat usecs
Specifies the format of the date and time in the log files. The value "standard" is the default and logs whole seconds while "usecs" logs microseconds.
MaxClients number
Specifies the maximum number of simultaneous clients that are allowed by the scheduler. The default is "100".
MaxClientsPerHost number
Specifies the maximum number of simultaneous clients that are allowed from a single address. The default is the MaxClients value.
MaxCopies number
Specifies the maximum number of copies that a user can print of each job. The default is "9999".
MaxHoldTime seconds
Specifies the maximum time a job may remain in the "indefinite" hold state before it is canceled. The default is "0" which disables cancellation of held jobs.
MaxJobs number
Specifies the maximum number of simultaneous jobs that are allowed. Set to "0" to allow an unlimited number of jobs. The default is "500".
MaxJobsPerPrinter number
Specifies the maximum number of simultaneous jobs that are allowed per printer. The default is "0" which allows up to MaxJobs jobs per printer.
MaxJobsPerUser number
Specifies the maximum number of simultaneous jobs that are allowed per user. The default is "0" which allows up to MaxJobs jobs per user.
MaxJobTime seconds
Specifies the maximum time a job may take to print before it is canceled. Set to "0" to disable cancellation of "stuck" jobs. The default is "10800" (3 hours).
MaxLogSize size
Specifies the maximum size of the log files before they are rotated. The value "0" disables log rotation. The default is "1048576" (1MB).
MultipleOperationTimeout seconds
Specifies the maximum amount of time to allow between files in a multiple file print job. The default is "900" (15 minutes).
<Policy name> ... </Policy>
Specifies access control for the named policy.
Port number
Listens to the specified port number for connections.
PreserveJobFiles Yes
PreserveJobFiles No
PreserveJobFiles seconds
Specifies whether job files (documents) are preserved after a job is printed. If a numeric value is specified, job files are preserved for the indicated number of seconds after printing. The default is "86400" (preserve 1 day).
PreserveJobHistory Yes
PreserveJobHistory No
PreserveJobHistory seconds
Specifies whether the job history is preserved after a job is printed. If a numeric value is specified, the job history is preserved for the indicated number of seconds after printing. If "Yes", the job history is preserved until the MaxJobs limit is reached. The default is "Yes".
ReloadTimeout seconds
Specifies the amount of time to wait for job completion before restarting the scheduler. The default is "30".
ServerAdmin email-address
Specifies the email address of the server administrator. The default value is "root@ServerName".
ServerAlias hostname [ ... hostname ]
ServerAlias *
The ServerAlias directive is used for HTTP Host header validation when clients connect to the scheduler from external interfaces. Using the special name "*" can expose your system to known browser-based DNS rebinding attacks, even when accessing sites through a firewall. If the auto-discovery of alternate names does not work, we recommend listing each alternate name with a ServerAlias directive instead of using "*".
ServerName hostname
Specifies the fully-qualified hostname of the server. The default is the value reported by the hostname(1) command.
ServerTokens None
ServerTokens ProductOnly
ServerTokens Major
ServerTokens Minor
ServerTokens Minimal
ServerTokens OS
ServerTokens Full
Specifies what information is included in the Server header of HTTP responses. "None" disables the Server header. "ProductOnly" reports "CUPS". "Major" reports "CUPS/major IPP/2". "Minor" reports "CUPS/major.minor IPP/2.1". "Minimal" reports "CUPS/major.minor.patch IPP/2.1". "OS" reports "CUPS/major.minor.path (osname osversion) IPP/2.1". "Full" reports "CUPS/major.minor.path (osname osversion; architecture) IPP/2.1". The default is "Minimal".
SSLListen ipv4-address:port
SSLListen [ipv6-address]:port
SSLListen *:port
Listens on the specified address and port for encrypted connections.
SSLOptions [AllowDH] [AllowRC4] [AllowSSL3] [DenyCBC] [DenyTLS1.0] [MaxTLS1.0] [MaxTLS1.1] [MaxTLS1.2] [MaxTLS1.3] [MinTLS1.0] [MinTLS1.1] [MinTLS1.2] [MinTLS1.3]
SSLOptions None
Sets encryption options (only in /etc/cups/client.conf). By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites. Security is reduced when Allow options are used. Security is enhanced when Deny options are used. The AllowDH option enables cipher suites using plain Diffie-Hellman key negotiation (not supported on systems using GNU TLS). The AllowRC4 option enables the 128-bit RC4 cipher suites, which are required for some older clients. The AllowSSL3 option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0. The DenyCBC option disables all CBC cipher suites. The DenyTLS1.0 option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1. The MinTLS options set the minimum TLS version to support. The MaxTLS options set the maximum TLS version to support. Not all operating systems support TLS 1.3 at this time.
SSLPort port
Listens on the specified port for encrypted connections.
StrictConformance Yes
StrictConformance No
Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications. The default is "No".
Timeout seconds
Specifies the HTTP request timeout. The default is "900" (15 minutes).
WebInterface yes
WebInterface no
Specifies whether the web interface is enabled. The default is "No".

Http Method Names

The following HTTP methods are supported by cupsd(8):
GET
Used by a client to download icons and other printer resources and to access the CUPS web interface.
HEAD
Used by a client to get the type, size, and modification date of resources.
OPTIONS
Used by a client to establish a secure (SSL/TLS) connection.
POST
Used by a client to submit IPP requests and HTML forms from the CUPS web interface.
PUT
Used by a client to upload configuration files.

Ipp Operation Names

The following IPP operations are supported by cupsd(8):
CUPS-Accept-Jobs
Allows a printer to accept new jobs.
CUPS-Add-Modify-Class
Adds or modifies a printer class.
CUPS-Add-Modify-Printer
Adds or modifies a printer.
CUPS-Authenticate-Job
Releases a job that is held for authentication.
CUPS-Delete-Class
Deletes a printer class.
CUPS-Delete-Printer
Deletes a printer.
CUPS-Get-Classes
Gets a list of printer classes.
CUPS-Get-Default
Gets the server default printer or printer class.
CUPS-Get-Devices
Gets a list of devices that are currently available.
CUPS-Get-Document
Gets a document file for a job.
CUPS-Get-PPD
Gets a PPD file.
CUPS-Get-PPDs
Gets a list of installed PPD files.
CUPS-Get-Printers
Gets a list of printers.
CUPS-Move-Job
Moves a job.
CUPS-Reject-Jobs
Prevents a printer from accepting new jobs.
CUPS-Set-Default
Sets the server default printer or printer class.
Cancel-Job
Cancels a job.
Cancel-Jobs
Cancels one or more jobs.
Cancel-My-Jobs
Cancels one or more jobs creates by a user.
Cancel-Subscription
Cancels a subscription.
Close-Job
Closes a job that is waiting for more documents.
Create-Job
Creates a new job with no documents.
Create-Job-Subscriptions
Creates a subscription for job events.
Create-Printer-Subscriptions
Creates a subscription for printer events.
Get-Job-Attributes
Gets information about a job.
Get-Jobs
Gets a list of jobs.
Get-Notifications
Gets a list of event notifications for a subscription.
Get-Printer-Attributes
Gets information about a printer or printer class.
Get-Subscription-Attributes
Gets information about a subscription.
Get-Subscriptions
Gets a list of subscriptions.
Hold-Job
Holds a job from printing.
Hold-New-Jobs
Holds all new jobs from printing.
Pause-Printer
Stops processing of jobs by a printer or printer class.
Pause-Printer-After-Current-Job
Stops processing of jobs by a printer or printer class after the current job is finished.
Print-Job
Creates a new job with a single document.
Purge-Jobs
Cancels one or more jobs and deletes the job history.
Release-Held-New-Jobs
Allows previously held jobs to print.
Release-Job
Allows a job to print.
Renew-Subscription
Renews a subscription.
Restart-Job
Reprints a job, if possible.
Send-Document
Adds a document to a job.
Set-Job-Attributes
Changes job information.
Set-Printer-Attributes
Changes printer or printer class information.
Validate-Job
Validates options for a new job.

Location Paths

The following paths are commonly used when configuring cupsd(8):
/
The path for all get operations (get-printers, get-jobs, etc.)
/admin
The path for all administration operations (add-printer, delete-printer, start-printer, etc.)
/admin/conf
The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
/admin/log
The path for access to the CUPS log files (access_log, error_log, page_log)
/classes
The path for all printer classes
/classes/name
The resource for the named printer class
/jobs
The path for all jobs (hold-job, release-job, etc.)
/jobs/id
The path for the specified job
/printers
The path for all printers
/printers/name
The path for the named printer
/printers/name.png
The icon file path for the named printer
/printers/name.ppd
The PPD file path for the named printer

Directives Valid Within Location And Limit Sections

The following directives may be placed inside Location and Limit sections in the cupsd.conf file:
Allow all
Allow none
Allow host.domain.com
Allow *.domain.com
Allow ipv4-address
Allow ipv4-address/netmask
Allow ipv4-address/mm
Allow [ipv6-address]
Allow [ipv6-address]/mm
Allow @IF(name)
Allow @LOCAL
Allows access from the named hosts, domains, addresses, or interfaces. The @IF(name) form uses the current subnets configured for the named interface. The @LOCAL form uses the current subnets configured for all interfaces that are not point-to-point, for example Ethernet and Wi-Fi interfaces are used but DSL and VPN interfaces are not. The Order directive controls whether Allow lines are evaluated before or after Deny lines.
AuthType None
AuthType Basic
AuthType Default
AuthType Negotiate
Specifies the type of authentication required. The value "Default" corresponds to the DefaultAuthType value.
Deny all
Deny none
Deny host.domain.com
Deny *.domain.com
Deny ipv4-address
Deny ipv4-address/netmask
Deny ipv4-address/mm
Deny [ipv6-address]
Deny [ipv6-address]/mm
Deny @IF(name)
Deny @LOCAL
Denies access from the named hosts, domains, addresses, or interfaces. The @IF(name) form uses the current subnets configured for the named interface. The @LOCAL form uses the current subnets configured for all interfaces that are not point-to-point, for example Ethernet and Wi-Fi interfaces are used but DSL and VPN interfaces are not. The Order directive controls whether Deny lines are evaluated before or after Allow lines.
Encryption IfRequested
Encryption Never
Encryption Required
Specifies the level of encryption that is required for a particular location. The default value is "IfRequested".
Order allow,deny
Specifies that access is denied by default. Allow lines are then processed followed by Deny lines to determine whether a client may access a particular resource.
Order deny,allow
Specifies that access is allowed by default. Deny lines are then processed followed by Allow lines to determine whether a client may access a particular resource.
Require group group-name [ group-name ... ]
Specifies that an authenticated user must be a member of one of the named groups.
Require user {user-name|@group-name} ...
Specifies that an authenticated user must match one of the named users or be a member of one of the named groups. The group name "@SYSTEM" corresponds to the list of groups defined by the SystemGroup directive in the cups-files.conf(5) file. The group name "@OWNER" corresponds to the owner of the resource, for example the person that submitted a print job. Note: The 'root' user is not special and must be granted privileges like any other user account.
Require valid-user
Specifies that any authenticated user is acceptable.
Satisfy all
Specifies that all Allow, AuthType, Deny, Order, and Require conditions must be satisfied to allow access.
Satisfy any
Specifies that any a client may access a resource if either the authentication (AuthType/Require) or address (Allow/Deny/Order) conditions are satisfied. For example, this can be used to require authentication only for remote accesses.

Directives Valid Within Policy Sections

The following directives may be placed inside Policy sections in the cupsd.conf file:
JobPrivateAccess all
JobPrivateAccess default
JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM} ...
Specifies an access list for a job's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values. "@OWNER" maps to the job's owner. "@SYSTEM" maps to the groups listed for the SystemGroup directive in the cups-files.conf(5) file.
JobPrivateValues all
JobPrivateValues default
JobPrivateValues none
JobPrivateValues attribute-name [ ... attribute-name ]
Specifies the list of job values to make private. The "default" values are "job-name", "job-originating-host-name", "job-originating-user-name", and "phone".
SubscriptionPrivateAccess all
SubscriptionPrivateAccess default
SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM} ...
Specifies an access list for a subscription's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values. "@OWNER" maps to the job's owner. "@SYSTEM" maps to the groups listed for the SystemGroup directive in the cups-files.conf(5) file.
SubscriptionPrivateValues all
SubscriptionPrivateValues default
SubscriptionPrivateValues none
SubscriptionPrivateValues attribute-name [ ... attribute-name ]
Specifies the list of subscription values to make private. The "default" values are "notify-events", "notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and "notify-user-data".

Deprecated Directives

The following directives are deprecated and will be removed in a future release of CUPS:
Classification banner

Specifies the security classification of the server. Any valid banner name can be used, including "classified", "confidential", "secret", "topsecret", and "unclassified", or the banner can be omitted to disable secure printing functions. The default is no classification banner.
ClassifyOverride Yes
ClassifyOverride No

Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option. The default is "No".
PageLogFormat format-string
Specifies the format of PageLog lines. Sequences beginning with percent (%) characters are replaced with the corresponding information, while all other characters are copied literally. The following percent sequences are recognized:

    "%%" inserts a single percent character.
    "%{name}" inserts the value of the specified IPP attribute.
    "%C" inserts the number of copies for the current page.
    "%P" inserts the current page number.
    "%T" inserts the current date and time in common log format.
    "%j" inserts the job ID.
    "%p" inserts the printer name.
    "%u" inserts the username.

The default is the empty string, which disables page logging. The string "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}" creates a page log with the standard items. Use "%{job-impressions-completed}" to insert the number of pages (sides) that were printed, or "%{job-media-sheets-completed}" to insert the number of sheets that were printed.
RIPCache size
Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer. The default is "128m".

Notes

File, directory, and user configuration directives that used to be allowed in the cupsd.conf file are now stored in the cups-files.conf(5) file instead in order to prevent certain types of privilege escalation attacks.

The scheduler MUST be restarted manually after making changes to the cupsd.conf file. On Linux this is typically done using the systemctl(8) command, while on macOS the launchctl(8) command is used instead.

The @LOCAL macro name can be confusing since the system running cupsd often belongs to a different set of subnets from its clients.

Conforming To

The cupsd.conf file format is based on the Apache HTTP Server configuration file format.

Examples

Log everything with a maximum log file size of 32 megabytes:

    AccessLogLevel all
    LogLevel debug2
    MaxLogSize 32m

Require authentication for accesses from outside the 10. network:

    <Location />
    Order allow,deny
    Allow from 10./8
    AuthType Basic
    Require valid-user
    Satisfy any
    </Location>

See Also

classes.conf(5), cups-files.conf(5), cupsd(8), mime.convs(5), mime.types(5), printers.conf(5), subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cupsd-helper.html000664 000765 000024 00000005131 13574721672 020326 0ustar00mikestaff000000 000000 cupsd-helper(8)

cupsd-helper(8)

Name

cupsd-helper - cupsd helper programs (deprecated)

Synopsis

cups-deviced request-id limit user-id options
cups-driverd cat ppd-name
cups-driverd list request_id limit options
cups-exec sandbox-profile [ -g group-id ] [ -n nice-value ] [ -u user-id ] /path/to/program argv0 ... argvN

Description

The cupsd-helper programs perform long-running operations on behalf of the scheduler, cupsd(8). The cups-deviced helper program runs each CUPS backend(7) with no arguments in order to discover the available printers.

The cups-driverd helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file.

The cups-exec helper program runs backends, filters, and other programs. On macOS these programs are run in a secure sandbox.

Files

The cups-driverd program looks for PPD and driver information files in the following directories:

    /Library/Printers
    /opt/share/ppd
    /System/Library/Printers
    /usr/local/share/ppd
    /usr/share/cups/drv
    /usr/share/cups/model
    /usr/share/ppd

PPD files can be compressed using the gzip(1) program or placed in compressed tar(1) archives to further reduce their size.

Driver information files must conform to the format defined in ppdcfile(5).

Notes

CUPS printer drivers, backends, and PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

backend(7), cups(1), cupsd(8), cupsd.conf(5), filter(7), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cups-snmp.html000664 000765 000024 00000005344 13574721672 017666 0ustar00mikestaff000000 000000 cups-snmp(8)

cups-snmp(8)

Name

snmp - cups snmp backend (deprecated)

Synopsis

/usr/lib/cups/backend/snmp ip-address-or-hostname
/usr/libexec/cups/backend/snmp ip-address-or-hostname
lpinfo -v --include-schemes snmp

Description

The DEPRECATED CUPS SNMP backend provides legacy discovery and identification of network printers using SNMPv1. When used for discovery through the scheduler, the backend will list all printers that respond to a broadcast SNMPv1 query with the "public" community name. Additional queries are then sent to printers that respond in order to determine the correct device URI, make and model, and other information needed for printing.

In the first form, the SNMP backend is run directly by the user to look up the device URI and other information when you have an IP address or hostname. This can be used for programs that need to configure print queues where the user has supplied an address but nothing else.

In the second form, the SNMP backend is run indirectly using the lpinfo(8) command. The output provides all printers detected via SNMP on the configured broadcast addresses. Note: no broadcast addresses are configured by default.

Environment

The DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment variable. The MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME environment variable.

Files

The SNMP backend reads the /etc/cups/snmp.conf configuration file, if present, to set the default broadcast address, community name, and logging level.

Notes

The CUPS SNMP backend is deprecated and will no longer be supported in a future version of CUPS.

Conforming To

The CUPS SNMP backend uses the information from the Host, Printer, and Port Monitor MIBs along with some vendor private MIBs and intelligent port probes to determine the correct device URI and make and model for each printer.

See Also

backend(7), cups-snmp.conf(5), cupsd(8), lpinfo(8), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-ippevepcl.html000664 000765 000024 00000003603 13574721672 017724 0ustar00mikestaff000000 000000 ippevepcl/ps(7)

ippevepcl/ps(7)

Name

ippevepcl/ps - pcl and postscript print commands for ippeveprinter

Synopsis

ippevepcl [ filename ]
ippeveps [ filename ]

Description

ippevepcl and ippeveps are print commands for ippeveprinter(1). As with all print commands, these commands read either the filename specified on the command-line or from the standard input. Output is sent to the standard output. Status and progress messages are sent to the standard error.

ippevepcl prints to B&W HP PCL laser printers and supports printing of HP PCL (application/vnd.hp-pcl), PWG Raster (image/pwg-raster), and Apple Raster (image/urf) print files.

ippeveps print to Adobe PostScript printers and supports printing of PDF (application/pdf), PostScript (application/postscript), JPEG (image/jpeg), PWG Raster (image/pwg-raster), and Apple Raster (image/urf) print files. Printer-specific commands are read from a supplied PPD file. If no PPD file is specified, generic commands suitable for any Level 2 or Level 3 PostScript printer are used instead to specify duplex printing and media size.

Exit Status

These programs return 1 on error and 0 on success.

Environment

These program inherit the environment provided by the ippeveprinter program.

See Also

ippeveprinter(8)

Copyright

Copyright © 2019 by Apple Inc. cups-2.3.1/doc/help/spec-ppd.html000664 000765 000024 00000264526 13574721672 016714 0ustar00mikestaff000000 000000 CUPS PPD Extensions

CUPS PPD Extensions

This specification describes the attributes and extensions that CUPS adds to Adobe TechNote #5003: PostScript Printer Description File Format Specification Version 4.3. PostScript Printer Description ("PPD") files describe the capabilities of each printer and are used by CUPS to support printer-specific features and intelligent filtering.

PPD File Syntax

The PPD format is text-based and uses lines of up to 255 characters terminated by a carriage return, linefeed, or combination of carriage return and line feed. The following ABNF definition [RFC5234] defines the general format of lines in a PPD file:

PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)

HEADER   = "*PPD-Adobe:" *WSP DQUOTE VERSION DQUOTE LINE-END

VERSION  = "4.0" / "4.1" / "4.2" / "4.3"

COMMENT  = "*%" *TCHAR LINE-END

DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
           1*(*WSP VALUE) LINE-END

VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE

KCHAR    = ALPHA / DIGIT / "_" / "." / "-"

SCHAR    = LINE-END / WSP / %x21.23-7E.A0-FF

TCHAR    = %x20-7E.A0-FF

LINE-END = CR / LF / CR LF

Auto-Configuration

CUPS supports several methods of auto-configuration via PPD keywords.

macOS 10.5APAutoSetupTool

*APAutoSetupTool: "/LibraryPrinters/vendor/filename"

This macOS keyword defines a program that sets the default option choices. It is run when a printer is added from the Add Printer window or the Nearby Printers list in the Print dialog.

The program is provided with two arguments: the printer's device URI and the PPD file to be used for the printer. The program must write an updated PPD file to stdout.

Examples:

*% Use our setup tool when adding a printer
*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"

macOS 10.2/CUPS 1.4?MainKeyword

*?MainKeyword: "
PostScript query code that writes a message using the = operator...
"
*End

The ?MainKeyword keyword defines PostScript code that determines the currently selected/enabled option keyword (choice) for the main keyword (option). It is typically used when communicating with USB, serial, Appletalk, and AppSocket (port 9100) printers.

The PostScript code typically sends its response back using the = operator.

Example:

*OpenUI OptionDuplex/Duplexer Installed: Boolean
*DuplexOptionDuplex: False
*OptionDuplex False/Not Installed: ""
*OptionDuplex True/Installed: ""

*% Query the printer for the presence of the duplexer option...
*?OptionDuplex: "
  currentpagedevice /Duplex known
  {(True)} {(False)} ifelse
  = flush
"
*End
*CloseUI: OptionDuplex

macOS 10.4/CUPS 1.5OIDMainKeyword

*?OIDMainKeyword: ".n.n.n..."
*OIDMainKeyword OptionKeyword1: "value"
...
*OIDMainKeyword OptionKeywordN: "value"

The OIDMainKeyword keyword is used to define SNMP OIDs that map to installable options. The first (query) line defines the OID to lookup on the network device. The second and subsequent keywords define a mapping from OID value to option keyword. Since SNMP is an IP-based network protocol, this method is typically only used to configure AppSocket, IPP, and LPD network printers.

Examples:

*% Get the installed memory on the printer...
*?OIDInstalledMemory: ".1.3.6.1.2.1.25.2.2.0"
*OIDInstalledMemory 16MB: "16384 KBytes"
*OIDInstalledMemory 32MB: "32768 KBytes"
*OIDInstalledMemory 48MB: "49152 KBytes"
*OIDInstalledMemory 72MB: "73728 KBytes"

Color Profiles

CUPS supports three types of color profiles. The first type is based on sRGB and is used by the standard CUPS raster filters and GPL Ghostscript. The second type is based on ICC profiles and is used by the Quartz-based filters on macOS. The final type is based on well-known colorspaces such as sRGB and Adobe RGB.

Note:

At this time, none of the CUPS raster filters support ICC profiles. This will be addressed as time and resources permit.

DeprecatedcupsColorProfile

*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"

This string keyword specifies an sRGB-based color profile consisting of gamma and density controls and a 3x3 CMY color transform matrix. This keyword is not supported on macOS.

The Resolution and MediaType values may be "-" to act as a wildcard. Otherwise they must match one of the Resolution or MediaType option keywords defined in the PPD file.

The density and gamma values define gamma and density adjustment function such that:

f(x) = density * x gamma

The m00 through m22 values define a 3x3 transformation matrix for the CMY color values. The density function is applied after the CMY transformation:

| m00 m01 m02 |
| m10 m11 m12 |
| m20 m21 m22 |

Examples:

*% Specify a profile for printing at 360dpi on all media types
*cupsColorProfile 360dpi/-: "1.0 1.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

*% Specify a profile for printing at 720dpi on Glossy media
*cupsColorProfile 720dpi/Glossy: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

*% Specify a default profile for printing at all other resolutions and media types
*cupsColorProfile -/-: "0.9 2.0 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"

macOS 10.3/CUPS 1.2cupsICCProfile

*cupsICCProfile ColorModel.MediaType.Resolution/Description: "filename"

This keyword specifies an ICC color profile that is used to convert the document colors to the device colorspace. The ColorModel, MediaType, and Resolution option keywords specify a selector for color profiles. If omitted, the color profile will match any option keyword for the corresponding main keyword.

The Description specifies human-readable text that is associated with the color profile. The filename portion specifies the ICC color profile to use; if the filename is not absolute, it is loaded relative to the /usr/share/cups/profiles directory.

Examples:

*% Specify a profile for CMYK printing at 360dpi on all media types
*cupsICCProfile CMYK..360dpi/360dpi CMYK: "/Library/Printers/vendor/Profiles/foo-360-cmyk.icc"

*% Specify a profile for RGB printing at 720dpi on Glossy media
*cupsColorProfile RGB.Glossy.720dpi/720dpi Glossy: "/Library/Printers/vendor/Profiles/foo-720-glossy-rgb.icc"

*% Specify a default profile for printing at all other resolutions and media types
*cupsICCProfile ../Default: "/Library/Printers/vendor/Profiles/foo-default.icc"

Customizing the Profile Selection Keywords

The ColorModel, MediaType, and Resolution main keywords can be reassigned to different main keywords, allowing drivers to do color profile selection based on different parameters. The cupsICCQualifier1, cupsICCQualifier2, and cupsICCQualifier3 keywords define the mapping from selector to main keyword:

*cupsICCQualifier1: MainKeyword1
*cupsICCQualifier2: MainKeyword2
*cupsICCQualifier3: MainKeyword3

The default mapping is as follows:

*cupsICCQualifier1: ColorModel
*cupsICCQualifier2: MediaType
*cupsICCQualifier3: Resolution

macOS 10.4Custom Color Matching Support

*APSupportsCustomColorMatching: true
*APCustomColorMatchingName name/text: ""
*APCustomColorMatchingProfile: profile
*APDefaultCustomColorMatchingProfile: profile

These keywords tell the macOS raster filters that the printer driver provides its own custom color matching and that generic color profiles should be used when generating 1-, 3-, and 4-component raster data as requested by the driver. The APCustomColorMatchingProfile and APDefaultColorMatchingProfile keywords specify alternate color profiles (sRGB or AdobeRGB) to use for 3-color (RGB) raster data.

Note:

Prior to macOS 10.6, the default RGB color space was Apple's "GenericRGB". The new default in macOS 10.6 and later is "sRGB". For more information, see "macOS v10.6: About gamma 2.2" on Apple's support site.

macOS 10.5APCustomColorMatchingName

*APCustomColorMatchingName name/text: ""

This keyword defines an alternate name for the color matching provided by a driver in the Color Matching print panel. The default is to use the name "Vendor Matching" or its localized equivalent.

Examples:

*% Define the names for our color matching...
*APCustomColorMatchingName name/AcmeColor(tm): ""
*fr.APCustomColorMatchingName name/La AcmeColor(tm): ""

macOS 10.5APCustomColorMatchingProfile

*APCustomColorMatchingProfile: name

This keyword defines a supported RGB color profile that can be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported. If not specified, RGB data will use the GenericRGB colorspace.

Note:

If you provide multiple APCustomColorMatchingProfile keywords, you are responsible for providing the necessary user interface controls to select the profile in a print dialog pane. Add the named profile to the print settings using the key kPMCustomColorMatchingProfileKey.

Examples:

*% Use sRGB for RGB color by default, but support both sRGB and AdobeRGB
*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB
*APCustomColorMatchingProfile: sRGB
*APCustomColorMatchingProfile: AdobeRGB

macOS 10.5APDefaultCustomColorMatchingProfile

*APDefaultCustomColorMatchingProfile: name

This keyword defines the default RGB color profile that will be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported.

Examples:

*% Use sRGB for RGB color by default
*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB

macOS 10.4APSupportsCustomColorMatching

*APSupportsCustomColorMatching: boolean

This keyword specifies that the driver provides its own custom color matching. When true, the default hand-off colorspace will be GenericGray, GenericRGB, or GenericCMYK depending on the number of components the driver requests. The APDefaultCustomColorMatchingProfile keyword can be used to override the default 3-component (RGB) colorspace.

The default for APSupportsCustomColorMatching is false.

Examples:

*APSupportsCustomColorMatching: true
*APDefaultCustomColorMatchingProfile: sRGB

Constraints

Constraints are option choices that are not allowed by the driver or device, for example printing 2-sided transparencies. All versions of CUPS support constraints defined by the legacy Adobe UIConstraints and NonUIConstraints keywords which support conflicts between any two option choices, for example:

*% Do not allow 2-sided printing on transparency media
*UIConstraints: "*Duplex *MediaType Transparency"
*UIConstraints: "*MediaType Transparency *Duplex"

While nearly all constraints can be expressed using these keywords, there are valid scenarios requiring constraints between more than two option choices. In addition, resolution of constraints is problematic since users and software have to guess how a particular constraint is best resolved.

CUPS 1.4 and higher define two new keywords for constraints, cupsUIConstraints and cupsUIResolver. Each cupsUIConstraints keyword points to a cupsUIResolver keyword which specifies alternate options that resolve the conflict condition. The same cupsUIResolver can be used by multiple cupsUIConstraints.

Note:

When developing PPD files that contain constraints, it is very important to use the cupstestppd(1) program to verify that your constraints are accurate and cannot result in unresolvable option selections.

CUPS 1.4/macOS 10.6cupsUIConstraints

*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 *Keyword2 OptionKeyword2 ..."
*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
*cupsUIConstraints: "*InstallableKeyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

Lists two or more options which conflict. The "resolver" string is a (possibly unique) keyword which specifies which options to change when the constraint exists. When no resolver is provided, CUPS first tries the default choice followed by testing each option choice to resolve the conflict.

Examples:

*% Specify that 2-sided printing cannot happen on transparencies
*cupsUIConstraints transparency: "*Duplex *MediaType Transparency"

*% Specify that envelope printing cannot happen from the paper trays
*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"

*% Specify an installable option constraint for the envelope feeder
*cupsUIConstraints: "*InputSlot EnvFeeder *InstalledEnvFeeder"

*% Specify that photo printing cannot happen on plain paper or transparencies at 1200dpi
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Plain *Resolution 1200dpi"
*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"

CUPS 1.4/macOS 10.6cupsUIResolver

*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

Specifies two or more options to mark/select to resolve a constraint. The "resolver" string identifies a particular action to take for one or more cupsUIConstraints. The same action can be used for multiple constraints. The option keyword pairs are treated as an ordered list of option selections to try - only the first N selections will be used, where N is the minimum number of selections required. Because cupsResolveConflicts() will not change the most recent option selection passed to it, at least two options from the constraints must be listed to avoid situations where conflicts cannot be resolved.

Examples:

*% Specify the options to change for the 2-sided transparency constraint
*cupsUIResolver transparency: "*Duplex None *MediaType Plain"

*% Specify the options to change for the envelope printing constraints.  Notice
*% that we try to change the InputSlot to either the envelope feeder or the
*% manual feed first, then we change the page size...
*cupsUIResolver envelope: "*InputSlot EnvFeeder *InputSlot ManualFeed *PageSize Letter"

*% Specify the options to change for the photo printing constraints
*cupsUIResolver photo: "*OutputMode Best *Resolution 600dpi"

Globalized PPD Support

CUPS 1.2 and higher adds support for PPD files containing multiple languages by following the following additional rules:

  1. The LanguageVersion MUST be English
  2. The LanguageEncoding MUST be ISOLatin1
  3. The cupsLanguages keyword MUST be provided and list each of the supported locales in the PPD file
  4. Main and option keywords MUST NOT exceed 34 (instead of 40) characters to allow room for the locale prefixes in translation keywords
  5. The main keyword "Translation" MUST NOT be used
  6. Translation strings included with the main and option keywords MUST NOT contain characters outside the ASCII subset of ISOLatin1 and UTF-8; developers wishing to use characters outside ASCII MUST provide a separate set of English localization keywords for the affected keywords.
  7. Localizations are specified using a locale prefix of the form "ll" or "ll_CC." where "ll" is the 2-letter ISO language code and "CC" is the 2-letter ISO country code
    • A generic language translation ("ll") SHOULD be provided with country-specific differences ("ll_CC") provided only as needed
    • For historical reasons, the "zh" and "zh_CN" locales map to Simplified Chinese while the "zh_TW" locale maps to Traditional Chinese
  8. Locale-specific translation strings MUST be encoded using UTF-8.
  9. Main keywords MUST be localized using one of the following forms:

    *ll.Translation MainKeyword/translation text: ""
    *ll_CC.Translation MainKeyword/translation text: ""

  10. Option keywords MUST be localized using one of the following forms:

    *ll.MainKeyword OptionKeyword/translation text: ""
    *ll_CC.MainKeyword OptionKeyword/translation text: ""

  11. Localization keywords MAY appear anywhere after the first line of the PPD file
Note:

We use a LanguageEncoding value of ISOLatin1 and limit the allowed base translation strings to ASCII to avoid character coding issues that would otherwise occur. In addition, requiring the base translation strings to be in English allows for easier fallback translation when no localization is provided in the PPD file for a given locale.

Examples:

*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*cupsLanguages: "de fr_CA"
*ModelName: "Foobar Laser 9999"

*% Localize ModelName for French and German
*fr_CA.Translation ModelName/La Foobar Laser 9999: ""
*de.Translation ModelName/Foobar LaserDrucken 9999: ""

*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
*% Localize printer-state-reason for French and German
*fr_CA.cupsIPPReason com.vendor-error/Une erreur sèrieuse s'est produite: "/help/com.vendor/error.html"
*de.cupsIPPReason com.vendor-error/Eine ernste Störung trat: "/help/com.vendor/error.html"

...

*OpenUI *InputSlot/Paper Source: PickOne
*OrderDependency: 10 AnySetup *InputSlot
*DefaultInputSlot: Auto
*% Localize InputSlot for French and German
*fr_CA.Translation InputSlot/Papier source: ""
*de.Translation InputSlot/Papiereinzug: ""
*InputSlot Auto/Default: "<</ManualFeed false>>setpagedevice"
*% Localize InputSlot=Auto for French and German
*fr_CA.InputSlot Auto/Par Defaut: ""
*de.InputSlot Auto/Standard: ""
*InputSlot Manual/Manual Feed: "<</ManualFeed true>>setpagedevice"
*% Localize InputSlot=Manual for French and German
*fr_CA.InputSlot Manual/Manuel mecanisme de alimentation: ""
*de.InputSlot Manual/Manueller Einzug: ""
*CloseUI: *InputSlot

CUPS 1.3/macOS 10.6Custom Options

CUPS supports custom options using an extension of the CustomPageSize and ParamCustomPageSize syntax:

*CustomFoo True: "command"
*ParamCustomFoo Name1/Text 1: order type minimum maximum
*ParamCustomFoo Name2/Text 2: order type minimum maximum
...
*ParamCustomFoo NameN/Text N: order type minimum maximum

When the base option is part of the JCLSetup section, the "command" string contains JCL commands with "\order" placeholders for each numbered parameter. The CUPS API handles any necessary value quoting for HP-PJL commands. For example, if the JCL command string is "@PJL SET PASSCODE=\1" and the first option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234".

For non-JCLSetup options, the "order" value is a number from 1 to N and specifies the order of values as they are placed on the stack before the command. For example, if the PostScript command string is "<</cupsReal1 2 1 roll>>setpagedevice" and the option value is "2.0" then CUPS will output the string "2.0 <</cupsReal1 2 1 roll>>setpagedevice".

The "type" is one of the following keywords:

  • curve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x value
  • int - an integer value from "minimum" to "maximum"
  • invcurve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x 1 / value
  • passcode - a string of numbers value with a minimum of "minimum" numbers and a maximum of "maximum" numbers ("minimum" and "maximum" are numbers and passcode strings are not displayed in the user interface)
  • password - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers and password strings are not displayed in the user interface)
  • points - a measurement value in points from "minimum" to "maximum"
  • real - a real value from "minimum" to "maximum"
  • string - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers)

Examples:

*% Base JCL key code option
*JCLOpenUI JCLPasscode/Key Code: PickOne
*OrderDependency: 10 JCLSetup *JCLPasscode
*DefaultJCLPasscode: None
*JCLPasscode None/No Code: ""
*JCLPasscode 1111: "@PJL SET PASSCODE = 1111<0A>"
*JCLPasscode 2222: "@PJL SET PASSCODE = 2222<0A>"
*JCLPasscode 3333: "@PJL SET PASSCODE = 3333<0A>"
*JCLCloseUI: *JCLPasscode

*% Custom JCL key code option
*CustomJCLPasscode True: "@PJL SET PASSCODE = \1<0A>"
*ParamCustomJCLPasscode Code/Key Code: 1 passcode 4 4


*% Base PostScript watermark option
*OpenUI WatermarkText/Watermark Text: PickOne
*OrderDependency: 10 AnySetup *WatermarkText
*DefaultWatermarkText: None
*WatermarkText None: ""
*WatermarkText Draft: "<</cupsString1(Draft)>>setpagedevice"
*CloseUI: *WatermarkText

*% Custom PostScript watermark option
*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
*ParamCustomWatermarkText Text: 1 string 0 32


*% Base PostScript gamma/density option
*OpenUI GammaDensity/Gamma and Density: PickOne
*OrderDependency: 10 AnySetup *GammaDensity
*DefaultGammaDensity: Normal
*GammaDensity Normal/Normal: "<</cupsReal1 1.0/cupsReal2 1.0>>setpagedevice"
*GammaDensity Light/Lighter: "<</cupsReal1 0.9/cupsReal2 0.67>>setpagedevice"
*GammaDensity Dark/Darker: "<</cupsReal1 1.1/cupsReal2 1.5>>setpagedevice"
*CloseUI: *GammaDensity

*% Custom PostScript gamma/density option
*CustomGammaDensity True: "<</cupsReal1 3 -1 roll/cupsReal2 5 -1>>setpagedevice"
*ParamCustomGammaDensity Gamma: 1 curve 0.1 10
*ParamCustomGammaDensity Density: 2 real 0 2

Writing PostScript Option Commands for Raster Drivers

PPD files are used for both PostScript and non-PostScript printers. For CUPS raster drivers, you use a subset of the PostScript language to set page device keywords such as page size, resolution, and so forth. For example, the following code sets the page size to A4 size:

*PageSize A4: "<</PageSize[595 842]>>setpagedevice"

Custom options typically use other operators to organize the values into a key/value dictionary for setpagedevice. For example, our previous CustomWatermarkText option code uses the roll operator to move the custom string value into the dictionary for setpagedevice:

*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"

For a custom string value of "My Watermark", CUPS will produce the following PostScript code for the option:

(My Watermark)
<</cupsString1 3 -1 roll>>setpagedevice

The code moves the string value ("My Watermark") from the bottom of the stack to the top, creating a dictionary that looks like:

<</cupsString1(My Watermark)>>setpagedevice

The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.

Custom Page Size Code

There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:

*ParamCustomPageSize Width:        1 points min-width max-width
*ParamCustomPageSize Height:       2 points min-height max-height
*ParamCustomPageSize WidthOffset:  3 points 0 0
*ParamCustomPageSize HeightOffset: 4 points 0 0
*ParamCustomPageSize Orientation:  5 int 0 0
*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"

Supported PostScript Operators

CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:

  • << - Start a dictionary.
  • >> - End a dictionary.
  • [ - Start an array.
  • ] - End an array.
  • copy - Copy the top N objects on the stack.
  • dup - Copy the top object on the stack.
  • index - Copy the Nth from the top object on the stack.
  • pop - Pop the top object on the stack.
  • roll - Shift the top N objects on the stack.
  • setpagedevice - Set the page header values according to the key/value dictionary on the stack.
Note:

Never use the unsupported dict or put operators in your option code. These operators are typically used in option code dating back to Level 1 PostScript printers, which did not support the simpler << or >> operators. If you have old option code using dict or put, you can rewrite it very easily to use the newer << and >> operators instead. For example, the following code to set the page size:

1 dict dup /PageSize [612 792] put setpagedevice

can be rewritten as:

<< /PageSize [612 792] >> setpagedevice

Supported Page Device Attributes

Table 2 shows the supported page device attributes along with PostScript code examples.

Table 2: Supported Page Device Attributes
Name(s) Type Description Example(s)
AdvanceDistance Integer Specifies the number of points to advance roll media after printing. <</AdvanceDistance 18>>setpagedevice
AdvanceMedia Integer Specifies when to advance the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</AdvanceMedia 4>>setpagedevice
Collate Boolean Specifies whether collated copies are required. <</Collate true>>setpagedevice
CutMedia Integer Specifies when to cut the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</CutMedia 1>>setpagedevice
Duplex Boolean Specifies whether 2-sided printing is required. <</Duplex true>>setpagedevice
HWResolution Integer Array Specifies the resolution of the page image in pixels per inch. <</HWResolution[1200 1200]>>setpagedevice
InsertSheet Boolean Specifies whether to insert a blank sheet before the job. <</InsertSheet true>>setpagedevice
Jog Integer Specifies when to shift the media in the output bin: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page. <</Jog 2>>setpagedevice
LeadingEdge Integer Specifies the leading edge of the media: 0 = top, 1 = right, 2 = bottom, 3 = left. <</LeadingEdge 0>>setpagedevice
ManualFeed Boolean Specifies whether media should be drawn from the manual feed tray. Note: The MediaPosition attribute is preferred over the ManualFeed attribute. <</ManualFeed true>>setpagedevice
MediaClass String Specifies a named media. <</MediaClass (Invoices)>>setpagedevice
MediaColor String Specifies the color of the media. <</MediaColor >>setpagedevice
MediaPosition Integer Specifies the tray or source of the media. <</MediaPosition 12>>setpagedevice
MediaType String Specifies the general media type. <</MediaType (Glossy)>>setpagedevice
MediaWeight Integer Specifies the media weight in grams per meter2. <</MediaWeight 100>>setpagedevice
MirrorPrint Boolean Specifies whether to flip the output image horizontally. <</MirrorPrint true>>setpagedevice
NegativePrint Boolean Specifies whether to invert the output image. <</NegativePrint true>>setpagedevice
NumCopies Integer Specifies the number of copies to produce of each page. <</NumCopies 100>>setpagedevice
Orientation Integer Specifies the orientation of the output: 0 = portrait, 1 = landscape rotated counter-clockwise, 2 = upside-down, 3 = landscape rotated clockwise. <</Orientation 3>>setpagedevice
OutputFaceUp Boolean Specifies whether to place the media face-up in the output bin/tray. <</OutputFaceUp true>>setpagedevice
OutputType String Specifies the output type name. <</OutputType (Photo)>>setpagedevice
PageSize Integer/Real Array Specifies the width and length/height of the page in points. <</PageSize[595 842]>>setpagedevice
Separations Boolean Specifies whether to produce color separations. <</Separations true>>setpagedevice
TraySwitch Boolean Specifies whether to switch trays automatically. <</TraySwitch true>>setpagedevice
Tumble Boolean Specifies whether the back sides of pages are rotated 180 degrees. <</Tumble true>>setpagedevice
cupsBorderlessScalingFactor Real Specifies the amount to scale the page image dimensions. <</cupsBorderlessScalingFactor 1.01>>setpagedevice
cupsColorOrder Integer Specifies the order of colors: 0 = chunked, 1 = banded, 2 = planar. <</cupsColorOrder 0>>setpagedevice
cupsColorSpace Integer Specifies the page image colorspace: 0 = W, 1 = RGB, 2 = RGBA, 3 = K, 4 = CMY, 5 = YMC, 6 = CMYK, 7 = YMCK, 8 = KCMY, 9 = KCMYcm, 10 = GMCK, 11 = GMCS, 12 = White, 13 = Gold, 14 = Silver, 15 = CIE XYZ, 16 = CIE Lab, 17 = RGBW, 32 to 46 = CIE Lab (1 to 15 inks) <</cupsColorSpace 1 >>setpagedevice
cupsCompression Integer Specifies a driver compression type/mode. <</cupsCompression 2>>setpagedevice
cupsInteger0
...
cupsInteger15
Integer Specifies driver integer values. <</cupsInteger11 1234>>setpagedevice
cupsMarkerType String Specifies the type of ink/toner to use. <</cupsMarkerType (Black+Color)>>setpagedevice
cupsMediaType Integer Specifies a numeric media type. <</cupsMediaType 999>>setpagedevice
cupsPageSizeName String Specifies the name of the page size. <</cupsPageSizeName (A4.Full)>>setpagedevice
cupsPreferredBitsPerColor Integer Specifies the preferred number of bits per color, typically 8 or 16. <</cupsPreferredBitsPerColor 16>>setpagedevice
cupsReal0
...
cupsReal15
Real Specifies driver real number values. <</cupsReal15 1.234>>setpagedevice
cupsRenderingIntent String Specifies the color rendering intent. <</cupsRenderingIntent (AbsoluteColorimetric)>>setpagedevice
cupsRowCount Integer Specifies the number of rows of raster data to print on each line for some drivers. <</cupsRowCount 24>>setpagedevice
cupsRowFeed Integer Specifies the number of rows to feed between passes for some drivers. <</cupsRowFeed 17>>setpagedevice
cupsRowStep Integer Specifies the number of lines between columns/rows on the print head for some drivers. <</cupsRowStep 2>>setpagedevice
cupsString0
...
cupsString15
String Specifies driver string values. <</cupsString0(String Value)>>setpagedevice

Media Keywords

The CUPS media keywords allow drivers to specify alternate custom page size limits based on up to two options.

CUPS 1.4/macOS 10.6cupsMediaQualifier2

*cupsMediaQualifier2: MainKeyword

This keyword specifies the second option to use for overriding the custom page size limits.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMediaQualifier3

*cupsMediaQualifier3: MainKeyword

This keyword specifies the third option to use for overriding the custom page size limits.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMinSize

*cupsMinSize .Qualifier2.Qualifier3: "width length"
*cupsMinSize .Qualifier2.: "width length"
*cupsMinSize ..Qualifier3: "width length"

This keyword specifies alternate minimum custom page sizes in points. The cupsMediaQualifier2 and cupsMediaQualifier3 keywords are used to identify options to use for matching.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsMaxSize

*cupsMaxSize .Qualifier2.Qualifier3: "width length"
*cupsMaxSize .Qualifier2.: "width length"
*cupsMaxSize ..Qualifier3: "width length"

This keyword specifies alternate maximum custom page sizes in points. The cupsMediaQualifier2 and cupsMediaQualifier3 keywords are used to identify options to use for matching.

Example:

*% Specify alternate custom page size limits based on InputSlot and Quality
*cupsMediaQualifier2: InputSlot
*cupsMediaQualifier3: Quality
*cupsMaxSize .Manual.: "1000 1000"
*cupsMinSize .Manual.: "100 100"
*cupsMinSize .Manual.Photo: "200 200"
*cupsMinSize ..Photo: "300 300"

CUPS 1.4/macOS 10.6cupsPageSizeCategory

*cupsPageSizeCategory name/text: "name name2 ... nameN"

This keyword lists related paper size names that should be grouped together in the Print or Page Setup dialogs. The "name" portion of the keyword specifies the root/default size for the grouping. On macOS the grouped paper sizes are shown in a submenu of the main paper size. When omitted, sizes with the same dimensions are automatically grouped together, for example "Letter" and "Letter.Borderless".

Example:

*% Specify grouping of borderless/non-borderless sizes
*cupsPageSizeCategory Letter/US Letter: "Letter Letter.Borderless"
*cupsPageSizeCategory A4/A4: "A4 A4.Borderless"

General Attributes

CUPS 1.3/macOS 10.5cupsBackSide

*cupsBackSide: keyword

This keyword requests special handling of the back side of pages when doing duplexed (2-sided) output. Table 1 shows the supported keyword values for this keyword and their effect on the raster data sent to your driver. For example, when cupsBackSide is Rotated and Tumble is false, your driver will receive print data starting at the bottom right corner of the page, with each line going right-to-left instead of left-to-right. The default value is Normal.

Note:

cupsBackSide replaces the older cupsFlipDuplex keyword - if cupsBackSide is specified, cupsFlipDuplex will be ignored.

Table 1: Back Side Raster Coordinate System
cupsBackSide Tumble Value Image Presentation
Normal false Left-to-right, top-to-bottom
Normal true Left-to-right, top-to-bottom
ManualTumble false Left-to-right, top-to-bottom
ManualTumble true Right-to-left, bottom-to-top
Rotated false Right-to-left, bottom-to-top
Rotated true Right-to-left, top-to-bottom
Flipped * false Left-to-right, bottom-to-top
Flipped * true Right-to-left, top-to-bottom

* - Not supported in macOS 10.5.x and earlier

Figure 1: Back side images
Back side images

Examples:

*% Flip the page image for the back side of duplexed output
*cupsBackSide: Flipped

*% Rotate the page image for the back side of duplexed output
*cupsBackSide: Rotated

Also see the related APDuplexRequiresFlippedMargin keyword.

CUPS 1.4/macOS 10.6cupsCommands

*cupsCommands: "name name2 ... nameN"

This string keyword specifies the commands that are supported by the CUPS command file filter for this device. The command names are separated by whitespace.

Example:

*% Specify the list of commands we support
*cupsCommands: "AutoConfigure Clean PrintSelfTestPage ReportLevels com.vendor.foo"

CUPS 1.3/macOS 10.5cupsEvenDuplex

*cupsEvenDuplex: boolean

This boolean keyword notifies the RIP filters that the destination printer requires an even number of pages when 2-sided printing is selected. The default value is false.

Example:

*% Always send an even number of pages when duplexing
*cupsEvenDuplex: true

cupsFax

*cupsFax: boolean

This boolean keyword specifies whether the PPD defines a facsimile device. The default is false.

Examples:

*cupsFax: true

cupsFilter

*cupsFilter: "source/type cost program"

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified.

Examples:

*% Standard raster printer driver filter
*cupsFilter: "application/vnd.cups-raster 100 rastertofoo"

*% Plain text filter
*cupsFilter: "text/plain 10 texttofoo"

*% Pass-through filter for PostScript printers
*cupsFilter: "application/vnd.cups-postscript 0 -"

CUPS 1.5cupsFilter2

*cupsFilter2: "source/type destination/type cost program"

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified. The destination type is automatically created as needed and is passed to the filters and backend as the FINAL_CONTENT_TYPE value.

Note:

The presence of a single cupsFilter2 keyword in the PPD file will hide any cupsFilter keywords from the CUPS scheduler. When using cupsFilter2 to provide filters specific for CUPS 1.5 and later, provide a cupsFilter2 line for every filter and a cupsFilter line for each filter that is compatible with older versions of CUPS.

Examples:

*% Standard raster printer driver filter
*cupsFilter2: "application/vnd.cups-raster application/vnd.foo 100 rastertofoo"

*% Plain text filter
*cupsFilter2: "text/plain application/vnd.foo 10 texttofoo"

*% Pass-through filter for PostScript printers
*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"

CUPS 2.3cupsFinishingTemplate

*cupsFinishingTemplate name/text: ""

This option keyword specifies a finishing template (preset) that applies zero or more finishing processes to a job. Unlike cupsIPPFinishings, only one template can be selected by the user. PPD files also generally apply a constraint between this option and other finishing options like Booklet, FoldType, PunchMedia, and StapleWhen.

Examples:

*cupsFinishingTemplate none/None: ""
*cupsFinishingTemplate fold/Letter Fold: ""
*cupsFinishingTemplate punch/2/3-Hole Punch: ""
*cupsFinishingTemplate staple/Corner Staple: ""
*cupsFinishingTemplate staple-dual/Double Staple: ""
*cupsFinishingTemplate staple-and-fold/Corner Staple and Letter Fold: ""
*cupsFinishingTemplate staple-and-punch/Corner Staple and 2/3-Hole Punch: ""

DeprecatedcupsFlipDuplex

*cupsFlipDuplex: boolean

Due to implementation differences between macOS and Ghostscript, the cupsFlipDuplex keyword is deprecated. Instead, use the cupsBackSide keyword to specify the coordinate system (pixel layout) of the page data on the back side of duplex pages.

The value true maps to a cupsBackSide value of Rotated on macOS and Flipped with Ghostscript.

The default value is false.

Note:

macOS drivers that previously used cupsFlipDuplex may wish to provide both the old and new keywords for maximum compatibility, for example:

*cupsBackSide: Rotated
*cupsFlipDuplex: true

Similarly, drivers written for other operating systems using Ghostscript can use:

*cupsBackSide: Flipped
*cupsFlipDuplex: true

CUPS 1.3/macOS 10.5cupsIPPFinishings

*cupsIPPFinishings number/text: "*Option Choice ..."

This keyword defines a mapping from IPP finishings values to PPD options and choices.

Examples:

*cupsIPPFinishings 4/staple: "*StapleLocation SinglePortrait"
*cupsIPPFinishings 5/punch: "*PunchMedia Yes *PunchLocation LeftSide"
*cupsIPPFinishings 20/staple-top-left: "*StapleLocation SinglePortrait"
*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"

CUPS 1.3/macOS 10.5cupsIPPReason

*cupsIPPReason reason/Reason Text: "optional URIs"

This optional keyword maps custom printer-state-reasons keywords that are generated by the driver to human readable text. The optional URIs string contains zero or more URIs separated by a newline. Each URI can be a CUPS server absolute path to a help file under the scheduler's DocumentRoot directory, a full HTTP URL ("http://www.domain.com/path/to/help/page.html"), or any other valid URI which directs the user at additional information concerning the condition that is being reported.

Since the reason text is limited to 80 characters by the PPD specification, longer text strings can be included by URI-encoding the text with the "text" scheme, for example "text:some%20text". Multiple text URIs are combined by the ppdLocalizeIPPReason into a single string that can be displayed to the user.

Examples:

*% Map com.vendor-error to text but no page
*cupsIPPReason com.vendor-error/A serious error occurred: ""

*% Map com.vendor-error to more than 80 characters of text but no page
*cupsIPPReason com.vendor-error/A serious error occurred: "text:Now%20is%20the%20time
text:for%20all%20good%20men%20to%20come%20to%20the%20aid%20of%20their%20country."

*% Map com.vendor-error to text and a local page
*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"

*% Map com.vendor-error to text and a remote page
*cupsIPPReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"

*% Map com.vendor-error to text and a local, Apple help book, and remote page
*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html
help:anchor='com.vendor-error'%20bookID=Vendor%20Help
http://www.vendor.com/help"
*End

CUPS 1.5cupsIPPSupplies

*cupsIPPSupplies: boolean

This keyword tells the IPP backend whether it should report the current marker-xxx supply attribute values. The default value is True.

Example:

*% Do not use IPP marker-xxx attributes to report supply levels
*cupsIPPSupplies: False

CUPS 1.7/macOS 10.9cupsJobAccountId

*cupsJobAccountId: boolean

This keyword defines whether the printer accepts the job-account-id IPP attribute.

Example:

*% Specify the printer accepts the job-account-id IPP attribute.
*cupsJobAccountId: True

CUPS 1.7/macOS 10.9cupsJobAccountingUserId

*cupsJobAccountingUserId: boolean

This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.

Example:

*% Specify the printer accepts the job-accounting-user-id IPP attribute.
*cupsJobAccountingUserId: True

CUPS 1.7/macOS 10.9cupsJobPassword

*cupsJobPassword: "format"

This keyword defines the format of the "job-password" IPP attribute, if supported by the printer. The following format characters are supported:

  • 1: US ASCII digits.
  • A: US ASCII letters.
  • C: US ASCII letters, numbers, and punctuation.
  • .: Any US ASCII printable character (0x20 to 0x7e).
  • N: Any Unicode digit character.
  • U: Any Unicode letter character.
  • *: Any Unicode (utf-8) character.

The format characters are repeated to indicate the length of the password string. For example, "1111" indicated a 4-digit US ASCII PIN code.

Example:

*% Specify the printer supports 4-digit PIN codes.
*cupsJobPassword: "1111"

CUPS 1.2/macOS 10.5cupsLanguages

*cupsLanguages: "locale list"

This keyword describes which language localizations are included in the PPD. The "locale list" string is a space-delimited list of locale names ("en", "en_US", "fr_CA", etc.)

Example:

*% Specify Canadian, UK, and US English, and Canadian and French French
*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"

CUPS 1.7/macOS 10.9cupsMandatory

*cupsMandatory: "attribute1 attribute2 ... attributeN"

This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.

Example:

*% Specify that the user must supply a job-password
*cupsMandatory: "job-password job-password-encryption"

cupsManualCopies

*cupsManualCopies: boolean

This boolean keyword notifies the RIP filters that the destination printer does not support copy generation in hardware. The default value is false.

Example:

*% Tell the RIP filters to generate the copies for us
*cupsManualCopies: true

CUPS 1.4/macOS 10.6cupsMarkerName

*cupsMarkerName/Name Text: ""

This optional keyword maps marker-names strings that are generated by the driver to human readable text.

Examples:

*% Map cyanToner to "Cyan Toner"
*cupsMarkerName cyanToner/Cyan Toner: ""

CUPS 1.4/macOS 10.6cupsMarkerNotice

*cupsMarkerNotice: "disclaimer text"

This optional keyword provides disclaimer text for the supply level information provided by the driver, typically something like "supply levels are approximate".

Examples:

*cupsMarkerNotice: "Supply levels are approximate."

CUPS 1.6/macOS 10.8cupsMaxCopies

*cupsMaxCopies: integer

This integer keyword notifies the filters that the destination printer supports up to N copies in hardware. The default value is 9999.

Example:

*% Tell the RIP filters we can do up to 99 copies
*cupsMaxCopies: 99

cupsModelNumber

*cupsModelNumber: number

This integer keyword specifies a printer-specific model number. This number can be used by a filter program to adjust the output for a specific model of printer.

Example:

*% Specify an integer for a driver-specific model number
*cupsModelNumber: 1234

CUPS 1.3/macOS 10.5cupsPJLCharset

*cupsPJLCharset: "ISO character set name"

This string keyword specifies the character set that is used for strings in PJL commands. If not specified, US-ASCII is assumed.

Example:

*% Specify UTF-8 is used in PJL strings
*cupsPJLCharset: "UTF-8"

CUPS 1.4/macOS 10.6cupsPJLDisplay

*cupsPJLDisplay: "what"

This optional keyword specifies which command is used to display the job ID, name, and user on the printer's control panel. "What" is either "none" to disable this functionality, "job" to use "@PJL JOB DISPLAY", or "rdymsg" to use "@PJL RDYMSG DISPLAY". The default is "job".

Examples:

*% Display job information using @PJL SET RDYMSG DISPLAY="foo"
*cupsPJLDisplay: "rdymsg"

*% Display job information display
*cupsPJLDisplay: "none"

CUPS 1.2/macOS 10.5cupsPortMonitor

*cupsPortMonitor urischeme/Descriptive Text: "port monitor"

This string keyword specifies printer-specific "port monitor" filters that may be used with the printer. The CUPS scheduler also looks for the Protocols keyword to see if the BCP or TBCP protocols are supported. If so, the corresponding port monitor ("bcp" and "tbcp", respectively) is listed in the printer's port-monitor-supported keyword.

The "urischeme" portion of the keyword specifies the URI scheme that this port monitor should be used for. Typically this is used to pre-select a particular port monitor for each type of connection that is supported by the printer. The "port monitor" string can be "none" to disable the port monitor for the given URI scheme.

Examples:

*% Specify a PostScript printer that supports the TBCP protocol
*Protocols: TBCP PJL

*% Specify that TBCP should be used for socket connections but not USB
*cupsPortMonitor socket/AppSocket Printing: "tbcp"
*cupsPortMonitor usb/USB Printing: "none"

*% Specify a printer-specific port monitor for an Epson USB printer
*cupsPortMonitor usb/USB Status Monitor: "epson-usb"

CUPS 1.3/macOS 10.5cupsPreFilter

*cupsPreFilter: "source/type cost program"

This string keyword provides a pre-filter rule. The pre-filter program will be inserted in the conversion chain immediately before the filter that accepts the given MIME type.

Examples:

*% PDF pre-filter
*cupsPreFilter: "application/pdf 100 mypdfprefilter"

*% PNG pre-filter
*cupsPreFilter: "image/png 0 mypngprefilter"

CUPS 1.5cupsPrintQuality

*cupsPrintQuality keyword/text: "code"

This UI keyword defines standard print qualities that directly map from the IPP "print-quality" job template keyword. Standard keyword values are "Draft", "Normal", and "High" which are mapped from the IPP "print-quality" values 3, 4, and 5 respectively. Each cupsPrintQuality option typically sets output mode and resolution parameters in the page device dictionary, eliminating the need for separate (and sometimes confusing) output mode and resolution options.

Note:

Unlike all of the other keywords defined in this document, cupsPrintQuality is a UI keyword that MUST be enclosed inside the PPD OpenUI and CloseUI keywords.

Examples:

*OpenUI *cupsPrintQuality/Print Quality: PickOne
*OrderDependency: 10 AnySetup *cupsPrintQuality
*DefaultcupsPrintQuality: Normal
*cupsPrintQuality Draft/Draft: "code"
*cupsPrintQuality Normal/Normal: "code"
*cupsPrintQuality High/Photo: "code"
*CloseUI: *cupsPrintQuality

CUPS 1.5cupsSingleFile

*cupsSingleFile: Boolean

This boolean keyword tells the scheduler whether to print multiple files in a job together or singly. The default is "False" which uses a single instance of the backend for all files in the print job. Setting this keyword to "True" will result in separate instances of the backend for each file in the print job.

Examples:

*% Send all print data to a single backend
*cupsSingleFile: False

*% Send each file using a separate backend
*cupsSingleFile: True

CUPS 1.4/macOS 10.6cupsSNMPSupplies

*cupsSNMPSupplies: boolean

This keyword tells the standard network backends whether they should query the standard SNMP Printer MIB OIDs for supply levels. The default value is True.

Example:

*% Do not use SNMP queries to report supply levels
*cupsSNMPSupplies: False

cupsVersion

*cupsVersion: major.minor

This required keyword describes which version of the CUPS PPD file extensions was used. Currently it must be the string "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", or "1.6".

Example:

*% Specify a CUPS 1.2 driver
*cupsVersion: "1.2"

CUPS 1.6/macOS 10.8JCLToPDFInterpreter

*JCLToPDFInterpreter: "JCL"

This keyword provides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the JCLBegin value and any commands for JCL options in the PPD file.

Example:

*% PJL command to start the PDF interpreter
*JCLToPDFInterpreter: "@PJL ENTER LANGUAGE = PDF<0A>"

macOS Attributes

DeprecatedAPDialogExtension

*APDialogExtension: "/Library/Printers/vendor/filename.plugin"

This keyword defines additional option panes that are displayed in the print dialog. Each keyword adds one or more option panes. See the "OutputBinsPDE" example and Apple Technical Q&A QA1352 for information on writing your own print dialog plug-ins.

Note:

Since 2010, AirPrint has enabled the printing of full quality photos and documents from the Mac without requiring driver software. Starting with macOS 10.12, system level security features prevent print dialog plug-ins from being loaded into applications that have enabled the library validation security feature. As of macOS 10.14 the APDialogExtension attribute used to create macOS print drivers is deprecated. All new printer models should support AirPrint moving forward.

Examples:

*% Add two panes for finishing and driver options
*APDialogExtension: "/Library/Printers/vendor/finishing.plugin"
*APDialogExtension: "/Library/Printers/vendor/options.plugin"

macOS 10.4APDuplexRequiresFlippedMargin

*APDuplexRequiresFlippedMargin: boolean

This boolean keyword notifies the RIP filters that the destination printer requires the top and bottom margins of the ImageableArea to be swapped for the back page. The default is true when cupsBackSide is Flipped and false otherwise. Table 2 shows how APDuplexRequiresFlippedMargin interacts with cupsBackSide and the Tumble page attribute.

Table 2: Margin Flipping Modes
APDuplexRequiresFlippedMargin cupsBackSide Tumble Value Margins
false any any Normal
any Normal any Normal
true ManualDuplex false Normal
true ManualDuplex true Flipped
true Rotated false Flipped
true Rotated true Normal
true or unspecified Flipped any Flipped

Example:

*% Rotate the back side images
*cupsBackSide: Rotated

*% Don't swap the top and bottom margins for the back side
*APDuplexRequiresFlippedMargin: false

Also see the related cupsBackSide keyword.

APHelpBook

*APHelpBook: "bundle URL"

This string keyword specifies the Apple help book bundle to use when looking up IPP reason codes for this printer driver. The cupsIPPReason keyword maps "help" URIs to this file.

Example:

*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"

macOS 10.6APICADriver

*APICADriver: boolean

This keyword specifies whether the device has a matching Image Capture Architecture (ICA) driver for scanning. The default is False.

Examples:

*APICADriver: True
*APScanAppBundleID: "com.apple.ImageCaptureApp"

macOS 10.3APPrinterIconPath

*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"

This keyword defines the location of a printer icon file to use when displaying the printer. The file must be in the Apple icon format.

Examples:

*% Apple icon file
*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"

macOS 10.4APPrinterLowInkTool

*APPrinterLowInkTool: "/Library/Printers/vendor/program"

This keyword defines an program that checks the ink/toner/marker levels on a printer, returning an XML document with those levels. See the "InkTool" example and Apple Technical Note TN2144 for more information.

Examples:

*% Use a vendor monitoring program
*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"

macOS 10.5APPrinterPreset

*APPrinterPreset name/text: "*Option Choice ..."

This keyword defines presets for multiple options that show up in the print dialog of applications (such as iPhoto) that set the job style hint to NSPrintPhotoJobStyleHint. Each preset maps to one or more pairs of PPD options and choices as well as providing key/value data for the application. The following standard preset names are currently defined:

  • General_with_Paper_Auto-Detect; Normal quality general printing with auto-detected media.
  • General_with_Paper_Auto-Detect_-_Draft; Draft quality general printing with auto-detected media.
  • General_on_Plain_Paper; Normal quality general printing on plain paper.
  • General_on_Plain_Paper_-_Draft; Draft quality general printing on plain paper.
  • Photo_with_Paper_Auto-Detect; Normal quality photo printing with auto-detected media.
  • Photo_with_Paper_Auto-Detect_-_Fine; High quality photo printing with auto-detected media.
  • Photo_on_Plain_Paper; Normal quality photo printing on plain paper.
  • Photo_on_Plain_Paper_-_Fine; High quality photo printing on plain paper.
  • Photo_on_Photo_Paper; Normal quality photo printing on glossy photo paper.
  • Photo_on_Photo_Paper_-_Fine; High quality photo printing on glossy photo paper.
  • Photo_on_Matte_Paper; Normal quality photo printing on matte paper.
  • Photo_on_Matte_Paper_-_Fine; High quality photo printing on matte paper.

The value string consists of pairs of keywords, either an option name and choice (*MainKeyword OptionKeyword) or a preset identifier and value (com.apple.print.preset.foo value). The following preset identifiers are currently used:

  • com.apple.print.preset.graphicsType; specifies the type of printing used for this printing - "General" for general purpose printing and "Photo" for photo printing.
  • com.apple.print.preset.media-front-coating; specifies the media type selected by this preset - "none" (plain paper), "glossy", "high-gloss", "semi-gloss", "satin", "matte", and "autodetect".
  • com.apple.print.preset.output-mode; specifies the output mode for this preset - "color" (default for color printers) or "monochrome" (grayscale, default for B&W printers).
  • com.apple.print.preset.quality; specifies the overall print quality selected by this preset - "low" (draft), "mid" (normal), or "high".

Presets, like options, can also be localized in multiple languages.

Examples:

*APPrinterPreset Photo_on_Photo_Paper/Photo on Photo Paper: "
  *MediaType Glossy
  *ColorModel RGB
  *Resolution 300dpi
  com.apple.print.preset.graphicsType Photo
  com.apple.print.preset.quality mid
  com.apple.print.preset.media-front-coating glossy"
*End
*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""

macOS 10.3APPrinterUtilityPath

*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"

This keyword defines a GUI application that can be used to do printer maintenance functions such as cleaning the print head(s). See ... for more information.

Examples:

*% Define the printer utility application
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"

macOS 10.6APScannerOnly

*APScannerOnly: boolean

This keyword specifies whether the device has scanning but no printing capabilities. The default is False.

Examples:

*APICADriver: True
*APScannerOnly: True

macOS 10.3APScanAppBundleID

*APScanAppBundleID: "bundle ID"

This keyword defines the application to use when scanning pages from the device.

Examples:

*APICADriver: True
*APScanAppBundleID: "com.apple.ImageCaptureApp"

Change History

Changes in CUPS 2.3

Changes in CUPS 1.7

Changes in CUPS 1.6

Changes in CUPS 1.5

  • Changes all instances of PPD attributes to PPD keywords, to be consistent with the parent specification from Adobe.

Changes in CUPS 1.4.5

Changes in CUPS 1.4

Changes in CUPS 1.3.1

  • Added missing macOS AP keywords.
  • Added section on auto-configuration including the OIDMainKeyword and ?MainKeyword keywords.
  • Minor reorganization.

Changes in CUPS 1.3

Changes in CUPS 1.2.8

  • Added section on supported PostScript commands for raster drivers

Changes in CUPS 1.2

Changes in CUPS 1.1

cups-2.3.1/doc/help/overview.html000664 000765 000024 00000006636 13574721672 017043 0ustar00mikestaff000000 000000 Overview of CUPS

Overview of CUPS

CUPS is the software you use to print from applications like the web browser you are using to read this page. It converts the page descriptions produced by your application (put a paragraph here, draw a line there, and so forth) into something your printer can understand and then sends the information to the printer for printing.

Now, since every printer manufacturer does things differently, printing can be very complicated. CUPS does its best to hide this from you and your application so that you can concentrate on printing and less on how to print. Generally, the only time you need to know anything about your printer is when you use it for the first time, and even then CUPS can often figure things out on its own.

How Does It Work?

The first time you print to a printer, CUPS creates a queue to keep track of the current status of the printer (everything OK, out of paper, etc.) and any pages you have printed. Most of the time the queue points to a printer connected directly to your computer via a USB port, however it can also point to a printer on your network, a printer on the Internet, or multiple printers depending on the configuration. Regardless of where the queue points, it will look like any other printer to you and your applications.

Every time you print something, CUPS creates a job which contains the queue you are sending the print to, the name of the document you are printing, and the page descriptions. Job are numbered (queue-1, queue-2, and so forth) so you can monitor the job as it is printed or cancel it if you see a mistake. When CUPS gets a job for printing, it determines the best programs (filters, printer drivers, port monitors, and backends) to convert the pages into a printable format and then runs them to actually print the job.

When the print job is completely printed, CUPS removes the job from the queue and moves on to any other jobs you have submitted. You can also be notified when the job is finished, or if there are any errors during printing, in several different ways.

Where Do I Begin?

Click on the Administration tab. Click on the Add Printer button and follow the prompts.

When you are asked for a username and password, enter your login username and password or the "root" username and password. On macOS®, the login username (or "short name") is typically your first and last name in lowercase.

After the printer is added, CUPS will ask you to set the default printer options (paper size, output mode, etc.) for the printer. Make any changes as needed and then click on the Set Default Options button to save them. Some printers also support auto-configuration - click on the Query Printer for Default Options button to update the options automatically.

Once you have added the printer, you can print to it from any application. You can also choose Print Test Page from the maintenance menu to print a simple test page and verify that everything is working properly.

cups-2.3.1/doc/help/cupspm.epub000664 000765 000024 00000602606 13574721672 016472 0ustar00mikestaff000000 000000 PK3SnOoa,mimetypeapplication/epub+zipPK 3SnO META-INF/PK3SnOwMETA-INF/container.xmlUA 0E=EѝZәФ)uozpb J㸫`LmCV8cs`t0MFq#v쉓1Δ*:OVYyt|:^:}`GTO<U!xg1M-n&?YWR/PK 3SnOOEBPS/PK3SnO 6 wOEBPS/body.xhtmlk{֕(yfJdN:CKV4Wb`P:Ooe_q!='cĻqD/_x"F yb|5˿wt:M4ۻ߽7{ӟ>7/7{ O}^{x;;}MO0nkxwg|=~͟NE{?o_|Qx'oufzpLs0.D";1-E5$}NӇ|0I^vxԹ1F-on_h>>cLx&mJ0(Ŧ|o_ǷѽUd~|on'e4wSݫl} Jh qӥr&~y8z#?l< b8h6>w37g04g|6ӵ#;\ MZ`ك[Fad:ڲQ IoΧ"uÎ.b: 3[{(J],yIχiřqůa=LxR.fh~ja(a'I4y kPHEoW0 k/͗-_8 ,Az,f7 ]o v$m~h^ط0=#sN0JfP|ޅ?1*}݊0#@OA.xp q?:7 7wA"K$%F|xa 8mFE0DFu'HxAOa)^ڴ8؟jY̙oDv쏂yFChy$aҁUoxWl\I? m5WPR=MX";F/$a,j_MZ>N۝w"* G>g ,MEg[C_i&Lo`2j;T~nY : ˯>ׯ%?tބ$C^^g7r/QwAϷ93>?~y*{9!f 7^7ΐCsfoxZq/E}erLzm:>G B>64Nx>~"|6cnv>3qԽ|I2J^{c!F0~;H0z"8͉ygQ`7̖1Hx}~b?~*Dw`<1L9u#8px0C„4d읟~zUN~{QsurB@x9ӲፎJoua%0J8}&8GjF0 ,&$ ;49."o̤$xwAP.y`|w{}a,&)pΏ 6՗^2,` x f @ LX&G hw{zUsv>A!䎀Oєd@ zeؔ\MOpL.(|Y7|y7x;Ǐ'P[@ri{zO fc_NF8Ơ]:Ocj w"\@@ /E K3@86ܓr6M]O2!瓔8"m'8+wvhVGcPPK绤KbK`I>r6Dc4i#foLL[ %]"s$_vNLƋM~ h%C^aGa#~Qv9X]"X-'֯c0$M% f hEHC8=ϻbcz8dxARg3el" >Bn(4vb 9YDw[όn-D= J 7PE'M`0OYY(M>]89I y@1`b判B0?ԷY TG`4r/K&.Ȗ>x-o ~F~y1 C8=qϿ7C?vBɒ41+ L#$lur cFp􏐖įpz,8@t3RY"!Zp>w>?IGA<~y 8BiWHȯG~ dyJd>|_v[lyNNNZKf_;KMp"WygԾ^9OUz 8SqoP3M:L3@́G;ǣߟ"M"u7%FW tuE,;pWYOr%("k8fi>] q'.;{y&(~>,hwig\^h%;H|?&גoxgj4yW=~0PIteM_KK.CƤ̂D9^cn:)ޝcygw?CC%*Q$Hmd:uv=]p /H!דz 0w5EMi0R#ْ!`M^>w{xH͠k3V|~b-vEÀLR=Z|z-{RKŎ4WX1p}ٲ A@lM_Wl,a ˓$RZ,l`ֆ,>Ty8IS-;,m͌f@{ͬ 2MvJij0èjd,'Kl"N!E=Y1C:zL}4OōR p22h#47$* EۣCBָ9sEg$L \MyHt7 zX9j-!Cg4ۤ<}=3-Dk`JLW4Qn@G%+cϭ iV7s?.Ń2#;{ȧ  IDhJm^Okyr(tY dI!f&A9NFJkC`B Ƚm4-o""0&JV%FOdJLpqYBe?dq:c֙YZHtldhC@2K(I1@VD.뚝_N/'g}J+Fól7wUO^azOt$`vNN k `]Dw"n^5M`,?vzW |ýΫAO:u:{:s?)Ҙ\f4wX-k dm$!ϔEeLNoEBr 6ry򝜦;g|ג["ɡI<C,0fJe)$R_vJkH6/vV)F QM:rynkLvm]cX"dz ~0!sh3i.DVH~SC% 7- yS2e糎7սHL(IHL±Fѹ!׌:!@I-aOH"F#Ilx5Bc]@$9'i@zUS 구ClX@f>S҅PBќ%UQr.Z27ܸ@K]ߘuuq< "|*PVmyӇk}%Zm 6)ʗ<?N.:W-ϸC^SdmÞw'\f,% %#~OnYEe,;֣Ǭ=[5t [(n(^ |꿽z}VlL+ p!,A5{L؅.i G%o|*pЁԙwQmp~%6C>|4s"˃X3ҝHtdN4KZM&[ݶ/޽'zv {"nEF9=WCpt(Px@[OI6H k j% I -!jHyd ? 3hjP9gdF# ԩr3P:]bj:br>q?Réףuȭү`\ٳR'Ief/"Í ?qBoS?lZY:tg:k49w.$ <ܩ"n^K_ lKA"ͅN50CEMYau P,8!9 g2?6LO եOˌaP$xцį0?r0v FeO^/R_aaMP˜Ydɴ[?md흽:Ć+d G%1rL_Yb#?aw6cL)=UV-()[)̶C&V@ٻ}ޏC l2o RSl0OH7x>.O)s/%eN(Bg置8T649J1㉛|~{K)1+쀹1v%k:MR]MZ"C)ᆓBsZ;[ñEdLSX Oe!\\x_v̽|7//W ޽^n\; =atIחڢ]˳λ=q}=ޑq[4nv:f ũ99{lҘ[ܕf'HaJ>螜)}vy=/`nhɇ,Uprҧ;˖q~.@s?\tOXO>^\_/*2r7x~ٙ½-:uO/;PxTtC͈8 du}~vѻ,'ӣa缻tȭ?_a/VP}JǦ%Iŭ>~qkbaS,[](5 վoޮ.:ǗE~vzvBv{_zQ[$2VzZCK"3$ 5f?/YGѳMĝ ɻ)Brp5{Z YLiq>eQIV!C-01֡r(_1(S9fY߻ r/mͮu% &qgTS)biq7}r|51:bndF!-SUT]J݅Q#H=6/p_F m" z i\VOvBdE1,-HWLmحB|l/pB: K[/v#pγPhXTψKY Ȍmjmc UA 7V9ruuJ{scr?P*l!t-:kn~oܸ]vqRI5`Nv$Ճj4ֈ#)\v B;ߑ$~JiLjViQ[ei3٩Jr`rʴ:xy|a Wҿ՟܃h}I7= 6W] H^RQ!V@VЇHa Eq( riu8Qwqjn(#|(qx<̶ըR ifO~*{DOE V JBޗ1gk!a4UXZLh2a juNJ_umHJo7&!eg@N #I+^Qe~Y'=$^di6 q[@~pD[9;G2i+m/Xi@B Q fxJ-o"›V=<-J-7]jmXl[͉hR"5@{_~YPօ펽缬>טyD ̼aMZ1]a1?-E XB!!x~pjX }ˆ$Rl; &m}biE~UOqj16{_;2xd5%?n=jEK.S:7ƾқnr׆" ˣFmW3*1(hQ9H@n–LqxHMm%uD\%c?8^t44/EPBZw+'%9I1EthS0'gbHJ&/#c덝<:@r0?+Pvu^ ּDxX m?HjHv4~PNOȋ[f@'_7&qv_NN}'2gy/N %2CJ$,FxQv}Z1GPjG t;~/˾0SyȻ,jX=/[_pm\e%4*lqV"~ўO%wMKnx)mɊUdIkHJ- ) cn']o‘"+ohbQ۬ᰜ\ gNe F`ebɟic"N:(q\EE27Y[ZZV1Y2|!CD̖5R~?2wF+-bW]XR/P??? ctJ.\e tiNY(BգLlQ֒˥,̢`hK( 8ѯDYd atQHG9" 2A Ŭawbv{=N #G!8V`-5 :V& ‰J@Y:9:5brlL Ӏt~ƭxρgfb%5t>X׺(HtPE!}{Hد4Uem0o &} XN&[:8 qNZZa"(SBA>*?vX_~2rLJE銀3;<كj@GJ` F'd][$!݂cuy Oy&dbk8ӃUao6W?_.MelwX1~o6$9ș&3%/- ȹ `;*mM("fލinĦo2KDNfu?8xڤ 1H`17_꛿[C(uه :'΁e\ lpoP2mJ.';-oM8bͅpy6¶,ԚxחEKQ̒疯}/FT9˖X=~;VI0C(4+{40\Ͻ*&=csxe.-*rh9AQY=vN-o/Cf+O^T,*!:= )δ3s 597n,qV Qz<䕖j109a4JX<lԾʵZΪ%,q[朤() J4sͥvS/iuwh-OB.L2N&0'`V`dU1`ߵ%kN{J\N!b5yW=w4-VYS8y* ?$+"T25<6GH,/)']ZͼOg N}PG@J TA EQA}8[ R ;ǜ |!Cqфѱ!I=jƔW/=!)P۶u;ob?K+z9* H%wTxBU)94F u7$c?C-Lr۲ T"H7H nr}]_+ F/]սMx1H jEsٽOн:W]A*/ "ͣbNŽ,wrpQfo e9d1z*L>-v~Rugd-y- 9ʟɲl < kID5k!]d$s9MPO{7to<0~. yO?ÍT<_Zg S !d2B![\URF"G'^堩gVLR-,ӼK=EdkOI"d̈́fvY=rih9h$ r3Z| ڽdcE/3b1(hG^Ro pq-jGY0ÓMKtMn'*n/ä>mBúf܉.!>G8X<@BIr" BtU܉8'0 voB;RdzEbJK=7(CcL1ٟ@"H0U9D*?gCG lW]}u{VT֍H&PkI˜iFCU0m빏/KZ>}XNrz㩓vst];3\3h诖<.A,b|v6}פv >E|dco+\O޴_0J=;I8i.I4 rܿDUUkt#0#QqGg,θ'v$dHipyu9̸:y$cR08uGYƝKh/>~} ns o|nxKhQW/hvԯ>2v짤O%+I~ X߷(*2.gۤ#W-9PIXH-{}µR|Adj;^\wXrv O46򔵖du[jS 1@pX׋kN@#j|*׏MwV6f^# )](/9 #2ӈ$!BLڢ+9ř&Â']4;G/ٝj+=Ib%l:d>t:5HOӅܝiL]<͐ݹ~ij~C֤ח%еG]?MDյ v%1 >kF˴4s*0yi^/5Wd_FL2Y:[69*Z0&rMu*E؝)O:и/!|Fw:MiIr wd)CiGlP^MVaQjWE?M^=+>OL=|&:Y}]WUh,U;j1ȑNUJw Q9yM4*f*rO5ێ SP(%7pt-t#X1Fn"g.O4Z6_Ob(Hf-8n n(Z$Y(IMd)ed?`] u.l8ǘ0(||MS# ) 3mqteOyKQ7e}a^ɑx|r9-RR;*tɀxu^pfp  XBC4._;V'jB4ifuKY}D,뇋yNe{45\Qþ{;!~7=X!#RW;$4s@,{$ Ò hufF )HX}&+M>]󾒆}a?8|Bf|}G>;FU`V@R#dDcw߼8W{Sx_7aTM&3E-nt5@*H&4Ѫas{JMsJ$qkYs^~k)Dv!c/؜DzUف) v\7a =t,.۵vQ?)ӸSWS.Ӡ*9z"*+ 2ͳl訞`_-R7t&Q3k$BdA^^13~CV?[R=HYUy c,:]:rE7vAkwLpN@wG "}8͆,cF*56 s37y+[zgs ww{w wwU2!,.EqUJBȧ!{+痗zI[T*={'}v)"蠥u*R۰ iT+PKfҲ ajQrzvyݹ]e]uOag$~"W^b(GUYa3yCW*9h@*f(ЌPea}-XIP>XץɪiM:PcY_etDzg-g8=;$j>(-ec咳s $I5TI{ڄ );N֯kn9Jm(rǂ]Ԛ;e{*t< i2 R*NdN.HLgX:".3zGلu#,2Dmi(VWV#L*,hMå88Um.鬆R (RjҥR\__vQ"VB~9}}7H-qXPa2ۺuk;& OYlFlP0gNn}"SYdt+5}xɎ$<*ض_`5%4!Kѝ*@/زY>l(YW"&[ܰSpu ռ~0 &~af&}Q6?in(i],䄬:Ryu$0_fTN3U+EudkgXLr7gaؠr5_Efv7Öm&roEG|ڐi8dΨKI\;ԣuI0KmD0)fdŸ t S ^ΨvJK xۨobhz79[H]Iӵ@$|ϳ$.{ML`%MNohNg4c'0BLʽXg]UjzEFP42*Xvdx{2SI1]%XB0TRN"JIwGZr5.7~{,%uߙ/X/]Thrz Ӂ]9Y yP^[)KB)u 61KBA~]f+-䃧ʅs{W߫9 JaYjz0N4M5[Q ZjuHX(!1WT#!\&Xm{P{P6oi`{;sl"~E׫*W,8AʸHbs/!» BrUːvq]K֕@27KpcOýoZIjM̬{*I2V?*x~e@BA.?*77q ]#^6#\eC3o%m]dԾ NKJPo47%ck5=؛1364Cj1cmA*T ^!$ JAZ3 >'wu/ 룙vU -T:=9(ʊ q!%VF\fdX; @PQ}rfsb`^LR소VzI4d2A ʦআƪ1ގe΁M w=I$uVqd`A(r*L& yE|5XU?<{aM+]<5C͈J! GF;6g3KH:7*JUYCkufFS-. 2O V 6 nJBO8ul2*۲ b.$Q)[ќ,£ {0LΟʘ,Tٙl0Ɏޠ>m ̄gޕI疊~"1%}bW _Zuܺѭ[g2CKkVr&ۣ[m/쾷J޶kr/LjBr-or}2}y]tM~9ȚE[TE[TkFՙ ǿ3nmom?.HnI siy^qCSGץUKɏŃSa#OZGn=8k'f.-W.c Q{рʴ&k؈ scV1cS=fMi96|;;T:&NTL-"2x▹I+T_Rgh`9w+4eV9]L.4̟-Fhdϴ1~Iq8cȾGn=wG9P]Fry*?+Qpy>wbv2 llE]riFK50rlݲ iZk'I+Di*o~d-ÅQ%gSy̩N^8f|Y1(a.TL&P dJނi=T+ٻU# aݲ*ke{㵳:4rrA t,d8;#&7(ntj={Ȅ.'~_I>r7);Mo oR_aSj f /'bqͦF/꠼QCbZ&11G^Q n:U`GwLK"7nĢv:Pu_t 7Ksk1ƎC,7~!n5՛e~AO5 @~:h'Gqu?u/=6LyO6ª>.>8OsKD5h4 o*9LiA X&;N=Jjk>LgYWUYK~mA I ^c,SDW$=<>D7&aLgRQӷp &(<7x Cm Da$6,wboFlو_QWJqy.B:յ(i R²ߨ^*7MlÖX#x2Թe42y;Rō! ݋'ɓ"''EmLD68jHn_<gkq.8#(X$kiaF7xW}DұEPtl?n#yLm0*3>٥%@GT9VIpԞN`3U ֵ(?<2ٞ0wzct-`V𫆕;O;wNI 7Om~$wMmps۞;1I .z/z |T߈QɎU /)a4S]<LYUZ1I2dKV{P5U=M&CQBSh)0&⢂YS" e}@Up~מsl-3D+ď1k~PaGi=jx`cu\rn)u,ipFeFBȿ#gpXᢧ{kgeyDY7꼃s,eA !iMkj6Zء ~"C KMjsl#`o8[1Y9HtNـgRm#KcDLLbqj,?IWue(@jj,U_od@ֱ Xt\JR6A |q15#! j"@} eFP"YVxIV¿H+T^ v+׿a#7mpF5W1t}_h yF@w\qQlk_KK+>bJ{%j(]`UJUgI~ղH`U%C;)3VyT)1,p##k'5 3H܄OPU*~/ܜtxg{ y8zbG{3 W@&R 3(@JiX=LUC;=/yz],3t#|=_M ]1p߯U@~6T$GY,3js͐|J$U$IcD*D½F9AJȗ\"8v:al,Zܻά}Vn1}X+%'{' %XXܝS$)~fފj:;1n˧Y51S*zwǴUtД|l< 3KJXӝ"hg+ߩ居6F^ܪV- }7#YvF$S^>~d"|ߠcmOoʲ $k ~HFJanqr(ڍ w\K); x|d0|h˻ppzIr/cZ&,'-镹plk1rRٺ|wU)Aޒ nپ ,9FIpIU|PА 1 ln{p3/I4!mg;ן?fdicW`V _r+`Dܜ?Mf)dJ̖hXO_Li&ϴ29m=<;^uS)U@TKPlw"(mBb&bM,f엓@Tr>؁O1q>&ЁFn<bK0 "eAfSjsWj8{ %MJ j̡ 酭`Kk|qى7Lsdl"CwBT>"x}TYT3ř84iH$= p`ތhфKU F&˕)U D/M<Cyl0CR㴶dbi:\XDR~v!ni*!&7  ƹ~WN 9M_-XZVik3wMKh;ჾ;1űScJd`,Ad7nqv3c3)9NDPՁF̤VQ=tI3|s&j\2i:PɌx%S25:@,S){ki^J~sgVcЎ-lC 월f76Ɣ(EEx\Pa%ٽU5܀mxI ]zV2{c5{,iZMn7dID CfpgQ*oE""QOQ؁j]\sXcT4-ʊ1;!1]ƺ*ǘ< %F6'[ekijx@B\Ƃu_ES 8]ê׀ .diA2.zx5k:#}dSFYA\W:6q|  -kB!)pu>PK,ߵkhv#I4_T$qvvkM= ؠ"A#bv/vl,]{҆ W=GfN\DE笙St{DkmR !ĊпLӀ ͋}JBUɕ!$k~^h3 \E uN&6A@QpUUNiA3msԭ|G+ڼ8S$fVo _%9jܲؼMi>aWIW00J}<1Lais_qVX &roN̵M0'RSag3Bw-Ux,כy}rt40їoXIVv)NX:N$:KE2hE1h-YJ>MY+ $OaW= Au_C yl q i4i , yRM4&~D{ B=℁!T7>;dTHe<Ƭwj6P.b)B77E%؂ YX!B۲2uvpK:b+jV\ QV 1_M%ZH-a6]?WJ9$Fb&B\ 1R^ b)oNU͕[9IlҕFuЭH`‰NŻ(Ooq w5t ' K6#_-R'㊝aX츝Dv [YLPSaw"_ b,8(O%4HN& 8cѾFy},ѾFD*iIeh9O>&.`1eޔCrߚJA2q`',s(ɅerQFAeN{YU(\'ҭpTįۃ U|ep':bmy1WZ9vnd ݃CG "S'H*<+ESUSo"0Oo؍] TI潌e4^ʥz(l0[.M )]PKfʄ]跞 7mlTgFȈ2J%AiXz_ZGϣ?ӓ`8׿ RV.'*ćQ)փFcC4βo k%}(rU,%=Tr췴:wXLf.ѡ22`]|`<RX_\r6 VK"EkT|Q@e<`2؅%A/kP!ẏ etqZ;tx"Bo*7ғSJwyBTQ_츿&.u({D tv/=U`RaQaaV7} pZH5*jG\ybqȩ){c;}sY|&ka`s<Mbu&>P؀KE-2*=\^c%W\DA N,`8O$Pt+d=+qjNj.r"0+:꺜ʴOI@Y`HgAԞeoW 5j̴Us:|ABhgOO\4XRlYREy [RͿRx3N]+8;1a^; ."3 u͖`,} DԳ`pZ-S >we[f{o.;p$py}-fwe'Р=:՘qrrnf`Z!A*5PHl') ZR"`:ii bUki2UpOw=,LƔeYΘM$Quξ_u .;t/ިrT14uDj2R(9K҇A1;u7ڴ[05 DfcJ ~ifgfˆ8e OwCi Q [%kEӈbJO> $;6G#9C1 ItS< (BQ1oAwkTz\_[` dͱG@:аb=IL."#%z SeӔzIիZj琊\y$e=nΛ2s&q#(5Ar[Upm ]S)Qmߨ2!z%\.*Lb{g$a72]WMJe}zvu5ߜ/ǭΕsJbw-/}C}wz~ H_Q0&oM4kǣ%(ps=tX&Rl+萏fJ^}&u;%]KƼՒn?{ɱ9ލ_tMs_G <$VL5j~MWW9Sq2 BܭaX'Pxd2p)d:7&q*{FIw')E,~AsAsd=ysՐ7#{CݸDD͝ƙt;Wоt25$bj͝?Do h杆"Ĭ3 nOVñ6ua,$ 'rcfcĎK$U] mCʪ"Bh53~mL3c"?LӶ<(q4Ts Be6H6 a-O`"1t/r6@Ʊ9g0.׆qUc,K0 i0Nl+:{xàr!q$_i&'cd0Or;*4-,GWQ )Y"<b U^(0cF4pr*mx;/ ςx B!Φ4k8#+Bkq[.3w2>亪#f]Qp |E5ɂk@lf1F/^YEr*KՊgr'4FOjm>6/XJ>/:2#0RfdtRZЛW`<ˑ:zJ`6%=*,\йm?pY}X`FUّ=WlZ_ &r~[H77]'O"zYGk@ GZp%:L(RUfem,}0H2:nh8o< oiϟo'=O 3^Tg' ̪cҧ85ykiJ3XiوdQcX'Xr[R]S(Q6`?EܹFYhP&lrW_0-_=XoalMsʛؓeV\l/XO8 $%2.EFp*`/jؤ!0F؆^A3_?fvY;B[{.9i+'eb$P/ ( J|dcRhWEl>n֬L['}.`*_ &UM*v%s{WKmI7z׿E\ɼ>\$mXo6OFCć&_Gd0h-0bRoQFP`,gY>Ҿ5n@b+kr5};GB>^i=7޸[R_N.U?A&+ɛfPLf2M1E#y 8ypЛGuW<"krcd_@55:<ިSHɝpÇ3k\j ?N*3tP.H!/Yu+]5|b  n9.Pq8_H#;_yKu&nhMd(5DJiJ%jծI'v*l?c$b4A'YX@ ~v=ќѳL ODZ,"vA9㽣Z-2RCXS-_1-Oi#6њl> n`nn~|q>wd?+b/aܾjўUIg|m?DpKK/F匠ӕ|]'{x77#ַXL3k T .Ro<vq6P{GY7Q$ !澹;SiJxZ辛'_;O^*,x&kpU9/:FL ξ;Z7Xenh.Ds>C`–L^+YU YXNyrcdW[:9`s <,<+&Nm*`DՖϝlG*+lp+/񲎫$ 6r WU6k2|s"ɛعZ1<`mm(s \62ȩ7APu!kZpxǭeB.XXr)k5صj. fh>&‡ʐMhSa)z*8ZG<`rft[6K ۿ80|56h;R?uT(oֈk-ADq:^լ)и$Y,hLЇ\%9ujA0q+̿J2j0 =K#TڬiMuIN;1+L񯍔45+! $PH@L> H \n\>ޥCzӳ{ v)3kb_4|IQ-XvKbu,9YzxأQ]i(ش]{d7G² b,Pfsl~ЍL ~a`&N<۳fF whƏP[ņ;:'Gp%ОX =`uV?jV_EShNn(WOA)XY^O4dXzX ϻx4[ᗣ{ tf3y QktRh.W_.y =\sGkY*ߗW%8~C2g BRʥa5h@O>܎^rK](`m?N]9 ? p^>MwPQ5KԨ ,ʕM{֦M)q'V[-dSϼОRjM/zi|eë!+S-ģ 'ץ=y^H_"i9tBng1N*Ov6yYu3Dbuε=4(ҁ5+O| {-NV< hG3 LY X `$XZa8{88+;l #%TXjJ!δ(o C)u)8Ӳi6efb3!dkMU&g|f~h}5ݨ_&WkzmHWĴ\XmTMP Z h+m]ۊ'lEkVZһy}Ch>|4|~1泛!-ĽUp4oYXfe\-dɶ&rZy kӃ/t,?ˠfˠ?]=\c.@>"1RP bh7؊?PjpSWlf)׎ΔvN`]|O&1i#jW@IZ5&L8xRIc}+ *"ܝ!"Qj5@z;1 a4%x@kY!|FO- 'bO!`1|#a`P ;;A|UIGug'bfnO ;de}\ Ø*5M nn1xҵ0BYFB㶌pM~N|eEs,bo,a&g-Z-*+@2D/%KA8p0u?픺>)?Ԧ-O{޲E{3q ZlNnžTޒqN"W]}+5)zҭ^=n' j~aҶ]гS/ͪ7CHI:53<w;x>,d`ШB~)L6`MTagG g5pI*0Q<#9Bgrs&(ZO 9OKNm$l Yl?{t(|#cH,+=8 8)JE2K! OgN_;UFLYQAV,R23 .16 ET}~7|{r{[fDcE(S`&&bߺϠ﭂" ֮ t1P$P`W '~qyyA-0-ǔVGkĴ~3'fm&m2'|o)+Ԛ'CP$X[b1`ĈUaM2,Yz #)̭ |8NQ{g cqiI'AYЇU*:|Y1]s7Mtr<nO4Fqm0'yzn2i¯@Y^o%DO)Z\U"y.[!cΐ\O_m`P+Fwn0IH\KBlufC;1}!A6rf7 G0т|Y+IskXnb]bA;%1(9_=gQ)뛇9`z>) ?)\Ktq-q]wμҀW~J#CZuU$`}: 66S1;bW[(3ȿOP /Z?o tTp`#D'/t.nOɓS+DS_ ^܃mfb::?K"!aw+6"GqZj:MoU Eo5F$Q9tXDHdGu-l:*Y3 c>"rrd@%JZlv,3YIEMz_~I53n* ҕJ5cL \${J5ޠ]I3OE7;Vt*'(].KUH1?KP{1Ÿ,T>>t_ަ0gq,Z|(l܈7[p%iux ux칄i/0* sjz|Ҭ4SxaI^JcTa,H< 0ׇ\KvUa Aט[TY&_1ie7,PPI|ɿWбd EWEB'G%9`좎HK dmGp7xMӭOJQp"o3 U8_:(@ /l'bYzIOp@5u_޺_y.P%l;}l"+_O'5v]GA`9L#{]ٻ8}WͿJ"ݭ|KF<m%!Jѷe#/ޘ]i-R#b~>/õA<~@)b#9?1}|K0ļMk F{ U]j6=<*1v(HF:EvEUeoVQ.vқF&߈*y\9rGdteWI`^. Ƚ[NggYi MܨQRoJZŢW6'K 5ygl褒SN\V^{tmNzL,\Y!z8U^*3{7^ /p ;=8\\M [d (Wob]jla[e;m ؅ܘ ?;{=hddռ4fldU90#5ޙL_Az#:ʡj `dD_Yhxf]K9!ooW x_ȳ0$=8\} WHr;O dG?qaYI| qH? A| \,%Q*GێߐO88u& '+)V tZ>Q'cpt`o$GTXcOYR;kz.r +TjmNH@jxwئg죇S^PMÜ2c~ecPo KhY+Վ-l&ޑ=|<"hw+R}es9dzfA$>=q|Pz!`_!Ď6*=,̥9RİU+[P95|vFL |p&Xj24,vg::y%І&B/GT{BD2䷥($x(V՞,^`pJ]IH<ʇ~ȁ2{U齏Vv%\9 iNJ~߰7eNLUw- sL)!NjɃD)H@ /i㯿JlmAu9\zç};UW(\ _ͪ٫2s`hYy&Vp5fuڇa wZ%gJוW!K)/4T*[R$Qٴvga=ϔKZ[tÕ24PVV ()Ln_[DOۖ%Nnï[嬨[Ū+[ǖ3I1[^MqlX[2ċ4|2-&Mv++8xh3-=jNo KBɮxYo(yH!I*JIE:KeΜZeΜeθwm5=Lby; [0fW}4[iy[GG|߷X.UsjTsJ0)|ʓkJP>TD>ƛRy҆2(xzq \p]NN(]/Ts<ՙœar_۽ىř@g"+ 7si5G~ϼ'?Tay"+AU ;=̟29:wNkTHE.p/θpdo.@xmRk`: *O*\u=6& rPQ{m͛~##iWTOݝ{GVJ\שWYW7/ISk5, Eyoe|KUz7]e(F5B圝:圝9n$?Ѯ;LGtF.GsuH}fB}uh!urHx`hN_`ECڛDk;܀{ P51Y;1}sT,\~+yUsdV؟Yg;u;U]LrAOy/u 9ԻT|G[JEXM c3Z:?DZ8Z8[ur ae_ ?>GKnoC`4L)T4kDν G4D?C4opfhtR( tبuH1bmbMN%Ȫ2b5S55G,٘ġ~X&\{$owqV^fsr!SGOeOE*r9[iYvr7LRw8 !K^KϬׯ_pM!,iH .t+GD=-+DZe^D*䳠-:ř$j)awiWF9S$ZZ ^9]nS7L`-#Q':R;F#Y;QNԫ=$zGeRb8bo^p=ά-|-\J7?CdT<Ͽ anu1寀Mbdm9ؒ:?8|7C ߷ZC)w+%NBRJy4_a1hYM5Q;Ad4^S/u9QkXqCJp$^VJDdE;œ?M+Zq$}fP0\ 2j> lGE=͍6yHyI7?V$ a |N<N 5+ܮX+#eDg&t [`8M?HO%$7݃*:4j=/D&sA`]. N+$99нK6|UEjkty(.E(sOd1V%-"JE#ěCS;&ܽ { ~B`릀Njqc,3~&mPilam bLC%d]{ZV rZF07kzs8PxKaV+F#Ө?ZUh+@)WU %o)',+uRW^RUgd~: 11Y$aN,*[Z$0ζ6H^Q$U_n!L-\fI@P(.Bg.8Q\+!'3-</|O04w2ˆGڢmUP79 *̅ED? '?i1,qtCCB9ڥUvï"0,wɓQK?&5 2VY\Y~)oK27<%\Eav -> L obr9s % - ʚ ZLLH8j'(G_²0y6k%Kl~BIT%L\/bff[AK9‘#% [LxP /bLh@-%<$O˛ ;||' ,e~("QC*  E*TҸRDy"͹r.%Sg"xe8 y⥖x'dY>4a" :ʊ)_6981jO7*u!_McTtx,Q@jv1ə^} ̢ ow;O/SgjikNSѢ91L…Xʛnz_%3U-Uk 9|6 k&%FLcpbRĤʉI NLI٥Oiv14:sPM QWuZY53~R WMjϰUEvM>3[ d 0V.:NNͩ0QiN,_$:DPf%LG؊uVnz|ܪ@!R{V{;a*'Ci}h+g8t\UV) 8.>A|#4?_+ȭwF]K{RvGyJpf'I 1@@g`sBtQ4j= }2Xkm7Zn3ڪ$"? 9MA\$K@K5 HL%Qg&\n%*?}xVX uF rqRy L9c5!'ζ\ysniaY%)P8Ϥ;zNi +&Ю߇ChQ u%,N=QxBJTJx)4ۿ~ LU&GbnҵT#ɝK|A w2 0 ֳas@\y!xUv_Nw&+H ~9/?&? ȵu3BMs<{N9V4TAeB1DМ8)8 b j拌 #}x/;QzςiucH#vŲ"e paF$>\"#T6^99dBJ/0s#/=#=:@}n=Of$LQiqwDV"*h~':N`2 ~aѷ9tY,H(M" @!7qX}|sNdVK)#zKtm; yͷ5fn9Hi*d`k]1H&L 2iFޥŝ@ ɵ§LTe8⺵9̹nv5 o99wnx{98zjΨ)$D΅a94uHD.)OVp @m~cZ}7qM4؂}.EÞrѱm_it7( -GdF˦|eYA4+ ݧTcm:Na)5΅==m)gaV%slF 0ΐ9;X}ԂELrW$Ȥ(cn=`/:Fğ)Ұ%dI%̆)YǂÂ6&,XnɏzX](bz}kS{URp*LO_S 3NJbXT@ H9P+w"o;3HjVO‹'n5n ^eʪ: TIX{T69 9#_yU"A|i8^8δqZ5<^MhV{M@e6^&J M!67 =Y:DA52KՑmԀ'yy4cK}a5hy1ȒFs8Z<tsHyj/^#(~dqxp9l9>&k|Θ/#HwjFA6 xQ0җ絅ѝՄqA Ĉ%UGf,+{/$%tFb3hߎhkxwoCW0M*!M?;kL,mѰ mKHMxp'3 HM{)MU8R`Wv%Ƥ;< ;2` {ğoI 4SI:E,';H@@NPYހQXTT>*]{ɵn,]fp, Lۛf'I,Bюb4XUd`6:]U57b>6?рs=NX:"HtSa^t;TQ5V!Vs YmxDQg )?^],M8d((zLy.VYXCe tu_:M/6<4LA&לjo0iXz/b5:X%roFkOC/- f>^l{s 1<6j]V(`y>%I(&A?|]9%NC۩ )6 >?ŧhh쏵FTx\.%E]=n66m0́+\^V?h0.&g 0n4yb#b&‚~CPU j ?j-.\Eˏ5onXK56ʺ ְR'?ޮ1{SSX᥎!akL6SݬWv(I0nVX\o`Aa(gX^joi]"{[ÛT£̞-0E#PjO8|~`U}tH+K\:0$Q^e\*$-4gB<Ÿt&,: CbLTT4QicZ7! ;8%ZTtyS uϞ~]4_ӇmY& k_x` 'ȰsyńU>`FH ]{ts|OO_! Xs37Dk2 = 'Gۗ5 ib < c!_ԈJ`|&d^+ |wpɻJ(|۱'&86\lEQ3;6dUPPpj6&yq$ҽtuZ A5u, I D kqŒ۽N϶`mœjbf3 #_~&g`Tx)ٽEʭW \F (~YpjvXžɀY='OV|4 LcKfp214np"zgK%! զ2N}+[$Ơ%cY~#w$K|YA%\vKiSQr(n#/˒}aགW? ܐ~ уYŦϨb; HPU9ċ({m+A14s9K*L7Tn]!!Ei=?Kk Q&[(%e|?C4 ] W ^ ߠd uv qG܅qGqeF%q˵*,YG[Ⱥ `SaMIX˦dNrX1#˩KY"߼T 5OfW%'61GCi"X:+@yA L`,% H֩S9DLSP;#OؚZg p-+%sxY@gjg,!d +$?Ղ8mk{>v-Wx,y%D_M7NuU0)Ge [eM R*x󯋤6{fxvS|] PȔ`g`m(]J֭nE`o٘~ǂ8Y$ q`aPAR澷FOM,as56rU>Zrt+5In^P=C݂x‰x {aEfrߴ!\<'knFK2QC-("."L JsXam1H%K&+2O|*X`Mʐy f6kQ"L9-a](Uݨ0wn߱Ʃ>JaA$[漂1eSe?61`Kk~9K\ %'Z8uL-fT ޜX$w_sA j iIڹ\L#eLȻX¦E5pZC24\HRu>9#z \4glLS|'V]leѣOjyS݂`8b6]o3WP1Tt Y.H_ uń?:'覞n5W W;Sf+#g )1RAsmaJܳ#K?k߽ryduӶ@aлDX0020eP m"?o3ӓС=YB`3% $rx,.v;I%\Fs ݧJV)9,*}OG0p#?_q?Ƞ ?(.RX[I+S(Y˓>N-şSWmC k`n 9T"xnMUK}Љ,1K)\d8@Bߢr__Ϻ&>E\T[`|UzOej=#CE!Ԟq3NMW+^Ped ˭ϠZ]z1/H !]ȁR sF`ByT w> PoU E,XOV0Z>Eg&q`}G̚yCfkS,X'5|'Hfj >F84 ?BL^zA׿sI2T&yJ.Vt22RXb&ƤrD˂OŠ:%V:pِ$~'B!B!g<<<}zyyyO<<<<<<<<ϟчn<<<<yyyyyoZ1=<<{u6<<<<_<<<B<<<<|A~}q-<<<<#nN<<<<;o< <<<GqadX֜s`&ND0fȩ頻o}3]^:]ַ><=?xTME9jEI% .c$ne޲KѦM/(L!)u D{҆ Uq&O?]t(,Qz%3UWHDEa\Q9iS1hujB_9Μh.C|nyycGx|9@Ѓ^JFD:{O͙#oYL }?_n]-XȤinAzaӟ&Kо\q6j梃y~%:K}uټ?_2Dzk֞ n}Xw+KyZ5DkȉEaaf<01&|Nꮻhf Ւ 1cZi/[4?EA@KPq=z?o,_hwTbL/x0 p~0ZZD׫ENN m|.jr -tb`GP rh+|Æ'5h9mj?>ɑ7Hk-fϩyA=sACoV<<ڲEC|Dkֈk?:0| iaAD$6{`Gծ$)Not!h{Uxɋk3H}l&x뇙 ~'# V:hp Pm=zD}ե }N B]Jx!]Fy6&xt?Az饠(:{`4@'G}յq9+A'C(+-~XODkZEdpu={ĠAQy_uN۶@0O^]x5R"=zDapuzđP{Cb~OŃ/L(lDUԉ6mThO ?Y o?hp}~_j}*4o /͇yO8[?Bm.N<=hxA qq~OG^b1AUx;v=/܃g4ÇEԜ92A'/!qc3+oߞRWSD6-|/܃g4z-[֭}z_ɫURD7SE~Ndm[ }L y9^ V:hp D[PPJqI&]DǎoFbCj<֭4@ /܃g4:RKUδ{ > ^|o~\|˖qK^-lp HqUǺ 5w.we)w4i1E  A$|yx4XAUACFѡCG+1f@t|2h81Y3*)6/B?7{`܃GА)Aq0{_կO|!fRo]-g<|C8я=hxA#hȔ yMWj, A!1awU9WsjۂpTX^{`̃GА)AݹĈD!6D;va~6"v"-ʇ1ھ H={`̃GАAA pB9TRgc~8""uh~ =hxA#hȸ z}WjjmTRzK?_͚%zHz1C^vZyS˖W^Qkкugs> yUQ|y2!5g=hxA;4@8\7?b`1}W'3[eeFDbx9sZ0J{M97_(It|qu D%%"+VR;k N<1M7o.Sŋinan|Ő!2"8 V:hpG_xI޵ע}ς&M2ÇuD۷yyW"[jE[* ӦMvzmKjѢdޣʙ3+.Lțn#{L=D"VSU؄wr_܃g4#AѦMANSE=n N.S+VСC:2'Go~^Ď#d"<:uT(R+WG&%i/(ucnHLe 6Dxе+=hxA#h-gKϞD}yT,+tD6APj4& ߮;V>xbJ*Q'b?Y NAysP#E-\߯grڴ 7|Q>= XJ|o݉Gߣ:"ĹlN>92^={[nIfL-1q"=hxA=$gu1|яy&owݕ}|hΝY$ 4<=ECKΪ]ŌK 1lX$\hgoGg~00vt0>D߼9ƌ}E~aԫ2h/K'lEhxiJ>ۧ=d޽5sɓ#4_de'Ծ(1IDw.^-^# R>h˓>T1pſ?Y / / ʛo`/gԜ%J-[hx{48?/+}Y'[ҨEE˧bw- |"٘aPa9^H\|s_:aN`^рR9߭㚭Tqq:l@3,.F?*K|yJK~AE;zhǎ[c6ԪU=hx /W4`TwݥJ}Ad%y5[;^3n+|0tH$D0x1>+K/2h-/xASрR_XHvi 3=Z3T0r$|0hfଳn/沊J# x7G\S#hA۶iW_yEU߻-1R5['_і-^ BxA^#^?N#4sѺunϿ?+0^ƷnMAyJNf1qfxǎ<%}oBxվ2hԨVoteCW̃[_hx*/{kC?mƍ+3<20X?<П Z|vz-\bDtª?Y Ͽ㥪|0`)vmkW0=86n'(wQAZrZ|Vc,9oSsu܃jm߮|Pƍ+izPu>q᝘_G\~fi'g4`~KuyeYGYҖnC/*<o1oߐ*0?g͋ɓ F'i~S};~ru+0^s^.ߪ?X2{6Uxڵ*WǼFL gɫE\(=~ݧ*? V:hpAKuyq͚…VQJX_^h N>1o5 3ϜOgoL۵SJG4X<} /رԚ5VQKj>C 4H Gz̧~qE hxAxںUsg;.ƍ+Qq{xE, 0<'v%#3~?$Sbd4xAxc*^=隭裏Oua,q5]#FpDƙ<}f(ɾ? 0Yv GL9+8,V2a.=hxAh?Ւ%,GSNwﮙKouO( i31.]4sٳ3'l:xPs)ϰg4?j^>fW/ԩCBhRoYڠ ޳f(hQ4X<} <- XGL}y0jhӦ4?4޽724K|Dg~yYU ՠ((PO>X{o ED+&{/(x?7pa^;wg>~̰{ūUV*6m/y|h`Eo|u*^!i\]+e&GwB|C9ti_G;wdŋ1_x['o8߳g#ՋRxc0x߲e'O|U;0<' +@ϋ(~ÆIƢT=]y^ee_sBnЮ!&c-ы)]4?S'8_jڳdIc,H`̗e2OsOd?d8n?hPrP:%O>C8w'߱#19^>|[ƣ 7Sh0!3B])6?p񑙯N oo%O>CzUC`&%o^40Ly|ыΗ|fQi;^}PRJ+~JJ#/y~Mh`E /%|>N}U+s9D)%[xm%O>C)4c>O>U2_E͔. ߞ/Z xBJ}Uta^۶>ɓ_VA@ÌGӦR|ƇE͔.h|ѱ-'[^xq7m/]*TD[ЫWc_Knb 0'=o?K6E͔.h|Yt/_.qGQZ%-_=v'sJ|k+cGK>h`E۴u%8(zX$X(Xl֞"x#ON"V[ Ty<%o^40Ly|Ηm3:\cg e˃s5t'K-0'߮J} '_40 ytы/[lk2~GO eɑq^׽J Owpק.2k%Oh𒢁fɃ ^4|v՚5bK!JRj)ߏfL~!Ovps=X 2_y['o5KCT`2~ȓQ}sEp|ppk%O>/o}ΊzH}%`y5k=h<_?ɯ!uO͓9F`||3䡋G/lgP.`}wU>N$e#J)dw!O>"t2 " FbVN0 y|_Y ~+3 3(*8TR6T{k˖u?Jv?q/Γ:K`|o`EC UW%K9џ%>wgȐ`0{s ƌ 'L'Mn%=;=O<~t)'QOٵ?WwË/X|o`ES4PT;^&7O'RfGq;ww57\*J0'/wۍZɓ_|3䡋7hc,3HRB0z۬ A) yĉ+k%O!]4QEEů:=|>Rf7~s:յÛnXy{3_+y['o}l]Rx|4wj+k%Oh`E7z@Qeqk.2EE(ßg4h <Vn6J<~|3䡋7h֭|o~~eRft7w:Ktua8OUT0_+ydE7n@Qq#ʕRN 6mP3 u.K};yK/ |Zɓ? fC ߈EE=ezA $z|Υˉ y%+E k%O͐/RY7KptRKBwUA GO>)Jok%OE͐. .Ov SLJ}קO]\VXp|+o뭙,g럊Yk>2/ы)^4EEv݄O/OKW0r$s9jJG 罝wXůje^ɣ 7Sh0?? `'_Q_8qb eTe$:!X7|ǎ+VE}x3vSPW e&mI>aS/9}"ױ0/ы)^4 ۭoH|&&`gU e›n{|ijK  پȓG/o~۬}|n#h"UTsxkWbEey'fC  Tm7hW[&~z)?5H'(<_QX`ey'^40Lytkԏ?G+*x)OU+/)פԪU6m,?䫈ES$o4B`jU^o`E|EEEơ5 6UD+k?j æȓG/oz׵kc!SC ϢRBtG&[y!o(8{7߬VV0f5stQїN1_cyg&EIX~ Ch0r> RtǺZCo<85KW_&_[ éS?(6o| R>1i+w2|{vw/RQ=tp)[C)8QR~v|ɧ/v~K^IO8A58@/^܈~& 3|[ލ éScq;t@|9~(Kȗ|zCn#N+90ף +*k&\x*1 'LXyCfy_"ʕoe@oMB[Yi<|>\۵j#_9(j v~CwW+0_3{Pqgpe+2 TrRQ4 n׮/;23&YG&+~;%:c&*v| _@#F4 Q2<1ɦ*(U,o͟v[0fLr~y?YANP않b˖y.^`Hkߢ菷dym#v?L!/T]4K&Ϭpફc .HIu!'ͺyݻ;t&05oD?XW_?qS~|os'O:wO:ӦYymn C1;@kP)bwapʔ !h<_B/8_ȓ'Ii"5k| NI<-R+W&wOk ϫkPid맷cc ΗɓƌkWR~ey00@q5wwA0{n ='-N`rh|!O'A>|o,ZD\y%E.6< ߼9~cc[o5Of*90#Gs|ыΗ#@#~-ʕpT mD -vyD>zA0W^L'dI+!=0܁h|!Otkx 7 ?lAVx]/DJx?|+_o#n+woXg&M [omEK y>?fWTğ|"ff|[oTQ$Rav|.\0֬)&~*93 '5?zRC.{oFhBWɫ#ITptX|납g 37N`-]??6V6~! <Y/l.|~!,woыΗ Iov;p*3 %Ygޛ6>JcE { @%7Cv"zt!j#7yکBA,(6m|3(V9N";!'BVꫯPG/8_לbE͊<"*~EJv?b _|A_|i{#FSɲ,AV4w.E ԩ)wov<2F 2_tF EK,Lo)6iR/'OdcǢ_4p)C68fǟ|Xg3_t>$]~y g3ߌhrAVs&ϫk4P/?T ?~B{AWovPf7i13/:t?AqGH ̷~fp'ۣ+!&MyC\^4p~Պ'͝+8?(/:ۈ{,[ a& =0DZ`7|x!=k/ ыίZp<[۫n;oߐ"4n&o㯐ץwsxw|ůf3&Mb.E-G/8jœF~4u׮̷~y*8ϥʉ..[WT+"/X`u *pqIwu|xmtyX _{ +2/L&h|NZB;[R?^Ubogu[D|r m[>ZQU+ί[o W8}:EWxuV*ܞ=o=_MY>CT{ V͛ǟ}&v)<֖˚|;[)_)O><詧Y̷VT 㙯=l\]'2ߚQb7_|8vܓ|׿Vql [m?zU[.#oС(c/;6{OS0a ?_UߟZoxVT/.y5\~9~,[r bI86?Eyp u<\50ݺ)MXL6w3_|^D]S]c[;NbK/e="Ŗ-aw/y')CWbΝG/y.{Aws`$T>WzLx ozlPZ,R8u**Hワ_yA?Mb^EC!O?(bǎ̷|jj%vE>WHuz]AV>z9T#ڶxk.%[Rr Vv{Je-ǍC h?g*_ѲeMopLۿyTc'~~L,v)Z/՚5b>(l5λ{ﭢHlQo_ļЋC|֜|k˻C.c)8E>6(nPWODJRq[nb^]?حUodSzP7ȓǏ-[ mS[y(UE/ o1oTcLCEE8cXAN8AZ*~2\=h^EC!OuWHg3͚s Qɋv\C$ypl]ym)|;/$I)U5dmZʏ?CN'h^EC!O>~5~{#G2M-C/iM^u:}bdp;wVk׊JQ^p%_w`wbyE RasN2~l䱯eP_|QAB/yȑKFby0-ʋJ'6%R{اW(l S :/c>ر?vT. h?WV{S6e"zQpΦt"ͥ$o?8ђ%RRA\uUE +MoG˗ >f/{V=mv}JXrKܼC|pb 3_jSFƑG&q `N_ģ\آE%%|w_Ahp|ׇ Θ $F\jY` ~*Ik~V_ `*ZUVf^pO\)_ɫqIjN<_;GK܊|7pqa*9!ԩ\ GE{ᗖ dH1BQ{,52oC+ |>u3௾hTH=H$+Ybc4E3Qc{ַo!W$B [K$:s _,h|ç!6>]ю߲2j(p4Z+d<=>SU*hm͕h4_RBm2~12K՚Q5p~s]v}L)r7t1J+~g5/Ndg|iw-.q7ۏR=СtH^K(B#P -o/-u>4vZ[/[7d^|1^awqKI4HMn':uR-5YӷNsOӬo}cߐYCLE.]Z*m `잾^;RJNh#GdJ"K.ӭN:UfQ3 _K.Jc/;w.>ME% hO"r^Zׇu;X0WnQK+'j<5$R>rtOG@>#F"Ȉ_$8>[=&y]GPVϗۯ,KMXLxGp]Hl ~<Ai+gaAKkj\zP+̑#T(EuWZ&[ˇq1#?E6e =(HxԆ aqP8Js _b$8>ρ_W_58jܓ//Ke8vwvOg%F@ #~EW[)/o}7 WHDx~hKQw4*-Y|bzjl=,iyNͿEq~H:X[}퓩C1N:ɼ*Gwޡ^l 6@ģ~N9X~4| &jkGjRTV _h,I>|mxx6hE+*~$GPė(K'<>p@ ׼bp[%R8yĝ4IDċ/# 9iG^~(Ÿh|=ZցbH~qcL:TGC>|6PYZVxuq-P| O?Zq~5@^W ѐ6wwc#}0ģ$~a歷"CE‡䗔~15>p 3M@` jz _bT4v|ڕJ9ǝ>ZP!k<ФbqX:Kg$mp&OV6 [Qx{gOW~<@I+^! ~U;cYj/9''A^J"uLzÇr /wJǷg1#ďQ*:wΛdzlrD|I{ɇoEʞGiWu _5CqRŗ 9᫽{?3fKf?eKf`xO˧\VuM/m $pŋ'|t7 sG]1CG"歷-Xn=>ƍm8K/,x‡m`o\|Iϧ_?pj}=>r Yc北' 3 lF0oQA|{9x ~|;c}=%Sr s2u"O~زeDFdǧ\Ä e`M{LH/T4r|y 1.1z)MZ$Q* 7N`Wxh5ugVRvzP^Q* :G"-Z xx~5.Wu1kÆ)'P:vDWP_<؝?$8_xiև1~vpؼRs{w}| 8tċH 6᫽zK.=`¼Zxiɇ{ _G?kfǁ@(:`ۏŬF.Z%xIh)P~ǎCI {xߺ|SN.-v󿀾~1LQ4J ҉]vqKyG :PSr"޷rÇ_Sc?<O-ttz%"$zٺ^\3Mc%?-?`NlԺB}|."̼Nf7z ?'[ϛǁ)hH>}{@n};w2]D&%QQ\>|bV2?_D0[H4cѼ68mn]`ozI~>|ڶm:[H?a㬳؊=fڳ'K'4k3fp VG>[?5g+WrP[K㢋ǝ;Wgv2|v3ÇWkWkq8q>@9p>m&et*/҉@?|WvQ@ oG9#g?o |[ϼj|9Ł3iX ߡC2z5~-~+(K"ٸAU9qLTWc>|dv|2 QG)aO! J7 |u=~<5|NGC>|GirP;%&[m ?[~f^|t1.-YA~a KutS\B痃"d?RWW O3`J uM0g"ѣ]t6yƅR 7Y|~isPYݧ-_f8)}Η_rP 9sOMᇼe-%W/:C#7dͳj_}=&a7hT?hg+P [7T4 ç4T|aO￿̹?!ix>şxnh3g^7߬F4.sg g[Y_y3gr33+P6-o>|_k;&>5ӝ?q>\?8W700ۦ",*Ţ,̷$p~ÆY#Y[->ԗ|m$|Qm}^bA ׹y=T~,ﻯALgҤdߓ̷Fw/64w端cjn=Jra̷C_~֣7u_;W]E'|~I/qHo gD+z̟T4—Wz(~_|R{o%)?ۛr |*̚%aҁYRO?|07 -mP_Ƙ3my]{':whÇ~yvO~ˁhƱnST>P{Q(>Bf_1/s Uvp<Ïhyy5G1Ӕv5g >|P׍H~5Zn%C1} -.~>|UU!1괿'*Ἇ'|eet'߼&ݟ~8GuHza㬳6Ç>m 㢋1cxqw\{8KH}yEt>Ji 79s&1Fs\ B}k//W8?ioti/ͳǎ5Z; Ç>|OP`a=h9ג%]|G9z Lf8?KQ$U_rI>|HDY}mJf^}6".l[ܙ:J3FCÇO=4FUΞMr AATA;)H>|vI./t]G /ͻ6N=U<8Q^.Ç_qy9>|һNiQ3,:}F~p,jLƘe+?r>ܼOn ;wl5z?s[n~~},Ylgf 5yļZ3WzP">|G􏼶O?di,]nQeVTD{x+lj~sOD?|M#m$4Ϛu UhvU;@jH >N;n1}ѮJ,lއ?j^ L}=%(1AEmԐ\?XSAOOzJ t=WWbU]EB`<>|çu MAo:?miQvH^<R*VZb e ]R]顈+yyyygϴ yyyy?^gn<<<@"?l<<<d"yyyyk)yyy3'Y=<<иovyyyy35<<<<_}N4Gm<<<<ŧU7K4<<<<[r綿FY<<<{yyyy,nyyyy MV<<<4"#7yyyy>~0<<< ,<<<<|<<<<-o3yyy<$I$IJ^a<<<Ÿkm5<<<{io<<<|6<t<<<Wyyyy#yyyy|m<<<<*z<<<>>>>>>o;kDO`Fk_ c~`y~ʬɆlŎ89 B]#<˼|8:xb;D}|c`nZ5ڑA",-g]6c[vchNl.n6<;ziCtRӜoٙ؂#~ʬFlNYl8b b {ygx؂EFForfecgY-[0Vc=6c;vgN.-`^lxxD䌌N&U[#i_1 4mX؂5;b ƅ\s/[0a$_2zx__epLɴ%$0 ?gb lnaé˥\`M>`%GC+>>S%9KIRɂ,ɏ`l\lسi ƙ\p2WyOY^EyMczؐۘ@$폡\ϋLxuI%>>~,s,dI2s3ZM*==]+72;,ˢìE;Ⱦ\ӌ}?k0jcfղɾ|>_o"Owsz.|N8``Gdd%<31XLWp5#Kߏ ThDÕ%3i>>>>>>>>^# S"YŘY2%2;s'r'2H˲5'ɻRl؂qWrgrGq{[06.`$ 2' 0=M)&MTOyA|@q:hY˟G6?Zs> ^InnVR0ewg3g5V(`,Zlhlaw.1!C|||||||||^BgiY^&O\.?g7.*r_Yz .dVf[1>>>>>>>Չ+.r-hes![Gcv<}S)/s(jYKA>~Or{ Q~Ď|@?>>>>>>>>^7.ʏ:yFѪg֣eYO||iaO~05rl9ttUT>>~_3YُGxӲ bSbF{W'feYbݡT!J4j7WkiO`ea-g|J7̤FYm9{EWҥa_IUCkSby̚~>'0؛Y[s0ze|@}|<3|dfֲŁ<g|eEfٺV|g||||||||tOa*3C+.WZo4|DZc%fU,#i?GտFZ4Yi`?ԲY('OF2#W~z D||m&?,e6M/^ ]0rrZhʏDUv=ܦ!=Z%9/A9( 'p?m^a?VU&>' tUnVٺlɇzO/v4T\~5>~U9OV߫q70T˲Gx}_euTF|W||||||||^(#c TVyڟq?ʬ sfFa\j؀ce|P?̪e}o'`-VmKW|||||||7{ϯ*?\ Z_q _g3G6Qa=oCW|||||||WyeZP_g Uy@ֲ.r .Yko?.N؄(sL3>>>>>>>}S%:3uMtI?O'kYfgO [|FHD6eQ5ʬʁKLh?SzOJUkYE+3 oO'QfaUz^dm'>>>>>>>^yM/*Н!̫eG/?'/NasW*u<fD?Yޕ(k뇨Wts?3в,i|DgS٢~+j׼&QFy}">#Uc1- 6NƓǏnNg+TĊ>>>>>~ UK >.UO?4ʬ-&T/W ai5P~^\ӌ#+>>>>>>?GRD!GꉏRCٖYdfֲ́<ϴO||YlDzj=.D W^?AU"}NKiL$n~pKU }N>a$Ix>o-мhQ~_[47{S$Iuy^yCX4o*G$I8:MyM/*/>ߏolH$I|wWQgk8%$ILn_)*E||=Ǫ29#DfJ$y^oqsO9J$r"+M1*>OҐ$Ig|w7NWV$I?]ᡬO }*>;ݯ*ד>+au{iT:g||ʃ.zr#>~ 6}ǯ*&}w]U&}wի5+H鳣}|-}|||||D =~&U>>UYKS@||L2?JU1>>3>>>>>>^YW/ZЏMm/bNWʖxKkSIw NǪAxբR|| 4I7ʦN9xidkTe g{ޤNkʟ4g||||||ĪOU}Iʉ}|r3>>>>>>^U_+>U+HR4g||||||=5[5߫]ώg||||||慇eT<.U_eU)>>)3>>>>>>^y=ǔY||},=~6Uy>>.UY+>>>>>>a*wD4kgQ6XgGK4m>*ER||ggk3>=~1 pT0zBLd?*>3Cg"43ah[o//4> zP^[6vrEy;nk.K.LN9#e])drCYcRg%Ydy昕ib ƩI1Fead@)*U:vhfilT~/~|_3{V^9X`kԶm۶m[9|\D7ջ`@lڶmD( Y,uUu7MhضLv\0^ǥq\iZ` u7 DB`K!Pzcǜp~*ęR^TJko~sk̝>8ܓ޿[cH3 `MmIP a :B 0n!Ki!#!BLJ9SjB+clZsn!\bxK#gίNjdڶay>_Gq!uB6)m1fs}!R)5VjT1sc.]9~6]1S:t[)`آo XۃU%@cQdRUls̼2 b jJ? lmB<-? " "qغ ˬ߿Zaj|n9ϙ̽'d,'Ktҟ-[e~|//Պ?"vz^`]^z[r<4ӏDErn둲r<D^zmPzD9 GQ.?_bzdHmqoE:>|>^BQf/#|QD)kwiN'(roo^ \2<(@(?(+~WND)OtEe"!B ·z^x=DӎzDyE3O'_A?Y#+L* I:!x Q&~z^PoWDy 4ӏX reEew xtC^'zx9^?(hD,D)(;L*oI:!xK%|(^뫯#"mh}? #O!W?OP#F"Ӳ^8}:̀}QC^(^OC?8롁~%ʖ;r '"Ӳn=Tҹ2:p>(^7PuC'^L? \2wu':8!'rz^OśFc~'h wͽȴv)<\=?KzbQ>s<,f_Ou)'//Eem=<?5ޟ$Tp>\z^t şw(S4ӏ<<r=l9lX0-˗Nl\vC~pz:Wj;O ʫ~ (QyYdZ#}!x(awz^O:O%~e읲9kDy68z^\Dz\9^ߞ(߄foCC~!#G읲92Fp>z~pW^5q E 'C~cǺ읲6tfCQ>·Kz=w/ewh)HgLw.>{[ƌ!UkD^iz$ꢯVx3 Gf9(rA+KRGγ x2QvC^-6-b'2 G(Q΄I͞Z:$Ro'Q|z*Q=z]D tD,XԷ |re8z^o˃nƽ^?(K~󈲜"W? Z&^ťwa-I[k%5|z+VRt/!L?Dmm/laz}7Vf=s C^-vN|b{~Q^@WQs^{_v-dg|zӲHV!^?(h|r8Q17qwZ92QDy+8z^oT9T!^߁(_foOo@~n'OL}3{wEqBσ^?^5q4Џ᷐fʔ Wo; ҙzSp>z^Hq6^Qvf(A~fӧMƑ25?OO·uz:: z^Qfѿ(GC~N&[;1~&8ֽ^z-)*Zh!ʕL?{r˗~!\w?|k?(sz^S=ҭ[UL(~ rl9lXf GVmwrk^z=-/oڸ{2(A~>BA:k^߽k4M۽^G "W?W3.|cw謳Hr5?M=pHz!6]^ Qvf(C~啗\R_7 /0t@ 9z^]av׿(G@3?@#ٳW+]gw r.8z^P`{DLH,\8m=4K<7^z}暫=m#L?rkTkX#ܓt UDz^멿T f G( W?'nR76%5ާIp>z^'}mzDG Q)HؽOqw˺uEQw{5G=|8z^O}{~*Q^ ?(B~%Y:ȼx^ߝqDS8z^STڒmzQDy4ӏx"W?e'_uz}]}|\G|8z^Ͽ3K;T^ߕ(_hD4&:5N8\]_w3reop>z^Cl^ׯ(?f'ʏ!W?ӧ x]w9Ők('^zRGz#4ӏDy d$u2z}wU'-k?L|z>4fږz(H0hLjr dg_|~x wHN5e8z^Oy$N׿(~')+VWnq۬eDz^קz^TϩDA_{^(~k2r!.cVy|+/$6VW^oO:\Pz}ʷ~_h"]L?rJ ҙp~ 7^}!,z밾> E=Q ·z^S\_Ӣ^F'~ӉσDtԨ~W?~'T?vf~d l RoPz}3Z^䭶z~$QAL?Dy-g1Q׳kίϟ`ܸޚZW֧nt\#Dz^p_EuE^ߝ(_fDB~ gkKͿ[/v衄ytƌn+Ig,)KcPz}ٰmzz#O~;B޸auSOwNy2ͯ?}:Dz^sK_LhA~?!Jrs8Q>z^xW"XwW S~!^݅ 7UoV|쳏}wW)oB[YʟX7|2鬃\b·z^OA}mz+;B3Jc!W??'Zv\O~gx6Ç&Ny_Xѽ o9{L[n)_;y>c p> ^zjGDħamzCDG(Q΀\|({lfÚ5O^p'SINo{WLIK:o\|z Tzq[J^(~wPՐRq{, `wfrc6~;6ZyJ~;H:5޷&w)zBz,AL?yDYy!Q:n_77^y#FEA7(olٿzu͔/7OjKCmlz^g0!TFןNǡ~!:9]1tٲ;M;`ȑr 3;7ܰ٬%{T|r x ·z^φM_nx}mz1DyE3'R=Qo9]wӃ>vc)'Oܹ?/#xp>^zAu~E%l$g~#~\KΘEV_sOr(=∷Ϛ[oV9S*n9 rr)8^z=jgYTOGeQ~ ߁(_\H͜/̛w'o#{mI~xqc7݊rgqz?t΁\}Qaz^3|(6yD Gk ” W?\wOk׾x 2^q%^v;{3raz^ӲOǢevyCs4ӏDr ʯ:]pĉ{l-9Ö[|)_~2G4ʽz𔊹G*5O&ʫ0z^~C_Bu\Ew K`  2kw 1wpZ<9N}霮g:ߑk]'~PDJODjov S DL<w:ꡳaz1b;ϻx߄(?χz^c _F`t}A"P'rDf;xGlz?s]xK܌l0FT%(5|{^4cd72SMD9JYRas5mZ\o~xE"cR~7QVχ/z^3}#Z'$Cgդ:#5P]vYSr|gi%R:fq٭gU%{%Kx>|Izh\{E0GPYDyT=_)ΦwgFJd5ָ:G撊o|,##%^zZ+.1`݈MS0| JsQz5yJ~Sj+ ' z%=^U!PjD>gC^/Bc*^xׯ,?(:w&mRLϟvZ _?'ټs=eP 6T9{6JKrx>z^D˵^}V#ʃPD-g{ f:aVDvhwwܲyFP%8$9JWPzKzZyݠ^_ QCz`(JճQ螘;GP"ʩ;$K*p3 J݈e|z%= !Q:!ʚPGIc:&gۄBҗΫ;o0K*wxEC>(?χz^_&z}}%uD>@z~Ef),X3vdRϪtZ# +ſ(3N=ϓg?(U7媫w&ND6X}C7kO2m.8h-sPd)kC^xmWzJbSD9 J;eJ3*)m3k`ϪbI{Pd(S^^QCz72(U"tYd>cX}.c_^rɠ6T=~;A~ QK|zOk-MWGB=RlL_~yd_:gWwiK*J=ƥB>(_χz^{ݹm_5@(Az=\)PK>̿`ro9ye#撊,zs+C^x2+[&Dԣ(AzYe' Kg1E6~sU_9!a|z-fz}Ueu(/R|(nAycC(:Cߡ%9{4y%zPz}E$CC"N=eO(UgrЖ[4~S;To6Tt.@m |oeg|zG%gz}}?(sN=8(UϛrƮƳFz}i(2#^=C32B,:(U5D~WT|s;Pd'yGzP6 ^Sb̃RNsؙha#ﳉ<z^bM7R$WHu ʻH9(_8IZ<[^k%ux?(χ=z^4r09Q~JS~|JճQ~Sx߉("y>z^E\:2r/N=CRz$ʽ]9[hzO?|R}]<z^׳g`h (BթGQ 0|RJ%hz;|N" (a^z}{MwgD ԣ( Bz~EkudT{"+x݆wz/݂r%$ԣ!AzA"6$u^?ou"kḛ{z^(] WGcN=ogW(Urܔ),kow}:^vۑGxw8χ{^/KthtӋ^_/"PGrg!Q.kQ]'O&oC~3Q޽^zڨD1k͑Ũ:_G"sT=eɡvo?^5$_C~.Q޽^? z}eQMSJ\9(>T-i.^z^M^ӉESTT݈sm&cMQn|րR} Qn#y>z^gBE_߂(?:"ʧIL?\q_3?Rg(5$a^z=>kD2;LUDWS~ Q"< CDy[Z3;^g_(28O<z^ȊZ/ 2S~] sQ7.X7J^'Pd( y^ ߹uYq]/zDԣDǡH=@6ؠ{Y{bT{~!%Pd(z^ :_'nPSD9xN^p=No'p^z6~ۼkhSLR(g ݃zqSx(z^y& {S_LN=O`(U5Dwg6^cM"L<z^OBE|^__LPr4c?^t" |p^ZgNJDTuD Js Qx陹Y0^*s?N|B^z}w~|ԣ?(RlKϙ}yGn|VR}M Wz^yy?5.J~+TDT=kon;׷ގVgs(2#Ox^;V1kS~|0|Rŋ== +^9^Pd(Šz^0,hiS~# L^k-G?4c e:hz^Y1/2S~i(AzF7٤+z;|."-D9V^z7mԽHE"iP=DYJ^j`l7J^3krhz^4({qKHSD J3(WomT{w$wC~*Qn_z劦h^_ǿ(Bz_ ʾP ҹ|LH}^rS_z>p˵&Rz$ (U1Dȉ'3Q-[|~EDhz^ ϖhx Iԣ(Cz^AΚ5fzꫭF>B*2'BWV^z^8%R/ߏ(:'"(Uˈ+fhA^b\YBǿ{z^QAI6DԩG,QEyycgک+gc(2޿G-`z^Z+~ MS~|Tgq 6&mf+x4)uz^%S:7#OIE깋(O6N:|" $9Fп^z=˽ ,_BM"Z=DTO琭riS# Pd_Ik`z^|WM"N={I*,# D9s4g1ծw_Dy3^zIBjZhGz}u(Az& 6ک;L>o"}:Q>#_z07rS-QΆ:J"ݡT=6ځ[n_(27#I+ڿ^z} C ޯ^__AN=(UD;󴍩HE8^z^jEwz}  QBS~1|΃RlC\t3OۘjGx;`dz^|<ߴA?(&թG QBz _6vڿ/X@H5^zrhDz} Q:O$;HEy(C)N>mc媫'ρ0z^YFNuE9|6^k-g1%0z^i\I]cIRz[PeM7uiSӧB>A~)Qz^^وe/ $ѯA{H=!S:󴍩棏&x?(oz^߬\~l^_(;Az'S"%ӧ;󴍩vuPdA/Fֿ^z=-,h^Hs(ԩGkR#]z'k;̙mL3vݕ|D*2'0z^ܸ^_J"3N=oeg(UD̙w@D#_zG]l^?xQuѿ(gAz6"ҙmL&NF~|z^$/W@?(:$uP'!eyk6ڿ\{-Epܝ #_zeٕz}.QuLO@z ʔIyTT(2&qz^,"Dחۗ.AI:vRz>A"kB~Q_z.2-zD-ԩGQ>E2QtSg1:6PdI_zj^/KO(ԩG+Q Ey7|Nag1վr;Oz^ ]t@ :PˈKRzn!ϥӧ;󴍩W|fB>Q~ z^ONw}35M(SN= Q$g6Q^{T=G3g:󴍩v{ϫI_{^zQzr ԩGl ٕ(Ϟ6ڱSHe^z)Q^?@Q:@"T=OW^'~6ۇf8kڴgϯvdx{r4ٿ^z=Kz@DyԩGNEyQUlAO\m5`v^msR}.Q.>z^D|bH?(!թG?(sH=$ǯֹs}&+[dա!x?( z^8KIz@NDԩGQs;Q: ^_wVLЕfEzFEDٿ^z=m|>2!~~Q~uGqֹs#z})߹yLeեPd@o_z}izDIuI/Cz^O"_~ͭ3ez^ߧ'"xB^?(|j'_HE9(<GSgѢy5Czs=l=K=4ބ3lz^+Ѹ zrԩG|VP3Ǟ.7Swŋ ? >ؚn⷗_^KO7a%z^i޷/W _o&PO g+_r}Y֬_fhs1bax;Hsx>z^߿ _tѽdo ePHoHo!-Yr~X_fڦ|=7,܄5?o$|zayݾJ>ΟC@z'P{Pg‹/ L?ڹyL?k޷fP=n +3Pz}e0mÉ!Rz2l+M;1qCz5{ۚbp_upV#$χz^4ź뛩~|ԣ(7AzL6,^܎ޫZ1y=MGU}M >ܹoš6|zb@/7$ʯHuџHAzE"ήxݿo,-= f,h=XϦPdI?<z^߳m}P/" AS~?|TDlc|Կ_rO:B= Zwg"ݡ~Q-;SCV[eosNz|[3TuGox<|χz^xIt_W/?K"}N=GHyT]r߇3%K=2ʄUWף{ߚN=WL('@^z=]_Jz@H3ԣ |&Az&W]=me.^|;C7Gs攭G_5òsN;ۡ~-Q."^z/Qďo$%Pw#q۠E2 R+f< Zo|x?(#9z^/7-{^? .Q@z%+H=':&l޶…n =d+G_:#jֿI R^z= jDӆޗ^? $Q>@SVE깍߯?n{+eֺ꫋S5C;kpnoE;Dzs,iDԩG5Q"|D>fhMz޼=6ݔ{u)[o[3ԬyIR}"Q"^z{Mb}YLCzV(Rr+^ѽĽ`sC`n@=~Go}[3T)l&*9z^yB V!:!HE깜(7tr~"nrgt|A"=sIⱛo_ 7Lxczg̨_G>@$JOz^Y7Ԉ5B(Z=](RLfU_źCvd΂YekR'O>|7:z^BkrD>[Bz7P}3^O{#=d7f^;瞻@[3xQs6?@"P|z^pFd6?GN=' P-/~.AUIkAfWXp%֯ ':4D`k_~s?ޯ"ʕP_8 y^OF^/Qzۉ2ԣ#|ֆRL ʃ7ؽ=Uu'L7e/ZT~sKt6|hƌXJ>oIDy z{,x(~bԡ{־z $ԣ(Az(ߟ;S`Gs9n=`uV8IJ7O^O>Wt;EyMAzo!P/efӳ`esYmU!Oy@}խ\'i=#4iQ4χzv8(p ?zǭznD*N=g'Cpw`Akq(i;I]xu^_ݡ.8ܖ_Va;3w& s{l)ť=7#֔Ν?:kVz ˌח-ɡbRRy?دCq8DyKpy[ՁapI7xcu9ކc\Ğq4bܩ6xn͜YL@mg* џp a[7r"WCK+vx9oUP4)H|1~ .ݍxb\bԨd|cD mB}=ZA8W.%:B [7__Tz9 )0o<V92!nOK^x\W\CC8cnړWC:P|q zhU: |8o<.wHOofp]{ŋ#B";пmSB#!ǍcZ 6BjoocPU-`#ȡ$Y7xΜ 9.cx<'\>}K X6_{l)(xk$eka!?'HJooq#)<( 7xA?B4xo[Bk#Vxbqm׮dz@BtQa|ng~Ϟ֕BRl}3xCʐzx1=2kM-׵W'ՀFANx' hy&7k C|1u\j .J'a  v<~|XMj#ٶ-'$1. )o !hY|u,Ys%^}ɫؼyL, &x9xG0x%=?K}{GN &ud NntRkֳ~IǥXߌ7ghS6t۶Up|ݺ?Oi[fg'C W!H|~_oS eS:Psx{8q2Z s9.-읊6is1Ν!La{:DyKmCORgr)eKƢ/۟]಑#uҶn]Ojc`+WekY(=7)nDbmp Ğ\>dfVmX~2Y]ݺ#Mڴd7EC!`'D+3[wW%K/.׳&UMOOCa܇xϔp`A4>FbgpVĞ)t J`EEUG[fӦ$[+VZ }/Bh[7>WiNRAי^Pc}mڴZF~Rp+rx+֙ wE-o"aUގXc|_\zĞqۑS ,PH]HLfB?WR)zxxず׮}1t jhdm`5qYڴulҒŨkE[?COC" x[x$lGs{oKo'Vr߂|hlv]qq4BĒqChMtzgx H[3֑I"yhFd[avT$^=bgyG# rI7W*h"| c|6.F<'ܭRjm.QqJZ*R~tZ*zX9y㟇cg#Ph%":vKa.,W;bNJJsDzm;0o`h{u35yF*eE9.Ui%pDmOC|wwk mH=wni59=zT(/W^&{͒޽ ^oqR!R -<$ZeW-x\> Si"D6cG2ʻ\J=ʼnZB5E׌3{w&jmK<(>BTx9~Np'<7~ҐH(1]j.5U}?a nLԏ"vLv)A=H \r=܊ uψ.ؽu_%"۾2+Δ%dEݻXj8J0V6rR|4xL;?=o?*H'M/!b{?Z={A͚o ,]k\.bt=|anQHo?>5~=5" Q#^ߌ7LC|b~+H}L\)Ӣ Fy0m[*5i˖ܱ#!As^oԒ Zn@^B@*OUǔ IƥQ=7ᒦmAe>ޕ'C^^I̟[@o1w ҇j[^Di}7Qz<ߟEƿ +u-$xm<3~]ը1uk}m-ᎶZibKAU^N~R:tp ,ao<"Q'xµKqi>xb6Z3`@%w4衎̓ȭjUkQ_4tPEmhu[ث~6 E.9c4ISp5xj1si;t역[Z3=Zo5kWct&"MS( <ƥbeH+*ސXB Rtu~XR--Ib=,MigTZ9Zs|Mkgjar|4Ps=@Nj@h6ϊ%T 35 &5ODh(?'x &B|E57&\Fl>+Oå{p`JIzhvB%D/HRoy&CU"W)B"W\njffkT4n}iSTtc.ի[Æ9T a ܃ }o9wݓ'4Wƫ7A#5_Anv2a c5.s#w1qbt~f_;f|-!;LY:]VҒ%ku F19Yx}?t&`>K{Cmۚ b>>p-ǯ8p\}P7kҏlۖ,15/.ZΝƎVXw]>UflҘG<Rze69&̄'ԃI}a 5tky>-ZP=:{ߦ?vV&h/M$F ~x z+]PxƟB.D&b!'%\e.>ѨфWњ%zug2ڸQK=>g׍/MBhZK7UFDy߁Z'둾x*0ABBOt=A8NܹZ134wL{K%iU~688dԩZH]3NH 'v9k=>;+d*(VOP*\سv jށ8{*-^zO)Z2@;kӦ>qi/m>kWݺ͛k%0uX4];Zi"vCZ׳~Jԟ]@ q$uKJچ}kakjqڵ-Dy@Őx!8!"^ B A“|n˗` S׭VdԞZ"An=ҥ!fEm4Y3vatI_W5--((l,ۑ_7r?K9"gxDpRis.O왌KM`^p;Δi-ח-ӰXhuqPψޖiL %iџ qi'xO#"jៈFʠ>"7is4u6mSMWƋoLnQKI:!?n٢|{%<|7x.$cqnL9ٍ ,\Ğ%_\CիZ-3fKAFXhƍժU5=US|/¥;8?R MX`6@ dd[O-p|/0/v ^/֍0U5^n?^jB }w?M[&77M0:5OK&{%8g0HT/Ps.OiK\+qjvq̚հv _]MV>Dw¥x5U^xhioH!W OWwyI݇'ji)M|܄&MJ4 ٯZCQgLiɝ:i6D2 Z /ncHBs堀9/x㓈 iM$j g>3'dR@hV B>y t'J76 EFkOMkպ}i,D¥?#Ő W ߂\?=U O;JƨѸ̓⬫]fMEL݃3gV,t!]7rP`tt;gO"\dFP3>D\d)jeֽdi qH]>EyywP7UF MH/Nfg`>Tc RW8]nOkdvVCΧ_m3A\$"m֝ԩ>꒮OHC4zpKF٭7d?QD (#H IDpޞ/Ö-(2Q(ל=Fm׬͐) BO s`\wW] 6CcB q>ǥ=5\ X0!sH'"T#JOi"8Pv]񍲪Ts{P׳$vD%&<%,x A8{o|G`3dcHy !ڀ'܈KZ<<έ\y`dz RKj@x^9Z&cْ߬޽/.~a_nȠx-Y]7> #?o| #"|ǐT@ĞR҂k>Yo7!K{رƃ>" AG(&+r>FB2[BkD ;̅jxV>BbdpT!"Zݦkz3Ң"mr'!Vݜ̓+Kj]$Ȓs"'=iB$j !)3?7 ĞytͦMoXܹwOH/ZJےum@Lՠ106ȽS[a$Uù~XAbdIOHUo81kX/3f\XZ+8X˒_@r'OF.䮐7( 8 ^Z¼ם;ozIfڪWLա􅱰6հ9 ߀o=.=o ,l@ܮGgʴQ'wXWJюZl0M Ԏږ?ޓ<Β ̋#Uy㍿i@$j yg .݉xbO..ǵhJJ_ӯ+.ZX(?_d4iҢvHL0a7r+)rlKyyO!O!!Jc$vG"< i- Рsf jY u٫^ UT,^O7@:g7'd%WH2OO\z(!Ox ?- m93|uӻvҪUzrr"F0Մ"(}ȻbOLqIb"x !m^鄧m۪O,Xp͘1 zRwy |, v`5KbY)>o<oCB|&yG}%Dkqm$z{>B-c=T@[@AjKAZo߻Im3HpJ`r< ֓o!VC4,:2a,<@bj':S+FK/^S3粑#guﮍ3teԔ 6Kb{IHʬ?\V]OR7"yD,=TťyqW1vrzIȬYMkp5KmjC[`1lEE3??K`i]3g^;6ÒOVX͒SRܒ <,!U,q x0Jƿjup x@=RWZu" F0 B{a lGGJrVg%D@=SbҵxzIze|% pQEa_;(n¥=ʆf F\#w&r9 v~y^TO" cgH|#r94'Exd,9^~-{LԪٿYE?p ~K++3O?qsdo_ED4X? ~D\ <'$V5ha ̃p܋<o߆髿OqN!)3^?EvC;h ⥺99Y=vq⋃q۟(6rС;wnأ–-#WWuZ4x"Dyp'pC=taL #H}okn25 )c n=܂t$~ʄ:&dڠR=.\@R8կ^}X%>qKؾ=\+ ?ɒ8^o{.>o ՉDMH-qU$z{^%a/ 5O=wƟ@je~l\⪦Nx{9A#?6 ?QEmڬ8I^_tY7S`~MF%brlrOnx?l"Q!6'SJB#`& F^B>G!fz#ͰYatD+Jfd+ VxCvCc4NxHo?ڳ5kzEeCNܹ]^^zZ߱ODsItDOy_SZ?0b_ACQ7x+'U 3Rwd~A.|ߏq yy a|hDoȃdcuȗH6IAsSܷVp ={>()ۆ ر>ҧos}^6&4Q׉:P"oXѱ^=T}xO㍯0O(rtx㍯8ҊHXBhȾx?" G5H)&@h $L/吋j+ x#FYDAxսG>}mZ74pd3/S\lJM[0TK톯tO~vXoaS٦~'?b(yhӍ?Ob5.̴8kTys td 9h$Z+ Z9mZlmMsَ7vXoZĦG0yÆۻw-5YzȆ,_N:imM'zـlmylԒ_/dvl`o0!Qp'?e拏I~_F&p  _'?;_&q8@Jaa7Fq1S^<"^QGô~q$M]F|N[b?a OohŅV;ulȿY,)ͣ&bH׮s饅o/SONc,Efl6 @# ]xm^_1o+ޮ3Ds%ȴ_$_i'D{e;ʖ[q b TV2ù&Jaò}"X,rӻC-?} .?W_]R<_SN!{t֪iS%mrYgfdaH3.kDR1抣D_'ّ|nYQ1pIFz喇<Ӣx^(~N+kDΓv"N'$6e/T$.ߒg#rU c"klyZ5?nAi4c*),AIFfGCõYgYSSfI'}9׉%C<kIs 0e qE7#'ďBU2q=Ɓ}f &` 3 E`^.ol jڴxYAϙEeS9لq-b=S<_^r!Du ),t=\-"OfL~_b<7b  9->L 2CLf%63;q8{}Xl]!GD̵bxyW2HhqO4j3FmMʆP ?7vB =7n\@+gm&9ᄫF.K.dV>vl{P,c,zI|%Xhr`"~'?k6 ϋgb\HWyL&p'0!t$jhOFp$s)7y)@,}n\<'a,Z޵ r:픙L២1c1N@g.s|+NV2AJOǎosΦd,>]~Mx>dOd3*ASc6\#qϦL9O%Қ߈eDQ%T9R1 V\Y`~8X"$ŸVm7$bN/$6dD~5.OX+R',vŕ\Be'XKc(KbMX)6S"G}P٦%`g|U/~z.~U͚e{Cꪒώ-ϞO&\Zr"bh+'{񒨂Z~OB16 ~WЁ[D?ynQM7bx?s&cGY$jَ]x*~/y"ߊ2C8.1Ti-VʻZ+S颯b4=~'x AoA׶mU l ;[m[Cc]CNz3ZD1h(('?kEt!LwUE'9xY<,8F]i"?Z:1}8I\.ng?2=$wo) "@#/rèUfv:HI7eHe(yJ#K)٠,B6eUr+:u:yȐ,sA6 BΞrL*DiKN1[UpFG2ԟ&O.(\Q5' q<ΊT;Mq)aIoZ,͞)LuLT=$xD\́Y޵iN2Ӌ, ie^:LgZљPS̞]8F-S>Uӧg;GdGٳy&*AVqrgg*_y+/+_{3FjRS!-fc[1r2:+3+(O~+׉D;y؋uњje}拇o 1dV~M؆ُc9g wbh?H+c8- ߰2ӔøWL(+-8wؔxLimF6_q[İ9ۑqO 9\DuSvy:+Ƨ"ɷ9؏53 Qx̌1N, Sp:G2Y$ZН!a"2G&UX#6&1&OOhޥg({pX-6=[D+ъyEU;vyUMoƌgO;mȑ#m]36o~FPRUʙgIt1r҂),_,CkffI('"W=xV'~@OQxilCxe8_?L$҅8qLJnA""dC'.2ӑxN4`e 2_b\-*3Hx -}{aN]ڴQ úwh}8qW4lK|9'b1Z9:U\-Z|gN123ɷ 1WDOXa2 xE<&(f 8LwO"Fpgp)3O<-/Dzl~oFDgZ1Xi'V5bq t">xJYF*-[>6qbܐ xdv_>tmU!}C뻘=۷W"}6'w fr2?}J ~<)~t#OV6Bp"RW\f"ԉ[MI /mmVd$.O::?!1iRLA(3øI|%a{x]L2#\1V<*Q%϶MVj" &t?=1-X1m'm9GlIEj͕Wf(?>bU_|Dyh%_'#)=,_!z*V˩T_%fR~f,4qǰ/;ЉDgWF1sJyI,+Ig/߈qRaZ2O(J}O+'J/a{}1<)4jo4jkj5g3y'޶u듇 „lUpי3_41c8},qC=ɓNھm[%29_%'-V/-<{lp6"LY;ߚ¦уy'qDRC'c9i,O-}&?{Ĺ ӏQ*VW[\L'8\#z)B/o8Y%@4zugoʨuъCDգG6mX}ʷq{:aݲM>ֹ(Z~JQ>rR$_^H{mmBogVyET0?&(6as S5w\}&2%`;#Gbc+JYq ;+39*8Bq6\-yJP2Y.~+Z*=ZclRԲ6oܸ.<9&ٳkO YM(9lٕDaVLaK&L&L?&L4Dߓ(X+D>?˹\4(F31Q2J~9]UIjؙS DlN,v1ef8hPB}ԉ,gŗ4Z5mz1l5KX!/{t6_;19ꮼSOӧeӦJ'~,첣 S_!VY'沭ēTSr'>&C1OY,CB1LEORjٖAϱtqŻb)$R<..lˡ\)&U'qTf0MOm?ŭb2ЌyMlf/JD]i _l̈́r;.w{췗]1{v`C͆Y FePz:,+D/oTԿ'_.XwDr1\Ns`@Pm9Ӹ#Vo[){pw~9ϊREن3Ocn?)tT:s|˻K-5rQ4.{>kVlKK&[zpg9QeG6sǞy`?Ǘ\m]DZ0Kԉw#'-RQ52qMLp2_~t?[";OUxIT*'ԖAKz;c\-n*բ)؇V*LwX![^Eٔ$fAL X-syI&nQ,Gyf7%s4KĢwn:{?_6ڴQom|N;>v업kVű+81{x![(%eُ63QmcǶiL‚ǎ3Z9Dwy"_<]@⊟Ek99EO?H ]ؙdf[yP2O~WĵK%{sSQ(E-@Bٛ[׍zZ-)5e*o#))֊y8dIΘma#`veʾp酏]TǑ~̶ȶӿn6TNP"NԱ~\lVN󒨦=C;kO~ z$3~bbC-t7L߉Jşy#QeFqxZC,!_$b2CinuF4X(JF<.Rth qݔvEJf4L4f7w&O6̶PϴnwQG}>u"IGu͇#(=PMJ1CcLlf<}_"?$_63O~ {I7R'inʡE\#O5"_S* ӞQ\&+Q))䫜[-hN2ПX&ʹ*kw_m/YictH>t < ^s|6ѵm[Oߎ>o'\0R%U"c Sh.'gVsh-cXDyىt|k 27NH'3q"!-\,?_%bk'xWa'[,>5;rh ^/Σ2Е|!b1V[d4 _\|qeGw^{I?搽P7vX*W&Dzx1md'"zN,=yPG7omGY%78Ob9bh'g.`oZ0=EV->3]̫bKiop$5P$VQ?DgQ%d8OiDL9͙xَO8i={oաYÆ=qߌ19 9+  ̥NTSX&MeSmFmĢ$?ɿO=x^='?_.׈tWaZ/آ_Вq<&Vo!?@~|QdXYR٣}W<1]pu:_YƁ}C}[FS/z 9iTe(Qot|S?_LFNx'Nfw09[xSaKoĭ-~>@G.cQ߬4a=Ʊ;j-eeUI'^}:vTtkC=ᄺ+R3ߩXLVNƳ*^ GxSA-\qN-L)?jLt?ORWq8mT QCCsefGb D);2W, hDN-U-6m-wiGM~َl_}{f̘llY!٢_tNcދY/Q254LMOG9$c6O~_g?9ٞۨ>O~_'Vq ;*I-rUVYtRf<[P(yB4|y?(Ή|C?/z(ݶ߾j2 י3:F6ڴ9er2DǑ/aq1Vٞ#)Db̴bO:7K1$)w 3̩Dm֬gSo=wءUӦꙚlYG3yrs6w(`2}arҎYbUK(Dǿb&IЈ\(`h+'DzHl'x@_9{KQee[|8moſi򎥐,Y} V۴jOFUd3)ϝvEcm[8x߱ɓNھm[%2o/'Lb1U-L&B]Ugo뾿ᶙeT7\R3ɯzCq/3*Loq/Ux@M3ef-~b4(]m|(ꩼK6Lcٞ;aJct~K/,nm_ǣ>jР6͚뒊|aWnJX~+\Nư^0gEU1^~&ַ,XwO~v:3ɯ&xV(0m؟)'EAhPva2b{h4N2+8 kΜW<ҵD4&סi,X׊cSVTi#||}?,[-4Hh=ZLm&t/D0BxAC:>Sbi7v{2}[lւITt(!Sh> ph%m4s ۄW u7?,zj7dy7?}G->=nxk>^Ik5tYhA-Zo뿭ZUB}UpB) C?Nҡn]JI}xH&̃(!?5x*܏Qןp zn>E Y*Lěo*S,xrDJSX | nU5W_=ի{S+"QJFDH#!(/}A^o/V|aooǨ-PcWT Lk N: 4zBP1==us2\Awu.kբ4P(QǍ^K. [}eEaqo~mh8gX|̯ J|?GӠ 1MifMɿ? e/ڷ/g4#u^/dbt`S(PQ|?43( \>_ѳ6 )I t,ʆBW>W h; h:Ac-32m5dOvnv6yr)% = P.J+=wH?.6!['dIaj#1GqF"t%TgpX[I'y_RD\@|z &C |j ׶kȰaMߡM#5v={z&nGRN8×3^h [Ob#|C*tY#1`Q;<6 NL) 3OTo#></ ߨy]uƌWߢ?~6ĉ VԂ <(QϗCv3Jd .6 [o'\-cQ? xdFhLS/Q.<^ ) PTSG/M'R8x*t@3h 47gfС#F>s^?Mr?vJ)Ix#G ukϡZx? z|M4X?>HhT0A}1p4ʄQAgVoB9KT=B5kvt|;`̧{O X #5a:,O^{'3m`<<ߢ|aB/ԁ`'*{0T(+06&qW:uz=OxĽDx$qḦ́TJv8 > O9<:|o@H{X,ϲ@24 35*}"5?n4*Kkx7!ʛ{OhT7T|s^9s\bp8H nI 9(/􀯓f}RFs= 7hG]`yO[#'nnTMZ?8bD9($FO@|؁V2QJ1]< {uGA/\8MbE_ <AW*HOA}l4J|鐎`*|}`ԇka%چNBypK;؏]ĎuE6R42UogAQp3@ɶ>\ړ(DߢUd7_0^+} <.;`!|ͷyh+ZCѨZݺ4r~ i7o- Ua:G- %~5.[ͧ0l QB替u#mcdy&7z̀ i!(cqtS~tDoiR9g@h !hR_5Ђ狿W^fӉ>pD }4@&“h*AO‡htjԸGso:bPٳ/k҄?C<U !%RC^ѢE ?$oLH pBg]A;OPͷ'?up,P0*`315kNѣ.\?81k2RS>a=J}(.EO;RGoohYdy?` ʂZLMȂ`=: cМRSFxCCkJ͇T}|E!PXG u'jպWnآE̘҆ѭAO]xog\8jaxl}3"7(~Eד7ͨi!3@~B=?Inp'~1RV# Q6*/aG)C=\E^ !PhD?zMIڵ[n9yE+!,VZ2xpZJ Q& = 5`؍os~!T]T' ~Bg{0B|!\3t O&R:?_,"Ҵ_{ Jy,/T{94'mԹOwnj9xq#PiYLP.g4@bϷoPO^Fv>-d\w $# }? /]pY硯Ch4g2/̀y" 62F,-z{P Eeu#`-ghh[wj߾{6uލ/+W?E"(Q4R:1G`PX|"\LR|C Cg:}>n6oEi.ʫ?o#JbD~C\@=ezt֡~ұ^]ѸqK[K E~(s"25T/ox-.@^EnCR$7+GZ }Vu `!@yMD۟yD~I 7EtQ]aJXYA@pt_2~|^h\֣o}e*8=P_7W_P!QfP]<2~˳|yttTD&SG(@A\ L=Mp M`\XYg eA|CR f~„K⧓'7^h wxa< d>>5_¤Z@wAdyz'h1j3a(,Aq.RhNNB7ş(>E[Rõ&T!@K C&!{Æsbĉ˖]j~=2Y~>NE![̧KYt|Ϳ݀GZ,H|zL:eD5 h-@h 0/KC8yE52.o|:,p?bFԳQs%7Oth8ŇUM:zH*";_J߈W-Oa{a76GZ{zͅPi7Z9:F |F"E~Ӓ67 hexCv?6|in:nxtB4 O@>J㛋VLp)o+4}!|g"o~!zA=<Ϡ/h4g2r o(}QTLԀW~nE'C1yȀ^0^C9yp+zMa<<PAp4$fAH!Ȅp%mBKX|i>|y=FH3| 4{&lyWTL+ oYj>F9pYJl(6䠆pA3[q Jeau[|+墠iq ]HFC$݇LΠQx Ysᯇ?5|p# kP.$p>'a ZF@=| !::C!+˿.vouȄ0C4xG*^Ȃ|4&\\ ."7Ϡ;i ɧegR3(c~=.5&AcA::Ыh2$id8^;PW@GEdyO=Ӣ2#7,#;|`3ua,Mv>F P:$N|,idG CSOoM/*t%: (5i0N@9q<<'|sPo@!/mh'ZBk|&zxb{h6 p "Vĥ xJFCPY*: uDg-?I;$Cϣxʽ?߂i>ap io'?*W?޽6 W@E| p D/d@\Xda5.@W+\d#ϡ/-zF_ց X@ch$%dq. YRg4~o^QO<B4E7B|\m|O IPӖVGdp1 j no==D%C',Hn\/iA/QC<vXw2=!i`Dg替>Ѥ1VÅVDoPxb_0[\l>/L_:q4څ?O `'ZBUʍGɐ[!^; 7,.Aw,-oh!d$EaZA|\ad'|ʛpD^"Ηxŏs3-CͰyh%*L Q2+/TP>Ai>pr|\|7?#U`:ޟ| =nNBg Ϣ]OGK$RFCJ|N^ x Ysr7/P/< @s>@ `0TgXOPW;ޟ1n %vPw{T^1/eRL7(44ڌQ jf?O"|q^_^D H?؉CߠGhT0^C9ȗ,'bj0XDyP}!~nxn>tw(1z[֡+y}s ^CI4/Te(žO`y3aZt|7$Zp`_$D3rgM ڎ@l7߱PuGQi PbqC:<5:[m:\kaE`:agP/ ?_7YS%?m|ρ[H%XKag*ljq y~k"b* |(1?ve"؀_o#^h !_V\<,OqO8^ooG v0Gߡ|W$} ,r?Hilt|脋:=C 1h^Hp,OpYS,KeԈ&d}h=:8>Nb!^{|߃ :X(y$=p%qG3"otW(ײ t J;^?@ &#7v\< %zhoԗX }a:B8>Nb<3k4=^C+tl~xY[-uk'WQ} v"3>;p0<'v_T*jLn+/Oq}xqQ)%~R _BpBezAev#;^E4wAx< xYs+[ w7|h DaQi>N<w'4?'Q⚹y>q%Joi-AWZZXwx - 01.\<,O q7=PR I=: I8>Nb<7pѯ4ُ:L運/Q NY6(7} /tϐn\<۟+9W_7Ԃm@GQ2i>N<w..,e53!|z -_Y)&ڋ8sеx2A`yſ#?zKqoq,O\M{p}| Oـ.'~O/\||40zf_ցg.0Vx:؃,`b-<ͧ ?ĕo.dyB/QP{q}v7 >J|q775?C56\u^oFB 1b <ͧXT|#*dƏo򌥟 Q?H"xh0K%c-Pҡ4C )u. ڝ73 M AEJo\| v_*e*@X*<cBXQ@1*.V#|.!.7|;b'؆- dyOoW{0|M򌥏w4.Rg|B wb Ϗ`Q1y.Q"cL\,Ga zoq򌥏 w;QpfT.7?eRL7^T5't^OYX,O/p[o~8 xNɬC1݃mbx7?}D7B}/p /TYH|̟%`y V7oŋ(nP#HF"9:[?i>(\%H*xfNoCĉ͇:*`?$Fpx|N `,8$^y( p,O)-6-7Z%Ḟ'_ƛ@0A;ߏ".M@|7WxMoP(i qYs?aNj?+Pǻ#L[q{8xOh!L/{%UGMdŜ%+`ƜsfP1(&ssN  V~^ow]=G nB{3*?OVڏ}Уp6mA_V2t"M=mٿE OT0ʖo~JZ~@'jB~?QR2C=-n)]0P')JoWz[~pX["')O/Cܧ} Vo~~0!g΂&'J!~梓`0 4=.ES`z9 G_ݠkoDЌr"Z hNRC~u9">S6?L/%"к:f!`i:ϡ{DiN0Q LSAjߓO"گm+t~[!~~GӠ"E>SrI!߾}!œhߢmi É0}kЛ*4dl D%J -} xl?k1:kf*}R Z֡欿 -,mN9 e7u=iJD }'c5O'Z2"\x-Ey&a!J_?Q>0΄PJe0= sP5?ط %A'`SX_~[nŸCJ}~&z,'iܿ;jվ} œ bT8GMγΥZA{DiCgD(\ob< `~_b,Eӈ]a"\uhrR@S8~Cط5">u/_|F9{P=nCkPKz$Fdh!:Np:܇>G,kYby"c~<QT_6"/)ֵo~q0CGug?XR3ʌ'J 듄!p8LG*TYGBmh~}2˳u_v[xiTVo}O0J} ?Tq"qnH9o0|\(O&O/\E"AkS4(c>" 0uWur^D+!0@3B~O_s6OUr۷f?(fOQwb(<3U>Qr?y\1ڏtQ+~kJDP_ðo\aycVoJi~Auw֘0{B@6yVBWs T>Qr(e~`7Ё AԴO/C 3,DgЎ+{?LQk 0gOp8'_` ,E+ga&@I Tח}O S-CǾ[aNiY| Ps6B8bb "䟋s"y%D}AHo8 >{81ܾ0Ch}f4QACy۟I}6+B-IrD E? 5"J ShpZNp<֠l{DAC__C9B$Ip?Z Ob,K9}"Li"MEC=HFf#=k0G@-QrO~鿏Ά4_B?"o~RGCh}`8F_SqАjoCOJPȒEM=IH/0!c"JW!t[pSt+:v t^wa_EQ"(rϪͻ(0>C'1Tط4>eC?GF5۟z5_Ϳu!vPcE|/F oh1}_QM9۷_ OjC`&1~BoJC@ig!ƑK~ 0|/Dj켈oE0~?w"ozD!> hZ!o?>h8ܧ}JVJyh:L2: e~=1PO H{Xj켈ogڏ.T_s!'s6z6j@iӛ?T˾ٕ >p'҇~?]H̎)8NX 9ߌ ΋( 8گ&)wB۷1.Gɕ0F?}Jۿ*ܧ}\j޷߈AIF'5N_Q^?Dj(oq گnР"o\b\BS:X V/1T˾;+ ܧ},FY_YmKbvP6WfN/#g΋(CPݯ1@EoĘ2dȐ={Ց-`WQsG!o.Dc}'| v|Хw O%(c2j򼈒c^ߣֻ_xbFEoq O1qva-իW}}=R;9 %z^]i>7DR$1;j~_y%!l z# ĸ9}.Z(˘4iҎ;8t>}k׎l byٷ4 >%FdD-נsdt^~9%\DPMQr"1ۯt>4hpEFPhDN;4|}oߞLHOACeD}v+ '1{RF$b,@5y^DlDGP͸+<ꩊې,ob<'4Dˈ#סCR#i?JۿHpS"4ðo5:D2z#ME("ʗ(sa:r~3 $:zs+rEO!(>Q&7]wuȑ ر#-J~V4x^ߋsOݎ\%}]$`XZ0m6>*TO&ϋ(o78RoJ_@göPGg} O-n6zvԉf-J۟s8OoPa D'T;5} ´Z=zb܋" +z MK>\3w%(>Q&4{ǖ[nw҅&M JۿO`Qz¾&$85?]>0=Vϫ+1.,E=1Q'J3= RT~ߞoBh}LNcnVni׮]lJQe0˾h3Fc<1Cf(~Kc[@&rdjN4!eh:ƀHQo+bJ< qƍ[4[nDI b|R=/!~'žJ ?59x/b ~p))aT(FF6;QaKf#Z((Iٌ_4˾ʃi/2t ^BMcb,@Hh}+T~CTY>o =NɿQosb|AC~*7yٷ">SY+KbNU%$CyT 1A:4W #LN&IcG:FR"7b,F%~|KۗݸW䋔 1[}&%y9h}>s9r@XR248ex~< lKPo1~ #{ذa;I 9hʃ˾ai ?5IW'$.}VE![a*׿Q9(.Cz Sx -Am@Sa8Yvi_ ƍP>JPh}}5j!Q? i}#~kk ڋČju<1fQcb u8>`e:%Fefܿ=4YhotI0i; *jI}j|''0ܹ&l2f̘qC_ھ4aWFT>h,'%oi,ԍdϸ?3Qc(Z4*oDQS;u2ӠݏN-r.\Ϣ(1n@߾FD4ݻom݄ 4$g b|}air;~ٷd4l #N#t}^s%'Ah٨*=aYvyT}s+ ۿ}Qy,-D]]]^N;5DIPb|R=/ >} FoԙdtPrO#( 糈0D? 騙3#U1@M7^t &k:npIp!Q`~9"L7O k׮_~#Gm4$g1>Fi} >Ec7BbvO,#U(rT> Ɨ(PWe 5!@k_/_9<p z nlb\ {^"2;vx㍷jcǶܠ!A?ÉJ_O܈"ko:t-H2: Ԉ߯q >]T>d;hgvp(<@]FR ݍAy eeZpTo[DY3ѵkAm6:%i?É!Jfop 5F%}-%1}n@8qxa&Lb:î0@3Vt:'".t$lBtpz{nACA˾aCdetud=z 2dv(Q3Ҡ!o1D)>X}-E$ F׵0@&WyAa j?st':6&k:x֠ {1F=/?DU+ZNdG}}}>}.T3hHb|R=/G ܧ}yJ5[mIb&w}ވsd:">P>G"aעɍp{79dMWq?*To0c /Fw#?ѡC%i?# {?'JS.ط$;܋x3aN/@DEs21AYsԓ৿2t;: 5]a\^(~'ƕ~o D)ЍI1C}O"Li3E`~ h86,D! *>ʷ0cye8k |nC@ ע7ZT~.$kK0AKY^C]4ʃ˾a&Oc?цطj}ޅs d5!>B}j<`3e4܊V6~!܊~dMw Go\HˡkĘiYO3a4XR=/テ>B4g㿂gp%P.}Eq(`pZQp)uCt :5pz+|oߟv}X؄I+bz^?]i>X1 W>@9rɿ/rdbtPyLs;ї?C[ЁЛ?>/&e@2ϧh&z T4z^?3ܧ}÷p<޾Ѧ$XH Q!>AD6Q-aK s7?4 ?c/܄E y 1.EoJ%:I4hHҠ}ڧ|D7[o?{7t4Oc0{A.GT(>?C]1Qy:t& F4}֠zoD'YhjD5%ĸ ߾;aBϢsa"iJۏƁOo?/I4LMn 2 _Q6}.E Aٟ. =Țp@u oLDPC$LSHgJTks0c}ڧw/CH xp?#yߕ8Qyh/Bfo@ްYK 5KLCa۷"P_C$ͳ 1ކTk >=uG}H d? yQ <AVn?n@S;Y["EP_s."t= tmJu;O4^ 1[kyf;1NT,R9 q8 R~z ]ndM?8nE0Ba۷_8j")1D׾a7p)ZE|DQ߾{PQ*TKf EDue|2@j~AokdJC61yU46}Jz-Dpo_yАb~_Fܧ}Jǵ ۷EbF;fyf@B-Gtt2;J_^GנIЅ, y]|(l~zT]AIߞT۷4> D/(olԍdåT|+ԑ _&/: :Qcaj~^GW ЙG3J <(l~O! ԖفoTطJAOh Rӷok4ČQkKD !Pƒh1f#l؂L(~^AWЉ;Uu6}'cjHPyۯ|'ri }ס3hנzf䞿B óh1Z6|h ΅Wj c)w/P+޷?sP[g'bRc0;OÌ+/9څV0}@i:A͢+Sg$/]:0Cnaz@A?ș  k%z]vc9 s(i~MPK SyАjテ}'t_i~v$f7fDN􂻑_/8\x.ݠY3{ѷ(ڏ΂o21@m]2J5}o l>D& - ']`jE] @tK`9ÅEKÅ!pEߡkDiP%s-+1^BoMD}'n/[mEb&Uw-"hDɂp.9;z];C{f((~ gBQ۷_mʃTط"̶>/|'*[GhAA=i-܅V6_ANЎW?oD9 ߾m6jFQyҠ}':P2m4L%HE>HK2B =΃.{T~ Ca۷?xǾwaiMW3A$'@9 ߾N4pDg<1Ao"hp =&}5?a9*Baa< -CԿaNo? wQ3OTط"(pznQ_.ط_K03^@EE?Gi0m,xj Lbo%"É0}Zu?* Rc0#}'>n~>$tXr̿ 1A!t*"k`;8Gп0bo9"eFi?HPyfOcK۷_3^Cy߁|=z #Țz΅'r+"IP/Cd`[8F+Pg1Dio}ڧwԵ߾{Q!8VBQ}_@Sa8Yvs)4oN+D[۟zRϟ#i䱿E'P= |^x(f~AȔ7LGS^x ǾaO_9߾o83CBe-N!dM.gJoCy3Tط ">a&a,dVQ6۷݌:p Zο?1B7t< c\C+~lD㠘f_h:6!S6`e^xT˾O+Bݧ}"_Դcas#JԴ߁s,2}o5Yt+:)[I Z'J-%۰oZt=H2:tԀR1 oW.t c\^BPk~|p 3}!Œ*_)2NGѯ(~&yٷ4l>%.`߾v$fW8bF>߸ 5`,\^FQ׾ʃBoD1tMtȎ:΃g逸٧Ҡ!oJiueWOطo ']VyN"L*@B/ _B9߾7a欿.=vK+h5jN?yٷ_v>eFك}Hx`S16|o6:1\WWj~ۏboUDBg6PGvtIp-z54hHҠ}g]Z:+F@=ws&1Gm>E0jeߏ}sabo%D]!<4Al¿(?6yٷ4l >cР"[)5?Ϲĸ BB+Lkh ʵ+߾aBy9(JTokDM}IPr#1}KUhdyy.B?B3!Џ{MA9߾a&@yAw#`)Aߕ}ab۟[iPGGFl[j?3ܧ}֕ԯ+dDa߾*Ц$H%s"Ъl@ ?"kz>p#uk[4 oC0CAoPw ɟy(ڷ4i?En#Y>o~U8DB(Q#œ .dMOn+C~C9߾a_GЎ|_SG~>PD`d}@I UVDUـ}Y El6yZ1۷oG`kPTkb4OT\2H۷ogtϣj֟s,t'Bo8fk@~>ۯ=?>h8߾;aVߟdN܇Rݯ}KaIX"2H۷oԇĜ+P|90G@i@oFdM8nF ??׼ "́P^iު݋A½(ܧ}J۷: WQdeͽ5-tɚ~p0D ??ےo򠡘۟s~fà?-ƽ)cRD>S>۟z ٰ*0Mxw\E{B< mCgW|s(f~gTq ==hH5}?"iŧo1ڋČQj az]&CW?oW3,f~oD9j70 ]H=( =}ڧ|8`%طo;P7QjDw5z]&Bf Oo o0ӠWhHUAo'D>Mʼ|߾}_q$f ,BV{fhP*MdpF!?ۏ#+a΅9.ĸǾa6i`E[ܷ߀nFIF{ E{ fghr4:5‘p'c~#0_L2D s1BoYAOĈ\-۷os >B+K24:5h}߾}aYLEĸ~&Ɲ)c~|ܧ}O|7Pw=H2:™D/KK1p75{~#}0~ڶmk۶m۶mۘ"?y={LMRL%5SuOQ}ng=R9hx?{GGP9>^DC; x>gS`MY 6$(`cH\E*uwǚj)ęHړ;dFQu}VC}[A* goRg6O=nnn5%V YϠ/)DFRuV;&(ζ`En!K6S~ցO+rd ˽LW'-f) ĉP v{쳞^ \A4}Hק c>uk}2^_Xn p q=1}G g=~_ROFqF}$z}W 7+Ap#Q>zV^_W~ruA}I'w2^_Xe%8&~"az1lYORhx?UG@PQ`zIW8pCLԼO^8AqI* R 3SO~Q1LX*Bؿ^E lYOߕT&kx?DGGDP`o|d=^GK*Jؿ^ߥIlYO߉T#ρŹ(N SO~&K ӞGDaz0Af`HAD*w~2Aq2O=Ei3޿{a&p$ʳD9T.X?z}ɋV?7xg^_+M0-XGv!(`zIJ*w~*q2}wڔElj?4ا~Ryhx? GGlKL#?qOM,z^8} ׉s\~e( >E"?[^gHeCO}=*6~'׏^1'%L"SO+9Z0z*Rn#'S_7O4I6_HM .#Q>ᙡ]Ώ(z^ߋAeM8#&_T>&ϑr,׏'D慧 _q}nz^W\Np%9aCKg_G֏^5:% |Ag_M?S^z}1Yq}VWD9TΟ~)]> ewDAz}T1\B|J[~vRG4c sv~\o7(>iO/[^W:Áp? aI/K*gGX;19 9דGg[^(l goS|Jy}T& xR9|?ĉhO =3?$-^zřFQEo/`|O*gP"k}(z^8_A4eU8&>_>O 3[?$DփS_ʓ!^7 _W;\TѰ\J|B|y"NފabNJaaECwz^AqV2,q<AYWAqƂ}D*zD0ش2>g{>^A7baHk緙723'Ir*ϻ{P"3}δSҷz^8@EKl "sp5(Aq=ĿREևӈWɄ'YdE'A@l@,F'O.^ugy|!;FSE=zKХ>n<=YщDѿQrȻ^;wz^!Y<#drTHxEjghl?ۈє0϶{=cz^?$҃:oȮ&v"`+p߿IP>ӃBO[ ד޹b*Yx^gYBH @FY\?g-3IhZ?bkJdQxy=ӡl[rwuz^Yjuw{bTueb8}8hT?e) {>;;ye^ACm=bKCv#% \?C%(Ά`g'+:ӏ!bJd/Hfz Fnɺz^gx Tpx~OghH?s`WSU^AR][k`(. #\oU%9y??vDg WZ+^$tLLB -ȂAH:"(6`&+: w?/U)U >Uzr"[z^kӃ%`<߈}ũ""1 ?Aqvo=\[z^Oqپ8e-8'H>M{zp ǫE r@bߟ8{w%yky-ٲ(+Qa1Jb '^333;Y,Yt;K=K=zg©}vUFsGvWa U+Bu>4 7/ ;Ȁԯ3wis]Ca?]z~HS,G\ILOy%dZtU:'pݯaiWã~3uz^t4:ar?EL>/&7MdT ~4Ct+ɋhb?)-!z^PAK7)E GÇ_ȓd%]~%:a_H&!z=[I,(z^:/>ԣ_Eq>9^Er|$(.?$_)կ#Av ߍz~0\A r8B?2)'Sۯ4 xbd/!zo/*} caz^U+jWp   K`@ 2b?|jkhҙ!z^+ B_ȇ#x |D `P_o4 l?4`#CO& z^_NQ?h,O 28u=q;hio~Sǥez^/'Tg. l$')rLm>LΟ緄|~2w b?)!*؀{^+P/ɑ0~d'8~J!Sr.%qwi~ua z^ szr5?Z"Cq{Bu>S| IXG{=k:叆z^_E%gn#x3|b#i~.(ȷkb?SFYz~  wlqF]'?)A5~꧍ǕDrz^ׯ!TgG̯&aOp)YK&~\D 2$ GO'\bX^9hؕ~dG8~L&Y˥'Bu> SX B~꧙YbX^94x}Br EQlCo.W LUM[t??`tz^9soc~5r=F2D]?h{i]"b?ճ즲+z^'Tgϙo''#8XE1n.&>߿s='i^b?S^P?z~:;5"7fLP G=YH)~z{z^ׯ'TS??B~C0YB&RV יVd6 %H~{&v.3,^zzBmNKZ 7k(E&RϾ+:>ԣ_O>O'sx=ݣhSz^H@{$e_JN>/eS22z.P /%A~gzS ^ktͰx^ z:OV=#Ͳ&X+} ֣U4[2S.DIw^!lk§_d5_K.!}PF&xEab A{%; udS.z^?$l8 ~M[Gq0\?uy7hh& „3 ~Cff?zz=}Ӳ{Fzy&5i?dH*YL?t]cwz^?C@y!;YJ֯@]Q7G|."S=]z^\Jq vӁ=OC]6y.Ea; 4pz$ҙez^|:=s }@N`s 9)vA~[z,/~Y3-^ ~G &3 F<|}l+dz?7iLՈiz^ׯ'W^;vb(N0p}z9„3Aa?zƈtK?0c^ȏ;afD.&kL~:ˆ$TPhz}sA^WyJ373z^_NA>Bn;?KAu^#~kAy;.z^=ir ̥̃R2Ftw=F^GmGSt;z^<<xo{)?k yY?hx'߶ב Gr=zz'w$zNz^&%of,\N'Մo4owd6 r*l$Y^;~(/TL/z^Kə0v+L/'T0 o:„3΢zz=c+z^ד`/Mr;~~;q=CAn#U^uFWvx^ɏ;afD.&k(9F fxnx xLb=z-`j^zrX@GǟOAuc?$T0sC֣=u(z^o ג"Th1*Bu3? g6Q^^z^?L~Nٴ)'YEsω3?4K:R=z<^3^z~9fG8~I!U Bu>#~^3af>oh^Oz^Co zzlO?a2gM0s y aXCZ_׳޸u)z^"o0v>gP| F~0sCR0=҇z=_(z^^\@q<,̂wOOPOKb YC!d\JS^g˷ FJ+;lzx^[7!}Kz3BuN #|-:oiߟGk}ozs(/tz^O?c`.f|$Kߪ:q?_G`zZbHXAz=ӈOz^_K.%i7x;C|F߄q~Gf F>ׯ)P\Gz^3IGYf#Oi/RoPoלF̆ߓA_ӥcg]z^u_i=gɈtHAu^ ~i:2 zw%=z^Z9fn'|L~LΏsHA0{/هy=H̃Ku?z=c+z^'h7ŀdĻh~nϾp?颞hS^z~m on/z_ȈtFAuk(XA1KӫWO)z^10v3>%ϑϱ0m~4D29l z=X4f\1z^kɥ3;oɔ(rfw0<9&Cz=S=z^IG YrybJ0r>1 ~&oA^ay^zCşMz^/%gy]8'u ^d Nxb^g/{ y B |z==fxx^zCY(z.wPW”kh~2m^jQz^Ʌ",x7ܿ"_E]%#u?:9Vz=TN銝z^Q|BWSNQɈy=@a E|Lݓkz^gXK3KˣyԿxd8LE)-z^ \Jq ٝd#AACKSZVP^z~;w[C )"Tezn"hwód?/^Oy٦)_Qz^AS#)~s&ى,YG%z^_Gf !G ڮn '3gztz]J {^z~=ŵT8ZL?FKz. si2^{եņ{^z!sr0̦,Od%g / M~LfT|IQw[Ud> r 3y?z6 Ř3Lz^oկ"eYn1b4Lb=$; _'g^O]QcE߼^z^+&Y _)֑S&SM g^-ņz^zS ǒy8Kή _Jq0 RzV=)K+Lz^?ŏȻ`fդPwQI,'MWyƜ*+< z^!(N>Bn8E{xF'K|Pz}򥈊Bz^R\K8Z*LֿѰ L$aOM׏K,]tz^a6f!,s 2)/:;DG.'x^OWtztKz^<%d!f6?'SlO ՙ!hA ^g7&iz^(J^C9N(֓v̧A3qcLgz^?F~C9QrR2WRjgd&7H~z=hKZ֥z^xXD)_IΎ]C s< zʋ߯(z^4 &Y _:r=)l(y Imz-]z^3?Er,K3ȳdU~0Ki^g 6}+Cz^ׯBvt=rjBufH|#^g̩Ģt\z^zN=Vn^E]v15?H3~v^SQ=fVz^kL؁ n ^gK]5ҁ^z^ϓ+>/l*&xLVzu];iz^z}G]0vS@U=K,!k$ޯ^׳2NՔBz^o_JN>BJUG.wI_^{4VW,(z^uZSLrjypElrtY^z^?i!a6zn Abz}K ?})g^z^oɯ R,! ϩzzP|Bz^׷o 8֯Ez^zc&G&uSX^3fPE^z^ׯd zL#*z^zVMFcb zz+֗Gz^z$ǒ!SX^K;`Vz^kȥ?v 5o ȜǶ{&V`fY?l}z?WSx~7=0]b];ZZ6}O}O< Yy>pK'eJ->ϩ<ϧ9A><'큨><Qڻwvyy> Yy> Qܥ|}h(J߱cwu,Yxyl4g$D!ϳ/҉8vnG?VzyyO <7cu{tpK9Q@wt;-n=<<ϧzl<ěq" E[F1y Sl4gdRO*ry )&V=<<_L l<7 +O7 EM<1C=<<_8jA>y'([|b⪫n4K.U?<<ħ8A><'GQ+FFK2x(yS ŻNg$> ޮȿgO>~yysu7|{wg& bĦ'9s6s׬M=u͚--[Wڿ4<<<|R~U9YhL^Y_ly2}6u,Y]yyy$D4˿燲h4d'.\dyyy@4~8+Nhl{ĞsOFyyy>"kgtbJwƬu7X*d<<<'UmKhǿoz Xw'#<<< F, '|5l yyyOڎ%jY6M, '|7Tcs穟=<<|t1pwA=5|[RDdyyy(@L^`F <@1q'<<<h5HyY,85 W϶m{=*>CGOA209!HLU '5kP$f}71 p:Kk >"+r'Ӗz?@ D>[ՆRX´jL5s}jv#ㅤ!h '+J  -[T6:=\AbP Η7mHݴV}'Ms+ko`6޸ `mX惑(`iS ]i;Xffff23333[fnW̌14W߉H+N6h4 V v3#l㼍ښ6q9$,p1oz*x[VPKWffoۖzָF (C+xGC/GcpBK ϯG-w: WdoV'>uHI1AR&M<Z:țc'ļ1"q` H' 78QD>7ƭN)(#?LcB۲>$ZS?L߱Z@y@FgxׯfwS9K&0k"ަmOȅt-H"kW^q=b%oTԃ7[ÕB 0CAY/#YUTRsmjo(C~xo Հd [駄+BzN|~sgξ g82q?o-PSUP E>Fdtsez:?5Ǎ5N|l L"駃ZC(8B_Z&j+lZgƱax|phvEI|0}4|;S>*nG 7#G7 f|J<0E[$sQ^/f EyA?Q#`z #\Q):!4akk:wrZĉnڄ &=~-GWHCB$~PkM8Ƀ{x;3}BuW^i^pff$Ν67ҰQ޶maq *S_xrD3>TA:N]|fK9lI o-5!+19N^!(tCe&ì=v82%ޕ^z&?H_za$K1@EBeepH ?3}& qE5/ES-Srʩ(a{]OFӐ>UEs35,9oTa/}Tn/Ҍf|JI AORMR /+xN ] W~͵:2u?ƛHqd"?.r.ءyϽMGDK,d?t>T>TGu?HkĈ.};1\'<ݰ F6 ~DGn/']F3>T 1KbKWs o-5-TX" S| pXՃax?~8A%ǬǟfGGtMiSCxl <,FKشsΣd<3*L#T~>RfE\n5:p#frpiң&L27iuF3>=9-[~DC+xK]S+Q < כȣ ]2> ֘8ڻPHV]ǟri#zUJBhX00Ӈ:A{L, 96ylW%E}QcL/t=d5w!$n>h&CO< i7p<Es07CGn"~g40CAN/,w#o(C~xo <]pEpuCh&neL "TUC&cHD1 XL2Ї(rAxY_%Km1БF_H|C tc:aHfnbFq3 ܤ_ x)T,C ޥ)7W:6\ 3`zwQ:IS:A{3aPe40ֶ]TG};[gOF \bg]]n}KkC|c9f=58e*&n7R E?)7Ir~!,>'?p;wj %D@"W Qk }'6!<0{F+]Æ;~[#1蛪f>y@F<885- ڴtY6*ٴ\9STzo&U$XtCbK'!AiҌ o-ZXhuLdW< sWoC'>tCwD~G&'MA> JS0P|f̤@Sh*LOҺ\Z_0Na=eoP_T1IOΒ%s '_&SbdR.=7Ia 8QcHߐ^[B!5 ]Hh0w03C:>}g;21ѥ of-xgҌYnHy9ϬN蔇s%|XBt]1V|I~?߈FzM#t b~іNCtX|{iƭ7!?2B"8VW~xϩtf֧UfdLJTI+V #~_}M9xȧ{ݜPYfυ}ûnڥ]xQ]ڤ[׈If]~o$D:<))757)P{" o-5AHW]LJȔ8eJCy=v[ӪbL=3&Vdu D3odiMxyl#ѺS>7!~ ߽4r|0:J5ڤ)72/ڌhƐa7W \!?S:azɧ〝H?>$fݬNuHL ^s^X~M)+٣v7:ޥ[℉瞟q]h$ |嗙އ]\8M;sŕYO<ւ ?Eք 'J;8)yW3>N<KhEr2ƹKzP,*B!$SR2MEx#WqS*n|* 2 T>"LQ#S;W2>0*| .r nkզ&= >G|Wl! ޽9>G9" dfQnEO I!d_d~~78ڢɳ._εbK/ 7!?Ih&eWJ'į7iL>:2顿wƐ;d9 w=< '- SzBn6mƢ/qO>g υ?J( =NJXT za{zqt~O^p꣓5ϟ5nѽI\):{ɍ[ܷCq8aS8OYo(C~xo>!Fj_WN^oM7sNL^DRFl%?#Y׸c+ȉ4c&xy~6@C:$''r_+w}4-ؿޱs}6ybfå7=]c ?7;WsAq" 2\mAXeu7fUI7!?ԄK""?4uBh5q ao ݴ9go5Nw4kNʙg=˖!Uߋ?w腄UڞvhH%q˝Nڮϔ3"a_n=Hֶ}or5 .l:5瞧i3ִfy5a_7$(!f6|D&0eƇ_FPL\oyZawQɯ.8sQr-Mf|ɼ?HI@(= I0|C+xKm +xnwc'-L/Lv{Β%H.? (ڽ51<ɣyeE^!wk&d$YX*}A**^N'p:.RqupI_Xc b]4(xs34f/8ps3>A@~q : $g&uUߐ^[BBDRDX:A? S9ϻf j^<2o'sG <yvz mFI3f|`qA\eEkʴ4 ZXk%y\* ܛ~ THښ`ÇS=~z4sțo(5b.f|I ًC1<)7w3C6bSF۴#qkB#P RtoIQ:AS̛ڟy}SO\yšol(4H1L`_5 sd}l; a(Sp)re233s.e1cx>-(?.w~]*710% cg){7yngje`P/L:o7|zOWD?+—\%[Iʳ6=v)1 ,:F\[ɾnj5Dj3ru"U|\뤌J$w1rh,xSО[tOv>8_G ʫ&Da _}"~C U4f\73>)!?>^_|I'Oqcs~oXd7Ź|*TtvM.åYǯd[?g-\V4GSݍ'ðr}yj>D׿hswm 7 hSԦZ>/iPRɧ1'=>a2LJx9D':ycU{"@ϗ}wlZV m>4\| |zw{_# R`Ex4;"O$eBܨ_(Г}%>%RM6ӢMԞaAQQG gFOEoǿCECK&H)nj gYS9zdĻkG et_l{, C*+CS1&ymצM|p_PhaX̩x>x-?9?CEC?-W$nC׿3r=E Rl|Ɏę}h&k`-Z$Ѡþ:H y6^w=H-+Q e,h|"ڼ&amnM|@_ f'ogoAs3gx>x񱊆5OC!%xFZyZNȋcꦾtz) yrln-s:~%]=݃5]h*Gb yJ ?B,">gM|ڜ`Ym*T?:ugF7g|* P* ?+>N|Ph]uđzyuw!/_>vm_K HV|3 &#AǯckGĂV4hk$ϪHvFN,3Wǧdm8mhqm_\ >`EZ>/Lm[RTe~x#3>Ǝ=>$VI^f)ls,˺rW|KԍSRu=bZc3W15dM4(s5g{R$[|H̽kOD{/y:>`P-HmmH`^ox#Ƨ O_Z'upQ.OT:oⳟC/3z|Xr!?kۇڏrj>)pǗSoLR=~F,yWdm|=أM|4ڿ jSզZ>/(9>Bo7>m~d{ b%9 ȓ>2u@e;~3.4{>==lwtB&Ps)\ |V4(/쒉FA'+|ȣh(jh_jSԦZ>/hiq`otaÙF7k|dFC!-銀Z'$ W)yG&*zTo'4SsY)?sl"O%_59jG)iBSO @V0 R=ﲛxhCW|C zX}Ѭ<#S[9^uu(cMh=7\yRp%_C^SroJK9ǯ=_KJ4d >x?ъ0"Ȁ *+S$Xx=H\Ӥs3N/ϒO;S72&b:~cQɇ5!\x-|NHVO VxaW9^bQ&_s2lTr(/؇ok}.>W~;2VX$N,϶WIifZ?yXy>6MM+7ԦTG|z=o&"F{OE2('0|NH.h jN/bzDΑRFzל<쳼wo{ᅾrJZ't f%wtgj՞jn?ڴ6u|Њ|(_P%ywW4x8xh#/έ]eZ<2n;zo7ɮ\yY0WAʯ}?< k '/̙-D3>*z.>XݤXawɮjWgGaPwV*[|H,h?⏦V=*ڴۏVAm&uM|X_ ?_ x#}Ƨ2$G?b }eer|I ɶgs.*Kvˁi_|F6|/+$b;yàg}2L~w+VѠx1/h_Ѡv[G6 )vL4(Tȇ'louTECf>!㍀*vYľ2{E`WWer_NӍ7Ut-<˙=pQW/_*Acz&|]|]ۼ|Y?+V eA!/h[o`Aզ~iaOPmu"F{Osk*Mg4 ^ 94PnEӦ&OrkuϿk޿GMvwgȃЊl,Z̶oYrz&|]#5[)j5؇S~k֨"ag4SM&7<Ѡ&#V >6 u"F{OeLQDq/x!g]_wy$Y}RJ6|ڛ,zBQɇ5+d$md4s5EMޮ :;aSpXh0'6|@mNtFCf>!㍀mXCDH4DCʓr!/}!/#תZz#ʆOرdMݯgqj>I>͘Ƈ@6^w}塇ozre y;GS't|@mٷ4cgO8mj{_!07|uB~Eq7hDC+;k?i|ҥꋺGbS&ީ:PRF5nל}!Cmh #c$ |WZN<|{T $5z -!>'P{GJ1c%eJ|]}ѡnr t?h6Y0,oI6DÆy6ŋ/XѠ&P '6u|Xm{:ox| >E\އ~|N\ϝoЖRFSQPmz˜'Oҥy Z~d=ES9s[I Aɇro︓D?; RL4/nb{ 4`/ ;{jSܛj'2!o茆ȷ}|Nl~ VmPOXox넎6Rȇ x|(:O>+-['rML9" F_4eO^ >y,@I_`=~qQ/ui:4_mgNGS;GS;M|شFz['t|XmC{^o x|GZ'"ߋO`xiYyn2{C-=rϿcN3gpԃ8Xϵ45A͇5C3P2lfS&|b{;Ѯ~;&|ش+kSLJN4(W4鋯hu?>࣭&Bxܔ'&3ny{mO3Uk˧sLszR:~5ȵ}ǔq'3t| _{ xV4ڴwVAmpF6hu?>SќD=3rVLy}Or?o$uYk˧v&j}Y|ϨWsKᘱLK_+t|Ì~ͺa_0H;{&t|@m;}Nx>ax|U4<||RpX߼.W},omM@dfF|%23x-==ַr)h߁+hAF|̆AP:>6!?: x|91_|:ďLtB,.SMH`@vv_duu hϤaE~)soos߻~s0Ѡ5/=G|Ex4[ez+t|н ?hpox|H<ohEyn2+*z$u¿ꈣ:>[/NͶN~fNlz~IoaGg4GS; &t|@mڭVvԦM|@_`o !07|*cEMDt >oucO?o~-/|Q'/Um-~38BZ|z~Y寰[`@uM<8__bF=jS)2F7|*#47Fo'&|^Tw/'Lj'OUifܧ;p[hqʕ8W5 д-<h u|Ì~-~DMX>60zSt|$Z>/⍏"S2v\>9%O<畫1UQ!l7gbxu§la2R'3^~sj0oiߋM%V4ټ~Z'xGS^igO@mTʇmy?>S*"Ԓ5>moQyn2 #AS?ʂ`#=e2 SpoR\sj~7~_yXuMLJ/3>>PNa1igO@mvoy?>SkX|[Ny#fnTˮ߳t)W5K鋘~):0%[mMDAfڍ+i#^>i#+{t|н D։o>%@D?>-['rM|>>-]0ﺻ`Xz)lAw*6g~47蘆U_]jT %@)cϸ(SLMyӌ3h+K M\ W4x8x[x7hAy~r-Zw{&Uއ-~G)j35?zlEK9jKnupŕ.AwIy2HEo'h/oeb{^|,igO@mTˇ -O< OEq:3ޮu" IOW-D_qqŗMGwݙx-< njKss_Wrl||m;ufɓ>+x̷Nڴw6 M>E)8hD7 :1F 9*OMz0gH9 d ?E3fkq'ԝsn`JJ4.Ï>{ q\'wPåX'tp <~DnDM~M\ N_|EC7, u"?v )OMW]'2ӫ**$r/ʵL&;U KWyyWl{Nx8_z}>hڈM}=jS-UG+!xB"޾!I}z^is,Zl(Qm/Wu\8~|]z?aAV7tRS2A8te 7wk>I< _)l6[h ͒9su|@mjGPvo7BSќD0;(ѐdݤO@W7sԘ%K|GWʇo8r_vR"zŬV fK'3hASLh;{&|XmC{@: x#ǧhVhyxߞ`(e:yG1?o?'/8 q &R-9p:y+҉; &|Xm/Xz㵩jS-u"F{O}UD?~7hAynҷ-n60Ǔ^Jy=LR.y _^'h0ÿr_FJSo|kj_vF}>&)e['fPѠM|@_`k['BaoԲh!CB"??.ѐ= l˳`$i"RS#=bowR|_<'_~ngDMR>64'6|Xm+}N< gFOeLQL"[N61kh}W'b5KxDCnɓu>o[,]:,2V)ʳdm:x#o瞂c?ćzà\&'z u3vz >6y{kcgO0  l'BaoȌGqD~kMy>?oIbYc-<@9EaoձXn8yXNee:y;6 <46 MbNjsOxY># W7u"'} W\9,Z{{k?䙞2M^e߉Tw9bV>IPU'gG?*?Q_(9 |b{3W0OMB4`gO@mjTȇO4vd7㍀ZADI-s]DuC>'4Y:|]~O9͓Cp2fL!hj__op]G=e[oܻ^~o+je_ͳK_[>5-_\V>dp~Kwر,dly |QG#7| yfPlღ#6 6A!FOE!"xF M!㇣|ٮ'K1tv6pD6"h_Thg嗌>ԊCgX9r=,ŗ .oȺo-9/}ɒ 31)"sO\[;Xlkߏ6 MVj7p ]oԲhxE/ x9(OMkΞsNiӦ+2^*]˿e5:=%nk7{AGyCf]%5\vy˳K[7^Ԧ~A V4 pOUQoDnu^>m"Ο\NYW^9cWx9.jC|ƛ_zY_qIDׯ~_r6|löN o0ZoTMG:mį7uBզZ>/(=>ze[1#1KNA1ޗN#Yb2ioSNKօi#K~k|m۶m۶mlD{nyyةN*̬_u~pcY3?x :;bFγ6Uo*)sdeoOI; '&; ݁[oS  ƬB;Fsx<ξfըBx5x<O oE+O{<?EQԙ_+WړSY_< ^(x[NQ F{r*x!ѽ6 g  Ө=QEQX"pk:pbx<'o¦{}E* x<oKpU]U\jʶ'&3?wG#I@ucϬg_o*p R_(uys4'rco5<<<Fr<<<<_ Gyyy'Ev,?<<<<8yyyy<<<|г%<<<<7?-<<<12yyyywnyyyy5nQ0<<<Eyyyzq}Nyyyyy;hq(xyyyo4]yyyywyyyy"0yyy'§<<<<ϫq<<<3<<<<?TxyyyOA<<<o'n<<<<_/F#<<<<4w<<<[4(^ox<exI x<h2(6_vR4(^ox<ex <89$z<wZ4أf=d擙yVIj}vѠvx|;+&XBS+x<^wU4أv}哙~WE1h O<v4Lxdh=|jvUhPx<> y3 K'=l jGZ4'WM:ܸox<^w]4أ醲YWQ/d}x<>NM8 ,ۢa/ɧzmFaw4>{<ǎxD8 {Eחm!dmTx|E|xڢAS>x<oHD΋o` 3i9/d}x<>AM>x<oHD΋{4u|++h`}x<>΢AA>x<o\ix</K*:}m>k<[4>Uy<sѠ&<7/0 #h ;ZZHѠga,4 0QPxǟ0LFBTx|E|x< ð!]%Pq];a0  0 y+^`!' \t1E0 Eap| z1E=N=I>=? h`}x<>AS>x<o&d;=)"|J_RۢAzMx ^h< x!/X4yԢAzexQVxMgp>ݟ.hвx<>AY>x<o{BxQECϷ&O =ONѠvx|E|xJ+䯟3=oKzņWmm&nʫ,Lт g+鸿 {cBRᦛW^pɥm2P/h`=(xοv4Yx<oB?VrB= ЗJŝOzٽ>iEyVwWT$|Ƀ^W]o44 ;xOK[bROk~;ІFrk<%ネk wNoӹ煼{6$|N v4POȾlYx6 8qN<3ff~w3y擕T[M_nխnH|*Dg, iA@ÏC-ܝkJiwɦOfw>Y0F#mic:\r~4屿c|e^|Ew҆:ɓ'[tBcTu?Eʒk4?ȾmO<vt4Y'(Ο;w~ؾ27>h~|C g?' hECkɓwgȓ'O<_i9M'khGw?P_4#¿zIs]姞_7ސ}_`r| !%ʹ{x^o`Wɓ7_43Pg}OC)w k4ٓh?ó?v_j K^c3!`+̎oP?n 3{.Fɓ $&OF8OhLٻFPu_aE"M|R&wR`V4Fn|+O@X{+6_'OnEɓ'cm4|x ~G VYh޾aUk+/M=>?hLk}IIh0>AL Z X99h"߆!h0:%`- ɓ'0JÏyɓ7a4y4(x Qr6xE}kwsɓ'O[ѐ89u%qgXҾ&KFvD;:3fs~ュ݄3 h)~j j4p~'O|xa 5O C}|1״ߣ6zҟ=,+'FwE'O =i6mO>Yy%y+w̞`'a'ZOh0kMdEN7' 2>T “'O޽`3*|Γ'OQA~sɢwV)7gB7a<4o4(WQ2JW`U\xJd:=&ޜqk@y/փ7@Olc>zFɓOn4$yɓ z:^~s*WvpohP,o.XchG`W^IW\փ7[P|*`ɓ'o1ɓ'oA~>rhgg^orF}Quܖ_sTzFCSO_iBݽkpEͰJbM@=`Gn4 ˍ-=$N\Pj4F{=Gp 0uzFɓelwNkC+jsA9 `l|  48'Ob]D/j~ጆj1ߪo@Uk4Hגf.pUwFh0ߠFC h*`ɓ'oڅQkbyɓV4ѐT E/[zwQß4oٌѐ3ox@6O =pt M&B{x[ (#i!D>ɓ'Ot"|Ql` <}f땻_Tx!Y 2-s܄N+h{N?9ښxv2DmӃuzP*hDW4lPk4p~Oo(hP;g7KUHFLDW4H>7xP6+)# ɓ'X:JQɓ's}OH${/ަy{.aɞ5`N>{77so/n4ӃjU4_2z 3rg&t7 |MKJv'z ɓ'Or$x+&yBOmC_xO^'v3 9ƛZ8j4Un+w\s˭i_9+@+g['V ɓ'O޲V yW4ЃflpP*o~~)k~G ŽocJ*s] Ѓh0?h0׾gVN@F.>VDi|Md}#Cx O wxb74r,ozh{;@o*49r =:\\t"`5y[-hgӂ{4kBn~|U6'xy&>Xpbp̏o=zNl&O|"(e~|ŇKGc|j56_'O";y^l>+>FswOf Ϙ%[W}vtnwV+5 F^Z`~|2:=~MRI@Ѡh|M=6_'Oٲ Ea1D>Gf^ˤa|kӟQFNOPFpH!雮vDkɓd#h;yW4֓9aR՛V O"Ϛ6õ~|Em:?J}܇l.{|"7TW4ߚV? NP8~ӧi/FCzZwL9wvǓ=\{4۷Kt`@^ CeuLn[z`|h 'A(T7?O+$Ò.5456_'OhH$q)ȓ'OG/p@lex| ˤGm'?K@]| GCkɓAv:cɓ'c։WR3zl1#Օ5qJF} r?P__s{12使dE.PA⢋0u*\10(=' [ƍz %bvNh|MLoBOhLl+6_'Oe#OaM@lECkɓ?Խ Oɓ'Oz 8=YYioomjO  =-27) M@Go4ќѠSs&07F =h*ɓ'o "O O@hECkɓ~K!V 1Oȓ'Oy$`6FZOAh`H~Jz  z=7D[[eIEm<}_Vҟ'`mg ґG*3v3Hɓ'o%< )ln3*ȓ'Oޗ<~WǍo'hP)6P_Z*Y"U=Rfߖ|xM{Ah):kpt^iM@]=`CZѠ058'O5..?!O&6RWWk4_|EqTUU)y &gϝ/0=j"|O3G'C6s`<F$sĚ;L[ﳦpփ3Jt0Np~O<ތ?^VpPrkB;Rh0Px@* 4рiiXԴ!y[ctV'p+yɓ@8ɓ'OxY^t7ޜZrnpXʭ۞~{$w'伸ZV(ɖݟ|"8&sniWy՛v#%`C0`E6:WR< υĬyyyyv4b<<<<_30Qyyyy_řyyyy+&[oyyyy>yyyyk ]?5xyyyΖ<<<g37<<<<_]" ţyyyy~%Pyyyyba<<<yyyy|%<<<yyyy|Kyyyy~;kc1 yyyyyyyt<<<<< ]>\q$<< myyyyWb]Lyyyy~󵠈%yyyy/__kyyyy|-><<<<.溂yyyy~yyy|"Z*xyyy}}5zE<<<%t yyy_op yyyy_|]yyy<|yyyy~?#52<<<Ayyyy+(r<<<<|-b,*.<<<]g<<<<IENDB`PK3SnOZѼ OEBPS/package.opfKn09ŀBe7hc ͦ;IlGIʏ#=Y)ZtQt%j GQuGR R7҇:L25~CKaܸ.Oؚ@3)PYKt{"UtnJ Yz-n{%e)vE^P2 Cuy 4)['{֕t&'[:};C`iC_8ؼ rQeEzuCŮc+6̡ri=#CeW&{hD_%PeO׫/ܕ%h%϶RWyśŏo߾]cfwPёE^oc߼~$9uB%e!K8]ݭddžvR'V/bA%g:3SIQ%*39sd|Wf P'bRU%`#!L*$Ȥj|걁\LJ $N?YfԲ%՗1Ms?,2fYIF)I☞yBՇ^# v{1)K+ʠˍM"۳}BX.YգzI$URgH:LNS[0mSHkʦ=h{(YXlC]hJJ=-,S7.._S*$ee.,r$5E2u<9TE".P7E~'I/u0c|+wYn_9dL`HrAv~xO*ABOi,-eNJ*ST2{VDC79@ͼX&|ЭE )SWUl4$ڶ8ϱ'9Y>0"7:.Rքuneb/.I)ӿ:,#6$x D,3eql;LPjt;DgtJTZJ׆Oh!@$08+Y) *E I'6i8mY!1o}'YMڶ2"]oA^pK k4:wIc _XaGKХ&]MDq$ f%05u"V,'Ce Mqڝw3ȧW&# B3ou6V^oX;Z/Y7ztD ^6^Bcv6n^9ur!sОJ1R{hkH dE%…aAc ͫ(ShbÎ%Alv0#Hvq^fdb9Kc0H pF@ \&c6TșHj$H!>Ë#MmJH~jĖsaPh g(Ц o[SzO ݆7>O 82 0'((<>D +G Ph4΀n &G>.,|I/N}hM>u0azڦM tlP(quWiSNG:צ$_|mJikSM_|m:_}mJ32i<{ӡN:ytNCoҼu:o'u;>$sO⇔?qRKl#I Yxwe;n&ӽv̆{#u*Ubw<}R9|gQ([ҿ+NرPǖk ýPm$c?|?M#ECB M}{4Wk7ќ~z"Ì|xn񇯜1bY7Y5Ќ> }'69 -Zh@K(hґ %v.$ PPD Compiler Driver Information File Reference

PPD Compiler Driver Information File Reference

The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by ppdc(1) or the corresponding driver interface program drv(1). The source file format is plain ASCII text that can be edited using your favorite text editor.

Directives may be placed anywhere on a line and are followed by zero or more values.

Comments are supported using the C (/* ... */) and C++ (// ...) comment mechanisms.

Directives that accept expressions look for sequences of the form:

NAME
Evaluates to 1 if NAME is defined, otherwise 0.
number
Evaluates to the specified integer; the number can be preceded by a leading sign (+/-) followed by a decimal number (1234), octal number (01234), or hexadecimal number (0x1234) using the same rules as C and C++.
(NAME NAME ... number number ...)
Evaluates to the bitwise OR of each named #define constant or number.
(NAME == OTHERNAME)
(NAME == number)
Evaluates to 1 if NAME is equal to the other named constant or number, otherwise 0.
(NAME != OTHERNAME)
(NAME != number)
Evaluates to 1 if NAME is not equal to the other named constant or number, otherwise 0.
(NAME < OTHERNAME)
(NAME < number)
Evaluates to 1 if NAME is less than to the other named constant or number, otherwise 0.
(NAME <= OTHERNAME)
(NAME <= number)
Evaluates to 1 if NAME is less than or equal to the other named constant or number, otherwise 0.
(NAME > OTHERNAME)
(NAME > number)
Evaluates to 1 if NAME is greater than to the other named constant or number, otherwise 0.
(NAME >= OTHERNAME)
(NAME >= number)
Evaluates to 1 if NAME is greater than or equal to the other named constant or number, otherwise 0.

Printer driver information can be grouped and shared using curly braces ({ ... }); PPD files are written when a close brace or end-of-file is seen and a PCFileName directive has been defined.

#define

Syntax

#define name expression

Examples

#define FOO 100
#define BAR "Bar, Inc."

Description

The #define directive assigns a value to a name which can be later referenced using $name. The name is case-insensitive and can be any sequence of letters, numbers, and the underscore. The value can be any valid expression.

Predefined Names

The following #define names are set by the PPD compiler:

  • CUPS_VERSION - The full CUPS version string, e.g. "1.4.0"
  • CUPS_VERSION_MAJOR - The major version number, e.g. "1"
  • CUPS_VERSION_MINOR - The minor version number, e.g. "4"
  • CUPS_VERSION_PATCH - The patch version number, e.g. "0"
  • PLATFORM_NAME - The operating system name used by the current system as reported by "uname" ("Windows" on Microsoft Windows)
  • PLATFORM_ARCH - The processor architecture used by the current system as reported by "uname -m" ("X86" or "X64" on Microsoft Windows)

See Also

#include

#elif

Syntax

#elif expression

Examples

#if HAVE_FOO
...
#elif (HAVE_BAR >= 999)
...
#else
...
#endif

Description

The #elif directive allows portions of a driver information file to be used conditionally. #elif directives must appear after a corresponding #if directive.

See Also

#else, #endif, #if

#else

Syntax

#else

Examples

#if HAVE_FOO
...
#elif (HAVE_BAR >= 999)
...
#else
...
#endif

Description

The #else directive allows portions of a driver information file to be used conditionally when the corresponding #if and #elif expressions are non-zero.

See Also

#elif, #endif, #if

#endif

Syntax

#endif

Examples

#if HAVE_FOO
...
#elif (HAVE_BAR >= 999)
...
#else
...
#endif

Description

The #endif directive ends a conditional block of a driver information file. It must appear after all of the #if, #elif, and #else directives for the current conditional block.

See Also

#elif, #else, #if

#font

Syntax

#font name encoding "version" charset status

Examples

#font Courier Standard "(1.05)" Standard ROM
#font Symbol Special "(001.005)" Special ROM
#font Barcode-Foo Special "(1.0)" Special Disk
#font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM

Description

The #font directive defines a "base font" for all printer drivers. The name is the PostScript font name.

The encoding is the default encoding of the font, usually Standard, Expert, or Special, as defined in the Adobe PPD file specification.

The version is the PostScript string definition that corresponds to the font version number.

The charset defines the available characters in the font, usually Standard or Special, as defined in the Adobe PPD file specification.

The status is the installation status of the font and must be either the word ROM or Disk.

Base fonts differ from fonts defined using the Font directive in that they are not automatically associated with all drivers - you must use the special Font * directive to include them in a driver.

Currently the #font directive is used mainly for defining the standard raster fonts in the <font.defs> include file.

See Also

#include, Font

#if

Syntax

#if name or expression

Examples

#if HAVE_FOO
...
#elif (HAVE_BAR >= 999)
...
#else
...
#endif

Description

The #if directive allows portions of a driver information file to be used conditionally. When followed by a name, the data that follows is used only when the name is defined, otherwise the data is ignored. #if directives can be nested up to 100 times.

See Also

#elif, #else, #endif

#include

Syntax

#include <filename>
#include "filename"

Examples

#include <font.defs>
#include "myfile.h"

Description

The #include directive reads the named driver information file. If the filename is included inside angle brackets (<filename>), then the PPD compiler will look for the file in all of the include directories it knows about. Otherwise, the file is opened in the current directory relative to the current driver information file, and if that fails then it looks in the include directories for the file.

The #include directive can be nested to as many files as are allowed by the host operating system, typically at least 100 files.

See Also

#define, #font, #media

#media

Syntax

#media name width length
#media "name/text" width length

Examples

#media "Letter/Letter - 8.5x11in" 8.5in 11in
#media "A4/A4 - 210x297mm" 210mm 297mm
#media "w936h1368/Super B/A3 - 13x19in" 936 1368
#media Photo 4in 6in

Description

The #media directive defines a named media size for inclusion in a driver. The name with optional user text defines the name for the media size and is used with the MediaSize directive to associate the media size with the driver. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58). The user text, if supplied, may not exceed 80 bytes in length.

The width and length define the dimensions of the media. Each number is optionally followed by one of the following unit suffixes:

  • cm - centimeters
  • ft - feet
  • in - inches
  • m - meters
  • mm - millimeters
  • pt - points (72 points = 1 inch)

Points are assumed if no units are specified.

See Also

#include, CustomMedia, MediaSize

#po

Syntax

#po locale filename

Examples

#po es "es.po"
#po fr_CA "mydriver-fr_CA.po"

Description

The #po directive defines a message catalog to use for the given POSIX language abbreviation. Multiple #po directives can be specified to list multiple catalogs. The filename can be an absolute path or relative to the driver information file. GNU gettext and macOS .strings files are supported.

Attribute

Syntax

Attribute name "" value
Attribute name keyword value
Attribute name "keyword/text" value

Examples

Attribute cupsInkChannels "" 1
Attribute cupsAllDither 600dpi "1.0"
Attribute fooProfile "Photo/Photographic Profile" "photopro.icc"

Description

The Attribute directive creates a PPD attribute. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

The selector can be the empty string ("") or text of up to 80 bytes.

The value is any string or number; the string may contain multiple lines, however no one line may exceed 255 bytes.

See Also

LocAttribute

Choice

Syntax

Choice name "code"
Choice "name/text" "code"

Examples

Choice None "<</MediaType (None)>>setpagedevice"
Choice "False/No" "<</cupsCompression 0>>setpagedevice"

Description

The Choice directive adds a single choice to the current option. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The code is any string and may contain multiple lines, however no one line may exceed 255 bytes.

See Also

ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

ColorDevice

Syntax

ColorDevice boolean-value

Examples

ColorDevice no
ColorDevice yes

Description

The ColorDevice directive tells the application if the printer supports color. It is typically used in conjunction with the ColorModel directive to provide color printing support.

See Also

ColorModel

DeprecatedColorModel

Syntax

ColorModel name colorspace colororder compression
ColorModel "name/text" colorspace colororder compression

Examples

ColorModel Gray/Grayscale w chunky 0
ColorModel RGB/Color rgb chunky 0
ColorModel CMYK cmyk chunky 0

Description

The ColorModel directive is a convenience directive which creates a ColorModel option and choice for the current printer driver. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The colorspace argument is one of the standard colorspace keywords defined later in this appendix in the section titled, "Colorspace Keywords".

The colororder argument is one of the standard color order keywords defined later in this appendix in the section titled, "Color Order Keywords".

The compression argument is any number and is assigned to the cupsCompression attribute in the PostScript page device dictionary.

See Also

Choice, ColorDevice, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

DeprecatedColorProfile

Syntax

ColorProfile resolution/mediatype gamma density matrix

Examples

ColorProfile -/- 1.7 1.0
     1.0    0.0    0.0
     0.0    1.0    0.0
     0.0    0.0    1.0

ColorProfile 360dpi/- 1.6 1.0
     1.0   -0.05  -0.3
    -0.35   1.0   -0.15
    -0.095 -0.238  0.95

ColorProfile 720dpi/Special 1.5 1.0
     1.0    0.0   -0.38
    -0.4    1.0    0.0
     0.0   -0.38   0.9

Description

The ColorProfile directive defines a CMY transform-based color profile. The resolution and mediatype arguments specify the Resolution and MediaType choices which use the profile; the hyphen (-) is used to specify that any resolution or mediatype can be used with the profile.

The gamma argument specifies the gamma correction to apply to the color values (P = pg) and is a real number greater than 0. Values larger than 1 cause a general lightening of the print while values smaller than 1 cause a general darkening of the print. A value of 1 disables gamma correction.

The density argument specifies the linear density correction to apply to the color values (P = d * pg) and is a real number greater than 0 and less than or equal to 1. A value 1 of disables density correction while lower values produce proportionately lighter output.

The matrix argument specifies a 3x3 linear transformation matrix in row-major order. The matrix is applied only to the CMY component of a RGB to CMYK transformation and is not used when printing in grayscale or CMYK mode unless the printer only supports printing with 3 colors.

See Also

SimpleColorProfile

Copyright

Syntax

Copyright "text"

Examples

Copyright "Copyright 2008 by Foo Enterprises"

Copyright
"This software is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.

This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public
License along with this software; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111 USA"

Description

The Copyright directive adds text comments to the top of a PPD file, typically for use in copyright notices. The text argument can contain multiple lines of text, but no line may exceed 255 bytes.

CustomMedia

Syntax

CustomMedia name width length left bottom right top
    "size-code" "region-code"

CustomMedia "name/text" width length left bottom right top
    "size-code" "region-code"

Examples

CustomMedia Letter 8.5in 11in 0.25in 0.46in 0.25in 0.04in
    "<</PageSize[612 792]/ImagingBBox null/ManualFeed false>>
     setpagedevice"
    "<</PageSize[612 792]/ImagingBBox null/ManualFeed true>>
     setpagedevice"

CustomMedia "A4/A4 - 210x297mm" 210mm 297mm 12 12 12 12
    "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
    "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"

Description

The CustomMedia directive adds a custom media size to the driver. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The width and length arguments specify the dimensions of the media as defined for the #media directive.

The left, bottom, right, and top arguments specify the printable margins of the media.

The size-code and region-code arguments specify the PostScript commands to run for the PageSize and PageRegion options, respectively. The commands can contain multiple lines, however no line may be more than 255 bytes in length.

See Also

#media, MediaSize

Cutter

Syntax

Cutter boolean-value

Examples

Cutter yes
Cutter no

Description

The Cutter directive specifies whether the printer has a built-in media cutter. When a cutter is present, the printer's PPD file will contain a CutMedia option that allows the user to control whether the media is cut at the end of the job.

See Also

Choice, ColorModel, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

DeprecatedDarkness

Syntax

Darkness temperature name
Darkness temperature "name/text"

Examples

Darkness 0 Light
Darkness 2 "Normal/Standard"

Description

The Darkness directive defines a choice for the cupsDarkness option which sets the cupsCompression attribute in the PostScript page device dictionary. It is used with the CUPS rastertolabel sample driver to control the print head temperature and therefore the darkness of the print.

The temperature argument specifies a temperature value for the Dymo driver from 0 (lowest) to 3 (highest), with 2 representing the normal setting.

The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

See Also

Choice, ColorModel, Cutter, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

DriverType

Syntax

DriverType type

Examples

DriverType custom
DriverType escp
DriverType pcl
DriverType ps

Description

The DriverType directive tells the PPD compiler which DDK filters to include in the PPD file. The following types are supported:

  • custom - Use only those filters that are defined in the driver information file
  • epson - Use the CUPS sample Epson driver filter rastertoepson
  • escp - Use the ESC/P DDK driver filters commandtoescpx and rastertoescpx
  • hp - Use the CUPS sample HP driver filter rastertohp
  • label - Use the CUPS sample label driver filter rastertolabel
  • pcl - Use the HP-PCL DDK driver filters commandtopclx and rastertopclx
  • ps - Use no filters; this driver is for a standard PostScript device

See Also

Filter, ModelNumber

Duplex

Syntax

Duplex type

Examples

Duplex none
Duplex normal
Duplex flip
Duplex rotated
Duplex manualtumble

Description

The Duplex directive determines whether double-sided printing is supported in the current driver. The type argument specifies the type of duplexing that is supported:

  • none - double-sided printing is not supported
  • normal - double-sided printing is supported
  • flip - double-sided printing is supported, but the back side image needs to be flipped vertically (used primarily with inkjet printers)
  • rotated - double-sided printing is supported, but the back side image needs to be rotated 180 degrees for DuplexNoTumble
  • manualtumble - double-sided printing is supported, but the back side image needs to be rotated 180 degrees for DuplexTumble

See Also

Choice, ColorModel, Cutter, Darkness, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

FileName

Syntax

FileName "filename"

Examples

FileName "Acme Laser Printer 2000"
FileName "Acme Ink Waster 1000"

Description

The FileName attribute specifies the "long" name of the PPD file for the current driver.

See Also

Manufacturer, ModelName, PCFileName, Version

Filter

Syntax

Filter mime-type cost program

Examples

Filter application/vnd.cups-raster 50 rastertofoo
Filter application/vnd.hp-HPGL 25 /usr/foo/filter/hpgltofoo

Description

The Filter directive adds a filter for the current driver. The mime-type argument is a valid MIME media type name as defined in a CUPS mime.types file.

The cost argument specifies the relative cost of the filter. In general, use a number representing the average percentage of CPU time that is used when printing the specified MIME media type.

The program argument specifies the program to run; if the program is not an absolute filename, then CUPS will look for the program in the CUPS filter directory.

See Also

DriverType

DeprecatedFinishing

Syntax

Finishing name
Finishing "name/text"

Examples

Finishing None
Finishing "Glossy/Photo Overcoat"

Description

The Finishing directive adds a choice to the cupsFinishing option. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The name is stored in the OutputType attribute in the PostScript page device dictionary.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Group, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

Font

Syntax

Font name encoding "version" charset status
Font *

Examples

Font *
Font Courier Standard "(1.05)" Standard ROM
Font Symbol Special "(001.005)" Special ROM
Font Barcode-Foo Special "(1.0)" Special Disk
Font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM

Description

The Font directive defines a "device font" for the current printer driver. The name is the PostScript font name.

The encoding is the default encoding of the font, usually Standard, Expert, or Special, as defined in the Adobe PPD file specification.

The version is the PostScript string definition that corresponds to the font version number.

The charset defines the available characters in the font, usually Standard or Special, as defined in the Adobe PPD file specification.

The status is the installation status of the font and must be either the word ROM or Disk.

Device fonts differ from fonts defined using the #font directive in that they are automatically associated with the current driver. Fonts defined using #font may be imported into the current driver using the Font * form of this directive.

See Also

#font

Group

Syntax

Group name
Group "name/text"

Examples

Group General
Group "InstallableOptions/Options Installed"
Group "Special/Vendor Options"

Description

The Group directive specifies the group for new Option directives. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 40 bytes in length. If no text is provided, the name is used.

The names General and InstallableOptions are predefined for the standard Adobe UI keywords and for installable options, respectively.

Note:

Because of certain API binary compatibility issues, CUPS limits the length of PPD group translation strings (text) to 40 bytes, while the PPD specification allows for up to 80 bytes.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, InputSlot, Installable, MediaType, Option, Resolution, UIConstraints

HWMargins

Syntax

HWMargins left bottom right top

Examples

HWMargins 18 36 18 36
HWMargins 0.25in 0.5in 0.25in 0.5in
HWMargins 0.6cm 1.2cm 0.6cm 1.2cm

Description

The HWMargins directive specifies the current margins for MediaSize that follow. The left, bottom, right, and top margin values specify the printable margins.

See Also

MediaSize

InputSlot

Syntax

InputSlot position name
InputSlot position "name/text"

Examples

InputSlot 0 Auto
InputSlot 1 "Upper/Tray 1"

Description

The InputSlot directive adds a new choice to the InputSlot option. The position argument is a number from 0 to 232-1 specifying the value that is placed in the MediaPosition attribute in the PostScript page device dictionary.

The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, Installable, MediaType, Option, Resolution, UIConstraints

Installable

Syntax

Installable name
Installable "name/text"

Examples

Installable EnvTray
Installable "Option1/Duplexer Installed"

Description

The Installable directive adds a new boolean option to the InstallableOptions group with a default value of False. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

LocAttribute

Syntax

LocAttribute name "keyword/text" value

Examples

LocAttribute fooProfile "Photo/Photographic Profile" "photopro.icc"

Description

The LocAttribute directive creates a localized PPD attribute. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

The selector can be the empty string ("") or text of up to 80 bytes.

The value is any string or number; the string may contain multiple lines, however no one line may exceed 255 bytes.

See Also

Attribute

ManualCopies

Syntax

ManualCopies boolean-value

Examples

ManualCopies no
ManualCopies yes

Description

The ManualCopies directive specifies whether copies need to be produced by the RIP filters. The default is no.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, MediaType, Option, Resolution, UIConstraints

Manufacturer

Syntax

Manufacturer "name"

Examples

Manufacturer "Foo"
Manufacturer "HP"

Description

The Manufacturer directive specifies the manufacturer name for the current driver. The name argument must conform to the manufacturer name requirements in the Adobe PPD file specification.

See Also

FileName, ModelName, PCFileName, Version

MaxSize

Syntax

MaxSize width length

Examples

MaxSize 36in 100ft
MaxSize 300cm 30m

Description

The MaxSize directive specifies the maximum width and length that is supported for custom page sizes.

See Also

MinSize, VariablePaperSize

MediaSize

Syntax

MediaSize name

Examples

MediaSize Letter
MediaSize A4

Description

The MediaSize directive adds the named size to the current printer driver using the current margins defined with the HWMargins directive. The name argument must match a media size defined using the #media directive.

See Also

#media, HWMargins

MediaType

Syntax

MediaType type name
MediaType type "name/text"

Examples

MediaType 0 Auto
MediaType 1 "Plain/Plain Paper"

Description

The MediaType directive adds a new choice to the MediaType option. The type argument is a number from 0 to 232-1 specifying the value that is placed in the cupsMediaType attribute in the PostScript page device dictionary.

The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The name is placed in the MediaType attribute in the PostScript page device dictionary.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, Option, Resolution, UIConstraints

MinSize

Syntax

MinSize width length

Examples

MinSize 4in 8in
MinSize 10cm 20cm

Description

The MinSize directive specifies the minimum width and length that is supported for custom page sizes.

See Also

MaxSize, VariablePaperSize

ModelName

Syntax

ModelName "name"

Examples

ModelName "Foo Laser Printer 2000"
ModelName "Colorific 123"

Description

The ModelName directive sets the printer name for the ModelName, NickName, and ShortNickName attributes for the printer driver. The name is any string of letters, numbers, spaces, and the characters ".", "/", "-", and "+" and should not begin with the manufacturer name since the PPD compiler will add this automatically for you. The maximum length of the name string is 31 bytes to conform to the Adobe limits on the length of ShortNickName.

See Also

FileName, Manufacturer, PCFileName, Version

ModelNumber

Syntax

ModelNumber expression

Examples

ModelNumber 123
ModelNumber ($PCL_PAPER_SIZE $PCL_PJL)

Description

The ModelNumber directive sets the cupsModelNumber attribute for the printer driver, which is often used by the printer driver filter to tailor its output for the current device. The number is any integer or bitwise OR of integers and constants that is appropriate for the printer driver filters.

A complete list of printer driver model number constants is available later in this appendix in the section titled, "Printer Driver ModelNumber Constants".

See Also

DriverType, Filter

Option

Syntax

Option name type section order
Option "name/text" type section order

Examples

Option Punch Boolean AnySetup 10
Option "fooFinish/Finishing Option" PickOne DocumentSetup 10

Description

The Option directive creates a new option in the current group, by default the General group. The name may contain up to 40 ASCII characters within the range of decimal 33 to decimal 126 inclusive, except for the characters comma (44), slash (47) and colon (58).

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

The type argument is one of the following keywords:

  • Boolean - a true/false option
  • PickOne - allows the user to pick one choice from a list
  • PickMany - allows the user to pick zero or more choices from a list

The section argument is one of the following keywords:

  • AnySetup - The option can be placed in either the DocumentSetup or PageSetup sections of the PostScript document
  • DocumentSetup - The option must be placed in the DocumentSetup section of the PostScript document; this does not allow the option to be overridden on individual pages
  • ExitServer - The option must be placed in a separate initialization job prior to the document (not used for raster printer drivers)
  • JCLSetup - The option contains job control language commands and must be sent prior to the document using the JCLBegin and JCLToPSInterpreter attributes (not used for raster printer drivers)
  • PageSetup - The option must be placed at the beginning of each page in the PostScript document
  • Prolog - The option must be placed in the prolog section of the PostScript document; this is typically used to add special comments for high-end typesetters, but can also be used to add CUPS PostScript job ticket comments.

The order argument is a real number greater than or equal to 0.0 and is used to sort the printer commands from many options before sending them to the printer or RIP filter.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Resolution, UIConstraints

PCFileName

Syntax

PCFileName "filename.ppd"

Examples

PCFileName "foljt2k1.ppd"
PCFileName "deskjet.ppd"

Description

The PCFileName attribute specifies the name of the PPD file for the current driver. The filename argument must conform to the Adobe PPD file specification and can be no more than 8 filename characters plus the extension ".ppd".

See Also

FileName, Manufacturer, ModelName, Version

DeprecatedResolution

Syntax

Resolution colorspace bits-per-color row-count row-feed row-step name
Resolution colorspace bits-per-color row-count row-feed row-step "name/text"

Examples

Resolution - 8 0 0 0 300dpi
Resolution k 8 0 0 0 "600x300dpi/600 DPI Grayscale"

Description

The Resolution directive creates a new Resolution option choice which sets the HWResolution, cupsBitsPerColor, cupsRowCount, cupsRowFeed, cupsRowStep, and optionally the cupsColorSpace page device dictionary attributes. The colorspace argument specifies a colorspace to use for the specified resolution and can be the hyphen (-) character to make no change to the selected color model or any keyword listed in the section titled, "Colorspace Keywords", to force the named colorspace.

The bits-per-color argument specifies the number of bits per color to generate when RIP'ing a job. The values 1, 2, 4, and 8 are currently supported by CUPS.

The row-count, row-feed, and row-step argument specify the driver-dependent values for the cupsRowCount, cupsRowFeed, and cupsRowStep attributes, respectively. Most drivers leave these attributes set to 0, but any number from 0 to 232-1 is allowed.

The name argument must conform to the resolution naming conventions in the Adobe PPD file specification, either HHHdpi for symmetric resolutions or HHHxVVVdpi for asymmetric resolutions. The HHH and VVV in the examples represent the horizontal and vertical resolutions which must be positive integer values.

If provided, the text can be any string up to 80 bytes in length. If no text is provided, the name is used.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, UIConstraints

DeprecatedSimpleColorProfile

Syntax

SimpleColorProfile resolution/mediatype density
    yellow-density red-density gamma
    red-adjust green-adjust blue-adjust

Examples

SimpleColorProfile -/- 100 100 200 1.0 0 0 0

SimpleColorProfile 360dpi/- 100 95 150 1.2 5 10 15

SimpleColorProfile 720dpi/Glossy 100 90 120 1.5 -5 5 10

Description

The SimpleColorProfile directive creates a matrix-based ColorProfile. The resolution and mediatype arguments specify the Resolution and MediaType choices which use the profile; the hyphen (-) is used to specify that any resolution or mediatype can be used with the profile.

The density argument specifies the linear density correction to apply to the color values (P = d * 0.01 * pg) and is an integer greater than 0 and less than or equal to 100. A value 100 of disables density correction while lower values produce proportionately lighter output. The density value adjusts all color channels equally in all color modes.

The yellow-density argument specifies the density of the yellow channel when printing in grayscale or RGB mode and is an integer greater than 0 and less then or equal to 100. A value of 100 disables yellow density correction while lower values produce proportionately lighter output.

The red-density argument specifies the two-color density limit (e.g. C + M, C + Y, M + Y) when printing in grayscale or RGB mode and is an integer greater than 0 and less then or equal to 200. A value of 200 disables two-color density correction while lower values produce proportionately lighter output.

The gamma argument specifies the gamma correction to apply to the color values (P = pg) and is a real number greater than 0. Values larger than 1 cause a general lightening of the print while values smaller than 1 cause a general darkening of the print. A value of 1 disables gamma correction.

The red-adjust, green-adjust, blue-adjust arguments specify the percentage of color to add or remove. Positive red-adjust values add magenta and negative values add yellow. Positive green-adjust values add cyan and negative values add yellow. Positive blue-adjust values add cyan and negative values add magenta. Values of 0 disable color adjustments.

See Also

ColorProfile

Throughput

Syntax

Throughput pages-per-minute

Examples

Throughput 1
Throughput 10

Description

The Throughput directive sets the Throughput attribute for the current printer driver. The pages-per-minute argument is a positive integer representing the peak number of pages per minute that the printer is capable of producing. Use a value of 1 for printers that produce less than 1 page per minute.

UIConstraints

Syntax

UIConstraints "*Option1 *Option2"
UIConstraints "*Option1 Choice1 *Option2"
UIConstraints "*Option1 *Option2 Choice2"
UIConstraints "*Option1 Choice1 *Option2 Choice2"

Examples

UIConstraints "*Finishing *MediaType"
UIConstraints "*Option1 False *Duplex"
UIConstraints "*Duplex *MediaType Transparency"
UIConstraints "*Resolution 600dpi *ColorModel RGB"

Description

The UIConstraints directive adds a constraint between two options. Constraints inform the application when a user has chosen incompatible options. Each option name is preceded by the asterisk (*). If no choice is given for an option, then all choices except False and None will conflict with the other option and choice(s). Since the PPD compiler automatically adds reciprocal constraints (option A conflicts with option B, so therefore option B conflicts with option A), you need only specify the constraint once.

See Also

Choice, ColorModel, Cutter, Darkness, Duplex, Finishing, Group, InputSlot, Installable, MediaType, Option, Resolution

VariablePaperSize

Syntax

VariablePaperSize boolean-value

Examples

VariablePaperSize yes
VariablePaperSize no

Description

The VariablePaperSize directive specifies whether the current printer supports variable (custom) page sizes. When yes is specified, the PPD compiler will include the standard PPD attributes required to support custom page sizes.

See Also

MaxSize, MinSize

Version

Syntax

Version number

Examples

Version 1.0
Version 3.7

Description

The Version directive sets the FileVersion attribute in the PPD file and is also used for the NickName attribute. The number argument is a positive real number.

See Also

Manufacturer, ModelName, PCFileName

Standard Include Files

Table B-1 shows the standard include files which are provided with the DDK.

Table B-1, Standard Include Files
Include File Description
<font.defs> Defines all of the standard fonts which are included with ESP Ghostscript and the Apple PDF RIP.
<epson.h> Defines all of the CUPS ESC/P sample driver constants.
<escp.h> Defines all of the DDK ESC/P driver constants.
<hp.h> Defines all of the CUPS HP-PCL sample driver constants.
<label.h> Defines all of the CUPS label sample driver constants.
<media.defs> Defines all of the standard media sizes listed in Appendix B of the Adobe PostScript Printer Description File Format Specification.
<pcl.h> Defines all of the DDK HP-PCL driver constants.
<raster.defs> Defines all of the CUPS raster format constants.

Printer Driver ModelNumber Constants

The CUPS DDK and sample drivers use the cupsModelNumber attribute in the PPD file to tailor their output to the printer. The following sections describe the constants for each driver.

The CUPS ESC/P Sample Driver (epson)

The epson driver supports Epson and Okidata dot-matrix, Epson Stylus Color, and Epson Stylus Photo printers. Table B-2 lists the constants for the ModelNumber directive. ModelNumber values should be inserted by referencing only one of these constants.

Table B-2, epson driver constants
Constant Description
EPSON_9PIN Epson and Okidata 9-pin dot-matrix printers
EPSON_24PIN Epson and Okidata 24-pin dot-matrix printers
EPSON_COLOR Older Epson Stylus Color printers that use the ESC . graphics command
EPSON_PHOTO Older Epson Stylus Photo printers that use the ESC . graphics command
EPSON_ICOLOR Newer Epson Stylus Color printers that use the ESC i graphics command
EPSON_IPHOTO Newer Epson Stylus Photo printers that use the ESC i graphics command

The CUPS HP-PCL Sample Driver (hp)

The hp driver supports HP LaserJet and DeskJet printers. Table B-3 lists the constants for the ModelNumber directive. ModelNumber values should be inserted by referencing only one of these constants.

Table B-3, hp driver constants
Constant Description
HP_LASERJET HP LaserJet printers supporting PCL 3, 4, or 5
HP_DESKJET HP DeskJet printers supporting PCL 3 and using the simple color graphics command (ESC * r # U)
HP_DESKJET2 HP DeskJet printers supporting PCL3GUI and using the configure raster graphics command (ESC * g # W)

The CUPS Label Sample Driver (label)

The label driver supports the Dymo Labelwriter, Zebra CPCL, Zebra EPL, and Zebra ZPL, and Intellitech PCL label printers. Table B-4 lists the constants for the ModelNumber directive. ModelNumber values should be inserted by referencing only one of these constants.

Table B-4, label driver constants
Constant Description
DYMO_3x0 Format output for the Dymo Labelwriter 300, 330, or 330 Turbo.
INTELLITECH_PCL Format output for the Intellitech PCL printers.
ZEBRA_CPCL Format output for the Zebra CPCL printers.
ZEBRA_EPL_LINE Format output for the Zebra EPL line mode (EPL 1) printers.
ZEBRA_EPL_PAGE Format output for the Zebra EPL page mode (EPL 2) printers.
ZEBRA_ZPL Format output for the Zebra ZPL printers.

The DDK ESC/P Driver (escp)

The escp driver supports all Epson inkjet printers. Table B-6 lists the constants for the ModelNumber directive. ModelNumber values should be specified as the bitwise OR of one or more of these constants.

Table B-6, escp driver constants
Constant Description
ESCP_MICROWEAVE Use microweave command?
ESCP_STAGGER Are color jets staggered?
ESCP_ESCK Use print mode command?
ESCP_EXT_UNITS Use extended unit commands?
ESCP_EXT_MARGINS Use extended margin command?
ESCP_USB Send USB packet mode escape
ESCP_PAGE_SIZE Use page size command
ESCP_RASTER_ESCI Use ESC i graphics command
ESCP_REMOTE Use remote mode commands
ESCP_REMOTE_AC Use auto-cutter command
ESCP_REMOTE_CO Use cutter-operation command
ESCP_REMOTE_EX Use media-position command
ESCP_REMOTE_MS Use media-size command
ESCP_REMOTE_MT Use media-type command
ESCP_REMOTE_PC Use paper-check command
ESCP_REMOTE_PH Use paper-thickness command
ESCP_REMOTE_PP Use paper-path command
ESCP_REMOTE_SN0 Use feed-sequence-0 command
ESCP_REMOTE_SN1 Use platten-gap command
ESCP_REMOTE_SN2 Use feed-sequence-2 command
ESCP_REMOTE_SN6 Use eject-delay command
ESCP_REMOTE_FP Use print-position command

The DDK HP-PCL Driver (pcl)

The pcl driver supports all HP LaserJet, DeskJet, and DesignJet printers. Table B-5 lists the constants for the ModelNumber directive. ModelNumber values should be specified as the bitwise OR of one or more of these constants.

Table B-5, pcl driver constants
Constant Description
PCL_PAPER_SIZE Use paper size command (ESC & l # A)
PCL_INKJET Use inkjet commands
PCL_RASTER_END_COLOR Use new end-raster command (ESC * r C)
PCL_RASTER_CID Use configure-image-data command (ESC * v # W)
PCL_RASTER_CRD Use configure-raster-data command (ESC * g # W)
PCL_RASTER_SIMPLE Use simple-raster-color command (ESC * r # U)
PCL_RASTER_RGB24 Use 24-bit RGB mode
PCL_PJL Use PJL commands
PCL_PJL_PAPERWIDTH Use PJL PAPERWIDTH/LENGTH commands
PCL_PJL_HPGL2 Use PJL ENTER HPGL2 command
PCL_PJL_PCL3GUI Use PJL ENTER PCL3GUI command
PCL_PJL_RESOLUTION Use PJL SET RESOLUTION command

Color Keywords

The PPD compiler defines two types of color keywords: colorspace and color order. The following sections list the supported keywords for each type.

Colorspace Keywords

The following colorspace keywords are recognized:

  • cielab - CIE Lab **
  • ciexyz - CIE XYZ **
  • cmy - Cyan, magenta, yellow
  • cmyk - Cyan, magenta, yellow, black
  • gmck - Gold, magenta, yellow, black **
  • gmcs - Gold, magenta, yellow, silver **
  • gold - Gold foil **
  • icc1 - ICC-based, 1 color **
  • icc2 - ICC-based, 2 colors **
  • icc3 - ICC-based, 3 colors **
  • icc4 - ICC-based, 4 colors **
  • icc5 - ICC-based, 5 colors **
  • icc6 - ICC-based, 6 colors **
  • icc7 - ICC-based, 7 colors **
  • icc8 - ICC-based, 8 colors **
  • icc9 - ICC-based, 9 colors **
  • icca - ICC-based, 10 colors **
  • iccb - ICC-based, 11 colors **
  • iccc - ICC-based, 12 colors **
  • iccd - ICC-based, 13 colors **
  • icce - ICC-based, 14 colors **
  • iccf - ICC-based, 15 colors **
  • k - Black
  • kcmy - Black, cyan, magenta, yellow *
  • kcmycm - Black, cyan, magenta, yellow, light-cyan, light-magenta *
  • rgb - Red, green, blue
  • rgba - Red, green, blue, alpha
  • rgbw - Red, green, blue, luminance *
  • silver - Silver foil **
  • w - Luminance
  • white - White ink (as black) **
  • ymc - Yellow, magenta, cyan *
  • ymck - Yellow, magenta, cyan, black *
     
    * = This colorspace is not supported on macOS prior to 10.4.
    ** = This colorspace is not supported on macOS.

Color Order Keywords

The following color order keywords are recognized:

  • chunked or chunky - Color values are passed together on a line as RGB RGB RGB RGB
  • banded - Color values are passed separately on a line as RRRR GGGG BBBB *
  • planar - Color values are passed separately on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB BBBB BBBB *
     
    * = This color order is not supported by the current Apple RIP filters and should not be used when developing printer drivers for macOS.
cups-2.3.1/doc/help/accounting.html000664 000765 000024 00000005204 13574721672 017315 0ustar00mikestaff000000 000000 Printer Accounting Basics

Printer Accounting Basics

CUPS supports a variety of printer accounting schemes. Aside from the built-in quota and page logging support, there are several third-party solutions that can be found online.

Quota Support

CUPS supports page and size-based quotas for each printer. The quotas are tracked individually for each user, but a single set of limits applies to all users for a particular printer. For example, you can limit every user to 5 pages per day on an expensive printer, but you cannot limit every user except Johnny.

The job-k-limit, job-page-limit, and job-quota-period options determine whether and how quotas are enforced for a printer. The job-quota-period option determines the time interval for quota tracking. The interval is expressed in seconds, so a day is 86,400, a week is 604,800, and a month is 2,592,000 seconds. The job-k-limit option specifies the job size limit in kilobytes. The job-page-limit option specifies the number of pages limit.

For quotas to be enforced, the period and at least one of the limits must be set to a non-zero value. The following options will enable weekly quotas with the given size and page count limits:

/usr/sbin/lpadmin -p printer -o job-quota-period=604800 \
    -o job-k-limit=1024 ENTER
/usr/sbin/lpadmin -p printer -o job-quota-period=604800 \
    -o job-page-limit=100 ENTER

Or, you can combine all three options on the same line.

While there is no way to query the current quota state for a particular user, any application can request a list of jobs for a user and printer that can be used to easily determine that information.

Page Logging

CUPS can log every page that is printed on a system to the page_log file. Page logging must be enabled by setting the PageLogFormat directive in the cupsd.conf file and is only available for drivers that provide page accounting information, typically all PostScript and CUPS raster devices. Raw queues and queues using third-party solutions such as Foomatic generally do not have useful page accounting information available.

cups-2.3.1/doc/help/man-mailto.conf.html000664 000765 000024 00000004110 13574721672 020140 0ustar00mikestaff000000 000000 mailto.conf(5)

mailto.conf(5)

Name

mailto.conf - configuration file for cups email notifier

Description

The mailto.conf file defines the local mail server and email notification preferences for CUPS.

Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character.

Directives

Cc cc-address@domain.com
Specifies an additional recipient for all email notifications.
From from-address@domain.com
Specifies the sender of email notifications.
Sendmail sendmail command and options
Specifies the sendmail command to use when sending email notifications. Only one Sendmail or SMTPServer line may be present in the mailto.conf file. If multiple lines are present, only the last one is used.
SMTPServer servername
Specifies a SMTP server to send email notifications to. Only one Sendmail or SMTPServer line may be present in the mailto.conf file. If multiple lines are present, only the last one is used.
Subject subject-prefix
Specifies a prefix string for the subject line of an email notification.

See Also

cupsd(8), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lp.html000664 000765 000024 00000016513 13574721672 016354 0ustar00mikestaff000000 000000 lp(1)

lp(1)

Name

lp - print files

Synopsis

lp [ -E ] [ -U username ] [ -c ] [ -d destination[/instance] ] [ -h hostname[:port] ] [ -m ] [ -n num-copies ] [ -o option[=value] ] [ -q priority ] [ -s ] [ -t title ] [ -H handling ] [ -P page-list ] [ -- ] [ file(s) ]
lp [ -E ] [ -U username ] [ -c ] [ -h hostname[:port] ] [ -i job-id ] [ -n num-copies ] [ -o option[=value] ] [ -q priority ] [ -t title ] [ -H handling ] [ -P page-list ]

Description

lp submits files for printing or alters a pending job. Use a filename of "-" to force printing from the standard input.

The Default Destination

CUPS provides many ways to set the default destination. The LPDEST and PRINTER environment variables are consulted first. If neither are set, the current default set using the lpoptions(1) command is used, followed by the default set using the lpadmin(8) command.

Options

The following options are recognized by lp:
--
Marks the end of options; use this to print a file whose name begins with a dash (-).
-E
Forces encryption when connecting to the server.
-U username
Specifies the username to use when connecting to the server.
-c
This option is provided for backwards-compatibility only. On systems that support it, this option forces the print file to be copied to the spool directory before printing. In CUPS, print files are always sent to the scheduler via IPP which has the same effect.
-d destination
Prints files to the named printer.
-h hostname[:port]
Chooses an alternate server.
-i job-id
Specifies an existing job to modify.
-m
Sends an email when the job is completed.
-n copies
Sets the number of copies to print.
-o "name=value [ ... name=value ]"
Sets one or more job options. See "COMMON JOB OPTIONS" below.
-q priority
Sets the job priority from 1 (lowest) to 100 (highest). The default priority is 50.
-s
Do not report the resulting job IDs (silent mode.)
-t "name"
Sets the job name.
-H hh:mm
-H hold
-H immediate
-H restart
-H resume
Specifies when the job should be printed. A value of immediate will print the file immediately, a value of hold will hold the job indefinitely, and a UTC time value (HH:MM) will hold the job until the specified UTC (not local) time. Use a value of resume with the -i option to resume a held job. Use a value of restart with the -i option to restart a completed job.
-P page-list
Specifies which pages to print in the document. The list can contain a list of numbers and ranges (#-#) separated by commas, e.g., "1,3-5,16". The page numbers refer to the output pages and not the document's original pages - options like "number-up" can affect the numbering of the pages.

Common Job Options

Aside from the printer-specific options reported by the lpoptions(1) command, the following generic options are available:
-o job-sheets=name
Prints a cover page (banner) with the document. The "name" can be "classified", "confidential", "secret", "standard", "topsecret", or "unclassified".
-o media=size
Sets the page size to size. Most printers support at least the size names "a4", "letter", and "legal".
-o number-up={2|4|6|9|16}
Prints 2, 4, 6, 9, or 16 document (input) pages on each output page.
-o orientation-requested=4
Prints the job in landscape (rotated 90 degrees counter-clockwise).
-o orientation-requested=5
Prints the job in landscape (rotated 90 degrees clockwise).
-o orientation-requested=6
Prints the job in reverse portrait (rotated 180 degrees).
-o print-quality=3
-o print-quality=4
-o print-quality=5
Specifies the output quality - draft (3), normal (4), or best (5).
-o sides=one-sided
Prints on one side of the paper.
-o sides=two-sided-long-edge
Prints on both sides of the paper for portrait output.
-o sides=two-sided-short-edge
Prints on both sides of the paper for landscape output.

Conforming To

Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are not case-sensitive.

The -q option accepts a different range of values than the Solaris lp command, matching the IPP job priority values (1-100, 100 is highest priority) instead of the Solaris values (0-39, 0 is highest priority).

Examples

Print two copies of a document to the default printer:

    lp -n 2 filename

Print a double-sided legal document to a printer called "foo":

    lp -d foo -o media=legal -o sides=two-sided-long-edge filename

Print a presentation document 2-up to a printer called "bar":

    lp -d bar -o number-up=2 filename

See Also

cancel(1), lpadmin(8), lpoptions(1), lpq(1), lpr(1), lprm(1), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cups-snmp.conf.html000664 000765 000024 00000006246 13574721672 020614 0ustar00mikestaff000000 000000 snmp.conf(5)

snmp.conf(5)

Name

snmp.conf - snmp configuration file for cups (deprecated)

Description

The snmp.conf file configures how the standard CUPS network backends (http, https, ipp, ipps, lpd, snmp, and socket) access printer information using SNMPv1 and is normally located in the /etc/cups directory. Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.

The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend - cups-snmp(8).

Directives

The following directives are understood by the CUPS network backends:
Address @IF(name)
Address @LOCAL
Address address
Sends SNMP broadcast queries (for discovery) to the specified address(es). There is no default for the broadcast address.
Community name
Specifies the community name to use. Only a single community name may be specified. The default community name is "public". If no name is specified, all SNMP functions are disabled.
DebugLevel number
Specifies the logging level from 0 (none) to 3 (everything). Typically only used for debugging (thus the name). The default debug level is 0.
DeviceURI "regular expression" device-uri [... device-uri]
Specifies one or more device URIs that should be used for a given make and model string. The regular expression is used to match the detected make and model, and the device URI strings must be of the form "scheme://%s[:port]/[path]", where "%s" represents the detected address or hostname. There are no default device URI matching rules.
HostNameLookups on
HostNameLookups off
Specifies whether the addresses of printers should be converted to hostnames or left as numeric IP addresses. The default is "off".
MaxRunTime seconds
Specifies the maximum number of seconds that the SNMP backend will scan the network for printers. The default is 120 seconds (2 minutes).

Notes

CUPS backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

cups-snmp(8), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-mime.convs.html000664 000765 000024 00000005135 13574721672 020015 0ustar00mikestaff000000 000000 mime.convs(5)

mime.convs(5)

Name

mime.convs - mime type conversion file for cups (deprecated)

Description

The mime.convs file defines the filters that are available for converting files from one format to another. The standard filters support text, PDF, PostScript, and many types of image files.

Additional filters are specified in files with the extension .convs in the CUPS configuration directory.

Each line in the mime.convs file is a comment, blank, or filter line. Comment lines start with the # character. Filter lines specify the source and destination MIME types along with a relative cost associated with the filter and the filter to run:


    source/type destination/type cost filter

The source/type field specifies the source MIME media type that is consumed by the filter.

The destination/type field specifies the destination MIME media type that is produced by the filter.

The cost field specifies the relative cost for running the filter. A value of 100 means that the filter uses a large amount of resources while a value of 0 means that the filter uses very few resources.

The filter field specifies the filter program filename. Filenames are relative to the CUPS filter directory.

Files

/etc/cups - Typical CUPS configuration directory.
/usr/lib/cups/filter - Typical CUPS filter directory.
/usr/libexec/cups/filter - CUPS filter directory on macOS.

Examples

Define a filter that converts PostScript documents to CUPS Raster format:

    application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster

Notes

CUPS filters are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

cups-files.conf(5), cupsd.conf(5), cupsd(8), cupsfilter(8), mime.types(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/postscript-driver.html000664 000765 000024 00000056417 13574721672 020702 0ustar00mikestaff000000 000000 Developing PostScript Printer Drivers

Developing PostScript Printer Drivers

This document describes how to develop printer drivers for PostScript printers. Topics include: printer driver basics, creating new PPD files, importing existing PPD files, using custom filters, implementing color management, and adding macOS features.

Printer Driver Basics

A CUPS PostScript printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, zero or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into device-independent PostScript, and then from device-independent PostScript to device-dependent PostScript. Figure 1 shows the data flow of a typical print job.

The optional PostScript filter can be provided to add printer-specific commands to the PostScript output that cannot be represented in the PPD file or to reorganize the output for special printer features. Typically this is used to support advanced job management or finishing functions on the printer. CUPS includes a generic PostScript filter that handles all PPD-defined commands.

The optional port monitor handles interface-specific protocol or encoding issues. For example, many PostScript printers support the Binary Communications Protocol (BCP) and Tagged Binary Communications Protocol (TBCP) to allow applications to print 8-bit ("binary") PostScript jobs. CUPS includes port monitors for BCP and TBCP, and you can supply your own port monitors as needed.

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

PostScript printer drivers typically do not require their own command filter since CUPS includes a generic PostScript command filter that supports all of the standard functions using PPD-defined commands.

Creating New PPD Files

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for a black-and-white PostScript printer.

Listing 1: "examples/postscript.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// Specify this is a PostScript printer driver
DriverType ps

// List the fonts that are supported, in this case all standard fonts
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "Foo LaserProofer 2000"
Version 1.0

// PostScript printer attributes
Attribute DefaultColorSpace "" Gray
Attribute LandscapeOrientation "" Minus90
Attribute LanguageLevel "" "3"
Attribute Product "" "(Foo LaserProofer 2000)"
Attribute PSVersion "" "(3010) 0"
Attribute TTRasterizer "" Type42

// Supported page sizes
*MediaSize Letter
MediaSize Legal
MediaSize A4

// Query command for page size
Attribute "?PageSize" "" "
      save
      currentpagedevice /PageSize get aload pop
      2 copy gt {exch} if (Unknown)
      23 dict
              dup [612 792] (Letter) put
              dup [612 1008] (Legal) put
              dup [595 842] (A4) put
              {exch aload pop 4 index sub abs 5 le exch
               5 index sub abs 5 le and
              {exch pop exit} {pop} ifelse
      } bind forall = flush pop pop
      restore"

// Specify the name of the PPD file we want to generate
PCFileName "fooproof.ppd"

Required Attributes

PostScript drivers require the attributes listed in Table 1. If not specified, the defaults for CUPS drivers are used. A typical PostScript driver information file would include the following attributes:

Attribute DefaultColorSpace "" Gray
Attribute LandscapeOrientation "" Minus90
Attribute LanguageLevel "" "3"
Attribute Product "" "(Foo LaserProofer 2000)"
Attribute PSVersion "" "(3010) 0"
Attribute TTRasterizer "" Type42
Table 1: Required PostScript Printer Driver Attributes
Attribute Description
DefaultColorSpace The default colorspace: Gray, RGB, CMY, or CMYK. If not specified, then RGB is assumed.
LandscapeOrientation The preferred landscape orientation: Plus90, Minus90, or Any. If not specified, Plus90 is assumed.
LanguageLevel The PostScript language level supported by the device: 1, 2, or 3. If not specified, 2 is assumed.
Product The string returned by the PostScript product operator, which must include parenthesis to conform with PostScript syntax rules for strings. Multiple Product attributes may be specified to support multiple products with the same PPD file. If not specified, "(ESP Ghostscript)" and "(GNU Ghostscript)" are assumed.
PSVersion The PostScript interpreter version numbers as returned by the version and revision operators. The required format is "(version) revision". Multiple PSVersion attributes may be specified to support multiple interpreter version numbers. If not specified, "(3010) 705" and "(3010) 707" are assumed.
TTRasterizer The type of TrueType font rasterizer supported by the device, if any. The supported values are None, Accept68k, Type42, and TrueImage. If not specified, None is assumed.

Query Commands

Most PostScript printer PPD files include query commands (?PageSize, etc.) that allow applications to query the printer for its current settings and configuration. Query commands are included in driver information files as attributes. For example, the example in Listing 1 uses the following definition for the PageSize query command:

Attribute "?PageSize" "" "
      save
      currentpagedevice /PageSize get aload pop
      2 copy gt {exch} if (Unknown)
      23 dict
              dup [612 792] (Letter) put
              dup [612 1008] (Legal) put
              dup [595 842] (A4) put
              {exch aload pop 4 index sub abs 5 le exch
               5 index sub abs 5 le and
              {exch pop exit} {pop} ifelse
      } bind forall = flush pop pop
      restore"

Query commands can span multiple lines, however no single line may contain more than 255 characters.

Importing Existing PPD Files

CUPS includes a utility called ppdi(1) which allows you to import existing PPD files into the driver information file format used by the PPD compiler ppdc(1). Once imported, you can modify, localize, and regenerate the PPD files easily. Type the following command to import the PPD file mydevice.ppd into the driver information file mydevice.drv:

ppdi -o mydevice.drv mydevice.ppd

If you have a whole directory of PPD files that you would like to import, you can list multiple filenames or use shell wildcards to import more than one PPD file on the command-line:

ppdi -o mydevice.drv mydevice1.ppd mydevice2.ppd
ppdi -o mydevice.drv *.ppd

If the driver information file already exists, the new PPD file entries are appended to the end of the file. Each PPD file is placed in its own group of curly braces within the driver information file.

Using Custom Filters

Normally a PostScript printer driver will not utilize any additional print filters. For drivers that provide additional filters such as a CUPS command file filter for doing printer maintenance, you must also list the following Filter directive to handle printing PostScript files:

Filter application/vnd.cups-postscript 0 -

Custom Command Filters

The application/vnd.cups-command file type is used for CUPS command files. Use the following Filter directive to handle CUPS command files:

Filter application/vnd.cups-command 100 /path/to/command/filter

To use the standard PostScript command filter, specify commandtops as the path to the command filter.

Custom PDF Filters

The application/pdf file type is used for unfiltered PDF files while the application/vnd.cups-pdf file type is used for filtered PDF files. Use the following Filter directive to handle filtered PDF files:

Filter application/vnd.cups-pdf 100 /path/to/pdf/filter

For unfiltered PDF files, use:

Filter application/pdf 100 /path/to/pdf/filter

Custom PDF filters that accept filtered data do not need to perform number-up processing and other types of page imposition, while those that accept unfiltered data MUST do the number-up processing themselves.

Custom PostScript Filters

The application/vnd.cups-postscript file type is used for filtered PostScript files. Use the following Filter directive to handle PostScript files:

Filter application/vnd.cups-postscript 100 /path/to/postscript/filter

Implementing Color Management

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

Adding macOS Features

macOS printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
Attribute APPrinterPreset "name/text" "*option choice ..."
cups-2.3.1/doc/help/glossary.html000664 000765 000024 00000005243 13574721672 017031 0ustar00mikestaff000000 000000 Glossary

Glossary

A

ASCII
American Standard Code for Information Interchange

C

C
A computer language
Character Set
The association of numbers with specific printed or displayed characters or symbols

E

ESC/P
EPSON Standard Code for Printers

F

FTP
File Transfer Protocol

G

GIF
Graphics Interchange Format

H

HP-PCL
Hewlett-Packard Page Control Language
HP-PJL
Hewlett-Packard Printer Job Language

I

IETF
Internet Engineering Task Force
IP
Internet Protocol
IPv4
Internet Protocol, version 4; IPv4 addresses are 32-bits in length and often look like "nnn.nnn.nnn.nnn" and "127.0.0.1"
IPv6
Internet Protocol, version 6: IPv6 addresses are 128-bits in length and look like "xxxx::xxxx:xxxx:xxxx:xxxx" and "::1"
IPP
Internet Printing Protocol
ISO
International Standards Organization

J

JFIF
JPEG File Interchange Format
JPEG
Joint Photographic Experts Group

L

LPD
Line Printer Daemon

M

MIME
Multimedia Internet Mail Exchange

P

parallel
Sending or receiving data more than 1 bit at a time
PDF
Portable Document Format
pipe
A one-way communications channel between two programs
PNG
Portable Network Graphics
PostScript
A page description language that is most often used for printing
PPD
PostScript Printer Description
PWG
Printer Working Group

S

serial
Sending or receiving data 1 bit at a time
SMB
Server Message Block
socket
A two-way network communications channel

T

TCP
Transmission Control Protocol
TFTP
Trivial File Transfer Protocol
TIFF
Tagged Image File Format

U

UDP
Unicast Datagram Protocol
Unicode
A universal character set for all languages of the world
UTF-8
Unicode Transfer Format 8-Bit
cups-2.3.1/doc/help/man-cupsaccept.html000664 000765 000024 00000004754 13574721672 020077 0ustar00mikestaff000000 000000 cupsaccept(8)

cupsaccept(8)

Name

cupsaccept/cupsreject - accept/reject jobs sent to a destination

Synopsis

cupsaccept [ -E ] [ -U username ] [ -h hostname[:port] ] destination(s)
cupsreject [ -E ] [ -U username ] [ -h hostname[:port] ] [ -r reason ] destination(s)

Description

The cupsaccept command instructs the printing system to accept print jobs to the specified destinations.

The cupsreject command instructs the printing system to reject print jobs to the specified destinations. The -r option sets the reason for rejecting print jobs. If not specified, the reason defaults to "Reason Unknown".

Options

The following options are supported by both cupsaccept and cupsreject:
-E
Forces encryption when connecting to the server.
-U username
Sets the username that is sent when connecting to the server.
-h hostname[:port]
Chooses an alternate server.
-r "reason"
Sets the reason string that is shown for a printer that is rejecting jobs.

Conforming To

The cupsaccept and cupsreject commands correspond to the System V printing system commands "accept" and "reject", respectively. Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are not case-sensitive.

Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.

See Also

cancel(1), cupsenable(8), lp(1), lpadmin(8), lpstat(1),
CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpc.html000664 000765 000024 00000004164 13574721672 016516 0ustar00mikestaff000000 000000 lpc(8)

lpc(8)

Name

lpc - line printer control program (deprecated)

Synopsis

lpc [ command [ parameter(s) ] ]

Description

lpc provides limited control over printer and class queues provided by CUPS. It can also be used to query the state of queues.

If no command is specified on the command-line, lpc displays a prompt and accepts commands from the standard input.

Commands

The lpc program accepts a subset of commands accepted by the Berkeley lpc program of the same name:
exit
Exits the command interpreter.
help [command]
? [command]
Displays a short help message.
quit
Exits the command interpreter.
status [queue]
Displays the status of one or more printer or class queues.

Notes

This program is deprecated and will be removed in a future feature release of CUPS.

Since lpc is geared towards the Berkeley printing system, it is impossible to use lpc to configure printer or class queues provided by CUPS. To configure printer or class queues you must use the lpadmin(8) command or another CUPS-compatible client with that functionality.

See Also

cancel(1), cupsaccept(8), cupsenable(8), lp(1), lpadmin(8), lpr(1), lprm(1), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/security.html000664 000765 000024 00000010707 13574721672 017036 0ustar00mikestaff000000 000000 Server Security

Server Security

In the default "standalone" configuration, there are few potential security risks - the CUPS server does not accept remote connections, and only accepts shared printer information from the local subnet. When you share printers and/or enable remote administration, you expose your system to potential unauthorized access. This help page provides an analysis of possible CUPS security concerns and describes how to better secure your server.

Authentication Issues

When you enable remote administration, the server will use Basic authentication for administration tasks. The current CUPS server supports Basic, Kerberos, and local certificate authentication:

  1. Basic authentication essentially places the clear text of the username and password on the network.

    Since CUPS uses the system username and password account information, the authentication information could be used to gain access to possibly privileged accounts on the server.

    Recommendation: Enable encryption to hide the username and password information - this is the default on macOS and systems with GNU TLS installed.

  2. Local certificate authentication passes 128-bit "certificates" that identify an authenticated user. Certificates are created on-the-fly from random data and stored in files under /var/run/cups/certs. They have restricted read permissions: root + system-group(s) for the root certificate, and lp + lp for CGI certificates.

    Because certificates are only available on the local system, the CUPS server does not accept local authentication unless the client is connected to the loopback interface (127.0.0.1 or ::1) or domain socket.

    Recommendation: Ensure that unauthorized users are not added to the system group(s).

Denial of Service Attacks

When printer sharing or remote administration is enabled, the CUPS server, like all Internet services, is vulnerable to a variety of denial of service attacks:

  1. Establishing multiple connections to the server until the server will accept no more.

    This cannot be protected against by any known software. The MaxClientsPerHost directive can be used to configure CUPS to limit the number of connections allowed from a single host, however that does not prevent a distributed attack.

    Recommendation: Limit access to trusted systems and networks.

  2. Repeatedly opening and closing connections to the server as fast as possible.

    There is no easy way of protecting against this in the CUPS software. If the attack is coming from outside the local network, it may be possible to filter such an attack. However, once the connection request has been received by the server it must at least accept the connection to find out who is connecting.

    Recommendation: None.

  3. Sending partial IPP requests; specifically, sending part of an attribute value and then stopping transmission.

    The current code will wait up to 1 second before timing out the partial value and closing the connection. This will slow the server responses to valid requests and may lead to dropped browsing packets, but will otherwise not affect the operation of the server.

    Recommendation: Block IPP packets from foreign or untrusted networks using a router or firewall.

  4. Sending large/long print jobs to printers, preventing other users from printing.

    There are limited facilities for protecting against large print jobs (the MaxRequestSize attribute), however this will not protect printers from malicious users and print files that generate hundreds or thousands of pages.

    Recommendation: Restrict printer access to known hosts or networks, and add user-level access controls as needed for expensive printers.

Encryption Issues

CUPS supports 128-bit TLS encryption of network connections via the GNU TLS library, macOS Security framework, and Windows Schannel APIs. Secure deployment of TLS depends on proper certificate management and software maintenance.

cups-2.3.1/doc/help/man-ppdhtml.html000664 000765 000024 00000003521 13574721672 017404 0ustar00mikestaff000000 000000 ppdhtml(1)

ppdhtml(1)

Name

ppdhtml - cups html summary generator (deprecated)

Synopsis

ppdhtml [ -D name[=value] ] [ -I include-directory ] source-file

Description

ppdhtml reads a driver information file and produces a HTML summary page that lists all of the drivers in a file and the supported options. This program is deprecated and will be removed in a future release of CUPS.

Options

ppdhtml supports the following options:
-D name[=value]
Sets the named variable for use in the source file. It is equivalent to using the #define directive in the source file.
-I include-directory
Specifies an alternate include directory. Multiple -I options can be supplied to add additional directories.

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

ppdc(1), ppdcfile(5), ppdi(1), ppdmerge(1), ppdpo(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-client.conf.html000664 000765 000024 00000015642 13574721672 020145 0ustar00mikestaff000000 000000 client.conf(5)

client.conf(5)

Name

client.conf - client configuration file for cups (deprecated on macos)

Description

The client.conf file configures the CUPS client and is normally located in the /etc/cups and/or ~/.cups directories. Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.

Note: Starting with macOS 10.7, this file is only used by command-line and X11 applications plus the IPP backend. The ServerName directive is not supported on macOS at all. Starting with macOS 10.12, all applications can access these settings in the /Library/Preferences/org.cups.PrintingPrefs.plist file instead. See the NOTES section below for more information.

Directives

The following directives are understood by the client. Consult the online help for detailed descriptions:
AllowAnyRoot Yes
AllowAnyRoot No
Specifies whether to allow TLS with certificates that have not been signed by a trusted Certificate Authority. The default is "Yes".
AllowExpiredCerts Yes
AllowExpiredCerts No
Specifies whether to allow TLS with expired certificates. The default is "No".
DigestOptions DenyMD5
DigestOptions None
Specifies HTTP Digest authentication options. DenyMD5 disables support for the original MD5 hash algorithm.
Encryption IfRequested
Encryption Never
Encryption Required
Specifies the level of encryption that should be used.
GSSServiceName name
Specifies the Kerberos service name that is used for authentication, typically "host", "http", or "ipp". CUPS adds the remote hostname ("name@server.example.com") for you. The default name is "http".
ServerName hostname-or-ip-address[:port]
ServerName /domain/socket
Specifies the address and optionally the port to use when connecting to the server. Note: This directive is not supported on macOS 10.7 or later.
ServerName hostname-or-ip-address[:port]/version=1.1
Specifies the address and optionally the port to use when connecting to a server running CUPS 1.3.12 and earlier.
SSLOptions [AllowDH] [AllowRC4] [AllowSSL3] [DenyCBC] [DenyTLS1.0] [MaxTLS1.0] [MaxTLS1.1] [MaxTLS1.2] [MaxTLS1.3] [MinTLS1.0] [MinTLS1.1] [MinTLS1.2] [MinTLS1.3]
SSLOptions None
Sets encryption options (only in /etc/cups/client.conf). By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites. Security is reduced when Allow options are used. Security is enhanced when Deny options are used. The AllowDH option enables cipher suites using plain Diffie-Hellman key negotiation (not supported on systems using GNU TLS). The AllowRC4 option enables the 128-bit RC4 cipher suites, which are required for some older clients. The AllowSSL3 option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0. The DenyCBC option disables all CBC cipher suites. The DenyTLS1.0 option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1. The MinTLS options set the minimum TLS version to support. The MaxTLS options set the maximum TLS version to support. Not all operating systems support TLS 1.3 at this time.
TrustOnFirstUse Yes
TrustOnFirstUse No
Specifies whether to trust new TLS certificates by default. The default is "Yes".
User name
Specifies the default user name to use for requests.
UserAgentTokens None
UserAgentTokens ProductOnly
UserAgentTokens Major
UserAgentTokens Minor
UserAgentTokens Minimal
UserAgentTokens OS
UserAgentTokens Full
Specifies what information is included in the User-Agent header of HTTP requests. "None" disables the User-Agent header. "ProductOnly" reports "CUPS". "Major" reports "CUPS/major IPP/2". "Minor" reports "CUPS/major.minor IPP/2.1". "Minimal" reports "CUPS/major.minor.patch IPP/2.1". "OS" reports "CUPS/major.minor.path (osname osversion) IPP/2.1". "Full" reports "CUPS/major.minor.path (osname osversion; architecture) IPP/2.1". The default is "Minimal".
ValidateCerts Yes
ValidateCerts No
Specifies whether to only allow TLS with certificates whose common name matches the hostname. The default is "No".

Notes

The client.conf file is deprecated on macOS and will no longer be supported in a future version of CUPS. Configuration settings can instead be viewed or changed using the defaults(1) command:
defaults write /Library/Preferences/org.cups.PrintingPrefs.plist Encryption Required
defaults write /Library/Preferences/org.cups.PrintingPrefs.plist TrustOnFirstUse -bool NO

defaults read /Library/Preferences/org.cups.PrintingPrefs.plist Encryption
On Linux and other systems using GNU TLS, the /etc/cups/ssl/site.crl file, if present, provides a list of revoked X.509 certificates and is used when validating certificates.

See Also

cups(1), default(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpadmin.html000664 000765 000024 00000024052 13574721672 017362 0ustar00mikestaff000000 000000 lpadmin(8)

lpadmin(8)

Name

lpadmin - configure cups printers and classes

Synopsis

lpadmin [ -E ] [ -U username ] [ -h server[:port] ] -d destination
lpadmin [ -E ] [ -U username ] [ -h server[:port] ] -p destination [ -R name-default ] option(s)
lpadmin [ -E ] [ -U username ] [ -h server[:port] ] -x destination

Description

lpadmin configures printer and class queues provided by CUPS. It can also be used to set the server default printer or class.

When specified before the -d, -p, or -x options, the -E option forces encryption when connecting to the server.

The first form of the command (-d) sets the default printer or class to destination. Subsequent print jobs submitted via the lp(1) or lpr(1) commands will use this destination unless the user specifies otherwise with the lpoptions(1) command.

The second form of the command (-p) configures the named printer or class. The additional options are described below.

The third form of the command (-x) deletes the printer or class destination. Any jobs that are pending for the destination will be removed and any job that is currently printed will be aborted.

Options

The following options are recognized when configuring a printer queue:
-c class
Adds the named printer to class. If class does not exist it is created automatically.
-m model
Sets a standard PPD file for the printer from the model directory or using one of the driver interfaces. Use the -m option with the lpinfo(8) command to get a list of supported models. The model "raw" clears any existing PPD file and the model "everywhere" queries the printer referred to by the specified IPP device-uri. Note: Models other than "everywhere" are deprecated and will not be supported in a future version of CUPS.
-o cupsIPPSupplies=true
-o cupsIPPSupplies=false
Specifies whether IPP supply level values should be reported.
-o cupsSNMPSupplies=true
-o cupsSNMPSupplies=false
Specifies whether SNMP supply level (RFC 3805) values should be reported.
-o job-k-limit=value
Sets the kilobyte limit for per-user quotas. The value is an integer number of kilobytes; one kilobyte is 1024 bytes.
-o job-page-limit=value
Sets the page limit for per-user quotas. The value is the integer number of pages that can be printed; double-sided pages are counted as two pages.
-o job-quota-period=value
Sets the accounting period for per-user quotas. The value is an integer number of seconds; 86,400 seconds are in one day.
-o job-sheets-default=banner
-o job-sheets-default=banner,banner
Sets the default banner page(s) to use for print jobs.
-o name=value
Sets a PPD option for the printer. PPD options can be listed using the -l option with the lpoptions(1) command.
-o name-default=value
Sets a default server-side option for the destination. Any print-time option can be defaulted, e.g., "-o number-up-default=2" to set the default "number-up" option value to 2.
-o port-monitor=name
Sets the binary communications program to use when printing, "none", "bcp", or "tbcp". The default program is "none". The specified port monitor must be listed in the printer's PPD file.
-o printer-error-policy=name
Sets the policy for errors such as printers that cannot be found or accessed, don't support the format being printed, fail during submission of the print data, or cause one or more filters to crash. The name must be one of "abort-job" (abort the job on error), "retry-job" (retry the job at a future time), "retry-current-job" (retry the current job immediately), or "stop-printer" (stop the printer on error). The default error policy is "stop-printer" for printers and "retry-current-job" for classes.
-o printer-is-shared=true
-o printer-is-shared=false
Sets the destination to shared/published or unshared/unpublished. Shared/published destinations are publicly announced by the server on the LAN based on the browsing configuration in cupsd.conf, while unshared/unpublished destinations are not announced. The default value is "true".
-o printer-op-policy=name
Sets the IPP operation policy associated with the destination. The name must be defined in the cupsd.conf in a Policy section. The default operation policy is "default".
-R name-default
Deletes the named option from printer.
-r class
Removes the named printer from class. If the resulting class becomes empty it is removed.
-u allow:{user|@group}{,user|,@group}*
-u deny:{user|@group}{,user|,@group}*
-u allow:all
-u deny:none
Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX groups. The latter two forms turn user-level access control off. Note: The user 'root' is not granted special access - using "-u allow:foo,bar" will allow users 'foo' and 'bar' to access the printer but NOT 'root'.
-v "device-uri"
Sets the device-uri attribute of the printer queue. Use the -v option with the lpinfo(8) command to get a list of supported device URIs and schemes.
-D "info"
Provides a textual description of the destination.
-E
When specified before the -d, -p, or -x options, forces the use of TLS encryption on the connection to the scheduler. Otherwise, enables the destination and accepts jobs; this is the same as running the cupsaccept(8) and cupsenable(8) programs on the destination.
-L "location"
Provides a textual location of the destination.

Deprecated Options

The following lpadmin options are deprecated:
-i filename
This option historically has been used to provide either a System V interface script or (as an implementation side-effect) a PPD file. Note: Interface scripts are not supported by CUPS. PPD files and printer drivers are deprecated and will not be supported in a future version of CUPS.
-P ppd-file
Specifies a PostScript Printer Description (PPD) file to use with the printer. Note: PPD files and printer drivers are deprecated and will not be supported in a future version of CUPS.

Conforming To

Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are not case-sensitive.

Finally, the CUPS version of lpadmin may ask the user for an access password depending on the printing system configuration. This differs from the System V version which requires the root user to execute this command.

Notes

CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

The CUPS version of lpadmin does not support all of the System V or Solaris printing system configuration options.

Interface scripts are not supported for security reasons.

The double meaning of the -E option is an unfortunate historical oddity.

The lpadmin command communicates with the scheduler (cupsd) to make changes to the printing system configuration. This configuration information is stored in several files including printers.conf and classes.conf. These files should not be edited directly and are an implementation detail of CUPS that is subject to change at any time.

Example

Create an IPP Everywhere print queue:

    lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere

See Also

cupsaccept(8), cupsenable(8), lpinfo(8), lpoptions(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpmove.html000664 000765 000024 00000003637 13574721672 017246 0ustar00mikestaff000000 000000 lpmove(8)

lpmove(8)

Name

lpmove - move a job or all jobs to a new destination

Synopsis

lpmove [ -E ] [ -h server[:port] ] [ -U username ] job destination
lpmove [ -E ] [ -h server[:port] ] [ -U username ] source destination

Description

lpmove moves the specified job or all jobs from source to destination. job can be the job ID number or the old destination and job ID.

Options

The lpmove command supports the following options:
-E
Forces encryption when connecting to the server.
-U username
Specifies an alternate username.
-h server[:port]
Specifies an alternate server.

Examples

Move job 123 from "oldprinter" to "newprinter":

    lpmove 123 newprinter

            or

    lpmove oldprinter-123 newprinter

Move all jobs from "oldprinter" to "newprinter":

    lpmove oldprinter newprinter

See Also

cancel(1), lp(1), lpr(1), lprm(1),
CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-backend.html000664 000765 000024 00000022547 13574721672 017334 0ustar00mikestaff000000 000000 backend(7)

backend(7)

Name

backend - cups backend transmission interfaces

Synopsis

backend
backend job user title num-copies options [ filename ]

#include <cups/cups.h>

const char *cupsBackendDeviceURI(char **argv);

void cupsBackendReport(const char *device_scheme,
                       const char *device_uri,
                       const char *device_make_and_model,
                       const char *device_info,
                       const char *device_id,
                       const char *device_location);

ssize_t cupsBackChannelWrite(const char *buffer,
                             size_t bytes, double timeout);

int cupsSideChannelRead(cups_sc_command_t *command,
                        cups_sc_status_t *status, char *data,
                        int *datalen, double timeout);

int cupsSideChannelWrite(cups_sc_command_t command,
                         cups_sc_status_t status, const char *data,
                         int datalen, double timeout);

Description

Backends are a special type of filter(7) which is used to send print data to and discover different devices on the system.

Like filters, backends must be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the physical interface.

The command name (argv[0]) is set to the device URI of the destination printer. Authentication information in argv[0] is removed, so backend developers are urged to use the DEVICE_URI environment variable whenever authentication information is required. The cupsBackendDeviceURI() function may be used to retrieve the correct device URI.

Back-channel data from the device should be relayed to the job filters using the cupsBackChannelWrite function.

Backends are responsible for reading side-channel requests using the cupsSideChannelRead() function and responding with the cupsSideChannelWrite() function. The CUPS_SC_FD constant defines the file descriptor that should be monitored for incoming requests.

Device Discovery

When run with no arguments, the backend should list the devices and schemes it supports or is advertising to the standard output. The output consists of zero or more lines consisting of any of the following forms:

    device-class scheme "Unknown" "device-info"
    device-class device-uri "device-make-and-model" "device-info"
    device-class device-uri "device-make-and-model" "device-info" "device-id"
    device-class device-uri "device-make-and-model" "device-info" "device-id" "device-location"

The cupsBackendReport() function can be used to generate these lines and handle any necessary escaping of characters in the various strings.

The device-class field is one of the following values:

direct
The device-uri refers to a specific direct-access device with no options, such as a parallel, USB, or SCSI device.
file
The device-uri refers to a file on disk.
network
The device-uri refers to a networked device and conforms to the general form for network URIs.
serial
The device-uri refers to a serial device with configurable baud rate and other options. If the device-uri contains a baud value, it represents the maximum baud rate supported by the device.

The scheme field provides the URI scheme that is supported by the backend. Backends should use this form only when the backend supports any URI using that scheme. The device-uri field specifies the full URI to use when communicating with the device.

The device-make-and-model field specifies the make and model of the device, e.g. "Example Foojet 2000". If the make and model is not known, you must report "Unknown".

The device-info field specifies additional information about the device. Typically this includes the make and model along with the port number or network address, e.g. "Example Foojet 2000 USB #1".

The optional device-id field specifies the IEEE-1284 device ID string for the device, which is used to select a matching driver.

The optional device-location field specifies the physical location of the device, which is often used to pre-populate the printer-location attribute when adding a printer.

Permissions

Backends without world read and execute permissions are run as the root user. Otherwise, the backend is run using an unprivileged user account, typically "lp".

Exit Status

The following exit codes are defined for backends:
CUPS_BACKEND_OK
The print file was successfully transmitted to the device or remote server.
CUPS_BACKEND_FAILED

The print file was not successfully transmitted to the device or remote server. The scheduler will respond to this by canceling the job, retrying the job, or stopping the queue depending on the state of the printer-error-policy attribute.
CUPS_BACKEND_AUTH_REQUIRED
The print file was not successfully transmitted because valid authentication information is required. The scheduler will respond to this by holding the job and adding the 'cups-held-for-authentication' keyword to the "job-reasons" Job Description attribute.
CUPS_BACKEND_HOLD
The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by holding the job.
CUPS_BACKEND_STOP
The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by stopping the queue.
CUPS_BACKEND_CANCEL
The print file was not successfully transmitted because one or more attributes are not supported or the job was canceled at the printer. The scheduler will respond to this by canceling the job.
CUPS_BACKEND_RETRY
The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job at a future time - other jobs may print before this one.
CUPS_BACKEND_RETRY_CURRENT
The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job immediately without allowing intervening jobs.

All other exit code values are reserved.

Environment

In addition to the environment variables listed in cups(1) and filter(7), CUPS backends can expect the following environment variable:
DEVICE_URI
The device URI associated with the printer.

Files

/etc/cups/cups-files.conf

Notes

CUPS backends are not generally designed to be run directly by the user. Aside from the device URI issue ( argv[0] and DEVICE_URI environment variable contain the device URI), CUPS backends also expect specific environment variables and file descriptors, and typically run in a user session that (on macOS) has additional restrictions that affect how it runs. Backends can also be installed with restricted permissions (0500 or 0700) that tell the scheduler to run them as the "root" user instead of an unprivileged user (typically "lp") on the system.

Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the lp(1) or lpr(1) programs to send print jobs or lpinfo(8) to query for available printers using the backend. The one exception is the SNMP backend - see cups-snmp(8) for more information.

Notes

CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

cups(1), cups-files.conf(5), cups-snmp(8), cupsd(8), filter(7), lp(1), lpinfo(8), lpr(1),
CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/spec-design.html000664 000765 000024 00000032060 13574721672 017364 0ustar00mikestaff000000 000000 CUPS Design Description

CUPS Design Description

This design description documents the overall organization of CUPS. The purpose is not to provide a line-by-line description of the CUPS source code, but rather to describe the overall architecture and location of key pieces so that developers can more easily understand the underlying operation of CUPS.

Introduction

Like most printing systems, CUPS is designed around a central print scheduling process that dispatches print jobs, processes administrative commands, provides printer status information to local and remote programs, and informs users as needed. Figure 1 shows the basic organization of CUPS.

Scheduler

The scheduler is a HTTP/1.1 and IPP/2.1 server application that manages HTTP and IPP requests, printers, classes, jobs, subscriptions, and notifications on the system. HTTP is used for normal web browser services as well as IPP operation messages passed via HTTP POST requests with the application/ipp content type. The scheduler uses a series of helper applications based on the Common Gateway Interface ("CGI") to provide dynamic web interfaces and can be configured to run additional site-specific programs or scripts for the web interface.

The scheduler is designed as a traditional single-threaded server process which runs external processes to do longer-term operations such as printing, notification, device/driver enumeration, and remote printer monitoring. External processes are normally run as a non-privileged account ("lp") and, on some platforms, with additional restrictions that limit what the processes are allowed to do.

The maximum number of simultaneous clients and print jobs that can be supported is primarily limited by the available server memory, file descriptors, and CPU - the scheduler itself imposes no hard limits.

Figure 1: CUPS Block Diagram
CUPS Block Diagram

Config Files

The scheduler uses several configuration files to store the server settings (cupsd.conf), available classes (classes.conf), available printers (printers.conf), current notification subscriptions (subscriptions.conf), and supported file types and filters (mime.types, mime.convs). In addition, PostScript Printer Description ("PPD") files are associated with each printer, and the scheduler has cache files for remote printers, PPD files, and current jobs to optimize the scheduler's startup speed and availability.

Job Files

The scheduler stores job files in a spool directory, typically /var/spool/cups. Two types of files will be found in the spool directory: control files starting with the letter "c" ("c00001", "c99999", "c100000", etc.) and data files starting with the letter "d" ("d00001-001", "d99999-001", "d100000-001", etc.) Control files are IPP messages based on the original IPP Print-Job or Create-Job messages, while data files are the original print files that were submitted for printing. There is one control file for every job known to the system and 0 or more data files for each job.

Control files are normally cleaned out after the 500th job is submitted, while data files are removed immediately after a job has successfully printed. Both behaviors can be configured.

Log Files

The scheduler keeps three kinds of log files which are normally stored in the /var/log/cups directory. The access_log file lists every HTTP and IPP request that is processed by the scheduler. The error_log file contains messages from the scheduler and its helper applications that can be used to track down problems. The page_log file lists every page that is printed, allowing for simple print accounting.

Log files are rotated automatically by the scheduler when they reach the configured size limit, by default 1MB. If the limit is set to 0 then no rotation is performed in the scheduler - this mode is often used by Linux distributions so they can use the logrotated(8) program to rotate them instead.

Berkeley Commands

CUPS provides the Berkeley lpc(8), lpq(1), lpr(1), and lprm(1) commands. In general, they function identically to the original Berkeley commands with the following exceptions:

  1. The lpc command currently only supports the "status" sub-command.
  2. The lpr command does not support the format modifier options "1" (TROFF font set 1), "2" (TROFF font set 2), "3" (TROFF font set 3), "4" (TROFF font set 4), "c" (CIFPLOT), "d" (DVI), "f" (FORTRAN), "g" (GNU plot), "i" (indentation), "n" (Ditroff), "r" (Sun raster), "t" (Troff), or "w" (width), as they do not map to the IPP MIME media type based document formats.

System V Commands

CUPS provides the System V cancel(1), lp(1), lpadmin(8), lpmove(8), and lpstat(1) commands. In general, they function identically to the original System V commands with the following exceptions:

  1. All commands may ask for a password; the System V print spooler requires root access to perform administration tasks, while CUPS allows for more flexible configurations.
  2. The lpadmin command does not implement the Solaris "-A" (alert), "-F" (fault recovery), "-M" (mount form/wheel), "-P" (paper list), "-S" (print wheels), "-T" (type list), "-U" (dialer info), "-W" (wait), "-f" (form name), "-l" (content-type list), "-s" (remote printer), or "-t" (number of trays) options.

CUPS Commands

CUPS provides the cupsaccept(8), cupsaddsmb(8), cupsdisable(8), cupsenable(8), cupsreject(8), cupstestppd(1), lpinfo(8), and lppasswd(1) commands. The cupsaccept, cupsdisable, cupsenable, and cupsreject commands correspond to the System V accept, disable, enable, and reject commands but have been renamed to avoid confusion and conflicts with the bash(1) internal enable command of the same name.

LPD Support

LPD client support is provided via the cups-lpd(8) program. Incoming LPD requests are accepted on TCP port 515 by the local inetd(8), launchd(8), or xinetd(8) process and forwarded to the cups-lpd program for conversion to the corresponding IPP request(s).

The cups-lpd program conforms, for the most part, to RFC 1179: Line Printer Daemon Protocol, but does not enforce the privileged source port restriction specified in that document. In addition, the banner page and output format options are usually overridden via command-line options to the cups-lpd program when it is invoked by the corresponding super-daemon program.

Web Interface

The web interface is supported by five CGI programs. Table 1 describes the purpose of each of the programs.

Table 1: CGI Programs
Program Location Description
admin.cgi /admin Provides all of the administrative functions
classes.cgi /classes Lists classes and provides class management functions
help.cgi /help Provides access to online help documents
jobs.cgi /jobs Lists jobs and provides job management functions
printers.cgi /printers Lists printers and provides printer management functions

Notifiers

Notifiers (notifier(7)) provide the means for sending asynchronous event notifications from the scheduler. Notifiers are executed with the recipient information on the command-line and the event data on the standard input. For example:

CUPS_SERVERBIN/notifier/foo recipient user-data

CUPS includes two notifiers: mailto to provide SMTP-based email notifications and rss to provide Really Simple Syndication ("RSS") notifications from the scheduler. Additional notifiers can be installed in the notifier directory as needed to support other methods.

Filters

Filters (filter(7)) convert job files into a printable format. Multiple filters are run, as needed, to convert from the job file format to the printable format. A filter program reads from the standard input or from a file if a filename is supplied. All filters must support a common set of options including printer name, job ID, username, job title, number of copies, and job options. All output is sent to the standard output.

CUPS provides filters for printing text, PostScript, PDF, HP-GL/2, and many types of image files. CUPS also provides printer driver filters for HP-PCL, ESC/P, and several types of label printers. Additional filters can be registered with CUPS via mime.convs and PPD files.

Port Monitors

Port monitors handle the device- and channel-specific data formatting for a printer. Port monitors use the same interface as filters.

CUPS includes two port monitors: the bcp port monitor which supports the PostScript Binary Communications Protocol ("BCP") and the tbcp port monitor which supports the PostScript Tagged Binary Communications Protocol ("TBCP"). Additional port monitors can be registered in PPD files.

Backends

Backends (backend(7)) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.

CUPS includes backends for AppSocket (JetDirect), IPP, LPD, and USB connections and DNS-SD and SNMP for discovery. Additional backends can be added as needed without additional configuration.

Programming Interfaces

CUPS makes use of several general-purpose libraries to provide its printing services. Unlike the rest of CUPS, the libraries are provided under the terms of the GNU LGPL so they may be used by non-GPL applications.

CUPS Library (libcups)

The CUPS library contains all of the core HTTP and IPP communications code as well as convenience functions for queuing print jobs, getting printer information, accessing resources via HTTP and IPP, and manipulating PPD files. The scheduler and all commands, filters, and backends use this library.

CUPS CGI Library (libcupscgi)

The CUPS CGI library provides all of the web interface support functions. It is used by the CGI programs to provide the CUPS web interface.

CUPS Driver Library (libcupsdriver)

The CUPS driver library provides access to the dithering, color conversion, and helper functions used by the CUPS sample printer drivers.

CUPS Imaging Library (libcupsimage)

The CUPS imaging library provides functions for managing large images, doing colorspace conversion and color management, scaling images for printing, and managing raster page streams. It is used by the CUPS image file filters, the PostScript RIP, and all raster printers drivers.

CUPS MIME Library (libcupsmime)

The CUPS MIME library provides file typing and conversion functions and is used by the scheduler and cupsfilter(8) command to auto-type and convert print files to a printable format.

CUPS PPD Compiler Library (libcupsppdc)

The CUPS PPD compiler library provides access to driver information files and is used by the PPD compiler tools as well as the cups-driverd(8) helper program to generate PPD files and message catalogs for localization.

cups-2.3.1/doc/help/man-cupstestppd.html000664 000765 000024 00000011521 13574721672 020311 0ustar00mikestaff000000 000000 cupstestppd(1)

cupstestppd(1)

Name

cupstestppd - test conformance of ppd files

Synopsis

cupstestppd [ -I category ] [ -R rootdir ] [ -W category ] [ -q ] [ -r ] [ -v[v] ] filename.ppd[.gz] [ ... filename.ppd[.gz] ]
cupstestppd [ -R rootdir ] [ -W category ] [ -q ] [ -r ] [ -v[v] ] -

Description

cupstestppd tests the conformance of PPD files to the Adobe PostScript Printer Description file format specification version 4.3. It can also be used to list the supported options and available fonts in a PPD file. The results of testing and any other output are sent to the standard output.

The first form of cupstestppd tests one or more PPD files on the command-line. The second form tests the PPD file provided on the standard input.

Options

cupstestppd supports the following options:
-I filename
Ignores all PCFileName warnings.
-I filters
Ignores all filter errors.
-I profiles
Ignores all profile errors.
-R rootdir
Specifies an alternate root directory for the filter, pre-filter, and other support file checks.
-W constraints
Report all UIConstraint errors as warnings.
-W defaults
Except for size-related options, report all default option errors as warnings.
-W filters
Report all filter errors as warnings.
-W profiles
Report all profile errors as warnings.
-W sizes
Report all media size errors as warnings.
-W translations
Report all translation errors as warnings.
-W all
Report all of the previous errors as warnings.
-W none
Report all of the previous errors as errors.
-q
Specifies that no information should be displayed.
-r
Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors.
-v
Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status.
-vv
Specifies that all information in the PPD file should be displayed in addition to the detailed conformance testing results.

The -q, -v, and -vv options are mutually exclusive.

Exit Status

cupstestppd returns zero on success and non-zero on error. The error codes are as follows:
1
Bad command-line arguments or missing PPD filename.
2
Unable to open or read PPD file.
3
The PPD file contains format errors that cannot be skipped.
4
The PPD file does not conform to the Adobe PPD specification.

Examples

The following command will test all PPD files under the current directory and print the names of each file that does not conform:

    find . -name \*.ppd \! -exec cupstestppd -q '{}' \; -print

The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform:

    find . -name \*.ppd \! -exec cupstestppd -q '{}' \; \
        -exec cupstestppd -v '{}' \;

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

lpadmin(8), CUPS Online Help (http://localhost:631/help), Adobe PostScript Printer Description File Format Specification, Version 4.3.

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/options.html000664 000765 000024 00000040662 13574721672 016665 0ustar00mikestaff000000 000000 Command-Line Printing and Options

Command-Line Printing and Options

CUPS provides both the System V (lp(1)) and Berkeley (lpr(1)) printing commands for printing files. In addition, it supported a large number of standard and printer-specific options that allow you to control how and where files are printed.

Printing Files

CUPS understands many different types of files directly, including text, PostScript, PDF, and image files. This allows you to print from inside your applications or at the command-line, whichever is most convenient! Type either of the following commands to print a file to the default (or only) printer on the system:

lp filename
lpr filename

Choosing a Printer

Many systems will have more than one printer available to the user. These printers can be attached to the local system via a parallel, serial, or USB port, or available over the network. Use the lpstat(1) command to see a list of available printers:

lpstat -p -d

The -p option specifies that you want to see a list of printers, and the -d option reports the current default printer or class.

Use the -d option with the lp command to print to a specific printer:

lp -d printer filename

or the -P option with the lpr command:

lpr -P printer filename

Setting the Default Printer

If you normally use a particular printer, you can tell CUPS to use it by default using the lpoptions(1) command:

lpoptions -d printer

Printing the Output of a Program

Both the lp and lpr commands support printing from the standard input:

program | lp
program | lp -d printer
program | lpr
program | lpr -P printer

If the program does not provide any output, then nothing will be queued for printing.

Specifying Printer Options

For many types of files, the default printer options may be sufficient for your needs. However, there may be times when you need to change the options for a particular file you are printing.

The lp and lpr commands allow you to pass printer options using the -o option:

lp -o landscape -o fit-to-page -o media=A4 filename.jpg
lpr -o landscape -o fit-to-page -o media=A4 filename.jpg

The available printer options vary depending on the printer. The standard options are described in the "Standard Printing Options" section below. Printer-specific options are also available and can be listed using the lpoptions command:

lpoptions -p printer -l

Creating Saved Options

Saved options are supported in CUPS through printer instances. Printer instances are, as their name implies, copies of a printer that have certain options associated with them. Use the lpoptions command to create a printer instance:

lpoptions -p printer/instance -o name=value ...

The -p printer/instance option provides the name of the instance, which is always the printer name, a slash, and the instance name which can contain any printable characters except space and slash. The remaining options are then associated with the instance instead of the main queue. For example, the following command creates a duplex instance of the LaserJet queue:

lpoptions -p LaserJet/duplex -o sides=two-sided-long-edge

Instances do not inherit lpoptions from the main queue.

Printing Multiple Copies

Both the lp and lpr commands have options for printing more than one copy of a file:

lp -n num-copies filename
lpr -#num-copies filename

Copies are normally not collated for you. Use the -o collate=true option to get collated copies:

lp -n num-copies -o collate=true filename
lpr -#num-copies -o collate=true filename

Canceling a Print Job

The cancel(1) and lprm(1) commands cancel a print job:

cancel job-id
lprm job-id

The job-id is the number that was reported to you by the lp command. You can also get the job ID using the lpq(1) or lpstat commands:

lpq
lpstat

Moving a Print Job

The lpmove(8) command moves a print job to a new printer or class:

lpmove job-id destination

The job-id is the number that was reported to you by the lp or lpstat commands. Destination is the name of a printer or class that you want to actually print the job.

Note:

The lpmove command is located in the system command directory (typically /usr/sbin or /usr/local/sbin), and so may not be in your command path. Specify the full path to the command if you get a "command not found" error, for example:

/usr/sbin/lpmove foo-123 bar

Standard Printing Options

The following options apply when printing all types of files.

Selecting the Media Size, Type, and Source

The -o media=xyz option sets the media size, type, and/or source:

lp -o media=Letter filename
lp -o media=Letter,MultiPurpose filename
lpr -o media=Letter,Transparency filename
lpr -o media=Letter,MultiPurpose,Transparency filename

The available media sizes, types, and sources depend on the printer, but most support the following options (case is not significant):

  • Letter - US Letter (8.5x11 inches, or 216x279mm)
  • Legal - US Legal (8.5x14 inches, or 216x356mm)
  • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm)
  • COM10 - US #10 Envelope (9.5x4.125 inches, or 241x105mm)
  • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
  • Transparency - Transparency media type or source
  • Upper - Upper paper tray
  • Lower - Lower paper tray
  • MultiPurpose - Multi-purpose paper tray
  • LargeCapacity - Large capacity paper tray

The actual options supported are defined in the printer's PPD file in the PageSize, InputSlot, and MediaType options. You can list them using the lpoptions(1) command:

lpoptions -p printer -l

When Custom is listed for the PageSize option, you can specify custom media sizes using one of the following forms:

lp -o media=Custom.WIDTHxLENGTH filename
lp -o media=Custom.WIDTHxLENGTHin filename
lp -o media=Custom.WIDTHxLENGTHcm filename
lp -o media=Custom.WIDTHxLENGTHmm filename

where "WIDTH" and "LENGTH" are the width and length of the media in points, inches, centimeters, or millimeters, respectively.

Setting the Orientation

The -o landscape option will rotate the page 90 degrees to print in landscape orientation:

lp -o landscape filename
lpr -o landscape filename

The -o orientation-requested=N option rotates the page depending on the value of N:

  • -o orientation-requested=3 - portrait orientation (no rotation)
  • -o orientation-requested=4 - landscape orientation (90 degrees)
  • -o orientation-requested=5 - reverse landscape or seascape orientation (270 degrees)
  • -o orientation-requested=6 - reverse portrait or upside-down orientation (180 degrees)

Printing On Both Sides of the Paper

The -o sides=two-sided-short-edge and -o sides=two-sided-long-edge options will enable two-sided printing on the printer if the printer supports it. The -o sides=two-sided-short-edge option is suitable for landscape pages, while the -o sides=two-sided-long-edge option is suitable for portrait pages:

lp -o sides=two-sided-short-edge filename
lp -o sides=two-sided-long-edge filename
lpr -o sides=two-sided-long-edge filename

The default is to print single-sided:

lp -o sides=one-sided filename
lpr -o sides=one-sided filename

Selecting the Banner Page(s)

The -o job-sheets=start,end option sets the banner page(s) to use for a job:

lp -o job-sheets=none filename
lp -o job-sheets=standard filename
lpr -o job-sheets=classified,classified filename

If only one banner file is specified, it will be printed before the files in the job. If a second banner file is specified, it is printed after the files in the job.

The available banner pages depend on the local system configuration; CUPS includes the following banner files:

  • none - Do not produce a banner page.
  • classified - A banner page with a "classified" label at the top and bottom.
  • confidential - A banner page with a "confidential" label at the top and bottom.
  • secret - A banner page with a "secret" label at the top and bottom.
  • standard - A banner page with no label at the top and bottom.
  • topsecret - A banner page with a "top secret" label at the top and bottom.
  • unclassified - A banner page with an "unclassified" label at the top and bottom.

Holding Jobs for Later Printing

The -o job-hold-until=when option tells CUPS to delay printing until the "when" time, which can be one of the following:

  • -o job-hold-until=indefinite; print only after released by the user or an administrator
  • -o job-hold-until=day-time; print from 6am to 6pm local time
  • -o job-hold-until=night; print from 6pm to 6am local time
  • -o job-hold-until=second-shift; print from 4pm to 12am local time
  • -o job-hold-until=third-shift; print from 12am to 8am local time
  • -o job-hold-until=weekend; print on Saturday or Sunday
  • -o job-hold-until=HH:MM; print at the specified UTC time

Releasing Held Jobs

Aside from the web interface, you can use the lp command to release a held job:

lp -i job-id -H resume

where "job-id" is the job ID reported by the lpstat command.

Setting the Job Priority

The -o job-priority=NNN option tells CUPS to assign a priority to your job from 1 (lowest) to 100 (highest), which influences where the job appears in the print queue. Higher priority jobs are printed before lower priority jobs, however submitting a new job with a high priority will not interrupt an already printing job.

Specifying the Output Order

The -o outputorder=normal and -o outputorder=reverse options specify the order of the pages. Normal order prints page 1 first, page 2 second, and so forth. Reverse order prints page 1 last.

Selecting a Range of Pages

The -o page-ranges=pages option selects a range of pages for printing:

lp -o page-ranges=1 filename
lp -o page-ranges=1-4 filename
lp -o page-ranges=1-4,7,9-12 filename
lpr -o page-ranges=1-4,7,9-12 filename

As shown above, the pages value can be a single page, a range of pages, or a collection of page numbers and ranges separated by commas. The pages will always be printed in ascending order, regardless of the order of the pages in the page-ranges option.

The default is to print all pages.

Note:

The page numbers used by page-ranges refer to the output pages and not the document's page numbers. Options like number-up can make the output page numbering not match the document page numbers.

N-Up Printing

The -o number-up=value option selects N-Up printing. N-Up printing places multiple document pages on a single printed page. CUPS supports 1, 2, 4, 6, 9, and 16-Up formats; the default format is 1-Up:

lp -o number-up=1 filename
lp -o number-up=2 filename
lp -o number-up=4 filename
lpr -o number-up=16 filename

The -o page-border=value option chooses the border to draw around each page:

  • -o page-border=double; draw two hairline borders around each page
  • -o page-border=double-thick; draw two 1pt borders around each page
  • -o page-border=none; do not draw a border (default)
  • -o page-border=single; draw one hairline border around each page
  • -o page-border=single-thick; draw one 1pt border around each page

The -o number-up-layout=value option chooses the layout of the pages on each output page:

  • -o number-up-layout=btlr; Bottom to top, left to right
  • -o number-up-layout=btrl; Bottom to top, right to left
  • -o number-up-layout=lrbt; Left to right, bottom to top
  • -o number-up-layout=lrtb; Left to right, top to bottom (default)
  • -o number-up-layout=rlbt; Right to left, bottom to top
  • -o number-up-layout=rltb; Right to left, top to bottom
  • -o number-up-layout=tblr; Top to bottom, left to right
  • -o number-up-layout=tbrl; Top to bottom, right to left

Scaling to Fit

The -o fit-to-page option specifies that the document should be scaled to fit on the page:

lp -o fit-to-page filename
lpr -o fit-to-page filename

The default is to use the size specified in the file.

Note:

This feature depends upon an accurate size in the print file. If no size is given in the file, the page may be scaled incorrectly!

Printing in Reverse Order

The -o outputorder=reverse option will print the pages in reverse order:

lp -o outputorder=reverse filename
lpr -o outputorder=reverse filename

Similarly, the -o outputorder=normal option will print starting with page 1:

lp -o outputorder=normal filename
lpr -o outputorder=normal filename

The default is -o outputorder=normal for printers that print face down and -o outputorder=reverse for printers that print face up.

Printing Mirrored Pages

The -o mirror option flips each page along the vertical axis to produce a mirrored image:

lp -o mirror filename
lpr -o mirror filename

This is typically used when printing on T-shirt transfer media or sometimes on transparencies.

cups-2.3.1/doc/help/ppd-compiler.html000664 000765 000024 00000132207 13574721672 017562 0ustar00mikestaff000000 000000 Introduction to the PPD Compiler

Introduction to the PPD Compiler

This document describes how to use the CUPS PostScript Printer Description (PPD) file compiler. The PPD compiler generates PPD files from simple text files that describe the features and capabilities of one or more printers.

Note:

The PPD compiler and related tools are deprecated and will be removed in a future release of CUPS.

The Basics

The PPD compiler, ppdc(1), is a simple command-line tool that takes a single driver information file, which by convention uses the extension .drv, and produces one or more PPD files that may be distributed with your printer drivers for use with CUPS. For example, you would run the following command to create the English language PPD files defined by the driver information file mydrivers.drv:

ppdc mydrivers.drv

The PPD files are placed in a subdirectory called ppd. The -d option is used to put the PPD files in a different location, for example:

ppdc -d myppds mydrivers.drv

places the PPD files in a subdirectory named myppds. Finally, use the -l option to specify the language localization for the PPD files that are created, for example:

ppdc -d myppds/de -l de mydrivers.drv
ppdc -d myppds/en -l en mydrivers.drv
ppdc -d myppds/es -l es mydrivers.drv
ppdc -d myppds/fr -l fr mydrivers.drv
ppdc -d myppds/it -l it mydrivers.drv

creates PPD files in German (de), English (en), Spanish (es), French (fr), and Italian (it) in the corresponding subdirectories. Specify multiple languages (separated by commas) to produce "globalized" PPD files:

ppdc -d myppds -l de,en,es,fr,it mydrivers.drv

Driver Information Files

The driver information files accepted by the PPD compiler are plain text files that define the various attributes and options that are included in the PPD files that are generated. A driver information file can define the information for one or more printers and their corresponding PPD files.

Listing 1: "examples/minimum.drv"

// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

A Simple Example

The example in Listing 1 shows a driver information file which defines the minimum required attributes to provide a valid PPD file. The first part of the file includes standard definition files for fonts and media sizes:

#include <font.defs>
#include <media.defs>

The #include directive works just like the C/C++ include directive; files included using the angle brackets (<filename>) are found in any of the standard include directories and files included using quotes ("filename") are found in the same directory as the source or include file. The <font.defs> include file defines the standard fonts which are included with GPL Ghostscript and the Apple PDF RIP, while the <media.defs> include file defines the standard media sizes listed in Appendix B of the Adobe PostScript Printer Description File Format Specification.

CUPS provides several other standard include files:

  • <epson.h> - Defines all of the rastertoepson driver constants.
  • <escp.h> - Defines all of the rastertoescpx driver constants.
  • <hp.h> - Defines all of the rastertohp driver constants.
  • <label.h> - Defines all of the rastertolabel driver constants.
  • <pcl.h> - Defines all of the rastertopclx driver constants.
  • <raster.defs> - Defines all of the CUPS raster format constants.

Next we list all of the fonts that are available in the driver; for CUPS raster drivers, the following line is all that is usually supplied:

Font *

The Font directive specifies the name of a single font or the asterisk to specify all fonts. For example, you would use the following line to define an additional bar code font that you are supplying with your printer driver:

//   name         encoding  version  charset  status
Font Barcode-Foo  Special   "(1.0)"  Special  ROM

The name of the font is Barcode-Foo. Since it is not a standard text font, the encoding and charset name Special is used. The version number is 1.0 and the status (where the font is located) is ROM to indicate that the font does not need to be embedded in documents that use the font for this printer.

Third comes the manufacturer, model name, and version number information strings:

Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

These strings are used when the user (or auto-configuration program) selects the printer driver for a newly connected device.

The list of filters comes after the information strings; for the example in Listing 1, we have a single filter that takes CUPS raster data:

Filter application/vnd.cups-raster 100 rastertofoo

Each filter specified in the driver information file is the equivalent of a printer driver for that format; if a user submits a print job in a different format, CUPS figures out the sequence of commands that will produce a supported format for the least relative cost.

Once we have defined the driver information we specify the supported options. For the example driver we support a single resolution of 600 dots per inch and two media sizes, A4 and Letter:

*MediaSize Letter
MediaSize A4

*Resolution k 8 0 0 0 "600dpi/600 DPI"

The asterisk in front of the MediaSize and Resolution directives specify that those option choices are the default. The MediaSize directive is followed by a media size name which is normally defined in the <media.defs> file and corresponds to a standard Adobe media size name. If the default media size is Letter, the PPD compiler will override it to be A4 for non-English localizations for you automatically.

The Resolution directive accepts several values after it as follows:

  1. Colorspace for this resolution, if any. In the example file, the colorspace k is used which corresponds to black. For printer drivers that support color printing, this field is usually specified as "-" for "no change".
  2. Bits per color. In the example file, we define 8 bits per color, for a continuous-tone grayscale output. All versions of CUPS support 1 and 8 bits per color. CUPS 1.2 and higher (macOS 10.5 and higher) also supports 16 bits per color.
  3. Rows per band. In the example file, we define 0 rows per band to indicate that our printer driver does not process the page in bands.
  4. Row feed. In the example, we define the feed value to be 0 to indicate that our printer driver does not interleave the output.
  5. Row step. In the example, we define the step value to be 0 to indicate that our printer driver does not interleave the output. This value normally indicates the spacing between the nozzles of an inkjet printer - when combined with the previous two values, it informs the driver how to stagger the output on the page to produce interleaved lines on the page for higher-resolution output.
  6. Choice name and text. In the example, we define the choice name and text to be "600dpi/600 DPI". The name and text are separated by slash (/) character; if no text is specified, then the name is used as the text. The PPD compiler parses the name to determine the actual resolution; the name can be of the form RESOLUTIONdpi for resolutions that are equal horizontally and vertically or HRESxVRESdpi for isometric resolutions. Only integer resolution values are supported, so a resolution name of 300dpi is valid while 300.1dpi is not.

Finally, the PCFileName directive specifies that the named PPD file should be written for the current driver definitions:

PCFileName "foojet2k.ppd"

The filename follows the directive and must conform to the Adobe filename requirements in the Adobe Postscript Printer Description File Format Specification. Specifically, the filename may not exceed 8 characters followed by the extension .ppd. The FileName directive can be used to specify longer filenames:

FileName "FooJet 2000"

Grouping and Inheritance

The previous example created a single PPD file. Driver information files can also define multiple printers by using the PPD compiler grouping functionality. Directives are grouped using the curly braces ({ and }) and every group that uses the PCFileName or FileName directives produces a PPD file with that name. Listing 2 shows a variation of the original example that uses two groups to define two printers that share the same printer driver filter but provide two different resolution options.

Listing 2: "examples/grouping.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and version
Manufacturer "Foo"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "1200dpi/1200 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2001"
  PCFileName "foojt2k1.ppd"
}

The second example is essentially the same as the first, except that each printer model is defined inside of a pair of curly braces. For example, the first printer is defined using:

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

The printer inherits all of the definitions from the parent group (the top part of the file) and adds the additional definitions inside the curly braces for that printer driver. When we define the second group, it also inherits the same definitions from the parent group but none of the definitions from the first driver. Groups can be nested to any number of levels to support variations of similar models without duplication of information.

Color Support

For printer drivers that support color printing, the ColorDevice and ColorModel directives should be used to tell the printing system that color output is desired and in what formats. Listing 3 shows a variation of the previous example which includes a color printer that supports printing at 300 and 600 DPI.

The key changes are the addition of the ColorDevice directive:

ColorDevice true

which tells the printing system that the printer supports color printing, and the ColorModel directives:

ColorModel Gray/Grayscale w chunky 0
*ColorModel RGB/Color rgb chunky 0

which tell the printing system which colorspaces are supported by the printer driver for color printing. Each of the ColorModel directives is followed by the option name and text (Gray/Grayscale and RGB/Color), the colorspace name (w and rgb), the color organization (chunky), and the compression mode number (0) to be passed to the driver. The option name can be any of the standard Adobe ColorModel names:

  • Gray - Grayscale output.
  • RGB - Color output, typically using the RGB colorspace, but without a separate black channel.
  • CMYK - Color output with a separate black channel.

Custom names can be used, however it is recommended that you use your vendor prefix for any custom names, for example "fooName".

The colorspace name can be any of the following universally supported colorspaces:

  • w - Luminance
  • rgb - Red, green, blue
  • k - Black
  • cmy - Cyan, magenta, yellow
  • cmyk - Cyan, magenta, yellow, black

The color organization can be any of the following values:

  • chunky - Color values are passed together on a line as RGB RGB RGB RGB
  • banded - Color values are passed separately on a line as RRRR GGGG BBBB; not supported by the Apple RIP filters
  • planar - Color values are passed separately on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB BBBB BBBB; not supported by the Apple RIP filters

The compression mode value is passed to the driver in the cupsCompression attribute. It is traditionally used to select an appropriate compression mode for the color model but can be used for any purpose, such as specifying a photo mode vs. standard mode.

Listing 3: "examples/color.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer and version
Manufacturer "Foo"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

{
  // Supported resolutions
  *Resolution k 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet 2000"
  PCFileName "foojet2k.ppd"
}

{
  // Supports color printing
  ColorDevice true

  // Supported colorspaces
  ColorModel Gray/Grayscale w chunky 0
  *ColorModel RGB/Color rgb chunky 0

  // Supported resolutions
  *Resolution - 8 0 0 0 "300dpi/300 DPI"
  Resolution - 8 0 0 0 "600dpi/600 DPI"

  // Specify the model name and filename...
  ModelName "FooJet Color"
  PCFileName "foojetco.ppd"
}

Defining Custom Options and Option Groups

The Group, Option, and Choice directives are used to define or select a group, option, or choice. Listing 4 shows a variation of the first example that provides two custom options in a group named "Footasm".

Listing 4: "examples/custom.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Option Group
Group "Footasm"

  // Boolean option
  Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
    *Choice True/Yes "<</cupsCompression 1>>setpagedevice"
    Choice False/No "<</cupsCompression 0>>setpagedevice"

  // Multiple choice option
  Option "fooOutputType/Output Quality" PickOne AnySetup 10
    *Choice "Auto/Automatic Selection"
            "<</OutputType(Auto)>>setpagedevice""
    Choice "Text/Optimize for Text"
            "<</OutputType(Text)>>setpagedevice""
    Choice "Graph/Optimize for Graphics"
            "<</OutputType(Graph)>>setpagedevice""
    Choice "Photo/Optimize for Photos"
            "<</OutputType(Photo)>>setpagedevice""

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

The custom group is introduced by the Group directive which is followed by the name and optionally text for the user:

Group "Footasm/Footastic Options"

The group name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length. The groups General, Extra, and InstallableOptions are predefined by CUPS; the general and extra groups are filled by the UI options defined by the PPD specification. The InstallableOptions group is reserved for options that define whether accessories for the printer (duplexer unit, finisher, stapler, etc.) are installed.

Once the group is specified, the Option directive is used to introduce a new option:

Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10

The directive is followed by the name of the option and any optional user text, the option type, the PostScript document group, and the sort order number. The option name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length.

The option type can be Boolean for true/false selections, PickOne for picking one of many choices, or PickMany for picking zero or more choices. Boolean options can have at most two choices with the names False and True. Pick options can have any number of choices, although for Windows compatibility reasons the number of choices should not exceed 255.

The PostScript document group is typically AnySetup, meaning that the option can be introduced at any point in the PostScript document. Other values include PageSetup to include the option before each page and DocumentSetup to include the option once at the beginning of the document.

The sort order number is used to sort the printer commands associated with each option choice within the PostScript document. This allows you to setup certain options before others as required by the printer. For most CUPS raster printer drivers, the value 10 can be used for all options.

Once the option is specified, each option choice can be listed using the Choice directive:

*Choice True/Yes "<</cupsCompression 1>>setpagedevice"
Choice False/No "<</cupsCompression 0>>setpagedevice"

The directive is followed by the choice name and optionally user text, and the PostScript commands that should be inserted when printing a file to this printer. The option name must conform to the PPD specification and cannot exceed 40 characters in length. If you specify user text, it cannot exceed 80 characters in length.

The PostScript commands are also interpreted by any RIP filters, so these commands typically must be present for all option choices. Most commands take the form:

<</name value>>setpagedevice

where name is the name of the PostScript page device attribute and value is the numeric or string value for that attribute.

Defining Constants

Sometimes you will want to define constants for your drivers so that you can share values in different groups within the same driver information file, or to share values between different driver information files using the #include directive. The #define directive is used to define constants for use in your printer definitions:

#define NAME value

The NAME is any sequence of letters, numbers, and the underscore. The value is a number or string; if the value contains spaces you must put double quotes around it, for example:

#define FOO "My String Value"

Constants can also be defined on the command-line using the -D option:

ppdc -DNAME="value" filename.drv

Once defined, you use the notation $NAME to substitute the value of the constant in the file, for example:

#define MANUFACTURER "Foo"
#define FOO_600      0
#define FOO_1200     1

{
  Manufacturer "$MANUFACTURER"
  ModelNumber $FOO_600
  ModelName "FooJet 2000"
  ...
}

{
  Manufacturer "$MANUFACTURER"
  ModelNumber $FOO_1200
  ModelName "FooJet 2001"
  ...
}

Numeric constants can be bitwise OR'd together by placing the constants inside parenthesis, for example:

// ModelNumber capability bits
#define DUPLEX 1
#define COLOR  2

...

{
  // Define a model number specifying the capabilities of the printer...
  ModelNumber ($DUPLEX $COLOR)
  ...
}

Conditional Statements

The PPD compiler supports conditional compilation using the #if, #elif, #else, and #endif directives. The #if and #elif directives are followed by a constant name or an expression. For example, to include a group of options when "ADVANCED" is defined:

#if ADVANCED
Group "Advanced/Advanced Options"
  Option "fooCyanAdjust/Cyan Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooMagentaAdjust/Magenta Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooYellowAdjust/Yellow Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
  Option "fooBlackAdjust/Black Adjustment"
    Choice "plus10/+10%" ""
    Choice "plus5/+5%" ""
    *Choice "none/No Adjustment" ""
    Choice "minus5/-5%" ""
    Choice "minus10/-10%" ""
#endif

Defining Constraints

Constraints are strings that are used to specify that one or more option choices are incompatible, for example two-sided printing on transparency media. Constraints are also used to prevent the use of uninstalled features such as the duplexer unit, additional media trays, and so forth.

The UIConstraints directive is used to specify a constraint that is placed in the PPD file. The directive is followed by a string using one of the following formats:

UIConstraints "*Option1 *Option2"
UIConstraints "*Option1 Choice1 *Option2"
UIConstraints "*Option1 *Option2 Choice2"
UIConstraints "*Option1 Choice1 *Option2 Choice2"

Each option name is preceded by the asterisk (*). If no choice is given for an option, then all choices except False and None will conflict with the other option and choice(s). Since the PPD compiler automatically adds reciprocal constraints (option A conflicts with option B, so therefore option B conflicts with option A), you need only specify the constraint once.

Listing 5: "examples/constraint.drv"


// Include standard font and media definitions
#include <font.defs>
#include <media.defs>

// List the fonts that are supported, in this case all standard fonts...
Font *

// Manufacturer, model name, and version
Manufacturer "Foo"
ModelName "FooJet 2000"
Version 1.0

// Each filter provided by the driver...
Filter application/vnd.cups-raster 100 rastertofoo

// Supported page sizes
*MediaSize Letter
MediaSize A4

// Supported resolutions
*Resolution k 8 0 0 0 "600dpi/600 DPI"

// Installable Option Group
Group "InstallableOptions/Options Installed"

  // Duplexing unit option
  Option "OptionDuplexer/Duplexing Unit" Boolean AnySetup 10
    Choice True/Installed ""
    *Choice "False/Not Installed" ""

// General Option Group
Group General

  // Duplexing option
  Option "Duplex/Two-Sided Printing" PickOne AnySetup 10
    *Choice "None/No" "<</Duplex false>>setpagedevice""
    Choice "DuplexNoTumble/Long Edge Binding"
           "<</Duplex true/Tumble false>>setpagedevice""
    Choice "DuplexTumble/Short Edge Binding"
           "<</Duplex true/Tumble true>>setpagedevice""

// Only allow duplexing if the duplexer is installed
UIConstraints "*Duplex *OptionDuplexer False"

// Specify the name of the PPD file we want to generate...
PCFileName "foojet2k.ppd"

Listing 5 shows a variation of the first example with an added Duplex option and installable option for the duplexer, OptionDuplex. A constraint is added at the end to specify that any choice of the Duplex option that is not None is incompatible with the "Duplexer Installed" option set to "Not Installed" (False):

UIConstraints "*Duplex *OptionDuplexer False"

Enhanced Constraints

CUPS 1.4 supports constraints between 2 or more options using the Attribute directive. cupsUIConstraints attributes define the constraints, while cupsUIResolver attributes define option changes to resolve constraints. For example, we can specify the previous duplex constraint with a resolver that turns off duplexing with the following two lines:

Attribute cupsUIConstraints DuplexOff "*Duplex *OptionDuplexer False"
Attribute cupsUIResolver DuplexOff "*Duplex None"

Localization

The PPD compiler provides localization of PPD files in different languages through message catalog files in the GNU gettext or Apple .strings formats. Each user text string and several key PPD attribute values such as LanguageVersion and LanguageEncoding are looked up in the corresponding message catalog and the translated text is substituted in the generated PPD files. One message catalog file can be used by multiple driver information files, and each file contains a single language translation.

The ppdpo Utility

While CUPS includes localizations of all standard media sizes and options in several languages, your driver information files may provide their own media sizes and options that need to be localized. CUPS provides a utility program to aid in the localization of drivers called ppdpo(1). The ppdpo program creates or updates a message catalog file based upon one or more driver information files. New messages are added with the word "TRANSLATE" added to the front of the translation string to make locating new strings for translation easier. The program accepts the message catalog filename and one or more driver information files.

For example, run the following command to create a new German message catalog called de.po for all of the driver information files in the current directory:

ppdpo -o de.po *.drv

If the file de.po already exists, ppdpo will update the contents of the file with any new messages that need to be translated. To create an Apple .strings file instead, specify the output filename with a .strings extension, for example:

ppdpo -o de.strings *.drv

Using Message Catalogs with the PPD Compiler

Once you have created a message catalog, use the #po directive to declare it in each driver information file. For example, to declare the German message catalog for a driver use:

#po de "de.po"  // German

In fact, you can use the #po directive as many times as needed:

#po de "de.po"  // German
#po es "es.po"  // Spanish
#po fr "fr.po"  // French
#po it "it.po"  // Italian
#po ja "ja.po"  // Japanese

The filename ("de.po", etc.) can be relative to the location of the driver information file or an absolute path. Once defined, the PPD compiler will automatically generate a globalized PPD for every language declared in your driver information file. To generate a single-language PPD file, simply use the -l option to list the corresponding locale, for example:

ppdc -l de -d ppd/de mydrivers.drv

to generate German PPD files.

cups-2.3.1/doc/help/man-printers.conf.html000664 000765 000024 00000002266 13574721672 020533 0ustar00mikestaff000000 000000 printers.conf(5)

printers.conf(5)

Name

printers.conf - printer configuration file for cups

Description

The printers.conf file defines the local printers that are available. It is normally located in the /etc/cups directory and is maintained by the cupsd(8) program. This file is not intended to be edited or managed manually.

Notes

The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

See Also

classes.conf(5), cups-files.conf(5), cupsd(8), cupsd.conf(5), mime.convs(5), mime.types(5), subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/policies.html000664 000765 000024 00000052401 13574721672 016773 0ustar00mikestaff000000 000000 Managing Operation Policies

Managing Operation Policies

Operation policies are the rules used for each IPP operation in CUPS. These rules include things like "user must provide a password", "user must be in the system group", "allow only from the local system", and so forth. Until CUPS 1.2, these rules were largely hardcoded and could only be customized at a very basic level.

CUPS 1.2 and later provides a fine-grained policy layer which allows you to completely redefine the rules for each operation and/or printer. Each policy is named and defines access control rules for each IPP operation. This document describes how to manage policies and their rules.

The Basics

Operation policies are used for all IPP requests sent to the scheduler and are evaluated after the Location based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use Location based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.

Policies are stored in the cupsd.conf file in Policy sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more Limit subsections which list the operations that are affected by the rules inside it. Listing 1 shows the default operation policy, appropriately called "default", that is shipped with CUPS.

The easiest way to add a policy to the cupsd.conf file is to use the web interface. Click on the Administration tab and then the Edit Configuration File button to edit the current cupsd.conf file. Click on the Save Changes button to save the changes and restart the scheduler. If you edit the cupsd.conf file from the console, make sure to restart the cupsd process before trying to use the new policy.

Listing 1: Default Operation Policy

 1    <Policy default>
 2      # Job-related operations must be done by the owner or an
      administrator...
 3      <Limit Send-Document Send-URI Hold-Job Release-Job
      Restart-Job Purge-Jobs Set-Job-Attributes
      Create-Job-Subscription Renew-Subscription
      Cancel-Subscription Get-Notifications Reprocess-Job
      Cancel-Current-Job Suspend-Current-Job Resume-Job
      CUPS-Move-Job CUPS-Get-Document>
 4        Require user @OWNER @SYSTEM
 5        Order deny,allow
 6      </Limit>
 7
 8      # All administration operations require an administrator
      to authenticate...
 9      <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class
      CUPS-Delete-Class CUPS-Set-Default>
10        AuthType Default
11        Require user @SYSTEM
12        Order deny,allow
13      </Limit>
14
15      # All printer operations require a printer operator
      to authenticate...
16      <Limit Pause-Printer Resume-Printer
      Set-Printer-Attributes Enable-Printer Disable-Printer
      Pause-Printer-After-Current-Job Hold-New-Jobs
      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
      Restart-Printer Shutdown-Printer Startup-Printer
      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
      CUPS-Reject-Jobs>
17        AuthType Default
18        Require user varies by OS
19        Order deny,allow
20      </Limit>
21
22      # Only the owner or an administrator can cancel or
      authenticate a job...
23      <Limit Cancel-Job CUPS-Authenticate-Job>
24        Require user @OWNER @SYSTEM
25        Order deny,allow
26      </Limit>
27
28      <Limit All>
29        Order deny,allow
30      </Limit>
31    </Policy>

The Default CUPS Operation Policy

The policy definition starts with an opening Policy directive:

 1    <Policy default>

The first Limit subsection defines the rules for IPP job operations:

 3      <Limit Send-Document Send-URI Hold-Job Release-Job
      Restart-Job Purge-Jobs Set-Job-Attributes
      Create-Job-Subscription Renew-Subscription
      Cancel-Subscription Get-Notifications Reprocess-Job
      Cancel-Current-Job Suspend-Current-Job Resume-Job
      CUPS-Move-Job CUPS-Get-Document>
 4        Require user @OWNER @SYSTEM
 5        Order deny,allow
 6      </Limit>

The operation names are listed on a single line with spaces separating them. Each name corresponds to the IPP operation described in any of the IETF or PWG standards documents for the Internet Printing Protocol. Table 1 lists all of the operations that have been defined along with their usage in CUPS.

The access control rules are listed after the Limit line and are the same as those used for Location sections. In this case, we require the owner of the job ("@OWNER") or a member of the SystemGroup ("@SYSTEM") to do the operation. Because we do not include an AuthType directive here, the user information can come from the IPP request itself or the authenticated username from the HTTP request. The administrative operations starting on line 9, however, do use the AuthType directive, and so administrative operations need to be authenticated:

 9      <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class
      CUPS-Delete-Class CUPS-Set-Default>
10        AuthType Default
11        Require user @SYSTEM
12        Order deny,allow
13      </Limit>
14
15      # All printer operations require a printer operator
      to authenticate...
16      <Limit Pause-Printer Resume-Printer
      Set-Printer-Attributes Enable-Printer Disable-Printer
      Pause-Printer-After-Current-Job Hold-New-Jobs
      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
      Restart-Printer Shutdown-Printer Startup-Printer
      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
      CUPS-Reject-Jobs>
17        AuthType Default
18        Require user varies by OS
19        Order deny,allow
20      </Limit>

The "Order deny,allow" line at the end of both Limit subsections allows the request to come from any system allowed by the Location sections elsewhere in the cupsd.conf file.

The Cancel-Job and CUPS-Authenticate-Job operations are listed separately to allow the web interface to more easily edit their policy without disturbing the rest. Like the rest of the job operations, we want the job's owner ("@OWNER") or an administrator ("@SYSTEM") to do it:

16      <Limit Cancel-Job CUPS-Authenticate-Job>
17        Require user @OWNER @SYSTEM
18        Order deny,allow
19      </Limit>

The last Limit subsection in any policy uses the special operation name All. CUPS will use the rules in this subsection for any operation you don't list specifically in the policy. In this case, all other operations are allowed without a username or authentication:

21      <Limit All>
22        Order deny,allow
23      </Limit>
24    </Policy>
Table 1: IPP Operation Names
Name Used by CUPS? Description
Activate-Printer No Activates a printer or class.
Cancel-Current-Job No Cancels the current job on a printer or class.
Cancel-Job Yes Cancels a print job.
Cancel-Jobs Yes Cancels all print jobs.
Cancel-My-Jobs Yes Cancels a user's print job.
Cancel-Subscription Yes Cancels an event subscription.
Close-Job Yes Closes a user's print job so that it can be printed.
Create-Job Yes Creates a print job with no files or URIs.
Create-Job-Subscriptions Yes Creates one or more event subscriptions for a job.
Create-Printer-Subscriptions Yes Creates one or more event subscriptions for a printer or the server.
Deactivate-Printer No Deactivates a printer or class.
Disable-Printer Yes Stops a printer or class.
Enable-Printer Yes Starts a printer or class.
Get-Job-Attributes Yes Gets information and options associated with a job.
Get-Jobs Yes Gets a list of jobs.
Get-Notifications Yes Gets (pending) events for an event subscription.
Get-Printer-Attributes Yes Gets information and options associated with a printer or class.
Get-Printer-Supported-Values Yes Gets -supported attributes for a printer based on job options.
Get-Subscription-Attributes Yes Gets information for an event subscription.
Get-Subscriptions Yes Gets a list of event subscriptions.
Hold-Job Yes Holds a print job for printing.
Hold-New-Jobs Yes Holds new jobs submitted to a printer or class.
Pause-Printer Yes Stops a printer or class.
Pause-Printer-After-Current-Job No Stops a printer or class after the current job is finished.
Print-Job Yes Creates a print job with a single file.
Print-URI No Create a print job with a single URI.
Promote-Job No Prints a job before others.
Purge-Jobs Yes Cancels all jobs on the server or a printer or class and removes the job history information.
Release-Held-New-Jobs Yes Releases jobs that were held because of the Hold-New-Jobs operation.
Release-Job Yes Releases a print job for printing.
Renew-Subscription Yes Renews an event subscription that is about to expire.
Reprocess-Job No Reprints a job on a different printer or class; CUPS has the CUPS-Move-Job operation instead.
Restart-Job Yes Reprints a print job.
Restart-Printer No Restarts a printer or class, resuming print jobs as needed.
Resubmit-Job No Reprints a job with new options.
Resume-Job No Resumes printing of a stopped job.
Resume-Printer Yes Starts a printer or class.
Schedule-Job-After No Prints a job after others.
Send-Document Yes Adds a file to a print job.
Send-URI No Adds a URI to a print job.
Set-Printer-Attributes Yes Sets printer or class information; CUPS uses CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class for most attributes instead.
Set-Job-Attributes Yes Changes job options.
Shutdown-Printer No Powers a printer or class off.
Startup-Printer No Powers a printer or class on.
Suspend-Current-Job No Stops the current job on a printer or class.
Validate-Document No Validates a document request before sending.
Validate-Job Yes Validates a print request before printing.
CUPS-Accept-Jobs Yes Sets a printer's or class' printer-is-accepting-jobs attribute to true.
CUPS-Add-Modify-Class Yes Adds or modifies a class.
CUPS-Add-Modify-Printer Yes Adds or modifies a printer.
CUPS-Authenticate-Job Yes Authenticates a job for printing.
CUPS-Delete-Class * Yes Removes a class.
CUPS-Delete-Printer * Yes Removes a printer.
CUPS-Get-Classes * Yes Gets a list of classes.
CUPS-Get-Default * Yes Gets the server/network default printer or class.
CUPS-Get-Devices * Yes Gets a list of printer devices.
CUPS-Get-Document Yes Retrieves a document file from a job.
CUPS-Get-PPDs * Yes Gets a list of printer drivers or manufacturers.
CUPS-Get-Printers * Yes Gets a list of printers and/or classes.
CUPS-Move-Job Yes Moves a job to a different printer or class.
CUPS-Reject-Jobs Yes Sets a printer's or class' printer-is-accepting-jobs attribute to false.
CUPS-Set-Default * Yes Sets the server/network default printer or class.

* = These operations only apply to the default policy.

Creating Your Own Policies

The easiest way to create a new policy is to start with the default policy and then make changes to the copy. The first change you'll make is to give the policy a new name. Policy names can use the same characters as a printer name, specifically all printable characters except space, slash (/), and pound (#):

<Policy mypolicy>

Then you need to decide exactly what limits you want for the policy. For example, if you want to allow any user to cancel any other users' jobs, you can change the Cancel-Job limits to:

<Limit Cancel-Job>
  Order deny,allow
</Limit>

The directives inside the Limit subsection can use any of the normal limiting directives: Allow, AuthType, Deny, Encryption, Require, and Satisfy. Table 2 lists some basic "recipes" for different access control rules.

Table 2: Access Control Recipes
Access Level Directives to Use
Allow Everyone
Order deny,allow
Allow from all
Allow Everyone on the Local Network
Order deny,allow
Allow from @LOCAL
Deny Everyone/Disable Operation(s)
Order deny,allow
Require Login (System) Password
AuthType Basic
Require CUPS (lppasswd) Password
AuthType BasicDigest
Require Kerberos
AuthType Negotiate
Require the Owner of a Job or Subscription
Require user @OWNER
Require an Administrative User
Require user @SYSTEM
Require Member of Group "foogroup"
Require user @foogroup
Require "john" or "mary"
Require user john mary
Require Encryption
Encryption Required

Creating a Policy for a Computer Lab

One common operating scenario is a computer lab. The lab is managed by one or more technicians that assist the users of the lab and handle the basic administration tasks. Listing 2 shows an operation policy that only allows access from the lab's subnet, 10.0.2.x, and allows the lab technicians, who are members of a special UNIX group for that lab called "lab999", to do job, printer, and subscription management operations.

Listing 2: Operation Policy for a Lab

 1    <Policy lab999>
 2      # Job- and subscription-related operations must be done
      by the owner, a lab technician, or an administrator...
 3      <Limit Send-Document Send-URI Hold-Job Release-Job
      Restart-Job Purge-Jobs Set-Job-Attributes
      Create-Job-Subscription Renew-Subscription
      Cancel-Subscription Get-Notifications Reprocess-Job
      Cancel-Current-Job Suspend-Current-Job Resume-Job
      CUPS-Move-Job Cancel-Job CUPS-Authenticate-Job CUPS-Get-Document>
 4        Require user @OWNER @lab999 @SYSTEM
 5        Order allow,deny
 6        Allow from 10.0.2.0/24
 7      </Limit>
 8
 9      # All administration operations require a lab technician
      or an administrator to authenticate...
10      <Limit Pause-Printer Resume-Printer
      Set-Printer-Attributes Enable-Printer Disable-Printer
      Pause-Printer-After-Current-Job Hold-New-Jobs
      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
      Restart-Printer Shutdown-Printer Startup-Printer
      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
      CUPS-Reject-Jobs CUPS-Set-Default>
11        AuthType Default
12        Require user @lab999 @SYSTEM
13        Order allow,deny
14        Allow from 10.0.2.0/24
15      </Limit>
16
17      # All other operations are allowed from the lab network...
18      <Limit All>
19        Order allow,deny
20        Allow from 10.0.2.0/24
21      </Limit>
22    </Policy>

Using Policies

Once you have created a policy, you can use it in two ways. The first way is to assign it as the default policy for the system using the DefaultPolicy directive in the cupsd.conf file. For example, add the following line to the cupsd.conf file to use the "lab999" policy from the previous section:

DefaultPolicy lab999

To associate the policy with one or more printers, use either the lpadmin(8) command or the web interface to change the operation policy for each printer. When using the lpadmin command, the -o printer-op-policy=name option sets the operation policy for a printer. For example, enter the following command to use the "lab999" policy from the previous section with a printer named "LaserJet4000":

lpadmin -p LaserJet4000 -o printer-op-policy=lab999

To make the same change in the web interface, go to the printer's web page, for example "http://localhost:631/printers/LaserJet4000", and choose Set Default Options from the Administration menu button. Click on the Policies link and choose the desired policy from the pull-down list. Click on Set Default Options to change the policy for the printer.

cups-2.3.1/doc/help/man-notifier.html000664 000765 000024 00000002545 13574721672 017560 0ustar00mikestaff000000 000000 notifier(7)

notifier(7)

Name

notifier - cups notification interface

Synopsis

notifier recipient [ user-data ]

Description

The CUPS notifier interface provides a standard method for adding support for new event notification methods to CUPS. Each notifier delivers one or more IPP events from the standard input to the specified recipient.

Notifiers MUST read IPP messages from the standard input using the ippNew() and ippReadFile() functions and exit on error. Notifiers are encouraged to exit after a suitable period of inactivity, however they may exit after reading the first message or stay running until an error is seen. Notifiers inherit the environment and can use the logging mechanism documented in filter(7).

See Also

cupsd(8), filter(7), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/kerberos.html000664 000765 000024 00000010323 13574721672 016775 0ustar00mikestaff000000 000000 Using Kerberos Authentication

Using Kerberos Authentication

CUPS allows you to use a Key Distribution Center (KDC) for authentication on your local CUPS server and when printing to a remote authenticated queue. This document describes how to configure CUPS to use Kerberos authentication and provides links to the MIT help pages for configuring Kerberos on your systems and network.

System Requirements

The following are required to use Kerberos with CUPS:

  1. Heimdal Kerberos (any version) or MIT Kerberos (1.6.3 or newer)
  2. Properly configured Domain Name System (DNS) infrastructure (for your servers):
    1. DNS server(s) with static IP addresses for all CUPS servers or configured to allow DHCP updates to the host addresses and
    2. All CUPS clients and servers configured to use the same DNS server(s).
  3. Properly configured Kerberos infrastructure:
    1. KDC configured to allow CUPS servers to obtain Service Granting Tickets (SGTs) for the "host" and "HTTP" services/principals,
    2. LDAP-based user accounts - both OpenDirectory and ActiveDirectory provide this with the KDC, and
    3. CUPS clients and servers bound to the same KDC and LDAP server(s).

Configuring Kerberos on Your System

Before you can use Kerberos with CUPS, you will need to configure Kerberos on your system and setup a system as a KDC. Because this configuration is highly system and site-specific, please consult the following on-line resources provided by the creators of Kerberos at the Massachusetts Institute of Technology (MIT):

The Linux Documentation Project also has a HOWTO on Kerberos:

Configuring CUPS to Use Kerberos

Once you have configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the Negotiate authentication type. The simplest way to do this is using the cupsctl(8) command on your server(s):

cupsctl DefaultAuthType=Negotiate

You can also enable Kerberos from the web interface by checking the Use Kerberos Authentication box and clicking Change Settings:

http://server.example.com:631/admin

After you have enabled Kerberos authentication, use the built-in "authenticated" policy or your own custom policies with the printers you will be sharing. See Managing Operation Policies for more information.

Implementation Information

CUPS implements Kerberos over HTTP using GSSAPI and the service/principal names "host/server.example.com" for command-line access and "HTTP/server.example.com" for web-based access, where "server.example.com" is replaced by your CUPS server's hostname. Because of limitations in the HTTP GSSAPI protocol extension, only a single domain/KDC is supported for authentication. The HTTP extension is described in RFC 4559.

When doing printing tasks that require authentication, CUPS requests single-use "tickets" from your login session to authenticate who you are. These tickets give CUPS a username of the form "user@REALM", which is then truncated to just "user" for purposes of user and group checks.

In order to support printing to a shared printer, CUPS runs the IPP or SMB backend as the owner of the print job so it can obtain the necessary credentials when the job is de-spooled to the server.

cups-2.3.1/doc/help/man-ippeveprinter.html000664 000765 000024 00000023611 13574721672 020632 0ustar00mikestaff000000 000000 ippeveprinter(1)

ippeveprinter(1)

Name

ippeveprinter - an ipp everywhere printer application for cups

Synopsis

ippeveprinter [ --help ] [ --no-web-forms ] [ --pam-service service ] [ --version ] [ -2 ] [ -A ] [ -D device-uri ] [ -F output-type/subtype ] [ -K keypath ] [ -M manufacturer ] [ -P filename.ppd ] [ -V ipp-version ] [ -a filename.conf ] [ -c command ] [ -d spool-directory ] [ -f type/subtype[,...] ] [ -i iconfile.png ] [ -k ] [ -l location ] [ -m model ] [ -n hostname ] [ -p port ] [ -r subtype[,subtype] ] [ -s speed[,color-speed] ] [ -v[vvv] ] service-name

Description

ippeveprinter is a simple Internet Printing Protocol (IPP) server conforming to the IPP Everywhere (PWG 5100.14) specification. It can be used to test client software or act as a very basic print server that runs a command for every job that is printed.

Options

The following options are recognized by ippeveprinter:
--help
Show program usage.
--no-web-forms
Disable the web interface forms used to update the media and supply levels.
--pam-service service
Set the PAM service name. The default service is "cups".
--version
Show the CUPS version.
-2
Report support for two-sided (duplex) printing.
-A
Enable authentication for the created printer. ippeveprinter uses PAM to authenticate HTTP Basic credentials.
-D device-uri
Set the device URI for print output. The URI can be a filename, directory, or a network socket URI of the form "socket://ADDRESS[:PORT]" (where the default port number is 9100). When specifying a directory, ippeveprinter will create an output file using the job ID and name.
-F output-type/subtype[,...]
Specifies the output MIME media type. The default is "application/postscript" when the -P option is specified.
-M manufacturer
Set the manufacturer of the printer. The default is "Example".
-P filename.ppd
Load printer attributes from the specified PPD file. This option is typically used in conjunction with the ippeveps(7) printer command ("-c ippeveps").
-V 1.1
-V 2.0
Specifies the maximum IPP version to report. 2.0 is the default.
-c command
Run the specified command for each document that is printed. If "command" is not an absolute path ("/path/to/command"), ippeveprinter looks for the command in the "command" subdirectory of the CUPS binary directory, typically /usr/lib/cups/command or /usr/libexec/cups/command. The cups-config(1) command can be used to discover the correct binary directory ("cups-config --serverbin"). In addition, the CUPS_SERVERBIN environment variable can be used to override the default location of this directory - see the cups(1) man page for more details.
-d spool-directory
Specifies the directory that will hold the print files. The default is a directory under the user's current temporary directory.
-f type/subtype[,...]
Specifies a list of MIME media types that the server will accept. The default depends on the type of printer created.
-i iconfile.png
Specifies the printer icon file for the server. The file must be a PNG format image. The default is an internally-provided PNG image.
-k
Keeps the print documents in the spool directory rather than deleting them.
-l location
Specifies the human-readable location string that is reported by the server. The default is the empty string.
-m model
Specifies the model name of the printer. The default is "Printer".
-n hostname
Specifies the hostname that is reported by the server. The default is the name returned by the hostname(1) command.
-p port
Specifies the port number to listen on. The default is a user-specific number from 8000 to 8999.
-roff
Turns off DNS-SD service advertisements entirely.
-r subtype[,subtype]
Specifies the DNS-SD subtype(s) to advertise. Separate multiple subtypes with a comma. The default is "_print".
-s speed[,color-speed]
Specifies the printer speed in pages per minute. If two numbers are specified and the second number is greater than zero, the server will report support for color printing. The default is "10,0".
-v[vvv]
Be (very) verbose when logging activity to standard error.

Exit Status

The ippeveprinter program returns 1 if it is unable to process the command-line arguments or register the IPP service. Otherwise ippeveprinter will run continuously until terminated.

Conforming To

The ippeveprinter program is unique to CUPS and conforms to the IPP Everywhere (PWG 5100.14) specification.

Environment

ippeveprinter adds environment variables starting with "IPP_" for all IPP Job attributes in the print request. For example, when executing a command for an IPP Job containing the "media" Job Template attribute, the "IPP_MEDIA" environment variable will be set to the value of that attribute.

In addition, all IPP "xxx-default" and "pwg-xxx" Printer Description attributes are added to the environment. For example, the "IPP_MEDIA_DEFAULT" environment variable will be set to the default value for the "media" Job Template attribute.

Enumerated values are converted to their keyword equivalents. For example, a "print-quality" Job Template attribute with a enum value of 3 will become the "IPP_PRINT_QUALITY" environment variable with a value of "draft". This string conversion only happens for standard Job Template attributes, currently "finishings", "orientation-requested", and "print-quality".

Finally, the "CONTENT_TYPE" environment variable contains the MIME media type of the document being printed, the "DEVICE_URI" environment variable contains the device URI as specified with the "-D" option, the "OUTPUT_FORMAT" environment variable contains the output MIME media type, and the "PPD" environment variable contains the PPD filename as specified with the "-P" option.

Command Output

Unless they communicate directly with a printer, print commands send printer-ready data to the standard output.

Print commands can send messages back to ippeveprinter on the standard error with one of the following prefixes:

ATTR: attribute=value[ attribute=value]
Sets the named attribute(s) to the given values. Currently only the "job-impressions" and "job-impressions-completed" Job Status attributes and the "marker-xxx", "printer-alert", "printer-alert-description", "printer-supply", and "printer-supply-description" Printer Status attributes can be set.
DEBUG: Debugging message
Logs a debugging message if at least two -v's have been specified.
ERROR: Error message
Logs an error message and copies the message to the "job-state-message" attribute.
INFO: Informational message
Logs an informational/progress message if -v has been specified and copies the message to the "job-state-message" attribute unless an error has been reported.
STATE: keyword[,keyword,...]
Sets the printer's "printer-state-reasons" attribute to the listed keywords.
STATE: -keyword[,keyword,...]
Removes the listed keywords from the printer's "printer-state-reasons" attribute.
STATE: +keyword[,keyword,...]
Adds the listed keywords to the printer's "printer-state-reasons" attribute.

Examples

Run ippeveprinter with a service name of My Cool Printer:

    ippeveprinter "My Cool Printer"

Run the file(1) command whenever a job is sent to the server:


    ippeveprinter -c /usr/bin/file "My Cool Printer"

See Also

ippevepcl(7), ippeveps(7), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/spec-stp.html000664 000765 000024 00000007454 13574721672 016732 0ustar00mikestaff000000 000000 CUPS Software Test Plan

CUPS Software Test Plan

This software test plan provides detailed tests that are used to evaluate the stability and compliance of CUPS.

Test Procedure

The test software and data files are located in the test subdirectory of the source distribution. A script is provided to compile the ipptool program and run all of the tests that follow, producing a success/fail report.

The test target of the top-level makefile can be used to run this script:

make test

or you can run the test script directly:

cd test
./run-stp-tests

A Software Test Report is stored in a HTML file in the test subdirectory at the conclusion of the test.

IPP Compliance Tests

This section describes the tests used to validate the IPP standards compliance of the CUPS server.

Request Tests

These tests verify that the CUPS scheduler only accepts valid IPP requests that start with the attributes-charset and attributes-natural-language attributes and also contain a printer-uri or job-uri attribute.

It also verifies that the CUPS scheduler always responds with attributes-charset and attributes-natural-language attributes, using default values if they are not provided by the client.

CUPS Printer Operation Tests

These tests verify that the CUPS printer operations are supported and function properly. Two printers called Test1 and Test2 are created, one as a PostScript printer and one as a raster printer.

Job Operation Tests

These test verify that the CUPS scheduler accepts print jobs for all supported file formats and that the cancel-job, hold-job, and resume-job operations work.

Subscription Operation Tests

These test verify that the CUPS scheduler accepts subscriptions with print jobs and that all subscription operations work as required by the IPP notification and mailto specifications.

Command Tests

This section describes the tests used to validate the Berkeley and System V commands included with CUPS.

lpadmin

This test verifies that printers can be added, modified, and defaulted using the lpadmin command.

lpc

This test verifies that the lpc command can show the current status of all print queues.

lpq

This test verifies that the lpq command lists any jobs in the queue.

lpstat

This test verifies that the lpstat command works with all reports using the "-t" option.

lp

This test verifies that the lp command works with both the default destination and a specific destination.

lpr

This test verifies that the lpr command works with both the default destination and a specific destination.

lprm

This test verifies that the lprm command can properly cancel a job.

cancel

This test verifies that the cancel command can properly cancel a job or all jobs.

lpinfo

This test verifies that the lpinfo command returns a list of available printer drivers and devices.

cups-2.3.1/doc/help/spec-ipp.html000664 000765 000024 00000202632 13574721672 016707 0ustar00mikestaff000000 000000 CUPS Implementation of IPP

CUPS Implementation of IPP

Introduction

CUPS implements IPP/2.1 and the operations and attributes defined in the following specifications:

CUPS also provides 17 new operations and many new attributes to support multiple IPP printers and printer classes on a single host.

IPP URIs

CUPS supports the "http", "https", "ipp", and "ipps" schemes. The following resource names are used:

scheme://hostname:port/
Can be used for all "get" operations and for server subscriptions.
scheme://hostname:port/admin/
Used for all administrative operations.
scheme://hostname:port/classes/name
Specifies a printer class.
scheme://hostname:port/jobs/id
Specifies a job.
scheme://hostname:port/printers/name
Specifies a printer.

So a typical printer URI would be "ipp://foo.example.com/printers/LaserJet". In addition, the CUPS scheduler also supports (when enabled) normal browser access via "http://foo.example.com:port/" and "https://foo.example.com:port/".

CUPS IPP Operations

CUPS provides 17 vendor extension operations in addition to most of the standard IPP and registered extension operations:

Operation Name CUPS Code Brief Description
Print-Job 1.0 0x0002 Print a file.
Validate-Job 1.0 0x0004 Validate job attributes.
Create-Job 1.1 0x0005 Create a print job.
Send-Document 1.1 0x0006 Send a file for a print job.
Cancel-Job 1.0 0x0008 Cancel a print job.
Get-Job-Attributes 1.0 0x0009 Get job attributes.
Get-Jobs 1.0 0x000A Get all jobs.
Get-Printer-Attributes 1.0 0x000B Get printer attributes.
Hold-Job 1.1 0x000C Hold a job for printing.
Release-Job 1.1 0x000D Release a job for printing.
Restart-Job 1.1 0x000E Restarts a print job.
Pause-Printer 1.0 0x0010 Pause printing on a printer.
Resume-Printer 1.0 0x0011 Resume printing on a printer.
Purge-Jobs 1.0 0x0012 Purge all jobs.
Set-Printer-Attributes 1.4 0x0013 Set attributes for a printer.
Set-Job-Attributes 1.1 0x0014 Set attributes for a pending or held job.
Create-Printer-Subscription 1.2 0x0016 Creates a subscription associated with a printer or the server.
Create-Job-Subscription 1.2 0x0017 Creates a subscription associated with a job.
Get-Subscription-Attributes 1.2 0x0018 Gets the attributes for a subscription.
Get-Subscriptions 1.2 0x0019 Gets the attributes for zero or more subscriptions.
Renew-Subscription 1.2 0x001A Renews a subscription.
Cancel-Subscription 1.2 0x001B Cancels a subscription.
Get-Notifications 1.2 0x001C Get notification events for ippget subscriptions.
Enable-Printer 1.2 0x0022 Accepts jobs on a printer.
Disable-Printer 1.2 0x0023 Rejects jobs on a printer.
Hold-New-Jobs 1.4 0x0025 Hold new jobs by default.
Release-Held-New-Jobs 1.4 0x0026 Releases all jobs that were previously held.
Cancel-Jobs 1.5 0x0038 Cancel all jobs (administrator).
Cancel-My-Jobs 1.5 0x0039 Cancel all jobs (user).
Close-Job 1.5 0x003b Close a created job.
CUPS-Get-Default 1.0 0x4001 Get the default destination.
CUPS-Get-Printers 1.0 0x4002 Get all of the available printers.
CUPS-Add-Modify-Printer 1.0 0x4003 Add or modify a printer.
CUPS-Delete-Printer 1.0 0x4004 Delete a printer.
CUPS-Get-Classes 1.0 0x4005 Get all of the available printer classes.
CUPS-Add-Modify-Class 1.0 0x4006 Add or modify a printer class.
CUPS-Delete-Class 1.0 0x4007 Delete a printer class.
CUPS-Accept-Jobs 1.0 0x4008 Accept jobs on a printer or printer class. This operation is deprecated - use the Enable-Printer operation instead.
CUPS-Reject-Jobs 1.0 0x4009 Reject jobs on a printer or printer class. This operation is deprecated - use the Disable-Printer operation instead.
CUPS-Set-Default 1.0 0x400A Set the default destination.
CUPS-Get-Devices 1.1 0x400B Get all of the available devices.
CUPS-Get-PPDs 1.1 0x400C Get all of the available PPDs.
CUPS-Move-Job 1.1 0x400D Move a job to a different printer.
CUPS-Authenticate-Job 1.2 0x400E Authenticate a job for printing.
CUPS-Get-PPD 1.3 0x400F Get a PPD file.
CUPS-Get-Document 1.4 0x4027 Get a document file from a job.
CUPS-Create-Local-Printer 2.2 0x4028 Creates a local (temporary) print queue pointing to a remote IPP Everywhere printer.

Operations

The following sections describe the operations supported by CUPS. In the interest of brevity, operations which use only the standard IPP attributes are not described.

Cancel Job Operation (Extension)

The Cancel-Job operation (0x0008) cancels the specified job. CUPS 1.4 added support for the purge-job (boolean) operation attribute that (if 'true') removes all history and document files for the job as well.

Purge-Jobs Operation

The Purge-Jobs operation (0x0012) cancels all of the jobs on a given destination and optionally removes all history and document files for the jobs as well. CUPS 1.2 added support for the purge-job (boolean) operation attribute that (if 'false') retains all history and document files for the canceled jobs.

Note:

The Cancel-Jobs and Cancel-My-Jobs operations should be used instead of Purge-Jobs.

CUPS 1.2/macOS 10.5Create-Printer-Subscription

The Create-Printer-Subscription operation (0x0016) creates a subscription for printer or server event notifications. CUPS provides several additional events in addition to the standard events in the IPP notifications specification. CUPS adds the following notify-events (1setOf type2 keyword) values:

  • printer-added - Get notified whenever a printer or class is added
  • printer-deleted - Get notified whenever a printer or class is deleted
  • printer-modified - Get notified whenever a printer or class is modified
  • server-audit - Get notified when a security condition occurs
  • server-restarted - Get notified when the server is restarted
  • server-started - Get notified when the server is started
  • server-stopped - Get notified when the server is stopped

CUPS-Get-Default Operation

The CUPS-Get-Default operation (0x4001) returns the default printer URI and attributes.

CUPS-Get-Default Request

The following groups of attributes are supplied as part of the CUPS-Get-Default request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"requested-attributes" (1setOf keyword):
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'.

CUPS-Get-Default Response

The following groups of attributes are send as part of the CUPS-Get-Default Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Group 2: Printer Object Attributes

The set of requested attributes and their current values.

CUPS-Get-Printers Operation

The CUPS-Get-Printers operation (0x4002) returns the printer attributes for every printer known to the system. This may include printers that are not served directly by the server.

CUPS-Get-Printers Request

The following groups of attributes are supplied as part of the CUPS-Get-Printers request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"first-printer-name" (name(127)): CUPS 1.2/macOS 10.5
The client OPTIONALLY supplies this attribute to select the first printer that is returned.
"limit" (integer (1:MAX)):
The client OPTIONALLY supplies this attribute limiting the number of printers that are returned.
"printer-id" (integer(0:65535)): CUPS 2.2
The client OPTIONALLY supplies this attribute to select which printer is returned.
"printer-location" (text(127)): CUPS 1.1.7
The client OPTIONALLY supplies this attribute to select which printers are returned.
"printer-type" (type2 enum): CUPS 1.1.7
The client OPTIONALLY supplies a printer type enumeration to select which printers are returned.
"printer-type-mask" (type2 enum): CUPS 1.1.7
The client OPTIONALLY supplies a printer type mask enumeration to select which bits are used in the "printer-type" attribute.
"requested-attributes" (1setOf keyword):
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'.
"requested-user-name" (name(127)): CUPS 1.2/macOS 10.5
The client OPTIONALLY supplies a user name that is used to filter the returned printers.

CUPS-Get-Printers Response

The following groups of attributes are send as part of the CUPS-Get-Printers Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Group 2: Printer Object Attributes

The set of requested attributes and their current values for each printer.

CUPS-Add-Modify-Printer Operation

The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or modifies an existing printer on the system.

CUPS-Add-Modify-Printer Request

The following groups of attributes are supplied as part of the CUPS-Add-Modify-Printer request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri):
The client MUST supply a URI for the specified printer.

Group 2: Printer Object Attributes

"auth-info-required" (1setOf type2 keyword): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies one or more authentication keywords that are required to communicate with the printer/remote queue.
"job-sheets-default" (1setOf name(127)): CUPS 1.1.7
The client OPTIONALLY supplies one or two banner page names that are printed before and after files in a job. The reserved name "none" is used to specify that no banner page should be printed.
"device-uri" (uri):
The client OPTIONALLY supplies a device URI for the specified printer.
"port-monitor" (name(127)):
The client OPTIONALLY supplies a port monitor name for the specified printer.
"ppd-name" (name(255)):
The client OPTIONALLY supplies a PPD name for the specified printer.
"printer-is-accepting-jobs" (boolean):
The client OPTIONALLY supplies this boolean attribute indicating whether the printer object should accept new jobs.
"printer-info" (text(127)):
The client OPTIONALLY supplies this attribute indicating the printer information string.
"printer-location" (text(127)):
The client OPTIONALLY supplies this attribute indicating a textual location of the printer.
"printer-more-info" (uri):
The client OPTIONALLY supplies this attribute indicating a URI for additional printer information.
"printer-state" (type2 enum):
The client OPTIONALLY supplies this attribute indicating the initial/current state of the printer. Only the 'idle(3)' and 'stopped(5)' enumerations are recognized.
"printer-state-message" (text(MAX)):
The client OPTIONALLY supplies this attribute indicating a textual reason for the current printer state.
"requesting-user-name-allowed" (1setof name(127) | delete)
OR
"requesting-user-name-denied" (1setof name(127) | delete):
The client OPTIONALLY supplies one of these attributes to specify an access control list for incoming print jobs. To allow all users access to a printer, use the delete tag for the attribute value.

The CUPS-Add-Modify-Printer request can optionally be followed by a PPD file to be used for the printer. The "ppd-name" attribute overrides any file that is attached to the end of the request with a local CUPS PPD file.

CUPS-Add-Modify-Printer Response

The following groups of attributes are send as part of the CUPS-Add-Modify-Printer Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

CUPS-Delete-Printer Operation

The CUPS-Delete-Printer operation (0x4004) removes an existing printer from the system.

CUPS-Delete-Printer Request

The following groups of attributes are supplied as part of the CUPS-Delete-Printer request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri):
The client MUST supply a URI for the specified printer.

CUPS-Delete-Printer Response

The following groups of attributes are send as part of the CUPS-Delete-Printer Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

CUPS-Get-Classes Operation

The CUPS-Get-Classes operation (0x4005) returns the printer attributes for every printer class known to the system. This may include printer classes that are not served directly by the server.

CUPS-Get-Classes Request

The following groups of attributes are supplied as part of the CUPS-Get-Classes request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"first-printer-name" (name(127)): CUPS 1.2/macOS 10.5
The client OPTIONALLY supplies this attribute to select the first printer that is returned.
"limit" (integer (1:MAX)):
The client OPTIONALLY supplies this attribute limiting the number of printer classes that are returned.
"printer-location" (text(127)): CUPS 1.1.7
The client OPTIONALLY supplies this attribute to select which printer classes are returned.
"printer-type" (type2 enum): CUPS 1.1.7
The client OPTIONALLY supplies a printer type enumeration to select which printer classes are returned.
"printer-type-mask" (type2 enum): CUPS 1.1.7
The client OPTIONALLY supplies a printer type mask enumeration to select which bits are used in the "printer-type" attribute.
"requested-attributes" (1setOf keyword):
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'.
"requested-user-name" (name(127)): CUPS 1.2/macOS 10.5
The client OPTIONALLY supplies a user name that is used to filter the returned printers.

CUPS-Get-Classes Response

The following groups of attributes are send as part of the CUPS-Get-Classes Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Group 2: Printer Class Object Attributes

The set of requested attributes and their current values for each printer class.

CUPS-Add-Modify-Class Operation

The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class or modifies and existing printer class on the system.

CUPS-Add-Modify-Class Request

The following groups of attributes are supplied as part of the CUPS-Add-Modify-Class request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri):
The client MUST supply a URI for the specified printer class.

Group 2: Printer Object Attributes

"auth-info-required" (1setOf type2 keyword): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies one or more authentication keywords that are required to communicate with the printer/remote queue.
"member-uris" (1setof uri):
The client OPTIONALLY supplies the "member-uris" set specifying the printers and printer classes that are part of the class.
"printer-is-accepting-jobs" (boolean):
The client OPTIONALLY supplies this boolean attribute indicating whether the class object should accept new jobs.
"printer-info" (text(127)):
The client OPTIONALLY supplies this attribute indicating the printer information string.
"printer-location" (text(127)):
The client OPTIONALLY supplies this attribute indicating a textual location of the class.
"printer-more-info" (uri):
The client OPTIONALLY supplies this attribute indicating a URI for additional class information.
"printer-state" (type2 enum):
The client OPTIONALLY supplies this attribute indicating the initial/current state of the class. Only the 'idle(3)' and 'stopped(5)' enumerations are recognized.
"printer-state-message" (text(MAX)):
The client OPTIONALLY supplies this attribute indicating a textual reason for the current class state.
"requesting-user-name-allowed" (1setof name(127))
OR
"requesting-user-name-denied" (1setof name(127)):
The client OPTIONALLY supplies one of these attributes to specify an access control list for incoming print jobs. To allow all users access to a class, use the delete tag for the attribute value.

CUPS-Add-Modify-Class Response

The following groups of attributes are send as part of the CUPS-Add-Modify-Class Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

CUPS-Delete-Class Operation

The CUPS-Delete-Class operation (0x4007) removes an existing printer class from the system.

CUPS-Delete-Class Request

The following groups of attributes are supplied as part of the CUPS-Delete-Class request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri):
The client MUST supply a URI for the specified printer class.

CUPS-Delete-Class Response

The following groups of attributes are send as part of the CUPS-Delete-Class Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

CUPS-Set-Default Operation

The CUPS-Set-Default operation (0x400A) sets the default printer destination for all clients when a resource name of "/printers" is specified.

CUPS-Set-Default Request

The following groups of attributes are supplied as part of the CUPS-Set-Default request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri):
The client MUST supply a URI for the specified printer or printer class.

CUPS-Set-Default Response

The following groups of attributes are send as part of the CUPS-Set-Default Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

DeprecatedCUPS-Get-Devices Operation

The CUPS-Get-Devices operation (0x400B) returns all of the supported device-uri's for the server.

CUPS-Get-Devices Request

The following groups of attributes are supplied as part of the CUPS-Get-Devices request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"device-class" (type1 keyword):
The client OPTIONALLY supplies a device class keyword to select which devices are returned.
"exclude-schemes" (1setOf name): CUPS 1.4/macOS 10.6
The client OPTIONALLY supplies a set of scheme names that the requestor does not want to discover. If the client omits this attribute, the server responds with devices of all schemes specified by the "include-schemes" attribute.
"include-schemes" (1setOf name): CUPS 1.4/macOS 10.6
The client OPTIONALLY supplies a set of scheme names that the requestor wants to discover. If the client omits this attribute, the server responds with devices of all schemes except those specified by the "exclude-schemes" attribute.
"limit" (integer (1:MAX)):
The client OPTIONALLY supplies this attribute limiting the number of devices that are returned.
"requested-attributes" (1setOf keyword):
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'.
"timeout" (integer (1:MAX)): CUPS 1.4/macOS 10.6
The client OPTIONALLY supplies this attribute to limit the duration of the lookup. The default timeout is 15 seconds.

CUPS-Get-Devices Response

The following groups of attributes are send as part of the CUPS-Get-Devices Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Groups 2-N: Device Object Attributes (using printer-attributes-tag group)

The set of requested attributes and their current values for each device.

DeprecatedCUPS-Get-PPDs Operation

The CUPS-Get-PPDs operation (0x400C) returns all of the locally available PPD files on the system.

CUPS-Get-PPDs Request

The following groups of attributes are supplied as part of the CUPS-Get-PPDs request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"exclude-schemes" (1setOf name): CUPS 1.4/macOS 10.6
The client OPTIONALLY supplies a set of scheme names that the requestor does not want to list. If the client omits this attribute, the server responds with PPDs of all schemes specified by the "include-schemes" attribute.
"include-schemes" (1setOf name): CUPS 1.4/macOS 10.6
The client OPTIONALLY supplies a set of scheme names that the requestor wants to list. If the client omits this attribute, the server responds with PPDs of all schemes except those specified by the "exclude-schemes" attribute.
"limit" (integer (1:MAX)):
The client OPTIONALLY supplies this attribute limiting the number of PPDs that are returned.
"ppd-make" (text(127)):
The client OPTIONALLY supplies a printer manufacturer to select which PPDs are returned.
"ppd-make-and-model" (text(127)): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a make and model to select which PPDs are returned.
"ppd-model-number" (integer): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a model number to select which PPDs are returned.
"ppd-natural-language" (naturalLanguage): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a language to select which PPDs are returned.
"ppd-product" (text(127)): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a PostScript product string to select which PPDs are returned.
"ppd-psversion" (text(127)): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a PostScript version string to select which PPDs are returned.
"ppd-type" (type1 keyword): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a driver type to select which PPDs are returned.
"requested-attributes" (1setOf keyword):
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'. Specify "ppd-make" to get a list of manufacturers.

CUPS-Get-PPDs Response

The following groups of attributes are send as part of the CUPS-Get-PPDs Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Groups 2-N: PPD Attributes (using printer-attributes-tag group)

The set of requested attributes and their current values for each PPD file.

CUPS 1.1CUPS-Move-Job Operation

The CUPS-Move-Job operation (0x400D) moves an active print job or all print jobs for a printer to a different printer.

CUPS-Move-Job Request

The following groups of attributes are supplied as part of the CUPS-Move-Job request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri)
OR
"printer-uri" (uri) and "job-id" (integer)
OR
"job-uri" (uri):
The client MUST supply a URI for the specified printer, the URI for the specified printer and a job ID number, or the job URI.

Group 2: Job Template Attributes

"job-printer-uri" (uri):
The client MUST supply a URI for a printer on the same server.

CUPS-Move-Job Response

The following groups of attributes are send as part of the CUPS-Move-Job Response:

Group 1: Operation Attributes

Status Message:
The standard response status message.
Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.

CUPS 1.2/macOS 10.5CUPS-Authenticate-Job Operation

The CUPS-Authenticate-Job operation (0x400E) authenticates a print job for printing, releasing the job if it is held. Typically this is used when printing to a remote server. The authentication information is passed in the HTTP request; the HTTP connection is normally encrypted for this type of request.

CUPS-Authenticate-Job Request

The following groups of attributes are supplied as part of the CUPS-Authenticate-Job request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri) and "job-id" (integer)
OR
"job-uri" (uri):
The client MUST supply a URI for the specified printer and a job ID number, or the job URI.

Group 2: Job Attributes

"auth-info" (1setOf text(MAX)): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute.
"job-hold-until" (keyword | name(MAX)): CUPS 1.3/macOS 10.5
The client OPTIONALLY supplies a new job-hold-until value for the job. If specified and not the "no-hold" value, the job is held instead of released for printing.

CUPS-Authenticate-Job Response

The following groups of attributes are send as part of the CUPS-Authenticate-Job Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Group 2: Unsupported Attributes (status=client-eror-attributes-or-values-not-supported)

auth-info-required (1setOf Type2 keyword)
The required authentication information.

DeprecatedCUPS-Get-PPD Operation

The CUPS-Get-PPD operation (0x400F) gets a PPD file from the server. The PPD file can be specified using a ppd-name returned by CUPS-Get-PPDs or using the printer-uri for a queue.

If the PPD file is found, successful-ok is returned with the PPD file following the response data.

If the PPD file cannot be served by the local server because the printer-uri attribute points to an external printer, a cups-see-other status is returned with the correct URI to use.

If the PPD file does not exist, client-error-not-found is returned.

CUPS-Get-PPD Request

The following group of attributes is supplied as part of the CUPS-Get-PPD request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri)
OR
"ppd-name" (name(255)):
The client MUST supply a printer URI or PPD name.

CUPS-Get-PPD Response

The following group of attributes is sent as part of the CUPS-Get-PPD Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.
"printer-uri" (uri):
The printer that provides the actual PPD file when the status code is cups-see-other (0x280).

If the status code is successful-ok, the PPD file follows the end of the IPP response.

CUPS 1.4/macOS 10.6CUPS-Get-Document Operation

The CUPS-Get-Document operation (0x4027) gets a document file from a job on the server. The document file is specified using the document-number and either the job-uri or printer-uri and job-id identifying the job.

If the document file is found, successful-ok is returned with the document file following the response data.

If the document file does not exist, client-error-not-found is returned.

If the requesting user does not have access to the document file, client-error-not-authorized is returned.

CUPS-Get-Document Request

The following group of attributes is supplied as part of the CUPS-Get-Document request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.
"printer-uri" (uri) and "job-id" (integer)
OR
"job-uri" (uri):
The client MUST supply a printer URI and job ID or job URI.
"document-number" (integer(1:MAX)):
The client MUST supply a document number to retrieve. The document-count attribute for the job defines the maximum document number that can be specified. In the case of jobs with banners (job-sheets is not "none"), document number 1 will typically contain the start banner and document number N will typically contain the end banner.

CUPS-Get-Document Response

The following group of attributes is sent as part of the CUPS-Get-Document Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.
"document-format" (mimeType):
The format of the document file.
"document-number" (integer(1:MAX)):
The requested document number.
"document-name" (name(MAX)):
The name that was supplied with the document, if any.

If the status code is successful-ok, the document file follows the end of the IPP response.

CUPS-Create-Local-Printer

The CUPS-Create-Local-Printer operation (0x4028) creates a local (temporary) print queue pointing to a remote IPP Everywhere Printer. The queue will remain until the scheduler idle exits, is restarted, or the system is restarted or shutdown. Temporary print queues can be made permanent by an administrator by setting the "printer-is-shared" attribute to 'true'.

At a minimum, the scheduler requires a name and URI for the Printer to add. When successful, the local "printer-uri" values are returned and may be used by the Client to submit Job Creation Requests, monitor for state changes, and so forth.

If the named printer already exists, the scheduler will reject the request with the 'client-error-not-possible' status code.

Access Rights: The authenticated user performing this operation MUST be a Local User of the system, and the request MUST be made over a local (domain socket or loopback interface) address. Otherwise, the request will be rejected with the 'client-error-forbidden' status code.

CUPS-Create-Local-Printer Request

The following group of attributes is supplied as part of the CUPS-Create-Local-Printer request:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.1 of the IPP Model and Semantics document.

Group 2: Printer Attributes

"printer-name" (name(127)):
The Client MUST supply this attribute which provides the name for the new Printer.
"device-uri" (uri):
The Client MUST supply this attribute which provides an "ipp" or "ipps" URI pointing to an IPP Everywhere Printer.
"printer-device-id" (text(1023)):
The Client OPTIONALLY supplies this attribute which provides the IEEE 1284 device ID for the new Printer.
"printer-geo-location" (uri):
The Client OPTIONALLY supplies this attribute which provides the geo-location of the new Printer as a "geo" URI.
"printer-info" (text(127)):
The Client OPTIONALLY supplies this attribute which provides the description for the new Printer.
"printer-location" (text(127)):
The Client OPTIONALLY supplies this attribute which provides the location of the new Printer.

CUPS-Create-Local-Printer Response

The following group of attributes is sent as part of the CUPS-Create-Local-Printer Response:

Group 1: Operation Attributes

Natural Language and Character Set:
The "attributes-charset" and "attributes-natural-language" attributes as described in section 3.1.4.2 of the IPP Model and Semantics document.
Status Message:
The standard response status message.

Group 2: Printer Attributes

"printer-id" (integer(0:65535)):
The numeric identifier for the created Printer.
"printer-is-accepting-jobs" (boolean):
Whether the created Printer is accepting jobs at the time of the response.
"printer-state" (type1 enum):
The state of the created Printer at the time of the response.
"printer-state-reasons" (1setOf type2 keyword):
The state keywords for the created Printer at the time of the response.
"printer-uri-supported" (1setOf uri):
The URIs for the created Printer.

Attributes

CUPS provides many extension attributes to support multiple devices, PPD files, standard job filters, printers, and printer classes.

Device AttributesDeprecated

Device attributes are returned by the CUPS-Get-Devices operation and enumerate all of the available hardware devices and network protocols that are supported by the server. Device attributes are reported in the printer-attributes-tag group.

device-class (type2 keyword)Deprecated

The "device-class" attribute provides the class of device and can be one of the following:

  • 'file': A disk file.
  • 'direct': A parallel or fixed-rate serial data port, currently used for Centronics, IEEE-1284, and USB printer ports.
  • 'serial': A variable-rate serial port.
  • 'network': A network connection, typically via AppSocket, HTTP, IPP, LPD, or SMB/CIFS protocols.

device-id (text(1023))Deprecated

The "device-id" attribute provides the IEEE-1284 device ID string for the device.

device-info (text(127))Deprecated

The "device-info" attribute specifies a human-readable string describing the device, e.g., 'Parallel Port #1'.

device-location (text(127))Deprecated

The "device-location" attribute specifies the physical location of the printer, e.g., '2nd Floor Computer Lab'.

device-make-and-model (text(127))Deprecated

The "device-make-and-model" attribute specifies a device identification string provided by the printer connected to the device. If the device or printer does not support identification then this attribute contains the string 'unknown'.

device-uri (uri)

The "device-uri" attribute specifies a unique identifier for the device. The actual format of the "device-uri" string depends on the value of the "device-class" attribute:

  • 'file': The "device-uri" will be of the form 'file:///path/to/filename'.
  • 'direct': The "device-uri" will be of the form 'scheme:/dev/filename' or 'scheme://vendor/identifier', where scheme may be 'parallel' or 'usb' in the current implementation.
  • 'serial': The "device-uri" will be of the form 'serial:/dev/filename?baud=value+parity=value+flow=value'. The baud value is the data rate in bits per second; the supported values depend on the underlying hardware. The parity value can be one of "none", "even", or "odd". The flow value can be one of "none", "soft" (XON/XOFF handshaking), "hard" or "rts/cts" (RTS/CTS handshaking), or "dtrdsr" (DTR/DSR handshaking).

    The URI returned by CUPS-Get-Devices will contain the maximum baud rate supported by the device and the best type of flow control available ("soft" or "hard").

  • 'network': The "device-uri" will be of the form 'scheme://[username:password@]hostname[:port]/[resource]', where scheme may be "http", "https", "ipp", "lpd", "smb", or "socket" in the current implementation.

    The URI returned by CUPS-Get-Devices MAY only contain the scheme name ('scheme'). It is up to the client application to add the appropriate host and other information when adding a new printer.

    The URI returned by Get-Printer-Attributes and CUPS-Get-Printers has any username and password information stripped; the information is still stored and used by the server internally to perform any needed authentication.

Job Attributes

auth-info (1setOf text(MAX))CUPS 1.3/macOS 10.5

The "auth-info" attribute specifies the authentication information to use when printing to a remote device. The order and content of each text value is specifed by the auth-info-required printer attribute.

job-cancel-after (integer(1:MAX))CUPS 2.0

The "job-cancel-after" attribute provides the maximum number of seconds that are allowed for processing a job.

job-hold-until (keyword | name(MAX))CUPS 1.1

The "job-hold-until" attribute specifies a hold time. In addition to the standard IPP/1.1 keyword names, CUPS supports name values of the form "HH:MM" and "HH:MM:SS" that specify a hold time. The hold time is in Universal Coordinated Time (UTC) and not in the local time zone. If the specified time is less than the current time, the job is held until the next day.

job-media-progress (integer(0:100))CUPS 1.4/macOS 10.6

The "job-media-progress" status attribute specifies the percentage of completion of the current page. It is only valid when the "job-state" attribute has the 'processing(5)' value.

job-printer-state-message (text(MAX))CUPS 1.3/macOS 10.5

The "job-printer-state-message" status attribute provides the last known value of the "printer-state-message" attribute for the printer that processed (or is processing) the job.

job-printer-state-reasons (1setOf type2 keyword)CUPS 1.3/macOS 10.5

The "job-printer-state-reasons" status attribute provides the last known value of the "printer-state-reasons" attribute for the printer that processed (or is processing) the job.

job-sheets (1setof type3 keyword | name(MAX))CUPS 1.1

The "job-sheets" attribute specifies one or two banner files that are printed before and after a job. The reserved value of "none" disables banner printing. The default value is stored in the "job-sheets-default" attribute.

If only one value is supplied, the banner file is printed before the job. If two values are supplied, the first value is used as the starting banner file and the second as the ending banner file.

job-originating-host-name (name(MAX))CUPS 1.1.5/macOS 10.2

The "job-originating-host-name" status attribute specifies the host from which the job was queued. The value will be the hostname or IP address of the client depending on whether hostname resolution is enabled. The localhost address (127.0.0.1) is always resolved to the name "localhost".

This attribute is read-only.

page-border (type2 keyword)CUPS 1.1.15

The "page-border" attribute specifies whether a border is draw around each page. The following keywords are presently defined:

  • 'double': Two hairline borders are drawn
  • 'double-thick': Two 1pt borders are drawn
  • 'none': No border is drawn (default)
  • 'single': A single hairline border is drawn
  • 'single-thick': A single 1pt border is drawn

page-set (type2 keyword)Deprecated

The "page-set" attribute specifies which pages to print in a file. The supported keywords are 'all', 'even', and 'odd'. The default value is 'all'.

PPD AttributesDeprecated

PPD attributes are returned in the printer-attributes-tag group.

ppd-device-id (text(127))Deprecated

The "ppd-device-id" attribute specifies the IEEE-1284 device ID string for the device described by the PPD file.

ppd-make (text(127))Deprecated

The "ppd-make" attribute specifies the manufacturer of the printer (the Manufacturer attribute in the PPD file). If the manufacturer is not specified in the PPD file then an educated guess is made using the NickName attribute in the PPD file.

ppd-make-and-model (text(127))Deprecated

The "ppd-make-and-model" attribute specifies the manufacturer and model name of the PPD file (the NickName attribute in the PPD file). If the make and model is not specified in the PPD file then the ModelName or ShortNickName attributes are used instead.

ppd-model-number (integer)Deprecated

The "ppd-model-number" attribute provides the cupsModelNumber value from the PPD file.

ppd-name (name(255))Deprecated

The "ppd-name" attribute specifies either the PPD filename on the server relative to the model directory or a URI that maps to a specific driver interface in the driver directory. The forward slash (/) is used to delineate directories.

ppd-natural-language (1setOf naturalLanguage)Deprecated

The "ppd-natural-language" attribute specifies the language encoding of the PPD file (the LanguageVersion attribute in the PPD file). If the language is unknown or undefined then "en" (English) is assumed.

ppd-product (1setOf text(127))Deprecated

The "ppd-product" attribute specifies the Product attribute values in the PPD file.

ppd-psversion (1setOf text(127))Deprecated

The "ppd-product" attribute specifies the PSVersion attribute values in the PPD file.

ppd-type (type1 keyword)Deprecated

The "ppd-type" attribute specifies the type of driver described by the PPD file:

  • 'fax': A facsimile or multi-function device
  • 'pdf': A PDF printer
  • 'postscript': A PostScript printer (no filters)
  • 'raster': A CUPS raster driver
  • 'unknown': An unknown or hybrid driver

Printer Attributes

auth-info-required (1setOf type2 keyword)CUPS 1.3/macOS 10.5

The "auth-info-required" attribute specifies the authentication information that is required for printing a job. The following keywords are recognized:

  • 'domain': A domain name is required.
  • 'negotiate': Kerberos is required - this keyword can only appear by itself and causes cupsd to collect the UID of the printing user.
  • 'none': No authentication is required - this keyword can only appear by itself.
  • 'password': A password is required.
  • 'username': A username is required. Some protocols (like SMB) prefix the username with the domain, for example "DOMAIN\user".

job-k-limit (integer)CUPS 1.1

The "job-k-limit" attribute specifies the maximum number of kilobytes that may be printed by a user, including banner files. The default value of 0 specifies that there is no limit.

job-page-limit (integer)CUPS 1.1

The "job-page-limit" attribute specifies the maximum number of pages that may be printed by a user, including banner files. The default value of 0 specifies that there is no limit.

job-quota-period (integer)CUPS 1.1

The "job-quota-period" attribute specifies the time period used for quota calculations, in seconds. The default value of 0 specifies that the limits apply to all jobs that have been printed by a user that are still known to the system.

marker-change-time (integer)CUPS 1.3/macOS 10.5

The "marker-change-time" status attribute specifies the "printer-up-time" value when the last change to the marker-colors, marker-levels, marker-message, marker-names, or marker-types attributes was made.

marker-colors (1setof name(MAX))CUPS 1.3/macOS 10.5

The "marker-colors" status attribute specifies the color(s) for each supply in the printer. It is only available when the driver provides supply levels. The color is either 'none' or one or more hex-encoded sRGB colors of the form '#RRGGBB'.

marker-high-levels (1setof integer(0:100))CUPS 1.4/macOS 10.6

The "marker-high-levels" status attribute specifies the supply levels that indicate a near-full condition. A value of 100 should be used for supplies that are consumed/emptied, e.g. ink cartridges.

marker-levels (1setof integer(-3:100))CUPS 1.3/macOS 10.5

The "marker-levels" status attribute specifies the current supply levels for the printer. It is only available when the driver provides supply levels. A value of -1 indicates the level is unavailable, -2 indicates unknown, and -3 indicates the level is unknown but has not yet reached capacity. Values from 0 to 100 indicate the corresponding percentage.

marker-low-levels (1setof integer(0:100))CUPS 1.4/macOS 10.6

The "marker-low-levels" status attribute specifies the supply levels that indicate a near-empty condition. A value of 0 should be used for supplies that are filled, e.g. waste ink tanks.

marker-message (text(MAX))CUPS 1.4/macOS 10.6

The "marker-message" status attribute provides a human-readable status message for the current supply levels, e.g. "12 pages of ink remaining." It is only available when the driver provides supply levels.

marker-names (1setof name(MAX))CUPS 1.3/macOS 10.5

The "marker-names" status attribute specifies the name(s) for each supply in the printer. It is only available when the driver provides supply levels.

marker-types (1setof type3 keyword)CUPS 1.3/macOS 10.5

The "marker-types" status attribute specifies the type(s) of each supply in the printer. It is only available when the driver provides supply levels. The following (RFC 3805) types are currently supported:

  • 'toner'
  • 'waste-toner'
  • 'ink'
  • 'ink-cartridge'
  • 'ink-ribbon'
  • 'waste-ink'
  • 'opc'
  • 'developer'
  • 'fuser-oil'
  • 'solid-wax'
  • 'ribbon-wax'
  • 'waste-wax'
  • 'fuser'
  • 'corona-wire'
  • 'fuser-oil-wick'
  • 'cleaner-unit'
  • 'fuser-cleaning-pad'
  • 'transfer-unit'
  • 'toner-cartridge'
  • 'fuser-oiler'
  • 'water'
  • 'waste-water'
  • 'binding-supply'
  • 'banding-supply'
  • 'stiching-wire'
  • 'shrink-wrap'
  • 'paper-wrap'
  • 'staples'
  • 'inserts'
  • 'covers'

port-monitor" (name(127))Deprecated

The "port-monitor" attribute specifies the port monitor to use when printing to this printer. The default port monitor is 'none'.

port-monitor-supported" (1setOf name(127))Deprecated

The "port-monitor-supported" attribute specifies the available port monitors.

printer-commands (1setOf Type3 keyword)Deprecated

The "printer-commands" attribute specifies the commands that are supported by the CUPS command file filter. The keyword 'none' indicates that no commands are supported.

printer-dns-sd-name (name(MAX) | noValue)CUPS 1.4/macOS 10.6

The "printer-dns-sd-name" attribute specifies the registered DNS-SD service name for the printer. If the printer is not being shared using this protocol, "printer-dns-sd-name" will have the no-value value.

printer-id (integer(0:65535)CUPS 2.2

The "printer-id" status attribute provides a unique integer identifying the printer. It is used when only an IP address and integer are provided for identifying a print queue.

printer-type (type2 enum)

The "printer-type" status attribute specifies printer type and capability bits for the printer or class. The default value is computed from internal state information and the PPD file for the printer. The following bits are defined:

Bit Description
0x00000001 Is a printer class.
0x00000002 Is a remote destination.
0x00000004 Can print in black.
0x00000008 Can print in color.
0x00000010 Can print on both sides of the page in hardware.
0x00000020 Can staple output.
0x00000040 Can do fast copies in hardware.
0x00000080 Can do fast copy collation in hardware.
0x00000100 Can punch output.
0x00000200 Can cover output.
0x00000400 Can bind output.
0x00000800 Can sort output.
0x00001000 Can handle media up to US-Legal/A4.
0x00002000 Can handle media from US-Legal/A4 to ISO-C/A2.
0x00004000 Can handle media larger than ISO-C/A2.
0x00008000 Can handle user-defined media sizes.
0x00010000 Is an implicit (server-generated) class.
0x00020000 Is the a default printer on the network.
0x00040000 Is a facsimile device.
0x00080000 Is rejecting jobs.
0x00100000 Delete this queue.
0x00200000 Queue is not shared.
0x00400000 Queue requires authentication.
0x00800000 Queue supports CUPS command files.
0x01000000 Queue was automatically discovered and added.
0x02000000 Queue is a scanner with no printing capabilities.
0x04000000 Queue is a printer with scanning capabilities.
0x08000000 Queue is a printer with 3D capabilities.

printer-type-mask (type2 enum)CUPS 1.1

The "printer-type-mask" attribute is used to choose printers or classes with the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits are defined identically to the printer-type attribute and default to all 1's.

requesting-user-name-allowed (1setof name(127))CUPS 1.1

The "requesting-user-name-allowed" attribute lists all of the users that are allowed to access a printer or class. Either this attribute or the "requesting-user-name-denied" attribute will be defined, but not both.

requesting-user-name-denied (1setof name(127))CUPS 1.1

The "requesting-user-name-denied" attribute lists all of the users that are not allowed to access a printer or class. Either this attribute or the "requesting-user-name-allowed" attribute will be defined, but not both.

Printer Class Attributes

Printer class attributes are placed in the printer-attributes-tag group.

member-names (1setof name(127))

The "member-names" attribute specifies the "printer-name" attributes for each the member printer and class. Each name corresponds to the same element of the "member-uris" attribute.

member-uris (1setof uri)

The "member-uris" attribute specifies the "printer-uri-supported" values for each member printer and class. Each URI corresponds to the same element of the "member-names" attribute. cups-2.3.1/doc/help/man-mime.types.html000664 000765 000024 00000012743 13574721672 020034 0ustar00mikestaff000000 000000 mime.types(5)

mime.types(5)

Name

mime.types - mime type description file for cups

Description

The mime.types file defines the recognized file types.

Additional file types are specified in files with the extension .types in the CUPS configuration directory.

Each line in the mime.types file is a comment, blank, or rule line. Comment lines start with the # character. Rule lines start with the MIME media type and are optionally followed by a series of file recognition rules:


    mime/type [ rule ... rule ]

Rules can be extended over multiple lines using the backslash character (\):

    mime/type [ really-really-really-long-rule ... \
      rule ]

MIME media types specified by the mime/type field are case-insensitive and are sorted in ascending alphanumeric order for the purposes of matching. See the "TYPE MATCHING AND PRIORITY" section for more information.

The rules may be grouped using parenthesis, joined using "+" for a logical AND, joined using "," or whitespace for a logical OR, and negated using "!".

Rules

Rules take two forms - a filename extension by itself and functions with test values inside parenthesis. The following functions are available:
match("pattern")
True if the filename matches the given shell wildcard pattern.
ascii(offset,length)
True if the length bytes starting at offset are valid printable ASCII (CR, NL, TAB, BS, 32-126).
printable(offset,length)
True if the length bytes starting at offset are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254).
priority(number)
Specifies the relative priority of this MIME media type. The default priority is 100. Larger values have higher priority while smaller values have lower priority.
string(offset,"string")
True if the bytes starting at offset are identical to string.
istring(offset,"string")
True if the bytes starting at offset match string without respect to case.
char(offset,value)
True if the byte at offset is identical to value.
short(offset,value)
True if the 16-bit big-endian integer at offset is identical to value.
int(offset,value)
True if the 32-bit big-endian integer at offset is identical to value.
locale("string")
True if current locale matches string.
contains(offset,range,"string")
True if the bytes starting at offset for range bytes contains string.

String Constants

String constants can be specified inside quotes ("") for strings containing whitespace and angle brackets (<>) for hexadecimal strings.

Type Matching And Priority

When CUPS needs to determine the MIME media type of a given file, it checks every MIME media type defined in the .types files. When two or more types match a given file, the type chosen will depend on the type name and priority, with higher-priority types being used over lower-priority ones. If the types have the same priority, the type names are sorted alphanumerically in ascending order and the first type is chosen.

For example, if two types "text/bar" and "text/foo" are defined as matching the extension "doc", normally the type "text/bar" will be chosen since its name is alphanumerically smaller than "text/foo". However, if "text/foo" also defines a higher priority than "text/bar", "text/foo" will be chosen instead.

Files

/etc/cups - Typical CUPS configuration directory.

Examples

Define two MIME media types for raster data, with one being a subset with higher priority:

    application/vnd.cups-raster  string(0,"RaSt") string(0,"tSaR") \
                                  string(0,"RaS2") string(0,"2SaR") \
                                  string(0,"RaS3") string(0,"3SaR")

    image/pwg-raster              string(0,"RaS2") + \
                                  string(4,PwgRaster<00>) priority(150)

See Also

cups-files.conf(5), cupsd.conf(5), cupsd(8), cupsfilter(8), mime.convs(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-ppdmerge.html000664 000765 000024 00000003377 13574721672 017550 0ustar00mikestaff000000 000000 ppdmerge(1)

ppdmerge(1)

Name

ppdmerge - merge ppd files (deprecated)

Synopsis

ppdmerge [ -o output-ppd-file ] ppd-file ppd-file [ ... ppd-file ]

Description

ppdmerge merges two or more PPD files into a single, multi-language PPD file. This program is deprecated and will be removed in a future release of CUPS.

Options

ppdmerge supports the following options:
-o output-ppd-file
Specifies the PPD file to create. If not specified, the merged PPD file is written to the standard output. If the output file already exists, it is silently overwritten.

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

ppdmerge does not check whether the merged PPD files are for the same device. Merging of different device PPDs will yield unpredictable results.

See Also

ppdc(1), ppdhtml(1), ppdi(1), ppdpo(1), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/cupspm.html000664 000765 000024 00001344547 13574721672 016513 0ustar00mikestaff000000 000000 CUPS Programming Manual

CUPS Programming Manual

Michael R Sweet

Copyright © 2007-2019 by Apple Inc. All Rights Reserved.

Contents

Please file issues on Github to provide feedback on this document.

Introduction

CUPS provides the "cups" library to talk to the different parts of CUPS and with Internet Printing Protocol (IPP) printers. The "cups" library functions are accessed by including the <cups/cups.h> header.

CUPS is based on the Internet Printing Protocol ("IPP"), 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 http_t. The CUPS_HTTP_DEFAULT constant can be used when you want to talk to the CUPS scheduler.

Guidelines

When writing software (other than printer drivers) that uses the "cups" library:

  • Do not use undocumented or deprecated APIs,
  • Do not rely on pre-configured printers,
  • Do not assume that printers support specific features or formats, and
  • Do not rely on implementation details (PPDs, etc.)

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 ("print four copies, two-sided on A4 media, and staple each copy") and have the printing system manage the printer communication and format conversion needed.

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.

Note:

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 CUPS.org for more information.

Terms Used in This Document

A Destination is a printer or print queue that accepts print jobs. A Print Job is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A Document is a file (JPEG image, PDF file, etc.) suitable for printing. An Option controls some aspect of printing, such as the media used. Media is the sheets or roll that is printed on. An Attribute is an option encoded for an Internet Printing Protocol (IPP) request.

Compiling Programs That Use the CUPS API

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.

The following simple program lists the available destinations:

#include <stdio.h>
#include <cups/cups.h>

int print_dest(void *user_data, unsigned flags, cups_dest_t *dest)
{
  if (dest->instance)
    printf("%s/%s\n", dest->name, dest->instance);
  else
    puts(dest->name);

  return (1);
}

int main(void)
{
  cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, print_dest, NULL);

  return (0);
}

Compiling with Xcode

In Xcode, choose New Project... from the File menu (or press SHIFT+CMD+N), then select the Command Line Tool under the macOS Application project type. Click Next and enter a name for the project, for example "firstcups". Click Next and choose a project directory. The click Next to create the project.

In the project window, click on the Build Phases group and expand the Link Binary with Libraries section. Click +, type "libcups" to show the library, and then double-click on libcups.tbd.

Finally, click on the main.c file in the sidebar and copy the example program to the file. Build and run (CMD+R) to see the list of destinations.

Compiling with GCC

From the command-line, create a file called simple.c 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:

gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
./simple

The cups-config command provides the compiler flags (cups-config --cflags) and libraries (cups-config --libs) needed for the local system.

Working with Destinations

Destinations, which in CUPS represent individual printers or classes (collections or pools) of printers, are represented by the cups_dest_t structure which includes the name (name), instance (instance, saved options/settings), whether the destination is the default for the user (is_default), and the options and basic information associated with that destination (num_options and options).

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.

Finding Available Destinations

The cupsEnumDests function finds all of the available destinations:

 int
 cupsEnumDests(unsigned flags, int msec, int *cancel,
               cups_ptype_t type, cups_ptype_t mask,
               cups_dest_cb_t cb, void *user_data)

The flags argument specifies enumeration options, which at present must be CUPS_DEST_FLAGS_NONE.

The msec argument specifies the maximum amount of time that should be used for enumeration in milliseconds - interactive applications should keep this value to 5000 or less when run on the main thread.

The cancel 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 NULL if not needed.

The type and mask arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's "printer-type" value is masked by the mask value and compared to the type value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass CUPS_PRINTER_LOCAL for the type argument and CUPS_PRINTER_DISCOVERED for the mask argument. The following constants can be used for filtering:

  • CUPS_PRINTER_CLASS: A collection of destinations.
  • CUPS_PRINTER_FAX: A facsimile device.
  • CUPS_PRINTER_LOCAL: A local printer or class. This constant has the value 0 (no bits set) and is only used for the type argument and is paired with the CUPS_PRINTER_REMOTE or CUPS_PRINTER_DISCOVERED constant passed in the mask argument.
  • CUPS_PRINTER_REMOTE: A remote (shared) printer or class.
  • CUPS_PRINTER_DISCOVERED: An available network printer or class.
  • CUPS_PRINTER_BW: Can do B&W printing.
  • CUPS_PRINTER_COLOR: Can do color printing.
  • CUPS_PRINTER_DUPLEX: Can do two-sided printing.
  • CUPS_PRINTER_STAPLE: Can staple output.
  • CUPS_PRINTER_COLLATE: Can quickly collate copies.
  • CUPS_PRINTER_PUNCH: Can punch output.
  • CUPS_PRINTER_COVER: Can cover output.
  • CUPS_PRINTER_BIND: Can bind output.
  • CUPS_PRINTER_SORT: Can sort output (mailboxes, etc.)
  • CUPS_PRINTER_SMALL: Can print on Letter/Legal/A4-size media.
  • CUPS_PRINTER_MEDIUM: Can print on Tabloid/B/C/A3/A2-size media.
  • CUPS_PRINTER_LARGE: Can print on D/E/A1/A0-size media.
  • CUPS_PRINTER_VARIABLE: Can print on rolls and custom-size media.

The cb argument specifies a function to call for every destination that is found:

typedef int (*cups_dest_cb_t)(void *user_data,
                              unsigned flags,
                              cups_dest_t *dest);

The callback function receives a copy of the user_data argument along with a bitfield (flags) and the destination that was found. The flags argument can have any of the following constant (bit) values set:

  • CUPS_DEST_FLAGS_MORE: There are more destinations coming.
  • CUPS_DEST_FLAGS_REMOVED: The destination has gone away and should be removed from the list of destinations a user can select.
  • CUPS_DEST_FLAGS_ERROR: An error occurred. The reason for the error can be found by calling the cupsLastError and/or cupsLastErrorString functions.

The callback function returns 0 to stop enumeration or 1 to continue.

Note:

The callback function will likely be called multiple times for the same destination, so it is up to the caller to suppress any duplicate destinations.

The following example shows how to use cupsEnumDests to get a filtered array of destinations:

typedef struct
{
  int num_dests;
  cups_dest_t *dests;
} my_user_data_t;

int
my_dest_cb(my_user_data_t *user_data, unsigned flags,
           cups_dest_t *dest)
{
  if (flags & CUPS_DEST_FLAGS_REMOVED)
  {
   /*
    * Remove destination from array...
    */

    user_data->num_dests =
        cupsRemoveDest(dest->name, dest->instance,
                       user_data->num_dests,
                       &(user_data->dests));
  }
  else
  {
   /*
    * Add destination to array...
    */

    user_data->num_dests =
        cupsCopyDest(dest, user_data->num_dests,
                     &(user_data->dests));
  }

  return (1);
}

int
my_get_dests(cups_ptype_t type, cups_ptype_t mask,
             cups_dest_t **dests)
{
  my_user_data_t user_data = { 0, NULL };

  if (!cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, type,
                     mask, (cups_dest_cb_t)my_dest_cb,
                     &user_data))
  {
   /*
    * An error occurred, free all of the destinations and
    * return...
    */

    cupsFreeDests(user_data.num_dests, user_dasta.dests);

    *dests = NULL;

    return (0);
  }

 /*
  * Return the destination array...
  */

  *dests = user_data.dests;

  return (user_data.num_dests);
}

Basic Destination Information

The num_options and options members of the cups_dest_t 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:

  • "auth-info-required": The type of authentication required for printing to this destination: "none", "username,password", "domain,username,password", or "negotiate" (Kerberos).
  • "printer-info": The human-readable description of the destination such as "My Laser Printer".
  • "printer-is-accepting-jobs": "true" if the destination is accepting new jobs, "false" otherwise.
  • "printer-is-shared": "true" if the destination is being shared with other computers, "false" otherwise.
  • "printer-location": The human-readable location of the destination such as "Lab 4".
  • "printer-make-and-model": The human-readable make and model of the destination such as "ExampleCorp LaserPrinter 4000 Series".
  • "printer-state": "3" if the destination is idle, "4" if the destination is printing a job, and "5" if the destination is stopped.
  • "printer-state-change-time": The UNIX time when the destination entered the current state.
  • "printer-state-reasons": Additional comma-delimited state keywords for the destination such as "media-tray-empty-error" and "toner-low-warning".
  • "printer-type": The cups_ptype_t value associated with the destination.
  • "printer-uri-supported": The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer.

Use the cupsGetOption function to retrieve the value. For example, the following code gets the make and model of a destination:

const char *model = cupsGetOption("printer-make-and-model",
                                  dest->num_options,
                                  dest->options);

Detailed Destination Information

Once a destination has been chosen, the cupsCopyDestInfo function can be used to gather detailed information about the destination:

cups_dinfo_t *
cupsCopyDestInfo(http_t *http, cups_dest_t *dest);

The http argument specifies a connection to the CUPS scheduler and is typically the constant CUPS_HTTP_DEFAULT. The dest argument specifies the destination to query.

The cups_dinfo_t 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.

Getting Supported Options and Values

The cupsCheckDestSupported function can be used to test whether a particular option or option and value is supported:

int
cupsCheckDestSupported(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *info,
                       const char *option,
                       const char *value);

The option argument specifies the name of the option to check. The following constants can be used to check the various standard options:

  • CUPS_COPIES: Controls the number of copies that are produced.
  • CUPS_FINISHINGS: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding.
  • CUPS_MEDIA: Controls the media size that is used, typically one of the following: CUPS_MEDIA_3X5, CUPS_MEDIA_4X6, CUPS_MEDIA_5X7, CUPS_MEDIA_8X10, CUPS_MEDIA_A3, CUPS_MEDIA_A4, CUPS_MEDIA_A5, CUPS_MEDIA_A6, CUPS_MEDIA_ENV10, CUPS_MEDIA_ENVDL, CUPS_MEDIA_LEGAL, CUPS_MEDIA_LETTER, CUPS_MEDIA_PHOTO_L, CUPS_MEDIA_SUPERBA3, or CUPS_MEDIA_TABLOID.
  • CUPS_MEDIA_SOURCE: Controls where the media is pulled from, typically either CUPS_MEDIA_SOURCE_AUTO or CUPS_MEDIA_SOURCE_MANUAL.
  • CUPS_MEDIA_TYPE: Controls the type of media that is used, typically one of the following: CUPS_MEDIA_TYPE_AUTO, CUPS_MEDIA_TYPE_ENVELOPE, CUPS_MEDIA_TYPE_LABELS, CUPS_MEDIA_TYPE_LETTERHEAD, CUPS_MEDIA_TYPE_PHOTO, CUPS_MEDIA_TYPE_PHOTO_GLOSSY, CUPS_MEDIA_TYPE_PHOTO_MATTE, CUPS_MEDIA_TYPE_PLAIN, or CUPS_MEDIA_TYPE_TRANSPARENCY.
  • CUPS_NUMBER_UP: Controls the number of document pages that are placed on each media side.
  • CUPS_ORIENTATION: Controls the orientation of document pages placed on the media: CUPS_ORIENTATION_PORTRAIT or CUPS_ORIENTATION_LANDSCAPE.
  • CUPS_PRINT_COLOR_MODE: Controls whether the output is in color (CUPS_PRINT_COLOR_MODE_COLOR), grayscale (CUPS_PRINT_COLOR_MODE_MONOCHROME), or either (CUPS_PRINT_COLOR_MODE_AUTO).
  • CUPS_PRINT_QUALITY: Controls the generate quality of the output: CUPS_PRINT_QUALITY_DRAFT, CUPS_PRINT_QUALITY_NORMAL, or CUPS_PRINT_QUALITY_HIGH.
  • CUPS_SIDES: Controls whether prints are placed on one or both sides of the media: CUPS_SIDES_ONE_SIDED, CUPS_SIDES_TWO_SIDED_PORTRAIT, or CUPS_SIDES_TWO_SIDED_LANDSCAPE.

If the value argument is NULL, the cupsCheckDestSupported function returns whether the option is supported by the destination. Otherwise, the function returns whether the specified value of the option is supported.

The cupsFindDestSupported function returns the IPP attribute containing the supported values for a given option:

 ipp_attribute_t *
 cupsFindDestSupported(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *dinfo,
                       const char *option);

For example, the following code prints the supported finishing processes for a destination, if any, to the standard output:

cups_dinfo_t *info = cupsCopyDestInfo(CUPS_HTTP_DEFAULT,
                                      dest);

if (cupsCheckDestSupported(CUPS_HTTP_DEFAULT, dest, info,
                           CUPS_FINISHINGS, NULL))
{
  ipp_attribute_t *finishings =
      cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info,
                            CUPS_FINISHINGS);
  int i, count = ippGetCount(finishings);

  puts("finishings supported:");
  for (i = 0; i < count; i ++)
    printf("  %d\n", ippGetInteger(finishings, i));
}
else
  puts("finishings not supported.");

The "job-creation-attributes" option can be queried to get a list of supported options. For example, the following code prints the list of supported options to the standard output:

ipp_attribute_t *attrs =
    cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info,
                          "job-creation-attributes");
int i, count = ippGetCount(attrs);

for (i = 0; i < count; i ++)
  puts(ippGetString(attrs, i, NULL));

Getting Default Values

There are two sets of default values - user defaults that are available via the num_options and options members of the cups_dest_t structure, and destination defaults that available via the cups_dinfo_t structure and the cupsFindDestDefault function which returns the IPP attribute containing the default value(s) for a given option:

ipp_attribute_t *
cupsFindDestDefault(http_t *http, cups_dest_t *dest,
                    cups_dinfo_t *dinfo,
                    const char *option);

The user defaults from cupsGetOption should always take preference over the destination defaults. For example, the following code prints the default finishings value(s) to the standard output:

const char *def_value =
    cupsGetOption(CUPS_FINISHINGS, dest->num_options,
                  dest->options);
ipp_attribute_t *def_attr =
    cupsFindDestDefault(CUPS_HTTP_DEFAULT, dest, info,
                        CUPS_FINISHINGS);

if (def_value != NULL)
{
  printf("Default finishings: %s\n", def_value);
}
else
{
  int i, count = ippGetCount(def_attr);

  printf("Default finishings: %d",
         ippGetInteger(def_attr, 0));
  for (i = 1; i < count; i ++)
    printf(",%d", ippGetInteger(def_attr, i));
  putchar('\n');
}

Getting Ready (Loaded) Values

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.

The cupsFindDestReady function finds the IPP attribute containing the ready values for a given option:

ipp_attribute_t *
cupsFindDestReady(http_t *http, cups_dest_t *dest,
                  cups_dinfo_t *dinfo, const char *option);

For example, the following code lists the ready finishing processes:

ipp_attribute_t *ready_finishings =
    cupsFindDestReady(CUPS_HTTP_DEFAULT, dest, info,
                      CUPS_FINISHINGS);

if (ready_finishings != NULL)
{
  int i, count = ippGetCount(ready_finishings);

  puts("finishings ready:");
  for (i = 0; i < count; i ++)
    printf("  %d\n", ippGetInteger(ready_finishings, i));
}
else
  puts("no finishings are ready.");

Media Size Options

CUPS provides functions for querying the dimensions and margins for each of the supported media size options. The cups_size_t structure is used to describe a media size:

typedef struct cups_size_s
{
  char media[128];
  int width, length;
  int bottom, left, right, top;
} cups_size_t;

The width and length members specify the dimensions of the media in hundredths of millimeters (1/2540th of an inch). The bottom, left, right, and top members specify the margins of the printable area, also in hundredths of millimeters.

The cupsGetDestMediaByName and cupsGetDestMediaBySize functions lookup the media size information using a standard media size name or dimensions in hundredths of millimeters:

int
cupsGetDestMediaByName(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *dinfo,
                       const char *media,
                       unsigned flags, cups_size_t *size);

int
cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *dinfo,
                       int width, int length,
                       unsigned flags, cups_size_t *size);

The media, width, and length arguments specify the size to lookup. The flags argument specifies a bitfield controlling various lookup options:

  • CUPS_MEDIA_FLAGS_DEFAULT: Find the closest size supported by the printer.
  • CUPS_MEDIA_FLAGS_BORDERLESS: Find a borderless size.
  • CUPS_MEDIA_FLAGS_DUPLEX: Find a size compatible with two-sided printing.
  • CUPS_MEDIA_FLAGS_EXACT: Find an exact match for the size.
  • CUPS_MEDIA_FLAGS_READY: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the "ready" media.

If a matching size is found for the destination, the size information is stored in the structure pointed to by the size argument and 1 is returned. Otherwise 0 is returned.

For example, the following code prints the margins for two-sided printing on US Letter media:

cups_size_t size;

if (cupsGetDestMediaByName(CUPS_HTTP_DEFAULT, dest, info,
                           CUPS_MEDIA_LETTER,
                           CUPS_MEDIA_FLAGS_DUPLEX, &size))
{
  puts("Margins for duplex US Letter:");
  printf("  Bottom: %.2fin\n", size.bottom / 2540.0);
  printf("    Left: %.2fin\n", size.left / 2540.0);
  printf("   Right: %.2fin\n", size.right / 2540.0);
  printf("     Top: %.2fin\n", size.top / 2540.0);
}
else
  puts("Margins for duplex US Letter are not available.");

You can also enumerate all of the sizes that match a given flags value using the cupsGetDestMediaByIndex and cupsGetDestMediaCount functions:

int
cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest,
                        cups_dinfo_t *dinfo, int n,
                        unsigned flags, cups_size_t *size);

int
cupsGetDestMediaCount(http_t *http, cups_dest_t *dest,
                      cups_dinfo_t *dinfo, unsigned flags);

For example, the following code prints the list of ready media and corresponding margins:

cups_size_t size;
int i;
int count = cupsGetDestMediaCount(CUPS_HTTP_DEFAULT,
                                  dest, info,
                                  CUPS_MEDIA_FLAGS_READY);

for (i = 0; i < count; i ++)
{
  if (cupsGetDestMediaByIndex(CUPS_HTTP_DEFAULT, dest, info,
                              i, CUPS_MEDIA_FLAGS_READY,
                              &size))
  {
    printf("%s:\n", size.name);
    printf("   Width: %.2fin\n", size.width / 2540.0);
    printf("  Length: %.2fin\n", size.length / 2540.0);
    printf("  Bottom: %.2fin\n", size.bottom / 2540.0);
    printf("    Left: %.2fin\n", size.left / 2540.0);
    printf("   Right: %.2fin\n", size.right / 2540.0);
    printf("     Top: %.2fin\n", size.top / 2540.0);
  }
}

Finally, the cupsGetDestMediaDefault function returns the default media size:

int
cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest,
                        cups_dinfo_t *dinfo, unsigned flags,
                        cups_size_t *size);

Localizing Options and Values

CUPS provides three functions to get localized, human-readable strings in the user's current locale for options and values: cupsLocalizeDestMedia, cupsLocalizeDestOption, and cupsLocalizeDestValue:

const char *
cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest,
                      cups_dinfo_t *info, unsigned flags,
                      cups_size_t *size);

const char *
cupsLocalizeDestOption(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *info,
                       const char *option);

const char *
cupsLocalizeDestValue(http_t *http, cups_dest_t *dest,
                      cups_dinfo_t *info,
                      const char *option, const char *value);

Submitting a Print Job

Once you are ready to submit a print job, you create a job using the cupsCreateDestJob function:

ipp_status_t
cupsCreateDestJob(http_t *http, cups_dest_t *dest,
                  cups_dinfo_t *info, int *job_id,
                  const char *title, int num_options,
                  cups_option_t *options);

The title argument specifies a name for the print job such as "My Document". The num_options and options arguments specify the options for the print job which are allocated using the cupsAddOption function.

When successful, the job's numeric identifier is stored in the integer pointed to by the job_id argument and IPP_STATUS_OK is returned. Otherwise, an IPP error status is returned.

For example, the following code creates a new job that will print 42 copies of a two-sided US Letter document:

int job_id = 0;
int num_options = 0;
cups_option_t *options = NULL;

num_options = cupsAddOption(CUPS_COPIES, "42",
                            num_options, &options);
num_options = cupsAddOption(CUPS_MEDIA, CUPS_MEDIA_LETTER,
                            num_options, &options);
num_options = cupsAddOption(CUPS_SIDES,
                            CUPS_SIDES_TWO_SIDED_PORTRAIT,
                            num_options, &options);

if (cupsCreateDestJob(CUPS_HTTP_DEFAULT, dest, info,
                      &job_id, "My Document", num_options,
                      options) == IPP_STATUS_OK)
  printf("Created job: %d\n", job_id);
else
  printf("Unable to create job: %s\n",
         cupsLastErrorString());

Once the job is created, you submit documents for the job using the cupsStartDestDocument, cupsWriteRequestData, and cupsFinishDestDocument functions:

http_status_t
cupsStartDestDocument(http_t *http, cups_dest_t *dest,
                      cups_dinfo_t *info, int job_id,
                      const char *docname,
                      const char *format,
                      int num_options,
                      cups_option_t *options,
                      int last_document);

http_status_t
cupsWriteRequestData(http_t *http, const char *buffer,
                     size_t length);

ipp_status_t
cupsFinishDestDocument(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *info);

The docname argument specifies the name of the document, typically the original filename. The format argument specifies the MIME media type of the document, including the following constants:

  • CUPS_FORMAT_JPEG: "image/jpeg"
  • CUPS_FORMAT_PDF: "application/pdf"
  • CUPS_FORMAT_POSTSCRIPT: "application/postscript"
  • CUPS_FORMAT_TEXT: "text/plain"

The num_options and options arguments specify per-document print options, which at present must be 0 and NULL. The last_document argument specifies whether this is the last document in the job.

For example, the following code submits a PDF file to the job that was just created:

FILE *fp = fopen("filename.pdf", "rb");
size_t bytes;
char buffer[65536];

if (cupsStartDestDocument(CUPS_HTTP_DEFAULT, dest, info,
                          job_id, "filename.pdf", 0, NULL,
                          1) == HTTP_STATUS_CONTINUE)
{
  while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
    if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
                             bytes) != HTTP_STATUS_CONTINUE)
      break;

  if (cupsFinishDestDocument(CUPS_HTTP_DEFAULT, dest,
                             info) == IPP_STATUS_OK)
    puts("Document send succeeded.");
  else
    printf("Document send failed: %s\n",
           cupsLastErrorString());
}

fclose(fp);

Sending IPP Requests

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.

Connecting to the Scheduler or Printer

The connection to the scheduler or printer is represented by the HTTP connection type http_t. The cupsConnectDest function connects to the scheduler or printer associated with the destination:

http_t *
cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec,
                int *cancel, char *resource,
                size_t resourcesize, cups_dest_cb_t cb,
                void *user_data);

The dest argument specifies the destination to connect to.

The flags argument specifies whether you want to connect to the scheduler (CUPS_DEST_FLAGS_NONE) or device/printer (CUPS_DEST_FLAGS_DEVICE) associated with the destination.

The msec argument specifies how long you are willing to wait for the connection to be established in milliseconds. Specify a value of -1 to wait indefinitely.

The cancel argument specifies the address of an integer variable that can be set to a non-zero value to cancel the connection. Specify a value of NULL to not provide a cancel variable.

The resource and resourcesize arguments specify the address and size of a character string array to hold the path to use when sending an IPP request.

The cb and user_data arguments specify a destination callback function that returns 1 to continue connecting or 0 to stop. The destination callback work the same way as the one used for the cupsEnumDests function.

On success, a HTTP connection is returned that can be used to send IPP requests and get IPP responses.

For example, the following code connects to the printer associated with a destination with a 30 second timeout:

char resource[256];
http_t *http = cupsConnectDest(dest, CUPS_DEST_FLAGS_DEVICE,
                               30000, NULL, resource,
                               sizeof(resource), NULL, NULL);

Creating an IPP Request

IPP requests are represented by the IPP message type ipp_t and each IPP attribute in the request is representing using the type ipp_attribute_t. Each IPP request includes an operation code (IPP_OP_CREATE_JOB, IPP_OP_GET_PRINTER_ATTRIBUTES, etc.) and a 32-bit integer identifier.

The ippNewRequest function creates a new IPP request:

ipp_t *
ippNewRequest(ipp_op_t op);

The op argument specifies the IPP operation code for the request. For example, the following code creates an IPP Get-Printer-Attributes request:

ipp_t *request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);

The request identifier is automatically set to a unique value for the current process.

Each IPP request starts with two IPP attributes, "attributes-charset" and "attributes-natural-language", followed by IPP attribute(s) that specify the target of the operation. The ippNewRequest automatically adds the correct "attributes-charset" and "attributes-natural-language" attributes, but you must add the target attribute(s). For example, the following code adds the "printer-uri" attribute to the IPP Get-Printer-Attributes request to specify which printer is being queried:

const char *printer_uri = cupsGetOption("device-uri",
                                        dest->num_options,
                                        dest->options);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
             "printer-uri", NULL, printer_uri);

Note:

If we wanted to query the scheduler instead of the device, we would look up the "printer-uri-supported" option instead of the "device-uri" value.

The ippAddString function adds the "printer-uri" attribute the the IPP request. The IPP_TAG_OPERATION argument specifies that the attribute is part of the operation. The IPP_TAG_URI argument specifies that the value is a Universal Resource Identifier (URI) string. The NULL argument specifies there is no language (English, French, Japanese, etc.) associated with the string, and the printer_uri argument specifies the string value.

The IPP Get-Printer-Attributes request also supports an IPP attribute called "requested-attributes" that lists the attributes and values you are interested in. For example, the following code requests the printer state attributes:

static const char * const requested_attributes[] =
{
  "printer-state",
  "printer-state-message",
  "printer-state-reasons"
};

ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
              "requested-attributes", 3, NULL,
              requested_attributes);

The ippAddStrings function adds an attribute with one or more strings, in this case three. The IPP_TAG_KEYWORD argument specifies that the strings are keyword values, which are used for attribute names. All strings use the same language (NULL), and the attribute will contain the three strings in the array requested_attributes.

CUPS provides many functions to adding attributes of different types:

  • ippAddBoolean adds a boolean (IPP_TAG_BOOLEAN) attribute with one value.
  • ippAddInteger adds an enum (IPP_TAG_ENUM) or integer (IPP_TAG_INTEGER) attribute with one value.
  • ippAddIntegers adds an enum or integer attribute with one or more values.
  • ippAddOctetString adds an octetString attribute with one value.
  • ippAddOutOfBand adds a admin-defined (IPP_TAG_ADMINDEFINE), default (IPP_TAG_DEFAULT), delete-attribute (IPP_TAG_DELETEATTR), no-value (IPP_TAG_NOVALUE), not-settable (IPP_TAG_NOTSETTABLE), unknown (IPP_TAG_UNKNOWN), or unsupported (IPP_TAG_UNSUPPORTED_VALUE) out-of-band attribute.
  • ippAddRange adds a rangeOfInteger attribute with one range.
  • ippAddRanges adds a rangeOfInteger attribute with one or more ranges.
  • ippAddResolution adds a resolution attribute with one resolution.
  • ippAddResolutions adds a resolution attribute with one or more resolutions.
  • ippAddString adds a charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME and IPP_TAG_NAMELANG), naturalLanguage (IPP_TAG_NATURAL_LANGUAGE), text (IPP_TAG_TEXT and IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), or uriScheme (IPP_TAG_URISCHEME) attribute with one value.
  • ippAddStrings adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values.

Sending the IPP Request

Once you have created the IPP request, you can send it using the cupsDoRequest function. For example, the following code sends the IPP Get-Printer-Attributes request to the destination and saves the response:

ipp_t *response = cupsDoRequest(http, request, resource);

For requests like Send-Document that include a file, the cupsDoFileRequest function should be used:

ipp_t *response = cupsDoFileRequest(http, request, resource,
                                    filename);

Both cupsDoRequest and cupsDoFileRequest free the IPP request. If a valid IPP response is received, it is stored in a new IPP message (ipp_t) and returned to the caller. Otherwise NULL is returned.

The status from the most recent request can be queried using the cupsLastError function, for example:

if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
{
  /* request failed */
}

A human-readable error message is also available using the cupsLastErrorString function:

if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
{
  /* request failed */
  printf("Request failed: %s\n", cupsLastErrorString());
}

Processing the IPP Response

Each response to an IPP request is also an IPP message (ipp_t) with its own IPP attributes (ipp_attribute_t) that includes a status code (IPP_STATUS_OK, IPP_STATUS_ERROR_BAD_REQUEST, etc.) and the corresponding 32-bit integer identifier from the request.

For example, the following code finds the printer state attributes and prints their values:

ipp_attribute_t *attr;

if ((attr = ippFindAttribute(response, "printer-state",
                             IPP_TAG_ENUM)) != NULL)
{
  printf("printer-state=%s\n",
         ippEnumString("printer-state", ippGetInteger(attr, 0)));
}
else
  puts("printer-state=unknown");

if ((attr = ippFindAttribute(response, "printer-state-message",
                             IPP_TAG_TEXT)) != NULL)
{
  printf("printer-state-message=\"%s\"\n",
         ippGetString(attr, 0, NULL)));
}

if ((attr = ippFindAttribute(response, "printer-state-reasons",
                             IPP_TAG_KEYWORD)) != NULL)
{
  int i, count = ippGetCount(attr);

  puts("printer-state-reasons=");
  for (i = 0; i < count; i ++)
    printf("    %s\n", ippGetString(attr, i, NULL)));
}

The ippGetCount function returns the number of values in an attribute.

The ippGetInteger and ippGetString functions return a single integer or string value from an attribute.

The ippEnumString function converts a enum value to its keyword (string) equivalent.

Once you are done using the IPP response message, free it using the ippDelete function:

ippDelete(response);

Authentication

CUPS normally handles authentication through the console. GUI applications should set a password callback using the cupsSetPasswordCB2 function:

void
cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data);

The password callback will be called when needed and is responsible for setting the current user name using cupsSetUser and returning a string:

const char *
cups_password_cb2(const char *prompt, http_t *http,
                  const char *method, const char *resource,
                  void *user_data);

The prompt argument is a string from CUPS that should be displayed to the user.

The http argument is the connection hosting the request that is being authenticated. The password callback can call the httpGetField and httpGetSubField functions to look for additional details concerning the authentication challenge.

The method argument specifies the HTTP method used for the request and is typically "POST".

The resource argument specifies the path used for the request.

The user_data argument provides the user data pointer from the cupsSetPasswordCB2 call.

Functions

cupsAddDest

Add a destination to the list of destinations.

int cupsAddDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests);

Parameters

name Destination name
instance Instance name or NULL for none/primary
num_dests Number of destinations
dests Destinations

Return Value

New number of destinations

Discussion

This function cannot be used to add a new class or printer queue, it only adds a new container of saved options for the named destination or instance.

If the named destination already exists, the destination list is returned unchanged. Adding a new instance of a destination creates a copy of that destination's options.

Use the cupsSaveDests function to save the updated list of destinations to the user's lpoptions file.

 CUPS 2.3/macOS 10.14 cupsAddDestMediaOptions

Add the option corresponding to the specified media size.

int cupsAddDestMediaOptions(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size, int num_options, cups_option_t **options);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
flags Media matching flags
size Media size
num_options Current number of options
options Options

Return Value

New number of options

 CUPS 2.2.4/macOS 10.13 cupsAddIntegerOption

Add an integer option to an option array.

int cupsAddIntegerOption(const char *name, int value, int num_options, cups_option_t **options);

Parameters

name Name of option
value Value of option
num_options Number of options
options Pointer to options

Return Value

Number of options

Discussion

New option arrays can be initialized simply by passing 0 for the "num_options" parameter.

cupsAddOption

Add an option to an option array.

int cupsAddOption(const char *name, const char *value, int num_options, cups_option_t **options);

Parameters

name Name of option
value Value of option
num_options Number of options
options Pointer to options

Return Value

Number of options

Discussion

New option arrays can be initialized simply by passing 0 for the "num_options" parameter.

 CUPS 1.6/macOS 10.8 cupsCancelDestJob

Cancel a job on a destination.

ipp_status_t cupsCancelDestJob(http_t *http, cups_dest_t *dest, int job_id);

Parameters

http Connection to destination
dest Destination
job_id Job ID

Return Value

Status of cancel operation

Discussion

The "job_id" is the number returned by cupsCreateDestJob.

Returns IPP_STATUS_OK on success and IPP_STATUS_ERROR_NOT_AUTHORIZED or IPP_STATUS_ERROR_FORBIDDEN on failure.

 CUPS 1.6/macOS 10.8 cupsCheckDestSupported

Check that the option and value are supported by the destination.

int cupsCheckDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option
value Value or NULL

Return Value

1 if supported, 0 otherwise

Discussion

Returns 1 if supported, 0 otherwise.

 CUPS 1.6/macOS 10.8 cupsCloseDestJob

Close a job and start printing.

ipp_status_t cupsCloseDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id);

Parameters

http Connection to destination
dest Destination
info Destination information
job_id Job ID

Return Value

IPP status code

Discussion

Use when the last call to cupsStartDocument passed 0 for "last_document". "job_id" is the job ID returned by cupsCreateDestJob. Returns IPP_STATUS_OK on success.

 CUPS 1.6/macOS 10.8 cupsConnectDest

Open a connection to the destination.

http_t *cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec, int *cancel, char *resource, size_t resourcesize, cups_dest_cb_t cb, void *user_data);

Parameters

dest Destination
flags Connection flags
msec Timeout in milliseconds
cancel Pointer to "cancel" variable
resource Resource buffer
resourcesize Size of resource buffer
cb Callback function
user_data User data pointer

Return Value

Connection to destination or NULL

Discussion

Connect to the destination, returning a new http_t connection object and optionally the resource path to use for the destination. These calls will block until a connection is made, the timeout expires, the integer pointed to by "cancel" is non-zero, or the callback function (or block) returns 0. The caller is responsible for calling httpClose on the returned connection.

Starting with CUPS 2.2.4, the caller can pass CUPS_DEST_FLAGS_DEVICE for the "flags" argument to connect directly to the device associated with the destination. Otherwise, the connection is made to the CUPS scheduler associated with the destination.

 CUPS 1.6/macOS 10.8 cupsCopyDest

Copy a destination.

int cupsCopyDest(cups_dest_t *dest, int num_dests, cups_dest_t **dests);

Parameters

dest Destination to copy
num_dests Number of destinations
dests Destination array

Return Value

New number of destinations

Discussion

Make a copy of the destination to an array of destinations (or just a single copy) - for use with the cupsEnumDests* functions. The caller is responsible for calling cupsFreeDests() on the returned object(s).

 CUPS 1.6/macOS 10.8 cupsCopyDestConflicts

Get conflicts and resolutions for a new option/value pair.

int cupsCopyDestConflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options, const char *new_option, const char *new_value, int *num_conflicts, cups_option_t **conflicts, int *num_resolved, cups_option_t **resolved);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
num_options Number of current options
options Current options
new_option New option
new_value New value
num_conflicts Number of conflicting options
conflicts Conflicting options
num_resolved Number of options to resolve
resolved Resolved options

Return Value

1 if there is a conflict, 0 if none, -1 on error

Discussion

"num_options" and "options" represent the currently selected options by the user. "new_option" and "new_value" are the setting the user has just changed.

Returns 1 if there is a conflict, 0 if there are no conflicts, and -1 if there was an unrecoverable error such as a resolver loop.

If "num_conflicts" and "conflicts" are not NULL, they are set to contain the list of conflicting option/value pairs. Similarly, if "num_resolved" and "resolved" are not NULL they will be set to the list of changes needed to resolve the conflict.

If cupsCopyDestConflicts returns 1 but "num_resolved" and "resolved" are set to 0 and NULL, respectively, then the conflict cannot be resolved.

 CUPS 1.6/macOS 10.8 cupsCopyDestInfo

Get the supported values/capabilities for the destination.

cups_dinfo_t *cupsCopyDestInfo(http_t *http, cups_dest_t *dest);

Parameters

http Connection to destination
dest Destination

Return Value

Destination information

Discussion

The caller is responsible for calling cupsFreeDestInfo on the return value. NULL is returned on error.

 CUPS 1.6/macOS 10.8 cupsCreateDestJob

Create a job on a destination.

ipp_status_t cupsCreateDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int *job_id, const char *title, int num_options, cups_option_t *options);

Parameters

http Connection to destination
dest Destination
info Destination information
job_id Job ID or 0 on error
title Job name
num_options Number of job options
options Job options

Return Value

IPP status code

Discussion

Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success, saving the job ID in the variable pointed to by "job_id".

 CUPS 1.1.20/macOS 10.4 cupsDoAuthentication

Authenticate a request.

int cupsDoAuthentication(http_t *http, const char *method, const char *resource);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
method Request method ("GET", "POST", "PUT")
resource Resource path

Return Value

0 on success, -1 on error

Discussion

This function should be called in response to a HTTP_STATUS_UNAUTHORIZED status, prior to resubmitting your request.

 CUPS 2.3/macOS 10.14 cupsEncodeOption

Encode a single option into an IPP attribute.

ipp_attribute_t *cupsEncodeOption(ipp_t *ipp, ipp_tag_t group_tag, const char *name, const char *value);

Parameters

ipp IPP request/response
group_tag Attribute group
name Option name
value Option string value

Return Value

New attribute or NULL on error

cupsEncodeOptions

Encode printer options into IPP attributes.

void cupsEncodeOptions(ipp_t *ipp, int num_options, cups_option_t *options);

Parameters

ipp IPP request/response
num_options Number of options
options Options

Discussion

This function adds operation, job, and then subscription attributes, in that order. Use the cupsEncodeOptions2 function to add attributes for a single group.

 CUPS 1.2/macOS 10.5 cupsEncodeOptions2

Encode printer options into IPP attributes for a group.

void cupsEncodeOptions2(ipp_t *ipp, int num_options, cups_option_t *options, ipp_tag_t group_tag);

Parameters

ipp IPP request/response
num_options Number of options
options Options
group_tag Group to encode

Discussion

This function only adds attributes for a single group. Call this function multiple times for each group, or use cupsEncodeOptions to add the standard groups.

cupsEncryption

Get the current encryption settings.

http_encryption_t cupsEncryption(void);

Return Value

Encryption settings

Discussion

The default encryption setting comes from the CUPS_ENCRYPTION environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is HTTP_ENCRYPTION_IF_REQUESTED.

Note: The current encryption setting is tracked separately for each thread in a program. Multi-threaded programs that override the setting via the cupsSetEncryption function need to do so in each thread for the same setting to be used.

 CUPS 1.6/macOS 10.8 cupsEnumDests

Enumerate available destinations with a callback function.

int cupsEnumDests(unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data);

Parameters

flags Enumeration flags
msec Timeout in milliseconds, -1 for indefinite
cancel Pointer to "cancel" variable
type Printer type bits
mask Mask for printer type bits
cb Callback function
user_data User data

Return Value

1 on success, 0 on failure

Discussion

Destinations are enumerated from one or more sources. The callback function receives the user_data pointer and the destination pointer which can be used as input to the cupsCopyDest function. The function must return 1 to continue enumeration or 0 to stop.

The type and mask arguments allow the caller to filter the destinations that are enumerated. Passing 0 for both will enumerate all printers. The constant CUPS_PRINTER_DISCOVERED is used to filter on destinations that are available but have not yet been added locally.

Enumeration happens on the current thread and does not return until all destinations have been enumerated or the callback function returns 0.

Note: The callback function will likely receive multiple updates for the same destinations - it is up to the caller to suppress any duplicate destinations.

 CUPS 1.7/macOS 10.9 cupsFindDestDefault

Find the default value(s) for the given option.

ipp_attribute_t *cupsFindDestDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option/attribute name

Return Value

Default attribute or NULL for none

Discussion

The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag functions to inspect the default value(s) as needed.

 CUPS 1.7/macOS 10.9 cupsFindDestReady

Find the default value(s) for the given option.

ipp_attribute_t *cupsFindDestReady(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option/attribute name

Return Value

Default attribute or NULL for none

Discussion

The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag functions to inspect the default value(s) as needed.

 CUPS 1.7/macOS 10.9 cupsFindDestSupported

Find the default value(s) for the given option.

ipp_attribute_t *cupsFindDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option/attribute name

Return Value

Default attribute or NULL for none

Discussion

The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag functions to inspect the default value(s) as needed.

 CUPS 1.6/macOS 10.8 cupsFinishDestDocument

Finish the current document.

ipp_status_t cupsFinishDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info);

Parameters

http Connection to destination
dest Destination
info Destination information

Return Value

Status of document submission

Discussion

Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success.

 CUPS 1.6/macOS 10.8 cupsFreeDestInfo

Free destination information obtained using cupsCopyDestInfo.

void cupsFreeDestInfo(cups_dinfo_t *dinfo);

Parameters

dinfo Destination information

cupsFreeDests

Free the memory used by the list of destinations.

void cupsFreeDests(int num_dests, cups_dest_t *dests);

Parameters

num_dests Number of destinations
dests Destinations

cupsFreeJobs

Free memory used by job data.

void cupsFreeJobs(int num_jobs, cups_job_t *jobs);

Parameters

num_jobs Number of jobs
jobs Jobs

cupsFreeOptions

Free all memory used by options.

void cupsFreeOptions(int num_options, cups_option_t *options);

Parameters

num_options Number of options
options Pointer to options

cupsGetDest

Get the named destination from the list.

cups_dest_t *cupsGetDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests);

Parameters

name Destination name or NULL for the default destination
instance Instance name or NULL
num_dests Number of destinations
dests Destinations

Return Value

Destination pointer or NULL

Discussion

Use the cupsEnumDests or cupsGetDests2 functions to get a list of supported destinations for the current user.

 CUPS 1.7/macOS 10.9 cupsGetDestMediaByIndex

Get a media name, dimension, and margins for a specific size.

int cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int n, unsigned flags, cups_size_t *size);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
n Media size number (0-based)
flags Media flags
size Media size information

Return Value

1 on success, 0 on failure

Discussion

The flags parameter determines which set of media are indexed. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will get the Nth borderless size supported by the printer.

 CUPS 1.6/macOS 10.8 cupsGetDestMediaByName

Get media names, dimensions, and margins.

int cupsGetDestMediaByName(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *media, unsigned flags, cups_size_t *size);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
media Media name
flags Media matching flags
size Media size information

Return Value

1 on match, 0 on failure

Discussion

The "media" string is a PWG media name. "Flags" provides some matching guidance (multiple flags can be combined):

CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size, CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing, CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size, and CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the size amongst the "ready" media.

The matching result (if any) is returned in the "cups_size_t" structure.

Returns 1 when there is a match and 0 if there is not a match.

 CUPS 1.6/macOS 10.8 cupsGetDestMediaBySize

Get media names, dimensions, and margins.

int cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int width, int length, unsigned flags, cups_size_t *size);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
width Media width in hundredths of of millimeters
length Media length in hundredths of of millimeters
flags Media matching flags
size Media size information

Return Value

1 on match, 0 on failure

Discussion

"Width" and "length" are the dimensions in hundredths of millimeters. "Flags" provides some matching guidance (multiple flags can be combined):

CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size, CUPS_MEDIA_FLAGS_DUPLEX = find a size compatible with 2-sided printing, CUPS_MEDIA_FLAGS_EXACT = find an exact match for the size, and CUPS_MEDIA_FLAGS_READY = if the printer supports media sensing, find the size amongst the "ready" media.

The matching result (if any) is returned in the "cups_size_t" structure.

Returns 1 when there is a match and 0 if there is not a match.

 CUPS 1.7/macOS 10.9 cupsGetDestMediaCount

Get the number of sizes supported by a destination.

int cupsGetDestMediaCount(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
flags Media flags

Return Value

Number of sizes

Discussion

The flags parameter determines the set of media sizes that are counted. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will return the number of borderless sizes.

 CUPS 1.7/macOS 10.9 cupsGetDestMediaDefault

Get the default size for a destination.

int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
flags Media flags
size Media size information

Return Value

1 on success, 0 on failure

Discussion

The flags parameter determines which default size is returned. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will return the default borderless size, typically US Letter or A4, but sometimes 4x6 photo media.

 CUPS 2.0/macOS 10.10 cupsGetDestWithURI

Get a destination associated with a URI.

cups_dest_t *cupsGetDestWithURI(const char *name, const char *uri);

Parameters

name Desired printer name or NULL
uri URI for the printer

Return Value

Destination or NULL

Discussion

"name" is the desired name for the printer. If NULL, a name will be created using the URI.

"uri" is the "ipp" or "ipps" URI for the printer.

 CUPS 1.1.21/macOS 10.4 cupsGetDests2

Get the list of destinations from the specified server.

int cupsGetDests2(http_t *http, cups_dest_t **dests);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
dests Destinations

Return Value

Number of destinations

Discussion

Starting with CUPS 1.2, the returned list of destinations include the "printer-info", "printer-is-accepting-jobs", "printer-is-shared", "printer-make-and-model", "printer-state", "printer-state-change-time", "printer-state-reasons", "printer-type", and "printer-uri-supported" attributes as options.

CUPS 1.4 adds the "marker-change-time", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", "marker-names", "marker-types", and "printer-commands" attributes as options.

CUPS 2.2 adds accessible IPP printers to the list of destinations that can be used. The "printer-uri-supported" option will be present for those IPP printers that have been recently used.

Use the cupsFreeDests function to free the destination list and the cupsGetDest function to find a particular destination.

 CUPS 2.2.4/macOS 10.13 cupsGetIntegerOption

Get an integer option value.

int cupsGetIntegerOption(const char *name, int num_options, cups_option_t *options);

Parameters

name Name of option
num_options Number of options
options Options

Return Value

Option value or INT_MIN

Discussion

INT_MIN is returned when the option does not exist, is not an integer, or exceeds the range of values for the "int" type.

 CUPS 1.1.21/macOS 10.4 cupsGetJobs2

Get the jobs from the specified server.

int cupsGetJobs2(http_t *http, cups_job_t **jobs, const char *name, int myjobs, int whichjobs);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
jobs Job data
name NULL = all destinations, otherwise show jobs for named destination
myjobs 0 = all users, 1 = mine
whichjobs CUPS_WHICHJOBS_ALL, CUPS_WHICHJOBS_ACTIVE, or CUPS_WHICHJOBS_COMPLETED

Return Value

Number of jobs

Discussion

A "whichjobs" value of CUPS_WHICHJOBS_ALL returns all jobs regardless of state, while CUPS_WHICHJOBS_ACTIVE returns jobs that are pending, processing, or held and CUPS_WHICHJOBS_COMPLETED returns jobs that are stopped, canceled, aborted, or completed.

 CUPS 1.4/macOS 10.6 cupsGetNamedDest

Get options for the named destination.

cups_dest_t *cupsGetNamedDest(http_t *http, const char *name, const char *instance);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
name Destination name or NULL for the default destination
instance Instance name or NULL

Return Value

Destination or NULL

Discussion

This function is optimized for retrieving a single destination and should be used instead of cupsGetDests2 and cupsGetDest when you either know the name of the destination or want to print to the default destination. If NULL is returned, the destination does not exist or there is no default destination.

If "http" is CUPS_HTTP_DEFAULT, the connection to the default print server will be used.

If "name" is NULL, the default printer for the current user will be returned.

The returned destination must be freed using cupsFreeDests with a "num_dests" value of 1.

cupsGetOption

Get an option value.

const char *cupsGetOption(const char *name, int num_options, cups_option_t *options);

Parameters

name Name of option
num_options Number of options
options Options

Return Value

Option value or NULL

 CUPS 1.4/macOS 10.6 cupsGetPassword2

Get a password from the user using the current password callback.

const char *cupsGetPassword2(const char *prompt, http_t *http, const char *method, const char *resource);

Parameters

prompt Prompt string
http Connection to server or CUPS_HTTP_DEFAULT
method Request method ("GET", "POST", "PUT")
resource Resource path

Return Value

Password

Discussion

Uses the current password callback function. Returns NULL if the user does not provide a password.

Note: The current password callback function is tracked separately for each thread in a program. Multi-threaded programs that override the setting via the cupsSetPasswordCB2 function need to do so in each thread for the same function to be used.

 CUPS 2.0/macOS 10.10 cupsLocalizeDestMedia

Get the localized string for a destination media size.

const char *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
flags Media flags
size Media size

Return Value

Localized string

Discussion

The returned string is stored in the destination information and will become invalid if the destination information is deleted.

 CUPS 1.6/macOS 10.8 cupsLocalizeDestOption

Get the localized string for a destination option.

const char *cupsLocalizeDestOption(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option to localize

Return Value

Localized string

Discussion

The returned string is stored in the destination information and will become invalid if the destination information is deleted.

 CUPS 1.6/macOS 10.8 cupsLocalizeDestValue

Get the localized string for a destination option+value pair.

const char *cupsLocalizeDestValue(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);

Parameters

http Connection to destination
dest Destination
dinfo Destination information
option Option to localize
value Value to localize

Return Value

Localized string

Discussion

The returned string is stored in the destination information and will become invalid if the destination information is deleted.

 CUPS 2.0/OS 10.10 cupsMakeServerCredentials

Make a self-signed certificate and private key pair.

int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date);

Parameters

path Keychain path or NULL for default
common_name Common name
num_alt_names Number of subject alternate names
alt_names Subject Alternate Names
expiration_date Expiration date

Return Value

1 on success, 0 on failure

cupsParseOptions

Parse options from a command-line argument.

int cupsParseOptions(const char *arg, int num_options, cups_option_t **options);

Parameters

arg Argument to parse
num_options Number of options
options Options found

Return Value

Number of options found

Discussion

This function converts space-delimited name/value pairs according to the PAPI text option ABNF specification. Collection values ("name={a=... b=... c=...}") are stored with the curley brackets intact - use cupsParseOptions on the value to extract the collection attributes.

 CUPS 1.3/macOS 10.5 cupsRemoveDest

Remove a destination from the destination list.

int cupsRemoveDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests);

Parameters

name Destination name
instance Instance name or NULL
num_dests Number of destinations
dests Destinations

Return Value

New number of destinations

Discussion

Removing a destination/instance does not delete the class or printer queue, merely the lpoptions for that destination/instance. Use the cupsSetDests or cupsSetDests2 functions to save the new options for the user.

 CUPS 1.2/macOS 10.5 cupsRemoveOption

Remove an option from an option array.

int cupsRemoveOption(const char *name, int num_options, cups_option_t **options);

Parameters

name Option name
num_options Current number of options
options Options

Return Value

New number of options

cupsServer

Return the hostname/address of the current server.

const char *cupsServer(void);

Return Value

Server name

Discussion

The default server comes from the CUPS_SERVER environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is the local system - either "localhost" or a domain socket path.

The returned value can be a fully-qualified hostname, a numeric IPv4 or IPv6 address, or a domain socket pathname.

Note: The current server is tracked separately for each thread in a program. Multi-threaded programs that override the server via the cupsSetServer function need to do so in each thread for the same server to be used.

 CUPS 1.5/macOS 10.7 cupsSetClientCertCB

Set the client certificate callback.

void cupsSetClientCertCB(cups_client_cert_cb_t cb, void *user_data);

Parameters

cb Callback function
user_data User data pointer

Discussion

Pass NULL to restore the default callback.

Note: The current certificate callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used.

 CUPS 1.5/macOS 10.7 cupsSetCredentials

Set the default credentials to be used for SSL/TLS connections.

int cupsSetCredentials(cups_array_t *credentials);

Parameters

credentials Array of credentials

Return Value

Status of call (0 = success)

Discussion

Note: The default credentials are tracked separately for each thread in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used.

 CUPS 1.3/macOS 10.5 cupsSetDefaultDest

Set the default destination.

void cupsSetDefaultDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests);

Parameters

name Destination name
instance Instance name or NULL
num_dests Number of destinations
dests Destinations

 CUPS 1.1.21/macOS 10.4 cupsSetDests2

Save the list of destinations for the specified server.

int cupsSetDests2(http_t *http, int num_dests, cups_dest_t *dests);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
num_dests Number of destinations
dests Destinations

Return Value

0 on success, -1 on error

Discussion

This function saves the destinations to /etc/cups/lpoptions when run as root and ~/.cups/lpoptions when run as a normal user.

cupsSetEncryption

Set the encryption preference.

void cupsSetEncryption(http_encryption_t e);

Parameters

e New encryption preference

Discussion

The default encryption setting comes from the CUPS_ENCRYPTION environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is HTTP_ENCRYPTION_IF_REQUESTED.

Note: The current encryption setting is tracked separately for each thread in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used.

 CUPS 1.4/macOS 10.6 cupsSetPasswordCB2

Set the advanced password callback for CUPS.

void cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data);

Parameters

cb Callback function
user_data User data pointer

Discussion

Pass NULL to restore the default (console) password callback, which reads the password from the console. Programs should call either this function or cupsSetPasswordCB2, as only one callback can be registered by a program per thread.

Note: The current password callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used.

cupsSetServer

Set the default server name and port.

void cupsSetServer(const char *server);

Parameters

server Server name

Discussion

The "server" string can be a fully-qualified hostname, a numeric IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP addresses can be optionally followed by a colon and port number to override the default port 631, e.g. "hostname:8631". Pass NULL to restore the default server name and port.

Note: The current server is tracked separately for each thread in a program. Multi-threaded programs that override the server need to do so in each thread for the same server to be used.

 CUPS 1.5/macOS 10.7 cupsSetServerCertCB

Set the server certificate callback.

void cupsSetServerCertCB(cups_server_cert_cb_t cb, void *user_data);

Parameters

cb Callback function
user_data User data pointer

Discussion

Pass NULL to restore the default callback.

Note: The current credentials callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used.

 CUPS 2.0/macOS 10.10 cupsSetServerCredentials

Set the default server credentials.

int cupsSetServerCredentials(const char *path, const char *common_name, int auto_create);

Parameters

path Keychain path or NULL for default
common_name Default common name for server
auto_create 1 = automatically create self-signed certificates

Return Value

1 on success, 0 on failure

Discussion

Note: The server credentials are used by all threads in the running process. This function is threadsafe.

cupsSetUser

Set the default user name.

void cupsSetUser(const char *user);

Parameters

user User name

Discussion

Pass NULL to restore the default user name.

Note: The current user name is tracked separately for each thread in a program. Multi-threaded programs that override the user name need to do so in each thread for the same user name to be used.

 CUPS 1.7/macOS 10.9 cupsSetUserAgent

Set the default HTTP User-Agent string.

void cupsSetUserAgent(const char *user_agent);

Parameters

user_agent User-Agent string or NULL

Discussion

Setting the string to NULL forces the default value containing the CUPS version, IPP version, and operating system version and architecture.

 CUPS 1.6/macOS 10.8 cupsStartDestDocument

Start a new document.

http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id, const char *docname, const char *format, int num_options, cups_option_t *options, int last_document);

Parameters

http Connection to destination
dest Destination
info Destination information
job_id Job ID
docname Document name
format Document format
num_options Number of document options
options Document options
last_document 1 if this is the last document

Return Value

Status of document creation

Discussion

"job_id" is the job ID returned by cupsCreateDestJob. "docname" is the name of the document/file being printed, "format" is the MIME media type for the document (see CUPS_FORMAT_xxx constants), and "num_options" and "options" are the options do be applied to the document. "last_document" should be 1 if this is the last document to be submitted in the job. Returns HTTP_CONTINUE on success.

cupsUser

Return the current user's name.

const char *cupsUser(void);

Return Value

User name

Discussion

Note: The current user name is tracked separately for each thread in a program. Multi-threaded programs that override the user name with the cupsSetUser function need to do so in each thread for the same user name to be used.

 CUPS 1.7/macOS 10.9 cupsUserAgent

Return the default HTTP User-Agent string.

const char *cupsUserAgent(void);

Return Value

User-Agent string

 CUPS 1.7/macOS 10.9 httpAcceptConnection

Accept a new HTTP client connection from the specified listening socket.

http_t *httpAcceptConnection(int fd, int blocking);

Parameters

fd Listen socket file descriptor
blocking 1 if the connection should be blocking, 0 otherwise

Return Value

HTTP connection or NULL

 CUPS 1.5/macOS 10.7 httpAddCredential

Allocates and adds a single credential to an array.

int httpAddCredential(cups_array_t *credentials, const void *data, size_t datalen);

Parameters

credentials Credentials array
data PEM-encoded X.509 data
datalen Length of data

Return Value

0 on success, -1 on error

Discussion

Use cupsArrayNew(NULL, NULL) to create a credentials array.

 CUPS 1.2/macOS 10.5 httpAddrAny

Check for the "any" address.

int httpAddrAny(const http_addr_t *addr);

Parameters

addr Address to check

Return Value

1 if "any", 0 otherwise

 CUPS 2.0/OS 10.10 httpAddrClose

Close a socket created by httpAddrConnect or httpAddrListen.

int httpAddrClose(http_addr_t *addr, int fd);

Parameters

addr Listen address or NULL
fd Socket file descriptor

Return Value

0 on success, -1 on failure

Discussion

Pass NULL for sockets created with httpAddrConnect2 and the listen address for sockets created with httpAddrListen. This function ensures that domain sockets are removed when closed.

 CUPS 1.7/macOS 10.9 httpAddrConnect2

Connect to any of the addresses in the list with a timeout and optional cancel.

http_addrlist_t *httpAddrConnect2(http_addrlist_t *addrlist, int *sock, int msec, int *cancel);

Parameters

addrlist List of potential addresses
sock Socket
msec Timeout in milliseconds
cancel Pointer to "cancel" variable

Return Value

Connected address or NULL on failure

 CUPS 1.7/macOS 10.9 httpAddrCopyList

Copy an address list.

http_addrlist_t *httpAddrCopyList(http_addrlist_t *src);

Parameters

src Source address list

Return Value

New address list or NULL on error

 CUPS 1.2/macOS 10.5 httpAddrEqual

Compare two addresses.

int httpAddrEqual(const http_addr_t *addr1, const http_addr_t *addr2);

Parameters

addr1 First address
addr2 Second address

Return Value

1 if equal, 0 if not

httpAddrFamily

Get the address family of an address.

int httpAddrFamily(http_addr_t *addr);

Parameters

addr Address

Return Value

Address family

 CUPS 1.2/macOS 10.5 httpAddrFreeList

Free an address list.

void httpAddrFreeList(http_addrlist_t *addrlist);

Parameters

addrlist Address list to free

 CUPS 1.2/macOS 10.5 httpAddrGetList

Get a list of addresses for a hostname.

http_addrlist_t *httpAddrGetList(const char *hostname, int family, const char *service);

Parameters

hostname Hostname, IP address, or NULL for passive listen address
family Address family or AF_UNSPEC
service Service name or port number

Return Value

List of addresses or NULL

 CUPS 1.2/macOS 10.5 httpAddrLength

Return the length of the address in bytes.

int httpAddrLength(const http_addr_t *addr);

Parameters

addr Address

Return Value

Length in bytes

 CUPS 1.7/macOS 10.9 httpAddrListen

Create a listening socket bound to the specified address and port.

int httpAddrListen(http_addr_t *addr, int port);

Parameters

addr Address to bind to
port Port number to bind to

Return Value

Socket or -1 on error

 CUPS 1.2/macOS 10.5 httpAddrLocalhost

Check for the local loopback address.

int httpAddrLocalhost(const http_addr_t *addr);

Parameters

addr Address to check

Return Value

1 if local host, 0 otherwise

 CUPS 1.2/macOS 10.5 httpAddrLookup

Lookup the hostname associated with the address.

char *httpAddrLookup(const http_addr_t *addr, char *name, int namelen);

Parameters

addr Address to lookup
name Host name buffer
namelen Size of name buffer

Return Value

Host name

 CUPS 1.7/macOS 10.9 httpAddrPort

Get the port number associated with an address.

int httpAddrPort(http_addr_t *addr);

Parameters

addr Address

Return Value

Port number

 CUPS 1.2/macOS 10.5 httpAddrString

Convert an address to a numeric string.

char *httpAddrString(const http_addr_t *addr, char *s, int slen);

Parameters

addr Address to convert
s String buffer
slen Length of string

Return Value

Numeric address string

 CUPS 1.2/macOS 10.5 httpAssembleURI

Assemble a uniform resource identifier from its components.

http_uri_status_t httpAssembleURI(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resource);

Parameters

encoding Encoding flags
uri URI buffer
urilen Size of URI buffer
scheme Scheme name
username Username
host Hostname or address
port Port number
resource Resource

Return Value

URI status

Discussion

This function escapes reserved characters in the URI depending on the value of the "encoding" argument. You should use this function in place of traditional string functions whenever you need to create a URI string.

 CUPS 1.2/macOS 10.5 httpAssembleURIf

Assemble a uniform resource identifier from its components with a formatted resource.

http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resourcef, ...);

Parameters

encoding Encoding flags
uri URI buffer
urilen Size of URI buffer
scheme Scheme name
username Username
host Hostname or address
port Port number
resourcef Printf-style resource
... Additional arguments as needed

Return Value

URI status

Discussion

This function creates a formatted version of the resource string argument "resourcef" and escapes reserved characters in the URI depending on the value of the "encoding" argument. You should use this function in place of traditional string functions whenever you need to create a URI string.

 CUPS 1.7/macOS 10.9 httpAssembleUUID

Assemble a name-based UUID URN conforming to RFC 4122.

char *httpAssembleUUID(const char *server, int port, const char *name, int number, char *buffer, size_t bufsize);

Parameters

server Server name
port Port number
name Object name or NULL
number Object number or 0
buffer String buffer
bufsize Size of buffer

Return Value

UUID string

Discussion

This function creates a unique 128-bit identifying number using the server name, port number, random data, and optionally an object name and/or object number. The result is formatted as a UUID URN as defined in RFC 4122.

The buffer needs to be at least 46 bytes in size.

httpBlocking

Set blocking/non-blocking behavior on a connection.

void httpBlocking(http_t *http, int b);

Parameters

http HTTP connection
b 1 = blocking, 0 = non-blocking

httpCheck

Check to see if there is a pending response from the server.

int httpCheck(http_t *http);

Parameters

http HTTP connection

Return Value

0 = no data, 1 = data available

 CUPS 1.1.19/macOS 10.3 httpClearCookie

Clear the cookie value(s).

void httpClearCookie(http_t *http);

Parameters

http HTTP connection

httpClearFields

Clear HTTP request fields.

void httpClearFields(http_t *http);

Parameters

http HTTP connection

httpClose

Close an HTTP connection.

void httpClose(http_t *http);

Parameters

http HTTP connection

 CUPS 2.0/OS 10.10 httpCompareCredentials

Compare two sets of X.509 credentials.

int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2);

Parameters

cred1 First set of X.509 credentials
cred2 Second set of X.509 credentials

Return Value

1 if they match, 0 if they do not

 CUPS 1.7/macOS 10.9 httpConnect2

Connect to a HTTP server.

http_t *httpConnect2(const char *host, int port, http_addrlist_t *addrlist, int family, http_encryption_t encryption, int blocking, int msec, int *cancel);

Parameters

host Host to connect to
port Port number
addrlist List of addresses or NULL to lookup
family Address family to use or AF_UNSPEC for any
encryption Type of encryption to use
blocking 1 for blocking connection, 0 for non-blocking
msec Connection timeout in milliseconds, 0 means don't connect
cancel Pointer to "cancel" variable

Return Value

New HTTP connection

 CUPS 1.5/macOS 10.7 httpCopyCredentials

Copy the credentials associated with the peer in an encrypted connection.

int httpCopyCredentials(http_t *http, cups_array_t **credentials);

Parameters

http Connection to server
credentials Array of credentials

Return Value

Status of call (0 = success)

 CUPS 2.0/macOS 10.10 httpCredentialsAreValidForName

Return whether the credentials are valid for the given name.

int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name);

Parameters

credentials Credentials
common_name Name to check

Return Value

1 if valid, 0 otherwise

 CUPS 2.0/macOS 10.10 httpCredentialsGetExpiration

Return the expiration date of the credentials.

time_t httpCredentialsGetExpiration(cups_array_t *credentials);

Parameters

credentials Credentials

Return Value

Expiration date of credentials

 CUPS 2.0/macOS 10.10 httpCredentialsGetTrust

Return the trust of credentials.

http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name);

Parameters

credentials Credentials
common_name Common name for trust lookup

Return Value

Level of trust

 CUPS 2.0/macOS 10.10 httpCredentialsString

Return a string representing the credentials.

size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize);

Parameters

credentials Credentials
buffer Buffer or NULL
bufsize Size of buffer

Return Value

Total size of credentials string

 CUPS 1.1.21/macOS 10.4 httpDecode64_2

Base64-decode a string.

char *httpDecode64_2(char *out, int *outlen, const char *in);

Parameters

out String to write to
outlen Size of output string
in String to read from

Return Value

Decoded string

Discussion

The caller must initialize "outlen" to the maximum size of the decoded string before calling httpDecode64_2. On return "outlen" contains the decoded length of the string.

httpDelete

Send a DELETE request to the server.

int httpDelete(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI to delete

Return Value

Status of call (0 = success)

 CUPS 1.1.21/macOS 10.4 httpEncode64_2

Base64-encode a string.

char *httpEncode64_2(char *out, int outlen, const char *in, int inlen);

Parameters

out String to write to
outlen Maximum size of output string
in String to read from
inlen Size of input string

Return Value

Encoded string

httpEncryption

Set the required encryption on the link.

int httpEncryption(http_t *http, http_encryption_t e);

Parameters

http HTTP connection
e New encryption preference

Return Value

-1 on error, 0 on success

httpError

Get the last error on a connection.

int httpError(http_t *http);

Parameters

http HTTP connection

Return Value

Error code (errno) value

httpFieldValue

Return the HTTP field enumeration value for a field name.

http_field_t httpFieldValue(const char *name);

Parameters

name String name

Return Value

Field index

httpFlush

Flush data read from a HTTP connection.

void httpFlush(http_t *http);

Parameters

http HTTP connection

 CUPS 1.2/macOS 10.5 httpFlushWrite

Flush data written to a HTTP connection.

int httpFlushWrite(http_t *http);

Parameters

http HTTP connection

Return Value

Bytes written or -1 on error

httpFreeCredentials

Free an array of credentials.

void httpFreeCredentials(cups_array_t *credentials);

Parameters

credentials Array of credentials

httpGet

Send a GET request to the server.

int httpGet(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI to get

Return Value

Status of call (0 = success)

 CUPS 2.0/OS 10.10 httpGetActivity

Get the most recent activity for a connection.

time_t httpGetActivity(http_t *http);

Parameters

http HTTP connection

Return Value

Time of last read or write

Discussion

The return value is the time in seconds of the last read or write.

 CUPS 2.0/OS 10.10 httpGetAddress

Get the address of the connected peer of a connection.

http_addr_t *httpGetAddress(http_t *http);

Parameters

http HTTP connection

Return Value

Connected address or NULL

Discussion

For connections created with httpConnect2, the address is for the server. For connections created with httpAccept, the address is for the client.

Returns NULL if the socket is currently unconnected.

 CUPS 1.3/macOS 10.5 httpGetAuthString

Get the current authorization string.

char *httpGetAuthString(http_t *http);

Parameters

http HTTP connection

Return Value

Authorization string

Discussion

The authorization string is set by cupsDoAuthentication and httpSetAuthString. Use httpGetAuthString to retrieve the string to use with httpSetField for the HTTP_FIELD_AUTHORIZATION value.

 CUPS 1.2/macOS 10.5 httpGetBlocking

Get the blocking/non-block state of a connection.

int httpGetBlocking(http_t *http);

Parameters

http HTTP connection

Return Value

1 if blocking, 0 if non-blocking

 CUPS 1.7/macOS 10.9 httpGetContentEncoding

Get a common content encoding, if any, between the client and server.

const char *httpGetContentEncoding(http_t *http);

Parameters

http HTTP connection

Return Value

Content-Coding value or NULL for the identity coding.

Discussion

This function uses the value of the Accepts-Encoding HTTP header and must be called after receiving a response from the server or a request from the client. The value returned can be use in subsequent requests (for clients) or in the response (for servers) in order to compress the content stream.

 CUPS 1.1.19/macOS 10.3 httpGetCookie

Get any cookie data from the response.

const char *httpGetCookie(http_t *http);

Parameters

http HTTP connection

Return Value

Cookie data or NULL

 CUPS 1.2/macOS 10.5 httpGetDateString2

Get a formatted date/time string from a time value.

const char *httpGetDateString2(time_t t, char *s, int slen);

Parameters

t Time in seconds
s String buffer
slen Size of string buffer

Return Value

Date/time string

httpGetDateTime

Get a time value from a formatted date/time string.

time_t httpGetDateTime(const char *s);

Parameters

s Date/time string

Return Value

Time in seconds

 CUPS 2.0/OS 10.10 httpGetEncryption

Get the current encryption mode of a connection.

http_encryption_t httpGetEncryption(http_t *http);

Parameters

http HTTP connection

Return Value

Current encryption mode

Discussion

This function returns the encryption mode for the connection. Use the httpIsEncrypted function to determine whether a TLS session has been established.

 CUPS 1.7/macOS 10.9 httpGetExpect

Get the value of the Expect header, if any.

http_status_t httpGetExpect(http_t *http);

Parameters

http HTTP connection

Return Value

Expect: status, if any

Discussion

Returns HTTP_STATUS_NONE if there is no Expect header, otherwise returns the expected HTTP status code, typically HTTP_STATUS_CONTINUE.

 CUPS 1.2/macOS 10.5 httpGetFd

Get the file descriptor associated with a connection.

int httpGetFd(http_t *http);

Parameters

http HTTP connection

Return Value

File descriptor or -1 if none

httpGetField

Get a field value from a request/response.

const char *httpGetField(http_t *http, http_field_t field);

Parameters

http HTTP connection
field Field to get

Return Value

Field value

 CUPS 1.2/macOS 10.5 httpGetHostname

Get the FQDN for the connection or local system.

const char *httpGetHostname(http_t *http, char *s, int slen);

Parameters

http HTTP connection or NULL
s String buffer for name
slen Size of buffer

Return Value

FQDN for connection or system

Discussion

When "http" points to a connected socket, return the hostname or address that was used in the call to httpConnect() or httpConnectEncrypt(), or the address of the client for the connection from httpAcceptConnection(). Otherwise, return the FQDN for the local system using both gethostname() and gethostbyname() to get the local hostname with domain.

 CUPS 2.0/OS 10.10 httpGetKeepAlive

Get the current Keep-Alive state of the connection.

http_keepalive_t httpGetKeepAlive(http_t *http);

Parameters

http HTTP connection

Return Value

Keep-Alive state

 CUPS 1.2/macOS 10.5 httpGetLength2

Get the amount of data remaining from the content-length or transfer-encoding fields.

off_t httpGetLength2(http_t *http);

Parameters

http HTTP connection

Return Value

Content length

Discussion

This function returns the complete content length, even for content larger than 2^31 - 1.

 CUPS 2.0/OS 10.10 httpGetPending

Get the number of bytes that are buffered for writing.

size_t httpGetPending(http_t *http);

Parameters

http HTTP connection

Return Value

Number of bytes buffered

 CUPS 2.0/OS 10.10 httpGetReady

Get the number of bytes that can be read without blocking.

size_t httpGetReady(http_t *http);

Parameters

http HTTP connection

Return Value

Number of bytes available

 CUPS 2.0/OS 10.10 httpGetRemaining

Get the number of remaining bytes in the message body or current chunk.

size_t httpGetRemaining(http_t *http);

Parameters

http HTTP connection

Return Value

Remaining bytes

Discussion

The httpIsChunked function can be used to determine whether the message body is chunked or fixed-length.

httpGetState

Get the current state of the HTTP request.

http_state_t httpGetState(http_t *http);

Parameters

http HTTP connection

Return Value

HTTP state

 CUPS 1.2/macOS 10.5 httpGetStatus

Get the status of the last HTTP request.

http_status_t httpGetStatus(http_t *http);

Parameters

http HTTP connection

Return Value

HTTP status

 CUPS 1.2/macOS 10.5 httpGetSubField2

Get a sub-field value.

char *httpGetSubField2(http_t *http, http_field_t field, const char *name, char *value, int valuelen);

Parameters

http HTTP connection
field Field index
name Name of sub-field
value Value string
valuelen Size of value buffer

Return Value

Value or NULL

httpGetVersion

Get the HTTP version at the other end.

http_version_t httpGetVersion(http_t *http);

Parameters

http HTTP connection

Return Value

Version number

httpGets

Get a line of text from a HTTP connection.

char *httpGets(char *line, int length, http_t *http);

Parameters

line Line to read into
length Max length of buffer
http HTTP connection

Return Value

Line or NULL

httpHead

Send a HEAD request to the server.

int httpHead(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI for head

Return Value

Status of call (0 = success)

httpInitialize

Initialize the HTTP interface library and set the default HTTP proxy (if any).

void httpInitialize(void);

 CUPS 2.0/OS 10.10 httpIsChunked

Report whether a message body is chunked.

int httpIsChunked(http_t *http);

Parameters

http HTTP connection

Return Value

1 if chunked, 0 if not

Discussion

This function returns non-zero if the message body is composed of variable-length chunks.

 CUPS 2.0/OS 10.10 httpIsEncrypted

Report whether a connection is encrypted.

int httpIsEncrypted(http_t *http);

Parameters

http HTTP connection

Return Value

1 if encrypted, 0 if not

Discussion

This function returns non-zero if the connection is currently encrypted.

 CUPS 2.0/OS 10.10 httpLoadCredentials

Load X.509 credentials from a keychain file.

int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name);

Parameters

path Keychain path or NULL for default
credentials Credentials
common_name Common name for credentials

Return Value

0 on success, -1 on error

httpOptions

Send an OPTIONS request to the server.

int httpOptions(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI for options

Return Value

Status of call (0 = success)

 CUPS 1.7/macOS 10.9 httpPeek

Peek at data from a HTTP connection.

ssize_t httpPeek(http_t *http, char *buffer, size_t length);

Parameters

http HTTP connection
buffer Buffer for data
length Maximum number of bytes

Return Value

Number of bytes copied

Discussion

This function copies available data from the given HTTP connection, reading a buffer as needed. The data is still available for reading using httpRead2.

For non-blocking connections the usual timeouts apply.

httpPost

Send a POST request to the server.

int httpPost(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI for post

Return Value

Status of call (0 = success)

httpPut

Send a PUT request to the server.

int httpPut(http_t *http, const char *uri);

Parameters

http HTTP connection
uri URI to put

Return Value

Status of call (0 = success)

 CUPS 1.2/macOS 10.5 httpRead2

Read data from a HTTP connection.

ssize_t httpRead2(http_t *http, char *buffer, size_t length);

Parameters

http HTTP connection
buffer Buffer for data
length Maximum number of bytes

Return Value

Number of bytes read

 CUPS 1.7/macOS 10.9 httpReadRequest

Read a HTTP request from a connection.

http_state_t httpReadRequest(http_t *http, char *uri, size_t urilen);

Parameters

http HTTP connection
uri URI buffer
urilen Size of URI buffer

Return Value

New state of connection

httpReconnect2

Reconnect to a HTTP server with timeout and optional cancel.

int httpReconnect2(http_t *http, int msec, int *cancel);

Parameters

http HTTP connection
msec Timeout in milliseconds
cancel Pointer to "cancel" variable

Return Value

0 on success, non-zero on failure

 CUPS 2.0/OS 10.10 httpResolveHostname

Resolve the hostname of the HTTP connection address.

const char *httpResolveHostname(http_t *http, char *buffer, size_t bufsize);

Parameters

http HTTP connection
buffer Hostname buffer
bufsize Size of buffer

Return Value

Resolved hostname or NULL

 CUPS 2.0/OS 10.10 httpSaveCredentials

Save X.509 credentials to a keychain file.

int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name);

Parameters

path Keychain path or NULL for default
credentials Credentials
common_name Common name for credentials

Return Value

-1 on error, 0 on success

 CUPS 1.2/macOS 10.5 httpSeparateURI

Separate a Universal Resource Identifier into its components.

http_uri_status_t httpSeparateURI(http_uri_coding_t decoding, const char *uri, char *scheme, int schemelen, char *username, int usernamelen, char *host, int hostlen, int *port, char *resource, int resourcelen);

Parameters

decoding Decoding flags
uri Universal Resource Identifier
scheme Scheme (http, https, etc.)
schemelen Size of scheme buffer
username Username
usernamelen Size of username buffer
host Hostname
hostlen Size of hostname buffer
port Port number to use
resource Resource/filename
resourcelen Size of resource buffer

Return Value

Result of separation

 CUPS 1.3/macOS 10.5 httpSetAuthString

Set the current authorization string.

void httpSetAuthString(http_t *http, const char *scheme, const char *data);

Parameters

http HTTP connection
scheme Auth scheme (NULL to clear it)
data Auth data (NULL for none)

Discussion

This function just stores a copy of the current authorization string in the HTTP connection object. You must still call httpSetField to set HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet, httpHead, httpOptions, httpPost, or httpPut.

 CUPS 1.1.19/macOS 10.3 httpSetCookie

Set the cookie value(s).

void httpSetCookie(http_t *http, const char *cookie);

Parameters

http Connection
cookie Cookie string

 CUPS 1.5/macOS 10.7 httpSetCredentials

Set the credentials associated with an encrypted connection.

int httpSetCredentials(http_t *http, cups_array_t *credentials);

Parameters

http HTTP connection
credentials Array of credentials

Return Value

Status of call (0 = success)

 CUPS 1.7/macOS 10.9 httpSetDefaultField

Set the default value of an HTTP header.

void httpSetDefaultField(http_t *http, http_field_t field, const char *value);

Parameters

http HTTP connection
field Field index
value Value

Discussion

Currently only HTTP_FIELD_ACCEPT_ENCODING, HTTP_FIELD_SERVER, and HTTP_FIELD_USER_AGENT can be set.

 CUPS 1.2/macOS 10.5 httpSetExpect

Set the Expect: header in a request.

void httpSetExpect(http_t *http, http_status_t expect);

Parameters

http HTTP connection
expect HTTP status to expect (HTTP_STATUS_CONTINUE)

Discussion

Currently only HTTP_STATUS_CONTINUE is supported for the "expect" argument.

httpSetField

Set the value of an HTTP header.

void httpSetField(http_t *http, http_field_t field, const char *value);

Parameters

http HTTP connection
field Field index
value Value

 CUPS 2.0/OS 10.10 httpSetKeepAlive

Set the current Keep-Alive state of a connection.

void httpSetKeepAlive(http_t *http, http_keepalive_t keep_alive);

Parameters

http HTTP connection
keep_alive New Keep-Alive value

 CUPS 1.2/macOS 10.5 httpSetLength

Set the content-length and content-encoding.

void httpSetLength(http_t *http, size_t length);

Parameters

http HTTP connection
length Length (0 for chunked)

 CUPS 1.5/macOS 10.7 httpSetTimeout

Set read/write timeouts and an optional callback.

void httpSetTimeout(http_t *http, double timeout, http_timeout_cb_t cb, void *user_data);

Parameters

http HTTP connection
timeout Number of seconds for timeout, must be greater than 0
cb Callback function or NULL
user_data User data pointer

Discussion

The optional timeout callback receives both the HTTP connection and a user data pointer and must return 1 to continue or 0 to error (time) out.

 CUPS 2.0/OS 10.10 httpShutdown

Shutdown one side of an HTTP connection.

void httpShutdown(http_t *http);

Parameters

http HTTP connection

 CUPS 2.0/OS 10.10 httpStateString

Return the string describing a HTTP state value.

const char *httpStateString(http_state_t state);

Parameters

state HTTP state value

Return Value

State string

httpStatus

Return a short string describing a HTTP status code.

const char *httpStatus(http_status_t status);

Parameters

status HTTP status code

Return Value

Localized status string

Discussion

The returned string is localized to the current POSIX locale and is based on the status strings defined in RFC 7231.

 CUPS 2.0/OS 10.10 httpURIStatusString

Return a string describing a URI status code.

const char *httpURIStatusString(http_uri_status_t status);

Parameters

status URI status code

Return Value

Localized status string

httpUpdate

Update the current HTTP state for incoming data.

http_status_t httpUpdate(http_t *http);

Parameters

http HTTP connection

Return Value

HTTP status

 CUPS 1.1.19/macOS 10.3 httpWait

Wait for data available on a connection.

int httpWait(http_t *http, int msec);

Parameters

http HTTP connection
msec Milliseconds to wait

Return Value

1 if data is available, 0 otherwise

 CUPS 1.2/macOS 10.5 httpWrite2

Write data to a HTTP connection.

ssize_t httpWrite2(http_t *http, const char *buffer, size_t length);

Parameters

http HTTP connection
buffer Buffer for data
length Number of bytes to write

Return Value

Number of bytes written

 CUPS 1.7/macOS 10.9 httpWriteResponse

Write a HTTP response to a client connection.

int httpWriteResponse(http_t *http, http_status_t status);

Parameters

http HTTP connection
status Status code

Return Value

0 on success, -1 on error

ippAddBoolean

Add a boolean attribute to an IPP message.

ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value);

Parameters

ipp IPP message
group IPP group
name Name of attribute
value Value of attribute

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddBooleans

Add an array of boolean values.

ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values);

Parameters

ipp IPP message
group IPP group
name Name of attribute
num_values Number of values
values Values

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

 CUPS 1.1.19/macOS 10.3 ippAddCollection

Add a collection value.

ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_t *value);

Parameters

ipp IPP message
group IPP group
name Name of attribute
value Value

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

 CUPS 1.1.19/macOS 10.3 ippAddCollections

Add an array of collection values.

ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const ipp_t **values);

Parameters

ipp IPP message
group IPP group
name Name of attribute
num_values Number of values
values Values

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddDate

Add a dateTime attribute to an IPP message.

ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value);

Parameters

ipp IPP message
group IPP group
name Name of attribute
value Value

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddInteger

Add a integer attribute to an IPP message.

ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int value);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
value Value of attribute

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported values include enum (IPP_TAG_ENUM) and integer (IPP_TAG_INTEGER).

ippAddIntegers

Add an array of integer values.

ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const int *values);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
num_values Number of values
values Values

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported values include enum (IPP_TAG_ENUM) and integer (IPP_TAG_INTEGER).

 CUPS 1.2/macOS 10.5 ippAddOctetString

Add an octetString value to an IPP message.

ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, const char *name, const void *data, int datalen);

Parameters

ipp IPP message
group IPP group
name Name of attribute
data octetString data
datalen Length of data in bytes

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

 CUPS 1.6/macOS 10.8 ippAddOutOfBand

Add an out-of-band value to an IPP message.

ipp_attribute_t *ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported out-of-band values include unsupported-value (IPP_TAG_UNSUPPORTED_VALUE), default (IPP_TAG_DEFAULT), unknown (IPP_TAG_UNKNOWN), no-value (IPP_TAG_NOVALUE), not-settable (IPP_TAG_NOTSETTABLE), delete-attribute (IPP_TAG_DELETEATTR), and admin-define (IPP_TAG_ADMINDEFINE).

ippAddRange

Add a range of values to an IPP message.

ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper);

Parameters

ipp IPP message
group IPP group
name Name of attribute
lower Lower value
upper Upper value

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

The lower parameter must be less than or equal to the upper parameter.

ippAddRanges

Add ranges of values to an IPP message.

ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper);

Parameters

ipp IPP message
group IPP group
name Name of attribute
num_values Number of values
lower Lower values
upper Upper values

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddResolution

Add a resolution value to an IPP message.

ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres);

Parameters

ipp IPP message
group IPP group
name Name of attribute
units Units for resolution
xres X resolution
yres Y resolution

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddResolutions

Add resolution values to an IPP message.

ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres);

Parameters

ipp IPP message
group IPP group
name Name of attribute
num_values Number of values
units Units for resolution
xres X resolutions
yres Y resolutions

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

ippAddSeparator

Add a group separator to an IPP message.

ipp_attribute_t *ippAddSeparator(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

ippAddString

Add a language-encoded string to an IPP message.

ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *value);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
language Language code
value Value

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported string values include charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), language (IPP_TAG_LANGUAGE), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME), nameWithLanguage (IPP_TAG_NAMELANG), text (code IPP_TAG_TEXT@), textWithLanguage (IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), and uriScheme (IPP_TAG_URISCHEME).

The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

 CUPS 1.7/macOS 10.9 ippAddStringf

Add a formatted string to an IPP message.

ipp_attribute_t *ippAddStringf(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, ...);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
language Language code (NULL for default)
format Printf-style format string
... Additional arguments as needed

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported string values include charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), language (IPP_TAG_LANGUAGE), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME), nameWithLanguage (IPP_TAG_NAMELANG), text (code IPP_TAG_TEXT@), textWithLanguage (IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), and uriScheme (IPP_TAG_URISCHEME).

The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

The format parameter uses formatting characters compatible with the printf family of standard functions. Additional arguments follow it as needed. The formatted string is truncated as needed to the maximum length of the corresponding value type.

 CUPS 1.7/macOS 10.9 ippAddStringfv

Add a formatted string to an IPP message.

ipp_attribute_t *ippAddStringfv(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, va_list ap);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
language Language code (NULL for default)
format Printf-style format string
ap Additional arguments

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported string values include charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), language (IPP_TAG_LANGUAGE), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME), nameWithLanguage (IPP_TAG_NAMELANG), text (code IPP_TAG_TEXT@), textWithLanguage (IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), and uriScheme (IPP_TAG_URISCHEME).

The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

The format parameter uses formatting characters compatible with the printf family of standard functions. Additional arguments are passed in the stdarg pointer ap. The formatted string is truncated as needed to the maximum length of the corresponding value type.

ippAddStrings

Add language-encoded strings to an IPP message.

ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const char *language, const char *const *values);

Parameters

ipp IPP message
group IPP group
value_tag Type of attribute
name Name of attribute
num_values Number of values
language Language code (NULL for default)
values Values

Return Value

New attribute

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

Supported string values include charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), language (IPP_TAG_LANGUAGE), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME), nameWithLanguage (IPP_TAG_NAMELANG), text (code IPP_TAG_TEXT@), textWithLanguage (IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), and uriScheme (IPP_TAG_URISCHEME).

The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

 CUPS 1.6/macOS 10.8 ippAttributeString

Convert the attribute's value to a string.

size_t ippAttributeString(ipp_attribute_t *attr, char *buffer, size_t bufsize);

Parameters

attr Attribute
buffer String buffer or NULL
bufsize Size of string buffer

Return Value

Number of bytes less nul

Discussion

Returns the number of bytes that would be written, not including the trailing nul. The buffer pointer can be NULL to get the required length, just like (v)snprintf.

 CUPS 1.7/macOS 10.9 ippContainsInteger

Determine whether an attribute contains the specified value or is within the list of ranges.

int ippContainsInteger(ipp_attribute_t *attr, int value);

Parameters

attr Attribute
value Integer/enum value

Return Value

1 on a match, 0 on no match

Discussion

Returns non-zero when the attribute contains either a matching integer or enum value, or the value falls within one of the rangeOfInteger values for the attribute.

 CUPS 1.7/macOS 10.9 ippContainsString

Determine whether an attribute contains the specified string value.

int ippContainsString(ipp_attribute_t *attr, const char *value);

Parameters

attr Attribute
value String value

Return Value

1 on a match, 0 on no match

Discussion

Returns non-zero when the attribute contains a matching charset, keyword, naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value.

 CUPS 1.6/macOS 10.8 ippCopyAttribute

Copy an attribute.

ipp_attribute_t *ippCopyAttribute(ipp_t *dst, ipp_attribute_t *srcattr, int quickcopy);

Parameters

dst Destination IPP message
srcattr Attribute to copy
quickcopy 1 for a referenced copy, 0 for normal

Return Value

New attribute

Discussion

The specified attribute, attr, is copied to the destination IPP message. When quickcopy is non-zero, a "shallow" reference copy of the attribute is created - this should only be done as long as the original source IPP message will not be freed for the life of the destination.

 CUPS 1.6/macOS 10.8 ippCopyAttributes

Copy attributes from one IPP message to another.

int ippCopyAttributes(ipp_t *dst, ipp_t *src, int quickcopy, ipp_copycb_t cb, void *context);

Parameters

dst Destination IPP message
src Source IPP message
quickcopy 1 for a referenced copy, 0 for normal
cb Copy callback or NULL for none
context Context pointer

Return Value

1 on success, 0 on error

Discussion

Zero or more attributes are copied from the source IPP message, src, to the destination IPP message, dst. When quickcopy is non-zero, a "shallow" reference copy of the attribute is created - this should only be done as long as the original source IPP message will not be freed for the life of the destination.

The cb and context parameters provide a generic way to "filter" the attributes that are copied - the function must return 1 to copy the attribute or 0 to skip it. The function may also choose to do a partial copy of the source attribute itself.

 CUPS 1.7/macOS 10.9 ippCreateRequestedArray

Create a CUPS array of attribute names from the given requested-attributes attribute.

cups_array_t *ippCreateRequestedArray(ipp_t *request);

Parameters

request IPP request

Return Value

CUPS array or NULL if all

Discussion

This function creates a (sorted) CUPS array of attribute names matching the list of "requested-attribute" values supplied in an IPP request. All IANA- registered values are supported in addition to the CUPS IPP extension attributes.

The request parameter specifies the request message that was read from the client. NULL is returned if all attributes should be returned. Otherwise, the result is a sorted array of attribute names, where cupsArrayFind(array, "attribute-name") will return a non-NULL pointer. The array must be freed using the cupsArrayDelete function.

ippDateToTime

Convert from RFC 2579 Date/Time format to time in seconds.

time_t ippDateToTime(const ipp_uchar_t *date);

Parameters

date RFC 2579 date info

Return Value

UNIX time value

ippDelete

Delete an IPP message.

void ippDelete(ipp_t *ipp);

Parameters

ipp IPP message

 CUPS 1.1.19/macOS 10.3 ippDeleteAttribute

Delete a single attribute in an IPP message.

void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr);

Parameters

ipp IPP message
attr Attribute to delete

 CUPS 1.6/macOS 10.8 ippDeleteValues

Delete values in an attribute.

int ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr, int element, int count);

Parameters

ipp IPP message
attr Attribute
element Index of first value to delete (0-based)
count Number of values to delete

Return Value

1 on success, 0 on failure

Discussion

The element parameter specifies the first value to delete, starting at 0. It must be less than the number of values returned by ippGetCount.

The attr parameter may be modified as a result of setting the value.

Deleting all values in an attribute deletes the attribute.

ippEnumString

Return a string corresponding to the enum value.

const char *ippEnumString(const char *attrname, int enumvalue);

Parameters

attrname Attribute name
enumvalue Enum value

Return Value

Enum string

ippEnumValue

Return the value associated with a given enum string.

int ippEnumValue(const char *attrname, const char *enumstring);

Parameters

attrname Attribute name
enumstring Enum string

Return Value

Enum value or -1 if unknown

ippErrorString

Return a name for the given status code.

const char *ippErrorString(ipp_status_t error);

Parameters

error Error status

Return Value

Text string

 CUPS 1.2/macOS 10.5 ippErrorValue

Return a status code for the given name.

ipp_status_t ippErrorValue(const char *name);

Parameters

name Name

Return Value

IPP status code

ippFindAttribute

Find a named attribute in a request.

ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);

Parameters

ipp IPP message
name Name of attribute
type Type of attribute

Return Value

Matching attribute

Discussion

Starting with CUPS 2.0, the attribute name can contain a hierarchical list of attribute and member names separated by slashes, for example "media-col/media-size".

ippFindNextAttribute

Find the next named attribute in a request.

ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);

Parameters

ipp IPP message
name Name of attribute
type Type of attribute

Return Value

Matching attribute

Discussion

Starting with CUPS 2.0, the attribute name can contain a hierarchical list of attribute and member names separated by slashes, for example "media-col/media-size".

 CUPS 1.6/macOS 10.8 ippFirstAttribute

Return the first attribute in the message.

ipp_attribute_t *ippFirstAttribute(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

First attribute or NULL if none

 CUPS 1.6/macOS 10.8 ippGetBoolean

Get a boolean value for an attribute.

int ippGetBoolean(ipp_attribute_t *attr, int element);

Parameters

attr IPP attribute
element Value number (0-based)

Return Value

Boolean value or 0 on error

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetCollection

Get a collection value for an attribute.

ipp_t *ippGetCollection(ipp_attribute_t *attr, int element);

Parameters

attr IPP attribute
element Value number (0-based)

Return Value

Collection value or NULL on error

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetCount

Get the number of values in an attribute.

int ippGetCount(ipp_attribute_t *attr);

Parameters

attr IPP attribute

Return Value

Number of values or 0 on error

 CUPS 1.6/macOS 10.8 ippGetDate

Get a dateTime value for an attribute.

const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element);

Parameters

attr IPP attribute
element Value number (0-based)

Return Value

dateTime value or NULL

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetGroupTag

Get the group associated with an attribute.

ipp_tag_t ippGetGroupTag(ipp_attribute_t *attr);

Parameters

attr IPP attribute

Return Value

Group tag or IPP_TAG_ZERO on error

 CUPS 1.6/macOS 10.8 ippGetInteger

Get the integer/enum value for an attribute.

int ippGetInteger(ipp_attribute_t *attr, int element);

Parameters

attr IPP attribute
element Value number (0-based)

Return Value

Value or 0 on error

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetName

Get the attribute name.

const char *ippGetName(ipp_attribute_t *attr);

Parameters

attr IPP attribute

Return Value

Attribute name or NULL for separators

 CUPS 1.7/macOS 10.9 ippGetOctetString

Get an octetString value from an IPP attribute.

void *ippGetOctetString(ipp_attribute_t *attr, int element, int *datalen);

Parameters

attr IPP attribute
element Value number (0-based)
datalen Length of octetString data

Return Value

Pointer to octetString data

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetOperation

Get the operation ID in an IPP message.

ipp_op_t ippGetOperation(ipp_t *ipp);

Parameters

ipp IPP request message

Return Value

Operation ID or 0 on error

 CUPS 1.6/macOS 10.8 ippGetRange

Get a rangeOfInteger value from an attribute.

int ippGetRange(ipp_attribute_t *attr, int element, int *uppervalue);

Parameters

attr IPP attribute
element Value number (0-based)
uppervalue Upper value of range

Return Value

Lower value of range or 0

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetRequestId

Get the request ID from an IPP message.

int ippGetRequestId(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

Request ID or 0 on error

 CUPS 1.6/macOS 10.8 ippGetResolution

Get a resolution value for an attribute.

int ippGetResolution(ipp_attribute_t *attr, int element, int *yres, ipp_res_t *units);

Parameters

attr IPP attribute
element Value number (0-based)
yres Vertical/feed resolution
units Units for resolution

Return Value

Horizontal/cross feed resolution or 0

Discussion

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetState

Get the IPP message state.

ipp_state_t ippGetState(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

IPP message state value

 CUPS 1.6/macOS 10.8 ippGetStatusCode

Get the status code from an IPP response or event message.

ipp_status_t ippGetStatusCode(ipp_t *ipp);

Parameters

ipp IPP response or event message

Return Value

Status code in IPP message

ippGetString

const char *ippGetString(ipp_attribute_t *attr, int element, const char **language);

Parameters

attr IPP attribute
element Value number (0-based)
language Language code (NULL for don't care)

Return Value

Get the string and optionally the language code for an attribute.

The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

 CUPS 1.6/macOS 10.8 ippGetValueTag

Get the value tag for an attribute.

ipp_tag_t ippGetValueTag(ipp_attribute_t *attr);

Parameters

attr IPP attribute

Return Value

Value tag or IPP_TAG_ZERO on error

 CUPS 1.6/macOS 10.8 ippGetVersion

Get the major and minor version number from an IPP message.

int ippGetVersion(ipp_t *ipp, int *minor);

Parameters

ipp IPP message
minor Minor version number or NULL for don't care

Return Value

Major version number or 0 on error

ippLength

Compute the length of an IPP message.

size_t ippLength(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

Size of IPP message

ippNew

Allocate a new IPP message.

ipp_t *ippNew(void);

Return Value

New IPP message

 CUPS 1.2/macOS 10.5 ippNewRequest

Allocate a new IPP request message.

ipp_t *ippNewRequest(ipp_op_t op);

Parameters

op Operation code

Return Value

IPP request message

Discussion

The new request message is initialized with the "attributes-charset" and "attributes-natural-language" attributes added. The "attributes-natural-language" value is derived from the current locale.

 CUPS 1.7/macOS 10.9 ippNewResponse

Allocate a new IPP response message.

ipp_t *ippNewResponse(ipp_t *request);

Parameters

request IPP request message

Return Value

IPP response message

Discussion

The new response message is initialized with the same "version-number", "request-id", "attributes-charset", and "attributes-natural-language" as the provided request message. If the "attributes-charset" or "attributes-natural-language" attributes are missing from the request, 'utf-8' and a value derived from the current locale are substituted, respectively.

 CUPS 1.6/macOS 10.8 ippNextAttribute

Return the next attribute in the message.

ipp_attribute_t *ippNextAttribute(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

Next attribute or NULL if none

 CUPS 1.2/macOS 10.5 ippOpString

Return a name for the given operation id.

const char *ippOpString(ipp_op_t op);

Parameters

op Operation ID

Return Value

Name

 CUPS 1.2/macOS 10.5 ippOpValue

Return an operation id for the given name.

ipp_op_t ippOpValue(const char *name);

Parameters

name Textual name

Return Value

Operation ID

ippPort

Return the default IPP port number.

int ippPort(void);

Return Value

Port number

ippRead

Read data for an IPP message from a HTTP connection.

ipp_state_t ippRead(http_t *http, ipp_t *ipp);

Parameters

http HTTP connection
ipp IPP data

Return Value

Current state

 CUPS 1.1.19/macOS 10.3 ippReadFile

Read data for an IPP message from a file.

ipp_state_t ippReadFile(int fd, ipp_t *ipp);

Parameters

fd HTTP data
ipp IPP data

Return Value

Current state

 CUPS 1.2/macOS 10.5 ippReadIO

Read data for an IPP message.

ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);

Parameters

src Data source
cb Read callback function
blocking Use blocking IO?
parent Parent request, if any
ipp IPP data

Return Value

Current state

 CUPS 1.6/macOS 10.8 ippSetBoolean

Set a boolean value in an attribute.

int ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr, int element, int boolvalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
boolvalue Boolean value

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetCollection

Set a collection value in an attribute.

int ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_t *colvalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
colvalue Collection value

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetDate

Set a dateTime value in an attribute.

int ippSetDate(ipp_t *ipp, ipp_attribute_t **attr, int element, const ipp_uchar_t *datevalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
datevalue dateTime value

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetGroupTag

Set the group tag of an attribute.

int ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t group_tag);

Parameters

ipp IPP message
attr Attribute
group_tag Group tag

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The group parameter specifies the IPP attribute group tag: none (IPP_TAG_ZERO, for member attributes), document (IPP_TAG_DOCUMENT), event notification (IPP_TAG_EVENT_NOTIFICATION), operation (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

 CUPS 1.6/macOS 10.8 ippSetInteger

Set an integer or enum value in an attribute.

int ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr, int element, int intvalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
intvalue Integer/enum value

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetName

Set the name of an attribute.

int ippSetName(ipp_t *ipp, ipp_attribute_t **attr, const char *name);

Parameters

ipp IPP message
attr IPP attribute
name Attribute name

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

 CUPS 1.7/macOS 10.9 ippSetOctetString

Set an octetString value in an IPP attribute.

int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const void *data, int datalen);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
data Pointer to octetString data
datalen Length of octetString data

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetOperation

Set the operation ID in an IPP request message.

int ippSetOperation(ipp_t *ipp, ipp_op_t op);

Parameters

ipp IPP request message
op Operation ID

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

ippSetPort

Set the default port number.

void ippSetPort(int p);

Parameters

p Port number to use

 CUPS 1.6/macOS 10.8 ippSetRange

Set a rangeOfInteger value in an attribute.

int ippSetRange(ipp_t *ipp, ipp_attribute_t **attr, int element, int lowervalue, int uppervalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
lowervalue Lower bound for range
uppervalue Upper bound for range

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetRequestId

Set the request ID in an IPP message.

int ippSetRequestId(ipp_t *ipp, int request_id);

Parameters

ipp IPP message
request_id Request ID

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The request_id parameter must be greater than 0.

 CUPS 1.6/macOS 10.8 ippSetResolution

Set a resolution value in an attribute.

int ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_res_t unitsvalue, int xresvalue, int yresvalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
unitsvalue Resolution units
xresvalue Horizontal/cross feed resolution
yresvalue Vertical/feed resolution

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.6/macOS 10.8 ippSetState

Set the current state of the IPP message.

int ippSetState(ipp_t *ipp, ipp_state_t state);

Parameters

ipp IPP message
state IPP state value

Return Value

1 on success, 0 on failure

 CUPS 1.6/macOS 10.8 ippSetStatusCode

Set the status code in an IPP response or event message.

int ippSetStatusCode(ipp_t *ipp, ipp_status_t status);

Parameters

ipp IPP response or event message
status Status code

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

 CUPS 1.6/macOS 10.8 ippSetString

Set a string value in an attribute.

int ippSetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *strvalue);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
strvalue String value

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

 CUPS 1.7/macOS 10.9 ippSetStringf

Set a formatted string value of an attribute.

int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, ...);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
format Printf-style format string
... Additional arguments as needed

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

The format parameter uses formatting characters compatible with the printf family of standard functions. Additional arguments follow it as needed. The formatted string is truncated as needed to the maximum length of the corresponding value type.

 CUPS 1.7/macOS 10.9 ippSetStringfv

Set a formatted string value of an attribute.

int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, va_list ap);

Parameters

ipp IPP message
attr IPP attribute
element Value number (0-based)
format Printf-style format string
ap Pointer to additional arguments

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

The element parameter specifies which value to set from 0 to ippGetCount(attr).

The format parameter uses formatting characters compatible with the printf family of standard functions. Additional arguments follow it as needed. The formatted string is truncated as needed to the maximum length of the corresponding value type.

 CUPS 1.6/macOS 10.8 ippSetValueTag

Set the value tag of an attribute.

int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t value_tag);

Parameters

ipp IPP message
attr IPP attribute
value_tag Value tag

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The attr parameter may be modified as a result of setting the value.

Integer (IPP_TAG_INTEGER) values can be promoted to rangeOfInteger (IPP_TAG_RANGE) values, the various string tags can be promoted to name (IPP_TAG_NAME) or nameWithLanguage (IPP_TAG_NAMELANG) values, text (IPP_TAG_TEXT) values can be promoted to textWithLanguage (IPP_TAG_TEXTLANG) values, and all values can be demoted to the various out-of-band value tags such as no-value (IPP_TAG_NOVALUE). All other changes will be rejected.

Promoting a string attribute to nameWithLanguage or textWithLanguage adds the language code in the "attributes-natural-language" attribute or, if not present, the language code for the current locale.

 CUPS 1.6/macOS 10.8 ippSetVersion

Set the version number in an IPP message.

int ippSetVersion(ipp_t *ipp, int major, int minor);

Parameters

ipp IPP message
major Major version number (major.minor)
minor Minor version number (major.minor)

Return Value

1 on success, 0 on failure

Discussion

The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.

 CUPS 2.0/OS 10.10 ippStateString

Return the name corresponding to a state value.

const char *ippStateString(ipp_state_t state);

Parameters

state State value

Return Value

State name

 CUPS 1.4/macOS 10.6 ippTagString

Return the tag name corresponding to a tag value.

const char *ippTagString(ipp_tag_t tag);

Parameters

tag Tag value

Return Value

Tag name

Discussion

The returned names are defined in RFC 8011 and the IANA IPP Registry.

 CUPS 1.4/macOS 10.6 ippTagValue

Return the tag value corresponding to a tag name.

ipp_tag_t ippTagValue(const char *name);

Parameters

name Tag name

Return Value

Tag value

Discussion

The tag names are defined in RFC 8011 and the IANA IPP Registry.

ippTimeToDate

Convert from time in seconds to RFC 2579 format.

const ipp_uchar_t *ippTimeToDate(time_t t);

Parameters

t Time in seconds

Return Value

RFC-2579 date/time data

 CUPS 1.7/macOS 10.9 ippValidateAttribute

Validate the contents of an attribute.

int ippValidateAttribute(ipp_attribute_t *attr);

Parameters

attr Attribute

Return Value

1 if valid, 0 otherwise

Discussion

This function validates the contents of an attribute based on the name and value tag. 1 is returned if the attribute is valid, 0 otherwise. On failure, cupsLastErrorString is set to a human-readable message.

 CUPS 1.7/macOS 10.9 ippValidateAttributes

Validate all attributes in an IPP message.

int ippValidateAttributes(ipp_t *ipp);

Parameters

ipp IPP message

Return Value

1 if valid, 0 otherwise

Discussion

This function validates the contents of the IPP message, including each attribute. Like ippValidateAttribute, cupsLastErrorString is set to a human-readable message on failure.

ippWrite

Write data for an IPP message to a HTTP connection.

ipp_state_t ippWrite(http_t *http, ipp_t *ipp);

Parameters

http HTTP connection
ipp IPP data

Return Value

Current state

 CUPS 1.1.19/macOS 10.3 ippWriteFile

Write data for an IPP message to a file.

ipp_state_t ippWriteFile(int fd, ipp_t *ipp);

Parameters

fd HTTP data
ipp IPP data

Return Value

Current state

 CUPS 1.2/macOS 10.5 ippWriteIO

Write data for an IPP message.

ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);

Parameters

dst Destination
cb Write callback function
blocking Use blocking IO?
parent Parent IPP message
ipp IPP data

Return Value

Current state

Data Types

 CUPS 1.5/macOS 10.7 cups_client_cert_cb_t

Client credentials callback

typedef int(*)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data)cups_client_cert_cb_t;

 CUPS 1.6/macOS 10.8 cups_dest_cb_t

Destination enumeration callback

typedef int(*)(void *user_data, unsigned flags, cups_dest_t *dest)cups_dest_cb_t;

cups_dest_t

Destination

typedef struct cups_dest_s cups_dest_t;

 CUPS 1.6/macOS 10.8 cups_dinfo_t

Destination capability and status information

typedef struct _cups_dinfo_s cups_dinfo_t;

cups_job_t

Job

typedef struct cups_job_s cups_job_t;

cups_option_t

Printer Options

typedef struct cups_option_s cups_option_t;

 CUPS 1.4/macOS 10.6 cups_password_cb2_t

New password callback

typedef const char *(*)(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data)cups_password_cb2_t;

cups_ptype_t

Printer type/capability bits

typedef unsigned cups_ptype_t;

 CUPS 1.5/macOS 10.7 cups_server_cert_cb_t

Server credentials callback

typedef int(*)(http_t *http, void *tls, cups_array_t *certs, void *user_data)cups_server_cert_cb_t;

 CUPS 1.6/macOS 10.8 cups_size_t

Media Size

typedef struct cups_size_s cups_size_t;

 CUPS 1.2/macOS 10.5 http_addr_t

Socket address union, which makes using IPv6 and other address types easier and more portable.

typedef union _http_addr_u / http_addr_t;

http_encoding_t

HTTP transfer encoding values

typedef enum http_encoding_e http_encoding_t;

http_encryption_t

HTTP encryption values

typedef enum http_encryption_e http_encryption_t;

http_field_t

HTTP field names

typedef enum http_field_e http_field_t;

http_keepalive_t

HTTP keep-alive values

typedef enum http_keepalive_e http_keepalive_t;

http_state_t

HTTP state values; states are server-oriented...

typedef enum http_state_e http_state_t;

http_t

HTTP connection type

typedef struct _http_s http_t;

 CUPS 1.5/macOS 10.7 http_timeout_cb_t

HTTP timeout callback

typedef int(*)(http_t *http, void *user_data)http_timeout_cb_t;

 CUPS 2.0/OS 10.10 http_trust_t

Level of trust for credentials

typedef enum http_trust_e http_trust_t;

http_uri_coding_t

URI en/decode flags

typedef enum http_uri_coding_e http_uri_coding_t;

 CUPS 1.2 http_uri_status_t

URI separation status

typedef enum http_uri_status_e http_uri_status_t;

ipp_attribute_t

IPP attribute

typedef struct _ipp_attribute_s ipp_attribute_t;

 CUPS 1.6/macOS 10.8 ipp_copycb_t

ippCopyAttributes callback function

typedef int(*)(void *context, ipp_t *dst, ipp_attribute_t *attr)ipp_copycb_t;

 CUPS 1.2/macOS 10.5 ipp_iocb_t

ippReadIO/ippWriteIO callback function

typedef ssize_t(*)(void *context, ipp_uchar_t *buffer, size_t bytes) ipp_iocb_t;

ipp_orient_t

Orientation values

typedef enum ipp_orient_e ipp_orient_t;

ipp_pstate_t

Printer state values

typedef enum ipp_pstate_e ipp_pstate_t;

ipp_quality_t

Print quality values

typedef enum ipp_quality_e ipp_quality_t;

ipp_res_t

Resolution units

typedef enum ipp_res_e ipp_res_t;

ipp_rstate_t

resource-state values

typedef enum ipp_rstate_e ipp_rstate_t;

ipp_sstate_t

system-state values

typedef enum ipp_sstate_e ipp_sstate_t;

ipp_state_t

ipp_t state values

typedef enum ipp_state_e ipp_state_t;

ipp_t

IPP request/response data

typedef struct _ipp_s ipp_t;

Structures

cups_dest_s

Destination

struct cups_dest_s {
    char *name, *instance;
    int is_default;
    int num_options;
    cups_option_t *options;
};

Members

instance Local instance name or NULL
is_default Is this printer the default?
num_options Number of options
options Options

cups_job_s

Job

struct cups_job_s {
    time_t completed_time;
    time_t creation_time;
    char *dest;
    char *format;
    int id;
    int priority;
    time_t processing_time;
    int size;
    ipp_jstate_t state;
    char *title;
    char *user;
};

Members

completed_time Time the job was completed
creation_time Time the job was created
dest Printer or class name
format Document format
id The job ID
priority Priority (1-100)
processing_time Time the job was processed
size Size in kilobytes
state Job state
title Title/job name
user User that submitted the job

cups_option_s

Printer Options

struct cups_option_s {
    char *name;
    char *value;
};

Members

name Name of option
value Value of option

 CUPS 1.6/macOS 10.8 cups_size_s

Media Size

struct cups_size_s {
    char media[128];
    int width, length, bottom, left, right, top;
};

Members

media[128] Media name to use
top Top margin in hundredths of millimeters

Constants

cups_ptype_e

Printer type/capability bit constants

Constants

CUPS_PRINTER_AUTHENTICATED  CUPS 1.2/macOS 10.5  Printer requires authentication
CUPS_PRINTER_BIND Can bind output
CUPS_PRINTER_BW Can do B&W printing
CUPS_PRINTER_CLASS Printer class
CUPS_PRINTER_COLLATE Can quickly collate copies
CUPS_PRINTER_COLOR Can do color printing
CUPS_PRINTER_COMMANDS  CUPS 1.2/macOS 10.5  Printer supports maintenance commands
CUPS_PRINTER_COPIES Can do copies in hardware
CUPS_PRINTER_COVER Can cover output
CUPS_PRINTER_DEFAULT Default printer on network
CUPS_PRINTER_DISCOVERED  CUPS 1.2/macOS 10.5  Printer was discovered
CUPS_PRINTER_DUPLEX Can do two-sided printing
CUPS_PRINTER_FAX Fax queue
CUPS_PRINTER_LARGE Can print on D/E/A1/A0-size media
CUPS_PRINTER_LOCAL Local printer or class
CUPS_PRINTER_MEDIUM Can print on Tabloid/B/C/A3/A2-size media
CUPS_PRINTER_NOT_SHARED  CUPS 1.2/macOS 10.5  Printer is not shared
CUPS_PRINTER_PUNCH Can punch output
CUPS_PRINTER_REJECTING Printer is rejecting jobs
CUPS_PRINTER_REMOTE Remote printer or class
CUPS_PRINTER_SMALL Can print on Letter/Legal/A4-size media
CUPS_PRINTER_SORT Can sort output
CUPS_PRINTER_STAPLE Can staple output
CUPS_PRINTER_VARIABLE Can print on rolls and custom-size media

http_encoding_e

HTTP transfer encoding values

Constants

HTTP_ENCODING_CHUNKED Data is chunked
HTTP_ENCODING_FIELDS Sending HTTP fields
HTTP_ENCODING_LENGTH Data is sent with Content-Length

http_encryption_e

HTTP encryption values

Constants

HTTP_ENCRYPTION_ALWAYS Always encrypt (SSL)
HTTP_ENCRYPTION_IF_REQUESTED Encrypt if requested (TLS upgrade)
HTTP_ENCRYPTION_NEVER Never encrypt
HTTP_ENCRYPTION_REQUIRED Encryption is required (TLS upgrade)

http_field_e

HTTP field names

Constants

HTTP_FIELD_ACCEPT_ENCODING  CUPS 1.7/macOS 10.9  Accepting-Encoding field
HTTP_FIELD_ACCEPT_LANGUAGE Accept-Language field
HTTP_FIELD_ACCEPT_RANGES Accept-Ranges field
HTTP_FIELD_ALLOW  CUPS 1.7/macOS 10.9  Allow field
HTTP_FIELD_AUTHENTICATION_INFO  CUPS 2.2.9)  Authentication-Info field (
HTTP_FIELD_AUTHORIZATION Authorization field
HTTP_FIELD_CONNECTION Connection field
HTTP_FIELD_CONTENT_ENCODING Content-Encoding field
HTTP_FIELD_CONTENT_LANGUAGE Content-Language field
HTTP_FIELD_CONTENT_LENGTH Content-Length field
HTTP_FIELD_CONTENT_LOCATION Content-Location field
HTTP_FIELD_CONTENT_MD5 Content-MD5 field
HTTP_FIELD_CONTENT_RANGE Content-Range field
HTTP_FIELD_CONTENT_TYPE Content-Type field
HTTP_FIELD_CONTENT_VERSION Content-Version field
HTTP_FIELD_DATE Date field
HTTP_FIELD_HOST Host field
HTTP_FIELD_IF_MODIFIED_SINCE If-Modified-Since field
HTTP_FIELD_IF_UNMODIFIED_SINCE If-Unmodified-Since field
HTTP_FIELD_KEEP_ALIVE Keep-Alive field
HTTP_FIELD_LAST_MODIFIED Last-Modified field
HTTP_FIELD_LINK Link field
HTTP_FIELD_LOCATION Location field
HTTP_FIELD_MAX Maximum field index
HTTP_FIELD_RANGE Range field
HTTP_FIELD_REFERER Referer field
HTTP_FIELD_RETRY_AFTER Retry-After field
HTTP_FIELD_SERVER  CUPS 1.7/macOS 10.9  Server field
HTTP_FIELD_TRANSFER_ENCODING Transfer-Encoding field
HTTP_FIELD_UNKNOWN Unknown field
HTTP_FIELD_UPGRADE Upgrade field
HTTP_FIELD_USER_AGENT User-Agent field
HTTP_FIELD_WWW_AUTHENTICATE WWW-Authenticate field

http_keepalive_e

HTTP keep-alive values

Constants

HTTP_KEEPALIVE_OFF No keep alive support
HTTP_KEEPALIVE_ON Use keep alive

http_state_e

HTTP state values; states are server-oriented...

Constants

HTTP_STATE_CONNECT CONNECT command, waiting for blank line
HTTP_STATE_DELETE DELETE command, waiting for blank line
HTTP_STATE_ERROR Error on socket
HTTP_STATE_GET GET command, waiting for blank line
HTTP_STATE_GET_SEND GET command, sending data
HTTP_STATE_HEAD HEAD command, waiting for blank line
HTTP_STATE_OPTIONS OPTIONS command, waiting for blank line
HTTP_STATE_POST POST command, waiting for blank line
HTTP_STATE_POST_RECV POST command, receiving data
HTTP_STATE_POST_SEND POST command, sending data
HTTP_STATE_PUT PUT command, waiting for blank line
HTTP_STATE_PUT_RECV PUT command, receiving data
HTTP_STATE_STATUS Command complete, sending status
HTTP_STATE_TRACE TRACE command, waiting for blank line
HTTP_STATE_UNKNOWN_METHOD  CUPS 1.7/macOS 10.9  Unknown request method, waiting for blank line
HTTP_STATE_UNKNOWN_VERSION  CUPS 1.7/macOS 10.9  Unknown request method, waiting for blank line
HTTP_STATE_WAITING Waiting for command

http_status_e

HTTP status codes

Constants

HTTP_STATUS_ACCEPTED DELETE command was successful
HTTP_STATUS_BAD_GATEWAY Bad gateway
HTTP_STATUS_BAD_REQUEST Bad request
HTTP_STATUS_CONFLICT Request is self-conflicting
HTTP_STATUS_CONTINUE Everything OK, keep going...
HTTP_STATUS_CREATED PUT command was successful
HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED  CUPS 1.4  User canceled authorization
HTTP_STATUS_CUPS_PKI_ERROR  CUPS 1.5/macOS 10.7  Error negotiating a secure connection
HTTP_STATUS_ERROR An error response from httpXxxx()
HTTP_STATUS_EXPECTATION_FAILED The expectation given in an Expect header field was not met
HTTP_STATUS_FORBIDDEN Forbidden to access this URI
HTTP_STATUS_FOUND Document was found at a different URI
HTTP_STATUS_GATEWAY_TIMEOUT Gateway connection timed out
HTTP_STATUS_GONE Server has gone away
HTTP_STATUS_LENGTH_REQUIRED A content length or encoding is required
HTTP_STATUS_METHOD_NOT_ALLOWED Method is not allowed
HTTP_STATUS_MOVED_PERMANENTLY Document has moved permanently
HTTP_STATUS_MULTIPLE_CHOICES Multiple files match request
HTTP_STATUS_NONE  CUPS 1.7/macOS 10.9  No Expect value
HTTP_STATUS_NOT_ACCEPTABLE Not Acceptable
HTTP_STATUS_NOT_AUTHORITATIVE Information isn't authoritative
HTTP_STATUS_NOT_FOUND URI was not found
HTTP_STATUS_NOT_IMPLEMENTED Feature not implemented
HTTP_STATUS_NOT_MODIFIED File not modified
HTTP_STATUS_NOT_SUPPORTED HTTP version not supported
HTTP_STATUS_NO_CONTENT Successful command, no new data
HTTP_STATUS_OK OPTIONS/GET/HEAD/POST/TRACE command was successful
HTTP_STATUS_PARTIAL_CONTENT Only a partial file was received/sent
HTTP_STATUS_PAYMENT_REQUIRED Payment required
HTTP_STATUS_PRECONDITION Precondition failed
HTTP_STATUS_PROXY_AUTHENTICATION Proxy Authentication is Required
HTTP_STATUS_REQUESTED_RANGE The requested range is not satisfiable
HTTP_STATUS_REQUEST_TIMEOUT Request timed out
HTTP_STATUS_REQUEST_TOO_LARGE Request entity too large
HTTP_STATUS_RESET_CONTENT Content was reset/recreated
HTTP_STATUS_SEE_OTHER See this other link
HTTP_STATUS_SERVER_ERROR Internal server error
HTTP_STATUS_SERVICE_UNAVAILABLE Service is unavailable
HTTP_STATUS_SWITCHING_PROTOCOLS HTTP upgrade to TLS/SSL
HTTP_STATUS_TEMPORARY_REDIRECT Temporary redirection
HTTP_STATUS_UNAUTHORIZED Unauthorized to access host
HTTP_STATUS_UNSUPPORTED_MEDIATYPE The requested media type is unsupported
HTTP_STATUS_UPGRADE_REQUIRED Upgrade to SSL/TLS required
HTTP_STATUS_URI_TOO_LONG URI too long
HTTP_STATUS_USE_PROXY Must use a proxy to access this URI

 CUPS 2.0/OS 10.10 http_trust_e

Level of trust for credentials

Constants

HTTP_TRUST_CHANGED Credentials have changed
HTTP_TRUST_EXPIRED Credentials are expired
HTTP_TRUST_INVALID Credentials are invalid
HTTP_TRUST_OK Credentials are OK/trusted
HTTP_TRUST_RENEWED Credentials have been renewed
HTTP_TRUST_UNKNOWN Credentials are unknown/new

http_uri_coding_e

URI en/decode flags

Constants

HTTP_URI_CODING_ALL En/decode everything
HTTP_URI_CODING_HOSTNAME En/decode the hostname portion
HTTP_URI_CODING_MOST En/decode all but the query
HTTP_URI_CODING_NONE Don't en/decode anything
HTTP_URI_CODING_QUERY En/decode the query portion
HTTP_URI_CODING_RESOURCE En/decode the resource portion
HTTP_URI_CODING_RFC6874 Use RFC 6874 address format
HTTP_URI_CODING_USERNAME En/decode the username portion

 CUPS 1.2 http_uri_status_e

URI separation status

Constants

HTTP_URI_STATUS_BAD_ARGUMENTS Bad arguments to function (error)
HTTP_URI_STATUS_BAD_HOSTNAME Bad hostname in URI (error)
HTTP_URI_STATUS_BAD_PORT Bad port number in URI (error)
HTTP_URI_STATUS_BAD_RESOURCE Bad resource in URI (error)
HTTP_URI_STATUS_BAD_SCHEME Bad scheme in URI (error)
HTTP_URI_STATUS_BAD_URI Bad/empty URI (error)
HTTP_URI_STATUS_BAD_USERNAME Bad username in URI (error)
HTTP_URI_STATUS_MISSING_RESOURCE Missing resource in URI (warning)
HTTP_URI_STATUS_MISSING_SCHEME Missing scheme in URI (warning)
HTTP_URI_STATUS_OK URI decoded OK
HTTP_URI_STATUS_OVERFLOW URI buffer for httpAssembleURI is too small
HTTP_URI_STATUS_UNKNOWN_SCHEME Unknown scheme in URI (warning)

ipp_finishings_e

Finishings values

Constants

IPP_FINISHINGS_BALE Bale (any type)
IPP_FINISHINGS_BIND Bind
IPP_FINISHINGS_BIND_BOTTOM Bind on bottom
IPP_FINISHINGS_BIND_LEFT Bind on left
IPP_FINISHINGS_BIND_RIGHT Bind on right
IPP_FINISHINGS_BIND_TOP Bind on top
IPP_FINISHINGS_BOOKLET_MAKER Fold to make booklet
IPP_FINISHINGS_COAT Apply protective liquid or powder coating
IPP_FINISHINGS_COVER Add cover
IPP_FINISHINGS_EDGE_STITCH Stitch along any side
IPP_FINISHINGS_EDGE_STITCH_BOTTOM Stitch along bottom edge
IPP_FINISHINGS_EDGE_STITCH_LEFT Stitch along left side
IPP_FINISHINGS_EDGE_STITCH_RIGHT Stitch along right side
IPP_FINISHINGS_EDGE_STITCH_TOP Stitch along top edge
IPP_FINISHINGS_FOLD Fold (any type)
IPP_FINISHINGS_FOLD_ACCORDION 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_ENGINEERING_Z Fold the paper vertically into two small sections and one larger, forming an elongated Z
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
IPP_FINISHINGS_FOLD_HALF_Z Fold the paper in half horizontally, then Z-fold the paper vertically
IPP_FINISHINGS_FOLD_LEFT_GATE Fold the top quarter of the paper towards the midline
IPP_FINISHINGS_FOLD_LETTER Fold the paper into three sections vertically; sometimes also known as a C fold
IPP_FINISHINGS_FOLD_PARALLEL Fold the paper in half vertically two times, yielding four sections
IPP_FINISHINGS_FOLD_POSTER Fold the paper in half horizontally and vertically; sometimes also called a cross fold
IPP_FINISHINGS_FOLD_RIGHT_GATE Fold the bottom quarter of the paper towards the midline
IPP_FINISHINGS_FOLD_Z Fold the paper vertically into three sections, forming a Z
IPP_FINISHINGS_JOG_OFFSET Offset for binding (any type)
IPP_FINISHINGS_LAMINATE Apply protective (solid) material
IPP_FINISHINGS_NONE No finishing
IPP_FINISHINGS_PUNCH Punch (any location/count)
IPP_FINISHINGS_PUNCH_BOTTOM_LEFT Punch 1 hole bottom left
IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT Punch 1 hole bottom right
IPP_FINISHINGS_PUNCH_DUAL_BOTTOM Punch 2 holes bottom edge
IPP_FINISHINGS_PUNCH_DUAL_LEFT Punch 2 holes left side
IPP_FINISHINGS_PUNCH_DUAL_RIGHT Punch 2 holes right side
IPP_FINISHINGS_PUNCH_DUAL_TOP Punch 2 holes top edge
IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM Punch multiple holes bottom edge
IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT Punch multiple holes left side
IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT Punch multiple holes right side
IPP_FINISHINGS_PUNCH_MULTIPLE_TOP Punch multiple holes top edge
IPP_FINISHINGS_PUNCH_QUAD_BOTTOM Punch 4 holes bottom edge
IPP_FINISHINGS_PUNCH_QUAD_LEFT Punch 4 holes left side
IPP_FINISHINGS_PUNCH_QUAD_RIGHT Punch 4 holes right side
IPP_FINISHINGS_PUNCH_QUAD_TOP Punch 4 holes top edge
IPP_FINISHINGS_PUNCH_TOP_LEFT Punch 1 hole top left
IPP_FINISHINGS_PUNCH_TOP_RIGHT Punch 1 hole top right
IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM Punch 3 holes bottom edge
IPP_FINISHINGS_PUNCH_TRIPLE_LEFT Punch 3 holes left side
IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT Punch 3 holes right side
IPP_FINISHINGS_PUNCH_TRIPLE_TOP Punch 3 holes top edge
IPP_FINISHINGS_SADDLE_STITCH Staple interior
IPP_FINISHINGS_STAPLE Staple (any location/method)
IPP_FINISHINGS_STAPLE_BOTTOM_LEFT Staple bottom left corner
IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT Staple bottom right corner
IPP_FINISHINGS_STAPLE_DUAL_BOTTOM Two staples on bottom
IPP_FINISHINGS_STAPLE_DUAL_LEFT Two staples on left
IPP_FINISHINGS_STAPLE_DUAL_RIGHT Two staples on right
IPP_FINISHINGS_STAPLE_DUAL_TOP Two staples on top
IPP_FINISHINGS_STAPLE_TOP_LEFT Staple top left corner
IPP_FINISHINGS_STAPLE_TOP_RIGHT Staple top right corner
IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM Three staples on bottom
IPP_FINISHINGS_STAPLE_TRIPLE_LEFT Three staples on left
IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT Three staples on right
IPP_FINISHINGS_STAPLE_TRIPLE_TOP Three staples on top
IPP_FINISHINGS_TRIM Trim (any type)
IPP_FINISHINGS_TRIM_AFTER_COPIES Trim output after each copy
IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS Trim output after each document
IPP_FINISHINGS_TRIM_AFTER_JOB Trim output after job
IPP_FINISHINGS_TRIM_AFTER_PAGES Trim output after each page

ipp_jstate_e

Job states

Constants

IPP_JSTATE_ABORTED Job has aborted due to error
IPP_JSTATE_CANCELED Job has been canceled
IPP_JSTATE_COMPLETED Job has completed successfully
IPP_JSTATE_HELD Job is held for printing
IPP_JSTATE_PENDING Job is waiting to be printed
IPP_JSTATE_PROCESSING Job is currently printing
IPP_JSTATE_STOPPED Job has been stopped

ipp_op_e

IPP operations

Constants

IPP_OP_ALLOCATE_PRINTER_RESOURCES Allocate-Printer-Resources: Use resources for a printer.
IPP_OP_CANCEL_CURRENT_JOB Cancel-Current-Job: Cancel the current job
IPP_OP_CANCEL_JOB Cancel-Job: Cancel a job
IPP_OP_CANCEL_JOBS Cancel-Jobs: Cancel all jobs (administrative)
IPP_OP_CANCEL_MY_JOBS Cancel-My-Jobs: Cancel a user's jobs
IPP_OP_CANCEL_RESOURCE Cancel-Resource: Uninstall a resource.
IPP_OP_CANCEL_SUBSCRIPTION  CUPS 1.2/macOS 10.5  Cancel-Subscription: Cancel a subscription
IPP_OP_CLOSE_JOB Close-Job: Close a job and start printing
IPP_OP_CREATE_JOB Create-Job: Create an empty print job
IPP_OP_CREATE_JOB_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Create-Job-Subscriptions: Create one of more job subscriptions
IPP_OP_CREATE_PRINTER Create-Printer: Create a new service.
IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Create-Printer-Subscriptions: Create one or more printer subscriptions
IPP_OP_CREATE_RESOURCE Create-Resource: Create a new (empty) resource.
IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS Create-Resource-Subscriptions: Create event subscriptions for a resource.
IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS Create-System-Subscriptions: Create event subscriptions for a system.
IPP_OP_CUPS_ADD_MODIFY_CLASS CUPS-Add-Modify-Class: Add or modify a class
IPP_OP_CUPS_ADD_MODIFY_PRINTER CUPS-Add-Modify-Printer: Add or modify a printer
IPP_OP_CUPS_AUTHENTICATE_JOB  CUPS 1.2/macOS 10.5  CUPS-Authenticate-Job: Authenticate a job
IPP_OP_CUPS_CREATE_LOCAL_PRINTER  CUPS 2.2  CUPS-Create-Local-Printer: Create a local (temporary) printer
IPP_OP_CUPS_DELETE_CLASS CUPS-Delete-Class: Delete a class
IPP_OP_CUPS_DELETE_PRINTER CUPS-Delete-Printer: Delete a printer
IPP_OP_CUPS_GET_DEFAULT CUPS-Get-Default: Get the default printer
IPP_OP_CUPS_GET_DEVICES  DEPRECATED  CUPS-Get-Devices: Get a list of supported devices
IPP_OP_CUPS_GET_DOCUMENT  CUPS 1.4/macOS 10.6  CUPS-Get-Document: Get a document file
IPP_OP_CUPS_GET_PPD  DEPRECATED  CUPS-Get-PPD: Get a PPD file
IPP_OP_CUPS_GET_PPDS  DEPRECATED  CUPS-Get-PPDs: Get a list of supported drivers
IPP_OP_CUPS_GET_PRINTERS CUPS-Get-Printers: Get a list of printers and/or classes
IPP_OP_CUPS_INVALID Invalid operation name for ippOpValue
IPP_OP_CUPS_MOVE_JOB CUPS-Move-Job: Move a job to a different printer
IPP_OP_CUPS_SET_DEFAULT CUPS-Set-Default: Set the default printer
IPP_OP_DEALLOCATE_PRINTER_RESOURCES Deallocate-Printer-Resources: Stop using resources for a printer.
IPP_OP_DELETE_PRINTER Delete-Printer: Delete an existing service.
IPP_OP_DISABLE_ALL_PRINTERS Disable-All-Printers: Stop accepting new jobs on all services.
IPP_OP_DISABLE_PRINTER Disable-Printer: Reject new jobs for a printer
IPP_OP_ENABLE_ALL_PRINTERS Enable-All-Printers: Start accepting new jobs on all services.
IPP_OP_ENABLE_PRINTER Enable-Printer: Accept new jobs for a printer
IPP_OP_GET_JOBS Get-Jobs: Get a list of jobs
IPP_OP_GET_JOB_ATTRIBUTES Get-Job-Attribute: Get information about a job
IPP_OP_GET_NOTIFICATIONS  CUPS 1.2/macOS 10.5  Get-Notifications: Get notification events
IPP_OP_GET_PRINTERS Get-Printers: Get a list of services.
IPP_OP_GET_PRINTER_ATTRIBUTES Get-Printer-Attributes: Get information about a printer
IPP_OP_GET_PRINTER_SUPPORTED_VALUES Get-Printer-Supported-Values: Get supported values
IPP_OP_GET_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Get-Subscriptions: Get list of subscriptions
IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES  CUPS 1.2/macOS 10.5  Get-Subscription-Attributes: Get subscription information
IPP_OP_GET_SYSTEM_ATTRIBUTES Get-System-Attributes: Get system object attributes.
IPP_OP_GET_SYSTEM_SUPPORTED_VALUES Get-System-Supported-Values: Get supported values for system object attributes.
IPP_OP_HOLD_JOB Hold-Job: Hold a job for printing
IPP_OP_HOLD_NEW_JOBS Hold-New-Jobs: Hold new jobs
IPP_OP_IDENTIFY_PRINTER Identify-Printer: Make the printer beep, flash, or display a message for identification
IPP_OP_INSTALL_RESOURCE Install-Resource: Install a resource.
IPP_OP_PAUSE_ALL_PRINTERS Pause-All-Printers: Stop all services immediately.
IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs.
IPP_OP_PAUSE_PRINTER Pause-Printer: Stop a printer
IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB Pause-Printer-After-Current-Job: Stop printer after the current job
IPP_OP_PRINT_JOB Print-Job: Print a single file
IPP_OP_PROMOTE_JOB Promote-Job: Promote a job to print sooner
IPP_OP_REGISTER_OUTPUT_DEVICE Register-Output-Device: Register a remote service.
IPP_OP_RELEASE_HELD_NEW_JOBS Release-Held-New-Jobs: Release new jobs that were previously held
IPP_OP_RELEASE_JOB Release-Job: Release a job for printing
IPP_OP_RENEW_SUBSCRIPTION  CUPS 1.2/macOS 10.5  Renew-Subscription: Renew a printer subscription
IPP_OP_RESTART_JOB  DEPRECATED  Restart-Job: Reprint a job
IPP_OP_RESTART_SYSTEM Restart-System: Restart all services.
IPP_OP_RESUME_ALL_PRINTERS Resume-All-Printers: Start job processing on all services.
IPP_OP_RESUME_JOB Resume-Job: Resume the current job
IPP_OP_RESUME_PRINTER Resume-Printer: Start a printer
IPP_OP_SCHEDULE_JOB_AFTER Schedule-Job-After: Schedule a job to print after another
IPP_OP_SEND_DOCUMENT Send-Document: Add a file to a job
IPP_OP_SEND_RESOURCE_DATA Send-Resource-Data: Upload the data for a resource.
IPP_OP_SET_JOB_ATTRIBUTES Set-Job-Attributes: Set job values
IPP_OP_SET_PRINTER_ATTRIBUTES Set-Printer-Attributes: Set printer values
IPP_OP_SET_RESOURCE_ATTRIBUTES Set-Resource-Attributes: Set resource object attributes.
IPP_OP_SET_SYSTEM_ATTRIBUTES Set-System-Attributes: Set system object attributes.
IPP_OP_SHUTDOWN_ALL_PRINTERS Shutdown-All-Printers: Shutdown all services.
IPP_OP_SHUTDOWN_ONE_PRINTER Shutdown-One-Printer: Shutdown a service.
IPP_OP_STARTUP_ALL_PRINTERS Startup-All-Printers: Startup all services.
IPP_OP_STARTUP_ONE_PRINTER Startup-One-Printer: Start a service.
IPP_OP_SUSPEND_CURRENT_JOB Suspend-Current-Job: Suspend the current job
IPP_OP_VALIDATE_JOB Validate-Job: Validate job values prior to submission

ipp_orient_e

Orientation values

Constants

IPP_ORIENT_LANDSCAPE 90 degrees counter-clockwise
IPP_ORIENT_NONE No rotation
IPP_ORIENT_PORTRAIT No rotation
IPP_ORIENT_REVERSE_LANDSCAPE 90 degrees clockwise
IPP_ORIENT_REVERSE_PORTRAIT 180 degrees

ipp_pstate_e

Printer state values

Constants

IPP_PSTATE_IDLE Printer is idle
IPP_PSTATE_PROCESSING Printer is working
IPP_PSTATE_STOPPED Printer is stopped

ipp_quality_e

Print quality values

Constants

IPP_QUALITY_DRAFT Draft quality
IPP_QUALITY_HIGH High quality
IPP_QUALITY_NORMAL Normal quality

ipp_res_e

Resolution units

Constants

IPP_RES_PER_CM Pixels per centimeter
IPP_RES_PER_INCH Pixels per inch

ipp_rstate_e

resource-state values

Constants

IPP_RSTATE_ABORTED Resource has been aborted and is pending deletion.
IPP_RSTATE_AVAILABLE Resource is available for installation.
IPP_RSTATE_CANCELED Resource has been canceled and is pending deletion.
IPP_RSTATE_INSTALLED Resource is installed.
IPP_RSTATE_PENDING Resource is created but has no data yet.

ipp_sstate_e

system-state values

Constants

IPP_SSTATE_IDLE At least one printer is idle and none are processing a job.
IPP_SSTATE_PROCESSING At least one printer is processing a job.
IPP_SSTATE_STOPPED All printers are stopped.

ipp_state_e

ipp_t state values

Constants

IPP_STATE_ATTRIBUTE One or more attributes need to be sent/received
IPP_STATE_DATA IPP request data needs to be sent/received
IPP_STATE_ERROR An error occurred
IPP_STATE_HEADER The request header needs to be sent/received
IPP_STATE_IDLE Nothing is happening/request completed

ipp_status_e

IPP status code values

Constants

IPP_STATUS_CUPS_INVALID Invalid status name for ippErrorValue
IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED client-error-account-authorization-failed
IPP_STATUS_ERROR_ACCOUNT_CLOSED client-error-account-closed
IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED client-error-account-info-needed
IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED client-error-account-limit-reached
IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE client-error-attributes-not-settable
IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES client-error-attributes-or-values-not-supported
IPP_STATUS_ERROR_BAD_REQUEST client-error-bad-request
IPP_STATUS_ERROR_BUSY server-error-busy
IPP_STATUS_ERROR_CHARSET client-error-charset-not-supported
IPP_STATUS_ERROR_COMPRESSION_ERROR client-error-compression-error
IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED client-error-compression-not-supported
IPP_STATUS_ERROR_CONFLICTING client-error-conflicting-attributes
IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED  DEPRECATED  cups-error-account-authorization-failed
IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED cups-error-account-closed @deprecate@
IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED  DEPRECATED  cups-error-account-info-needed
IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED  DEPRECATED  cups-error-account-limit-reached
IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED  CUPS 1.5/macOS 10.7  cups-authentication-canceled - Authentication canceled by user
IPP_STATUS_ERROR_CUPS_PKI  CUPS 1.5/macOS 10.7  cups-pki-error - Error negotiating a secure connection
IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED  CUPS 1.5/macOS 10.7  cups-upgrade-required - TLS upgrade required
IPP_STATUS_ERROR_DEVICE server-error-device-error
IPP_STATUS_ERROR_DOCUMENT_ACCESS client-error-document-access-error
IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR client-error-document-format-error
IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED client-error-document-format-not-supported
IPP_STATUS_ERROR_DOCUMENT_PASSWORD client-error-document-password-error
IPP_STATUS_ERROR_DOCUMENT_PERMISSION client-error-document-permission-error
IPP_STATUS_ERROR_DOCUMENT_SECURITY client-error-document-security-error
IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE client-error-document-unprintable-error
IPP_STATUS_ERROR_FORBIDDEN client-error-forbidden
IPP_STATUS_ERROR_GONE client-error-gone
IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS client-error-ignored-all-subscriptions
IPP_STATUS_ERROR_INTERNAL server-error-internal-error
IPP_STATUS_ERROR_JOB_CANCELED server-error-job-canceled
IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED server-error-multiple-document-jobs-not-supported
IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS server-error-not-accepting-jobs
IPP_STATUS_ERROR_NOT_AUTHENTICATED client-error-not-authenticated
IPP_STATUS_ERROR_NOT_AUTHORIZED client-error-not-authorized
IPP_STATUS_ERROR_NOT_FETCHABLE client-error-not-fetchable
IPP_STATUS_ERROR_NOT_FOUND client-error-not-found
IPP_STATUS_ERROR_NOT_POSSIBLE client-error-not-possible
IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED server-error-operation-not-supported
IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED server-error-printer-is-deactivated
IPP_STATUS_ERROR_REQUEST_ENTITY client-error-request-entity-too-large
IPP_STATUS_ERROR_REQUEST_VALUE client-error-request-value-too-long
IPP_STATUS_ERROR_SERVICE_UNAVAILABLE server-error-service-unavailable
IPP_STATUS_ERROR_TEMPORARY server-error-temporary-error
IPP_STATUS_ERROR_TIMEOUT client-error-timeout
IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS server-error-too-many-documents
IPP_STATUS_ERROR_TOO_MANY_JOBS server-error-too-many-jobs
IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS client-error-too-many-subscriptions
IPP_STATUS_ERROR_URI_SCHEME client-error-uri-scheme-not-supported
IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED server-error-version-not-supported
IPP_STATUS_OK successful-ok
IPP_STATUS_OK_CONFLICTING successful-ok-conflicting-attributes
IPP_STATUS_OK_EVENTS_COMPLETE successful-ok-events-complete
IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED successful-ok-ignored-or-substituted-attributes
IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS successful-ok-ignored-subscriptions
IPP_STATUS_OK_TOO_MANY_EVENTS successful-ok-too-many-events

ipp_tag_e

Value and group tag values for attributes

Constants

IPP_TAG_ADMINDEFINE Admin-defined value
IPP_TAG_BOOLEAN Boolean value
IPP_TAG_CHARSET Character set value
IPP_TAG_CUPS_INVALID Invalid tag name for ippTagValue
IPP_TAG_DATE Date/time value
IPP_TAG_DEFAULT Default value
IPP_TAG_DELETEATTR Delete-attribute value
IPP_TAG_DOCUMENT Document group
IPP_TAG_END End-of-attributes
IPP_TAG_ENUM Enumeration value
IPP_TAG_EVENT_NOTIFICATION Event group
IPP_TAG_INTEGER Integer value
IPP_TAG_JOB Job group
IPP_TAG_KEYWORD Keyword value
IPP_TAG_LANGUAGE Language value
IPP_TAG_MIMETYPE MIME media type value
IPP_TAG_NAME Name value
IPP_TAG_NAMELANG Name-with-language value
IPP_TAG_NOTSETTABLE Not-settable value
IPP_TAG_NOVALUE No-value value
IPP_TAG_OPERATION Operation group
IPP_TAG_PRINTER Printer group
IPP_TAG_RANGE Range value
IPP_TAG_RESOLUTION Resolution value
IPP_TAG_RESOURCE Resource group
IPP_TAG_STRING Octet string value
IPP_TAG_SUBSCRIPTION Subscription group
IPP_TAG_SYSTEM System group
IPP_TAG_TEXT Text value
IPP_TAG_TEXTLANG Text-with-language value
IPP_TAG_UNKNOWN Unknown value
IPP_TAG_UNSUPPORTED_GROUP Unsupported attributes group
IPP_TAG_UNSUPPORTED_VALUE Unsupported value
IPP_TAG_URI URI value
IPP_TAG_URISCHEME URI scheme value
IPP_TAG_ZERO Zero tag - used for separators
cups-2.3.1/doc/help/api-ppd.html000664 000765 000024 00000270334 13574721672 016525 0ustar00mikestaff000000 000000 PPD API (DEPRECATED)

PPD API (DEPRECATED)

Note:

The PPD API was deprecated in CUPS 1.6/macOS 10.8. Please use the new Job Ticket APIs in the CUPS Programming Manual documentation. These functions will be removed in a future release of CUPS.

Header cups/ppd.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS Programming Manual
Specifications: CUPS PPD Extensions

Overview

Note:

The PPD API was deprecated in CUPS 1.6/macOS 10.8. Please use the new Job Ticket APIs in the CUPS Programming Manual documentation. These functions will be removed in a future release of CUPS.

The CUPS PPD API provides read-only access the data in PostScript Printer Description ("PPD") files which are used for all printers with a driver. With it you can obtain the data necessary to display printer options to users, mark option choices and check for conflicting choices, and output marked choices in PostScript output. The ppd_file_t structure contains all of the information in a PPD file.

Note:

The CUPS PPD API uses the terms "option" and "choice" instead of the Adobe terms "MainKeyword" and "OptionKeyword" to refer to specific printer options and features. CUPS also treats option ("MainKeyword") and choice ("OptionKeyword") values as case-insensitive strings, so option "InputSlot" and choice "Upper" are equivalent to "inputslot" and "upper", respectively.

Loading a PPD File

The ppdOpenFile function "opens" a PPD file and loads it into memory. For example, the following code opens the current printer's PPD file in a CUPS filter:

#include <cups/ppd.h>

ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));

The return value is a pointer to a new ppd_file_t structure or NULL if the PPD file does not exist or cannot be loaded. The ppdClose function frees the memory used by the structure:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdClose(ppd);

Once closed, pointers to the ppd_file_t structure and any data in it will no longer be valid.

Options and Groups

PPD files support multiple options, which are stored in arrays of ppd_option_t and ppd_choice_t structures.

Each option in turn is associated with a group stored in a ppd_group_t structure. Groups can be specified in the PPD file; if an option is not associated with a group then it is put in an automatically-generated "General" group. Groups can also have sub-groups, however CUPS currently ignores sub-groups because of past abuses of this functionality.

Option choices are selected by marking them using one of three functions. The first is ppdMarkDefaults which selects all of the default options in the PPD file:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdMarkDefaults(ppd);

The second is ppdMarkOption which selects a single option choice in the PPD file. For example, the following code selects the upper paper tray:

#include <cups/ppd.h>

ppd_file_t *ppd;

ppdMarkOption(ppd, "InputSlot", "Upper");

The last function is cupsMarkOptions which selects multiple option choices in the PPD file from an array of CUPS options, mapping IPP attributes like "media" and "sides" to their corresponding PPD options. You typically use this function in a print filter with cupsParseOptions and ppdMarkDefaults to select all of the option choices needed for the job, for example:

#include <cups/ppd.h>

ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
cups_option_t *options = NULL;
int num_options = cupsParseOptions(argv[5], 0, &options);

ppdMarkDefaults(ppd);
cupsMarkOptions(ppd, num_options, options);
cupsFreeOptions(num_options, options);

Constraints

PPD files support specification of conflict conditions, called constraints, between different options. Constraints are stored in an array of ppd_const_t structures which specify the options and choices that conflict with each other. The ppdConflicts function tells you how many of the selected options are incompatible. Since constraints are normally specified in pairs, the returned value is typically an even number.

Page Sizes

Page sizes are special options which have physical dimensions and margins associated with them. The size information is stored in ppd_size_t structures and is available by looking up the named size with the ppdPageSize function. The page size and margins are returned in units called points; there are 72 points per inch. If you pass NULL for the size, the currently selected size is returned:

#include <cups/ppd.h>

ppd_file_t *ppd;
ppd_size_t *size = ppdPageSize(ppd, NULL);

Besides the standard page sizes listed in a PPD file, some printers support variable or custom page sizes. Custom page sizes are supported if the variables_sizes member of the ppd_file_t structure is non-zero. The custom_min, custom_max, and custom_margins members of the ppd_file_t structure define the limits of the printable area. To get the resulting media size, use a page size string of the form "Custom.widthxlength", where "width" and "length" are in points. Custom page size names can also be specified in inches ("Custom.widthxheightin"), centimeters ("Custom.widthxheightcm"), or millimeters ("Custom.widthxheightmm"):

#include <cups/ppd.h>

ppd_file_t *ppd;

/* Get an 576x720 point custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.576x720");

/* Get an 8x10 inch custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.8x10in");

/* Get a 100x200 millimeter custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.100x200mm");

/* Get a 12.7x34.5 centimeter custom page size */
ppd_size_t *size = ppdPageSize(ppd, "Custom.12.7x34.5cm");

If the PPD does not support variable page sizes, the ppdPageSize function will return NULL.

Attributes

Every PPD file is composed of one or more attributes. Most of these attributes are used to define groups, options, choices, and page sizes, however several informational attributes may be present which you can access in your program or filter. Attributes normally look like one of the following examples in a PPD file:

*name: "value"
*name spec: "value"
*name spec/text: "value"

The ppdFindAttr and ppdFindNextAttr functions find the first and next instances, respectively, of the named attribute with the given "spec" string and return a ppd_attr_t structure. If you provide a NULL specifier string, all attributes with the given name will be returned. For example, the following code lists all of the Product attributes in a PPD file:

#include <cups/ppd.h>

ppd_file_t *ppd;
ppd_attr_t *attr;

for (attr = ppdFindAttr(ppd, "Product", NULL);
     attr != NULL;
     attr = ppdFindNextAttr(ppd, "Product", NULL))
  puts(attr->value);

Functions

 CUPS 1.4/macOS 10.6 cupsGetConflicts

Get a list of conflicting options in a marked PPD.

int cupsGetConflicts(ppd_file_t *ppd, const char *option, const char *choice, cups_option_t **options);

Parameters

ppd PPD file
option Option to test
choice Choice to test
options Conflicting options

Return Value

Number of conflicting options

Discussion

This function gets a list of options that would conflict if "option" and "choice" were marked in the PPD. You would typically call this function after marking the currently selected options in the PPD in order to determine whether a new option selection would cause a conflict.

The number of conflicting options are returned with "options" pointing to the conflicting options. The returned option array must be freed using cupsFreeOptions.

cupsGetPPD

Get the PPD file for a printer on the default server.

const char *cupsGetPPD(const char *name);

Parameters

name Destination name

Return Value

Filename for PPD file

Discussion

For classes, cupsGetPPD returns the PPD file for the first printer in the class.

The returned filename is stored in a static buffer and is overwritten with each call to cupsGetPPD or cupsGetPPD2. The caller "owns" the file that is created and must unlink the returned filename.

 CUPS 1.1.21/macOS 10.4 cupsGetPPD2

Get the PPD file for a printer from the specified server.

const char *cupsGetPPD2(http_t *http, const char *name);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
name Destination name

Return Value

Filename for PPD file

Discussion

For classes, cupsGetPPD2 returns the PPD file for the first printer in the class.

The returned filename is stored in a static buffer and is overwritten with each call to cupsGetPPD or cupsGetPPD2. The caller "owns" the file that is created and must unlink the returned filename.

 CUPS 1.4/macOS 10.6 cupsGetPPD3

Get the PPD file for a printer on the specified server if it has changed.

http_status_t cupsGetPPD3(http_t *http, const char *name, time_t *modtime, char *buffer, size_t bufsize);

Parameters

http HTTP connection or CUPS_HTTP_DEFAULT
name Destination name
modtime Modification time
buffer Filename buffer
bufsize Size of filename buffer

Return Value

HTTP status

Discussion

The "modtime" parameter contains the modification time of any locally-cached content and is updated with the time from the PPD file on the server.

The "buffer" parameter contains the local PPD filename. If it contains the empty string, a new temporary file is created, otherwise the existing file will be overwritten as needed. The caller "owns" the file that is created and must unlink the returned filename.

On success, HTTP_STATUS_OK is returned for a new PPD file and HTTP_STATUS_NOT_MODIFIED if the existing PPD file is up-to-date. Any other status is an error.

For classes, cupsGetPPD3 returns the PPD file for the first printer in the class.

 CUPS 1.3/macOS 10.5 cupsGetServerPPD

Get an available PPD file from the server.

char *cupsGetServerPPD(http_t *http, const char *name);

Parameters

http Connection to server or CUPS_HTTP_DEFAULT
name Name of PPD file ("ppd-name")

Return Value

Name of PPD file or NULL on error

Discussion

This function returns the named PPD file from the server. The list of available PPDs is provided by the IPP CUPS_GET_PPDS operation.

You must remove (unlink) the PPD file when you are finished with it. The PPD filename is stored in a static location that will be overwritten on the next call to cupsGetPPD, cupsGetPPD2, or cupsGetServerPPD.

cupsMarkOptions

Mark command-line options in a PPD file.

int cupsMarkOptions(ppd_file_t *ppd, int num_options, cups_option_t *options);

Parameters

ppd PPD file
num_options Number of options
options Options

Return Value

1 if conflicts exist, 0 otherwise

Discussion

This function maps the IPP "finishings", "media", "mirror", "multiple-document-handling", "output-bin", "print-color-mode", "print-quality", "printer-resolution", and "sides" attributes to their corresponding PPD options and choices.

 CUPS 1.2/macOS 10.5 cupsRasterInterpretPPD

Interpret PPD commands to create a page header.

int cupsRasterInterpretPPD(cups_page_header2_t *h, ppd_file_t *ppd, int num_options, cups_option_t *options, cups_interpret_cb_t func);

Parameters

h Page header to create
ppd PPD file
num_options Number of options
options Options
func Optional page header callback (NULL for none)

Return Value

0 on success, -1 on failure

Discussion

This function is used by raster image processing (RIP) filters like cgpdftoraster and imagetoraster when writing CUPS raster data for a page. It is not used by raster printer driver filters which only read CUPS raster data.

cupsRasterInterpretPPD does not mark the options in the PPD using the "num_options" and "options" arguments. Instead, mark the options with cupsMarkOptions and ppdMarkOption prior to calling it - this allows for per-page options without manipulating the options array.

The "func" argument specifies an optional callback function that is called prior to the computation of the final raster data. The function can make changes to the cups_page_header2_t data as needed to use a supported raster format and then returns 0 on success and -1 if the requested attributes cannot be supported.

cupsRasterInterpretPPD supports a subset of the PostScript language. Currently only the [, ], <<, >>, {, }, cleartomark, copy, dup, index, pop, roll, setpagedevice, and stopped operators are supported.

 CUPS 1.4/macOS 10.6 cupsResolveConflicts

Resolve conflicts in a marked PPD.

int cupsResolveConflicts(ppd_file_t *ppd, const char *option, const char *choice, int *num_options, cups_option_t **options);

Parameters

ppd PPD file
option Newly selected option or NULL for none
choice Newly selected choice or NULL for none
num_options Number of additional selected options
options Additional selected options

Return Value

1 on success, 0 on failure

Discussion

This function attempts to resolve any conflicts in a marked PPD, returning a list of option changes that are required to resolve them. On input, "num_options" and "options" contain any pending option changes that have not yet been marked, while "option" and "choice" contain the most recent selection which may or may not be in "num_options" or "options".

On successful return, "num_options" and "options" are updated to contain "option" and "choice" along with any changes required to resolve conflicts specified in the PPD file and 1 is returned.

If option conflicts cannot be resolved, "num_options" and "options" are not changed and 0 is returned.

When resolving conflicts, cupsResolveConflicts does not consider changes to the current page size (media, PageSize, and PageRegion) or to the most recent option specified in "option". Thus, if the only way to resolve a conflict is to change the page size or the option the user most recently changed, cupsResolveConflicts will return 0 to indicate it was unable to resolve the conflicts.

The cupsResolveConflicts function uses one of two sources of option constraint information. The preferred constraint information is defined by cupsUIConstraints and cupsUIResolver attributes - in this case, the PPD file provides constraint resolution actions.

The backup constraint information is defined by the UIConstraints and NonUIConstraints attributes. These constraints are resolved algorithmically by first selecting the default choice for the conflicting option, then iterating over all possible choices until a non-conflicting option choice is found.

ppdCollect

Collect all marked options that reside in the specified section.

int ppdCollect(ppd_file_t *ppd, ppd_section_t section, ppd_choice_t ***choices);

Parameters

ppd PPD file data
section Section to collect
choices Pointers to choices

Return Value

Number of options marked

Discussion

The choices array should be freed using free when you are finished with it.

 CUPS 1.2/macOS 10.5 ppdCollect2

Collect all marked options that reside in the specified section and minimum order.

int ppdCollect2(ppd_file_t *ppd, ppd_section_t section, float min_order, ppd_choice_t ***choices);

Parameters

ppd PPD file data
section Section to collect
min_order Minimum OrderDependency value
choices Pointers to choices

Return Value

Number of options marked

Discussion

The choices array should be freed using free when you are finished with it.

ppdConflicts

Check to see if there are any conflicts among the marked option choices.

int ppdConflicts(ppd_file_t *ppd);

Parameters

ppd PPD to check

Return Value

Number of conflicts found

Discussion

The returned value is the same as returned by ppdMarkOption.

ppdEmit

Emit code for marked options to a file.

int ppdEmit(ppd_file_t *ppd, FILE *fp, ppd_section_t section);

Parameters

ppd PPD file record
fp File to write to
section Section to write

Return Value

0 on success, -1 on failure

 CUPS 1.2/macOS 10.5 ppdEmitAfterOrder

Emit a subset of the code for marked options to a file.

int ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp, ppd_section_t section, int limit, float min_order);

Parameters

ppd PPD file record
fp File to write to
section Section to write
limit Non-zero to use min_order
min_order Lowest OrderDependency

Return Value

0 on success, -1 on failure

Discussion

When "limit" is non-zero, this function only emits options whose OrderDependency value is greater than or equal to "min_order".

When "limit" is zero, this function is identical to ppdEmit().

ppdEmitFd

Emit code for marked options to a file.

int ppdEmitFd(ppd_file_t *ppd, int fd, ppd_section_t section);

Parameters

ppd PPD file record
fd File to write to
section Section to write

Return Value

0 on success, -1 on failure

ppdEmitJCL

Emit code for JCL options to a file.

int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id, const char *user, const char *title);

Parameters

ppd PPD file record
fp File to write to
job_id Job ID
user Username
title Title

Return Value

0 on success, -1 on failure

 CUPS 1.2/macOS 10.5 ppdEmitJCLEnd

Emit JCLEnd code to a file.

int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp);

Parameters

ppd PPD file record
fp File to write to

Return Value

0 on success, -1 on failure

 CUPS 1.2/macOS 10.5 ppdEmitString

Get a string containing the code for marked options.

char *ppdEmitString(ppd_file_t *ppd, ppd_section_t section, float min_order);

Parameters

ppd PPD file record
section Section to write
min_order Lowest OrderDependency

Return Value

String containing option code or NULL if there is no option code

Discussion

When "min_order" is greater than zero, this function only includes options whose OrderDependency value is greater than or equal to "min_order". Otherwise, all options in the specified section are included in the returned string.

The return string is allocated on the heap and should be freed using free when you are done with it.

 CUPS 1.1.19/macOS 10.3 ppdFindAttr

Find the first matching attribute.

ppd_attr_t *ppdFindAttr(ppd_file_t *ppd, const char *name, const char *spec);

Parameters

ppd PPD file data
name Attribute name
spec Specifier string or NULL

Return Value

Attribute or NULL if not found

ppdFindChoice

Return a pointer to an option choice.

ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *choice);

Parameters

o Pointer to option
choice Name of choice

Return Value

Choice pointer or NULL

 CUPS 1.2/macOS 10.5 ppdFindCustomOption

Find a custom option.

ppd_coption_t *ppdFindCustomOption(ppd_file_t *ppd, const char *keyword);

Parameters

ppd PPD file
keyword Custom option name

Return Value

Custom option or NULL

 CUPS 1.2/macOS 10.5 ppdFindCustomParam

Find a parameter for a custom option.

ppd_cparam_t *ppdFindCustomParam(ppd_coption_t *opt, const char *name);

Parameters

opt Custom option
name Parameter name

Return Value

Custom parameter or NULL

ppdFindMarkedChoice

Return the marked choice for the specified option.

ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *option);

Parameters

ppd PPD file
option Keyword/option name

Return Value

Pointer to choice or NULL

 CUPS 1.1.19/macOS 10.3 ppdFindNextAttr

Find the next matching attribute.

ppd_attr_t *ppdFindNextAttr(ppd_file_t *ppd, const char *name, const char *spec);

Parameters

ppd PPD file data
name Attribute name
spec Specifier string or NULL

Return Value

Attribute or NULL if not found

ppdFindOption

Return a pointer to the specified option.

ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *option);

Parameters

ppd PPD file data
option Option/Keyword name

Return Value

Pointer to option or NULL

 CUPS 1.2/macOS 10.5 ppdFirstCustomParam

Return the first parameter for a custom option.

ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt);

Parameters

opt Custom option

Return Value

Custom parameter or NULL

 CUPS 1.2/macOS 10.5 ppdFirstOption

Return the first option in the PPD file.

ppd_option_t *ppdFirstOption(ppd_file_t *ppd);

Parameters

ppd PPD file

Return Value

First option or NULL

Discussion

Options are returned from all groups in ascending alphanumeric order.

 CUPS 1.4/macOS 10.6 ppdInstallableConflict

Test whether an option choice conflicts with an installable option.

int ppdInstallableConflict(ppd_file_t *ppd, const char *option, const char *choice);

Parameters

ppd PPD file
option Option
choice Choice

Return Value

1 if conflicting, 0 if not conflicting

Discussion

This function tests whether a particular option choice is available based on constraints against options in the "InstallableOptions" group.

ppdIsMarked

Check to see if an option is marked.

int ppdIsMarked(ppd_file_t *ppd, const char *option, const char *choice);

Parameters

ppd PPD file data
option Option/Keyword name
choice Choice name

Return Value

Non-zero if option is marked

 CUPS 1.2/macOS 10.5 ppdLocalize

Localize the PPD file to the current locale.

int ppdLocalize(ppd_file_t *ppd);

Parameters

ppd PPD file

Return Value

0 on success, -1 on error

Discussion

All groups, options, and choices are localized, as are ICC profile descriptions, printer presets, and custom option parameters. Each localized string uses the UTF-8 character encoding.

ppdLocalizeAttr

Localize an attribute.

ppd_attr_t *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword, const char *spec);

Parameters

ppd PPD file
keyword Main keyword
spec Option keyword or NULL for none

Return Value

Localized attribute or NULL if none exists

Discussion

This function uses the current locale to find the localized attribute for the given main and option keywords. If no localized version of the attribute exists for the current locale, the unlocalized version is returned.

 CUPS 1.3/macOS 10.5 ppdLocalizeIPPReason

Get the localized version of a cupsIPPReason attribute.

const char *ppdLocalizeIPPReason(ppd_file_t *ppd, const char *reason, const char *scheme, char *buffer, size_t bufsize);

Parameters

ppd PPD file
reason IPP reason keyword to look up
scheme URI scheme or NULL for text
buffer Value buffer
bufsize Size of value buffer

Return Value

Value or NULL if not found

Discussion

This function uses the current locale to find the corresponding reason text or URI from the attribute value. If "scheme" is NULL or "text", the returned value contains human-readable (UTF-8) text from the translation string or attribute value. Otherwise the corresponding URI is returned.

If no value of the requested scheme can be found, NULL is returned.

 CUPS 1.4/macOS 10.6 ppdLocalizeMarkerName

Get the localized version of a marker-names attribute value.

const char *ppdLocalizeMarkerName(ppd_file_t *ppd, const char *name);

Parameters

ppd PPD file
name Marker name to look up

Return Value

Value or NULL if not found

Discussion

This function uses the current locale to find the corresponding name text from the attribute value. If no localized text for the requested name can be found, NULL is returned.

ppdMarkDefaults

Mark all default options in the PPD file.

void ppdMarkDefaults(ppd_file_t *ppd);

Parameters

ppd PPD file record

ppdMarkOption

Mark an option in a PPD file and return the number of conflicts.

int ppdMarkOption(ppd_file_t *ppd, const char *option, const char *choice);

Parameters

ppd PPD file record
option Keyword
choice Option name

Return Value

Number of conflicts

 CUPS 1.2/macOS 10.5 ppdNextCustomParam

Return the next parameter for a custom option.

ppd_cparam_t *ppdNextCustomParam(ppd_coption_t *opt);

Parameters

opt Custom option

Return Value

Custom parameter or NULL

 CUPS 1.2/macOS 10.5 ppdNextOption

Return the next option in the PPD file.

ppd_option_t *ppdNextOption(ppd_file_t *ppd);

Parameters

ppd PPD file

Return Value

Next option or NULL

Discussion

Options are returned from all groups in ascending alphanumeric order.

ppdPageLength

Get the page length for the given size.

float ppdPageLength(ppd_file_t *ppd, const char *name);

Parameters

ppd PPD file
name Size name

Return Value

Length of page in points or 0.0

ppdPageSize

Get the page size record for the named size.

ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name);

Parameters

ppd PPD file record
name Size name

Return Value

Size record for page or NULL

 CUPS 1.4/macOS 10.6 ppdPageSizeLimits

Return the custom page size limits.

int ppdPageSizeLimits(ppd_file_t *ppd, ppd_size_t *minimum, ppd_size_t *maximum);

Parameters

ppd PPD file record
minimum Minimum custom size
maximum Maximum custom size

Return Value

1 if custom sizes are supported, 0 otherwise

Discussion

This function returns the minimum and maximum custom page sizes and printable areas based on the currently-marked (selected) options.

If the specified PPD file does not support custom page sizes, both "minimum" and "maximum" are filled with zeroes.

ppdPageWidth

Get the page width for the given size.

float ppdPageWidth(ppd_file_t *ppd, const char *name);

Parameters

ppd PPD file record
name Size name

Return Value

Width of page in points or 0.0

Data Types

cups_interpret_cb_t

cupsRasterInterpretPPD callback function

typedef int (*cups_interpret_cb_t)(cups_page_header2_t *header, int preferred_bits);

 DEPRECATED ppd_attr_t

PPD Attribute Structure

typedef struct ppd_attr_s ppd_attr_t;

 DEPRECATED ppd_choice_t

Option choices

typedef struct ppd_choice_s ppd_choice_t;

 DEPRECATED ppd_conform_t

Conformance Levels

typedef enum ppd_conform_e ppd_conform_t;

 DEPRECATED ppd_const_t

Constraints

typedef struct ppd_const_s ppd_const_t;

 DEPRECATED ppd_coption_t

Custom Option

typedef struct ppd_coption_s ppd_coption_t;

 DEPRECATED ppd_cparam_t

Custom Parameter

typedef struct ppd_cparam_s ppd_cparam_t;

 DEPRECATED ppd_cplimit_t

Custom Parameter Limit

typedef union ppd_cplimit_u ppd_cplimit_t;

 DEPRECATED ppd_cptype_t

Custom Parameter Type

typedef enum ppd_cptype_e ppd_cptype_t;

 DEPRECATED ppd_cpvalue_t

Custom Parameter Value

typedef union ppd_cpvalue_u ppd_cpvalue_t;

 DEPRECATED ppd_cs_t

Colorspaces

typedef enum ppd_cs_e ppd_cs_t;

 DEPRECATED ppd_emul_t

Emulators

typedef struct ppd_emul_s ppd_emul_t;

 DEPRECATED ppd_file_t

PPD File

typedef struct ppd_file_s ppd_file_t;

 DEPRECATED ppd_group_t

Groups

typedef struct ppd_group_s ppd_group_t;

 DEPRECATED ppd_option_t

Options

typedef struct ppd_option_s ppd_option_t;

 DEPRECATED ppd_profile_t

sRGB Color Profiles

typedef struct ppd_profile_s ppd_profile_t;

 DEPRECATED ppd_section_t

Order dependency sections

typedef enum ppd_section_e ppd_section_t;

 DEPRECATED ppd_size_t

Page Sizes

typedef struct ppd_size_s ppd_size_t;

 DEPRECATED ppd_status_t

Status Codes

typedef enum ppd_status_e ppd_status_t;

 DEPRECATED ppd_ui_t

UI Types

typedef enum ppd_ui_e ppd_ui_t;

Structures

 DEPRECATED ppd_attr_s

PPD Attribute Structure

struct ppd_attr_s {
    char name[PPD_MAX_NAME];
    char spec[PPD_MAX_NAME];
    char text[PPD_MAX_TEXT];
    char *value;
};

Members

name[PPD_MAX_NAME] Name of attribute (cupsXYZ)
spec[PPD_MAX_NAME] Specifier string, if any
text[PPD_MAX_TEXT] Human-readable text, if any
value Value string

 DEPRECATED ppd_choice_s

Option choices

struct ppd_choice_s {
    char choice[PPD_MAX_NAME];
    char *code;
    char marked;
    ppd_option_t *option;
    char text[PPD_MAX_TEXT];
};

Members

choice[PPD_MAX_NAME] Computer-readable option name
code Code to send for this option
marked 0 if not selected, 1 otherwise
option Pointer to parent option structure
text[PPD_MAX_TEXT] Human-readable option name

 DEPRECATED ppd_const_s

Constraints

struct ppd_const_s {
    char choice1[PPD_MAX_NAME];
    char choice2[PPD_MAX_NAME];
    char option1[PPD_MAX_NAME];
    char option2[PPD_MAX_NAME];
};

Members

choice1[PPD_MAX_NAME] First option/choice (blank for all)
choice2[PPD_MAX_NAME] Second option/choice (blank for all)
option1[PPD_MAX_NAME] First keyword
option2[PPD_MAX_NAME] Second keyword

 DEPRECATED ppd_coption_s

Custom Option

struct ppd_coption_s {
    char keyword[PPD_MAX_NAME];
    int marked;
    ppd_option_t *option;
    cups_array_t *params;
};

Members

keyword[PPD_MAX_NAME] Name of option that is being extended...
marked Extended option is marked
option Option that is being extended...
params Parameters

 DEPRECATED ppd_cparam_s

Custom Parameter

struct ppd_cparam_s {
    ppd_cpvalue_t current;
    ppd_cplimit_t minimum, maximum;
    char name[PPD_MAX_NAME];
    int order;
    char text[PPD_MAX_TEXT];
    ppd_cptype_t type;
};

Members

current Current value
maximum Maximum value
name[PPD_MAX_NAME] Parameter name
order Order (0 to N)
text[PPD_MAX_TEXT] Human-readable text
type Parameter type

 DEPRECATED ppd_emul_s

Emulators

struct ppd_emul_s {
    char name[PPD_MAX_NAME];
    char *start;
    char *stop;
};

Members

name[PPD_MAX_NAME] Emulator name
start Code to switch to this emulation
stop Code to stop this emulation

 DEPRECATED ppd_file_s

PPD File

struct ppd_file_s {
    int accurate_screens;
    int color_device;
    ppd_cs_t colorspace;
    ppd_const_t *consts;
    int contone_only;
    float custom_margins[4];
    float custom_max[2];
    float custom_min[2];
    char **filters;
    int flip_duplex;
    char **fonts;
    ppd_group_t *groups;
    char *jcl_begin;
    char *jcl_end;
    char *jcl_ps;
    int landscape;
    char *lang_encoding;
    char *lang_version;
    int language_level;
    int manual_copies;
    char *manufacturer;
    int model_number;
    char *modelname;
    char *nickname;
    int num_consts;
    int num_filters;
    int num_fonts;
    int num_groups;
    int num_profiles;
    int num_sizes;
    char *patches;
    char *pcfilename;
    char *product;
    ppd_profile_t *profiles;
    char *protocols;
    char *shortnickname;
    ppd_size_t *sizes;
    int throughput;
    char *ttrasterizer;
    int variable_sizes;
};

Members

accurate_screens 1 = supports accurate screens, 0 = not
color_device 1 = color device, 0 = grayscale
colorspace Default colorspace
consts UI/Non-UI constraints
contone_only 1 = continuous tone only, 0 = not
custom_margins[4] Margins around page
custom_max[2] Maximum variable page size
custom_min[2] Minimum variable page size
filters Filter strings...
flip_duplex  DEPRECATED  1 = Flip page for back sides
fonts Pre-loaded fonts
groups UI groups
jcl_begin Start JCL commands
jcl_end End JCL commands
jcl_ps Enter PostScript interpreter
landscape -90 or 90
lang_encoding Language encoding
lang_version Language version (English, Spanish, etc.)
language_level Language level of device
manual_copies 1 = Copies done manually, 0 = hardware
manufacturer Manufacturer name
model_number Device-specific model number
modelname Model name (general)
nickname Nickname (specific)
num_consts Number of UI/Non-UI constraints
num_filters Number of filters
num_fonts Number of pre-loaded fonts
num_groups Number of UI groups
num_profiles  DEPRECATED  Number of sRGB color profiles
num_sizes Number of page sizes
patches Patch commands to be sent to printer
pcfilename  CUPS 1.1.19/macOS 10.3  PCFileName string
product Product name (from PS RIP/interpreter)
profiles  DEPRECATED  sRGB color profiles
protocols  CUPS 1.1.19/macOS 10.3  Protocols (BCP, TBCP) string
shortnickname Short version of nickname
sizes Page sizes
throughput Pages per minute
ttrasterizer Truetype rasterizer
variable_sizes 1 = supports variable sizes, 0 = doesn't

 DEPRECATED ppd_group_s

Groups

struct ppd_group_s {
    char text[PPD_MAX_TEXT - PPD_MAX_NAME];
    char name[PPD_MAX_NAME];
    int num_options;
    int num_subgroups;
    ppd_option_t *options;
    struct ppd_group_s *subgroups;
};

Members

PPD_MAX_NAME] Human-readable group name
name[PPD_MAX_NAME]  CUPS 1.1.18/macOS 10.3  Group name
num_options Number of options
num_subgroups Number of sub-groups
options Options
subgroups Sub-groups (max depth = 1)

 DEPRECATED ppd_option_s

Options

struct ppd_option_s {
    ppd_choice_t *choices;
    char conflicted;
    char defchoice[PPD_MAX_NAME];
    char keyword[PPD_MAX_NAME];
    int num_choices;
    float order;
    ppd_section_t section;
    char text[PPD_MAX_TEXT];
    ppd_ui_t ui;
};

Members

choices Option choices
conflicted 0 if no conflicts exist, 1 otherwise
defchoice[PPD_MAX_NAME] Default option choice
keyword[PPD_MAX_NAME] Option keyword name ("PageSize", etc.)
num_choices Number of option choices
order Order number
section Section for command
text[PPD_MAX_TEXT] Human-readable text
ui Type of UI option

 DEPRECATED ppd_profile_s

sRGB Color Profiles

struct ppd_profile_s {
    float density;
    float gamma;
    float matrix[3][3];
    char media_type[PPD_MAX_NAME];
    char resolution[PPD_MAX_NAME];
};

Members

density Ink density to use
gamma Gamma correction to use
matrix[3][3] Transform matrix
media_type[PPD_MAX_NAME] Media type or "-"
resolution[PPD_MAX_NAME] Resolution or "-"

 DEPRECATED ppd_size_s

Page Sizes

struct ppd_size_s {
    float bottom;
    float left;
    float length;
    int marked;
    char name[PPD_MAX_NAME];
    float right;
    float top;
    float width;
};

Members

bottom Bottom printable margin in points
left Left printable margin in points
length Length of media in points
marked Page size selected?
name[PPD_MAX_NAME] Media size option
right Right printable margin in points
top Top printable margin in points
width Width of media in points

Unions

 DEPRECATED ppd_cplimit_u

Custom Parameter Limit

union ppd_cplimit_u {
    float custom_curve;
    int custom_int;
    float custom_invcurve;
    int custom_passcode;
    int custom_password;
    float custom_points;
    float custom_real;
    int custom_string;
};

Members

custom_curve Gamma value
custom_int Integer value
custom_invcurve Gamma value
custom_passcode Passcode length
custom_password Password length
custom_points Measurement value
custom_real Real value
custom_string String length

 DEPRECATED ppd_cpvalue_u

Custom Parameter Value

union ppd_cpvalue_u {
    float custom_curve;
    int custom_int;
    float custom_invcurve;
    char *custom_passcode;
    char *custom_password;
    float custom_points;
    float custom_real;
    char *custom_string;
};

Members

custom_curve Gamma value
custom_int Integer value
custom_invcurve Gamma value
custom_passcode Passcode value
custom_password Password value
custom_points Measurement value
custom_real Real value
custom_string String value

Constants

 DEPRECATED ppd_conform_e

Conformance Levels

Constants

PPD_CONFORM_RELAXED Relax whitespace and control char
PPD_CONFORM_STRICT Require strict conformance

 DEPRECATED ppd_cptype_e

Custom Parameter Type

Constants

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)
PPD_CUSTOM_PASSCODE String of (hidden) numbers
PPD_CUSTOM_PASSWORD String of (hidden) characters
PPD_CUSTOM_POINTS Measurement value in points
PPD_CUSTOM_REAL Real number value
PPD_CUSTOM_STRING String of characters
PPD_CUSTOM_UNKNOWN Unknown type (error)

 DEPRECATED ppd_cs_e

Colorspaces

Constants

PPD_CS_CMY CMY colorspace
PPD_CS_CMYK CMYK colorspace
PPD_CS_GRAY Grayscale colorspace
PPD_CS_N DeviceN colorspace
PPD_CS_RGB RGB colorspace
PPD_CS_RGBK RGBK (K = gray) colorspace

 DEPRECATED ppd_section_e

Order dependency sections

Constants

PPD_ORDER_ANY Option code can be anywhere in the file
PPD_ORDER_DOCUMENT ... must be in the DocumentSetup section
PPD_ORDER_EXIT ... must be sent prior to the document
PPD_ORDER_JCL ... must be sent as a JCL command
PPD_ORDER_PAGE ... must be in the PageSetup section
PPD_ORDER_PROLOG ... must be in the Prolog section

 DEPRECATED ppd_status_e

Status Codes

Constants

PPD_ALLOC_ERROR Memory allocation error
PPD_BAD_CLOSE_UI Bad CloseUI/JCLCloseUI
PPD_BAD_CUSTOM_PARAM Bad custom parameter
PPD_BAD_OPEN_GROUP Bad OpenGroup
PPD_BAD_OPEN_UI Bad OpenUI/JCLOpenUI
PPD_BAD_ORDER_DEPENDENCY Bad OrderDependency
PPD_BAD_UI_CONSTRAINTS Bad UIConstraints
PPD_BAD_VALUE Bad value string
PPD_FILE_OPEN_ERROR Unable to open PPD file
PPD_ILLEGAL_CHARACTER Illegal control character
PPD_ILLEGAL_MAIN_KEYWORD Illegal main keyword string
PPD_ILLEGAL_OPTION_KEYWORD Illegal option keyword string
PPD_ILLEGAL_TRANSLATION Illegal translation string
PPD_ILLEGAL_WHITESPACE Illegal whitespace character
PPD_INTERNAL_ERROR Internal error
PPD_LINE_TOO_LONG Line longer than 255 chars
PPD_MISSING_ASTERISK Missing asterisk in column 0
PPD_MISSING_CLOSE_GROUP Missing CloseGroup
PPD_MISSING_CLOSE_UI Missing CloseUI/JCLCloseUI
PPD_MISSING_OPTION_KEYWORD Missing option keyword
PPD_MISSING_PPDADOBE4 Missing PPD-Adobe-4.x header
PPD_MISSING_VALUE Missing value string
PPD_NESTED_OPEN_GROUP OpenGroup without a CloseGroup first
PPD_NESTED_OPEN_UI OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first
PPD_NULL_FILE NULL PPD file pointer
PPD_OK OK

 DEPRECATED ppd_ui_e

UI Types

Constants

PPD_UI_BOOLEAN True or False option
PPD_UI_PICKMANY Pick zero or more from a list
PPD_UI_PICKONE Pick one from a list
cups-2.3.1/doc/help/man-ppdpo.html000664 000765 000024 00000004140 13574721672 017054 0ustar00mikestaff000000 000000 ppdpo(1)

ppdpo(1)

Name

ppdpo - ppd message catalog generator (deprecated)

Synopsis

ppdpo [ -D name[=value] ] [ -I include-directory ] [ -o output-file ] source-file

Description

ppdpo extracts UI strings from PPDC source files and updates either a GNU gettext or macOS strings format message catalog source file for translation. This program is deprecated and will be removed in a future release of CUPS.

Options

ppdpo supports the following options:
-D name[=value]
Sets the named variable for use in the source file. It is equivalent to using the #define directive in the source file.
-I include-directory
Specifies an alternate include directory. Multiple -I options can be supplied to add additional directories.
-o output-file
Specifies the output file. The supported extensions are .po or .po.gz for GNU gettext format message catalogs and .strings for macOS strings files.

Notes

PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as ippeveprinter(1).

See Also

ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-ipptoolfile.html000664 000765 000024 00000066466 13574721672 020303 0ustar00mikestaff000000 000000 ipptoolfile(5)

ipptoolfile(5)

Name

ipptoolfile - ipptool file format

Description

The ipptool(1) program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example:

    # This is a comment
    {
      # The name of the test
      NAME "Print PDF File"

      # The request to send
      OPERATION Print-Job

      GROUP operation-attributes-tag
      ATTR charset attributes-charset utf-8
      ATTR language attributes-natural-language en
      ATTR uri printer-uri $uri
      ATTR name requesting-user-name $user
      ATTR mimeMediaType document-format application/pdf

      GROUP job-attributes-tag
      ATTR collection media-col {
        # US Letter plain paper from the "main" tray
        MEMBER collection media-size {
          MEMBER integer x-dimension 21590
          MEMBER integer y-dimension 27940
        }
        MEMBER integer media-top-margin 423
        MEMBER integer media-bottom-margin 423
        MEMBER integer media-left-margin 423
        MEMBER integer media-right-margin 423
        MEMBER keyword media-source "main"
        MEMBER keyword media-type "stationery"
      }

      FILE testfile.pdf

      # The response to expect
      STATUS successful-ok
      EXPECT job-id OF-TYPE integer WITH-VALUE >0
      EXPECT job-uri OF-TYPE uri
    }
    {
      # The name of the test
      NAME "Wait for Job to Complete"

      # The request to send
      OPERATION Get-Job-Attributes

      GROUP operation-attributes-tag
      ATTR charset attributes-charset utf-8
      ATTR language attributes-natural-language en
      ATTR uri printer-uri $uri
      ATTR integer job-id $job-id
      ATTR name requesting-user-name $user

      # The response to expect
      STATUS successful-ok
      EXPECT job-id OF-TYPE integer WITH-VALUE $job-id
      EXPECT job-uri OF-TYPE uri
      EXPECT job-state OF-TYPE enum WITH-VALUE >5 REPEAT-NO-MATCH
      EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user"

      # Show the job state until completed...
      DISPLAY job-state
      DISPLAY job-state-reasons
    }

Top-level Directives

The following directives can be used outside of a test:
{ test }
Defines a test.
DEFINE variable-name value
Defines the named variable to the given value. This is equivalent to specifying -d variable-name=value on the ipptool(8) command-line.
DEFINE-DEFAULT variable-name value
Defines the named variable to the given value if it does not already have a value.
FILE-ID "identifier"
Specifies an identifier string for the current file.
IGNORE-ERRORS yes
IGNORE-ERRORS no
Specifies whether, by default, ipptool(8) will ignore errors and continue with subsequent tests.
INCLUDE "filename"
INCLUDE <filename>
Includes another test file. The first form includes a file relative to the current test file, while the second form includes a file from the ipptool(8) include directory.
INCLUDE-IF-DEFINED name "filename"
INCLUDE-IF-DEFINED name <filename>
Includes another test file if the named variable is defined. The first form includes a file relative to the current test file, while the second form includes a file from the ipptool(8) include directory.
INCLUDE-IF-NOT-DEFINED name "filename"
INCLUDE-IF-NOT-DEFINED name <filename>
Includes another test file if the named variable is not defined. The first form includes a file relative to the current test file, while the second form includes a file from the ipptool(8) include directory.
SKIP-IF-DEFINED variable-name
SKIP-IF-NOT-DEFINED variable-name
Specifies that the remainder of the test file should be skipped when the variable is or is not defined.
STOP-AFTER-INCLUDE-ERROR no
STOP-AFTER-INCLUDE-ERROR yes
Specifies whether tests will be stopped after an error in an included file.
TRANSFER auto
Specifies that tests will, by default, use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
TRANSFER chunked
Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: chunked" header. This is the default and is equivalent to specifying -c on the ipptool(8) command-line. Support for chunked requests is required for conformance with all versions of IPP.
TRANSFER length
Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" header. This is equivalent to specifying -l on the ipptool(8) command-line. Support for content length requests is required for conformance with all versions of IPP.
VERSION 1.0
VERSION 1.1
VERSION 2.0
VERSION 2.1
VERSION 2.2
Specifies the default IPP version number to use for the tests that follow.

Test Directives

The following directives are understood within a test:
ATTR out-of-band-tag attribute-name
ATTR tag attribute-name value(s)
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 delimited by the comma (",") character - escape commas using the "\" character. Common attributes and values are listed in the IANA IPP registry - see references below.
ATTR collection attribute-name { MEMBER tag member-name value(s) ... } [ ... ,{ ... } ]
Adds a collection attribute to the test request. Member attributes follow the same syntax as regular attributes and can themselves be nested collections. Multiple collection values can be supplied as needed, separated by commas.
COMPRESSION deflate
COMPRESSION gzip
COMPRESSION none
Uses the specified compression on the document data following the attributes in a Print-Job or Send-Document request.
DELAY seconds[,repeat-seconds]
Specifies a delay in seconds before this test will be run. If two values are specified, the second value is used as the delay between repeated tests.
DISPLAY attribute-name
Specifies that value of the named attribute should be output as part of the test report.
EXPECT attribute-name [ predicate(s) ]
EXPECT ?attribute-name predicate(s)
EXPECT !attribute-name
Specifies that the response must/may/must not include the named attribute. Additional requirements can be added as predicates - see the "EXPECT PREDICATES" section for more information on predicates. Attribute names can specify member attributes by separating the attribute and member names with the forward slash, for example "media-col/media-size/x-dimension".
EXPECT-ALL attribute-name [ predicate(s) ]
EXPECT-ALL ?attribute-name predicate(s)
Specifies that the response must/may include the named attribute and that all occurrences of that attribute must match the given predicates.
FILE filename
Specifies a file to include at the end of the request. This is typically used when sending a test print file.
GROUP tag
Specifies the group tag for subsequent attributes in the request.
IGNORE-ERRORS yes
IGNORE-ERRORS no
Specifies whether ipptool(8) will ignore errors and continue with subsequent tests.
NAME "literal string"
Specifies the human-readable name of the test.
OPERATION operation-code
Specifies the operation to be performed.
PAUSE "message"
Displays the provided message and waits for the user to press a key to continue.
REQUEST-ID number
REQUEST-ID random
Specifies the request-id value to use in the request, either an integer or the word "random" to use a randomly generated value (the default).
RESOURCE path
Specifies an alternate resource path that is used for the HTTP POST request. The default is the resource from the URI provided to the ipptool(8) program.
SKIP-IF-DEFINED variable-name
SKIP-IF-NOT-DEFINED variable-name
Specifies that the current test should be skipped when the variable is or is not defined.
SKIP-PREVIOUS-ERROR yes
SKIP-PREVIOUS-ERROR no
Specifies whether ipptool(8) will skip the current test if the previous test resulted in an error/failure.
STATUS status-code [ predicate ]
Specifies an expected response status-code value. Additional requirements can be added as predicates - see the "STATUS PREDICATES" section for more information on predicates.
TEST-ID "identifier"
Specifies an identifier string for the current test.
TRANSFER auto
Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise.
TRANSFER chunked
Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header.
TRANSFER length
Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
VERSION 1.0
VERSION 1.1
VERSION 2.0
VERSION 2.1
VERSION 2.2
Specifies the IPP version number to use for this test.

Expect Predicates

The following predicates are understood following the EXPECT test directive:
COUNT number
Requires the EXPECT attribute to have the specified number of values.
DEFINE-MATCH variable-name
Defines the variable to "1" when the EXPECT condition matches. A side-effect of this predicate is that this EXPECT will never fail a test.
DEFINE-NO-MATCH variable-name
Defines the variable to "1" when the EXPECT condition does not match. A side-effect of this predicate is that this EXPECT will never fail a test.
DEFINE-VALUE variable-name
Defines the variable to the value of the attribute when the EXPECT condition matches. A side-effect of this predicate is that this EXPECT will never fail a test.
IF-DEFINED variable-name
Makes the EXPECT conditions apply only if the specified variable is defined.
IF-NOT-DEFINED variable-name
Makes the EXPECT conditions apply only if the specified variable is not defined.
IN-GROUP tag
Requires the EXPECT attribute to be in the specified group tag.
OF-TYPE tag[|tag,...]
Requires the EXPECT attribute to use one of the specified value tag(s).
REPEAT-LIMIT number

Specifies the maximum number of times to repeat if the REPEAT-MATCH or REPEAT-NO-MATCH predicate is specified. The default value is 1000.
REPEAT-MATCH
REPEAT-NO-MATCH
Specifies that the current test should be repeated when the EXPECT condition matches or does not match.
SAME-COUNT-AS attribute-name
Requires the EXPECT attribute to have the same number of values as the specified parallel attribute.
WITH-ALL-HOSTNAMES "literal string"
WITH-ALL-HOSTNAMES "/regular expression/"
Requires that all URI values contain a matching hostname.
WITH-ALL-RESOURCES "literal string"
WITH-ALL-RESOURCES "/regular expression/"
Requires that all URI values contain a matching resource (including leading /).
WITH-ALL-SCHEMES "literal string"
WITH-ALL-SCHEMES "/regular expression/"
Requires that all URI values contain a matching scheme.
WITH-ALL-VALUES "literal string"
Requires that all values of the EXPECT attribute match the literal string. Comparisons are case-sensitive.
WITH-ALL-VALUES <number
WITH-ALL-VALUES =number
WITH-ALL-VALUES >number
WITH-ALL-VALUES number[,...,number]
Requires that all values of the EXPECT attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
WITH-ALL-VALUES "false"
WITH-ALL-VALUES "true"
Requires that all values of the EXPECT attribute match the boolean value given.
WITH-ALL-VALUES "/regular expression/"
Requires that all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
WITH-HOSTNAME "literal string"
WITH-HOSTNAME "/regular expression/"
Requires that at least one URI value contains a matching hostname.
WITH-RESOURCE "literal string"
WITH-RESOURCE "/regular expression/"
Requires that at least one URI value contains a matching resource (including leading /).
WITH-SCHEME "literal string"
WITH-SCHEME "/regular expression/"
Requires that at least one URI value contains a matching scheme.
WITH-VALUE "literal string"
Requires that at least one value of the EXPECT attribute matches the literal string. Comparisons are case-sensitive.
WITH-VALUE <number
WITH-VALUE =number
WITH-VALUE >number
WITH-VALUE number[,...,number]
Requires that at least one value of the EXPECT attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
WITH-VALUE "false"
WITH-VALUE "true"
Requires that at least one value of the EXPECT attribute matches the boolean value given.
WITH-VALUE "/regular expression/"
Requires that at least one value of the EXPECT attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
WITH-VALUE-FROM attribute-name
Requires that the value(s) of the EXPECT attribute matches the value(s) in the specified attribute. For example, "EXPECT job-sheets WITH-VALUE-FROM job-sheets-supported" requires that the "job-sheets" value is listed as a value of the "job-sheets-supported" attribute.

Status Predicates

The following predicates are understood following the STATUS test directive:
DEFINE-MATCH variable-name
Defines the variable to "1" when the STATUS matches. A side-effect of this predicate is that this STATUS will never fail a test.
DEFINE-NO-MATCH variable-name
Defines the variable to "1" when the STATUS does not match. A side-effect of this predicate is that this STATUS will never fail a test.
IF-DEFINED variable-name
Makes the STATUS apply only if the specified variable is defined.
IF-NOT-DEFINED variable-name
Makes the STATUS apply only if the specified variable is not defined.
REPEAT-LIMIT number

Specifies the maximum number of times to repeat. The default value is 1000.
REPEAT-MATCH
REPEAT-NO-MATCH
Specifies that the current test should be repeated when the response status-code matches or does not match the value specified by the STATUS directive.

Operation Codes

Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of names supported by ipptool(8):

    Activate-Printer
    CUPS-Accept-Jobs
    CUPS-Add-Modify-Class
    CUPS-Add-Modify-Printer
    CUPS-Authenticate-Job
    CUPS-Delete-Class
    CUPS-Delete-Printer
    CUPS-Get-Classes
    CUPS-Get-Default
    CUPS-Get-Devices
    CUPS-Get-Document
    CUPS-Get-PPD
    CUPS-Get-PPDs
    CUPS-Get-Printers
    CUPS-Move-Job
    CUPS-Reject-Jobs
    CUPS-Set-Default
    Cancel-Current-Job
    Cancel-Job
    Cancel-Jobs
    Cancel-My-Jobs
    Cancel-Subscription
    Close-Job
    Create-Job
    Create-Job-Subscriptions
    Create-Printer-Subscriptions
    Deactivate-Printer
    Disable-Printer
    Enable-Printer
    Get-Job-Attributes
    Get-Jobs
    Get-Notifications
    Get-Printer-Attributes
    Get-Printer-Support-Files
    Get-Printer-Supported-Values
    Get-Subscription-Attributes
    Get-Subscriptions
    Hold-Job
    Hold-New-Jobs
    Identify-Printer
    Pause-Printer
    Pause-Printer-After-Current-Job
    Print-Job
    Print-URI
    Promote-Job
    Purge-Jobs
    Release-Held-New-Jobs
    Release-Job
    Renew-Subscription
    Reprocess-Job
    Restart-Job
    Restart-Printer
    Resubmit-Job
    Resume-Job
    Resume-Printer
    Schedule-Job-After
    Send-Document
    Send-Hardcopy-Document
    Send-Notifications
    Send-URI
    Set-Job-Attributes
    Set-Printer-Attributes
    Shutdown-Printer
    Startup-Printer
    Suspend-Current-Job
    Validate-Document
    Validate-Job

Status Codes

Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of the names supported by ipptool(8):

    client-error-account-authorization-failed
    client-error-account-closed
    client-error-account-info-needed
    client-error-account-limit-reached
    client-error-attributes-not-settable
    client-error-attributes-or-values-not-supported
    client-error-bad-request
    client-error-charset-not-supported
    client-error-compression-error
    client-error-compression-not-supported
    client-error-conflicting-attributes
    client-error-document-access-error
    client-error-document-format-error
    client-error-document-format-not-supported
    client-error-document-password-error
    client-error-document-permission-error
    client-error-document-security-error
    client-error-document-unprintable-error
    client-error-forbidden
    client-error-gone
    client-error-ignored-all-notifications
    client-error-ignored-all-subscriptions
    client-error-not-authenticated
    client-error-not-authorized
    client-error-not-found
    client-error-not-possible
    client-error-print-support-file-not-found
    client-error-request-entity-too-large
    client-error-request-value-too-long
    client-error-timeout
    client-error-too-many-subscriptions
    client-error-uri-scheme-not-supported
    cups-error-account-authorization-failed
    cups-error-account-closed
    cups-error-account-info-needed
    cups-error-account-limit-reached
    cups-see-other
    redirection-other-site
    server-error-busy
    server-error-device-error
    server-error-internal-error
    server-error-job-canceled
    server-error-multiple-document-jobs-not-supported
    server-error-not-accepting-jobs
    server-error-operation-not-supported
    server-error-printer-is-deactivated
    server-error-service-unavailable
    server-error-temporary-error
    server-error-version-not-supported
    successful-ok
    successful-ok-but-cancel-subscription
    successful-ok-conflicting-attributes
    successful-ok-events-complete
    successful-ok-ignored-notifications
    successful-ok-ignored-or-substituted-attributes
    successful-ok-ignored-subscriptions
    successful-ok-too-many-events

Tags

Value and group tags correspond to the names from RFC 8011 and other IPP extension specifications. Here are the group tags:

    document-attributes-tag
    event-notification-attributes-tag
    job-attributes-tag
    operation-attributes-tag
    printer-attributes-tag
    subscription-attributes-tag
    unsupported-attributes-tag

Here are the value tags:


    admin-define
    boolean
    charset
    collection
    dateTime
    default
    delete-attribute
    enum
    integer
    keyword
    mimeMediaType
    nameWithLanguage
    nameWithoutLanguage
    naturalLanguage
    no-value
    not-settable
    octetString
    rangeOfInteger
    resolution
    textWithLanguage
    textWithoutLanguage
    unknown
    unsupported
    uri
    uriScheme

Variables

The ipptool(8) program maintains a list of variables that can be used in any literal string or attribute value by specifying "$variable-name". Aside from variables defined using the -d option or DEFINE directive, the following pre-defined variables are available:
$$
Inserts a single "$" character.
$ENV[name]
Inserts the value of the named environment variable, or an empty string if the environment variable is not defined.
$date-current
Inserts the current date and time using the ISO-8601 format ("yyyy-mm-ddThh:mm:ssZ").
$date-start
Inserts the starting date and time using the ISO-8601 format ("yyyy-mm-ddThh:mm:ssZ").
$filename
Inserts the filename provided to ipptool(8) with the -f option.
$filetype
Inserts the MIME media type for the filename provided to ipptool(8) with the -f option.
$hostname
Inserts the hostname from the URI provided to ipptool(8).
$job-id
Inserts the last "job-id" attribute value returned in a test response or 0 if no "job-id" attribute has been seen.
$job-uri
Inserts the last "job-uri" attribute value returned in a test response or an empty string if no "job-uri" attribute has been seen.
$notify-subscription-id
Inserts the last "notify-subscription-id" attribute value returned in a test response or 0 if no "notify-subscription-id" attribute has been seen.
$port
Inserts the port number from the URI provided to ipptool(8).
$resource
Inserts the resource path from the URI provided to ipptool(8).
$scheme
Inserts the scheme from the URI provided to ipptool(8).
$uri
Inserts the URI provided to ipptool(8).
$uriuser
Inserts the username from the URI provided to ipptool(8), if any.
$user
Inserts the current user's login name.

See Also

ipptool(1), IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), RFC 8011 (http://tools.ietf.org/html/rfc8011)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cups-lpd.html000664 000765 000024 00000011377 13574721672 017473 0ustar00mikestaff000000 000000 cups-lpd(8)

cups-lpd(8)

Name

cups-lpd - receive print jobs and report printer status to lpd clients (deprecated)

Synopsis

cups-lpd [ -h hostname[:port] ] [ -n ] [ -o option=value ]

Description

cups-lpd is the CUPS Line Printer Daemon ("LPD") mini-server that supports legacy client systems that use the LPD protocol. cups-lpd does not act as a standalone network daemon but instead operates using any of the Internet "super-servers" such as inetd(8), launchd(8), and systemd(8).

Options

-h hostname[:port]
Sets the CUPS server (and port) to use.
-n
Disables reverse address lookups; normally cups-lpd will try to discover the hostname of the client via a reverse DNS lookup.
-o name=value
Inserts options for all print queues. Most often this is used to disable the "l" filter so that remote print jobs are filtered as needed for printing; the inetd(8) example below sets the "document-format" option to "application/octet-stream" which forces autodetection of the print file format.

Conforming To

cups-lpd does not enforce the restricted source port number specified in RFC 1179, as using restricted ports does not prevent users from submitting print jobs. While this behavior is different than standard Berkeley LPD implementations, it should not affect normal client operations.

The output of the status requests follows RFC 2569, Mapping between LPD and IPP Protocols. Since many LPD implementations stray from this definition, remote status reporting to LPD clients may be unreliable.

Errors

Errors are sent to the system log.

Files

/etc/inetd.conf
/etc/xinetd.d/cups-lpd
/System/Library/LaunchDaemons/org.cups.cups-lpd.plist

Notes

The cups-lpd program is deprecated and will no longer be supported in a future feature release of CUPS.

Performance

cups-lpd performs well with small numbers of clients and printers. However, since a new process is created for each connection and since each process must query the printing system before each job submission, it does not scale to larger configurations. We highly recommend that large configurations use the native IPP support provided by CUPS instead.

Security

cups-lpd currently does not perform any access control based on the settings in cupsd.conf(5) or in the hosts.allow(5) or hosts.deny(5) files used by TCP wrappers. Therefore, running cups-lpd on your server will allow any computer on your network (and perhaps the entire Internet) to print to your server.

While xinetd(8) has built-in access control support, you should use the TCP wrappers package with inetd(8) to limit access to only those computers that should be able to print through your server.

cups-lpd is not enabled by the standard CUPS distribution. Please consult with your operating system vendor to determine whether it is enabled by default on your system.

Example

If you are using inetd(8), add the following line to the inetd.conf file to enable the cups-lpd mini-server:

    printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd \
        -o document-format=application/octet-stream

Note: If you are using Solaris 10 or higher, you must run the inetdconv(1m) program to register the changes to the inetd.conf file.

CUPS includes configuration files for launchd(8), systemd(8), and xinetd(8). Simply enable the cups-lpd service using the corresponding control program.

See Also

cups(1), cupsd(8), inetconv(1m), inetd(8), launchd(8), xinetd(8), CUPS Online Help (http://localhost:631/help), RFC 2569

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/spec-raster.html000664 000765 000024 00000056540 13574721672 017424 0ustar00mikestaff000000 000000 CUPS Raster Format

CUPS Raster Format

CUPS Raster files are device-dependent raster image files that contain a PostScript page device dictionary and device-dependent raster imagery for each page in the document. These files are used to transfer raster data from the PostScript and image file RIPs to device-dependent filters that convert the raster data to a printable format.

CUPS 1.0 and 1.1 used version 1 of the raster format. CUPS 1.2 and later use version 2 (compressed) and version 3 (uncompressed) that are a superset of the version 1 raster format. All three versions of CUPS Raster are streamable formats, and applications using the CUPS Imaging API (the cupsRaster* functions) can read all formats without code changes.

The registered MIME media type for CUPS Raster files is application/vnd.cups-raster.

Organization of a CUPS Raster File

Figure 1, "Raster Organization", shows the general organization of all CUPS Raster files. Each file begins with a 32-bit synchronization word followed by zero or more pages. Each page consists of a header (the PostScript page device dictionary and raster-specific values) followed by the bitmap image for the page.

Each page bitmap is stored as described by the cupsBitsPerColor, cupsBytesPerLine, cupsColorOrder, cupsColorSpace, cupsHeight, and cupsWidth values in the page header. Pixels for the front side of a sheet are always stored left-to-right, top-to-bottom. When doing duplex printing, pixels for the back side of a sheet may be stored differently depending on the value of the cupsBackSide keyword ("Normal", "ManualTumble", "Rotated", or "Flipped") in the PPD file and the Tumble value ("true" or "false") in the page header. Figure 2, "Page Bitmaps", shows the pixel order for each combination.

Version 1 Raster File Format

A version 1 raster file begins with a 32-bit synchronization word: 0x52615374 ("RaSt") for big-endian architectures or 0x74536152 ("tSaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

Following the synchronization word are a series of raster pages. Each page starts with a page device dictionary header and is followed immediately by the (uncompressed/raw) raster data for that page.

Table 1: CUPS Version 1 Raster Page Device Dictionary
Bytes Type Description Values
0-63 C String MediaClass Media class string
64-127 C String MediaColor Media color string
128-191 C String MediaType Media type string
192-255 C String OutputType Output type string
256-259 Unsigned Integer AdvanceDistance 0 to 232 - 1 points
260-263 Unsigned Integer AdvanceMedia 0 = Never advance roll
1 = Advance roll after file
2 = Advance roll after job
3 = Advance roll after set
4 = Advance roll after page
264-267 Unsigned Integer Collate 0 = do not collate copies
1 = collate copies
268-271 Unsigned Integer CutMedia 0 = Never cut media
1 = Cut roll after file
2 = Cut roll after job
3 = Cut roll after set
4 = Cut roll after page
272-275 Unsigned Integer Duplex 0 = Print single-sided
1 = Print double-sided
276-283 Unsigned Integers (2) HWResolution Horizontal and vertical resolution in dots-per-inch.
284-299 Unsigned Integers (4) ImagingBoundingBox Four integers giving the left, bottom, right, and top positions of the page bounding box in points
300-303 Unsigned Integer InsertSheet 0 = Do not insert separator sheets
1 = Insert separator sheets
304-307 Unsigned Integer Jog 0 = Do no jog pages
1 = Jog pages after file
2 = Jog pages after job
3 = Jog pages after set
308-311 Unsigned Integer LeadingEdge 0 = Top edge is first
1 = Right edge is first
2 = Bottom edge is first
3 = Left edge is first
312-319 Unsigned Integers (2) Margins Left and bottom origin of image in points
320-323 Unsigned Integer ManualFeed 0 = Do not manually feed media
1 = Manually feed media
324-327 Unsigned Integer MediaPosition Input slot position from 0 to N
328-331 Unsigned Integer MediaWeight Media weight in grams per meter squared, 0 = printer default
332-335 Unsigned Integer MirrorPrint 0 = Do not mirror prints
1 = Mirror prints
336-339 Unsigned Integer NegativePrint 0 = Do not invert prints
1 = Invert prints
340-343 Unsigned Integer NumCopies 0 to 232 - 1, 0 = printer default
344-347 Unsigned Integer Orientation 0 = Do not rotate page
1 = Rotate page counter-clockwise
2 = Turn page upside down
3 = Rotate page clockwise
348-351 Unsigned Integer OutputFaceUp 0 = Output face down
1 = Output face up
352-359 Unsigned Integers (2) PageSize Width and length in points
360-363 Unsigned Integer Separations 0 = Print composite image
1 = Print color separations
364-367 Unsigned Integer TraySwitch 0 = Do not change trays if selected tray is empty
1 = Change trays if selected tray is empty
368-371 Unsigned Integer Tumble 0 = Do not rotate even pages when duplexing
1 = Rotate even pages when duplexing
372-375 Unsigned Integer cupsWidth Width of page image in pixels
376-379 Unsigned Integer cupsHeight Height of page image in pixels
380-383 Unsigned Integer cupsMediaType Driver-specific 0 to 232 - 1
384-387 Unsigned Integer cupsBitsPerColor 1, 2, 4, 8 bits for version 1 raster files
1, 2, 4, 8, and 16 bits for version 2/3 raster files
388-391 Unsigned Integer cupsBitsPerPixel 1 to 32 bits for version 1 raster files
1 to 240 bits for version 2/3 raster files
392-395 Unsigned Integer cupsBytesPerLine 1 to 232 - 1 bytes
396-399 Unsigned Integer cupsColorOrder 0 = chunky pixels (CMYK CMYK CMYK)
1 = banded pixels (CCC MMM YYY KKK)
2 = planar pixels (CCC... MMM... YYY... KKK...)
400-403 Unsigned Integer cupsColorSpace 0 = gray (device, typically sRGB-based)
1 = RGB (device, typically sRGB)
2 = RGBA (device, typically sRGB)
3 = black
4 = CMY
5 = YMC
6 = CMYK
7 = YMCK
8 = KCMY
9 = KCMYcm
10 = GMCK
11 = GMCS
12 = WHITE
13 = GOLD
14 = SILVER
15 = CIE XYZ
16 = CIE Lab
17 = RGBW (sRGB)
18 = sGray (gray using sRGB gamma/white point)
19 = sRGB
20 = AdobeRGB
32 = ICC1 (CIE Lab with hint for 1 color)
33 = ICC2 (CIE Lab with hint for 2 colors)
34 = ICC3 (CIE Lab with hint for 3 colors)
35 = ICC4 (CIE Lab with hint for 4 colors)
36 = ICC5 (CIE Lab with hint for 5 colors)
37 = ICC6 (CIE Lab with hint for 6 colors)
38 = ICC7 (CIE Lab with hint for 7 colors)
39 = ICC8 (CIE Lab with hint for 8 colors)
40 = ICC9 (CIE Lab with hint for 9 colors)
41 = ICCA (CIE Lab with hint for 10 colors)
42 = ICCB (CIE Lab with hint for 11 colors)
43 = ICCC (CIE Lab with hint for 12 colors)
44 = ICCD (CIE Lab with hint for 13 colors)
45 = ICCE (CIE Lab with hint for 14 colors)
46 = ICCF (CIE Lab with hint for 15 colors)
48 = Device1 (DeviceN for 1 color)
49 = Device2 (DeviceN for 2 colors)
50 = Device3 (DeviceN for 3 colors)
51 = Device4 (DeviceN for 4 colors)
52 = Device5 (DeviceN for 5 colors)
53 = Device6 (DeviceN for 6 colors)
54 = Device7 (DeviceN for 7 colors)
55 = Device8 (DeviceN for 8 colors)
56 = Device9 (DeviceN for 9 colors)
57 = DeviceA (DeviceN for 10 colors)
58 = DeviceB (DeviceN for 11 colors)
59 = DeviceC (DeviceN for 12 colors)
60 = DeviceD (DeviceN for 13 colors)
61 = DeviceE (DeviceN for 14 colors)
62 = DeviceF (DeviceN for 15 colors)
404-407 Unsigned Integer cupsCompression Driver-specific 0 to 232 - 1
408-411 Unsigned Integer cupsRowCount Driver-specific 0 to 232 - 1
412-415 Unsigned Integer cupsRowFeed Driver-specific 0 to 232 - 1
416-419 Unsigned Integer cupsRowStep Driver-specific 0 to 232 - 1

Version 2 Raster File Format

A version 2 raster file begins with a 32-bit synchronization word: 0x52615332 ("RaS2") for big-endian architectures or 0x32536152 ("2SaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

Following the synchronization word are a series of raster pages. Each page starts with a version 2 page device dictionary header and is followed immediately by the compressed raster data for that page.

Table 2: CUPS Version 2 Raster Page Device Dictionary
Bytes Type Description Values
0-419 Version 1 header data See Table 1
420-423 Unsigned Integer cupsNumColors 1 to 15 colors
424-427 IEEE Single Precision cupsBorderlessScalingFactor 0.0 or 1.0 or greater
428-435 IEEE Single Precision (2) cupsPageSize Width and length in points
436-451 IEEE Single Precision (4) cupsImagingBBox Four floating point numbers giving the left, bottom, right, and top positions of the page bounding box in points
452-515 Unsigned Integers (16) cupsInteger 16 driver-defined integer values
516-579 IEEE Single Precision (16) cupsReal 16 driver-defined floating point values
580-1603 C Strings (16x64) cupsString 16 driver-defined strings
1604-1667 C String cupsMarkerType Ink/toner type string
1668-1731 C String cupsRenderingIntent Color rendering intent string
1732-1795 C String cupsPageSizeName Page size name/keyword string from PPD

Compressed Raster Data Format

The version 2 raster data is compressed using a PackBits-like algorithm. Lines are grouped into an integral number of color values based upon the cupsColorOrder setting:

Table 3: Color Value Sizes
cupsColorOrder Bytes per color value
0 (chunky) (cupsBitsPerPixel + 7) / 8
1 (banded) (cupsBitsPerColor + 7) / 8
2 (planar) (cupsBitsPerColor + 7) / 8

Each line of raster data begins with a repetition count from 1 to 256 that is encoded using a single byte of "count - 1".

After the repetition count, whole color values for that line are run-length encoded using a PackBits-like run-length encoding algorithm: 1 to 128 repeated colors are encoded using an initial byte of "count - 1" followed by the color value byte(s) while 2 to 128 non-repeating colors are encoded using an initial byte of "257 - count" followed by the color value bytes.

For example, the 8x8 24-bit sRGB image shown in Figure 3, "Sample Image", would be encoded as the following 89 octets:

%x00 %x00.FF.FF.FF %x02.FF.FF.00 %x03.FF.FF.FF
%x00 %xFE.FF.FF.00.00.00.FF.FF.FF.00 %x02.FF.FF.FF %x00.00.FF.00 %x00.FF.FF.FF
%x00 %x01.FF.FF.00 %x02.FF.FF.FF %x02.00.FF.00
%x00 %x02.FF.FF.00 %x02.FF.FF.FF %x00.00.FF.00 %x00.FF.FF.FF
%x00 %x00.FF.FF.FF %x02.FF.FF.00 %x03.FF.FF.FF
%x00 %x07.FF.FF.FF
%x01 %x07.FF.00.00

The first line (%x00) contains 1 white pixel (%x00.FF.FF.FF), 3 yellow pixels (%x02.FF.FF.00), and 4 white pixels (%x03.FF.FF.FF).

The second line (%x00) contains a sequence of yellow + blue + yellow pixels (%xFE.FF.FF.00.00.00.FF.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), 1 green pixel (%x00.00.FF.00), and 1 white pixel (%x00.FF.FF.FF).

The third line (%x00) contains 2 yellow pixels (%x01.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), and 3 green pixels (%x02.00.FF.00)

The fourth line (%x00) contains 3 yellow pixels (%x02.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), 1 green pixel (%x00.00.FF.00), and 1 white pixel (%x00.FF.FF.FF).

The fifth line (%x00) contains 1 white pixel (%x00.FF.FF.FF), 3 yellow pixels (%x02.FF.FF.00), and 4 white pixels (%x03.FF.FF.FF).

The sixth line (%x00) contains 8 white pixels (%x07.FF.FF.FF).

The seventh and eighth lines (%x01) contain 8 red pixels (%x07.FF.00.00).

Version 3 Raster File Format

A version 3 raster file begins with a 32-bit synchronization word: 0x52615333 ("RaS3") for big-endian architectures and 0x33536152 ("3SaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

Following the synchronization word are a series of raster pages. Each page starts with a version 2 page device dictionary header and is followed immediately by the uncompressed/raw raster data for that page.

Pixel Value Coding

The following sections describe the encoding and decoding of the color values in a CUPS Raster file. In general, colors are packed into the minimum number of bytes, with special consideration provided for efficiency of encoding and access. Multi-byte values are stored in the native byte order and automatically swapped as needed when reading them using the CUPS imaging API.

CUPS_ORDER_CHUNKED

The chunked order provides the pixel value packed in a single place. Pixel values with 8 or more bits per color are stored as an array of colors in order, e.g. for CUPS_CSPACE_RGB you will see 8/16-bits of red, then blue, then green, then red, green, blue, etc. Pixel values with less than 8 bits per color are packed together as shown in Table 4. Multi-byte pixel values are stored in the native word order, just as for 16-bit color values.

Table 4: Chunked Color Values
Bits 1-color 3-color 4-color 6-color
1 W/W/W/W/W/W/W/W 0RGB/0RGB CMYK/CMYK 00KCMYcm
2 WW/WW/WW/WW 00RRGGBB CCMMYYKK N/A
4 WWWW/WWWW 0000RRRRGGGGBBBB
(multi-byte)
CCCCMMMMYYYYKKKK
(multi-byte)
N/A

CUPS_ORDER_BANDED

The banded order provides each color as a separate line of data. Each color plane for a line is written in sequence, e.g. for the CUPS_CSPACE_CMYK color space you would see all of the cyan pixels for a line followed by the magenta, yellow, and black pixels for that line. This is repeated for all of the lines on the page. Color values are packed starting with the most-significant bit (MSB) first.

CUPS_ORDER_PLANAR

The planar order provides each color as a separate page of data using a shared page header. Each color plane for a page is written in sequence, e.g. for the CUPS_CSPACE_CMYK color space you would see all of the cyan pixels for a page followed by the magenta, yellow, and black pixels for that page. Color values are packed starting with the most-significant bit (MSB) first. Each line starts on an 8-bit boundary.

CUPS_CSPACE_RGBW

This color space provides a dedicated black text channel and uses the sRGB color space definition and white point for the RGB color channels. The white channel is 0 for text (or "true") black, otherwise it must contain the maximum color value: 1 for 1-bit, 3 for 2-bit, 15 for 4-bit, 255 for 8-bit, or 65535 for 16-bit.

CUPS_CSPACE_KCMYcm

When cupsBitsPerColor is 1, 6 color planes are provided - black, cyan, magenta, yellow, light cyan, and light magenta. When cupsBitsPerColor is greater than 1, 4 color planes are provided using the CUPS_CSPACE_KCMY color space instead.

When cupsColorOrder is CUPS_ORDER_CHUNKED, bit 5 corresponds to black and bit 0 corresponds to light magenta. For CUPS_ORDER_BANDED and CUPS_ORDER_PLANAR, each color plane is encoded separately.

CUPS_CSPACE_CIELab and CUPS_CSPACE_ICCn

These color spaces map a CIE Lab color value with a D65 white point to either a 8- or 16-bit per color chunked (CUPS_ORDER_CHUNKED) format; the banded (CUPS_ORDER_BANDED) and planar (CUPS_ORDER_PLANAR) color orders are not supported.

The values are encoded and decoded using the following formulas:

  • 8-bit Encoding:
    L8 = 2.55 * L + 0.5
    a8 = a + 128.5
    b8 = b + 128.5
     
  • 8-bit Decoding:
    L = L8 / 2.55
    a = a8 - 128
    b = b8 - 128
     
  • 16-bit Encoding:
    L16 = 655.35 * L + 0.5
    a16 = 256 * (a + 128) + 0.5
    b16 = 256 * (b + 128) + 0.5
     
  • 16-bit Decoding:
    L = L16 / 655.35
    a = a16 / 256 - 128
    b = b16 / 256 - 128
     

CUPS_CSPACE_CIEXYZ

These color spaces map a CIE XYZ color value with a D65 white point to either a 8- or 16-bit per color chunked (CUPS_ORDER_CHUNKED) format; the banded (CUPS_ORDER_BANDED) and planar (CUPS_ORDER_PLANAR) color orders are not supported.

The values are encoded and decoded using the following formulas:

  • 8-bit Encoding:
    X8 = 231.8181 * X + 0.5
    Y8 = 231.8181 * Y + 0.5
    Z8 = 231.8181 * Z + 0.5
     
  • 8-bit Decoding:
    X = X8 / 231.8181
    Y = Y8 / 231.8181
    Z = Z8 / 231.8181
     
  • 16-bit Encoding:
    X16 = 59577.2727 * X + 0.5
    Y16 = 59577.2727 * Y + 0.5
    Z16 = 59577.2727 * Z + 0.5
     
  • 16-bit Decoding:
    X = X16 / 59577.2727
    Y = Y16 / 59577.2727
    Z = Z16 / 59577.2727
     

The scaling factor for XYZ values is 1/1.1, or 231.8181 for 8-bit values and 59577.2727 for 16-bit values. This allows for a slight overflow of XYZ values when converting from RGB, improving accuracy.

Change History

Changes in CUPS 1.4.7

  • Greatly improved the detail and now include an example of the bitmap compression.
  • Added all missing cupsColorSpace values and a separate description of CUPS_CSPACE_RGBW.

Changes in CUPS 1.2.2

  • Added version 3 (uncompressed) format.

Changes in CUPS 1.2.1

  • Added new sections on coding pixel values.
  • Clarified definitions of color spaces.

Changes in CUPS 1.2

  • Bumped raster version to 2
  • Added RGBW color space
  • Added 16 bit per color support
  • Added cupsNumColors, cupsBorderlessScalingFactor, cupsPageSize, cupsImagingBBox, cupsInteger, cupsReal, cupsString, cupsMarkerType, cupsRenderingIntent, and cupsPageSizeName attributes to the page device dictionary
  • Added raster data compression
  • Added data type column to device dictionary documentation.

Changes in CUPS 1.1.19

  • Added ICC and CIE color spaces.
cups-2.3.1/doc/help/api-filter.html000664 000765 000024 00000173241 13574721672 017226 0ustar00mikestaff000000 000000 Filter and Backend Programming

Filter and Backend Programming

Headers cups/backend.h
cups/ppd.h
cups/sidechannel.h
Library -lcups
See Also Programming: Introduction to CUPS Programming
Programming: CUPS API
Programming: PPD API
Programming: Raster API
Programming: Developing PostScript Printer Drivers
Programming: Developing Raster Printer Drivers
Specifications: CUPS Design Description

Overview

Filters (which include printer drivers and port monitors) and backends are used to convert job files to a printable format and send that data to the printer itself. All of these programs use a common interface for processing print jobs and communicating status information to the scheduler. Each is run with a standard set of command-line arguments:

argv[1]
The job ID
argv[2]
The user printing the job
argv[3]
The job name/title
argv[4]
The number of copies to print
argv[5]
The options that were provided when the job was submitted
argv[6]
The file to print (first program only)

The scheduler runs one or more of these programs to print any given job. The first filter reads from the print file and writes to the standard output, while the remaining filters read from the standard input and write to the standard output. The backend is the last filter in the chain and writes to the device.

Filters are always run as a non-privileged user, typically "lp", with no connection to the user's desktop. Backends are run either as a non-privileged user or as root if the file permissions do not allow user or group execution. The file permissions section talks about this in more detail.

Security Considerations

It is always important to use security programming practices. Filters and most backends are run as a non-privileged user, so the major security consideration is resource utilization - filters should not depend on unlimited amounts of CPU, memory, or disk space, and should protect against conditions that could lead to excess usage of any resource like infinite loops and unbounded recursion. In addition, filters must never allow the user to specify an arbitrary file path to a separator page, template, or other file used by the filter since that can lead to an unauthorized disclosure of information. Always treat input as suspect and validate it!

If you are developing a backend that runs as root, make sure to check for potential buffer overflows, integer under/overflow conditions, and file accesses since these can lead to privilege escalations. When writing files, always validate the file path and never allow a user to determine where to store a file.

Note:

Never write files to a user's home directory. Aside from the security implications, CUPS is a network print service and as such the network user may not be the same as the local user and/or there may not be a local home directory to write to.

In addition, some operating systems provide additional security mechanisms that further limit file system access, even for backends running as root. On macOS, for example, no backend may write to a user's home directory. See the Sandboxing on macOS section for more information.

Canceled Jobs and Signal Handling

The scheduler sends SIGTERM when a printing job is canceled or held. Filters, backends, and port monitors must catch SIGTERM and perform any cleanup necessary to produce a valid output file or return the printer to a known good state. The recommended behavior is to end the output on the current page, preferably on the current line or object being printed.

Filters and backends may also receive SIGPIPE when an upstream or downstream filter/backend exits with a non-zero status. Developers should generally ignore SIGPIPE at the beginning of main() with the following function call:

#include <signal.h>

...

int
main(int argc, char *argv[])
{
  signal(SIGPIPE, SIG_IGN);

  ...
}

File Permissions

For security reasons, CUPS will only run filters and backends that are owned by root and do not have world or group write permissions. The recommended permissions for filters and backends are 0555 - read and execute but no write. Backends that must run as root should use permissions of 0500 - read and execute by root, no access for other users. Write permissions can be enabled for the root user only.

To avoid a warning message, the directory containing your filter(s) must also be owned by root and have world and group write disabled - permissions of 0755 or 0555 are strongly encouraged.

Temporary Files

Temporary files should be created in the directory specified by the "TMPDIR" environment variable. The cupsTempFile2 function can be used to safely create temporary files in this directory.

Copy Generation

The argv[4] argument specifies the number of copies to produce of the input file. In general, you should only generate copies if the filename argument is supplied. The only exception to this are filters that produce device-independent PostScript output, since the PostScript filter pstops is responsible for generating copies of PostScript files.

Exit Codes

Filters must exit with status 0 when they successfully generate print data or 1 when they encounter an error. Backends can return any of the cups_backend_t constants.

Environment Variables

The following environment variables are defined by the printing system when running print filters and backends:

APPLE_LANGUAGE
The Apple language identifier associated with the job (macOS only).
CHARSET
The job character set, typically "utf-8".
CLASS
When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set.
CONTENT_TYPE
The MIME type associated with the file (e.g. application/postscript).
CUPS_CACHEDIR
The directory where cache files can be stored. Cache files can be used to retain information between jobs or files in a job.
CUPS_DATADIR
The directory where (read-only) CUPS data files can be found.
CUPS_FILETYPE
The type of file being printed: "job-sheet" for a banner page and "document" for a regular print file.
CUPS_SERVERROOT
The root directory of the server.
DEVICE_URI
The device-uri associated with the printer.
FINAL_CONTENT_TYPE
The MIME type associated with the printer (e.g. application/vnd.cups-postscript).
LANG
The language locale associated with the job.
PPD
The full pathname of the PostScript Printer Description (PPD) file for this printer.
PRINTER
The queue name of the class or printer.
RIP_CACHE
The recommended amount of memory to use for Raster Image Processors (RIPs).
TMPDIR
The directory where temporary files should be created.

Communicating with the Scheduler

Filters and backends communicate with the scheduler by writing messages to the standard error file. The scheduler reads messages from all filters in a job and processes the message based on its prefix. For example, the following code sets the current printer state message to "Printing page 5":

int page = 5;

fprintf(stderr, "INFO: Printing page %d\n", page);

Each message is a single line of text starting with one of the following prefix strings:

ALERT: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "alert" log level.
ATTR: attribute=value [attribute=value]
Sets the named printer or job attribute(s). Typically this is used to set the marker-colors, marker-high-levels, marker-levels, marker-low-levels, marker-message, marker-names, marker-types, printer-alert, and printer-alert-description printer attributes. Standard marker-types values are listed in Table 1. String values need special handling - see Reporting Attribute String Values below.
CRIT: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "critical" log level.
DEBUG: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "debug" log level.
DEBUG2: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "debug2" log level.
EMERG: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "emergency" log level.
ERROR: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "error" log level. Use "ERROR:" messages for non-persistent processing errors.
INFO: message
Sets the printer-state-message attribute. If the current log level is set to "debug2", also adds the specified message to the current error log file using the "info" log level.
NOTICE: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "notice" log level.
PAGE: page-number #-copies
PAGE: total #-pages
Adds an entry to the current page log file. The first form adds #-copies to the job-media-sheets-completed attribute. The second form sets the job-media-sheets-completed attribute to #-pages.
PPD: keyword=value [keyword=value ...]
Changes or adds keywords to the printer's PPD file. Typically this is used to update installable options or default media settings based on the printer configuration.
STATE: + printer-state-reason [printer-state-reason ...]
STATE: - printer-state-reason [printer-state-reason ...]
Sets or clears printer-state-reason keywords for the current queue. Typically this is used to indicate persistent media, ink, toner, and configuration conditions or errors on a printer. Table 2 lists some of the standard "printer-state-reasons" keywords from the IANA IPP Registry - use vendor-prefixed ("com.example.foo") keywords for custom states. See Managing Printer State in a Filter for more information.
WARNING: message
Sets the printer-state-message attribute and adds the specified message to the current error log file using the "warning" log level.

Messages without one of these prefixes are treated as if they began with the "DEBUG:" prefix string.

Table 1: Standard marker-types Values
marker-type Description
developer Developer unit
fuser Fuser unit
fuser-cleaning-pad Fuser cleaning pad
fuser-oil Fuser oil
ink Ink supply
opc Photo conductor
solid-wax Wax supply
staples Staple supply
toner Toner supply
transfer-unit Transfer unit
waste-ink Waste ink tank
waste-toner Waste toner tank
waste-wax Waste wax tank

Table 2: Standard State Keywords
Keyword Description
connecting-to-device Connecting to printer but not printing yet.
cover-open The printer's cover is open.
input-tray-missing The paper tray is missing.
marker-supply-empty The printer is out of ink.
marker-supply-low The printer is almost out of ink.
marker-waste-almost-full The printer's waste bin is almost full.
marker-waste-full The printer's waste bin is full.
media-empty The paper tray (any paper tray) is empty.
media-jam There is a paper jam.
media-low The paper tray (any paper tray) is almost empty.
media-needed The paper tray needs to be filled (for a job that is printing).
paused Stop the printer.
timed-out Unable to connect to printer.
toner-empty The printer is out of toner.
toner-low The printer is low on toner.

Reporting Attribute String Values

When reporting string values using "ATTR:" messages, a filter or backend must take special care to appropriately quote those values. The scheduler uses the CUPS option parsing code for attributes, so the general syntax is:

name=simple
name=simple,simple,...
name='complex value'
name="complex value"
name='"complex value"','"complex value"',...

Simple values are strings that do not contain spaces, quotes, backslashes, or the comma and can be placed verbatim in the "ATTR:" message, for example:

int levels[4] = { 40, 50, 60, 70 }; /* CMYK */

fputs("ATTR: marker-colors=#00FFFF,#FF00FF,#FFFF00,#000000\n", stderr);
fputs("ATTR: marker-high-levels=100,100,100,100\n", stderr);
fprintf(stderr, "ATTR: marker-levels=%d,%d,%d,%d\n", levels[0], levels[1],
        levels[2], levels[3], levels[4]);
fputs("ATTR: marker-low-levels=5,5,5,5\n", stderr);
fputs("ATTR: marker-types=toner,toner,toner,toner\n", stderr);

Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:

fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);

When multiple values are reported, each value must be enclosed by a set of single and double quotes:

fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
      "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);

The IPP backend includes a quote_string function that may be used to properly quote a complex value in an "ATTR:" message:

static const char *                     /* O - Quoted string */
quote_string(const char *s,             /* I - String */
             char       *q,             /* I - Quoted string buffer */
             size_t     qsize)          /* I - Size of quoted string buffer */
{
  char  *qptr,                          /* Pointer into string buffer */
        *qend;                          /* End of string buffer */


  qptr = q;
  qend = q + qsize - 5;

  if (qend < q)
  {
    *q = '\0';
    return (q);
  }

  *qptr++ = '\'';
  *qptr++ = '\"';

  while (*s && qptr < qend)
  {
    if (*s == '\\' || *s == '\"' || *s == '\'')
    {
      if (qptr < (qend - 4))
      {
        *qptr++ = '\\';
        *qptr++ = '\\';
        *qptr++ = '\\';
      }
      else
        break;
    }

    *qptr++ = *s++;
  }

  *qptr++ = '\"';
  *qptr++ = '\'';
  *qptr   = '\0';

  return (q);
}

Managing Printer State in a Filter

Filters are responsible for managing the state keywords they set using "STATE:" messages. Typically you will update all of the keywords that are used by the filter at startup, for example:

if (foo_condition != 0)
  fputs("STATE: +com.example.foo\n", stderr);
else
  fputs("STATE: -com.example.foo\n", stderr);

if (bar_condition != 0)
  fputs("STATE: +com.example.bar\n", stderr);
else
  fputs("STATE: -com.example.bar\n", stderr);

Then as conditions change, your filter sends "STATE: +keyword" or "STATE: -keyword" messages as necessary to set or clear the corresponding keyword, respectively.

State keywords are often used to notify the user of issues that span across jobs, for example "media-empty-warning" that indicates one or more paper trays are empty. These keywords should not be cleared unless the corresponding issue no longer exists.

Filters should clear job-related keywords on startup and exit so that they do not remain set between jobs. For example, "connecting-to-device" is a job sub-state and not an issue that applies when a job is not printing.

Note:

"STATE:" messages often provide visible alerts to the user. For example, on macOS setting a printer-state-reason value with an "-error" or "-warning" suffix will cause the printer's dock item to bounce if the corresponding reason is localized with a cupsIPPReason keyword in the printer's PPD file.

When providing a vendor-prefixed keyword, always provide the corresponding standard keyword (if any) to allow clients to respond to the condition correctly. For example, if you provide a vendor-prefixed keyword for a low cyan ink condition ("com.example.cyan-ink-low") you must also set the "marker-supply-low-warning" keyword. In such cases you should also refrain from localizing the vendor-prefixed keyword in the PPD file - otherwise both the generic and vendor-specific keyword will be shown in the user interface.

Reporting Supply Levels

CUPS tracks several "marker-*" attributes for ink/toner supply level reporting. These attributes allow applications to display the current supply levels for a printer without printer-specific software. Table 3 lists the marker attributes and what they represent.

Filters set marker attributes by sending "ATTR:" messages to stderr. For example, a filter supporting an inkjet printer with black and tri-color ink cartridges would use the following to initialize the supply attributes:

fputs("ATTR: marker-colors=#000000,#00FFFF#FF00FF#FFFF00\n", stderr);
fputs("ATTR: marker-low-levels=5,10\n", stderr);
fputs("ATTR: marker-names=Black,Tri-Color\n", stderr);
fputs("ATTR: marker-types=ink,ink\n", stderr);

Then periodically the filter queries the printer for its current supply levels and updates them with a separate "ATTR:" message:

int black_level, tri_level;
...
fprintf(stderr, "ATTR: marker-levels=%d,%d\n", black_level, tri_level);
Table 3: Supply Level Attributes
Attribute Description
marker-colors A list of comma-separated colors; each color is either "none" or one or more hex-encoded sRGB colors of the form "#RRGGBB".
marker-high-levels A list of comma-separated "almost full" level values from 0 to 100; a value of 100 should be used for supplies that are consumed/emptied like ink cartridges.
marker-levels A list of comma-separated level values for each supply. A value of -1 indicates the level is unavailable, -2 indicates unknown, and -3 indicates the level is unknown but has not yet reached capacity. Values from 0 to 100 indicate the corresponding percentage.
marker-low-levels A list of comma-separated "almost empty" level values from 0 to 100; a value of 0 should be used for supplies that are filled like waste ink tanks.
marker-message A human-readable supply status message for the user like "12 pages of ink remaining."
marker-names A list of comma-separated supply names like "Cyan Ink", "Fuser", etc.
marker-types A list of comma-separated supply types; the types are listed in Table 1.

Communicating with the Backend

Filters can communicate with the backend via the cupsBackChannelRead and cupsSideChannelDoRequest functions. The cupsBackChannelRead function reads data that has been sent back from the device and is typically used to obtain status and configuration information. For example, the following code polls the backend for back-channel data:

#include <cups/cups.h>

char buffer[8192];
ssize_t bytes;

/* Use a timeout of 0.0 seconds to poll for back-channel data */
bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0.0);

Filters can also use select() or poll() on the back-channel file descriptor (3 or CUPS_BC_FD) to read data only when it is available.

The cupsSideChannelDoRequest function allows you to get out-of-band status information and do synchronization with the device. For example, the following code gets the current IEEE-1284 device ID string from the backend:

#include <cups/sidechannel.h>

char data[2049];
int datalen;
cups_sc_status_t status;

/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for
   nul-termination... */
datalen = sizeof(data) - 1;

/* Get the IEEE-1284 device ID, waiting for up to 1 second */
status = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_DEVICE_ID, data, &datalen, 1.0);

/* Use the returned value if OK was returned and the length is non-zero */
if (status == CUPS_SC_STATUS_OK && datalen > 0)
  data[datalen] = '\0';
else
  data[0] = '\0';

Forcing All Output to a Printer

The cupsSideChannelDoRequest function allows you to tell the backend to send all pending data to the printer. This is most often needed when sending query commands to the printer. For example:

#include <cups/cups.h>
#include <cups/sidechannel.h>

char data[1024];
int datalen = sizeof(data);
cups_sc_status_t status;

/* Flush pending output to stdout */
fflush(stdout);

/* Drain output to backend, waiting for up to 30 seconds */
status = cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, data, &datalen, 30.0);

/* Read the response if the output was sent */
if (status == CUPS_SC_STATUS_OK)
{
  ssize_t bytes;

  /* Wait up to 10.0 seconds for back-channel data */
  bytes = cupsBackChannelRead(data, sizeof(data), 10.0);
  /* do something with the data from the printer */
}

Communicating with Filters

Backends communicate with filters using the reciprocal functions cupsBackChannelWrite, cupsSideChannelRead, and cupsSideChannelWrite. We recommend writing back-channel data using a timeout of 1.0 seconds:

#include <cups/cups.h>

char buffer[8192];
ssize_t bytes;

/* Obtain data from printer/device */
...

/* Use a timeout of 1.0 seconds to give filters a chance to read */
cupsBackChannelWrite(buffer, bytes, 1.0);

The cupsSideChannelRead function reads a side-channel command from a filter, driver, or port monitor. Backends can either poll for commands using a timeout of 0.0, wait indefinitely for commands using a timeout of -1.0 (probably in a separate thread for that purpose), or use select or poll on the CUPS_SC_FD file descriptor (4) to handle input and output on several file descriptors at the same time.

Once a command is processed, the backend uses the cupsSideChannelWrite function to send its response. For example, the following code shows how to poll for a side-channel command and respond to it:

#include <cups/sidechannel.h>

cups_sc_command_t command;
cups_sc_status_t status;
char data[2048];
int datalen = sizeof(data);

/* Poll for a command... */
if (!cupsSideChannelRead(&command, &status, data, &datalen, 0.0))
{
  switch (command)
  {
    /* handle supported commands, fill data/datalen/status with values as needed */

    default :
        status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
	datalen = 0;
	break;
  }

  /* Send a response... */
  cupsSideChannelWrite(command, status, data, datalen, 1.0);
}

Doing SNMP Queries with Network Printers

The Simple Network Management Protocol (SNMP) allows you to get the current status, page counter, and supply levels from most network printers. Every piece of information is associated with an Object Identifier (OID), and every printer has a community name associated with it. OIDs can be queried directly or by "walking" over a range of OIDs with a common prefix.

The two CUPS SNMP functions provide a simple API for querying network printers through the side-channel interface. Each accepts a string containing an OID like ".1.3.6.1.2.1.43.10.2.1.4.1.1" (the standard page counter OID) along with a timeout for the query.

The cupsSideChannelSNMPGet function queries a single OID and returns the value as a string in a buffer you supply:

#include <cups/sidechannel.h>

char data[512];
int datalen = sizeof(data);

if (cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", data, &datalen, 5.0)
        == CUPS_SC_STATUS_OK)
{
  /* Do something with the value */
  printf("Page counter is: %s\n", data);
}

The cupsSideChannelSNMPWalk function allows you to query a whole group of OIDs, calling a function of your choice for each OID that is found:

#include <cups/sidechannel.h>

void
my_callback(const char *oid, const char *data, int datalen, void *context)
{
  /* Do something with the value */
  printf("%s=%s\n", oid, data);
}

...

void *my_data;

cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);

Sandboxing on macOS

Starting with macOS 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:

  1. Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the /private/var/spool/cups directory and other files on mounted filesystems except for user home directories under /Users.
  2. Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the CUPS_CACHEDIR environment variable, to the state directory specified by the CUPS_STATEDIR environment variable, to the temporary directory specified by the TMPDIR environment variable, and under the /private/var/db, /private/var/folders, /private/var/lib, /private/var/mysql, /private/var/run, /private/var/spool (except /private/var/spool/cups), /Library/Application Support, /Library/Caches, /Library/Logs, /Library/Preferences, /Library/WebServer, and /Users/Shared directories.
  3. Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the /Users directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.
  4. Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. Filters cannot access Bluetooth and USB printers directly.
  5. Network: filters and backends can access UNIX domain sockets under the /private/tmp, /private/var/run, and /private/var/tmp directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.
  6. Notifications: filters and backends can send notifications via the Darwin notify_post() API.
Note:

The sandbox profile used in CUPS still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.

Functions

 CUPS 1.2/macOS 10.5 cupsBackChannelRead

Read data from the backchannel.

ssize_t cupsBackChannelRead(char *buffer, size_t bytes, double timeout);

Parameters

buffer Buffer to read into
bytes Bytes to read
timeout Timeout in seconds, typically 0.0 to poll

Return Value

Bytes read or -1 on error

Discussion

Reads up to "bytes" bytes from the backchannel/backend. The "timeout" parameter controls how many seconds to wait for the data - use 0.0 to return immediately if there is no data, -1.0 to wait for data indefinitely.

 CUPS 1.2/macOS 10.5 cupsBackChannelWrite

Write data to the backchannel.

ssize_t cupsBackChannelWrite(const char *buffer, size_t bytes, double timeout);

Parameters

buffer Buffer to write
bytes Bytes to write
timeout Timeout in seconds, typically 1.0

Return Value

Bytes written or -1 on error

Discussion

Writes "bytes" bytes to the backchannel/filter. The "timeout" parameter controls how many seconds to wait for the data to be written - use 0.0 to return immediately if the data cannot be written, -1.0 to wait indefinitely.

 CUPS 1.2/macOS 10.5 cupsBackendDeviceURI

Get the device URI for a backend.

const char *cupsBackendDeviceURI(char **argv);

Parameters

argv Command-line arguments

Return Value

Device URI or NULL

Discussion

The "argv" argument is the argv argument passed to main(). This function returns the device URI passed in the DEVICE_URI environment variable or the device URI passed in argv[0], whichever is found first.

 CUPS 1.4/macOS 10.6 cupsBackendReport

Write a device line from a backend.

void cupsBackendReport(const char *device_scheme, const char *device_uri, const char *device_make_and_model, const char *device_info, const char *device_id, const char *device_location);

Parameters

device_scheme device-scheme string
device_uri device-uri string
device_make_and_model device-make-and-model string or NULL
device_info device-info string or NULL
device_id device-id string or NULL
device_location device-location string or NULL

Discussion

This function writes a single device line to stdout for a backend. It handles quoting of special characters in the device-make-and-model, device-info, device-id, and device-location strings.

 CUPS 1.3/macOS 10.5 cupsSideChannelDoRequest

Send a side-channel command to a backend and wait for a response.

cups_sc_status_t cupsSideChannelDoRequest(cups_sc_command_t command, char *data, int *datalen, double timeout);

Parameters

command Command to send
data Response data buffer pointer
datalen Size of data buffer on entry, number of bytes in buffer on return
timeout Timeout in seconds

Return Value

Status of command

Discussion

This function is normally only called by filters, drivers, or port monitors in order to communicate with the backend used by the current printer. Programs must be prepared to handle timeout or "not implemented" status codes, which indicate that the backend or device do not support the specified side-channel command.

The "datalen" parameter must be initialized to the size of the buffer pointed to by the "data" parameter. cupsSideChannelDoRequest() will update the value to contain the number of data bytes in the buffer.

 CUPS 1.3/macOS 10.5 cupsSideChannelRead

Read a side-channel message.

int cupsSideChannelRead(cups_sc_command_t *command, cups_sc_status_t *status, char *data, int *datalen, double timeout);

Parameters

command Command code
status Status code
data Data buffer pointer
datalen Size of data buffer on entry, number of bytes in buffer on return
timeout Timeout in seconds

Return Value

0 on success, -1 on error

Discussion

This function is normally only called by backend programs to read commands from a filter, driver, or port monitor program. The caller must be prepared to handle incomplete or invalid messages and return the corresponding status codes.

The "datalen" parameter must be initialized to the size of the buffer pointed to by the "data" parameter. cupsSideChannelDoRequest() will update the value to contain the number of data bytes in the buffer.

 CUPS 1.4/macOS 10.6 cupsSideChannelSNMPGet

Query a SNMP OID's value.

cups_sc_status_t cupsSideChannelSNMPGet(const char *oid, char *data, int *datalen, double timeout);

Parameters

oid OID to query
data Buffer for OID value
datalen Size of OID buffer on entry, size of value on return
timeout Timeout in seconds

Return Value

Query status

Discussion

This function asks the backend to do a SNMP OID query on behalf of the filter, port monitor, or backend using the default community name.

"oid" contains a numeric OID consisting of integers separated by periods, for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not supported and must be converted to their numeric forms.

On input, "data" and "datalen" provide the location and size of the buffer to hold the OID value as a string. HEX-String (binary) values are converted to hexadecimal strings representing the binary data, while NULL-Value and unknown OID types are returned as the empty string. The returned "datalen" does not include the trailing nul. CUPS_SC_STATUS_NOT_IMPLEMENTED is returned by backends that do not support SNMP queries. CUPS_SC_STATUS_NO_RESPONSE is returned when the printer does not respond to the SNMP query.

 CUPS 1.4/macOS 10.6 cupsSideChannelSNMPWalk

Query multiple SNMP OID values.

cups_sc_status_t cupsSideChannelSNMPWalk(const char *oid, double timeout, cups_sc_walk_func_t cb, void *context);

Parameters

oid First numeric OID to query
timeout Timeout for each query in seconds
cb Function to call with each value
context Application-defined pointer to send to callback

Return Value

Status of first query of CUPS_SC_STATUS_OK on success

Discussion

This function asks the backend to do multiple SNMP OID queries on behalf of the filter, port monitor, or backend using the default community name. All OIDs under the "parent" OID are queried and the results are sent to the callback function you provide.

"oid" contains a numeric OID consisting of integers separated by periods, for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not supported and must be converted to their numeric forms.

"timeout" specifies the timeout for each OID query. The total amount of time will depend on the number of OID values found and the time required for each query.

"cb" provides a function to call for every value that is found. "context" is an application-defined pointer that is sent to the callback function along with the OID and current data. The data passed to the callback is the same as returned by cupsSideChannelSNMPGet. CUPS_SC_STATUS_NOT_IMPLEMENTED is returned by backends that do not support SNMP queries. CUPS_SC_STATUS_NO_RESPONSE is returned when the printer does not respond to the first SNMP query.

 CUPS 1.3/macOS 10.5 cupsSideChannelWrite

Write a side-channel message.

int cupsSideChannelWrite(cups_sc_command_t command, cups_sc_status_t status, const char *data, int datalen, double timeout);

Parameters

command Command code
status Status code
data Data buffer pointer
datalen Number of bytes of data
timeout Timeout in seconds

Return Value

0 on success, -1 on error

Discussion

This function is normally only called by backend programs to send responses to a filter, driver, or port monitor program.

Data Types

cups_backend_t

Backend exit codes

typedef enum cups_backend_e cups_backend_t;

cups_sc_bidi_t

Bidirectional capabilities

typedef enum cups_sc_bidi_e cups_sc_bidi_t;

cups_sc_command_t

Request command codes

typedef enum cups_sc_command_e cups_sc_command_t;

cups_sc_connected_t

Connectivity values

typedef enum cups_sc_connected_e cups_sc_connected_t;

cups_sc_state_t

Printer state bits

typedef enum cups_sc_state_e cups_sc_state_t;

cups_sc_status_t

Response status codes

typedef enum cups_sc_status_e cups_sc_status_t;

cups_sc_walk_func_t

SNMP walk callback

typedef void (*cups_sc_walk_func_t)(const char *oid, const char *data, int datalen, void *context);

Constants

cups_backend_e

Backend exit codes

Constants

CUPS_BACKEND_AUTH_REQUIRED Job failed, authentication required
CUPS_BACKEND_CANCEL Job failed, cancel job
CUPS_BACKEND_FAILED Job failed, use error-policy
CUPS_BACKEND_HOLD Job failed, hold job
CUPS_BACKEND_OK Job completed successfully
CUPS_BACKEND_RETRY Job failed, retry this job later
CUPS_BACKEND_RETRY_CURRENT Job failed, retry this job immediately
CUPS_BACKEND_STOP Job failed, stop queue

cups_sc_bidi_e

Bidirectional capability values

Constants

CUPS_SC_BIDI_NOT_SUPPORTED Bidirectional I/O is not supported
CUPS_SC_BIDI_SUPPORTED Bidirectional I/O is supported

cups_sc_command_e

Request command codes

Constants

CUPS_SC_CMD_DRAIN_OUTPUT Drain all pending output
CUPS_SC_CMD_GET_BIDI Return bidirectional capabilities
CUPS_SC_CMD_GET_CONNECTED  CUPS 1.5/macOS 10.7  Return whether the backend is "connected" to the printer
CUPS_SC_CMD_GET_DEVICE_ID Return the IEEE-1284 device ID
CUPS_SC_CMD_GET_STATE Return the device state
CUPS_SC_CMD_SNMP_GET  CUPS 1.4/macOS 10.6  Query an SNMP OID
CUPS_SC_CMD_SNMP_GET_NEXT  CUPS 1.4/macOS 10.6  Query the next SNMP OID
CUPS_SC_CMD_SOFT_RESET Do a soft reset

cups_sc_connected_e

Connectivity values

Constants

CUPS_SC_CONNECTED Backend is "connected" to printer
CUPS_SC_NOT_CONNECTED Backend is not "connected" to printer

cups_sc_state_e

Printer state bits

Constants

CUPS_SC_STATE_BUSY Device is busy
CUPS_SC_STATE_ERROR Other error condition
CUPS_SC_STATE_MARKER_EMPTY Toner/ink out condition
CUPS_SC_STATE_MARKER_LOW Toner/ink low condition
CUPS_SC_STATE_MEDIA_EMPTY Paper out condition
CUPS_SC_STATE_MEDIA_LOW Paper low condition
CUPS_SC_STATE_OFFLINE Device is offline
CUPS_SC_STATE_ONLINE Device is online

cups_sc_status_e

Response status codes

Constants

CUPS_SC_STATUS_BAD_MESSAGE The command/response message was invalid
CUPS_SC_STATUS_IO_ERROR An I/O error occurred
CUPS_SC_STATUS_NONE No status
CUPS_SC_STATUS_NOT_IMPLEMENTED Command not implemented
CUPS_SC_STATUS_NO_RESPONSE The device did not respond
CUPS_SC_STATUS_OK Operation succeeded
CUPS_SC_STATUS_TIMEOUT The backend did not respond
CUPS_SC_STATUS_TOO_BIG Response too big
cups-2.3.1/doc/help/man-cancel.html000664 000765 000024 00000005073 13574721672 017165 0ustar00mikestaff000000 000000 cancel(1)

cancel(1)

Name

cancel - cancel jobs

Synopsis

cancel [ -E ] [ -U username ] [ -a ] [ -h hostname[:port] ] [ -u username ] [ -x ] [ id ] [ destination ] [ destination-id ]

Description

The cancel command cancels print jobs. If no destination or id is specified, the currently printing job on the default destination is canceled.

Options

The following options are recognized by cancel:
-a
Cancel all jobs on the named destination, or all jobs on all destinations if none is provided.
-E
Forces encryption when connecting to the server.
-h hostname[:port]
Specifies an alternate server.
-U username
Specifies the username to use when connecting to the server.
-u username
Cancels jobs owned by username.
-x
Deletes job data files in addition to canceling.

Conforming To

Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are not case-sensitive.

Examples

Cancel the current print job:

    cancel

Cancel job "myprinter-42":

    cancel myprinter-42

Cancel all jobs:

    cancel -a

Notes

Administrators wishing to prevent unauthorized cancellation of jobs via the -u option should require authentication for Cancel-Jobs operations in cupsd.conf(5).

See Also

cupsd.conf(5), lp(1), lpmove(8), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-cupsd-logs.html000664 000765 000024 00000023060 13574721672 020014 0ustar00mikestaff000000 000000 cupsd-logs(5)

cupsd-logs(5)

Name

cupsd-logs - cupsd log files (access_log, error_log, and page_log)

Description

cupsd(8) normally maintains three log files: access_log to track requests that are submitted to the scheduler, error_log to track progress and errors, and page_log to track pages that are printed. Configuration directives in cupsd.conf(5) and cups-files.conf(5) control what information is logged and where it is stored.

Access Log File Format

The access_log file lists each HTTP resource that is accessed by a web browser or client. Each line is in an extended version of the so-called "Common Log Format" used by many web servers and web reporting tools:

    host group user date-time "method resource version" status bytes
      ipp-operation ipp-status

For example:

    10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200 317
      CUPS-Get-Printers successful-ok-ignored-or-substituted-attributes
    localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
      200 0 - -
    localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
      200 157 CUPS-Get-Printers
      successful-ok-ignored-or-substituted-attributes
    localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1"
      200 1411 CUPS-Get-Devices -
    localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
      200 6667 - -

The host field will normally only be an IP address unless you have enabled the HostNameLookups directive in the cupsd.conf file or if the IP address corresponds to your local machine.

The group field always contains "-".

The user field is the authenticated username of the requesting user. If no username and password is supplied for the request then this field contains "-".

The date-time field is the date and time of the request in local time and is in the format "[DD/MON/YYYY:HH:MM:SS +ZZZZ]".

The method field is the HTTP method used: "GET", "HEAD", "OPTIONS", "POST", or "PUT". "GET" requests are used to get files from the server, both for the web interface and to get configuration and log files. "HEAD" requests are used to get information about a resource prior to a "GET". "OPTIONS" requests are used to upgrade connections to TLS encryption. "POST" requests are used for web interface forms and IPP requests. "PUT" requests are used to upload configuration files.

The resource field is the filename of the requested resource.

The version field is the HTTP specification version used by the client. For CUPS clients this will always be "HTTP/1.1".

The status field contains the HTTP result status of the request, as follows:

200
Successful operation.
201
File created/modified successfully.
304
The requested file has not changed.
400
Bad HTTP request; typically this means that you have a malicious program trying to access your server.
401
Unauthorized, authentication (username + password) is required.
403
Access is forbidden; typically this means that a client tried to access a file or resource they do not have permission to access.
404
The file or resource does not exist.
405
URL access method is not allowed; typically this means you have a web browser using your server as a proxy.
413
Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize allows.
426
Upgrading to TLS-encrypted connection.
500
Server error; typically this happens when the server is unable to open/create a file - consult the error_log file for details.
501
The client requested encryption but encryption support is not enabled/compiled in.
505
HTTP version number not supported; typically this means that you have a malicious program trying to access your server.

The bytes field contains the number of bytes in the request. For POST requests the bytes field contains the number of bytes of non-IPP data that is received from the client.

The ipp-operation field contains either "-" for non-IPP requests or the IPP operation name for POST requests containing an IPP request.

The ipp-status field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response.

Error Log File Format

The error_log file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the cupsd.conf(5) file controls which messages are logged:

    level date-time message

For example:

    I [20/May/1999:19:18:28 +0000] [Job 1] Queued on 'DeskJet' by 'mike'.
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[0]="DeskJet"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[1]="1"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[2]="mike"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[3]="myjob"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[4]="1"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[5]="media=
      na_letter_8.5x11in sides=one-sided"
    D [20/May/1999:19:18:28 +0000] [Job 1] argv[6]="/var/spool/cups/
      d000001-001"
    I [20/May/1999:19:21:02 +0000] [Job 2] Queued on 'DeskJet' by 'mike'.
    I [20/May/1999:19:22:24 +0000] [Job 2] Canceled by 'mike'.

The level field contains the type of message:
A
Alert message (LogLevel alert)
C
Critical error message (LogLevel crit)
D
Debugging message (LogLevel debug)
d
Detailed debugging message (LogLevel debug2)
E
Normal error message (LogLevel error)
I
Informational message (LogLevel info)
N
Notice message (LogLevel notice)
W
Warning message (LogLevel warn)
X
Emergency error message (LogLevel emerg)

The date-time field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the access_log file.

The message field contains a free-form textual message. Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.

Page Log File Format

The page_log file lists the total number of pages (sheets) that are printed. By default, each line contains the following information:

    printer user job-id date-time total num-sheets job-billing
      job-originating-host-name job-name media sides

For example the entry for a two page job called "myjob" might look like:

    DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
      localhost myjob na_letter_8.5x11in one-sided

The PageLogFormat directive in the cupsd.conf(5) file can be used to change this information.

The printer field contains the name of the printer that printed the page. If you send a job to a printer class, this field will contain the name of the printer that was assigned the job.

The user field contains the name of the user (the IPP requesting-user-name attribute) that submitted this file for printing.

The job-id field contains the job number of the page being printed.

The date-time field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the access_log file.

The num-sheets field provides the total number of pages (sheets) that have been printed on for the job.

The job-billing field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided.

The job-originating-host-name field contains the hostname or IP address of the client that printed the job.

The job-name field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.

The media field contains a copy of the media or media-col/media-size attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.

The sides field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.

See Also

cupsd(8), cupsd.conf(5), cups-files.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/help/man-lpq.html000664 000765 000024 00000003746 13574721672 016541 0ustar00mikestaff000000 000000 lpq(1)

lpq(1)

Name

lpq - show printer queue status

Synopsis

lpq [ -E ] [ -U username ] [ -h server[:port] ] [ -P destination[/instance] ] [ -a ] [ -l ] [ +interval ]

Description

lpq shows the current print queue status on the named printer. Jobs queued on the default destination will be shown if no printer or class is specified on the command-line.

The +interval option allows you to continuously report the jobs in the queue until the queue is empty; the list of jobs is shown once every interval seconds.

Options

lpq supports the following options:
-E
Forces encryption when connecting to the server.
-P destination[/instance]
Specifies an alternate printer or class name.
-U username
Specifies an alternate username.
-a
Reports jobs on all printers.
-h server[:port]
Specifies an alternate server.
-l
Requests a more verbose (long) reporting format.

See Also

cancel(1), lp(1), lpr(1), lprm(1), lpstat(1), CUPS Online Help (http://localhost:631/help)

Copyright

Copyright © 2007-2019 by Apple Inc. cups-2.3.1/doc/es/index.html.in000664 000765 000024 00000004752 13574721672 016365 0ustar00mikestaff000000 000000 Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS es el sistema de impresión de código abierto basado en estándares desarrollado por Apple Inc. para macOS® y otros sistemas operativos tipo UNIX®.

cups-2.3.1/doc/de/index.html.in000664 000765 000024 00000004501 13574721672 016336 0ustar00mikestaff000000 000000 Home - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS basiert auf Standards, Open Source Drucksystem entwickelt durch Apple Inc. für macOS® und andere UNIX®-artige Betriebssysteme.

cups-2.3.1/doc/ru/index.html.in000664 000765 000024 00000005671 13574721672 016405 0ustar00mikestaff000000 000000 Home - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией Apple Inc. для операционной системы macOS® и других UNIX®-подобных операционных систем.

cups-2.3.1/doc/ja/index.html.in000664 000765 000024 00000004737 13574721672 016353 0ustar00mikestaff000000 000000 ホーム - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS は、macOS® およびその他の UNIX ® 系 OS のために、Apple Inc. によって開発された標準ベースのオープンソース印刷システムです。

cups-2.3.1/doc/pt_BR/index.html.in000664 000765 000024 00000005034 13574721672 016756 0ustar00mikestaff000000 000000 Início - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS é o sistema de impressão baseado em padrões e de código aberto desenvolvido pela Apple Inc. para macOS® e outros sistemas operacionais similares ao UNIX®.

cups-2.3.1/doc/images/cups.svg000664 000765 000024 00000077754 13574721672 016330 0ustar00mikestaff000000 000000 image/svg+xml CUPS Icon Michael Sweet Apple Inc. cups-2.3.1/doc/images/left.gif000664 000765 000024 00000002724 13574721672 016237 0ustar00mikestaff000000 000000 GIF89a@$aaabbbccceeeggghhhiiijjjkkkmmmoooqqqrrrssstttvvvwwwyyy{{{|||}}}~~~ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff! ,@$@mRe *\ȰÄx^! 2jԨQŏx6q1aLP2%ʑ1TR㆑!F\Q!C JhD iPCNԫXj%:֭Z;ÊT)RcQXcT"K)R )P}Jk$G>Wi`@FR< v% e$G t L8'x! /xɂQo*$4l8<;cups-2.3.1/doc/images/raster.svg000664 000765 000024 00000042564 13574721672 016645 0ustar00mikestaff000000 000000 image/svg+xml BackSide BackSide BackSide BackSide BackSide BackSide BackSide BackSide Normalfalse Normaltrue ManualTumblefalse ManualTumbletrue Rotatedfalse Rotatedtrue Flippedfalse Flippedtrue cups-2.3.1/doc/images/raster-organization.svg000664 000765 000024 00000020242 13574721672 021334 0ustar00mikestaff000000 000000 image/svg+xml Synchronization Word Page Header 1 Page Bitmap 1 Page Header N Page Bitmap N cups-2.3.1/doc/images/cups-block-diagram.png000664 000765 000024 00000151544 13574721672 020775 0ustar00mikestaff000000 000000 PNG  IHDR+IDATx`Eq"ݡkt@(n` @3fL @@ @ @  @? @@ @GM GCȃ_J ٬D"ƍ vIQb$<eL&8Ns^G6hT&sZV/j|<kfz `0^>24oHAAVf¿Iv;R]7 !}sw>f>}_J~GPf$.7JunzzAϯj5=N\.¿+Պ VQX|9\.9&Ka <ڋ8DIE@@JIJ(I@TDB"a1063簧mw{|漢(qz{5Hp333 `2;;;&LJibbRQd2nIҒ+S񘵵5344dfgg ܬ 5}}@J{SSl3===-H$h]eǞP*x?jb3'}}}r">ȇUmN "f1HS7Jɾ2>>nOB'''Eggimmu+gt+(XoW`䠱Q#@'eaYɰ$x\d #̍Ap{{ d-..^yvdd 퍶Q9H kK?88MFb@Z7Uce}yނ~'y#s$~"pssþ+Hڰ h͙67555|kinnf7;P j콾Z ippP׿B wccCG beCcG5v 9KJuuuѶ4dxr9㺹ƚ)J<̿#u."ڿnqp@Z %8\S@۲ #ؒ H$/= 3GGG YhչȒy_kD9 D;SSS NߞٛHN}̡]ȡH*#bV׿B ~?ɮM?@(0 DG! I/t02wٹ`>7?g媒ʎZ`\̪Rd3HF@e[E^0oook{%@n P|TC$8 jL5uKg(Ptkk Akkw`v~[pBob D PwYĂ r؉F]mM󬥠HvY_ORm-JqIu@iPжU=[i8]cŽv A6TT ޱy*,="jVB+[ė˨ammIX"NHNJEhky Ӽ^Zq υZ_V`e41*5Ah #0j0GߍW6~%@Iԧ&LY1hI\hg O!9qFC>M;Dv3>\uk{_?v-e ]ggg .$V ( YKTSA\K*@e@Ɋ!KP):әセ7K9 QtE+mLޮhxo!V(CZ_VdTqӓʢ;|Zs^?L=gʏQ'*`TmJdRz\43=3.skYۥ0z~syyO' F( | 65g9_eʪ şJCLθ>hK#".U!՞ ~Wpzp $NZ :Z;E F9]l\v_ =JV@O_H6S!q?0ʹE2W̽nghzup4eE鱳w⇆ ae5-1t8x<7qvS v*"ؕ_V +YQ軻;}|oLtPitIv!%G x~~k 0 .=)lS&#(2u|7E/P?%?6/.YLG)I @h >w}Qc.|&0Mc\sѼYX*WuU?:TΚ?pbf=+luh"඾ ~~ tSu>읁rAt)I`[( H bHX@W@:f{=Y v[3˞%Ϟo:3oX6k6$W87蛄g`*H0}oyp _oŸF^0+Ȃ0@0ujv  н.  PPj,X?` qٸd"_^dx Pup8|y'>$oO_U:&P5f3tj 0V Dq8rm+gD*%# ΎԿv7,R?5 ^bz^ W BYqy T\Դ {Xehj* F#WTqt:^ӧ?NǭV~@LVKsRDqD"MMM+|ݰ}}_ 3{_50?>>YQ6|Vs? Bp9AAA:R.A1AWZZ0zH(u5k4555*..N@UWW W2W6|=??@B]*,,Lh#""G8,2ga1vrr2M!;JJ Ã*..kqNN3od]>#jy2b/N<\֖1Fbb"eM+tjaa#07 |zyyAQ%#1114 @_XXtwVp-44^@vv6]|Q%%%ZY&8Gny{:6>GVt}SZ?ιʐӻ>~P w >Hqm'`6t@ARRz,O3<L+Rm  }6dTVV =Y#=ɉq Bǵ[qdJ b%*//OLZ'Q wTOb33`<@y+Nd`Bvbqvvfd`2f||<|U'P2 ,pvzz*zK`j+@:& OgߵNˎ'M333yI/Ȭ|yyIp x U *vƇhvM!4/s8dzDvhp-z"krb4侢0G# @$$`aYWXZU`GX˴*Hifθ8v{)Pc*RcLLR?mi U!j>Qhl14n#A! ,%HŲn~ӧOV=XX* ƊuVM'O<req^W JN$"؛7o> k%G&1Lt`$ e?6p~ M@NBTyu%M@ݹȗ|%| D+մ>~~~0fsPʪWƋV52W*tJ}T: [6O` m)6q}WlH7MIuJ+ߗ/_bO䌹 %L=jJPWP09JFׯ_}'lQOiM0VR(2C4Ǿ ٳg[ǞGr>vqq1L?>$}>.(^¢yװj ۊ-L&p6~uuU=/&?Z@2`M9D@{ X?9k_i=zϫꐽA9XC !߿[V|D#5lkזJU3PB`ŋ/oM{M&T’A=K9M-R-+ BjR=: iSdV(biZ2 ;\SoK_K9Oβϟ'{TiLmKmVJjsh}+Y hb:Rr!-J]iU*?}$2)@c)8A?'bGu,~[l&[Lv䄗acɑu>@FV@ةM%OϷ*|4\+NŪ~@GWX Up~JSůJ0vl gf+;l/H(0zrPF/ar5M`$- _@V:ku HM@y 4/L $н%W?ӫJB;!@u8H50?/!U(\b?H<` OqT+5y Uq MՈbJBDʣ2=p"u9 z>|ޚ&%-4MtflQǰuJP@YyhD^ N5I[~@0ƂсHڽ/ѻս|\_:r$PIJjVR Я=SAīG+0 y~}y<9CfO]OrWC,U뽲ĝ"0Čj "Ql5@Ž`s<Lb[pi_eSM6N%OYF lf4UK:8Ɩ:}Z2:D_]i҅MǶm۶m;&:1럍yo:~  7Ű !Fc<@x"?>쿛# D<|7G@,onXpdt4?`Y-ӽ {<@Ox#?># F\|?G@dpd?@71 VZ5A G#?Oopٿmt;"N &vFwM8& pM@@7/n`7n C{tG"v &ErM& 8M@@7p*`t@Lf7Mn ܤ#ֻI7 .Eun@\X&M p=`t@Fr7n ;ݤw#I7 G,pn@<&x0M 8`t@i,7n ݤ"I7 ^GLvn@&x0M !`|d(o6f5j&c۶.m۶msWl{>\c{CV6ԃR9(zS_*< m kjx ׭`r`}8kB{+ܧ}Z'R&4J$aCSjLU7&M x;c1!yܹ|H@ի[;ws{A.׀Nc‰>!P-CuiC4$0[bI~½_ b ;@+ *Qp˗K `ӦMhGa˖-Q9sDpĘRH (퍩N6GBPk~ $)$8@O$IiСhU5[O<=5sUb|ڵTj׮]@ 3F4k֬`ݺu47wLo@HQ|vq@բz:p:TPj $)9 6]"IREUP$P :ѷl7Q1rJBl8?b7o ,YD O?o)&?+2\狚IJFc tӸHR%FQFxzL2l۳BiXjaU Шg'b_~xsba;/X9+d$8@$IilXqN,ң+t?e<Ǽ(D+70(޽; _g@R7 *M%IoER,G\d͛cI%ܦJ {3f@ !Vi2F8%Ey D~c숸!7$IpIҪpUf^~Qʍ:3j; N_G1\)SfEWE W  ?rF>)9pT$k\$IJ+)ޖmԨ/zBCg}FNT&L ٖ4˗U(I~x$οaCcYjH'pT$)i\$)۠AR]}s(v0%UVZa?xXJ=|94 .6@ſ$I ѸHR%Wl1Yƾm۶QyE+_}yc1Q;+kv+9+d$8@+$X>}{\Y&cT ׯלHR2iER,?R2k@Mob,TFTo99 (L8G|I6.W$%'Yk\$)|9 1`UA;vSf"L3FO<Fytvj $)9 1L"I)oJyD|\u#vgE@t?&٩s횯IJN 4ѸHR%k*d I~;I@&e~0VYkdp@1>6W$%'i\*. Zۜ:f 4iBG )AIgj:tKЫW/xR˿`ʕ>l|H0j\*ܹs)(9%%܋Xz¾" cNc0 0/ `m!F,@tEq@3]t[4_d>/2P_R䏥Tp LɌ30嬼~Gy8nB-fN%|iE] @bc7й͚IJN2qI1HyB~6m0QCÇ,Y,_/5% {HJ\5k,ΝaÆE@O(KիW .I4xCb]\={6MO4' Y~=?z</L'_S|H$۷o 9s<^0X#Xf @8@U^ո$D}yb8S2S6tРAoW$Iək qI1HYq&LP; zRq@2RZܤ*$)9y4.iI 'Uqer[lׯ_?|H$H.ѣgV1YoQ?pODs0zH^z >|H@]KZ@HĖw=Pf`ƍnB>';*;w=&]@OV}T)ϵo\U IRrfu4.)I [n{suL*3ӀXO{&dL`-|*$)9yZ$-ڵk+WV88$$9:`Æ >|*$)9yg4.iI v-8Xt)ɶc1c{=]ߏǴ\X^2Zjܰ ?@"4|wn޴i"?}t~~g`Dw;qJU IRr~c^i\~;ٮ/:+ }?Lq7+pFa0Aχp' v`iѹ5j D}s,`jNjժZu;Ϳ08ߙV?r#r{.; 7]΀ߓ? r'I3qǗ`{^]qr*U. oN9੧bpr6t0aW0$ ; u#YDg[$i\u]jh~;\];ws~~8n͛3gΜp# v |H|#}58&<Ƙx!yWlr_|c.#BW_>@dϣ|)pдiO, Y _@;U|~WL4/s;r.wAk $IJ|>l+fmTZS_frc )+Ėxw}@TĞÿ]f$"a|ٳ `A- mp;O,>x~*]-BH=Y@q#^|[$ i $IJHxH}b1Ի/yax~UW裏>}[ cϽK/^ 9*@)S@{Qh*dlLɓ#3zj 9wU}E[?h\wRW$Iə*иl8m` l^ԩ{`&x*eg,p<Hֵ]ve6p#HhG/+P=_"`tys5kV,`n8|| .? \vU㸅^vks?^jh $IJHT1p%=Qe͊:e ߩS'Bwx;%J*$bs)OH>kSO=c u4(cE?1xv@3LJΤ!o߾ѱ&M1(>$.D@{.R)@0+m*ǘf 00&wgg̘!gXqʏc3O9Pzu|-jD-i $IJH7p%5Pk) XuQr% ~i^W:BdD9?бc3 9!@hD_|1+SܮBs{*-+XGbEx X4,? \>  g5|s4I[xb܋l98p=̮z:9Ls1vvXw1Vwy'ُ…  #FBwѣ  ;ì:Y=3N4sM`0., 1" &#4 U{%U ƍ^#0^O zX\/bA==:<\-@cҸHs@ >54Spf]s*n`€zv88f$Iə;4. 0aÆuvxq&1~L;p-o8pyiVָM]s5p0/˘懚ߒ °%K ;~k)\lh;4Wl;; bF`>$Iəϧ T*$2'_~,,.krl0T%<$v †x ``e0nݺo&@1o@X*$)94.K S^fY,1좑5*?;AF/3u ~mYC9ofi $IJ|2pEb z- MF\>մx/鉑7B#PLp|y7Wg\8qoLW$I ynָR,`DbeHeeIDŽlXq L;mݺutpgkV,P^5h $IJ|5p%szp :t l\;l0(smFUb6ϹEYPhQDע!C1EK\-L|H| j鴋M "ѐAsFMtue ;54_$%g>_0p%[@BgM>V@Jge@zP| CL?I%|v|B_v>0Ab)I3/V) 7_q癪eS/(RPڐγ`3`UTК5$:{ ߵkWL'U`@y &k $IJ|ljKc{>x駃: =U4\r%qNwOg}68S#<2{>cw\vXpUW,X&UVPfhn ?ȸlaCԪU+>3KI:餓0It6>@_Bl=sŊA?ݑ t?>ԩS`@+Ҹd9ꨣ^{>N8!8SIv:HTEJ* ΡH4/-[f~X?9vW`$ν馛cHN6*e+2Ν;GoDyp1gyfpy&ʍ -u ƍ9pe:۶mK3.-U8^5_$%g>_3p%3* o@UF8(6,ode˖pDjp)@ڵ^ V\~m3MG)Y@r2W$Iə7 \qÇ(nݺ<.W`^cM{|uױSf\*GvsժUK СCyL{]vb`ӦMXi)\s 0*~.%|H.ոd( )W|_]F'{LR_"'EpqP&s.!|`@[.ָd.\P/ԶhѢT@-x_]衇s=WgΜIyrϊ/* ^xa͛\ۤd+ O^+H  $vhΘ1Fbh $IJ|3p%;) `_x}9sPn(吜K5q^tE7X Bl3B8箮?njFsL,kHdzJ8T~6o}o4h|Hl`Kvlw}89mmxO8O-ر#s!4Ar /@>ُǏer駟Ύ@"`yw}jt1#)N:QEb: )ۣ>/Rp饗rȯŸFz@_ k4i,CZji&l_/g|Hll\KU|J_z+*a140~,u*bϪ9-PJ@͹3n܂_=xGhT^DS5&cO"4F ͋\ 5%[P@|~$**$)9lB~Z`cܯ 7@Pb7+0W$IəfҸdX %`ѢE}H)k*Htv hr||PW$Iəи$K`%H E߈BB($*s|@gKi\ Z(LƸ@K. |HlmT@Ow{Q{15ae0HsU IRr泍5.I 8Hj@bO0:;*Y:uV MtN!o@@ǓX.AhR^l,4vVfݺu* jqK. Ǐڰ`|rכH#x"{Tcx]&|9wJ:`LEE?v>_!au&"ZhHbU`ԄsN2E-,SF 70&kLdtx<.|  QYԤ*P34mF`#E'  1l~2eee G;n v7. jn ݀=z_#?( c?<06k.k[AP@LyB <ߘid۷o$,(;wL uK*((sgR(۷ous< A9Irz 8$}͔$${V/_ 4HEcN<98p@NaHwZq{b_ ?!ϝs/^5z*XpaЧOҳg`̙Ç9݊K.i@3^@:ѓ1'?@kL32VמYr6IVuGC4߿0 ^@:?58?} :w\ A ŋբvQ~{mmm>#]|P'!}x2׃,OZlc!@xQdO+\kY0_9޽߹';wn kLIh̩ jQ:bĈl듽@`g{fۍFУGLt׽*V`ӦMIv0xp" l*P|^3Pɑ ԋkb: s=yDFvW{ٳimwT0t׭[UמiӦ|]J7vZ{F+kw{ =M#@x19_-Z(ZawΝ;s%_m@W5yGD`uVb_gM]I쯘 o1h_me4GP/ 4I5v5&B:D7s낂sN{r*ѩ>7aعsJ$!ιkʖ5@j{2[Ü xxQ ի%ᱣҠou;@lzB[͜ ٸZر#0a/kxZ˟[ <͜ RC{n 9Ӿn4~n5@pWb˜ P`nݺ^_YYY&\֭[ƫ鯩?KSJ$w'7RGXK̂ Gkc'yW뀰Zzzd&@՞^cNR)@x=\U$V 80<+(>|xؚcǎѪO`F xSvz{HauFOcqV_;Nן%˜l 27~=Famɛu?q)tO{/ ?@D ;_80Rވ7Z _Pxͧ>/ g '  ć  { ;  ɛ qAq)/Z6Ho@Q @zC:C0@qeK@?w[[cff7̭ B 333.e;fKio$__):7 ===A?5#(T*0'3R>UYYBcJ: L܁Xe>ߪ; |ܺ3^{-ңw0ͼg_A5_s ~J_HvڅR>5q$#4FDDo">} ZQ\X [zP\T̂8&2o;H ƫQQ k^y_7l{Gz`S䶻+=5y# 1 kDDA!?mB8Nu*772Gjjjv---XIIZ5~PAA>IIIسgao_[[.lFfFt6DI3?@cc#v~߷,EwwUUU^O=^g- >/ cl6رV\DZxԲs}"/1?مJn%AKtvvc,r||\ߖ `2\E][]#R>T5+0D +Q411Q7̯<<@DFZRo2"IC233!sdjlQVV噆ߣKt$P1``6 ges1#""Um Il7@SSD6o޽{=ko9[', z#"Rթ柈"H÷hխ_sXZZ"6-݇s HUC@ iSSS} ̲9קo;iFuu1,oY:rr,I4g'd ԙ?sbq_9o~n|V9cUR$', Q(/@V|BBcM}H(j흪Po-zې [c/2KrqĖh$GE}d;,K@iZFg=5Ԯxl@7\̓8K򻘿GHx vYAQ>73-rQQǢC[Q kZȈ@BDO! bQ|jU^ iVy4cppPd(DDv$-A o 9-߇ BDjP!V b``V`cOD ,"T(0'"[Ruu"t q y?A1X nGדDf}w~柏ul@  4>MJx3A75|rg?=~D ,if }Qi޵_}W]uZ HDlGB|w{k !UҊ$dXэf]S9oWSk+XSEEE|'!88. ?n -kcSNэ=)@"|I=?1wػ 8n23333afffO9ʼn/rĮ_O2Nlo8ة]oЌnQg5֚*O43gtu.iڢh!fp_7:t` .} f>>>ƠA [YYf!@:@P(B"J0{ ,pq噀QF5%.DLnlk͍K+WAh"m_OhllD}}=kn P(H?9,J(,,D=;?kETT G$P^0˙|XWWsΉ ߑB@ xzz? 1coߎV!@:@P(B"U( 0*Oӽ6ؚyU|x:K*W ZX^Thrr;/'l\k =Nןoa8=Giп;kAb.Ą 7K4ԃx Pnn.o>tza߹s'"""^/@:@P(B"'ZYEG㑚 Ba *@~7C1tتaE#K*?e ;}pЀ9^/% l~([󐞙`e, 6vO{=LdSzw7^.Oc\Nn 9N% J7;* !H©Q(mr`n : XA HA!HGx19FxLoe%nư\2֟vŪ h<:c¶UIDء*DB@ ] ̚1mg@>CCCEktBP iRe ZxH`.+ʆ 8ll=UJf9Ak=ZV!@:@P(B"B*h}IV0\v 6ۯ8Yme?X#lߺ%9 (90v@!?N@Px<wr4)*M T5?4;vd~h nnnn֬Yh" bI'/rMU GA#B# &&n5Aխ%:9a Uf24jCBTlLőTF{^q((*(#)iFŤ`Gф7Xi#ӂyyypB@ =EO>!)\ p)P(Hڿx(%%d2ID (++cgib?S^TT!@:@P(@?:/qF[b߶mȏ \zn- ͣ "M8q⧦bϞ=-XD&FQ_C" "k}qڵ+E7f͸`ȑ/(>Kճ4.ѣG{K@tBPo&&n_s2i'DӴD[˗ /) Bqy%%%[ll,_~sr СCy`ሌlQ$''c„ 1~x޽ŋbh޽;GwҤI;caܸqL:2P`0`ĉ裏лwo,Y9w1ߩS'L2xT~QLwyz2&iӦ>ߊ> 鉞={R O+. B@3V!Fy]~zfz_w֍hf _UW]I|1OFC=n ;w{/ロ-]6JkN1fF( 2I8୷رc1gΜV̙3oꫯ믿NI`Ь }w#'OƻDpedd4>S <7p$&&hY" "dпm_}4b_O+=Z_~q7R8`FGGgp'M:qNII }Q<ZFA4Nʕ+;wS:˗/g;v4q?r^ 68M_mtvگOn>\s+(( 1EbAJK! OQXsq~NSUjP;mnx*.l\B9 8I,g9FS9k=8L*,Va2en .#DH( EHG#4*_O#L#}=~iQMNKeh7wr&*.PQf!ȐnKhˠhޝ]wEˁNehς߿O"hf&4S|@7̤04;{n4c@vw!F3  s\8 gJ qN`X7v37jlg6)>Y7iv`Ȁ)H*:+!,C S&M??[{{e֡cp_0 k!~[<6bB(#W> KDaȐ!P/$0P(P 2L|d&Ѻrm鞌km2%9ZNoڴI%@NaIPؽ{%hۉl襗^,[,ǰahFԗf](VAHH{ /* UMdc3.9~AqQJl/bŤٮpR [лC(>@MU=¾6h+|$/?;gMboaPo0y1+MA@ڏs3SyꋍQT5O>vę?}8h׸zEPזor9眜6'=o~9g. BąQ[YBHHB0CΈ8Wmn bŜ[u;w4;;1`@3d<4x_#ERy+KxRz{̍9f 'tVDxYI1`9l7 Y6]A]9UYY;IZ_ȱz뭗|/[jD=kubpp2$BRop?kN5eӖe|w,;7 PBa_6>n@*Q| L_M[n%CW:kֆ弖5W`IHo?я>2.0?c?v]w%0$<"Fǥ m۶cY Fg?9DYuZRJ_X(iS$OBuKo}[$p:VD6vY }G+e!-;o}45]'t4?[ZUh8!k43@4Q\X#geE~_e6t\INi}m} ҥKu& H(x; @|-#d?ن ARn}y/1GHz" qx#q<\1Y 9f``j|DçUY7 /He:'PWhRJV)mXUD:<9Պb4AK׌Yň|8g8$ ]pn$踟]v-8 8!88TYm"}6\ 8gB@\py [P( rf?3dm߾v5D;U4d@<X3188)WXA?].)g9sL|7tC :Dqơ@/q\P39OP P0 1w]H ? >?N?61|jF01%gS_2;;{1:@366l ͮ3ܦpkTX(o:I(M*e+&1[N`ZzmWNG$o߾=e'H8F2Hҗj@t= ͆1\Ҵ8#\YYqW\msw-B(@]| ٚ߫u*ضo\ G>ݶ ^\IҸS_:*@q\K6?wU=bMQӮУ1MtĤĀjӓ1)lOm,sm]W.lzfkNjɈt馤>3G4 :jODo9ЇHj DS*Aa_V>H}+*lgEB/8pᅦe޺uS(tTTYץ]!.UiUcmױذrBUsayu:V\dR658T-1iOۧ|ɟJ3ٜ\\S=vhPuw^2u:nKavb8>s,Xz6W~8'RfY_ܹiӦMA#J|\iD0jP+$)Ba, l+D)`ϰ{ C-@]=cۤyON%Nk|Y9Xm|"1d(@ \t_;ӌ2[|G}-IƩ"8D]j"g;>(?vOqW^9@rVĻ*3* UYppJ%A,cKU^qBYG{:TQؠXkG5\'J+sBAg 3Z$RND@o{pY3X,`ujЫȯxӛޔ2])@4gsVcv*8h(VBç!5`0_SF~Rǽz&H}*ǧuZΆ:V+7JMzgT-RV_GV5+YYU66oUmj@<+xFcZmjnhdgzTy{> ߗ\l;'AN=4Dqqf>gωjV" ƻxX5@5N4%#BO@:T%Z=/`0:z(P,yYF;|3o#CC߁@ߕ^ k HjT4ovBzAvt}yWIF!%  d@[U{D9J)9)ݱ1ZcUjݚʯÝJ*S*RRU)vE#}J$:;wPxwFR3ݺ/Tvū?լE}ׇtߚnW(=SC]TԺun=Q֦ގ^m3sXߠRs]NĆַ;Qv{FH*S?N07i|~8 7$̺1 (4"ۨ鐄J @UUU")J8Tt#HUr8zȀĜ kޡl3 0ИߏZ~t`'ʞ2q;E"4?~V9J< 1oՊ T3ߓ2V;  ŵCM 4#9@v{͛)P' JR׿{q zEP%).,]kRGM\1M%TCVbd\JRWphmM*h%)Z#yPq8*w^GTܯdj(;"Z(N~M43rh`\]p9EڠK߳pԬM _U25<ϛտUYi{(wv/.@ԺxpJi# ɫ&&;/15DŽ #9g%c(@CV[ȽXd)A2 ijw=U)Y(>D;pݳgpԙ# U8VX=AcՎG2չy/`], {F{tGnU{m:9-x@/?~B#J%%tJa"}7.mzP}J&'u> jO2/vt{RXτܢa[17ed?zp_NDPC NC#/(AK.'t$_->AoaTtoB[?*_4PIEѯtӏ+7KJ 5|+p*v7z඄QyF=.%Q{x29pD\i` Hg@4Eَ؁] j(:퓚̀%D{λiwMHZ[Gu2 O^Nt鱲e=_HNp;(3/[ aD>5hfffByyoS"qsxlٲ%h| 0*n %t B]:-4z#gj \`3`@333sO]w;5BiC20 n߷oۃhZWUv/"PPEQ"`5MͫS)AuD ۄ4/ym_(V(IJ݂RScI 03 Q w G˕`( f QwsNյ(\.ZޙQ7hg9Ӻ$}ժm8h\kZ'ګIhfff7q[ C>S3`|tvg:?SoTHCsZ(1`fff8%%%)A.?hx\{S~~*7 /f=Dž筷*޻R*w!$޼<*@deeQlX7pC@uW=())/ҤnF;TY/fH-Mu6v_Omw]q*Rݢ?y [REtD[s+/^k53~)0`@333vR`%`V_MMMI/x nE7 VzR+S>2T1egGw/{gGE3.xYL,ha1\03mnGS.3˝3fJnƯ5T*Eז/e%J&ص C|ߋI); j w')VEsMF# d:6aVr%MB5@3G vۘX`'|ۯ\~l޼H$rB58gZT_p+o餾%3_΃3/YLM [rR>.hBHFy衇n_V "(T;vm~-ӧO'==]myy~;.̀{6IRP?` PHOhKUqS'晍xl<+-̮Z+Y2i|>O6eg~}{vd`լJd z$_K~nl6ώom#bMz+^̧5uu/gHa @B'$#_L5ԦBΆpui|s!ZUv9asyK DGrhBRW2<2L[ ܡ^rTg7\g՘<+h8f~(e{ @B/P &@!kuCH$Jj9yWe%MB}7 ?!6|Y'v'NDnF;>*k}=dw诖V֪Խl^SƔv,RpdddB(]ddd/$AKVs#㺩SSfWG=u!UaX HPP@a%$[T7A;ܩƞy>`8?`:5a-<#e!@d68} {} ;q|>~z0.㨕o @@v1~ĸ%Ή@X nyԚ] @{@v3j?h N /#@ ~_0 `河9ƨ cS"&@X$=j~`&@1| "&@P"?=y`&#݊E Llo*NV@ P{q=j·ĝF/%9 Q~+m۶3`mٶ'=Uo<]g*xy=/P,gj2^}չ`5ڗ3k UԴλnƮٽ%9N+;;fRy 6XqS\춡I|zxU:n2ë""D{VܯG$@D~)__cf붲kC.==W(q(=};$B5r#lt<8{ܻs+/^ύ 8hī!J GD(CekN$?I  1J\Ňs"?{$ɶk[m۶m۶9mGÈk3^>cXur#*OVI;lVM``hh7̔jkkMMMD*FwGߺuiϞ=dv!rԩ;= rrr*A +٭%)++>511CjiӦC)A.]tٳg?y$" ꗊf{yy3ֹupmmڴiߢ"aaPнhѢM/^4E@S'*%%%g=/ 0yQ=j=8ݿSX|rrr~#vS.:I 7Or~y&GYf-mz 0 i /!a{xxTUVVR(յƍ˖-۠B8}gǎWpꛀ4Y b4Րֳdɒ7o޴EjTt_-D!ҎΝ>,aСC;!3)]uu5zAUUT?~r?D}//Jz&}$%%;^3gΜ֭;FjFiZ+W?odXTkX0, {#Q0τԝ3J aa,ZtH牃dסYP2z@QQ:%Rz5U,TH׮]?ĩ j/,,}7f 6CZo?Fi+V|u2ikJ,^=C-8*##' Ύoݺ Ѯ]M'Y'w^;C(tE?,`55 cqU/*ѭ$- Aٽ{%̐)Qӂ>~\K,T691r }۷%1L۾}&v`X0'O.Iu8 عs]@nۯ7oަC#? H۱`X07nT%04ɞ 022 Չ!޽.S$-QX`X02E,aО΋, P]'&j3fRl:`4 iӦ t.07z+S,c \M~#cccô2}||J,A;uiiiߊ7 :EJsY@ a^ ҥKji…{Qokk g`еn\TTT{y*ud7L-Ő2[I#055-  ex0Wy3 9o@sB_'<ZZb h=&Ջ%xg@E $C SgWХ#aJm_SS#Y*((P ͥRJJJog`> ""^t~)99i/C3 ݐT_!#E4 (@ЇTg̘1X%Bo>y9U)=_&O =HQKwyIn~vx_BRB{s"ǒ HtHՉRNO>F,KϞ=Gt&M8=ӬY3_Ih޼crpݬPBb}Gӟ4 XRcX(XI:XRj\.^,Jr J,:E? °B@1 @w)0I/H7A@ xAue5,'N|畬͛ΠApbU穧rfΜy;~I$0;=3dwK.u:v4liժ( `_!1&׾sNȑ#|Njo?ߕ6DXX̒ ,`o}[,.pk ={6 _]NvM7Q;:9"DT{UR 3~3 LD P՚cj)PQϮ >Y% `ݷeԩ{`p>;='OT/}|ʔ)DZSm&OB GW?H)M_#Pû7JK .cS= Q<^ac},#BO>}p k,{m8Z8yW nݺ* P@D꿮!y \289hѢ;c캆ܹs帉4\F3f=WD꿮**=z` \& 8dzWD꿮** kf^PvZl1͌ 2?StlhG@2U :ԇ>5%at8>( vCi_|Et;,Y ڵkԐf;wnDŽDիU)ѣGTT A3|Mx *T#!$P7: $ҢE'Qdy?$>tj3^{{)(XbŜE>cgԨQ)$/܏Aۭc pcj+!@g|eS=z<ʕ+ch#=~B):R+!s97iҤ HܼyoZ?2 kǎt=&c.ܳjժG߄[ Ջߡ {_ "L (]i?O% 'Џa_5^u/Ƞӳ#O\Y>㱲A~>zy'{2dST)VXDYg@ ҰaC|2ɑ܃+NkiөS'o'cp,qD]t|7xt`rm {' q/ ش8aeO=e$ӧOX s bll$.q^ 0Kk0aQ;bx="͚5sy m@P |rl `c?S|JRQl^p֭[{0laBB0:@c257ٳSu^rnJ*;3+Q$8IpyRv,[9(0H2_4~UrcTT/Q/d,M\XZ1@QnǨ"Oؠx"#K :n^@9>{;t/-|ްaC?|p k&p{'N83N6>}w/҆su^&/_D* =ɒfa]-x dg~9`ԩX̜E&^blv({(O"rEIAug+2DU@T-ÿojz+`#X&xX<F.^%91 'Iڵk?1zp1ǏosX'2}PE@V+H}6FB#ڙsvf#$!7n[ZDFM YXp!S90ӈ6 e+Ppٳ57EuСٳt:#k=L:}BQ^@gȊ@Ð*$RaΗj!0!Qş Y$yDiD>D`X>(% piӦ5hݽS(5=gМUV?N_I>o XX3IAXRԁ '( df5jԈb DLR1޻{D d^) * LZ L8BLF$ 'q}3bP/c>Cou%x c;`8P*&l4 FACRG6 *b1ozlZ8Ts{bV@*E 8q} K;ݻwtl,z{N8:81 7ûx\F6~rTҀ;Y dgc E(͇l'tngyF;Ҕ$uŠa3dBGa+Wl|`# %X۞Hh[PH`D]I D8әP>S6 1)lxi5Z4H1-irSl@'RLs,koK}[C{{MpBd޽{Sg>ʔ@7@6s xbdI؆ Dx˗gSt6mH+P?~q |NQ =Y*#Z]pg"=Re8$Y(2 xiv;H  ,mq^@.xpǃ,:5L, .L _"A1"5ktlb%/$*r‚goy0@7@Bqp*H@  *@7@UTM~Eh$6rCPqHff@5[&Vr|Q`f$!w:@7@ }*BNͩJ"!H]i 5(W\wLN&gEYwP/ol TSO{oS_$ɝ`ΨOU*t *2U zNPoI)_PQpʕnDoc]I &PQPX\Ie~kn_vT*Rޙ~ce(---(ψ _3z'뇊5EI>׳DByT. TBka 4e)@Gw5B塉#~Z "RQXAcew'.@I24H8yt-*9oKnjHW8yY6u2T@"tKe8r\C$U(СCcӸa$B &D*PÆ )~KL4Zl4^@YWh$%-ׯB]h^  L`zK"wjr *@P@E@^_{JqGu.^H p{tս* ^Phs]/Pz@s:u}2^TJ&Ff͚Rh/3t0 e2֥7t]VQd3ak9ye(PQ?3W۵k p@0BBkuVx.] @#vsޗ|j@1Xj=#N@EYG TBM^tGE_~Pͱ|4:t-Do6mi-_,xptD2IrƍcbT󁻎qJI5 NDo<ЁZnJ`M9 !?{#.\H8NX"%>.$rKd^̓^zqot݄(Ple:TN(3b5>gΜwX ׫/<ɓ'K+>k |\XD6lr̯Zʭ3uT~RSm6J*.|ǎ L+q.VQbU"1}w3aأ,},f̘KZ|ӯ_?+{#xOnP9 @E#34MƑLN^XqRAW5eƀ݈/<|hClT т 0 ӕx'/?Λ6e=;==4(N]? SH8jJ"20NO4 C=RPSNVd~a\Qw]a^[a J.ZKn{cI`M>ڦnۻk%% .D- !* Yfcn 1VZM֣(N^J"'a{3o\]x\e˖͍N@J1נr mڴhn 1xn8XW :>;z"cոB ~g8qӂ ĉ1c ̽x3g)kؠ&Ihh4LE_B! ԼM )f  ik5Xb%z"D>|B $$ }-.sOŌS-٭[ ! WL\r:'`/yö x?a,UTܛc;vkN:tNMӹ񑑑Jk*b&ßB! bіe^f͝QF-mԨQ%K 89rFlÞX={FE 'ב6I&>WaXݷO}x½qo]!I&S#F'};AKXB`޼yn|ͅf/N`k~Ycw _~XR껡4]t)8E ,;w٣GzCq:gKV>ϐ!CmB!?;%` sCIt'tɫg"M4IujקO :u_K pn눈3f8>q@ @6y)ɌrQtc߾}}O׋/РA4ϗ/_٩ !+;jժչstH0`t'’%KnZ֭[_f`7k/g.좫2kyڵk{ʕ?VÑ0aŋݢEN]tRtFo")]3x[@P?{CF{SWZ\qRL q\]n8: 6l\%ƍ GD jUG }95={@NVF>l5B!#xDphюF|n?_w߰_6`E7mjal۶UӠy1Irӭ0GG45`(` 04`0'`04*`0p* ~` 04*`0p& ^J  G# P:h,K# P:`0;4 0l`040p% V` 0[40p- fJ \IR07lh, AR0ר` 04 0wը` 0k4*`0p/ jJ J JJ < BR0,h,<LR0O,ը` 0K4 0,֨` 040" B(  @# X* |( 0O#J0o0 0G#J0` 045` 034t0) t( |0M# X% T( | 0E#J0L0|0I#J0?L` 04{$IFql۶m۶m۶ ^m۶m߾j*{X NM#_OTrk"@1c,?( J]9./Fd> >ح~oPsc%([q?sTN1w>Nj1WnKػTx! <Ez8:R<‹Ap@60n!`кc4|#4kL]O򏔫s~]9PUUiZ3N 㼌FGn4M#g}:a_&Gjzr=T*mo~. pﮱ^%mldAP(Yt:oAn[wfrY#p :`D4 \ @HJVD۵ \ @H~%=@ `RIUUEXz],ˣ?eY/?s|W{.`b1FP($&Q+HEQ@?L&_+LE@<'Ap W@C0H"%BLDU@IJ( "H !)!R gˎdw :07M73?F@Ia6P.QհZz& =64Zn7|>KM.·л^v4  r  rfyb~jR ~^@@)vdT bnN BFOU^ R(o~SN#]QrXӴgH$=O~jUBn6S@ʑxm׶m۶m۶mcw_۶m}~9繧3I&AR9翛TWWwOuU=GU[-p[c.Q@!eE/{??B1N R ÆP/| ~D٬YgY/aF'0 =K9眾y{] x&+$04]{K_u]￿]n?W+X$"B я~dwiƫ^X3_;„miמmm65!ʲ.۸ _wu׍G!cԎ]tQ7XamԸ馛<؈T첋 Fs6A![6(ٮ;cc9l|xwܑWVOPoox)}_Voꪫ $ AկG]ǭs4 @L))`rokF6FW-"íBp-~ּ&-2h* ޝ^ {n bK6׿x'H:.[K 6 \8sB祥!~qvء)L~m|+i~&Ts #Ln @ysWM=e3f.\Re!rƺ 7{/ekz8n|8mlZ֗Zw?)-֜q%󆄫7!$wK +X#B* ei`9xY$kX0WZVjY^OXc<wh{gg%|Y <1c%8&{-Ts1G3!ԩAo@ts%Ŀt4Xq~ WI >7&l {#{_4Qs_Jeh]V;iM7zm@<L8X d’A.\ Վ24].VfjV׿Kgc3L}9)3'xBX_=/oyxjMRXGV( X;\/o3HJKxNyWVDN{0nU`-2vL'UB)˺ 6VX#ypܳT Kp!N"h,"'cuqblMnALsML?rIDL?Mز[|ϵ3@`m\pM qU%cq;'Q2eFgoLs sN( dh6ߔn"-#Ј 4 + xu`'!۟'qjLH\rP;4MDSJZ eAʫ H(.3B?7{I^+Io]VAr|Jn @!x)-9h{ƃ ('AEc@Up"~0qĢOzr &]IX w,סh+Թpu`S>4U{|,0t O G%֡F{O?aف rh>Y 1xӸ%j֍#uQڴK-* V=G*@4lWy!wEX2a=u9`l0^-i@(.@ K=(G TFh @-VT &<|sYwEb" P{8!9{*)`( @hɭf,KG}tYCa@1>hZk,NH0fm*7|g̅uZQmC b^s X'pSݓ ;ƃ>X k@OƭX|Ln8;dx@!0Zl4` @ vO@Av1 `6Dt#"kkݯ]f!c8 Z`Ҧ2Ɲp!Hp k[ DtB(XW7_ T7^s-/@pkKhPq;6V gl}n\pHA0* O!`q!2,kU%0- vO]K0|~«qEL|k3!Vטq]FK :jY9ʹSD:CZuDsoc}BXP0Vx@Z5@Z]CX*BMNL׮Ʉy"`&66lg4kB `nc [t!M<5~ H{ 9FxP>Q@VQMiAFqRM7ߧ.YD1aP,9’'f`<3VSygeiTV1. 2 #RR݉^n. \&DF,@HXھNX7nJpWԭi\Qw89a(2[pƅ i@wMԴK` 9\}m&o}>aoH 7ylb GF@|xr`en Ms_hJa?,b!B1v'|x׉^;}d1n! ߏ hxba3 U@[_Rr 'XXL 3gΔz@ DkkΕtM"Dl= n}Ml⧣ׄCwp P=%l} u9b?+$טv3L P@!c&,.<@6e C^=X$:γNrL,tϰ궫Ǥ@g|#~AN6r\tH@5qJ#ij(~ŝD-m7ۇ:N4mH7 ]s3f̨L LxasW-B]3t^5#~#5HLox ˱7LQ%kYFkxS¯x'<15 oz@8 1FC1ffR+!p0P@U o/|p_{x mTmw8:@u=(>L83?4 OM{$9Yrpg+FK@~՘֟„ՙP^NGܟ)s~u'x֤AA!LX+EDǏ^YY'/S /| 14RZ p\߰6r #2wZoZ4U @ub2  IQ> t&ΉZ8`wz̓[[ZZ<֙+jB; ( Z s=@'6\S`_GLmPp p(ş77e6zECy,t+7@`܎\I]"PuGdV?#ߵFnNLoP&'B x)j>_5vh#, R#* 2wUr [Vwƨ A-}\.\0u! /0f2\AJ(vw|u86M%@25 EKa-?v٩%ST[o4?+Ͽq+s;1B \Y8L,'q@-'*`VդY`qW@B6~\Xψ9'G&sgI5j8o,fA c% (@ xV3zN/Lt+~(l3ȸ`Ҭ=5@R @kWe7lSy^]c58:rlddaG@ sL+Js@g y<1b vwj8[> O{u%%TM1OQ0ФtVAx~aX{`K&܆@r)| $k۱VIxW>3zMv:h8_P@:kZ}smqc˜ w0`# ^D % i@4jPJs:')@U}_H^b=װ^OlIӹ G zw$mJFZH߿)Je pb?ِrP~l @@}v8f1nW#EQ^l6mY1dY4LU$gJ[#gv~Oo@#pv>?kNsOsW՟@ @ @ @ @@ @ @ @ @ @ VSIENDB`cups-2.3.1/doc/images/smiley.jpg000664 000765 000024 00000033450 13574721672 016622 0ustar00mikestaff000000 000000 JFIF22C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222:"L6Q!1345AUarstuRq"#2B$Cb7Sd7!1Qq2A"a#BRr ?!> \ޫ~5vs'3 :VJȱEc4knn*PZdn?3 й(`xMBfr!R:% 9R+N(fv_\*}QX^Y#RA4f XzԲF{Cf=j{ OLD3VB䡁7 ȆyJ\(qJ⌮go8+1}sЩFc {idJ=45*c1R@i&?39)[ &g"+srP({2Yd⌮goB^E5zi5+kK o`uǭK$k7T:c֠YCzk]{$\苒^ioL1C(h\ұEѢ>$W{\]uU]u;w.~߈KaZ2ZJ O'j{9wS&uƼ{{ܮ{sU? v1hX)Z ISi5K)?/TTSo<xTmg-UbO&m\{Hk"dswyP ]Z*j?*wӋ]yv;j} G-E|(܎cG5S}58tYh \U.F̢x#{!N2$7湫rSYQr/""Ve OO&vyhv X+>_xӅ7ue@OXo`uǭK$k7T:c֠YC;ES2;3a떩)dd-Κi]u^$foWQ:G%M3TL1n  QE~K;]=8ҵ:7劬zw#[t'rȻT>Z~>J(եMz 2ڌ5U6Ufu w v WO۬qLBvt4u6v::|I,8m~8\MƆص%u}tnOQhivVƈLTYݚza~Y~_C1&tZ5I*a/ɨD:'Įd\~4ѯTG}eF50=Ul&uu h hqrS*q;ջ]+11;c|L}%ZcM]NnSXSRGzo.Eʋy*i5cmLrI{DxHDoJpGlZJDQV~bī#SE>9}Wߤv@f XzԲF{Cf=j{ OLD3VB䡁7 ȆyJ\(qJ⌮go8+1}sЩFc {idJ=45Bz 25?0AEU9t#@Ӭ~ #".5;)UNTLEf+oryOcQb=_ծZ,mmMͥʪ{UEb;yyD// j5ؗ#S"! QYADj$WBHѲܗK2#vuUs1D{ijHoqź#®^-F+T&DM>?C V#j]g"ʆ'aQ;=';دZ=q)ZZ-Bƪҽq4/ڦ֚&:Lk11:Hz隵J^'LL=DU< VR];U?M?ivlm{:cY7G:t}FK6JʲBBқ/.ԉ4ETQ572 so_'&Yo)#*m}ԧK5!1e?T7~]fSi5)|?g1.cƛ]Iᾊ5 }fQa2ܪڇ+-knNTF9kGj`#Ra NLF~r[ʪ꫚sQQ~mlWVFLR">U*jOt}uFF Q:{jҮ^PZHo`uǭ@Oa7 ȆyJ\0<&?39)[ )CQ'ev;|/z>(ԬassM,X^Yk4Ֆ,r6$fK&[ T6yV5ر~oEjvtZDzҀ١7Avu?F;aLXt9+a$QK6v%vz}û41p!ZdBȋ0ԏ}r}nT_SJĹkݚj;χTEջ-k<7}ϒmnq/i<7֙OBr*˵cDs[Wq.dul,έL>h:h6Vaڗ0nw \j9KSYO-JQ&' B(/[W*>1lbu@F{Cf=jY#Y3 =&g"+srPCFUY^_Ss0tZio~Ez;i3s34Iyocj*3-5EQH\)*i"616&+7_bv?2"ftzgɧJKEEXqXr"j)%EnS:$Ɯ@7c9'ܿƍoMb9Y Р9YVTA{J牙vvƈҘ$5*c1R@i&?39)[ &g"+srP({2Yd⌮goB^E5zi5+kK ]zVgW5\_%JC+nJ}ɦ:U~[|]&5#\wq?qa> WŠdF9Z殺*k=\{!-+'!^F!Jb$&1.DnGEYr_@}몬<>][bM&zLig\>xe! X IFM+[-Ȏ_ܟE4׳0*T#LCt7R-%jf)Z\OKGhc+ zu}?#:vpx%'=NY6rUgRv/MֶSFK#rp9d3 "]EνS_gQ~wխZrX\UvfOQJKdj_y͇zխ nvM;;VnDccz&1:jV^h)t(,l6&DDβ؀#Y3,PZdn?3 й(`xMBfr!R:% 9R+N(fv_\*}QX^Y#RA4/-ƛ Mb?D5OKkl|x0!Jܚr&?/O(**ʛǩw>2⚧tbToQݨ2{jd9޲qM1ЫƋޛ0 ~ j2#Z+&?qR5MEP(1A QcڷRT0"ؖKbK+YREX }{˼U0[KĹ9uW5ns]h*ujT{oȶ#JDQZ=.Vk:`^#dUUd{"h dY91 t/QO-.Evv#>ΞSZ*:Ovmt|9Xw:bbrqwXz, (kti2?gjNW=u]rݝjL:YsnOz]>B^O1!nDO܁o-d;%g2jF5ս2DMV'EǨOHR[s7Nf6fbOEE}͟]uy/a{+wCD͚'Zxu׍_OUFA,G++[Uu}CCH/;4k#7BMF'mCFXK-ڹJj#/zL&6'p2 &Bd65ֵ.DDDC>)N%wOo,ѿPZHo`uǭ@Oa7 ȆyJ\0<&?39)[ )CQ'ev;|/z>(ԬassM,X^Ys2ЫK]NzTjjBGkWI)S4ʄ+0cھ ET6'iUbowLs\8%.Be{.Ԋ^+l7n.[bx(LLNkQ 5FAz=7뼼{T^vs obyl8<dzUkKuȖQLK#"];?LHG~zbaR~C!RcjXIĽnZ94Ͳ;?.G5uPmvcmvW&/ƱLOrt韤wߧOѤmk"*Rgŗ1>V-cڭr/)GEۡӥf.E UCo){J\S\w:9$=;%8|9YU]tnu`>*Ecw[#Z:&Upho8bTOhOE%v 6HS*ov+õOiDD~fc);fQGvxG<}娮W{j[/USn `cDjHAz2Tȟǫϵbo\G9QL:C;]K!f$;&/MXi0/UȆxyY72oUzb) k7T:c֥5*c1P,MBfr!R:%  OLD3VBG#Pev;|]1랅O5+kK$jV0׹9@j:"j Pc"~/s+Z'SS0A7%Z9LӪ ZnsWyMۗ6}]۞1娯۬UdgкnloGAx6m5kLLLN)tfdbnHOV;P-tS]3EqO].j̆^:X8}SQ{L)?scGzLB[`tM`m 6z'HbiD,љv2:|bB**_fuQFKEdD"zwՉfLu'#hϽ.?'U#Ms"yŘܝ_ڻ@ˏoʪSWv^ԷW iv=)~DD|$ZIՔvƿ̽q-1]1Uqt}e]t;z(Q#d0+܍cu58<Dzt*Щ몉/'!Chm+K=tQ5NįD]BR(2MYMe\65֥K DF"""&"oӽ/x7DphEDi֦PZHo`uǭ@Oa7 ȆyJ\0<&?39)[ )CQ'ev;|/z>(ԬassM,X^Y"t8kr^ El#PXj+dV,Mg} YUU=aIqr敫F*/kQRYS2)WKA~Fb9ئ.Ԝq[XWUoNv +*cVclzu5\HRIQ Y%\ D7]`9c?"?r'ņh8`$hYK{$`U4uZϋ5!Q0VVĭT9tX*"x읭Թ87kd[hRÌuvEj*7ݜ}NdXji16ȹQ.Чb^fGWv Ьd4+ f'.|tE55NS..W7.33b""4arPZHo`uǭ@Oa7 ȆyJ\0<&?39)[ )CQ'ev;|/z>(ԬassM,X^Y3F9]5MUUC2**i)c.4hVF@UXVz W}P%9yIiF+%Aj6#SܯTF{Cf=jY#Y3 =&g"+srPC(ԬassM,X^YF{Cf=jY#Y3 =&g"+srPC(ԬassM,X^YF{Cf=jY#Y3 =&g"+srPC͛z.LŨѨ~͏sf޹2 j4jscٷL͛z.LŨѨ~͏sf޹2 j4jscٷL͛z.LŨѨ~͏sf޹2 j4jscٷL͛z.LŨѨ~͏sf޹2 j4jscٷL͛z.LŨѨ~͏sf޹2 j4jscٷL͛z.LŨѨ~͏sf޹2 j4jscٷL image/svg+xml Scheduler (cupsd) Filter PPD Filter Backend PortMonitor JobFiles Web Interface(CGI) BerkeleyCommands CUPSCommands System VCommands ConfigFiles LogFiles Notifiers EmailRSS LPD Support(cups-lpd) Printer cups-2.3.1/doc/images/unsel.gif000664 000765 000024 00000000177 13574721672 016433 0ustar00mikestaff000000 000000 GIF87a $, $@L80Ik8ͻgdhDp,fm|pH,D hlpШtJجvzT`L.r;cups-2.3.1/doc/images/left.xcf.gz000664 000765 000024 00000002252 13574721672 016665 0ustar00mikestaff000000 000000 Tmh[U>76k!VgnNI9imRӔ*-uSQ#"?]unܛä7{νioo{<76nrylߨEIu+ V WZ!Fؘ"FA3Fl?*7۽A߰-TNG6?N]!_?VC{;uutUc8mu=ot֩qv5F} ]#nv멀3݋1g6n%K8LL cvLuF+Yיg/hzjgך-&b`_iq--Mź卍9˻,Y5Ѭmd_:$~ۭzoP鯏)<9g!}]u`Xʖˠ K5Ycyp+l hc{dfg|eKRݻ}ͻ[7;qGx`|vjŏ;3?x=0w:}Ň&I]ϮvsPw^)?y/~PB X-4bk%IO9dTP8]xIY? Բ^JĺuƜZ&&UZITZ&9{N?ٌjW5N3,Ҵv`JyRu?T<ѾE5ӉxBmQ!kT)48Fc:FQ"y:(@$"! jDdT^]˗0ǥ}ͤ-|D >/Gh8H)Ҥdd"a%Cĸ!1EDŽ Bi珄KhHddI[%*mCd]kK%-P.nGsVQn #.5mS)6%RIv&2GOK` R'P QF4,ekLHt] A*XN3Y]cups-2.3.1/doc/images/raster-organization.png000664 000765 000024 00000024007 13574721672 021324 0ustar00mikestaff000000 000000 PNG  IHDR OPLTE #tRNS0`P(% &}ZwXTx9b[@Qi3Ʌ~z,"E5!>F1R )q8'hU*=r}wVl<vTSNv_z? Bʁi( ]۶m۶ެm1vcU!3|q5knz=lXg76}S6ofP۶}G.pscOJ$+-*gm#0-2*Eu+8C=!R.w1XU|&G]߱l.|*z<;ug91C-e/Wd?Y:GW9f0*ܠ1T,U/%QΒpʺx5#&ٹ) Hwots JB}?X_^W|}7 f\!i#^=5x-1O|,E7.>Dmτt9ْA2nkku"?3>n8k 6IV1+7^א /P^,.䓔}jocy>P`>1[ Pլ!-뢽+y+}>E:{H\H܃1sTᇹͩx;+M_C2VԯX<9_۬io19cv.'YzͭX=C[$rf+!a|[i^\_<>|X5!I7IEY’=c~WXQ|"=qJbs|cg-^2<ʥ?d58 ayepCVb?uՅj._KݫZAeU3EYW$‚o){6Hڷ<I]g_~O=*f 5F|<af|}?q/v؎߿vX[5v*몆u%wυlc] 6fz1s7$;QR )R+=3 eG^Uc,|zϐcga4dG8_#;Χy]Hi'& eh*qyeeQ0@Ҿ\68z?pT/[<,k8Y̸ٵC(ǫ"ZmV{ j@d]Tj3ha( ʽ{VٿXbm{X|σF!ɇ|7!ґe])d*B `>jch |n\2÷,?̲UaO|@*HyflO23l>w0*ohXX9\낷2\V _H(e3w 3̆+}1*J$? Xn᫇Sd<"^~̙i aZmL ;x:or_0}AOd '))WJ7L[xkSE>5/)Sm_6_u:M"Y3TȦ@®8LkM[264i6Rϟ>\\˵`noȗ̿ 4a# `,}nu{{ϗ˳ 86Ti*&q2|t{,GEZB8c> h}IJDXͷ/fޛ|u50|97-fnO}|ANyawYr  vg/]B.bwn2\?6)Q|U]iqC/-Wv-ug>^I)nb70|@:'?#jX܅/hP;9YJM @M4u:ﮝuPQL6?q" 0UK"j ڎ>pt`@zy~°Y`jA{by^ـ>m49 q\/B|g_/=x%[':2k"p|YZ1N|J|J|'>))OOO|'>%>%>O|J|J|SSħħ'>OOO|J|J|OO|J|J|'>))rSD/c-?SuW7O|P$=#>))O|SSħħ'>%>%>O|J|J|'>))OOO|'>%>%>O|J|J|SSħħ'>OOO|'>))O|SSħħ'>%>%>O|J|J|nM|J|J|'>))OOO|'>%>%>O|J|J|1{vA鴚\bK?}'t~iNg8F\Y+W^' UQX}J$^Bg~xU ?"2}AyVkF.[Ze” p?|)E]I SIts.ݺUMr-p*0˸ǁe) ?ʂt~vjBFO*Ávvr8 ij:ķ @;{MJo\Q哩v[pI}y Xwe0O]{'LEhbX-c s 0^~pa?mxnet^|Ș9\ qe *UO|CºZ%&(EoBZG.YS{:uU0y VGn4)o6X fQ)2V/t?vӴ0yLzljjjv }|[Yz%<̙1,$1|8O`sۭ| +JYryE/ _A.4|}ᡗL+B[qSn;⇖Ν;?@E_Ta-_N{VFύ[^>O|]*lÇHG{x֏y&KHKZM>2V;§6V|ÅbQH) 0UkvT5iî[&<8gTaGӑG8_i3'9z04up|Kqx >M߃W2mώ=W&Pݹgl\/e۶m۶m3m۶m{i~nO>C>O>O>C>O>C>O>C>O>C>O>O>C>O>C>|!'|ȇ|'!|ɇ|'!|ɇ|'|!'|ȇ|!'|ȇ|'!|ɇ|'!|ɇ|'|!'|ȇ|!'|ȇ|'!|_@!>+|?A%=8goHg+a_B1q%)H' \y V.`u V VbuեX]`uV.V.X]`u`uڬ.X]0cu`ubu.X].X]`u鳎zC WY)OnWkN_F RQ/Szq^L)處?3m?I1xu/A x`l*y{([禲kׇb58ǤusBƮXPO԰3'2,5+^7vPqd:7﹡]MӦ[Sh)>>]#z5y'q̀=YJRњY{B)czRՊ?r,T%=.AtRLMәf .c OU/YǿCB)ړIU?cSNJPZ=~P񧥎7=?dC1 yzu^(Ȯz= { V˧_  V X]`u`u V.X].X]X]P V.V.X].X]`ubuՅ7 |ze.X]X]ڛ%a~jiif||\)~|K)x|!'|ȇ|'!|ȇ|'!|ɇ|'|!ɇ|'|!'|ȇ|'!|Gʇ|!'|ȇ|ڏtyV?}Qs:JTc~u>Z?ʽ>;ٯH( û0۬m؈ضm۶m6]Ϫrܴ,2E$b;Wk1T݈:RD`q:!)Bvv@bgfn>(<7t YM>T2h=_N+rkCsϡedM/NDTԤx"ĥN8|X > kXTT|9xt|m_Ì,_Nj-'|fz}5'":,`y|_\NֽT|yomDCYp'Tդ95J>4尤z >< r7Dt&|xʍP/c\R3(|UpZkκ<0?|{9;z2igoWI|_w$9,Ck9)=ֶQr퍄Ϣwl^Nrhd9o&JSRDpZWN_iثՀ?Zu}!E\xH :Cr]o܀PlSMW [|'|>'|‡>>| ÇO >|O'|‡>>|'|i>| ;הRﺓ4u I !iƇO>|'|>'|‡>>| ÇO >|O'|‡>>|'|>Ç >|O ÇO>|'|>'|‡>>| ÇO'|‡>>| >Ç >|O{Vڀq2m36uFm۶mݱVI'\[RB[=2}^kSzwlli|5mA(3{cxT8y:DI?$ɧcn{M'f=9c>)&;ybo5]LJ |.q8tw{[&$gd JtϟUyoA6uuO(KCH@ ;Arq+G GQs,3cs;glPH=*_>./})[r|;fD˖- >/PY{g[x5ӝ!|!V }Ӈ:!ל#_0 ^|"%HYgɝ{Кi<$  DrI>h܎|p3|_t+ ?ͮF / 6d?8'5l--]3yY2Bt|[]Crg{61 0M!-Nq^b>lEnre;%hHW{.Eow̑ϸٝ5irv-B*GKg**AvMQq]=bqI'*'Kyq MwC79'kKV [-mˇ$_v d煿ߢsO[""pɇ\~CONOQwq.4ም.o_FId|fNsO{-ZLm:}h߇+8S|nݺ5![4룬w~raOpkˇ_g駐ʖ'} s :@ZC>tk(ޓ\ ^}l<=kh|.Ue#1)>iBij?vIm ia ?$o,@?OGYi|2MX߶G/P(r~}Ї>}}CӇ>CӇ>ӧ}ӧOЧ}ӧOЧO>O>}C>O>}C>}Ї>}C>}Ї>}}C}CӇ>ӧ}Ӈ>ӧ}ӧOЧO҇>CӇ>ӧ}ӧOЧ}ӧOЧO>O$q?D_˾`.ضbIENDB`cups-2.3.1/doc/images/raster.png000664 000765 000024 00000042776 13574721672 016637 0ustar00mikestaff000000 000000 PNG  IHDRp8EIDATx1 A1@C4$ 'X@=:P @ l1^5E.$9$I$ p8I$N$ p8I8o\w:j?쾇O"Rm+f{5ߣ8p@ p~~?p?p?820pp8p89p@ pp8pp@850pp88p8p8p8@cﮣ:ELpNff> 3333satىffTfkF\)KeLnK@z(ײ5p_5vf] \n1BVM3ZDKkp|\.4J%hI2д an+bfM 8$vM|e t6!д5:BWfE 8p~!<_7  OL+] Ry=w x?y܅Nq{ 2lKk9p SYF:_- SɎ-u=Sgtl%~ ?k+D>.TT%([Z!ddyKn660^BX¶6i ^ \ޕnIs]U ;+l*BlQaZIs(KZ\.vt,|h_h)({˼(pwրKm睺yA]+1!|"><$ǚ}P;2^G3B_TTWY7f4M*U\~rSt~ &I~*̀K[eJ7EEO6yPNpmzҺ74lF&Ofjz*BRvם>uw6!/LꞿF_3wUcY7+lmud=R!,bk[[\n63Utj6==j',\XWXTk9U>v2.}ѾSP3NIu]EpfO7T*fVBי~ܫ١\xPcwQt@A8Y YT pi- OWqp @EXA؁Q&pY&E=?o{aNjf{He\_ˁ1K|xm/lD 8¶NnFlyй!-+Z|| vj&p)[p U^6H>% py_6: afГo.}[0{ Քpi-.o+!,fj)[9pFg\.o f]uvJ,J̘2.oV7 f7pwñ _ETfdoCx8Q5$M?w;V~5yߠ|F6pj!J ;~&k=`-pi-nop6ڽ{.m !ZO@ͺ|5Pa aD>J [i' 7^,, dedY h!<,v6%o(Om8³%;D'{͎PvW?,l3d]"骗wpRٚ@VE ( g1pi-Wcw}V3Q2.+n^¾m3p|Wp?c;! ;U H:ZSJfq As^)t1Dqcw.N?֣NVS/laxW"xApv^+KbmW*Bimp7U50yK(S4]w@gXNX#&nt ,(TpNfSVrd{UvxpBצyJB 8EXp7)UOM>SљJV s.,jBE!)Z0g[Q΁~-~`n# yϙGd!<5ˈ|:#>MwPiJp`Ga_fς̾Et%I6:!kV6:Xa3z Tpi"zS4ٟ7ҍa2n>ө  "Nݼ^۫!< )iU 8YMF7ݜ%mG8A9%ֶc'=?DHn-&Prd1n GL<.e7r h֒.zѬ#$S / kBiDCZ=,b#y%2Iy_ "j0x.Ap;*( |n3DpcPlbQN|7ɢN;`',lfyGn-զ% 8am~kdlm]b7$jQ nՕdYl 8Jp&K7hg'MjA&_jKݠ*XEY??QB- p?neu(Jڅ1pQKd̆G2b pS6qi00%>'b?;)i :)f{c+9] f$g]a3;dB:9Jp"frK"GhP :mC3tt9 2##n۳Gԏ։oK-xZ q6bns/ JvIVZB6Xl<>eY/nL/S+T)T+c1;O2@d_OMmW& 7qL5RѳW m5_"Q kfRq/z݆,WESQ'&\ƣ7s]Z⢖I]  ?\un1uØW "YxѶʕ'>'労j݆0t&3FYV]uгbyKh!ݩK\`tL.E_K?mM1Yʌa./Q?߻p1̚WIbwBD$G9rZ#G9rȑ8G9sȑ#p9rΑ#GB2+q9rDށ<ӑ8224Yd2x wUX9OO^WDBї ,G% !^T#3?)bk_s=W.xU|[M\HQ?V/.J! 5l a<= [+=P£WYl(1\d*rH4Vh(\R L0u_$喂GE161p{6(RwbQhZ?Z>?n8;Eh/!tO&ipDR=,'V!2bOv/a$_arTY]#ݤ ^!7e21ӼæoMD֑(4H$ul$-=EӜc;ӿLRE4z}G@6Giq5fWS ʰLQ{D5,!Dt^bL (=@De&)X7'6rў؃UmR0HX2*jm"ggkrG09 DZRӏgs9pĤev T%D:Į´# 8,Lo*J A8퇑u+kq1c$pI'U;A\R8' 8"eյR-؀;F< 0k%X+-~z_ F=K1hE;x2}~P9$!Atan_)6UdT wMW7es=<䫬c ܼ*wivWIs=zbp,UHU $fRYxn{6V?iCb] |bgppp""i#sl+?<\Ʈ}h VP)h@k~~bqфX. 3\ βԦ5c@^a9r |iIw 9JetzPN%pSe>hn 5Esvdof!+B9AzЁf49 L3˜jB/qqIJb0zh7YZTc24 _\ 8ײE\6p\U,a-3ЯT&}D~T'+3cI D܅[tbl.񤙘J;Ɠ`"9,$8@@@@888@@@888@@@888@@@888@@@٩C0 `ڱb٣iEP>E,;V/~;5گ+F㯓qR=۶_;pǞop~e 8N8 p~g?p8p8h7g?p8p8H`|8p8p'0p88~g?p8p38@8p8N?*<n{?M0]>(-x~雽D .A#XZ.n8Rܵ-687w.B7}|~gfgNyZ`fN639z/ljgs}\@/Z[ppu\}E;w>o{ +QWWWrZwu~uC {{M3Jm g*;p}zԌQk;͡zNJxX8Xo2]pτWmȦ)ڕ6Տs[4*=lAP++{W E6+zˋ 89 9H vu힖ɮ}|;9?3DSboX\܊\\.!}sS(ms VZ;V/aO6ۅ*Y xR ݤp&ppU{¶Z*wr -rݳVZHZuDVuv*Y N+5ipn>dh6H 椭VwTcwTz ߺAxNi`!.o& QNisKe3PQ wRYC:4ۦm kjWGBxCi-4 ui!Sޚ¢Ɠm#F…d}G pWm߮T݄~ޯ3>5Eijbא: w ; }TөZ kw,Yn?I^o^/~ p'ndA\yZE؆fZZaF[E}GXÜ:ߋ:YNfdM(tnE%/n|G)/(8_p (mw\^ӽ[ns OB+4c_ J#0ikkGk-ZL$XM 5/Z/&ʙ ?6LuzˀgE/SO5VKoϮOnfu`e?->n1@[Kz!a}p,.T5pᅚ[D8Q93ma9Ӫn/`)fO)aK -&ҌFuσ;3@%܂^†)5D^[QԞs&6s)1ʙJ{niQ%;(hS:²Zknpٛ& w8!p5 Y3=O^`Ŵ^zmgcs֨lJPI~^r`| Zj3k2t̫N{Y=MM%p MͣQأLw&)–J[R]uB!Sp*S'UWw{ ,ڄJv2n=/vqpK| n'k{aQ[pp'g0/@](4Rfua'&/WpY VܖpnAG:pwTKп8neh#;DZ4_UQ\)x?t\ݧE95vusұ[nSN*Lp;kaJX 2U3spB/ ;z`HeKc2-_ws kU-D1Rٹ_V8~ً }LwvkAMFtӭv𶎵^Z˄&AGRiPW\~lI8Wj?V\ PhdQOws 8@`/+F7*0y(aLU&R7lnjMOj)+Ke{ua Bpzر8{PWWcS1u1)+֫Ym^:ojnYp }tVmﵪ~9_h?jU'}{~)VeWWXSIk?_u $mrp/ o$:d.nFمEU!-е{3n%k^gJBֱ~|p{+W^h6dIEw1Qep6m99ڄϘ/,\n.[{@,sHL8 !uU Sp# v=qMzK 1meRZqHݚ]~u!3.C7R"poXVh fUb)aMs+r5ip"{!]8N}U>qKhy*lkm0\;Eiau {inիӬ$w^^65{!JkX[A? i~]dH%IJ /I =-qͷQZ*7{naA_\v޷5<_zu КNh;l3$ =pw~ ƧGo%k2J*_{.LʻQX&>M>ҵ W/nÒgkn>΀|-=Q&( E p}})u k7g VljF[ܶp~M_xykǝB]p.,Wܵd$5[SwMK/2fvE?*B1 7Ϫ’n5 >w{v(& a0Z. 5nh0Å1ZkI3%ws+Z3ލ6NjWP']!4j)9o; 'pi|TQ CW['=`l?a=^N9MSzdVn^Uʂj.p.o&KTTU 56i$pF ]O'K/Nz#ܹj' }p"]$mj38s!5!i0؎>rQ~&|ia-iGWks ܖlj _c=+#|"FNk:=@{mfI!1Ocvw :)/mRNu\w &7PIl'k¡6(.:S\t&e_ɹ7ZPh j|7-tnp 3VB~l'Ø*+T[:ɰNnjޛ~QL L/>0ŸŴͧR :%5wǽWPpA9J|koPWW\Q8(w~/IaO)O,; {Tkc 3p }r&^7[H3m>Vwi/VU.w[oJ_}<-xC6> ^T[N+5ST.RE-})t-H΀3P؇N*"󚔉~;[Jyh`#Sk{*Mq*um-#4Y.,[!\ip{>SOxUsxPb'C*p)mfwo :n+WB?/U.rsnt\Yp]w H.XqU*Ui(+mgs]Y.R| ׸(wpp{MwOajAB " 4Ĕ(oQ (BD ! f s4s:^Ow_vnv_88y8p888p@ p~~?gg30pd`NMw|RR'$zJ'I8I$N'I$I$N'I$^nW5bܨFgey#_3¤]Vez~|˻z_!*S˕TV^{ykshYCez~큻<΋LOR; 6Kefeff(.]f2Wffnm ijd_;"UHg;lKϛi g}풀)`IRbB6i< KYDί@n Li"׹Dav^MX®`/Е9#z^ֿ>B/kIRBM#QjoAB|Pq46V44µs 'ib7n\%E}y̨eDY͓.C1)bͼ'Rl8Z:^ J u뫓f2~^f&I$Г_Pwn)i3kBG Ns[VkN҅hXt4JEs˄:W8b3e$hFTAp%?ޢ3L4JAN/IxM|KM>c%x*5^HH-*Hn.3TȤ^ 怫NU42ZaRI[T/([T puZ T{Ij0/d)fb,z|wk(R)"98E*U 'ZqQiF+A2eq渖' T{EO }wQ 8B)|z,٠^UCZ$(gj "څ9 _x Όp1t<3EOUE82=` [Y "g4w'\9vqZ։WSD8 ֿ}3*)j=sK$}"=~2TiQ| --l ̿bP v+?2t]xs2di ӎ:~|A|4Ŵ+[-NdSv<~A MZ_Kwx߿C1Tz ]y[g 8 @-l|XXXX؀gaaaas7R6M zqGSM=?Xp/ 7$RyxV(-$j,ffڀ 0ͺp^Tp ,˙~-Q׳CH#!.Zi)OѺ ų<p%$VLTkp}kҸ,,Wf7i~ni^hmQj5.D!7$kOQ(A:ܽEʳzeR Fα[M݁ ʵ=zwx p{QګT%^"<7Nwb.Ƀ~/Q0݀S*T<ࣄ gC6;c4XKwU!{%2@c u)nXeZZpAG:UqrI/RF' 6_g`=V;y#, $Eh{]}$4vḴY_YG<k/ԋgO^6&Ch>bdWɗ8' _{n<L jP0j)Q( cN(ˀ^<n۝:'R(NN&U*K!fep/ u6Xk޳pp/ x{9(u0ӳׄ^z߷BgrbVD6WTSFfc\`k9eUa2 FYRu]|[N]A}8B}ޯX5ݴRG% M91Bh3}ŹAkޥLPg94GV2e FhO`a#$ءBsiN.p)J3N\+jsQҔ7Nj2㴳]FwQb_ g9D=d\+2^֍o}~L9a>H t+p&.La (J_U\b1OӍQ: I"DAW߃{xSA 85XN}F2 F)FK-<*'0x[܂@p@pڄ_iIENDB`cups-2.3.1/doc/images/wait.gif000664 000765 000024 00000003422 13574721672 016245 0ustar00mikestaff000000 000000 GIF89aFFFzzzXXX$$$666hhh! NETSCAPE2.0!,w  !DBAH¬aD@ ^AXP@"UQ# B\; 1 o:2$v@ $|,3 _# d53" s5 e!!,v i@e9DAA/`ph$Ca%@ pHxFuSx# .݄YfL_" p 3BW ]|L \6{|z87[7!!,x  e9DE"2r,qPj`8@8bH, *0- mFW9LPE3+ (B"  f{*BW_/ @_$~Kr7Ar7!!,v 4e9!H"* Q/@-4ép4R+-pȧ`P(6᠝U/  *,)(+/]"lO/*Ak K]A~666!!,l ie9"* -80H=N; TEqe UoK2_WZ݌V1jgWe@tuH//w`?f~#6#!!,~ ,e9"* ; pR%#0` 'c(J@@/1i4`VBV u}"caNi/ ] ))-Lel  mi} me[+!!,y Ie9"M6*¨"7E͖@G((L&pqj@Z %@wZ) pl( ԭqu*R&c `))( s_J>_\'Gm7$+!!,w Ie9*, (*(B5[1 ZIah!GexzJ0e6@V|U4Dm%$͛p \Gx }@+| =+ 1- Ea5l)+!!,y )䨞'AKڍ,E\(l&;5 5D03a0--ÃpH4V % i p[R"| #  6iZwcw*!!,y )䨞,K*0 a;׋аY8b`4n ¨Bbbx,( Ƚ  % >  2*i* /:+$v*!!,u )䨞l[$ Jq[q 3`Q[5:IX!0rAD8 CvHPfiiQAP@pC %D PQ46  iciNj0w )#!!,y ). q ,G Jr(J8 C*B,&< h W~-`, ,>; 8RN<, <1T] c' qk$ @)#!;cups-2.3.1/doc/images/right.gif000664 000765 000024 00000000525 13574721672 016417 0ustar00mikestaff000000 000000 GIF87a$;,$@z̥1 :RGkt^n(.}κ :@uA,:5 0 ..V99:::-!%I6: :2[33uw474: 7b5+OO'#(:"A;cups-2.3.1/doc/images/cups.png000664 000765 000024 00000006516 13574721672 016301 0ustar00mikestaff000000 000000 PNG  IHDRPLTE}ctRNSDXdo{}l[J9(PȐ Cw5pjx vK`^/ =M4OE, !Tq׉@0QI7%ڼαyzGʦA3et>_<i nH#kB ;Fa*SL'+6~䖡1ø"]$⁣W28h-|?s)ť&:uYҢbfRVrZmًy3 )IDATxSQQY E} 8t$+‘h,HSL6'bI)+Z5[Ft~jwt^d|oe;D{g<)6 P\!owl'q`ื_Pm?w [G'%*ZCf4aNݛ?g{? \r%c}ޜwrhLU9y7mr,-u{d1M`L GPI@/&R.8d xr@">wGl<|](Ͻ8וFP3H}a/z{1*x3h <^p^wMBO+k AO (w]|}˵BAxjrQ XwTUu-QeV + n>K85 jM{H= &p' qƶֶ]^ 𣦀|t~~F gɼg982>&r ^%:|KX/kz|o-YKHh|/~xn~%(,D-C*FCrBIw<Vr#Ϥ)`(~DV e7Hs|Sv0祴h M aF|1FLIvI}d:J/dZ3 tJ$/rMA)t-IW+<.ɶtbOS$;e?]HAz\ 6Jr r}_ "x LڛȞCD? !j.J;<}J\(8Juk)VQZDP2CYPGC,NCt(UEl@Tb(xPTh `5%?BƳ*̄ 7Rz+M81ߟz*eM^; )e΂*jɥfkEAT @( ]>`vt&C:MѓPJX.OP-: Rt>4PhxhPCm 49l /JcD0|P_B# cj<C&aX. hg7SCDD_`'BR)#"ttK+>)vB{锑z+y?{)ڿK)o[]ȈWֽs_]ј5Io@Ta4^^hefS9>Ant1c6ΥV4;p=|PD݁oMcXeg*Ə/0ǘc}7vt9餓X"IENDB`cups-2.3.1/doc/images/cups-command-chain.png000664 000765 000024 00000023647 13574721672 021001 0ustar00mikestaff000000 000000 PNG  IHDR?1 8'nIDATxP\q:FC\i+$BV^նm۔jP-xy,d=l?pq?? ~ ~@? ~@URR___o_>ٳqgԨQcǎO>gϞl6ﯨPnnn_~k׮%%%ٗرCkNyyy.](OOO5gU\\L8$&&,Grڷo/9#,޽#~ƎXGyy u#@# ~?+~թoQ+sϺuTNNΪvϾ}TFF R'O&U||sӫW/5n8|rw&iӦ(ggĈj˖-1 N{9|OOeefs? ~i9%6k,5窫Rn_$OZ ~@@ď?? ~\ =|N:tr@@⤤<ٳgUHHȅzh?hժ{'0J;wNY/g̘Qн{5gۍa&Ms)NfjL};)=.FEΗ>|8ᆆOn/} ={FߡW7BL#G Nd,s7B? ~@z=??;3ďlV?r\l 2ptRTWy#ď ߃ qKNNW/V>:tDUԢEc5)*o ~@ILLRQQ_Z,/g&?WgƍB ؙvU .T2VDz]vd?NpXwOiik?999uFFFǙ' --G{1vZ%V\ii&_m*3d- 2㘙r܎un\7qb[s~'lKE#ŏ.KK2.9_}5cǎe$o)|͚5F mNjVZ'1&hvqGN;bg`}.5DL֭6RL6-:qr#F}|$M9kd  g}"F̢E… Q19sgƍ %K{xo.X̟?sײW\R'B,c{9#-b*#}ط }^ 9`i;C1K.屃$`裏f=H phнÏ'?SL)'7φ|l޼y)gJ| ygpb"FzC ?#o%(1Y=21Y.g<6 64,X:g֭k{= HZb*}XɍϙԪUH%טMnn.bD Y,z]7ȉpv7TLL~a\ ?Ҥ~5&=z(&7ܢX^Xv}w#'EcޥKdcE_R'MT(cקOk$լY3 ?@}1`k@9c#{cohy+Q$S/sSb_3[o N:~́-ALXt KNDzPab]լY(׈?>}1&M&YA/~/Gtt ~TQ  0b3gΌ c(ׯP!^\X{2 d3 Q,|+W4r'G6q}U] 3E:LEwh} ]ϋX7tS^{3w~?O~Nz޽{eW&̽(VpUϮ_>.HqwޅOϞ=uĂa9~Lѷ\R0EXG`#EE_ J9oelOFސ1J1=$jSKn1ܝ}ga!B/~L`4h7`aÊäGt `h`;vb6l$1?P3wW^C,ELu ~䯧Ï:ў~ׯ`"(mt 2'1 O첋3f AbƼPI 4@ GձINU,Ud ?_QBj6 P~&p baz !53YE-;v&WX5UgO|vnb֍@Z{>^t< ?٢~9VJ:)Cm,{I5Z41iKfJt/G r&2d9~i֭˩Օ1;G;~`>q ~T?y97;IH\K~֋]|r~LL c~!%³U+Sd|gDslsQE'@>ߣ|"[?wkVNFZAVZ7fx~Ld] \N6OqnGA)\Y>#)I@~䯞2\O ç+S;DM2~h@*/q"j`d@^Ry |XǾ0Jr"D3OʲPq$y<*IY1_/^z} bU'30h3\L3F$1î̢/C=sݻzf%Q2|-d.89\}f`"!I`J`%B}RY5F4&0h ,#Vmڄ L#Z2K64vO@ ?DŽQZu"d\ER[%Oq" !$|ƍG3q@E2kժU`#D+E<{}k% ?^LŚsgFnLm={yj1SI~h-z;doD3De2~L}cKTgV Ad,#h2#}ӱcG0I%!h"|=NH}Үj-_LiYa%+Ն ?5ZT'щd("&0;d`}oCnjcZX@+zq`9-O#̣ GWl(`~0EW"-dchtP1 -.W7@noƄߌܹs!sV(sv9Bz$ ?U=?/ϔ䙹EO~*bj:3C1?<3`gL bo[9t<3sލ<6g鋼uu=EˋSEw+`![z-e%2!r{ЏN'pBw34f6'^<&>0:qǧ𣽡&<;E`[#-{6˶I"HN01k ?L#)F).Odzn4hӵT\$btdp 1@.6kS]ve$ݝ 0b"Kr=6Hwf9ad<53IA>~Wo{@3D7q иP$פ,?97Aw|̮^g!FLZ#". yfc;ϼ~JTVZSPX&Y)0mɸz86hI5a\)g)\x<.zpӶRTW!Dj")tyժUp 0 ?.' i* rCq?sq$>h֛~.>`2ˎ-L!yze0yfғ9{?.0Ԫŋyg=X{g.iYZE&"{ nw>#؎o׫)Q^׉)VXq ƾxafۅu["NFPܮ'DIbzhK O]܀灢7C2񽃎A1vO8 ?q^gn@d7W<N>? Li~+>Yf0n47jaqb**L |o˸Ep!\\r 3Z/:{e_o/$['XjQm7ۓz{)*4"İZjѳ 1,'@E<.al;~wɊXK;ֆ(sԩ 0^KɶvvuwJ(@g87uuw WdD0h =6`- P^a pB 3ʊކDX2~iJt]6`pwC,šu}3~/$Hq-u-"i}LE'~I3'Ę[p7&cnb 7&I]'z>v/?_78j ?$db~bù^$8NK%$ ?xXN6/q@D?X2>k>Yā$KN*&2~n52~0]Ba!;њ.<&@Dc2 ;c+F_gѱ A9ȾZfM22Z7g]Ӈe7" D78~2~b,O~>(0.3`ޟ}B\Q>溴t:!uQ_]|r{Д~ TbE",jS1X&!˺hK ƾZN,H!LbF'`Ljv$GXkdq|pGHw3Nd۸I%QKZXqasd'ES)~)VĞ%cl~Q}E>; vE?l?Eeyx5Ic ?DscB,6 ,X@Ep[D j+9 % ?)UMZjQ)ކ/1Ӻ^DiTcܤl,OSLn?+õe+,x(qk09 Y"6tsK6_@ER!;|~؀U($3 )+ 92EpFy~x Ӷ~FAFGV.~6q{q! Xd~*p`8q!$~㦗ױ[uk*nx:9^Ll0̒DX,WsjCjɄGVCONI' ~c3vC`LmlLЩZ(`9>f#8cn^.3ж8V;YV꧛S ?T䤼:U;hb?~pc2~j—~ ~p1wPѦùj%1w)c8fqz aÆ tkvtgvc/SkBS$1A9 .P178q'x-fQ߄Jn",\xv &̱cm7o<=1BiL \Ïs`& CdqV^w݈AZcFM!c_vcG)cD`Xcj0rs~Ek,ErDV9qr?$|gujn" 89qrȵR(;'f0r)GvpB"p~QXtΔDOI!9`b۾ K}rlIE5k~,s'U|adBR͛-&B?N~~.F2~SO  ?ݯ$RI}OJ^uVWAD2v+ E~@I'H<\u=n"t){I[X6ܹI^b46ܡ}äl~=a„NȗR_fԏMM*RpѰj\ Uc.\VJ,suѦ/7:qr㔭#R6 '&3،@Gz`G r =nܸ\Hl.)wT rgM8qt>XO+|]YW)Y%qr/\Nls9LLlڍO$ju]qD4Y`%Ub ,b "wRu:`o= 4G 45 '`~0?0HMIENDB`cups-2.3.1/doc/images/generic.png000664 000765 000024 00000011001 13574721672 016724 0ustar00mikestaff000000 000000 PNG  IHDR>aIDATxdaf6a۲:cØ T9Bp : ()@R{{YS'xxLC|nY@,(`o52;x/cS-*ѾA!DL,T13;dG›ߝ@f~[|K:Pŷ80įKO[rA]|KZ6ͪnYѝZ]˚yͲxLZEzlnn=]KwFJnc!!btVehzt:\. !fx\=O2D)B!8::"jw0Ÿb{{K `:2OVv:\__S.999Ad/..H$ |>G}t:zM}h4bL&z_*bV6t!*w|F8NOOY\R^ϸ?J3'Dd.B [[[RSb0GJ6CviZ%Iahd4x<֎f!fru6('l6WF`<+LX f&5V03RZ׃r`#6l]+{YT*qVFOz"ϳO8@ ~3ݎ`YM+Y!cZ ǔ~VENGV|Eo g(~ T AT I"PH" j|S~Ln۳=X[] !Jw$:::sss:>>566(C5*u!vvvۛCBPq /ןSN#qj8o$^,ZXXHl &jz\|>7qhvFGG`mK޲>wGFF_36A|l||<-//ȅM[W- Q+B}:*H۹I>pAxVǵhJ3y"Ք_M[,R~ #2U8 `hhjD&ݩ웿@V7E~zz*]XDL' =::ǃoydE? SarFSԞ X@P*'U|E};8<;#zA G"?;E=7_^Z{>RM n @ 1$7sZu=΂Gv\efff<ؽ$XfcbXffffff'HhI;=38$S.WgEѴoc2HgnL`rIŴr1BrYܵ`HwmU1΍tM1k Oxj1 ̧?Bf≃%$B|ɂ!k3@).8/d\ z\+|J=8FSΖG.ݫ*C7*٦@0aΑ6M !nո~XN0B}"Zßyj<c41$ @(w vhu+'1+`T=!qLp`>!T,7&>r7x)3r@?3h|y'x y.$<һk[X|܈_H 8p@MU.Yg-[d--@:WPmC*ac(`MY4'i'xD,CS`"4 ޡRFm@1DI˰ $6uԘDԂ{:e t?vKP= ~Hy!mSsD*RNdZ 4a_|PoA.Hyg i Đ| !^!P2庞|ij[OO , G0;wC Ͽ|v 3tT<Ê)*>ɳZ ^|n*[u͘2~9E#{l{~zMGZlXgae BBiR0k[n!SC<_J ϡ|6@0Z,mm4\zrRth`H,IsIB*+Ӝ| ԬTYP|<8@V H*a|>8U5@^fN @O(s"{FtO' @rBo>.ێH9_`wCл=>@1-@m H/8r"]t"[DL`ro: /ҫ`޽.]#qMh]$ HYQz(Exg˃{I?`P… c%~I_!5\WZҰ/DxlK#*Y0( 3l@}'rG{q;Xj4 lా|ڽ{7B`%k׮E3cQɉʊ![hLސF) hҥ/ꡎѺM[kC!MwC~G> iF,~b`Æ hi|]:YjSj? ( uavkv +q*ehygdm9cȭ^%(`)&89u2 ps @P-`EQ@h׈EH&g 1-'I5p3`VxΫ##~-k'Hq%q4GDj;HH@pW/o/ ;'Xֺ}YYaɗXQ͓ image/svg+xml PPD Printer OptionalPortMonitor Backend OptionalPostScriptFilter OptionalPostScriptFilter PrintFile CUPSFilters CUPSFilters cups-2.3.1/doc/images/cups-raster-chain.png000664 000765 000024 00000030033 13574721672 020646 0ustar00mikestaff000000 000000 PNG  IHDR<[:/IDATxTTqccIǸVAqI=bIW|!#byX뾗:/{n޺u>א/4iw@ppv6f̘+2u>^ 5v޾}0|1$$Dmnٲ8&:/@v3fĈz=˛6oެ0 xK|||gpi^g[%mm:L+|۷Wmi x_۱cwҥ:u>^}]}.YDu>^u޽h"u>^ ޻ww…:L3|;!!`u>^# J>xϟ픗eff:sҥΟeddܴ5k:/@LMMȌ3<1j24<%?իw^znݺT^4k̬[w̙:u>^|ާ~Z;6ٳ$xk|}}ŋKw֭%k<<<͛;xO4 aiii7j͚5N!!!&,,&L`ڴisK C^~[R%gu ۬}' /`BCC~cj֬yu>^% VK1cMoQQQ:u>^Ç߱Տ3[`qww7 ӦMaYޑGx;{ϮԩSu: xǎh)S0@om'OajY'N}N8Qw|;ɓ^YBa xǝ>}[o0խ@gΜ}:u>^xǍެQ|%SN4`bcc5lÿׯ_f=tuۢE'J Gş"!L)>[Hr>}/(](1sλD|޽{_ 9ӟu%E~kp̓O8p`СCn{o-N_1V4JF xȭOqX$5|'RJg},W^^_(&T0Hī\!x xB7\/⸘):j5 x%b\R DWZ@,0Tl S,L: xD0(DQU!x/@>)z"GR|(bEh3`ba9{.;M^{8b.=CZ졵Ug"x/bmʹ"JJ> {H(c@^{xFUl/b"P<3 ˹CX.z< {X_bEZ졎+D@˹C"vy^^Tj e,{ x xA@Nb8Y+b//Xah^^D{^` .cYp//Xႝ{ xA˱C^/w5E#ѢJ*mkԨѸqiժU{{]H#QoG应nysEn?=?>j6̭NxA˱b߾}*YNuKvg-[n ==gW{~3Y~~~ }1xA˱VSVVWv-gdd\ǃ'<00̦M-..v'NQVY/^ x9U^;wzߴs͓k*>E&M /vƆbѣGN4 ^l's̘1Wd/E W %O5\TTK\\\No}a ;vR^é{tWގ!!!Fݵ퓹ep8tE W,[sի[JvSF9gFimͺ}_~AѶ^ xA |RUQٷz4<'C=toN;vl3M;RN*?y$K`@v ZZmه}ivWZ[cq $ft-/xozȻ۴oߞӄ ^,^K`/35KwSt4L: >Wfl=-Y& xG?~0L5ʤՌcпr":f֭ЬYl/>c]vY}y1T{DGB^0^׳>]߈d{S:T*;FNšWQ~ Y!ˌ2>._eܖz_ɶGO}2i' .s2j5AQ>EEbeE8u|TRww5-bD]ePJt֏uX=Oܠk<@3ҁSz۲B ѣs1bD/ LZ,\7]Y?Hs}9cuMs vvuULi:Ip``1YfAح< LJncMi9[کin[V} ULwl32h=CLQ)D+nѢETL MK㣉 XXGBԖ:Kkdɒ5#`Yҥ 2^)S&j Xq|M]t/} ֭V]%@Cf…Xyr'f6YM+=kM6}қ txc::nu㠸W˔oh!^cl&v]YW-Se6`.-vqct5h(S. XQm޼9}ƌX{^z)%nR^ϟZw9x;udN`:=AGmϴgG6lQ'^/ڗ㲀U\Z;/ uǏ%:95pu9: %zA#|mѦ;^$ }^XjQ嬴!hG}X7$x'KK/px/ân]/b_ZfЅ r^ճnN$_: Xp5ju?޵kvc^ "i?nd|neF6?ykΝkbUZ !K-Dʕَ#7/[J,/],ls%8 jȠl^sJ]^w#*@dP69DDb_b'>f,|zoVg1@[%K?7 w|+ljpݦ-ueLcu_:U)d/"X ŵKnӦM ~3g4cǎ5lC(Pm޼/+D`e@¥BR9M6 /&Nl^md/}آE I)^\N[ ;w ?l0H%$.#[@6C /hk wx#,|&8*|ڋ~I e>X/_%x'q,rPcں xUO_8vnO~ OX .x>Č-SeLȵ~"-QT'UhglpW¥~rk-,UDםr90I^ݢ/1}MdoHN!}P&k#cA%bPc})ZNzRx ,Zu{1SpafD&L0Ls-Y$y>#5The|9$%Zv?˔epuOXX˔k3ZX:ݪwYmiW2պX6t ^'f`ܒLfQ2pxosmƠD?ǩ?b<ݓN&F ʑqtqYh# ; )(Z+:綖sͮ}n F/1;Q31!gʧ^x}UjUCPyo0+V,/ 2?/@33F Q83sN{.m{Qq3 +:)S#GRrKV%G722bC/yȩK)29"zC::$;#,fAoz{LN)BToH|+KC"=i=|+);ˈm/@%2\6No+ WhXwݺuT7|mxo># 0մf^@%Y}>)TJ9]$'il^iN/[K9]hHe\U0(d/nZjErF1r>S@B0_4^7eO'XM@N`c'KJ3_?\6]A3S|lx]5oS|DLDrfٗa᥺"krΗwn^HX3kM/VN/ТeDF{_u¥aÆ rSJ92+bwkwilD7H\pm h"Bf..h!?<, -f|e ͱ^^7zx)c_hX'e|]TUfNɓQu`H-=x f$豊! 9Sg= x?9xNؗ)-;bBXST }`CdlK,3r0"EZ+m2 W0%C9s kщ'B35A-/w\#-Z$}s16Qx?NڧKCF0&^zr\.V^~OׯFFj J~@*c:LntfvexyO/3|AcHC-bN@9MˌK;><<_i-(Szt%Mx1JPfe9ƌ\iǒ?<v͟??ck]OŃSۥnfA@Doix_ ,?djDLA ,D3 D}B#+m h=SNUZ`K xm9'SS8ď~ia[T]U![T"TL0)"v#TW 1fα;v xUcG亥KSbB\û'!?ˀ٢l4VB.ګKC)u[fI7 ŗ+ex%&x}Nw'xm&x}4fI^%lsr'xE &STfZ"S)')ꪫ"Ǐ|۴0vuځwŊxmfmr~j_E/âѶwKCOOLa]\nKA6ejGr >+۸ xI7]2L.]h)o*FNw?`% fW^FV]L ?{H/ex#9vooTQxW3πDڵkCr ftMڵ`Usd%"kN;Z/QI0s<~*|/> IE21!i ^ yx5. EtyxdU?xQ0_|q|#<*K[4Ÿ,TH9xňؖ5{ut]b "ITsx_ e^^C sH`: rT_-ɱLQ)]fݏ, q%"EEqx?QF(."XL:#Ҋmذ CG`8`PڲeBi&k/c<=xv8ڰ:m5"Skl< rotabΆ>gD̡9DBV2806]o{`WQi&*$Gs!3F%!iH Df_FISQ`N#ig(A;9[常DH?{wFq#) PD9BH+pĿbV/h-Zۏi@0&~nц gYcZ ϣa.I|r糪0E,:>ޚQx5tmc[z5 L]fcaj(N| jòLv fj k"ǣѨ7 gYWzQxx+DwXxWoEu9Re^| ḄUˀWEse8*QUzx'x&f$5So?4xmqG+VFioV5;3)^# Ke7cUxI LXjUvUx:^eɎAiDJaEo{oFoF=IQk;m0:sS_k&L#D=U=hGD/j7灀7޲BSs\:*Ұf]5FMcsP56:7s_4yquկ{/ ɇZo[Ӊ=wI:tvqӉiJ+yyYcv'Msp9si\,x8@8z;GoFoF-?ȞLb*,׫s<Ϛwa>۶' ePc52:۶mߕ3m |gטo]Ǜg} ^&C~%P#=E^޲›i2.+}_3r/oYmܿ7oV@eeetK6+ >a„.W^}}\0ǎPKP={nY`?fPߔGNNNSE//# ۉG>.o+9 "44$I*PH*㸳SY.P/W9zQ{<0ߡCX^oyX,;kTw˖-nj.&&澋VX\^e ѣ9r$$igqƶ,fV8::h4޻#"".?YYY`gRL)Z*zOEQq5!FS>Zq\M[fX0^^d;Ȯj(J K&MTصU*h0Wu2 =yta6K!!!ãxO_Uiկ#(y0{O" W^wXr/';;{:#>D image/svg+xml PPD Printer OptionalPortMonitor Backend OptionalPostScriptFilter RequiredRasterFilter PrintFile CUPSFilters CUPSFilters cups-2.3.1/doc/images/cups-postscript-chain.png000664 000765 000024 00000030435 13574721672 021566 0ustar00mikestaff000000 000000 PNG  IHDR<[:0IDATxPUqқc//(.)G,iOD`[y;ؕbĉ]1z~wv 3wiuw;]1@\  x x x x@l7QO4my䑎u o޼too${YW4J C&MlruN9rdnTTTq\\ܭ֭[ݶḿ̉'իWMaar>y9xտѿ1bD^@@;>d-y xVCoUV}{usƍ;J}~%c!V23@D]]ڶm5444>IzzOr&8g\6MrgqÆ ߔh\:5=Ǭ^lk֬LCҎ6my-o lAAAi8YddM:/@Hu@|588Xmn޼0~ x[JJIHH0ƍa]޴qF=fDZ]V =RSSK?VϖsQKf+^Wa^ =lr[Xfgg盈#XY{ ݧ[ޔf^u3ge}]By:/@~ м`O 2e={YdZ.-aWZZ-VXüd xlݺgb͵k̙3g̑#G̮]LrrY|#X席[l^+U,@o_9۪hkK.aY?m߾o[|oǎŋ0> x\Kk]hG|{noRR:/@ݻô l:L |;H}.X@y:/@~wlu>^*>x͛^ MOOVZe<<<lBCC[*66tСC =Zx3zu&""4x?KHH0=ٳgO7T:x0 c222*=1zrmvvvi֮]ۼ&$$D/[6m2 xwc~% VKįoddxX:qD~Y||quu5iiiӧ0@'Ox]{*mԩ:LC|ӧOk4ڔ)St x7̙3ɓ'0@oٳgm'NaZs>xe u>^pajY7.^h}7uw|seoLLu>^+W>x'LxtǬ@o߷{v :/@lڴ΂۷oW_].uیdᑺhѢ"ۄSoo~Vy3@DoS1AݺuNy7''̛7m۶]uX ua~m1cə:d tIMM5qqq?\ҥޗ_~u^#"O2{Yvƿ+{СC|z9xx Ggkϟ?oMZZINNְ5cǎbȐ!Y}ygϞl6m<]:/ٞI"S2|*?]^ /I&J o޽.qH߿Y>8p=Y=oׯߚIÇ=zt @q^,RQ!aġ /)&NߊC"VYl$qD|'Ad5^^vh#&}ka⌘%5 xωpC|&Lx?=Ҕ![,SC^5!b( Eb*8</ [m1P,”,By&@,W$Vp0-/X+WD[{p6/XOUb: x{P8+r^^CZ9=.@θó/b{{Hqdb9b j9L//Xbm9=b< {b)bx)!x xbWYaS/@@nb8Wb//Xᰘh^^DqW{^` &*g٢p//Xm{ xټX!N/D=LyG:֩S'3yӽկ_kg]Lr# Oǹ9. qY.?0˖#]>l5ƥKoޱcG!!!ap_~I۷ߣL6mڴ.>cƌÄ 6k{Z-\VAv}<8֯_?ةW M4 kٲN: <;rܨ⸸[[m۶'NWB}I#][#FH}}>[S]},4zÿ܍7L&gka3C'}xm9sԺtRݟ߮YϩW~~~;%lOZKׯE}~%c!VEuyQԳM9^o߾|rwwҶmۭgddlVzzOr&8g\6୎^p/Xbs933fBBB*^//06l8=F=f=v xym;wN7=嚊 nڴ-Z$gx% xymGrrrpQQv:uҤI7((#?7e^gxABA v2Tg u@^K@+Ď;T#G<]\ks&00PEѶ8 .i W,Y˗oʕ+:KvSF9gƍimƍz̎c_vˋm /^B>keuxǩ-y%x{}gKLLL0Nd&::qzjU^mK>:t?++K?_ɂc;v̫rf[Ǯ.?~]g ޞ[l@3ߌ7'={/<5Y@,kq03sͥp 23c^[cYeKHDzdٿN>LwoP."VL0A*W,ZG[z)o1gJy):]=KCw߾}R~})]hvѮa9袋R,8p /3*U* דC?]{}Yg'E/7~9B@h`@m͛7jJٖ}ؗcpŋ.%>,tO 3afAѓ6"۴iS5k^)5 8}toٲEfϞq ^׊eƋS %>B0^O,<;j#yHMȫ*ǎ#O|IѺqr 7}v,c۰-/X}D0]ˠɳ4ZRM><dݭ\Rv*.\VPAsY>C=$Z[FیѣG/3F.BV 6,9;HnkѢnjM^Q… XNdɒwc=s̹5fr-g),Κb&FPb@ۻ cx&M]똉]3f8+zc^{m]1F8qćuO:%Ǐg &]4kb btrH;QU޻ |˗|hd)]nUyO8)]oyFFadYwPGAU# .BIv ϙ.Vhf+v uZ e?nPK۶mYlIΜ9СCs))ctA{1%c7oT2Q9"|XX套^fʔ)c7#-hJEz* LU?ߞӚ9V;Qގ.]^VAq#ūi"" RJD. ,ѣGrS?SU =s H&.<:uxCɓH^7vX,1SvBҖ@1urjcF1x=G!VՏvQ8UnRU1t!jX8ED/x/YGU4Y6֧x/yHFV|adF* -8>XFxK~ig)5"Ri&q5A) bYoE!wΝlFZQW?E8i ?F%oEl>lƅȿA# ]uUǭX"ېKthѢ|7MT86o|T6PMVEVR/5?zV6mꩧ?&N#"A0((yd/j2ٷnwF:6RjdxUUZ;OٲeIF*.xЪU+8dv(!ۏ9dk{5j"$D8p!0NKVj?Dx>VRpجY3ΨImq>sy;9F?dܹ3@eubiExI8o@O2xkrolWmUV DzS5%vXy'&HnF˶~PmVE eA eJ%RX~$#hfXQeD3E|y/x{0gL^S5GDP&1UX<z}2Zr^pCߩ?rU8lc<7-DiiD<.ùvcOM c#'߳^ᛨzO%(kkN=x]UH UPӃDX$.v,SLAL2(#˙J LfnA2NNUeEy Yp&zidWe.'Z3}"[ջ nbx<*A1^{ioh-LRJ kucBWS r xo+Ux=b#5aFhkRv)vL#fqrf򪖩:7Zc( S-$I3cv4GS՟`I ~/*U%$.z7m */Q.  ܽ{d<?(ıQE:/UykBxuj1W$%;uVw a~_>]dȨ!03;uX-K47%= r x1HZy1f<_#1?*2o| QA>J7 $ʓ7w,^.V+57mwM>nxZZ9v3?2x=z]5$k+VСCyNbK_,>)̶n~,,"˟nZ9缯M c{"Bm+ק["63;#LVpxc7786IU9ؗh6~x{N嚘"^oXǬݬ# Fi9f:;FFx=?>sp|dtv&+ .1b՗ |}lyxe=/#xxǢ؉wFpoVx(R{AZv-8:`ޕm a#`7bZJn@W l}ST]/D?W{A K,;vP5!A˖-[J֭[G+^RW0cnڔTjE. -.b.F\!td7oHP EP3"f );H, Dy2D/􊈅"%Kƍa wǷ>a6&/ܤIG֗K_;9l1 xkժekͨRYoSIX/u޴hтkX-ynP,r$, ^NSVSnm1I<ǀk?o?ƐIz9͇uXz^Fh͚5Zz/$XDxH$[\.VqLy2- LeakϞ=7[ok@C>|l<'K(^ga aN T%'%xQre1cDFY|y7V|px:/ vHWLmJeDh-^|0&xOz~്0爮W }c Wo%#}wzux3s嘲eoXHfH enϸ/._[[8rok+#+c)y\V=.EiK"sْRoFr p{$"? xؖ5?t55b>i;w$:ֱdDe\Yc#z_" x~`4(8ר:vXjg5 [j !0*@2^t4O S9Yj>jF |2dܴpa: ^V"D4Q!vuZ"B 5\?) 16y/ Mmu ͜#{7pKDD9tFF/#:xljr|K"J xBI&ei`'\XaxsEӕ"{DnRfAag b .?p Y*u+R9&3KT![:moiHhYI5|L)i&#FZSeNx/ )#h],ェj#&}aiNߦ1{[)c5xB=EΚ17U6/ID$axɦ xn~8KmSTbN.{<E5:%62CL2( ڣ*b?- /.H!)3w8Xezn (p5#ջy8qUM</Y NaeSkN:لS ;GxCOw3 띾X=uo:cc}aJyk$;^z=(b1K@NxqЃ7^j3^g$  5?"J{ at (CT-q8wBcaj=fyD5;D$uKw 絢 ~L4;x>ƫ]k2BUŊ6=`vV"$3#}t:mMu}-/Ѿ}A*H/?ʴz:HBcSIbF UZQvD9粫M:UȐE~m#л\,6AS5Fy-{\.+~ZCQ_QgQzVIDUx_ɇ:kt'Ϫnvo6:&ICJvV͟5V+"ؔx*p ==l.di6< Zi=a7+ xjDFi:U⚑=sT Xgk?{Hm޴lڨmUNs5m۞iVT2mk76z/6 }yu/]5Z !+ ewO zBQ@x@x o`eggGc! VxJ@xo簚jPYYYo5RO(/ /"ʄ \z 9v؅2^&s˂ n}A PoJJ#;;)<E4/8z9m"?VPU%(!ᬵTv "VxJ%$y_Ux :tjQ̟?diFA}{lq̘1bbbH6D`VwxgffV_vhuTUa+eYrJ(2:$/LU0^0`x o /^0^pIENDB`cups-2.3.1/doc/images/sample-image.png000664 000765 000024 00000001356 13574721672 017665 0ustar00mikestaff000000 000000 PNG  IHDRO2PLTENNNUUUML#UTuuu}}}|{9+++YYY***!!XW*)"""AAA L" T)LU#-S{ 6Bz9H+* ! W)!/W)>rc)"?C J el*v%M$8 @ F `uIDATxfAl(;ޠ`~Ha`ݸ(/Ͼ}{ @ @ @ߜsxi_~`5v~>ze '! @ @ @.;7l}?}zNB @ @ @\vK?؎!@ @ @ @H~~ @ @ @oNCSHR[y_~IX  @ @ @ 0~~`x^ZyK;NB @ @ @7!$ @ @ @v [v#lIENDB`cups-2.3.1/doc/images/sel.gif000664 000765 000024 00000000552 13574721672 016065 0ustar00mikestaff000000 000000 GIF87a $, $@ di䡮l뾬#tmt|N]&vc_Ȼj |*/pMMM`1Ʈ71cTRm+|*/*56Kd$p+mP& :%%A 4FsCf9,Q!sY>M(gi }qo,pƢGfbeN91c1ƮSTRm+ϰ9 &)CaJF#4 anĶٳd}|K<[b(֌+gQB ϜyPj*j?V/I4G1+X/X<^)'dx݂9bbd9c1c1ƨ~(k|o595~$Xe6Dx|v8!k3)y>zu9Cn!ޱU*cccj[[ϩ90!`S'F(9SRGonvxzxߏ<bnP,Qy'3+=f犂FK)h-s1gb((,-/Ƽ1l+^#0{T8ב=U[3\)bi u1j1 B F ١y5kH3(\Ě|t.嘾l-|gʄR&>/9cغ\ܫGyNُM%.QUV9:wd>3cT ?Ps`|Ano )SgcVuqxMx}<>P,Q̙썂BwL\L Ϧ/KZe W{hb(( I|%.ĎHyhc0"a_X`1G1Kkh#`1V(W'5 d?>^FGXhk @BoSv҈hW8MF5u5qmI'}}J7E<.ttto`}+1+cP]n)+CPn%g3vb&͑^ȪtQKb7gX`\V>k GIy #͕suF҃t Ər}NfK3f.UTr:J39`1ƨո?k;Qx@qdnoM_ w744@ ۡEwݍ{ ŋ`r|d1[艷=n"֕(9x`xa\ҭ{F~*XZsu;BEy-Z7h7NX}q_qH7f/lciC`1C߆}iiطo <''xHq'urUHc kw:f#9iۗӱ75i瀬j)0F:^Z 9 A'Z/BjfVHtS4aұG94b{QTF*0#^ZRPc@Gs1Ƙږj\ys@᱂o]dv ~`9}Jsxpyj y{c( Ce//xs2EsVFϑxj1d݊`έxşD597%/EL*wF@d1 x 9xB̥w!ZnLZLkc9-"=pv&d@>L,KcmESS :{xH9gIyT(XҖt\>ho+j)>+Y8sI$=$524W;G rr3J& hz=zg!uB38}1A"&"6&Zc! .b6=gB%4ƚbʰFM΃IFPȼ1<-^0L vjjB\ы1uм#._+]sCE?=BK A___Ej5N߀-[=R#`9#V0RSM޴F1A:y7Kx|@́qpF1VŎ'Vayox_NEkih}_Nx6!*ZCkc9q1@&dL~?2  :Rmն@|Rc J:6UH*T?騨dnmWp<@^F ,XzhUM8]TXY.$'T}GRŎ+gYu!brV!K^4|Pbz!dm "XYc=^NNX[(t2j+#am6Jprڶ^]@E;rstl0^+Bdj>k7˪FZw)ܴ1Ʀ6OCMF58!Pmᄺ SOxaVTdzwB}UȽccqPm+VNػ&q?FnGdM? Sc`V+̡;#Ж-)kg li)33QM1KkƗt^at1 5U@w܋b>Vr qX\܅RoyNck_?M MGO6fB{WX,v|%ы>+cŊ+E6M+k;-km4>2+W nXXO1hjB"͓VqM ˯b=khɂnqfYsG#/)_Go'g0w%c10ո5)8*d -{ۍ" ,kO@66Bhv0h9XZ3T&&c  }?h3nPNKgp$iH;A8YFs9C19xSO|7'az4O /ha1ƨոSl5'kWv |I3i |#P~W!6MXBXt ojjjEww74Fs#_݁G%QqXJ۫Znݠ(I B*D"t25]^>`4w.9o96q%H<2x%NSS#'''"+5P~6q{JAWWrx9A~b -T~绂@mV׀4!l@D:2@@q||leb[5 :#gIe>|:IV^Y9Rb RF( &x_ $ΐS?::2Jm&WotaiA<15o:xӇ8<< z^Z#_mnnFGGV5mqqp;;;rIk~gg3YL<ۦ1kfN''rƃ¦}@:e}}_F===s!ja}'3eSSSvqqaFaٙYPvwwmyy&&&liiIy/̯<3׳,t&:QsUlƸCi7!YN{;~$>9^7ezz.//H*I3{~fgg\IbX,(zWMʬ\leeNOO{WXF#L Di޴ UPEIn ((P@@ T!߾ռ{3s=#1,9=4@#humU*g  ƀ<1_BS:{4[r9t:X,Аjf>46ZA3Y}=,+z 9/b΀` 8B{m7>1Hv5^גqP|^?D;VIFl,a  #c IQ Ti6ѿ`0 | u]|q`߯A+h4Fooz*N 3`7cQJct@4Ufezm6X25mrK]kBp84Et:i:Z6'sD"ZV0 }Hezxx@]0`X B3@\.F#`0 @vE*6*5d2ZFl2 U*-W`sA;Ic x;h \i ]1x5b*}2"ri:}>%3jn6X̰kkZءGC"^5c|~޹6Vn{ދQp#=ߊXy X>z|Dp@Z`BV*CKNĆbFm[PRbcI`vd:a=:Z;N.RX{$6O>:bpK.DO[0 qwޑ?^N9k V$願0 I,VsFbbҎ6FAES0E)er eJB [nJhEQ1W#]}I);t\;VYg4+k!H6${F9'GُH}Cv%>ė_~<Yyݐ sw`A2DFeAZ8ckڱmk۸غ[=-H@ٝЇ@@ u5)tTKإ駟KGIo۷֡_of^:w}駟٪dΝr9X"uod]+h#s2r>xJ>km@tIHpC 7|IȲqȗ?@C2θmxu.ɖ堑$З7Jhu1d فq b ;PkdγѠt<|f&ba_rF@hLA=qrR0PZS˕O%:#F^B1b3%9ġ)Ʒ<V^`avnoLE Pfo7)C+Y\0'fJb`6Q^8|v:+b"gql5:c,lGbxP*Y$_pv+εnnW^~xvWGE8g=uf .`b:>l([+OnWN(1?lٲEU\UYʨCݖ笳βNs(ϺkeSO=i_.n>Yx!ps?$ҴĺJĎ~k[tB@*q>C E%^蒡lQ,6J<6 ֍fMq#WG8%10JP+d~pWpew=`TSb@gϰ {U]r7vY2Ca Pzz&%ꪖu'Ă{d1- %=hhhhhhluuu:Quˡ$(?{`w2sr5X4,ĜԂ1~Iп[&,Be.'{"U_F&P⑥=I ˸Ϛn`XCuƶmmb,PK UL<7bvUޒZф'x捝} 6:>'8gGJ(Gٺ茐vttԺfq?|'Z>(gqkK>(@ EGuK2!ςniv>Ւ?ONq 7.!\yG2{Z?@sp Jػׄ6YD:#⯒b$LK&eLw-}L'%l׵dKD9?T-3eq j_I P,%ίcenIdgd&d03h"cv)W}b fhY鴈YIƫaL tKfF\t"!hY&xj'D():4444440T1Poz?C>@ínrsqk/OŘkoNX`%j_=V=S26 1rcKBBL1@8u2]gr`PX;ommBl^boGI ;#V;vE ]K:;;1j ?`"~u[+0>g=tVr7bb>/b~]tF`Ȯj>vn֖d'å礓OB0NG|PVF}YM[퇵v%︶Z)d Z>#NiPV.hõ^%Sr!.icsXK1l xeI:VJ Drɏx J&#>Wv̓<>cͲ8z.s= )ruǩ !&Rj(J#qCCCCCCU׿4 w;$rMrundYʬ0Y'9ZWFS̅7!\YX 9#O@E"v~jH! Z1`׍$dn~N̎Ko:1Kac A lmޭ ,<[NbbHĀD_b࿫r;,] h )sT;ƻodb/1.3>g=tFƬ[nvsO;4}vwI .:Cp,g۟x 'pj,VӚߠS;<}߷rzG9ҐG 'O@t^3@$kz*~4kG)g1ȇTAܘ꒎.v轈.N:27O7{w:<ܺ}JC$)%w5(=>7O < &G`i~Y^68xLJex&;o̧7@L7a@h,)IIdLcܻ<?"&˸A Җ6k3-6?1>pLpdE 8^b?aiy$Zo`0W31.5OY/x +3qgh<_f>(qp k85C {?0۲/w yG{nzbh;1^{M$G!W]uULidz'Z4|M+N>0DIEBSe|YP Abgeէw(GO7.Wˡjhh'44t(nS wu}s'^`,T=A1n70:+`(rY 60R(O,{ ?\6̃XX"`X:8*b&>h8Ib :v'#h݂;W_}pԇ2}adQ}ѯw9?ju& irMëp ƍ;[oDk1?|r^B.|p3袋Cp/҆ʑE Ė\3S0K>(tz f!\ fZIśmg讎U$YXsdeLwZ@VBV17v^Je)f|g;ɡ)09 RPLV LYuUbA WhHbQ> vK>& s2k7wW_}U 'ɝ9r`qɐ'XNŊT* 2wi_D&Vh@̔Ā>0I3g{'ĬTdnzLz7uAu 1 Iҳ󲸸 f0+N`XCuƶuؾ&%?8A E V/1@ZфzQ, Wͷ3Bo O>s);X9vo1xs "H¦^wud (!o0ֹw1x e*7j|2!i ^j9p&!% 9;V"Pᗍ$FJBB)HK%ɋ|!AR>rfJ.eyKyψTzvz1J?eVE B; &?ZS VQO=olH =CRz2@"Y.Czq" :˝BCCCCC82`+裏?,OM͓2g`uzXĠWSs+ 읠TĈfG~w^9X3֎5[\_1J WBE?b\C0iVT_=2֡;OuVr:/$,'Οrt-֙ 0v!,0`\IAsKTM4 XH8% H Qi&;u9{Ge6rIL$eRٱnf5:l+eC:c:dikU^*s̕e)}7BA %RY]|7$1dACCCCC{<3g*w6xO6ТѨ(SO=%sss2?obeuₕ\ouXlUEg"E6HL88..m"sq1ك8>w1po!5fZؑݐqЧMt!^(#mθ׵o [H 1| 8}b#< @ ) )Jd:6>Bq H@cݐ KPN?ACCCCCp[cF9F^Z;%LX kյض.b7`gzۙ1pyV1 r h"7-b[=zG6qg:b&p "LcFrhhhhhhhh C={Z]9Ν;D¼d|YS2qkŚvf۾A E A Ye&?c s ,֪72jO캣̰_ q^RNA~:Z5\)?{g:싞NY^yҞ7Q{՞w3 :N=M8)og욭xf3v~@˝bчޣߪwzVg20^^hOڛ }Hi:/[Z5[9zhd'JLI$i\^h>7{Kޮ>wW_yף^^hOڛh>;0nÝ3EۨokͮNN?I$^@]ijGڃ=yt?'  L$I$I'I$I20Aj/$I$I'I$I20^``  ``  ``  ``  ;X8j{J V9v%^7>ﴳ_|\:+$RɲUoiAq4A[?wkмB|!ZkHn[/-;Z뀮9"\Z9za a NzHTlv\eUU톐4#h $˲z HI(ÀTJ)vJ@7(pP]As:@Y5H`$s1Ќ"nG4#h y!E:aa (m0> aT@WМ-r8 0 XgZ+~ox^r>kJ: q*+hNGpν6 0 X+a`|>p(^Oݮ}DzZx<2 aM=9A[0 SF5{v2 r$I5 p*+hNGzzb!LFL&Novo0800a`d \ֺ'B$Z HQB xUV4i>^U+g5,s:7][mgw?7IwϽÇömܹsuΜ9Ys}ʲ={6 38$.S8>Pj3[}܄! 61Da`yy9]pݮ׼|?uԶT&NU@p. x3ni-'O(,ru qG)qK} 'qc' aCi޽{YÇqFziORF. B|Ԋ6 `s=<^?*Sg1N<O]T$~ #[D ly 7t؅]- ܜ={oߎ~"˗/+&s)qKg00v,8n}(,<͛78T躹ӧO0 G% нudHeP{9I:r9E %L d+AkBavт?AoNhHdn7yj^8z9)P iHvڇKZIHR%T_A4P3ۧ䗚d&ۖ$tFڷvիO#LҠkXݻٞOS'r"qKyzĊNp?Gxٳ?a0ĉ$.EyΝiQ I. ).죎jD€V2rհ@M- $HVpٹ Puh@=̨.J LSHki$ ʴ~'kE\j^KkY6 f {aL@} ;(&(!Aoa`Av`X kڰX)充6>}eǧs?`}#6P/j>b?.1)q B`2( TURkH!|Q Z-"$ 8JVe咚GS"D}50Lwv)d^4Hfni]yZ>J=fUoܸ/^Оgt|m=ܟd260m s {xɠvmSmDe9qeݠ,u a` !އ C i=^r(,ٯTiJ=a@DǎcjM5wި3h?xL{̝w ө$NR 'ǏlY9ٖ_E&s:=d [|0Pz_€ɠaaC$m5qNo!r(޿o4pk O _zE` </"_1,VFTD. m09NLNíy$4ՐO+N^ʝ,oh<@sT\a{hc ܼ\-· DA7}GWh9IN!=%ǃ? Ax2 So0&SLscs046y _.7:r#WiE譀/0,A^)躁B-_2x`y*u*-hAnOi¤N bv~ɚ06ߋx;"RdS} H)<(S]߉X'oC׳V{a=JV~lm ֞*H=Mą;>l .zAԚ6hPmU V溍p aw;KԦtD+Oks,=|%6mtn>=m,rnɏ4lbg*=8/{ 7\WQ+ѱ7\colh`%VNY]]kƶ[K!|-UYּekJ ?}U3ۚKqV\{$nnFzӫJpHgo7t #Ԥg9"j}ۙY*4;0] lq&[۲ La7n6pt i{P(s`)CFc4_ oA <KU~O˲bu: 0`gWFX7~C3} P&ܗGeG;_t3Ҁ}6& W(o ʝdu4 w MO#,qayy"=w*j4LL(h<(y\`H5X3j\r.Tf/-{`csY|HyH%%nǍ%Ae%'gR3汌Tq|ȽJp)ֆ !>0qgq0< Om avw}?C 76'0=9|۰;>L `<Aopx6ulC:'Ós 2= 0 =bϟȀF[)܍Fc t:g6u8_ugmmi^3i}^1y]908}to߅G BBst/ܲRp7i1<7zoq77/Ff uAc`u(0,|ׁm' z$!B<zun؇V)737,Zg~WJz@7WJ>= (w Ճz,1ʳt"s|]B%IR+, %Rxwppi:]oׁVY)P|Ÿk8`0 wv&Mb@!$/ +*fx)0RO>ALǿx B ɠNu '`ᄅ70m׎tvX!l!mg"aó]xrFA;4: @ ס{F`e_7 C H0N)80Z fqx:AGᄂ&z8Y !:) y];p iVW` i*{0+_ӣ6R<ou:Zp.OwT,F?A~081N@O{0[>؅=2U9 T ,t 6>#I/02Z )C)C ޽+V9WnݺN E2`Q Y_`n{2`@<9#A  Hx-Ľ3t_"@a|@>89#7΀&=u?bW ;9 i)CIL೫MO^%"`@|]%0v'W[ l}i gF(s¾1B3` }pC%h[oQ`?P٧O»K˾{!pUzDM!`DZGރ _}g?ptseQ"h gyn [ig驤Kl>dNO-:ev^CB1<1`0Pn>"B e@M=[܍Pt]B*VA zaeeW wRr倏\́$=G*):- FZ&:9h]0\XA_*P:W^b-4`=Xc?CUGTq@-5pܨ]C|:VM=VOb` >AQt،`Ku0-jyE M"~mxm@\¬C\iAȀ[.寑o[e/-:G `?QFpqoO0@,3p@[9  =2E߃lF -t跱 S4O*'C01a Odh4wa {P(s`iKUW*o&iX ͍0yUNP)1 86PoJMz{i(j?E<<~ >E˃,oS![H|؁sBAƻU9}uTX:;+ yf]m;M 7}Dߎ;7SHe̘IbG*R pm})a\H1>HR4NcDf\+ez< 1vdA uhEiOIeӂ4F@Qo_\P.Ceu"}ᏛP㛑U hbzOD`?R~=e;c}'W9cσqeX)~f4fzD:]%E\宑sٿrE bTV`R/Z Fsz2#8ppx: S/Vx,<=SW^%b[wLe.x( #0K~IX?wΝY90b+uq.!C8gn><xۀtR@|~:=\7z?q# xu)+>u Ž/g! ގe 0 e<^i` -[}L/UU c?hr (n>2>Q&׌8ZCdB#]- Тba:tJflϼ٢P>-.nuv2ʌR 9[@r-C $6iuuՏ?H~B;!Zv˯y-ݚz#+u@ f ȥm)4gNu+~q`/ͽ h|Ռʊ&uU/Aup3CL~̂;(}BZHS)DWj_QZu/%^%(>"s#rŲ :QRN#I_7,_vO_ZS7(P+tS/]0@0``\  pxB}X,BGnܬ@IޠBs#&!,``hYA0@xWP -:0``@'KmBd0( (T 8<n!kC% homoZ-_(Ts<n4)}P?mr ~憯TkPqxpxBlnm^ \lȻC% Tx/J}4 {wkqUcRJDD3TD @%$H4"%&BA@ (Eѽ DLsz?Ƣ'#KW[[B!S\ aq@TUU!_kmm(qvv@y!>11iWuwwj€0=>>F!^b||ݕ߸q#^xٳ''N}cڵ# 2$ }ʕiga>]w݅˗g>O>`-)v;|A8p$?͙K:8t"""""Z .l|dΝ+2㭷ު/DDDDD4Վ;k6 =܃Çc?~۶m d2֭[ 0 """"f2I>Q0 vڅիWg_ b0``>z۶|vUX1 =~""""?f lڴ ?q.?A  \mRԑǙtk-(Nz^i#0QgW#p(h!MSS(QkcZܩƔC^+ dC߳lPuM+(fp0>DDDD亮+I( #L#nH} ^}U#;(W;;?zIX jϗ919@ 7ƇzbY`9r6lHu.#&rI@5~`@t :>}o j<` d,^04- """?P_-eC۷^ ]tQe_`嶋M7b0` #NQLЀLU0 uZd0hfכ`U Ss0@DDDD;vHuG'R/F_~%D.l%L]0࢜^JZXPm rUt1DDDDfk5k֠#Ν;}loס'<ޗk%Ypܿ vR?˥N 8p`O *Q" ηmkתI ˲E} 8=\z۶m]w S{"wJfnFa@WcR a Ee{ Ҹ""""LkFN3 d{ꩧbқo^} f^uY b;Dj}`@r~M!< r~s {Bt2`~7\2q0gHYW_};r-o_~y֭ߟz}  lyyzZ5h Q tj~r% [W """QTOrxH%W_}+zޜn¿K/A0`5,7` T5aE챷 r;OZ0ȇCADDDDr lذ!$I0 Bشi`@z'{13 Y>1`0qFP&  =0ft'+9 [~}G#/c- `@>  ;yΜǏ'nsz  0H3i+L}dGQ Z3qO @DDDDrw$7xqlٲEbݻwNLt):f aVEBn~ PQ3`=zgyf<ÈcǎUV x֭ !E 65k{o`'QL{$i\b0` 0_x趻uG4lyCkO|@PȖG0 B& K"F%i7oF\ǎƍygq.9DV O db z 7xzO~ %$p i%XPׇiV)w^nV]V1j~MÀCoq0wTնF˭>wNh<5tnWȈ^y{gq!<ӸKe>^`&f 3<޿;!ٶ^&>xGwڶpe( K۬Xz/z'>ry A0`D:|} r o.-9ϡC4W0TDDDDr~P@n#)Y N3>=^ˇv:5N V/?/<-u01X:*V(l zhT jP 44>3P1𑎰k1>kxbh9i眯׺""""ڻwoP` ߳Ѳ0uYZ^"@S ~j56ۿ޶mc}TQcȟW߬BѴѣU'*V0_|qPf͚v# dJJJ̈# Du1PCwBtB;|kI׮]^~_FF-(!:K.5,z!@P@N ifN>dSvm/hXhoݱcG{ߩjrss6#G,3hܸ? |^'WVMn 4.Ҙ%KLff+((0{תQ4Hh0@0 ,6@/oݧO_:u'x`@g=b0In;ݻw^htm𭡐 @Gֽ\[j0 .@裏b N!h^N~f׮]``Ɛ!CL$;wv`` QIB{3f ٍyJJamgO?\f|ٲem] US}@00~xjժ*6F|cÆ &Qmt5jІ7l0pq駫et6-[~m˗/F}N 6KpGF 6k^zm}{gO :<޷f*3u:PœӪUr ߶ݺuSk׮5fϞmDA~Fzz:@83C-Z0R^5"Ĭ1'eM7rT8m۶ H]_1`N   7ѣGW\q6pM܃gر:RQ4w'W^y\y@PPN$"xu]wBrׯp 6   @vvv`@|1o<1ceذa~iv~ܸqF,X[oݺuVDŽR\fk͏5D:uApOvءy ׾Уk DuV3Խ aB  :#;T^  }*x'M%?~`74@C} kʔ)x`v4lAy5z#L˗k^ë10qDsתeڵ׽15bݣ:8@*^}U6 fdd\r%Yffƹ|-|M5\NN ௿~e* ^x* &{1iÇUkAXn]#+V0)))v7p߭oOO<SOٹMݡ.DP@oN\0P`QF&R֭ * .  o-[j#/7o6yf^TtR/r4o\s 6nrsN*x'"`^zk`ŵ`tz? FAAk?`HzTmԩc_̪U#xkgGZqzA'|_v}}衇 ]}}^JPgiЉ=:[/99|W& ykAfff`o&` 8)0k]}CzԨQ W/QRRb<3AZS!sϵ5nX?SZÇZVqf̘11y@0*}mӦM  ܦ<ޡb{Zd9T4m`Ϟ=hG4GΝ;M^^ƀ޿zVx*|C |RR_|ѝP>wrA z饗̙ckh~ȑqy0dȐ. MEܵ I'*P;0[C-sp9Z |k]pn5P#nufwn```@sLxbѣmΝ;~/#>XpeQug(08b=u@Z͠3`͗:zmv]?}`wcW?/PPEڠ-%@M >vV^02FZza3ywܳɻ͏>{^У{ÀQL =P!ۅ+x{aj=tE >@`ǎoQ@toF]e>EǶ`6¼ۈi5.q iqAڰeT?6bVw؉x#0cY*: :۷~o"4&u- aCaDh`ۅ +ixP:4mV7?@Q!}4x.4~k/Y72>È;Lqޢ[߁WyDqnc%9k4Kar{\FQ Zlw!P6t7_csA![C{<{~;vb`'ހ9[xrLNZTEгic@, Mh7WNN D6U5E1`kЬ/P"9׉Ԡ:_WBB05 FPq}=lEtQa'q6r:\w::z|%k(E_\Pqi&Jq#4_-x k}|OKt}CȺ 7h"ŨyL#lTnpp-$$[ڔЂ *XĀiرc'vb? ~i&RbD5JE/)l%pmb`Z_`z@S=,10Mú"1 -1M:dסyeb`[MoK7|ۨZw}Z|)w?<1` K0eRm':&J D&{q͍`jVCWlϻ[u2L ߀Y$=x8@!,DžeE?ﱆ\;no"# ׿n&o\vN l&bw4;VNH]dԎ50 c8e2{$ *rL}446ጌe{B4C(u%qie!(t'm3CKN<܎!A4s:STn}*΀,2XnE2HoWrG,4ݐtfU3 z7d}Y~k~a3DJݞ7TM ﴚg#ksz8Ep֡3o nLa@fX0ay!eւH''B"bs^ c8Hn?o]EuDžÎ1*_s&8Ӑ'$k`J~ m@Ss6~6~J%ew& F7`.Zm/;3,ڒ1t /_׿~>w~ wN lF`5`{@|670OMfO'I#is0:0D| {9Awr4L"1\2A7YUb=BSf"r$CI6Hw<u C0EExR)!?d|Y#^kU8$<0) 8[!XMkA9:Y/5KZʰD`P(ju8 e;+8H DA)za)VHMRMdIid+tHm/eS(7lSI-cbyYGٻIe j{ Xfَhb }t$)b{ 1l֫fx<],&_Ӎpa9~62B18==Dž׉VQ}Y+'?!j9Zld4F]ˇV\Cmg UMSe.}sZ>fhsL7ᠽx /YF꧶E<. "ȅo#h̰}32k& U.&`:s;mPg: JZT%ݯà-|" U˴!߅eP'pN#jӟts@;`nj[k_5;1ޡ bS=xq1VX㮟R0C?]xxbg& (Zǿik4 Q(jb]6Au+~}p1,Dy_ðoKqږ3dYr9> \tȁX,]]xXE1!ǦšxL_Š Q-X?םYڕ/ՉjᠰT=u+܆zD)ϥoW:mlb @=.z]@|}Z&{N*W.Qۙ~x}sv_0*RoGa+OPHOdD,#}ayO/%o&:L UdΆ8 gE5jboPqWγI2ab~^;SheSe,@{eNŤՋSditժ VnTF-rbC:I} Êd4,CJ$E -\dq%X9g;<{$R~μ:6 e@_n', )üX_rjnTT ^Te`m~Rjc/I*fS 10.4H)W77ospQV $SI CA~|2r?1`ϐeϑtC<1`01@$jKblk<pƒv^#/S|;c`7b=vP"pM~=2mW/^`o|cSG?Ž؉8gU`&x4:> S>K?甹I*# V='kE+\e`R/U A݆J:ȸ+j8z뾺MWM8p$ PpjVdYX4\ĈY0өμ}g@+2Զp=e "4=LJ%xnQ.NU*P5>ERɆUQ؁Sgi>vv_?n߼}3=1_|q}~~c]Eښ(J*@u*D@ߴՠEjD!1VjV_f5LETHy Lo>59(9C {Z54B=;Hge(1n_tC=$Ei24i\/^ӡv|^@i1Nq 51mS#"տ] }|VGj;Sدoonqed>?[pG#YISd'h狯Rms4?Q5su bG0)K>D]H?#%b@Iube$]ט001%u$6K Epj/)j}*a>81nb x\dć=#^58Im>NxjStYQ%r-e(t.qB:4q_Mt5։Bv C7m<|Д'݉ПHap"#XbHCU7ɇJSҹ]7F)Bdˍŗl2acO'JأJf@ -o}y\e;:`k=A/si#|R8$~@R^/{un PPle,c`XQL˭̇Nc7x ѫO3(^q _9dՀ)h)距y|@d |&}"oaE㙐0ÏYouyDT :x S~QkVebB1A>EܦG:16[=m˛Q [Ӗ =:gK<"~+_'|nj'vN <& ]u= ˴7zL7!ܴ1lGqa(.vnb Bi N-Al(sw}a x0r_ƓM"L4~ZAzSfx_" J@!I@X,F 6 X>Xors~v:ۛ:T?< .۳6"ꖩ3T,GXz ̩@CDoooٱ᪢(vttb0`sD;xr/@Bi4&q!>xT׎ |?@p@-`Mcm{:SD $ h59#>50(gv}}^`0`7pռ677`0`dMg\2f^  zi@&ht-% q !pX%4B['"""U߯.9;; ʤ͜)kW5XUcIv-Qz9]hz:7@)<;kI?V\N2?3kwwwpR^`3- 0<cT&D^oNM'X|6`qWX7K&(F21b$\sM%K(-`o @ntm| UE ER(( 6(oiE ,С&ܱݻ$əyfr0w/d [?'#q1?'fc@uɺNRPg#혂1yd1p:lm7QZM\7@41j7P Bzk_QlC sDI ͥs50 04_d|xo-@owAc8`nT@=FT4(cpNwx`1ˋBs6Y.fOe6DnPƇ"Q0Cq;jd P[jc@_j2X˳4bZ MFc#jیG횱fX)ڛVt<}^lKfg#nȱ^6lBX8nӸO#z+zxi`ĵaqY/9 x䙹B; ýC Ien_RCd!tlm0 0xW믿/ l lF\7LPߦG&1ED8h%:ZDrDdh;s/ "An#Ir;NR8;(~!ƭr*SY//Đrj_q }vP"Ixs&cگ}\'"WQ^H_]Ŭ"}7%QV2.:Y$ zw;sXMܡuݘ ̈(GIdCu0 0 l6=z)%~ex+ l G']mcwl "Jv-t2Hh 9D:&x>!A@8n . ܣr@9ZُQ ,`pyN<1 1A#}f! \'n7[dq׵]Xjcq&m^Ĥ@Ll3XX'#4$qbt`쨁F+s'%s/i5< 0 /x饗6s~o)_}6'G"%LK4UJ;I%HVPB"<)iVC[EQ%/MNzpCAY91"w〶'FMQ0 f c-ixY:Um4(7ܐ}U,g<μ\!rHZ ZItmW=W /aV|"GM1prbDgv aa/b1@壏>Z>o{キ){acQ#-'mӫR&Wd [͓N^k [3w=t ޝ0/9m 4UlPIS UXspCf4l_x:1/%2mR nL>ũ*2_sd*Qyx&Z+]R l14?R0 0^{.~#>7߀acpm[!c!H@ZTG[ ~-,ei#ć~1|@?I~8t((I_/ކܣl1q´{yyjhh6߀Љ3y˿EO/ GxqaѷҴ޿#]A | 7Bm QѠ :gy1Ou<4Ea;$Rx\EĿ΂sE 64eFg}?#IQ`0 0w}^x^e#~~wac{Fӟ*L׊Cvv7R :,#Nj1sa~rlm0pp /ӺU܊0A9ð>|7c25bL7п<߅>%яRù,B/` xYYuضjJ i]Q9:ς1.l#Nc>=W?WHIx0_E*dԩJ10 0L][˛ot=~<?6FN4͐R/%flJ@ut"1gjIo&4Qܜz"Y_c@qw*4U I%HT$ 2( ±V%JZ5F\eŊ e$7hQ޹ 9]ջ`{_&1`c===a0Xb{x._oJޘp_3yc\ѨNgrk遇y<~uuubuקtW|֪k~\Ɂam`0(ffHNܼD3mJXob10@`)@@cvToi{{[555ɉ@ XcÖrzu~~P(qӃh#,`ff&q ***444% !F`X[[SwwSa0 m&ۻUWWE}}}ޮz);;MgddD U]]n[a <-@QQ@Z04O(ܬK llltZ:|E\]]˒QG#a0{{{jhhDD"zTUU)@qqtww_aڪ*++GDQy<cbfˋ@ @aϫCMCmmmr B9atppiѴvJKK٩&:::|>^o@)jppPcccM `0H$X,{vLP7fw!>k;aaaaaaaaaaaaaaaaa@--u;C-I}&x8\+ j ` qszwislC*(`<c-kYpӟ?̭((G[B//oo`qNBA=P07uȓפ$4(JA u 3B?@?zm" 4Ì%vlN<,`\͌7 :n0$,z//yU[[F8EU P0$)vP'FNnIjϋ+' ԢѩDUd<_aC4j҆^_ зoy>e718~'B( P8coY^,rI@{b2~αkdfN6yo#Zz7$癐|\P$5^0ИO2HO/^_зp-"#"6%>0@a۝Nh m`vz2h,p)Nwi?NI%c(&cx1Zga€v3Xcar@?$ k패g/8ࣵmka 0㶶vGmcL~88o  ¢sCM "46?*Gֆ,yEo #OJ(n~yZ1:3La/̀;JKX,qhZ A;;H,؇se+{ⵆx}xG/k{\H>sS{''l7To;LX$AZXe5Q h!y6t z١Z~#( P؁P%DO&ƈj[koѤV4]qgҖE'gXaL^#'lQ8YA: !EDO0?kN%8-;uvR)>]tv BBrL6kw$N36s:Wawh #8hH'̭"pn.50@a`Oxi&<:HfyϩB>E)NK-7w-UVv |GS^. v BvCB2wF} VyBV50탶m:C-wmhg` O@as  d<iq찉j$ G~x26&!EBۻŒc@1\LXυ.Ǿ`g? e0:B>@w,L61?I#|Mdͮ1E!.8g0@as2˱Lu{)Ԧ?>ˍdbnٍMyUiC5ERgN"68яWz//C} }a@ B NzcZc\J8ʀ0{(?9hU}OnӾJ7EWp ( PLHDP3ːw2Ly8Kr3|dw{I~֘E PMn__$зp-"I||+Z5[?E9]Sg^ '_ ( PXo.Eqqj";SkL4)W}`2. 쟛mw"Y[ 7|֍ !Zs\z//$зз|0Ҷn>a y'%!zg0m-S\5M/ 8s 0@a`PEꂦip98%kǭ5q@].CbGTOSm( \}ߢ"َTM0 ٹ0ϻ?|1NPT ]4P(j#98!Nۓ~zuYBݒvC@//y[[V^( B_ݼg|dR/( C Q_&fE}\>?ôz %ԓifNO3,˃ '_lkRRz//y[[DOe7cܜ߷ HM5n Rx\x6coTg58|ș(Qvv⾶ʠn$T|2-3@Q؅<1H󒢁l;pS,`3$y;SL7'{}B?k 9BAA @B",5'kts-$,$n,!5>[/?W S=͎1uRۨO#-[8P0-qM]4M0L3'MCVZ }3жۙ7a0qÙ }۠ٷXc0#a0{ns4:g?_ eqf8 5ƄX渭yp[aga 3@( P B! 0@aB!(g !B! B!B B!B S=B} ! !|?yJsV2q㭾aaA!Ba!|SFA#[I֯6fVmQd=зB0@aB':|(:ݘ6/ ЧL!B( P p7 z_,؇5!;[]Zkx^C=x5zvK[!P0@!DgaW\w- 8k`uXct88pB*V8kv:kaZ7;98B!ByS=2T Ո fTi(W~n 4^'2:z^/,-^R/Qt#*>]tON'gXcB0@aB^T/Oj0"$}6yU!&PQ ӆ0 {\Fc}aVkqA4vR~4Mp:QBFQ5<߮, M]"P?kKDG(5yCP8uB( P `B7p; Gˇ2! h o.`éaO[n>J([0&!+ Eo?eQB0@aBmqpsӞ֛€t߼ i€tHoNt- >.7rAa@JH= 'I&{di2۸V뿎eVoP+{ϳ+‹`/ +vv`}>)3]"a^~: .]NmwyE3`Z B( Pgs^P5$*(Q K1MZSf*'AH )v6z8^ r#scAY/M^J;%W}p)/9PRWBz,+$+cgw_ujc" Qw{| 9wokgkǨ 8( $њ`:{DqVG{AMa>KBwü޺? #FvAD{#4u S{Rqg B]K!|81{'#OApr>~I񳅁*|w:9êYi?Q0@( PK/hQZEw/?=+V 'K/vl4hb8QjN@x>`#_z,akP4j.kTa[} ˭Y_np>QjzݯhK|u#!t+VQ+#T݃}|];]I{nZrP@qSг-7%V>{Rfw)ݞ}{ o2a聿e`v_qvG C{1^>'Ssb滱0]8mrj"(I9} c'NN!LuCwP0sFzL~:3$kY,?xļ8$hyG7# NZ.S\兢1 %{5jFҥ>G5܉ҝ ?* .B1]OPԃ>͖w Iay@<聩 u|- :$C2{6t֑IY w^닽;903Ro7dYMfOfnwc[Y*ճ: )~x0`Vun3Ʌ j[QCՃ|`t̶1/dG!nS}€M~}L'Y[yQe{˫G_ߘlOGS]Sjw1?6J+ KB_ˆB#r5dF={~ޅ- &ldۨaZ_G$QyG9 7C#w72e KC*(2'*?Hm~wߏmɡ0@a€QC kjUzK0q!\Wo T%YgK FΙ5Uh~[Tt&jqYFȓ |<&3ql "$|=p!cpa) dz-8c+01EDq!v,;.襧oPn +*=t>*x}M' x[]m&( <;N2f VkbгyX/eTnK#*i9O0먶ߗuh2_eTA#"22}㧃0bˆY/ u7׃=Hlfs dG5첔@"+H}{€5}{;N/~2^/3֚z*f~#eԺ.a )RvP0#O<`6{¨[gx$EITR=L H։hht&oo|ÊN)s3b"Y f4MYڰS y4/ƣ{ J(|H!^3>"Hs([/ yz!_Ρcl9hsAL #xw}?]$~˽㨗>PH3Po{?5I{t7m&( B~8G!|ҩqRpa7nШDP0C!Bw(OauF !L( P Bl!Ba!B!Ba!pVg ! !B! !z>[!P0@!B!P0@!#B!B!B!B!B!( Bȯtp˹i(c:c>#RK# B YwzϪ(8ŗ(4/}j{(lQ''?˒OпEٔ]oGo_>[!P0@!ox`]&NQpJ_|a.V">PX`\bPO#rx]=I ?_B!B{q }/€هBʬs q,`/Am+8z_Zt"W ?F1#! ( P FdW].16+r=G{[9Y6>F>L}Y49GzD+ ueD DչE.9yP ~7?4/T Ps*msTi֓zGHpRF6|NK@G\2_GkDA66{1]4KxiYǼ) s5awF}C|]Owe ! !zJ= WKt+` 1o\B8"A]vx,V{hw}fzD 룦sKea!P0@!D塞)mS]~1}  G<sk{s8!jt tn^bgs ^F0+ᰪ?;"@l Ef틤t isHΊZa$3H ps9EW{ޯ,OD[2NYb/Yљ!K>9Kvv`繄B Y;_xze&0Xfzۙkq ӱ2)F}19€Y`d1w r8\CL?yc >G_ipFvmP.`"QzrL- Tw Q.P,6uuT(_a }#,ϒ##\} "L_C  ( e'S#3p56gN-7ki&6k$?[[}tiTnCITs€ Q_+ϒna{0L}} [kl9'Cu2뽉\EjN_G mDqv F]@8^/huT鲆kBGgb>U_:yE|=Am(Uko^mnӺ!c;K{Ifo0sڬI9?Z>ՋC^aζ͞1˲y0X1G(Ẃ€dNrg wM?H_> )d&0~>//9 a`I ;z=FviM_"r.:Q򝩣bѰ.a%j:\ 7CT u}6y׌ݑLB0@am'uzk=T13Cֶ[?HFm֎#z v2e[ ]elLj&IŁ9z1`0-׳t{`KKtG F`nr7DD"BՃkC;>v߯7c Ǜ#E,=*\xsVɖBS fKf*޲ G 3ѪB,nufv@f-=rJ7P"E{ďYr:dd?\Z5Bf930'b1ɋ ąG!$S6/f N؂aiW m+iͭPc0r/V(c9}nYN}/כnyw(?{xBYə|Mk5#  ;t[+s [ZOӔekm#2kk*Veap>ڍ Ɉ趜Ѳ]} 3/:Xˇk_և#Y;}VrG`F>#l?RPN/E*bQ/N&x{_p`t(F?*gdZ0ZB{;{t]CG}ش\!g@8,fv@9fz_^pa7nШ'Bl]9N"RWCM}hMMkR P0po'%!rj[$LHmuj,%ƃ!j$\8yY-kvfݴq٬Pn+Y#_q|WL# ~qB_XSJDaHnӚM  |;sp;:P3Q1\-*ksmߢjbfVhb]֙@춒;5BHγ函M&hFHĀ =70;Ц5!( ?II;FB {ـ4S[._JЇa@HۄY;VrG`vBE$o% #]_f'v!'ڴfIaBas!莟nLnP?Xp]Nlx%.Ӄz \wlq$+Y>FGt|6ko%w<6k#gˏ{z1 x׹d:zPB{0t$ tCmZ) B( P춓JG{ l3a 0PCo@vk/K%t;_ LŞ@7ռ̴]aRY;|+#Y;v!"'Z$-k7βlfzЧlӚwM]'   j*qѦMW8k1v}b-v6kg%w6k#̳E7G[M +`5H?e_Ts ~S=[m?*@* ۽Cu #|_CF=u` -ju\:>5,!#B!=-FW /R3h;ɠ`Oy% NZ)WߊF̊]KBHނ.!B! j-@## dxmʀ}ui[Qp 6ϓz51Qka J} bbY>[! FY-!0;x "r. €f3b|F1VD"K=cD){ߝFj{(&Bp9pK!P0@W'TStf {:1a6`H :)(}€N1iY= Bt:)z][~>;YJ,K;}X3I`~kp/x1@!'\Df':=̼ܚ{r:G]z- `X3~B0EI'#* jJ` ..Q϶7φ4_֯dEC!eֹĉ;@ Pj|! ~f#O p%08T[qey- 9.yi78@_]ExAJh!S#7 /Xof.Q G6Ehl[g֦al aGfQ^h6Qϥ]j5(Pg8;^|kvMԡҵݦea^onfٓzYF?&D}|(V 7zyJ7;nkG-T{k74ʧ>p1R   ~M0Mgd䃍(|Fe% 1X 1TR$HA-. ~q21O_uetPU[IEp0LNG{_"ϐVi5dX皈QX[uS_7m] nGM򕥫YA6;YX-KCTL}Ā︲,vRL>؈@Hahzjad۱ > kq%oܢӾAaB!D!zZhL0rҙ↿t9a !kQb%Ivt`,S>O}Mq&K4JO~[,#}g얙|Soi(IopCֳ6Ya Y:Z%cE?<u;BaQ`u8 !0`v eut#3€zBCxܕAouk!WܿYzB v nt ~B˺͏̈́ !(#@M2Pr!M^S(@I[ :}=-ڕ3Q1w bI^@5s˵>U3DM6|K;+ €^:]9Bdmc/ HDė9.Z[m 1>D\e D?[>Ro;!+,kxIQ?6; !d`|xNga@ )dftSϒ,7{lN0ZJ0g֯R_"6a`ggd@:VxDEf0!n|a@y^`݄^O#l;˳βa5zmXEDTE"dDԝ}CY'IL&<6ۚR B9tn0Pz<UJnj*yB.2 (2T0[۵K璹^'tLFg Aηa f`e\՞`&uC}2ib\{>jcƱDˤ/nNW3X#fl\;+ogy,KeWDb@Tǎ?~: !䘽0ԟ`4oEU:KϼV W̆ { m { jlMK ;%2k5awP0?x9=֯*Bze麻ߴ,|2p^R=0KnYfԺ%FڙBCyGka@=.Fѡ>v5}3JWuij钤(^B9sjNrڃ5QRvew'yIt9})Is='@">[EzNj6T !t*u\؍4j.d+Wh87^hu.Z)Hb-Ϗ]ͺzh:U=߿Ozng\U#Vā'B@&Kmα5Kl^~}׺^m\\.fHi syO{m ( Bǝ~bguF !"s&r3X:+'ZˆM t1;-9.PUɕ"3Oq.aA ̭23Y@I^nmα5}}]Q=aj]}meZf>̲*{>\a@/+r% B!$;X:BHSD|rjV<쨗XI:S+XG=Kojsohe#ϾֶٲwZfQn # x[m&G  ˆBs . R,?_ DkiO}[G=Koۗ8F-WYEomc+ZZs0v_kl- n39*( P B! Ek(>5a [2nz( ou|W(=w+__m+otkz9|d Nhf{oa@}sx+w;͖e}0`0 n39F( P F B14oU?A,6DZ~fU]Xbv)j%CuY[5uVN7_ԶAmm+N= nklٻ-sv2SKq9﯂#;B( P B!3ZX~0U]`v Pmo*y+*~ͷ=b>ΗP0@!#>[mfBa!B!ֶl30@aY=B᳅B( P B!B( P :éu כ㘣ݸCLgstŸO!Vk/tg!|B0@akY =gmsq5E`AOqC|Nѝah+OEXJjkf)=A M}u~}vmP)xxSzB!Ba |4^aM})K%=Uw12a€]Ѓےd%̓h:\ 7CT u}{=^ߣs9G᳅B Džg&n5o(xD["׃RT"P;-*:=%х‹Qq + bDe=-?KfJGwOF B!Bay逺;53@]0ugX m[&XQ)4epoey0eb{U:_bok)׼.BFnI+ Yp+0"Bè_,`M}C- Hp 0yəݼ3b$ PUBl!Baݧ=%ZŗpKuh`%Ʊ%8I&5FS"6 ݸ!C$OQ+&+Va`ҬޢQD{k$ڠиCo ern:pr)Ci%J=rnaKAw\ҙ.#(9?cs-V1$ Q3|S,0) B!Ba Kj#*€=e0$i.a@җ9Ŧ$ҡվӭ5h /Qt\QILÅ"-?`s) N}s :bVbpVOۃ7aֺvH?p\|:G/Ou#!P0wל__Ga|YJR|!OЄwҞ3xX3fP;"$Q3e0OC970s",N6n=:8F>zDJ-!^ zS<#ɟq чUȔJ飄 ˇ7`/E>X~ Vr~ގ DB!g $ J7/֙.6-Q " <co'3`€&puC2%#nNr7љ!a,5`g€ >#ƣ{실NQE4|FyZ'OF}Wh&NrG"=k`po,S0b@^} QbSAᖣOZb"\>{ [u᳅B _8@&8k<+aD^}Jb}kXo|ߝg* ߽!eoYDŒ[n:HnFL{3.[pj!sqXefBUYANϲ=GQ-ާ/ DH8ΟP1:h{NOo.FqӼ7P-mjYO>< tZZ؆J+7N{$gJMiu.38'0 *cyZ<&Lj`T(eeY0Sj%FkP w:bh))5& B GB=# V9 _>#xe?TP2a1%#9o7G>HP1;{1Hkkt 1O ?DLMNL}z@m=:v6GlSYDR}D`[[=TWHYn aU.ny50<+[s`y?ٶ{pYK]n3x`Q(V{hw}.OUt֖:wLLJ۸~a! !#s8j$-\bgs ^F0+2g'#@uӳ#D(%Fȵ &E:qk:(RC-O2QH#m2IE={R^%Z$!B( P Ϗ kٙ:|ysjAԸOfڙCkm+Kou$[f\EE}}+Gt1mP.`6]" k`vEU[b|l! , _B n;˝ݖsvglH"**kN.o M>H0s\G^Jz^mbےV=W1$G5RM[*{ުUY'Rknەk*y_f4Q1V#Gׁ !9z>Yv}.ѽx:L_;3f3fYC_K;l[JPrmKxDE"tӵ_ܢpNa Fg( ؃€,P^oZ*P(nKZvuvelɺ"n KYzvo;Z M 'r3MͻeeʳoGú)׈KڟB( P `0-׳ty{`r4[FK2h=R%x|T2vٷ=%.N0@ ˆl}Ά0]c7x4r47YxBHm^mQTZrIwj&z8bhTMWn a`y9b [<l;TKg(VR$&L=E?&>,`XA%J}P$@HYa`w.d2=c#V5~êښ@|~+X庴yw춌oo-r #1!( BY$Z8Qψ޴V]&-PI)l9w0Z~5l-wіrI_,iZK1,DtsLO6{B4a@gT\̐agvmUEcѬ{/^%6 9:ȾuT'l" T:oPyBa!!z Q\ܠTnx>AЃt#R}'$G#2$Bz`@el^oVkǺXG=tdɖB0@aB9~p  MF=pn &pIl7BﯭBqs9y:Ult/}fk9|A!B9Y=Ba{n 쵵Hvb)om%`t0^Ba!B9"a@'n ]@mÖ3e&oa{0 ʴ`ԉBa!0bˆGӂs0[2nz(bS/X~}F {qs! !B{PG\a)n άU\[[kJbcjTnZ2/]۷{!/n!!/!zgKe1) m1!B!B!B!B!( B!B!( Bg!|B0@aB!B0@a(,^,x}DoXvE|d9Bl!Ba`~O|taZ_3X>[0A!B!O@@r]P#^BU!#>[!  K:_;MgweӼ@׻Eeq]unYf˱XPAu7kP6 ڗ0 hCo\`/1r.+wP B!P0@a @G{F Q.ܮNQo=6K;ܺ\c 醔Y*-pN,lT|IJADG@0lyX٧IAWu4ky*VB*ztBZB-BaȻNY|'gHQA2_AwѺۯ.'[m chp/"DpF 7:j5#M|i1t9B! ( @MPZ 34: Tnf2nS{p t1k{%Ͷ H zf9f8ބF B a#Z HDJ:C!d7uQIɓ}:aa@go ~0@0v^bߋJ`!B( PH9F1W4@`H_"@,sXąZ3Y:О. *9R`0NgP't}è;DP?_o5I+>F B0@aog:IșXz: # <co&,i!u hљ aо ' [g!I%ڠp$N% <`@>K(-CއO;!B ?u*̶ښlXn7\tK e+6&mv 5R_BXS;Jpjo,%RH׃pVO 1n_y/\XߊMk+gf,Ѫsvۢ# 7(=J 9v/af̊F[:ŏڄiQmM:҇mJ#!P0Al,eg~P QF )] -ʕgϳN:-Tncm֥j,2 n#c.`IZ>\B@E[OC۽EC6D`$֧R'SlT~8mtѩkJ!B( P 2~PJkgt ߞ.XJ4Ry>qeefOƢ'hȢ-Ir(RPLN$zuB1@!B( K ﷃuϓ79Ǻ 5Cc<Dwf(OⳃϪޯq0?ou _稙i@K!B gaWEVʺ5hKDChRXzn*;zK} ֊ ,Srs=[0ggscxW"Z4<jp0›M}H_ B B:LnϺtÐnXPzvDgWxV* JtEa@  Aoɧ}XI\i?0`h8= H:*VF1;rV)ߺ9w''/ B( P (L0>IX~i?.'p=t@)^/`R58xh4|}N zIjcu 䃻v  {ևHhg֑;hQ:#__I P0@!D52tw`dijus%6ѪB6YϪfe;OTM{1[G- W"X RłldRF@"q$IvpK/& B( P gșODJTψ[Q%p0Z~P;7I #|-ϰD{AZJmSJ}-8l<%!( B!zHm }(G pCʧG;H GX-E|a`do C0F9u.uB BqG=>bdQy:l7/}["$HqFu49ц Ktgh>J  !Bc k$= ωͧޗVv7Ņl!( B#!||R0M[t{!1ܞ1%y0#<|0@!( B!|Ѭ+pNsP-jO›xVz^{ b 0@!( B#!( Jo^ `ڸCm""] 21ۺA"g ""b0`W|gtWO`{ Dr3G3uAFovV+ocmTHAޗ g 1`0@DD^{p)'FbOo4 Q<~ZQgw&f4LR(JQcggC iDD g  DfHk7(m o Tqx MDv*\ۺ`@ ek`! f?xDD  {5%` ȉG4j̶Zz63+?vu!5:3!s*%nӼ;^S|q1yn1`0@DjQ:5^9 AsڠڏU.`lvT-eI7Pݨm}km@ayR,XW EO{|&Dnwv?}M|_Dox# qΊ~+ }kگ𘷿'0xb1`0@D'P&9X;2LW@*_[@f-C0PWlmR:^}ip𿯶WnW1{{XX j__3/i,ۦf/Hw_[79~0TQJ`ؽF9Eqpz;[""XW3流|%зMK[y_0PAT@\" GQ޶6kt{ۻ{b}1!c4kmTG=|> )( ksjSiiIyhwGŌ`|\̿czOy6*Zp{P~qpuPk0M^[ODDdJ`*ߗ=^)xkZpz(U "j U>];?̍mSԕo}&32VKl~+_wLWX,^XaVSaܡZ)ԭ`ܿ`@Cﺕv[Kk, PUkAh?.q`S6R철*k໗mN2 P ~}D  Ѵ+zYQ|77oϘFpԽ@jQZM @0P 6`vnMb<#b~|p/4W;Y|`0~F2!OZ۴@ 7B꾀_;m2rFor_>wLiV hп` {*b7>GNGQf(UKV(߿.q`FP-VR?,B4Q"",rleeD|n7Z/TDMܻS=m'S@ZiJq|VNqב۔MCZ<*~,d6xMe3:~G{ڈ Z6f9fǛ#vu~v1V g?8ܿ f_,ᶏǫߐj G/[7ٲ\|p)Ce){+D8*pz˂3B`""FW6;BPU+o3*mjj&#Ca(YV2dX[WIrP {P3ZWDD-Ъ,j+&HV;$Վ)s&Jy1d0?ʕ_T<֏Wx`D`g ! u1*vnA߳_^ 4[·r׃|DYq "b0`\Ov_#p,R`(YVrR ˕_T_|Pa0@D  qR^r~K.AV%BVIPʳ,ejQϐ$On qeA DDDDd,/z톨 `G4,-K D+\,Wz|Y?Z0 _WDD1@D<kl[fr\JyRҪ"w!"b0`""^#"[""""""" xUxn!""  0 "U="⹅ 0 """"""b0`W""b0`""^#"[""""""" xUn-DD+ HwNPqFH{H$p*'?) h(Q_Z P1N;Qe}a&רTD@DDD_` xTk,}M`$fy0㨶r-V; Wh1~s;?8SAr|0`⹅ 0 "3E0_h_apo 5<[~!gں_RccՏDDD` qƀ1PW/a)m@NhwmdD/)p6j^㳈aWNPu#?!&r@[ћ}X#lڼA[o7s 1`0@DYr+~;Kk?*'량zAaMoǒ#ܼ]^7A헷4ߣ젒ʂuUڸ?B5}#X`u‹Z۾R@X#"h;^}9Z33 ͛ORFv5}" A>+ÿ"""b0DD1F9fЕrb~,jЭvidb@F8X}r+-zrߛo ?^vy#P+^ϦЈujy1B%g,Ò3Gc#ݢU?-u89j! ی:KOL(&g䍁⹅ 0 "5gO`@^.b`F+ -lMST>AT0%xu;ڟ7EGyP _ b0  /1/ʽ 69>6Vi6C}hd+Rg(k4bB+KԜ3&kq%uٺ  8c򪾵]{ǫ^`@6- `@^mq:\ڿۻCGwJ|6@ȫNq rDVz?Xlw=,os@`~4V9Km_ j^۟adߡn[V@E̜j 9Z=onO ܱۑڙKk_V;>`1ɰ>>}z~5x1^Zr/A`@Y\>CBUaD*vp3}Ug4TM&鋺?>||0f9\jSv?FVQ pGk!l4VUcLϘcxs5sG@rgyک=5KG_@=y^y h0`0@D]9 nM#=(Kԛ7gL[8~c C8amo .+ g$BbziT\]r{3$֊vԺOj5uހo?¯W '4,owr;``}b~+g[̥6Kn ,!"Qz`Wy5YQFnBJvfb}eC_ɝ SHÙaAf ~q/S"WRZ H >w8hԂGQW`{pSxݺ* *(+~,d{;3 v]^( F NUz[o`}us@jXm߲>1>[fIg[0~-.j}YBF%[$h۵+L+!_ooi# <]A @/ :Ĩ3 cWf-N)`(jh5<#|tbdVծl,m S0Ԭ~yVˊ`VަFݟ}q`j[`2R-{mqe0`+g+9,Jl.WX/'=}l4#þu]gA2{TfC?~+6+x<( q#o X@oktv?EI95Πw KJ_`Ԫ]sý[z,rnл@EUL9\&< ?ߪ6hmkp{j~aMU9y [,kt{{qe_9Wh32 S\s)`CeJۖJ  wJ+wV(\! GYo!׃wV63N3u›ĴG~yeX~Ndk, @@5|5.%^ ˄yxj^7R{تǕ65[?`CmǷ{}5},}Os\s)y~?7Wb0`ƿSx@~ɧ~VkM^ADsԦV>&x@sC5;}{q̪mx`Udg iA_/hY\8J,c; kԝST oK(x +1`0@DDDDRj:S0kkkayb$HKQ&jBz0x3W LhQ@r+xNj 6zɓ,SK`> { jE0QepQ +1`0@DDs˱ҫJܽ8\@-ZL[^q %yX~5FUv"Md,b\@  U5kP9Xsep?H10W 0 """+۽Cߋ+[P珆cL ϵrS+e\U ?W>gѿBeDꑥMv[oGmc>=uvKڲݤlKKjǕ 0 """3 W١+,Z|0X p,]mK siӟ||?J*PPǕ~`g -Nv? 1`0@DDDD$w 1`0@DīzDs 1`0@DDDDDD`-.[$ppsԛ7H2DDDD>e=ȷ=E˻Bz1`0@DGD[Ի.0]]$ "*`0@DDDD`A@J‹<pGd<56F"DD`g g `KHY<"{ Eٿշ[* =8A׽B C~`BX;SlnjF3|yA#ht ~Hv|<3mV_mnݙL؈YU sn(Cp68md0p Sm3Bn V<'fpgxNP'&"" ~z2^a{ 7 xҫh3wh_o֥,-]OʃcלV }JMSDˤ˱äKm6+bl헩@fh 0 ""umžU+(,aW7ͰoڕWx p0`hs6F EPijbDnѿ,!ˤ˱}DD'UmпgA}jH4Y>ou6 3{Yxn!"m0`@Zm zP!}FUk+*H͆mIV`؈  񪞚/x{OPfPdWAS{s(q7o j6>L0rls ""Re(~8 Xnk;|~]_/oPo 1nh\16?eXs 1`0@DD(%22QGˀmTC%WY&ۃ؈"?^6D[""R """" xUxn!""  0 "U="⹅ 0 """"""b0`W""b0`""^#"[""""""" xUxn!"" lp " 0 "U="EwڨTNvms{<k%~>RSD)~gD` xσ37@v"1oG#5㍈o`Fwp*ne0bqjSߡnuo%,+$8а[fL y5D`g -9?V-wj՝tFXdyzİmY+9^7~@<˟["|9 x"hM\\]\ exo[խQo^?gd&N d?mKxsm{zU%""""`k% .zuoo7|Fnyz0lAH.ÇHdPahY MKA޿*5^j6R LS~WhYr^h91`0@D+Bo " |m6 em3 UӶzf]v3lE{AYgڭAwxgY!Qڪ#ƽ{ 1`0@D00@ K?R7ò2JG]$Hn߇A ! o{bb,[%Op-6Am6WDH&%@ -zoFO^Aw>`@m),Hˏ" zrY0mni"|`08BÍ!~lA`}7Eb;\`1 ۚÉW֗[<7;'ZM g?F+||ޑAD >ߣ?CReȮ5 L%K_@93f3˴W~ K HS?][yՃ R@dhTm; 0 "U=s,u Ft@6][vk?ݢU?-rع׾4m=06d{UwjllptJQ{˳iqBƬ‡^K!a cK8ud Ezb*pZ:!>#2?U ,(R֣;?4GrNl7zc35G = ;!{@P菢~)Qb š|tjrwY١$6e>iɿ@]]Ol2c0̍6.}W! 1Ge```p b=yT |@U+yd1H oBb2KnBh51v)ׂ[6QIW ߇3 Rtc|/`=A%>>b{\rǏՏc?Gki#2%rs͕a`A-ruiдcZVM)1oL">#^H2^㜾U|ࣇ00000Ā!xB֯nca.wygc<0VBRHWb/ЎŪ~ۂ$+b{ :..4RF6v紖rmOhGEѫ|[\0kn肳oyg4fv.m;V , qd5|H;Ed ]{d[Hq|jx!!׈9-J{=1 ~gK^/iߢ<eˠ}G/Z\wQTq̞}~%\u]Rx9~aANEseW|MU=QcZNW)`W)Kblev,m$CP=cF<)ɳt^>F_NH;{dj\Ix֬0m_c؜ ┄l7}wͅ81'悓"rܤuw4U'+vB18bmysaC ԉ#'qxW#ӕ# 9P bswh,#X\+vy;Nia>ecо%D\б)vT.Z7|ꬂr5~ӹÕ}8{ي#K&Uz)?}H㌟7/| ._^UїL@```p\b\@Yœ 0=,'U y21 -T)y!GE׎mbW)U QUeӞO7$Ni'G|b"inمt M])5=-[CwE[̨+Āl &oɥOv=E, qT?z{ղyw^`}߳E=:-15t[TU'Mb 1JboԶݼq"ߦv>¨$[/,vo&X3"n߯8 b7gEK]1)>d+yQ׿B;eBh]~W;?, {z qDcؚˮ bY}TΒŖsR_gN|J` Y-PV" {}yDž! 1@壚ObDeLON,m~OT㦡AI0cĴ@L-(uly= 6V@I88b:AԥC[*&u B-$E" d:;VϚvBFvj1-<#vdDH=c&yD4e7vNZ7q;4'`XzhP!¯Q||z.iekW :|I@yK WЫ"zWGSvc~Z˼ЃO;Uz^-( .$s)H#$1*uD\Kt(+Q<sWmSS3e}×ip]'nO_P[4$3=b6,=15oYHA=.^^dxC TZb>:h~A`[+c9IC Fo$H}:*\.&j򞚻620008 1`>W8 G.PW>4ُd~<:"|uǙ`ǕrdNpbȚ(~v'lB:*UOFWf~CJky H;_|{QYvNl!Y=7)lDSetvKl2O1Ή4#Dy {i_g쟫.t_kX?EN/{/׈O2=so+yGy/&2}Sǟߣ1I9rHy`{{/)Xo<Ğϋ(xY{yx0QsO?e+-"[MpD2'!VN s" e}#;K 7<<}c;ؑp?tKߺiOg{ AAX^#b)a1m2=n, L4m0f>*1Ym]Mb/O?w0tlYh+aP_?m 8"zluxi=n|҅N ܿY`A!3z2>j`````C ]?w* ݶa ٥Nٿ?^bڔ{wGAcxf_wT"C#3S%=}wgQIÀÀ$I$I$I$wf00 I$Ii0߾}1 aPa0GYI$IR0p6ѓ0 TE@aaP`G3Zѹa@$i/I4 5 tͨ4 0Pa,@p0PBm8npF_0 LLfgffffff633k8 8`C\AЊ`ĨÀq_9 )g(Gj1 tR@0pjPm~aKP0 =:pasSSS(#QhIJQ0o0 ߆0P0 ԡ10ЏaTlI/ 0agQ0 }0 `@N4 FЂ6t7:dR@pщDZЀ:T( 0:2T*ц'D&řxlDt 0PJcoG@a >! {1)\\M=C,ywx7K^)!& .crD`Grwum9s*IOb8)3c%9(jK'/;+ aT2lams׬ mv<6OsҼ2o;|4g|$W|6Gso+<7Oc<0fl5sCՋI8" >a9a{1kfls/ā'Y͛k p_W@'}q >7u̓e͚7saDE$ 60oE8,,ΘEM%y(qy^7ID^WD5[f3L +f\3=3-,N)oziaa7^6Sg L S^^6v[N{S@ͦY7aZFS7,0 Þi3fS<<{@'4y/ٴ@8S8k~Y<(aTdag`L \2rqj@zH'@m':!tR,l3+ 030{:\>5V@N4'|ȣ@>-0'tX_ ,l~>0PO ԗ ܉;AqL 1Y J x#{^v{.1@V͝pdZW\#Ⱦ0G[]$H~p( By/+dr ,${@"A<܎,͢i)3~A ChNpQdwŁvA"'xC@A`7[@.6\#G̡bla 5ks@x 01HBb 6뀻(w 3L@;/!vqF2=j݆)fwOpfݭ&S7ZE@o J0e@w \6U @nt`md[7kdJzX4XEIsYw ȴ@r ; 25P]'(v RdC 4u'S$跁!,i/[`-P]#iQ@ gj@@Pw $_ 8"P : *4 +2%0 &Q BꥃO ."_ 4k= :A P@什Nh]88\O owz ^(6zaz`+NCA(”@ K< ho_-w +qr ~+HA p nQBrz'B!W} N +#v * @hq`!\j nV$A(r'ܢ&d:ARCknta`MpRbr](TS$psZ0Z01`uդ@^:Xq@wSA —j\ _M>0jGhZ)@ZPHCA0?i0bhup#-@/M ~wV#~5 bSQ J U@cwc;Q`@0_(Q 8#@#A6Q`.+ݨN ? 08 @ $H,.J8bpiǀ 0ЇAābz@A J$D`E ȃN H0y Tn,gg; p&1.Ƃ*TA@$ * ߋ8|-(A $` u ȃ Gk+ꩁq y$Pi!! uh!PCoi (#* N<hc@ZOC:EB8I@'hx!ɦ?%0Q 2@ G*? a`〓8P"őo(lPE^&>"t7<7<&R @:G9 ,Ł&W`r  xd!|w1SJ GIN.b \& -nL K,ɹ `])\9 8g1A`C۴(āɡ 8E!L }Ң}qr89#Z(8hZ77oA+֊zH/h%`,Cuښy`L@  =IENDB`cups-2.3.1/doc/images/cups-icon.png000664 000765 000024 00000006516 13574721672 017227 0ustar00mikestaff000000 000000 PNG  IHDRPLTE}ctRNSDXdo{}l[J9(PȐ Cw5pjx vK`^/ =M4OE, !Tq׉@0QI7%ڼαyzGʦA3et>_<i nH#kB ;Fa*SL'+6~䖡1ø"]$⁣W28h-|?s)ť&:uYҢbfRVrZmًy3 )IDATxSQQY E} 8t$+‘h,HSL6'bI)+Z5[Ft~jwt^d|oe;D{g<)6 P\!owl'q`ื_Pm?w [G'%*ZCf4aNݛ?g{? \r%c}ޜwrhLU9y7mr,-u{d1M`L GPI@/&R.8d xr@">wGl<|](Ͻ8וFP3H}a/z{1*x3h <^p^wMBO+k AO (w]|}˵BAxjrQ XwTUu-QeV + n>K85 jM{H= &p' qƶֶ]^ 𣦀|t~~F gɼg982>&r ^%:|KX/kz|o-YKHh|/~xn~%(,D-C*FCrBIw<Vr#Ϥ)`(~DV e7Hs|Sv0祴h M aF|1FLIvI}d:J/dZ3 tJ$/rMA)t-IW+<.ɶtbOS$;e?]HAz\ 6Jr r}_ "x LڛȞCD? !j.J;<}J\(8Juk)VQZDP2CYPGC,NCt(UEl@Tb(xPTh `5%?BƳ*̄ 7Rz+M81ߟz*eM^; )e΂*jɥfkEAT @( ]>`vt&C:MѓPJX.OP-: Rt>4PhxhPCm 49l /JcD0|P_B# cj<C&aX. hg7SCDD_`'BR)#"ttK+>)vB{锑z+y?{)ڿK)o[]ȈWֽs_]ј5Io@Ta4^^hefS9>Ant1c6ΥV4;p=|PD݁oMcXeg*Ə/0ǘc}7vt9餓X"IENDB`cups-2.3.1/doc/images/color-wheel.png000664 000765 000024 00000027652 13574721672 017553 0ustar00mikestaff000000 000000 PNG  IHDR</qIDATxmɲgۘm6m۶m{l\۶wx+#2D{k꬝+wuP̿F:,m07z+w ">F[gf+6u_ ;&gӏ&h-NwHc3C~;yK'4H[C=_ Gs[o>y1Ͻ/ lY?&n`;5ɓS84Mca&"- %_hdY tq}$}r:&z:z?_x6z=O|1B&R_o}9| SL D@7"#$Fx BVﺽ}VO}gQ*4uX[J2T7sN; !wAN|0YP n_9vPH_>@GmZf!,Vv7ݷO B;U85Q|FGsJ/ ԞC糟)>\> (i̽hGjh+Ο|Gz)t6%ؖPQ$2?,UgK~sPgP;E|DlޠCI=2`9m(op;?_~/GEL 4 tTh lXl pzo \qz }F)BL^-W/F?o|QQacInُ50:!úN k6ql#\~/HZj#[*~U]}y\ll 54ɹ(ʈ,Uy˸op;M@*DNo$ր $VxKнIREѤ#xyiԆm  顁Ļ+:HZ锬I&Ø·]ț*=BR4`Qi2dl^|WXT)3uݞy _WT ̀ja^=|&X PΊ]~գND.|?{{U~UD1ps Mi Wtm>!y[z_gS4K+"OWp+4a~Ȍ]ŐM!t;u~g5e'=>IYi#d=^=!Cq ̏z.!ܬ͘jYYއ_NUecg. ^>RttIC!NT6Y:J <<N7WjB"sv<[#k!'N|*](~t8= Y`ޢ{--8a%63P z {o-S(DOMa%bheHܘ"%ȕbA^Yu"*(.; *vio:C HѤRf5׀0?& }\D_l.M @K=lta7v)ߐ<#P@=_aF6 Fr[V M|&ݸQ*D$)ȿW;ύ` tJ!VH嘇Z,ufTX ' C׿1|۷ݘlY-fMyg/"DkShrku\1fnwꢶ07я8Hʱb)6n3;@g(M\KC°:([ؔq_yjR~;S\vhhS؍1g]} h)ϖ|\C")Gm&2_nk ? BlǞ)ugIW UHF}),k;fMmbL}_ >wfGD"C>ݐ,c0l=R&#=dd|PJVE7eYYph0U*Y;7/WqA'e;\z!Oz<{La?>3yJV-qd+1Q-d |-bo5Ѷ@zvtRP{5fG&'تPe%@t*=qCZOw#@hH-4t&j(xf*":"l52@$DigW-45A@ga#T@)J[gkz{ԟکeR)ݩٝf/YOd/5B/6suzق-캡$^TBUR$MJ"xP9ZP()qhYۆpn C/87W qQ+P+ i74Z8Zl*}\blh#gBˋ/Gz Eg|i}^Ϸn>gJ:CihfShod.;f m ^# sS1 3h:C>!id=L7ڞ 8zN&-iCo:bM:؅ y& jPR($͂EMQ!@þujNP B|7'IG*tvD $LZIM H|+oRm6iL}.lo)жUsaO#;wkA=ؖ]ЭsXRvhʝص6yIi3њ<B8^{D(2&ڀzh8nցI92ffff\f|/`yRCuUd?>{[cUƉު.I]?̓r 9vHμdPe,$x͒ !/BZ=~P.LwثܵJrEf}|[B˰=+v83mnD 9/щ:zl!g.F[yچ Iute0E($3IZ䈗`*{1dm^bHHΖْ q3qtHŘIv/@#I4ePO"dX*4/ATSZ~/k(U4>A*=QLaUwWNV&yB&-p|o}-iH2U}Z 5 ,'nf),v:K1_g)"w=PAZ2xݼ#RqB:z%&"9'1ł:ۛyF@HXimnժVD϶qʶD2CG"n~OBǕЃ=]?}RrRRv/"Ɲa)t:]'4m,HH%dў،LaclC @M[=3mTSJ((tM!=?N|wq4q1MP:uZjpf ƐWB2Ba[Uj#csɹ&MwbaΤ6 ;x3~crX{١biQӻ#7O{T%}LYfAO3,,/w*Ul9Ymb`Js]Jw>@PFF_D.ja=s@0Ntx<"ص0"LvpAjhL(k"[%gn@ 3KV*N4m*EJV•t{WPU5V2(x+jEX*DV%{ѪX7.^x3S(Mgb\!`tm$/br:lN)tN59)30m˭ФO>q24gz*VA/<.Q-?>oа)ZX^o{Rg#m^kCb>cslL?0@[0g9Ӡ9w59 g(첶` 3mI4M(#'F02=& UO$0ڑS 2eKkKG?`?Cz>]A[]s.ʦuPgM6Mf,̴ Gمsp;E9t*k*ztb[t^z;Ǫ2Q# ¢ְӍ.X毦|)qrFѝ U ͦQw7Yllْ]838 }ZS4zGFFWWao4~Y8ZNh6/Z-o< 'β9kx\ sh#Cp6sفE RI6&+'"ܤ/^`[ЍvrM~~ }*ۺ c(kV:&]lç8` ȝ\3(qhӓ G!CNNN*cCUžuDz !^0FTb[%WLr(ק8N>s;7?uj8ΐ3aK=i2vG3n };@U^kQKTtN,|E} IXh"IMO׌Qo9)F=?ۏ>\!=CPQ!1Pj2o<(ܳS֣NzyJ 6˖C"*yZadFjÚ wS6fsngzÖ0:,Ocr]aJ0PPݻ&zO^F(BK'Q,s'oĸs4L|%0y kmpYA?^d!ɻmt/"WBC5[|bD}ʋBq73ӄfxUѯМqN{؄⪳L6)Đ0**37zB+fÓ/u6xcԻ)RBItrn7-`imo\N9Ʊu1l[{(Rt:zDXfh}c ۦN~|D93d^ cIt ǧ'c(HčI[4Y0٦p|ɝpvkc4| jaƔ5Va;λt2F21vgC׎5PL)Zz~,B2"VL KU cE6ɼ a8:&TLq%Qϒ露@IN0M; EДLK˚ROF\1HTir eK)[O9 ՖT"m8%>@G~'C%ː tڴ%*eh bU"` V)XQpv88eeA>2EXwhr:/N5TUR6Z(C(UK u KEx>ÊYw(*PZш*(7M),z(r#X-Tel6 )5X6v'NL)ޢcz/:3Kz?7_<(ACUw5#bu,gO~f‚loҵg{&B%ÜUؖ:+9dSe$'V)E,t͝3kb OK$O7`R5}[M4=W)r)FD]aI%"FɩMrEO^xZ0V eص6zV5-ҡH[#8@|U9C$Y)\G2T}VDRDrMay"L0w\ya Rj3XֈRYaOvo 7/ j-鼃C*7۵aox ϕ*K/LzXLDPihLMddiaL f4} IӻE\u%i䵫%]ۃ t Pv_xdɇ tIR71>Tan-z$(e=eHYfȟ_otK>dV2$}H -wFj$9H5v4)zԤ4 Qh _&17dgex?R>S*'75R@S;sP!_+1!M5I=]ޑp>>gE 0aR` Y$2F}wiŋ۽)RFFATu"_vtA@[ыJu9I\GG䶩s$޸YJjhf 2B;ɘr!(AY2UH7I lDdCBi&}٬>G)sn:?|%y6gecʸx;rp*f 4X!q3ɮ~0@ tRXJ=87^N'%7f;۽9wOˏWkSIi$P2XR2C)od({Hcd-Jѯؼ0}"_ \J(aH$ô_&]FHldљ0t\Q>r4!xx\ sDT?ܓ@*Bd}*PPvu6&̳It&t>;fUpљ#:Sy!~*J=BW.;= U@x2 Ҹx7֩ٙJ<,I&CBgvn03dDR[0\Q8*VЦr ܕJ!JUz=oM%:i)Qa^u̗L^2grԚS>z_5^jO{W_dz(JJg=rNE~;VC.Hv諹8.Cvͷ߁l\yM٨#yBs(V$O^gOWs pyF3yz6>WeY9=]YH\ӯ⏞ \Zj'_>E+iX`V{wyEZS=%X^7r:=}FT|'NY0?SdCn@R:HN!;莋Rcim o<Ҵ,WGua\_gYrfI! hBd:$^@$&قz=%CD-aⶃ#dz &ɡ8ejD 1DG)tVĠjN$K nE?橼|>_+{]Ͽҏ(C Z"T߆XP;ry"@o K.꘨MV(b!KP YꟓHeDIb+ϟO>{k Z5Ȏ_z܇rIrx{uat<'+y?g1CyDvL_"KItagqQŚڑȌPѴg hYF Iq7Ҏ7#}a/ۄQC%"~=,>7|M -xmgU8F>rs1%"槞7<{uhd< P'4}bнa兿^8RJ~[j_).z3:8~S {;g}Л)b؟vgW,o"I4*|3fckktB=7kjlw԰nv^~ĉ n~ kk95{jm,vrKp7*1ۙ)c߳!JOE6T Ahhƞr6 PLwwOpǝ?ɩfsX[16r>&v3lged9rj¨a5UKwk7Eʸ2w\ʸЕqeojL*VIENDB`cups-2.3.1/doc/images/cups-command-chain.svg000664 000765 000024 00000044456 13574721672 021015 0ustar00mikestaff000000 000000 image/svg+xml PPD OptionalCommandFilter CommandFile Printer OptionalPortMonitor Backend cups-2.3.1/doc/da/index.html.in000664 000765 000024 00000004510 13574721672 016332 0ustar00mikestaff000000 000000 Hjem - CUPS @CUPS_VERSION@@CUPS_REVISION@

CUPS @CUPS_VERSION@

CUPS er det standardbaseret, open source-udskrivningssystem som er udviklet af Apple Inc. til macOS® og andre UNIX®-lignende styresystemer.

cups-2.3.1/templates/restart.tmpl000664 000765 000024 00000005055 13574721672 017164 0ustar00mikestaff000000 000000

Change Settings

Busy Indicator Please stand by while the server restarts...

cups-2.3.1/templates/option-conflict.tmpl000664 000765 000024 00000000330 13574721672 020576 0ustar00mikestaff000000 000000

Error: The following options are conflicting:

Please change one or more of the options to resolve the conflicts.

cups-2.3.1/templates/trailer.tmpl000664 000765 000024 00000000332 13574721672 017133 0ustar00mikestaff000000 000000 cups-2.3.1/templates/printer-start.tmpl000664 000765 000024 00000000302 13574721672 020304 0ustar00mikestaff000000 000000

Resume {is_class?Class:Printer} {printer_name}

{is_class?Class:Printer} {printer_name} has been resumed.

cups-2.3.1/templates/choose-make.tmpl000664 000765 000024 00000003543 13574721672 017673 0ustar00mikestaff000000 000000

{op=modify-printer?Modify {printer_name}:Add Printer}

{printer_name?:} {op=modify-printer?:}
Name: {printer_name}
Description: {printer_info}
Location: {printer_location}
Connection: {device_uri}
Sharing: {?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Share This Printer
Make:
 
Or Provide a PPD File:
cups-2.3.1/templates/option-header.tmpl000664 000765 000024 00000000131 13574721672 020224 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/job-cancel.tmpl000664 000765 000024 00000000157 13574721672 017473 0ustar00mikestaff000000 000000

Cancel Job {job_id}

Job {job_id} has been canceled. cups-2.3.1/templates/option-trailer.tmpl000664 000765 000024 00000000131 13574721672 020436 0ustar00mikestaff000000 000000

cups-2.3.1/templates/printer-added.tmpl000664 000765 000024 00000000202 13574721672 020207 0ustar00mikestaff000000 000000

Add Printer

Printer {printer_name} has been added successfully. cups-2.3.1/templates/command.tmpl000664 000765 000024 00000000634 13574721672 017114 0ustar00mikestaff000000 000000

{title} On {printer_name}

{job_state>5?:Busy Indicator }Printer command job {job_state=3?pending:{job_state=4?held: {job_state=5?processing:{job_state=6?stopped: {job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/help-printable.tmpl000664 000765 000024 00000000562 13574721672 020404 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/printer-reject.tmpl000664 000765 000024 00000000325 13574721672 020430 0ustar00mikestaff000000 000000

Reject Jobs On {is_class?Class:Printer} {printer_name}

{is_class?Class:Printer} {printer_name} is no longer accepting jobs.

cups-2.3.1/templates/class.tmpl000664 000765 000024 00000004260 13574721672 016602 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, {printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, {server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

Description:{printer_info}
Location:{printer_location}
Members:{?member_uris=?None:{member_uris}}
Defaults:job-sheets={job_sheets_default} media={media_default?{media_default}:unknown} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/modify-class.tmpl000664 000765 000024 00000001524 13574721672 020067 0ustar00mikestaff000000 000000

Modify Class {printer_name}

Description:
Location:
Members:
cups-2.3.1/templates/da/000775 000765 000024 00000000000 13574721672 015161 5ustar00mikestaff000000 000000 cups-2.3.1/templates/list-available-printers.tmpl000664 000765 000024 00000001171 13574721672 022230 0ustar00mikestaff000000 000000

Available Printers

{#device_uri=0?

No printers found.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/printer-stop.tmpl000664 000765 000024 00000000300 13574721672 020132 0ustar00mikestaff000000 000000

Pause {is_class?Class:Printer} {printer_name}

{is_class?Class:Printer} {printer_name} has been paused.

cups-2.3.1/templates/printer-cancel-jobs.tmpl000664 000765 000024 00000000330 13574721672 021330 0ustar00mikestaff000000 000000

Cancel Jobs On {is_class?Class:Printer} {printer_name}

All jobs on {is_class?class:printer} {printer_name} have been canceled.

cups-2.3.1/templates/choose-model.tmpl000664 000765 000024 00000004266 13574721672 020061 0ustar00mikestaff000000 000000

{op=modify-printer?Modify {printer_name}:Add Printer}

{printer_name?:} {op=modify-printer?:}
Name: {printer_name}
Description: {printer_info}
Location: {printer_location}
Connection: {device_uri}
Sharing: {?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Share This Printer
Make: {PPD_MAKE}
Model:
Or Provide a PPD File:
cups-2.3.1/templates/Makefile000664 000765 000024 00000005724 13574721672 016245 0ustar00mikestaff000000 000000 # # Template makefile for CUPS. # # Copyright 2007-2017 by Apple Inc. # Copyright 1993-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more information. # include ../Makedefs # # Template files... # FILES = \ add-class.tmpl \ add-printer.tmpl \ admin.tmpl \ choose-device.tmpl \ choose-make.tmpl \ choose-model.tmpl \ choose-serial.tmpl \ choose-uri.tmpl \ class.tmpl \ class-added.tmpl \ class-confirm.tmpl \ class-deleted.tmpl \ class-jobs-header.tmpl \ class-modified.tmpl \ classes.tmpl \ classes-header.tmpl \ command.tmpl \ edit-config.tmpl \ error.tmpl \ error-op.tmpl \ header.tmpl \ help-header.tmpl \ help-trailer.tmpl \ help-printable.tmpl \ job-cancel.tmpl \ job-hold.tmpl \ job-move.tmpl \ job-moved.tmpl \ job-release.tmpl \ job-restart.tmpl \ jobs.tmpl \ jobs-header.tmpl \ list-available-printers.tmpl \ modify-class.tmpl \ modify-printer.tmpl \ norestart.tmpl \ option-boolean.tmpl \ option-conflict.tmpl \ option-header.tmpl \ option-pickmany.tmpl \ option-pickone.tmpl \ option-trailer.tmpl \ pager.tmpl \ printer.tmpl \ printer-accept.tmpl \ printer-added.tmpl \ printer-cancel-jobs.tmpl \ printer-configured.tmpl \ printer-confirm.tmpl \ printer-default.tmpl \ printer-deleted.tmpl \ printer-jobs-header.tmpl \ printer-modified.tmpl \ printer-reject.tmpl \ printer-start.tmpl \ printer-stop.tmpl \ printers.tmpl \ printers-header.tmpl \ restart.tmpl \ samba-export.tmpl \ samba-exported.tmpl \ search.tmpl \ set-printer-options-header.tmpl \ set-printer-options-trailer.tmpl \ test-page.tmpl \ trailer.tmpl \ users.tmpl # # Make everything... # all: # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all config and object files... # clean: # # Dummy depend... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: $(INSTALL_LANGUAGES) $(INSTALL_DIR) -m 755 $(DATADIR)/templates for file in $(FILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/templates; \ done install-languages: for lang in $(LANGUAGES); do \ if test -d $$lang; then \ $(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \ for file in $(FILES); do \ $(INSTALL_DATA) $$lang/$$file $(DATADIR)/templates/$$lang >/dev/null 2>&1 || true; \ done \ fi \ done install-langbundle: # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: $(UNINSTALL_LANGUAGES) for file in $(FILES); do \ $(RM) $(DATADIR)/templates/$$file; \ done -$(RMDIR) $(DATADIR)/templates uninstall-languages: for lang in $(LANGUAGES); do \ for file in $(FILES); do \ $(RM) $(DATADIR)/templates/$$lang/$$file; \ done \ $(RMDIR) $(DATADIR)/templates/$$lang; \ done uninstall-langbundle: cups-2.3.1/templates/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 020623 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/choose-device.tmpl000664 000765 000024 00000004145 13574721672 020214 0ustar00mikestaff000000 000000

{op=modify-printer?Modify {printer_name}:Add Printer}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Current Connection\:
Local Printers\: {[device_uri]{device_class!network?
:}}
Discovered Network Printers\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Other Network Printers\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Busy Indicator Looking for printers...

} cups-2.3.1/templates/pt_BR/000775 000765 000024 00000000000 13574721672 015603 5ustar00mikestaff000000 000000 cups-2.3.1/templates/ja/000775 000765 000024 00000000000 13574721672 015167 5ustar00mikestaff000000 000000 cups-2.3.1/templates/jobs.tmpl000664 000765 000024 00000005346 13574721672 016440 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNameUserSizePagesStateControl
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Unknown:{job_name}}  {?job_originating_user_name=?Withheld:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Unknown:{?job_impressions_completed}}  {job_state=3?pending since
{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?held since
{?time_at_creation=?Unknown:{time_at_creation}}: {job_state=5?processing since
{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?stopped: {job_state=7?canceled at
{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?aborted:completed at
{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?{job_hold_until=auth-info-required?Held for authentication.:
:}:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/class-jobs-header.tmpl000664 000765 000024 00000000034 13574721672 020756 0ustar00mikestaff000000 000000

Jobs

cups-2.3.1/templates/help-header.tmpl000664 000765 000024 00000003204 13574721672 017650 0ustar00mikestaff000000 000000
{TOPIC?:}

Search in {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}:

{QUERY?

Search Results in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}\:

{QTEXT?:} :

No matches found.

}
:} {HELPTITLE?
:

Online Help

This is the CUPS online help interface. Enter search words above or click on any of the documentation links to display online help information.

If you are new to CUPS, read the "Overview of CUPS" page.

The CUPS home page also provides many resources including user discussion forums, answers to frequently-asked questions, and a form for submitting bug reports and feature requests.

} cups-2.3.1/templates/ru/000775 000765 000024 00000000000 13574721672 015223 5ustar00mikestaff000000 000000 cups-2.3.1/templates/pager.tmpl000664 000765 000024 00000002347 13574721672 016577 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/option-pickone.tmpl000664 000765 000024 00000001665 13574721672 020441 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/printers.tmpl000664 000765 000024 00000000775 13574721672 017352 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Queue NameDescriptionLocationMake and ModelStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/job-move.tmpl000664 000765 000024 00000001136 13574721672 017212 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Move Job {job_id}:Move All Jobs}

New Destination:
cups-2.3.1/templates/admin.tmpl000664 000765 000024 00000012475 13574721672 016574 0ustar00mikestaff000000 000000

Printers

Classes

Jobs

Server

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Server Settings\:

Advanced

        Max clients\:
        
        

{have_gssapi?
:}

        Maximum jobs (0 for no limit)\:
        Retain Metadata\:
        Retain Documents\:

        Max log file size\:

:

Server Settings:

Advanced

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/choose-uri.tmpl000664 000765 000024 00000002025 13574721672 017547 0ustar00mikestaff000000 000000

{op=modify-printer?Modify {printer_name}:Add Printer}

{printer_name?:}
Connection:
Examples:
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

See "Network Printers" for the correct URI to use with your printer.

cups-2.3.1/templates/header.tmpl.in000664 000765 000024 00000003312 13574721672 017327 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/class-confirm.tmpl000664 000765 000024 00000000663 13574721672 020240 0ustar00mikestaff000000 000000

Delete Class {printer_name}

Warning: Are you sure you want to delete class {printer_name}?

cups-2.3.1/templates/search.tmpl000664 000765 000024 00000001022 13574721672 016733 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Search in {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classes:{SECTION=jobs?Jobs:Printers}}}:

cups-2.3.1/templates/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 020417 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/set-printer-options-header.tmpl000664 000765 000024 00000001475 13574721672 022675 0ustar00mikestaff000000 000000

Set Default Options for {printer_name}

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/job-restart.tmpl000664 000765 000024 00000000161 13574721672 017725 0ustar00mikestaff000000 000000

Reprint Job {job_id}

Job {job_id} has been restarted. cups-2.3.1/templates/printer-configured.tmpl000664 000765 000024 00000000354 13574721672 021303 0ustar00mikestaff000000 000000

Set Default Options for {printer_name}

{OP=set-class-options?Class :Printer }{printer_name} default options have been set successfully. cups-2.3.1/templates/class-modified.tmpl000664 000765 000024 00000000222 13574721672 020352 0ustar00mikestaff000000 000000

Modify Class {printer_name}

Class {printer_name} has been modified successfully. cups-2.3.1/templates/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020051 0ustar00mikestaff000000 000000 cups-2.3.1/templates/error-op.tmpl000664 000765 000024 00000000171 13574721672 017237 0ustar00mikestaff000000 000000

{?title} {?printer_name} Error

Error:

Unknown operation "{op}"!
cups-2.3.1/templates/printers-header.tmpl000664 000765 000024 00000000144 13574721672 020566 0ustar00mikestaff000000 000000

{total=0?No printers:Showing {#printer_name} of {total} printer{total=1?:s}}.

cups-2.3.1/templates/jobs-header.tmpl000664 000765 000024 00000001324 13574721672 017656 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/printer.tmpl000664 000765 000024 00000004751 13574721672 017165 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, {printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, {server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

Description:{printer_info}
Location:{printer_location}
Driver:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported=one-sided?:, 2-sided printing})
Connection:{device_uri}
Defaults:job-sheets={job_sheets_default} media={media_default?{media_default}:unknown} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/error.tmpl000664 000765 000024 00000000174 13574721672 016626 0ustar00mikestaff000000 000000

{?title} {?printer_name} Error

{?message?{message}:Error}:

{error}
cups-2.3.1/templates/job-release.tmpl000664 000765 000024 00000000175 13574721672 017666 0ustar00mikestaff000000 000000

Release Job {job_id}

Job {job_id} has been released for printing. cups-2.3.1/templates/choose-serial.tmpl000664 000765 000024 00000002565 13574721672 020240 0ustar00mikestaff000000 000000

{op=modify-printer?Modify {printer_name}:Add Printer}

{printer_name?:}
Connection: {device_uri}
Baud Rate:
Parity:
Data Bits:
Flow Control:
cups-2.3.1/templates/printer-deleted.tmpl000664 000765 000024 00000000157 13574721672 020565 0ustar00mikestaff000000 000000

Delete Printer {printer_name}

Printer {printer_name} has been deleted successfully. cups-2.3.1/templates/de/000775 000765 000024 00000000000 13574721672 015165 5ustar00mikestaff000000 000000 cups-2.3.1/templates/printer-accept.tmpl000664 000765 000024 00000000317 13574721672 020414 0ustar00mikestaff000000 000000

Accept Jobs On {is_class?Class:Printer} {printer_name}

{is_class?Class:Printer} {printer_name} is now accepting jobs.

cups-2.3.1/templates/norestart.tmpl000664 000765 000024 00000000201 13574721672 017505 0ustar00mikestaff000000 000000

Change Settings

The server was not restarted because no changes were made to the configuration...

cups-2.3.1/templates/fr/000775 000765 000024 00000000000 13574721672 015204 5ustar00mikestaff000000 000000 cups-2.3.1/templates/printer-modified.tmpl000664 000765 000024 00000000227 13574721672 020735 0ustar00mikestaff000000 000000

Modify Printer {printer_name}

Printer {printer_name} has been modified successfully. cups-2.3.1/templates/es/000775 000765 000024 00000000000 13574721672 015204 5ustar00mikestaff000000 000000 cups-2.3.1/templates/printer-default.tmpl000664 000765 000024 00000000572 13574721672 020604 0ustar00mikestaff000000 000000

Set {is_class?Class:Printer} {printer_name} As Default

{is_class?Class:Printer} {printer_name} has been made the default printer on the server.

Note: Any user default that has been set via the lpoptions command will override this default setting.
cups-2.3.1/templates/add-printer.tmpl000664 000765 000024 00000003240 13574721672 017703 0ustar00mikestaff000000 000000

Add Printer

{?current_make!?:} {?current_make_and_model!?:}
Name:
(May contain any printable characters except "/", "#", and space)
Description:
(Human-readable description such as "HP LaserJet with Duplexer")
Location:
(Human-readable location such as "Lab 1")
Connection: {device_uri}
Sharing:
cups-2.3.1/templates/class-deleted.tmpl000664 000765 000024 00000000153 13574721672 020203 0ustar00mikestaff000000 000000

Delete Class {printer_name}

Class {printer_name} has been deleted successfully. cups-2.3.1/templates/users.tmpl000664 000765 000024 00000002043 13574721672 016633 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Allowed Users For {printer_name}

Users:
cups-2.3.1/templates/modify-printer.tmpl000664 000765 000024 00000002513 13574721672 020444 0ustar00mikestaff000000 000000

Modify {printer_name}

Description:
(Human-readable description such as "HP LaserJet with Duplexer")
Location:
(Human-readable location such as "Lab 1")
Connection: {device_uri}
Sharing:
cups-2.3.1/templates/classes-header.tmpl000664 000765 000024 00000000142 13574721672 020353 0ustar00mikestaff000000 000000

{total=0?No classes:Showing {#printer_name} of {total} class{total=1?:es}}.

cups-2.3.1/templates/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023076 0ustar00mikestaff000000 000000
cups-2.3.1/templates/edit-config.tmpl000664 000765 000024 00000001110 13574721672 017654 0ustar00mikestaff000000 000000

Edit Configuration File

cups-2.3.1/templates/printer-confirm.tmpl000664 000765 000024 00000000673 13574721672 020617 0ustar00mikestaff000000 000000

Delete Printer {printer_name}

Warning: Are you sure you want to delete printer {printer_name}?

cups-2.3.1/templates/job-hold.tmpl000664 000765 000024 00000000167 13574721672 017175 0ustar00mikestaff000000 000000

Hold Job {job_id}

Job {job_id} has been held from printing. cups-2.3.1/templates/class-added.tmpl000664 000765 000024 00000000175 13574721672 017642 0ustar00mikestaff000000 000000

Add Class

Class {printer_name} has been added successfully. cups-2.3.1/templates/classes.tmpl000664 000765 000024 00000000776 13574721672 017142 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Queue NameDescriptionLocationMembersStatus
{printer_name}{printer_info}{printer_location}{?member_uris=?None:{member_uris}}{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/test-page.tmpl000664 000765 000024 00000000235 13574721672 017364 0ustar00mikestaff000000 000000

Print Test Page On {printer_name}

Test page sent; job ID is {printer_name}-{job_id}.

cups-2.3.1/templates/printer-jobs-header.tmpl000664 000765 000024 00000000034 13574721672 021334 0ustar00mikestaff000000 000000

Jobs

cups-2.3.1/templates/job-moved.tmpl000664 000765 000024 00000000337 13574721672 017360 0ustar00mikestaff000000 000000

{job_id?Move Job {job_id}:Move All Jobs}

{job_id?Job {job_id}:All jobs} moved to {job_printer_name}.

cups-2.3.1/templates/add-class.tmpl000664 000765 000024 00000002043 13574721672 017325 0ustar00mikestaff000000 000000

Add Class

Name:
(May contain any printable characters except "/", "#", and space)
Description:
(Human-readable description such as "HP LaserJet with Duplexer")
Location:
(Human-readable location such as "Lab 1")
Members:
cups-2.3.1/templates/es/restart.tmpl000664 000765 000024 00000005104 13574721672 017566 0ustar00mikestaff000000 000000

Cambiar especificaciones

Indicador de ocupado Por favor espere mientras se reinicia el servidor...

cups-2.3.1/templates/es/option-conflict.tmpl000664 000765 000024 00000000344 13574721672 021212 0ustar00mikestaff000000 000000

Error: Las siguientes opciones están en conflicto:

Cambie una o más de las opciones para resolver el problema.

cups-2.3.1/templates/es/trailer.tmpl000664 000765 000024 00000000364 13574721672 017547 0ustar00mikestaff000000 000000
cups-2.3.1/templates/es/printer-start.tmpl000664 000765 000024 00000000317 13574721672 020721 0ustar00mikestaff000000 000000

Reanudar la {is_class?clase:impresora} {printer_name}

La {is_class?clase:impresora} {printer_name} ha sido reanudada.

cups-2.3.1/templates/es/choose-make.tmpl000664 000765 000024 00000003654 13574721672 020305 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

{printer_name?:} {op=modify-printer?:}
Nombre: {printer_name}
Descripción: {printer_info}
Ubicación: {printer_location}
Conexión: {device_uri}
Compartición: {?printer_is_shared=?No:{?printer_is_shared=0?No:}} compartir esta impresora
Marca:
 
O proporcione un archivo PPD:
cups-2.3.1/templates/es/option-header.tmpl000664 000765 000024 00000000131 13574721672 020633 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/es/job-cancel.tmpl000664 000765 000024 00000000172 13574721672 020077 0ustar00mikestaff000000 000000

Cancelar trabajo {job_id}

Se ha cancelado el Trabajo {job_id}. cups-2.3.1/templates/es/option-trailer.tmpl000664 000765 000024 00000000146 13574721672 021053 0ustar00mikestaff000000 000000

cups-2.3.1/templates/es/printer-added.tmpl000664 000765 000024 00000000235 13574721672 020624 0ustar00mikestaff000000 000000

Añadir impresora

Se ha añadido con éxito la impresora {printer_name}. cups-2.3.1/templates/es/command.tmpl000664 000765 000024 00000000672 13574721672 017525 0ustar00mikestaff000000 000000

{title} en {printer_name}

{job_state>5?:Indicador de ocupado }Trabajo de comando de impresora {job_state=3?pendiente:{job_state=4?retenido: {job_state=5?procesando:{job_state=6?parado: {job_state=7?cancelado:{job_state=8?interrumpido:completado}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/es/help-printable.tmpl000664 000765 000024 00000000562 13574721672 021013 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/es/printer-reject.tmpl000664 000765 000024 00000000337 13574721672 021042 0ustar00mikestaff000000 000000

Rechazar trabajos de la {is_class?clase:impresora} {printer_name}

La {is_class?clase:impresora} {printer_name} ya no acepta trabajos.

cups-2.3.1/templates/es/class.tmpl000664 000765 000024 00000004545 13574721672 017217 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}}, {printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos}, {server_is_sharing_printers=0?no:{printer_is_shared=0?no:}} compartida{default_name={printer_name}?, predeterminada del servidor:})

Descripción:{printer_info}
Ubicación:{printer_location}
Miembros:{?member_uris=?Ninguno:{member_uris}}
Opciones predeterminadas:job-sheets={job_sheets_default} media={media_default?{media_default}:desconocido} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/es/modify-class.tmpl000664 000765 000024 00000001552 13574721672 020477 0ustar00mikestaff000000 000000

Modificar clase {printer_name}

Descripción:
Ubicación:
Miembros:
cups-2.3.1/templates/es/list-available-printers.tmpl000664 000765 000024 00000001223 13574721672 022635 0ustar00mikestaff000000 000000

Impresoras disponibles

{#device_uri=0?

No se encuentran impresoras.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/es/printer-stop.tmpl000664 000765 000024 00000000323 13574721672 020546 0ustar00mikestaff000000 000000

Pausar la {is_class?clase:impresora} {printer_name}

La {is_class?clase:impresora} {printer_name} ha sido puesta en pausa.

cups-2.3.1/templates/es/printer-cancel-jobs.tmpl000664 000765 000024 00000000355 13574721672 021746 0ustar00mikestaff000000 000000

Cancelar trabajos en {is_class?clase:impresora} {printer_name}

Se han cancelado todos los trabajos de la {is_class?clase:impresora} {printer_name}.

cups-2.3.1/templates/es/choose-model.tmpl000664 000765 000024 00000004403 13574721672 020461 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

{printer_name?:} {op=modify-printer?:}
Nombre: {printer_name}
Descripción: {printer_info}
Ubicación: {printer_location}
Conexión: {device_uri}
Compartición: {?printer_is_shared=?No:{?printer_is_shared=0?No:}} compartir esta impresora
Marca: {PPD_MAKE}
Modelo:
O proporcione un archivo PPD:
cups-2.3.1/templates/es/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021232 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/es/choose-device.tmpl000664 000765 000024 00000004206 13574721672 020621 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Conexión actual\:
Impresoras locales\: {[device_uri]{device_class!network?
:}}
Impresoras en red descubiertas\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Otras impresoras en red\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Indicador de ocupado Buscando impresoras...

} cups-2.3.1/templates/es/jobs.tmpl000664 000765 000024 00000005373 13574721672 017047 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNombreUsuarioTamañoPáginasEstadoControl
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Desconocido:{job_name}}  {?job_originating_user_name=?Retenido:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Desconocido:{?job_impressions_completed}}  {job_state=3?pendiente desde
{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?retenido desde
{?time_at_creation=?Unknown:{time_at_creation}}: {job_state=5?en proceso desde
{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?parado: {job_state=7?cancelado el
{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?interrumpido:completado el
{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/es/class-jobs-header.tmpl000664 000765 000024 00000000040 13574721672 021362 0ustar00mikestaff000000 000000

Trabajos

cups-2.3.1/templates/es/help-header.tmpl000664 000765 000024 00000003572 13574721672 020267 0ustar00mikestaff000000 000000
{TOPIC?:}

Buscar en {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:todos los documentos}}:

{QUERY?

Buscar resultados en {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:todos los documentos}}\:

{QTEXT?:} :

No hay coincidencias.

}
:} {HELPTITLE?
:

Ayuda en línea

Esta es la interfaz de ayuda en línea de CUPS. Introduzca las palabras a buscar aquí encima o haga clic en cualquiera de los enlaces de la documentación para visualizar la información de ayuda en línea.

Si es nuevo en CUPS, lea la página "Información general de CUPS".

La página de inicio de CUPS también proporciona muchos recursos, incluyendo foros de discusión de usuarios, respuestas a preguntas frecuentes, y un formulario para el envío de informes de errores y peticiones de mejoras.

} cups-2.3.1/templates/es/pager.tmpl000664 000765 000024 00000002425 13574721672 017203 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/es/option-pickone.tmpl000664 000765 000024 00000001704 13574721672 021042 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/es/printers.tmpl000664 000765 000024 00000001040 13574721672 017743 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nombre de la colaDescripciónUbicaciónMarca y modeloEstado
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inactiva:{printer_state=4?Procesando:En pausa}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/es/job-move.tmpl000664 000765 000024 00000001166 13574721672 017624 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Mover trabajo {job_id}:Mover todos los trabajos}

Nuevo destino:
cups-2.3.1/templates/es/admin.tmpl000664 000765 000024 00000013364 13574721672 017201 0ustar00mikestaff000000 000000

Impresoras

Clases

Trabajos

Servidor

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Configuración del servidor\:

Avanzada

        Número máximo de clientes\:
        
        

{have_gssapi?
:}

        Número máximo de trabajos (0 sin límite)\:
        Retener metadatos\:
        Retener documentos\:

        Tamaño máximo del archivo de registro\:

:

Configuración del servidor:

Avanzada

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/es/choose-uri.tmpl000664 000765 000024 00000002156 13574721672 020163 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

{printer_name?:}
Conexión:
Ejemplos:
    http://nombre_ordenador:631/ipp/
    http://nombre_ordenador:631/ipp/puerto1

    ipp://nombre_ordenador/ipp/
    ipp://nombre_ordenador/ipp/puerto1

    lpd://nombre_ordenador/cola

    socket://nombre_ordenador
    socket://nombre_ordenador:9100

Vea "Impresoras en red" para escoger el URI adecuado a usar con su impresora.

cups-2.3.1/templates/es/header.tmpl.in000664 000765 000024 00000003365 13574721672 017746 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/es/class-confirm.tmpl000664 000765 000024 00000000706 13574721672 020645 0ustar00mikestaff000000 000000

Borrar clase {printer_name}

Advertencia: ¿Está seguro de querer borrar la clase {printer_name}?

cups-2.3.1/templates/es/search.tmpl000664 000765 000024 00000001030 13574721672 017341 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Buscar en {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?clases:{SECTION=jobs?trabajos:impresoras}}}:

cups-2.3.1/templates/es/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021026 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/es/set-printer-options-header.tmpl000664 000765 000024 00000001540 13574721672 023275 0ustar00mikestaff000000 000000

Establecer opciones predeterminadas de {printer_name}

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/es/job-restart.tmpl000664 000765 000024 00000000175 13574721672 020341 0ustar00mikestaff000000 000000

Reimprimir trabajo {job_id}

Se ha reiniciado el Trabajo {job_id}. cups-2.3.1/templates/es/printer-configured.tmpl000664 000765 000024 00000000426 13574721672 021712 0ustar00mikestaff000000 000000

Cambiar opciones predeterminadas de {printer_name}

Se han establecido con éxito las opciones predeterminadas de la {OP=set-class-options?clase :impresora }{printer_name}. cups-2.3.1/templates/es/class-modified.tmpl000664 000765 000024 00000000233 13574721672 020763 0ustar00mikestaff000000 000000

Modificar clase {printer_name}

Se ha modificado con éxito la clase {printer_name}. cups-2.3.1/templates/es/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020460 0ustar00mikestaff000000 000000 cups-2.3.1/templates/es/error-op.tmpl000664 000765 000024 00000000217 13574721672 017647 0ustar00mikestaff000000 000000

Error en {?printer_name}: {?title}

Error:

¡Operación desconocida "{op}"!
cups-2.3.1/templates/es/printers-header.tmpl000664 000765 000024 00000000156 13574721672 021200 0ustar00mikestaff000000 000000

{total=0?No hay impresoras:Mostrando {#printer_name} de {total} impresora{total=1?:s}}.

cups-2.3.1/templates/es/jobs-header.tmpl000664 000765 000024 00000001362 13574721672 020267 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/es/printer.tmpl000664 000765 000024 00000005331 13574721672 017567 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}}, {printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos}, {server_is_sharing_printers=0?no:{printer_is_shared=0?no:}} compartida{default_name={printer_name}?, predeterminada del servidor:})

Descripción:{printer_info}
Ubicación:{printer_location}
Controlador:{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported=one-sided?:, dúplex})
Conexión:{device_uri}
Opciones predeterminadas:rótulos={job_sheets_default} papel={media_default?{media_default}:desconocido} {sides_default?caras={sides_default}:}
cups-2.3.1/templates/es/error.tmpl000664 000765 000024 00000000200 13574721672 017223 0ustar00mikestaff000000 000000

Error en {?printer_name}: {?title}

{?message?{message}:Error}:

{error}
cups-2.3.1/templates/es/job-release.tmpl000664 000765 000024 00000000170 13574721672 020270 0ustar00mikestaff000000 000000

Liberar trabajo {job_id}

Se ha liberado el Trabajo {job_id}. cups-2.3.1/templates/es/choose-serial.tmpl000664 000765 000024 00000002634 13574721672 020644 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

{printer_name?:}
Conexión: {device_uri}
Baudios:
Paridad:
Bits de datos:
Control de flujo:
cups-2.3.1/templates/es/printer-deleted.tmpl000664 000765 000024 00000000167 13574721672 021175 0ustar00mikestaff000000 000000

Borrar impresora {printer_name}

Se ha borrado con éxito la impresora {printer_name}. cups-2.3.1/templates/es/printer-accept.tmpl000664 000765 000024 00000000336 13574721672 021024 0ustar00mikestaff000000 000000

Aceptar trabajos de la {is_class?clase:impresora} {printer_name}

La {is_class?clase:impresora} {printer_name} ahora acepta trabajos.

cups-2.3.1/templates/es/norestart.tmpl000664 000765 000024 00000000233 13574721672 020121 0ustar00mikestaff000000 000000

Cambiar especificaciones

No se ha reiniciado el servidor debido a que no se han hecho cambios en la configuración...

cups-2.3.1/templates/es/printer-modified.tmpl000664 000765 000024 00000000244 13574721672 021343 0ustar00mikestaff000000 000000

Modificar impresora {printer_name}

Se ha modificado con éxito la impresora {printer_name}. cups-2.3.1/templates/es/printer-default.tmpl000664 000765 000024 00000000714 13574721672 021211 0ustar00mikestaff000000 000000

Poner la {is_class?clase:impresora} {printer_name} como predeterminada

Se ha puesto como predeterminada en el servidor la {is_class?clase:impresora} {printer_name}.

Nota: cualquier opción de usuario que haya sido activada por mediación del comando lpoptions tiene mayor preferencia que este ajuste predeterminado.
cups-2.3.1/templates/es/add-printer.tmpl000664 000765 000024 00000003430 13574721672 020313 0ustar00mikestaff000000 000000

Añadir impresora

{?current_make!?:} {?current_make_and_model!?:}
Nombre:
(Puede contener cualquier carácter imprimible excepto "/", "#", y espacio)
Descripción:
(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
(Ubicación fácilmente leíble tal como "Lab 1")
Conexión: {device_uri}
Compartición:
cups-2.3.1/templates/es/class-deleted.tmpl000664 000765 000024 00000000157 13574721672 020616 0ustar00mikestaff000000 000000

Borrar clase {printer_name}

Se ha borrado con éxito la clase {printer_name}. cups-2.3.1/templates/es/users.tmpl000664 000765 000024 00000002103 13574721672 017237 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Usuarios permitidos para {printer_name}

Usuarios:
cups-2.3.1/templates/es/modify-printer.tmpl000664 000765 000024 00000002637 13574721672 021062 0ustar00mikestaff000000 000000

Modificar {printer_name}

Descripción:
(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
(Ubicación fácilmente leíble tal como "Lab 1")
Conexión: {device_uri}
Compartida:
cups-2.3.1/templates/es/classes-header.tmpl000664 000765 000024 00000000146 13574721672 020766 0ustar00mikestaff000000 000000

{total=0?No hay clases:Mostrando {#printer_name} de {total} clase{total=1?:s}}.

cups-2.3.1/templates/es/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023505 0ustar00mikestaff000000 000000
cups-2.3.1/templates/es/edit-config.tmpl000664 000765 000024 00000001157 13574721672 020276 0ustar00mikestaff000000 000000

Editar archivo de configuración

cups-2.3.1/templates/es/printer-confirm.tmpl000664 000765 000024 00000000724 13574721672 021223 0ustar00mikestaff000000 000000

Borrar impresora {printer_name}

Advertencia: ¿Está seguro de querer borrar la impresora {printer_name}?

cups-2.3.1/templates/es/job-hold.tmpl000664 000765 000024 00000000170 13574721672 017576 0ustar00mikestaff000000 000000

Retener trabajo {job_id}

Se ha retenido el Trabajo {job_id}. cups-2.3.1/templates/es/class-added.tmpl000664 000765 000024 00000000225 13574721672 020245 0ustar00mikestaff000000 000000

Añadir clase

Se ha añadido con éxito la clase {printer_name}. cups-2.3.1/templates/es/classes.tmpl000664 000765 000024 00000001043 13574721672 017535 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nombre de la colaDescripciónUbicaciónMiembrosEstado
{printer_name}{printer_info}{printer_location}{?member_uris=?Ninguna:{member_uris}}{printer_state=3?Inactiva:{printer_state=4?Procesando:En pausa}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/es/test-page.tmpl000664 000765 000024 00000000330 13574721672 017767 0ustar00mikestaff000000 000000

Imprimir página de prueba en {printer_name}

Página de prueba enviada; el número del trabajo es el {printer_name}-{job_id}.

cups-2.3.1/templates/es/printer-jobs-header.tmpl000664 000765 000024 00000000040 13574721672 021740 0ustar00mikestaff000000 000000

Trabajos

cups-2.3.1/templates/es/job-moved.tmpl000664 000765 000024 00000000421 13574721672 017761 0ustar00mikestaff000000 000000

{job_id?Mover trabajo {job_id}:Mover todos los trabajos}

Se {job_id?ha movido el Trabajo {job_id}:han movido todos los trabajos} a {job_printer_name}.

cups-2.3.1/templates/es/add-class.tmpl000664 000765 000024 00000002214 13574721672 017734 0ustar00mikestaff000000 000000

Añadir clase

Nombre:
(Puede contener cualquier carácter imprimible excepto "/", "#", y espacio)
Descripción:
(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
(Ubicación fácilmente leíble tal como "Lab 1")
Miembros:
cups-2.3.1/templates/fr/restart.tmpl000664 000765 000024 00000005115 13574721672 017570 0ustar00mikestaff000000 000000

Modifier les paramètres

Busy Indicator Veuillez patienter pendant que le serveur redémarre...

cups-2.3.1/templates/fr/option-conflict.tmpl000664 000765 000024 00000000374 13574721672 021215 0ustar00mikestaff000000 000000

Error: Les options suivantes sont incompatibles entre elles :

Veuillez modifier une ou plusieurs de ces options pour résoudre les conflits.

cups-2.3.1/templates/fr/trailer.tmpl000664 000765 000024 00000000407 13574721672 017545 0ustar00mikestaff000000 000000
cups-2.3.1/templates/fr/printer-start.tmpl000664 000765 000024 00000000367 13574721672 020726 0ustar00mikestaff000000 000000

Démarrer {is_class?La classe:l'imprimante} {printer_name}

{is_class?La classe:l'imprimante} {printer_name} a été démarrée.

cups-2.3.1/templates/fr/choose-make.tmpl000775 000765 000024 00000003645 13574721672 020310 0ustar00mikestaff000000 000000

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

{printer_name?:} {op=modify-printer?:}
Nom : {printer_name}
Description : {printer_info}
Emplacement : {printer_location}
Connexion : {device_uri}
Partage : {?printer_is_shared=?Ne pas:{?printer_is_shared=0?Do Not:}} partager cette imprimante
Marque :
 
Ou donner un fichier PPD :
cups-2.3.1/templates/fr/option-header.tmpl000664 000765 000024 00000000131 13574721672 020633 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/fr/job-cancel.tmpl000664 000765 000024 00000000227 13574721672 020100 0ustar00mikestaff000000 000000

Annuler la Tâche {job_id}

La tâche {job_id} a été annulée. cups-2.3.1/templates/fr/option-trailer.tmpl000664 000765 000024 00000000163 13574721672 021052 0ustar00mikestaff000000 000000

cups-2.3.1/templates/fr/printer-added.tmpl000664 000765 000024 00000000254 13574721672 020625 0ustar00mikestaff000000 000000

Ajouter une imprimante

L'imprimante {printer_name} a été ajoutée avec succès. cups-2.3.1/templates/fr/command.tmpl000664 000765 000024 00000000720 13574721672 017517 0ustar00mikestaff000000 000000

{title} sur {printer_name}

{job_state>5?:Busy Indicator }Commandes de tâche d'impression {job_state=3?en attente:{job_state=4?retenu: {job_state=5?en cours d'impression:{job_state=6?annulé: {job_state=7?canceled:{job_state=8?annulé:terminé}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/fr/help-printable.tmpl000664 000765 000024 00000000562 13574721672 021013 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/fr/printer-reject.tmpl000664 000765 000024 00000000401 13574721672 021032 0ustar00mikestaff000000 000000

Rejeter les Tâches sur {is_class?Classe:Imprimante} {printer_name}

{is_class?La classe:L'imprimante} {printer_name} n'accepte plus les tâches d'impression.

cups-2.3.1/templates/fr/class.tmpl000664 000765 000024 00000004670 13574721672 017216 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?En attente:{printer_state=4?En cours d'impression:Arrêtée}}, {printer_is_accepting_jobs=0?rejette les tâches:accepte les tâches}, {server_is_sharing_printers=0?Non p:{printer_is_shared=0?Non p:P}}artagée{default_name={printer_name}?, imprimante par défaut:})

Description :{printer_info}
Emplacement :{printer_location}
Membres :{?member_uris=?Aucun:{member_uris}}
Par défaut :job-sheets={job_sheets_default} media={media_default?{media_default}:inconnu} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/fr/modify-class.tmpl000664 000765 000024 00000001554 13574721672 020501 0ustar00mikestaff000000 000000

Modifier la classe {printer_name}

Description :
Emplacement :
Membres :
cups-2.3.1/templates/fr/list-available-printers.tmpl000664 000765 000024 00000001217 13574721672 022640 0ustar00mikestaff000000 000000

Imprimantes disponibles

{#device_uri=0?

Aucune imprimante trouvée.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/fr/printer-stop.tmpl000664 000765 000024 00000000363 13574721672 020552 0ustar00mikestaff000000 000000

Arrêter {is_class?La classe:l'imprimante} {printer_name}

{is_class?La classe:l'imprimante} {printer_name} a été arrêtée.

cups-2.3.1/templates/fr/printer-cancel-jobs.tmpl000664 000765 000024 00000000423 13574721672 021742 0ustar00mikestaff000000 000000

Annuler la tâche sur {is_class?la classe:l'imprimante} {printer_name}

Toutes les tâches sur {is_class?la classe:l'imprimante} {printer_name} ont été annulée.

cups-2.3.1/templates/fr/choose-model.tmpl000664 000765 000024 00000004373 13574721672 020467 0ustar00mikestaff000000 000000

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

{printer_name?:} {op=modify-printer?:}
Nom : {printer_name}
Description : {printer_info}
Emplacement : {printer_location}
Connexion : {device_uri}
Partage : {?printer_is_shared=?Ne pas p:{?printer_is_shared=0?Ne pas p:P}}artager cette imprimante
Marque : {PPD_MAKE}
Modèle :
Ou donner un fichier PPD :
cups-2.3.1/templates/fr/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021232 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/fr/choose-device.tmpl000664 000765 000024 00000004246 13574721672 020625 0ustar00mikestaff000000 000000

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Connexion courante \:
Imprimantes locales \: {[device_uri]{device_class!network?
:}}
Imprimantes réseau découvertes \: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Autres imprimantes réseau \: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Indicateur d'occupation Recherche en cours...

} cups-2.3.1/templates/fr/jobs.tmpl000664 000765 000024 00000005535 13574721672 017047 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNomUtilisateurTaillePagesÉtatContrôle
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Inconnu:{job_name}}  {?job_originating_user_name=?Caché:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Inconnu:{?job_impressions_completed}}  {job_state=3?en attente depuis
{?time_at_creation=?Inconnu:{time_at_creation}}:{job_state=4?retenu depuis le
{?time_at_creation=?Inconnu:{time_at_creation}}: {job_state=5?en cours d'impression depuis
{?time_at_processing=?Inconnu:{time_at_processing}}:{job_state=6?arrêté: {job_state=7?annulé depuis
{?time_at_completed=?Inconnu:{time_at_completed}}:{job_state=8?annulé:terminé depuis
{?time_at_completed=?Inconnu:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/fr/class-jobs-header.tmpl000664 000765 000024 00000000037 13574721672 021370 0ustar00mikestaff000000 000000

Tâches

cups-2.3.1/templates/fr/help-header.tmpl000664 000765 000024 00000003326 13574721672 020264 0ustar00mikestaff000000 000000
{TOPIC?:}

Rechercher dans {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Tous les documents}}:

{QUERY?

Résultats de la recherche dans {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Tous les documents}}\:

{QTEXT?:} :

Aucun résultat.

}
:} {HELPTITLE?
:

Aide en ligne

Ceci est l'interface d'aide en ligne de CUPS. Entrez vos termes de recherch ci-dessus ou cliquez sur un des liens vers la documentation pour voir les informations d'aide en ligne.

Si vous êtes un nouvel utilisateur de CUPS, lisez la page "Aperçu de CUPS".

La page d'accueil CUPS procure aussi beaucoup de ressources dont des forums, des FAQ, et un formulaire pour les rapports de bugs et les demandes de fonctionnalités.

} cups-2.3.1/templates/fr/pager.tmpl000664 000765 000024 00000002443 13574721672 017203 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/fr/option-pickone.tmpl000664 000765 000024 00000001715 13574721672 021044 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/fr/printers.tmpl000664 000765 000024 00000001050 13574721672 017744 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nom de la fileDescriptionEmplacementMarque et modèleÉtat
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inoccupée:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/fr/job-move.tmpl000664 000765 000024 00000001310 13574721672 017613 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Transférer la tâche {job_id}:Transférer toutes les tâches}

Nouvelle destination:
cups-2.3.1/templates/fr/admin.tmpl000664 000765 000024 00000013556 13574721672 017204 0ustar00mikestaff000000 000000

Imprimantes

Classes

Tâches

Serveur

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Paramètres du serveur \:

Avancé

        Nombre maximum de clients \:
        
        

{have_gssapi?
:}

        Nombre maximum de tâches (0 pour aucune limite)\:
        Conserver les méta-données \:
        Conserver les documents \:

        Taille maximum du journal système \:

:

Paramètres du serveur \:

Avancé

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/fr/choose-uri.tmpl000664 000765 000024 00000002070 13574721672 020156 0ustar00mikestaff000000 000000

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

{printer_name?:}
Connexion :
Exemples :
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

Voir "Imprimantes réseaux" pour construire l'URI à employer avec votre imprimante.

cups-2.3.1/templates/fr/header.tmpl.in000664 000765 000024 00000003357 13574721672 017747 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/fr/class-confirm.tmpl000664 000765 000024 00000000717 13574721672 020647 0ustar00mikestaff000000 000000

Supprimer la classe {printer_name}

Attention: Êtes-vous sur(e) de vouloir supprimer la classe {printer_name}?

cups-2.3.1/templates/fr/search.tmpl000664 000765 000024 00000001066 13574721672 017352 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Rechercher dans {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?les classes:{SECTION=jobs?les tâches:les imprimantes}}} :

cups-2.3.1/templates/fr/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021026 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/fr/set-printer-options-header.tmpl000664 000765 000024 00000001523 13574721672 023276 0ustar00mikestaff000000 000000

Définir les Options pour {printer_name}

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/fr/job-restart.tmpl000664 000765 000024 00000000242 13574721672 020334 0ustar00mikestaff000000 000000

Réimprimer la Tâche {job_id}

La tâche {job_id} a été relancée. cups-2.3.1/templates/fr/printer-configured.tmpl000664 000765 000024 00000000432 13574721672 021707 0ustar00mikestaff000000 000000

Définir les options par défaut pour {printer_name}

{OP=set-class-options?Class :L'imprimante }{printer_name} a été configurée avec succès. cups-2.3.1/templates/fr/class-modified.tmpl000664 000765 000024 00000000264 13574721672 020767 0ustar00mikestaff000000 000000

Modifier la classe {printer_name}

La classe {printer_name} a été modifiée avec succès. cups-2.3.1/templates/fr/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020460 0ustar00mikestaff000000 000000 cups-2.3.1/templates/fr/error-op.tmpl000664 000765 000024 00000000203 13574721672 017642 0ustar00mikestaff000000 000000

{?title} {?printer_name} Erreur

Erreur:

Opération inconnue "{op}"!
cups-2.3.1/templates/fr/printers-header.tmpl000664 000765 000024 00000000162 13574721672 021175 0ustar00mikestaff000000 000000

{total=0?Pas d'imprimante:Affichage de {#printer_name} sur {total} imprimante{total=1?:s}}.

cups-2.3.1/templates/fr/jobs-header.tmpl000664 000765 000024 00000001534 13574721672 020270 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Affichage des tâches en ordre d'impression; les tâches maintenues apparaissent en premier.:{which_jobs=Affichage des tâches dans l'ordre croissant.?:Affichage des tâches dans l'ordre décroissant.}}

cups-2.3.1/templates/fr/printer.tmpl000664 000765 000024 00000005274 13574721672 017575 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Inoccupée :{printer_state=4?En cours d'impression:En pause}}, {printer_is_accepting_jobs=0?Rejette les tâches:Accepte les tâches}, {server_is_sharing_printers=0?non:{printer_is_shared=0?non:}} partagée{default_name={printer_name}?, imprimante par défaut :})

Description :{printer_info}
Emplacement :{printer_location}
Pilote :{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported=one-sided?:, 2-sided printing})
Connexion :{device_uri}
Par défaut :job-sheets={job_sheets_default} media={media_default?{media_default}:inconnu} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/fr/error.tmpl000664 000765 000024 00000000176 13574721672 017237 0ustar00mikestaff000000 000000

{?title} {?printer_name} Erreur

{?message?{message}:Erreur}:

{error}
cups-2.3.1/templates/fr/job-release.tmpl000664 000765 000024 00000000245 13574721672 020273 0ustar00mikestaff000000 000000

Libérer la Tâche {job_id}

La tâche {job_id} a été libérée. cups-2.3.1/templates/fr/choose-serial.tmpl000664 000765 000024 00000002644 13574721672 020645 0ustar00mikestaff000000 000000

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

{printer_name?:}
Connexion : {device_uri}
Baud/s :
Parité :
Bits de données :
Contrôle de flux :
cups-2.3.1/templates/fr/printer-deleted.tmpl000664 000765 000024 00000000226 13574721672 021171 0ustar00mikestaff000000 000000

Supprimer l'imprimante {printer_name}

L'imprimante {printer_name} a été supprimée avec succès. cups-2.3.1/templates/fr/printer-accept.tmpl000664 000765 000024 00000000417 13574721672 021024 0ustar00mikestaff000000 000000 H2 CLASS="title">Accepte les Tâches sur {is_class?la classe:l'imprimante} {printer_name}

{is_class?La classe:L'imprimante} {printer_name} accepte désormais les tâches d'impression.

cups-2.3.1/templates/fr/norestart.tmpl000664 000765 000024 00000000275 13574721672 020127 0ustar00mikestaff000000 000000

Modifier les paramètres

Le serveur n'a pas été redémarré car la configuration n'a pas été modifiée...

cups-2.3.1/templates/fr/printer-modified.tmpl000664 000765 000024 00000000273 13574721672 021345 0ustar00mikestaff000000 000000

Modifier l'Imprimante {printer_name}

L'imprimante {printer_name} a été modifiée avec succès. cups-2.3.1/templates/fr/printer-default.tmpl000664 000765 000024 00000001041 13574721672 021203 0ustar00mikestaff000000 000000

Définir {is_class?la classe:l'imprimante} {printer_name} comme {is_class?classe:imprimante} par défaut

{is_class?La classe:L'imprimante} {printer_name} a été définie comme {is_class?classe:imprimante} par défaut du serveur.

Note: Tout paramètre utilisateur défini via la commande lpoptions sera prioritaire sur le paramètre défini içi.
cups-2.3.1/templates/fr/add-printer.tmpl000664 000765 000024 00000003326 13574721672 020317 0ustar00mikestaff000000 000000

Ajouter une imprimante

{?current_make!?:} {?current_make_and_model!?:}
Nom \:
(Peut contenir n'importe quel caractère sauf "/", "#", et espace)
Description :
(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement :
(Emplacement compréhensible comme "Lab 1")
Connexion : {device_uri}
Partage :
cups-2.3.1/templates/fr/class-deleted.tmpl000664 000765 000024 00000000220 13574721672 020605 0ustar00mikestaff000000 000000

Supprimer la classe {printer_name}

La classe {printer_name} a été supprimée avec succès. cups-2.3.1/templates/fr/users.tmpl000664 000765 000024 00000002165 13574721672 017247 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Utilisateurs autorisés à utiliser {printer_name}

Utilisateurs :
cups-2.3.1/templates/fr/modify-printer.tmpl000664 000765 000024 00000002556 13574721672 021062 0ustar00mikestaff000000 000000

Modifier {printer_name}

Description :
(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement :
(Emplacement compréhensible comme "Lab 1")
Connexion : {device_uri}
Partage :
cups-2.3.1/templates/fr/classes-header.tmpl000664 000765 000024 00000000154 13574721672 020765 0ustar00mikestaff000000 000000

{total=0?Pas de classes:Affichage de {#printer_name} sur {total} classe{total=1?:s}}.

cups-2.3.1/templates/fr/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023505 0ustar00mikestaff000000 000000
cups-2.3.1/templates/fr/edit-config.tmpl000664 000765 000024 00000001175 13574721672 020276 0ustar00mikestaff000000 000000

Édition du fichier de configuration

cups-2.3.1/templates/fr/printer-confirm.tmpl000664 000765 000024 00000000751 13574721672 021223 0ustar00mikestaff000000 000000

Supprimer l'imprimante {printer_name}

Avertissement : Êtes-vous sûr(e) de vouloir supprimer l'imprimante {printer_name} ?

cups-2.3.1/templates/fr/job-hold.tmpl000664 000765 000024 00000000220 13574721672 017572 0ustar00mikestaff000000 000000

Retenir la tâche {job_id}

La tâche {job_id} a été retenue. cups-2.3.1/templates/fr/class-added.tmpl000664 000765 000024 00000000244 13574721672 020246 0ustar00mikestaff000000 000000

Ajouter une classe

La classe {printer_name} a été ajoutée avec succès. cups-2.3.1/templates/fr/classes.tmpl000664 000765 000024 00000001045 13574721672 017537 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nom de la fileDescriptionEmplacementMembresÉtat
{printer_name}{printer_info}{printer_location}{?member_uris=?Aucun:{member_uris}}{printer_state=3?Inoccupée:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/fr/test-page.tmpl000664 000765 000024 00000000346 13574721672 017776 0ustar00mikestaff000000 000000

Imprimer une Page de Test sur {printer_name}

La page de test a été envoyée; l'identifiant de la tâche est {printer_name}-{job_id}.

cups-2.3.1/templates/fr/printer-jobs-header.tmpl000664 000765 000024 00000000037 13574721672 021746 0ustar00mikestaff000000 000000

Tâches

cups-2.3.1/templates/fr/job-moved.tmpl000664 000765 000024 00000000502 13574721672 017761 0ustar00mikestaff000000 000000

{job_id?Transférer la tâche {job_id}:Transférer toutes les tâches}

{job_id?Tâche {job_id}:Toutes les tâches} transférée(s) vers {job_printer_name}.

cups-2.3.1/templates/fr/add-class.tmpl000664 000765 000024 00000002124 13574721672 017734 0ustar00mikestaff000000 000000

Ajouter une classe

Nom :
(Peut contenir n'importe quel caractère sauf "/", "#", et espace)
Description :
(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement :
(Emplacement compréhensible comme "Lab 1")
Membres :
cups-2.3.1/templates/de/restart.tmpl000664 000765 000024 00000005103 13574721672 017546 0ustar00mikestaff000000 000000

Einstellungen ändern

Beschäftigungsanzeige Bitte warten Sie bis der Server neu gestartet ist…

cups-2.3.1/templates/de/option-conflict.tmpl000664 000765 000024 00000000350 13574721672 021170 0ustar00mikestaff000000 000000

Fehler: Die folgenden Optionen stehen im Konflikt:

Bitte ändern Sie eine oder mehrere Einstellungen um die Konflikte zu lösen.

cups-2.3.1/templates/de/trailer.tmpl000664 000765 000024 00000000344 13574721672 017526 0ustar00mikestaff000000 000000
cups-2.3.1/templates/de/printer-start.tmpl000664 000765 000024 00000000313 13574721672 020676 0ustar00mikestaff000000 000000

{is_class?Klasse:Drucker} {printer_name} starten

{is_class?Die Klasse:Der Drucker} {printer_name} wird gestartet.

cups-2.3.1/templates/de/choose-make.tmpl000664 000765 000024 00000003624 13574721672 020263 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 4/5)}

{printer_name?:} {op=modify-printer?:}
Name: {printer_name}
Beschreibung: {printer_info}
Ort: {printer_location}
Verbindung: {device_uri}
Freigabe: Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netzwerk freigeben
Hersteller:
 
Oder PPD-Datei bereitstellen:
cups-2.3.1/templates/de/option-header.tmpl000664 000765 000024 00000000131 13574721672 020614 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/de/job-cancel.tmpl000664 000765 000024 00000000167 13574721672 020064 0ustar00mikestaff000000 000000

Auftrag {job_id} löschen

Auftrag {job_id} wurde gelöscht. cups-2.3.1/templates/de/option-trailer.tmpl000664 000765 000024 00000000145 13574721672 021033 0ustar00mikestaff000000 000000

cups-2.3.1/templates/de/printer-added.tmpl000664 000765 000024 00000000213 13574721672 020601 0ustar00mikestaff000000 000000

Drucker hinzufügen

Drucker {printer_name} wurde erfolgreich hinzufügt. cups-2.3.1/templates/de/command.tmpl000664 000765 000024 00000000663 13574721672 017506 0ustar00mikestaff000000 000000

{title} auf {printer_name}

{job_state>5?:Beschäftigungsanzeige }Drucker Befehlsauftrag {job_state=3?unerledigt:{job_state=4?gehalten: {job_state=5?verarbeite:{job_state=6?gestoppt: {job_state=7?gelöscht:{job_state=8?abgebrochen:beendet}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/de/help-printable.tmpl000664 000765 000024 00000000562 13574721672 020774 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/de/printer-reject.tmpl000664 000765 000024 00000000360 13574721672 021017 0ustar00mikestaff000000 000000

Aufträge für {is_class?Klasse:Drucker} {printer_name} ablehnen

{is_class?Die Klasse:Der Drucker} {printer_name} akzeptiert keine weiteren Aufträge.

cups-2.3.1/templates/de/class.tmpl000664 000765 000024 00000004445 13574721672 017177 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}, {printer_is_accepting_jobs=0?Aufträge ablehnen:Aufträge annehmen}, {server_is_sharing_printers=0?keine:{printer_is_shared=0?keine:}} Netzwerkfreigabe{default_name={printer_name}?, Standardklasse:})

Beschreibung:{printer_info}
Ort:{printer_location}
Mitglieder:{?member_uris=?Keine:{member_uris}}
Standardeinstellungen:job-sheets={job_sheets_default} media={media_default?{media_default}:unbekannt} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/de/modify-class.tmpl000664 000765 000024 00000001527 13574721672 020462 0ustar00mikestaff000000 000000

Klasse {printer_name} ändern

Beschreibung:
Ort:
Mitglieder:
cups-2.3.1/templates/de/list-available-printers.tmpl000664 000765 000024 00000001211 13574721672 022613 0ustar00mikestaff000000 000000

Verfügbare Drucker

{#device_uri=0?

Keine Drucker gefunden.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/de/printer-stop.tmpl000664 000765 000024 00000000316 13574721672 020531 0ustar00mikestaff000000 000000

{is_class?Klasse:Drucker} {printer_name} anhalten

{is_class?Die Klasse:Der Drucker} {printer_name} wurde angehalten.

cups-2.3.1/templates/de/printer-cancel-jobs.tmpl000664 000765 000024 00000000345 13574721672 021726 0ustar00mikestaff000000 000000

Aufträge auf {is_class?Class:Printer} {printer_name} löschen

Alle Aufträge auf {is_class?class:printer} {printer_name} wurden gelöscht.

cups-2.3.1/templates/de/choose-model.tmpl000664 000765 000024 00000004355 13574721672 020450 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 5/5)}

{printer_name?:} {op=modify-printer?:}
Name: {printer_name}
Beschreibung: {printer_info}
Ort: {printer_location}
Verbindung: {device_uri}
Freigabe: Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netzwerk freigeben
Hersteller: {PPD_MAKE}
Modell:
Oder PPD-Datei bereitstellen:
cups-2.3.1/templates/de/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021213 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/de/choose-device.tmpl000664 000765 000024 00000004200 13574721672 020574 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 1/5)}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Aktuelle Verbindung\:
Lokale Drucker\: {[device_uri]{device_class!network?
:}}
Gefundene Netzwerkdrucker\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Andere Netzwerkdrucker\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Beschäftigungsanzeige Suche nach Druckern…

} cups-2.3.1/templates/de/jobs.tmpl000664 000765 000024 00000005370 13574721672 017025 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNameBenutzerGrößeSeitenStatusSteuerung
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Unbekannt:{job_name}}  {?job_originating_user_name=?Zurückbehalten:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Unbekannt:{?job_impressions_completed}}  {job_state=3?unerledigt seit
{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?angehalten seit
{?time_at_creation=?Unknown:{time_at_creation}}: {job_state=5?verarbeitet seit
{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?angehalten: {job_state=7?gelöscht am
{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?abgebrochen:beendet am
{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/de/class-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 021344 0ustar00mikestaff000000 000000

Aufträge

cups-2.3.1/templates/de/help-header.tmpl000664 000765 000024 00000003523 13574721672 020244 0ustar00mikestaff000000 000000
{TOPIC?:}

Suche in {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}:

{QUERY?

Suchergebnisse in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}\:

{QTEXT?:} :

Keine Übereinstimmung gefunden.

}
:} {HELPTITLE?
:

CUPS-Hilfesystem

Dies ist das CUPS-Hilfesystem. Geben Sie Ihren Suchbegriff bzw. Ihre Suchbegriffe oben ein oder klicken Sie auf einen der Dokumentationslinks um einen bestimmten Bereich der Dokumentation anzuzeigen.

Wenn Sie noch unerfahren im Umgang mit CUPS sind, lesen Sie die "CUPS-Übersicht". Erfahrene Benutzer sollten "Was ist neu in CUPS 2.0" lesen.

Die CUPS-Webseite bietet ebenfalls viele Informationen, einschließlich Diskussionsforen für Benutzer, Antworten auf häufig gestellte Fragen sowie ein Formular für Fehlerberichte und Wünsche.

} cups-2.3.1/templates/de/pager.tmpl000664 000765 000024 00000002315 13574721672 017162 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/de/option-pickone.tmpl000664 000765 000024 00000001660 13574721672 021024 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/de/printers.tmpl000664 000765 000024 00000001015 13574721672 017726 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
WarteschlangeBeschreibungOrtHersteller und ModellStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/de/job-move.tmpl000664 000765 000024 00000001210 13574721672 017573 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}

Neues Ziel:
cups-2.3.1/templates/de/admin.tmpl000664 000765 000024 00000012772 13574721672 017164 0ustar00mikestaff000000 000000

Drucker

Klassen

Aufträge

Server

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Server-Einstellungen\:

Erweitert

        Maximale Anzahl an Clients\:
        
        

{have_gssapi?
:}

        Maximale Auftragsanzahl (0 für unbegrenzt)\:
        Metadaten aufbewahren\:
        Dokumente aufbewahren\:

        Maximale Protokoll-Dateigröße\:

:

Server-Einstellungen:

Erweitert

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/de/choose-uri.tmpl000664 000765 000024 00000002064 13574721672 020142 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 2/5)}

{printer_name?:}
Verbindung:
Beispiele:
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

Beispiele und gängige URIs finden sich in der Hilfe unter "Netzwerkdrucker".

cups-2.3.1/templates/de/header.tmpl.in000664 000765 000024 00000003363 13574721672 017725 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/de/class-confirm.tmpl000664 000765 000024 00000000723 13574721672 020625 0ustar00mikestaff000000 000000

Klasse {printer_name} löschen

Warnung: Sind Sie sicher, dass Sie die Klasse {printer_name} wirklich löschen möchten?

cups-2.3.1/templates/de/search.tmpl000664 000765 000024 00000001030 13574721672 017322 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Suche in {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klassen:{SECTION=jobs?Aufträgen:Druckern}}}:

cups-2.3.1/templates/de/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021007 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/de/set-printer-options-header.tmpl000664 000765 000024 00000001525 13574721672 023261 0ustar00mikestaff000000 000000

Standardeinstellungen für {printer_name} festlegen

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/de/job-restart.tmpl000664 000765 000024 00000000176 13574721672 020323 0ustar00mikestaff000000 000000

Auftrag {job_id} neu starten

Auftrag {job_id} wurde neu gestartet. cups-2.3.1/templates/de/printer-configured.tmpl000664 000765 000024 00000000405 13574721672 021670 0ustar00mikestaff000000 000000

Standardeinstellungen für {printer_name} festlegen

Standardeinstellungen für {OP=set-class-options?Klasse :Drucker }{printer_name} wurden erfolgreich gesetzt. cups-2.3.1/templates/de/class-modified.tmpl000664 000765 000024 00000000226 13574721672 020746 0ustar00mikestaff000000 000000

Klasse {printer_name} ändern

Die Klasse {printer_name} wurde erfolgreich geändert. cups-2.3.1/templates/de/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020441 0ustar00mikestaff000000 000000 cups-2.3.1/templates/de/error-op.tmpl000664 000765 000024 00000000177 13574721672 017635 0ustar00mikestaff000000 000000

{?title} {?printer_name} Fehler

Fehler:

Unbekannte Operation "{op}"!
cups-2.3.1/templates/de/printers-header.tmpl000664 000765 000024 00000000145 13574721672 021157 0ustar00mikestaff000000 000000

{total=0?Keine Drucker:Zeige {#printer_name} von {total} Drucker{total=1?:n}}.

cups-2.3.1/templates/de/jobs-header.tmpl000664 000765 000024 00000001357 13574721672 020254 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/de/printer.tmpl000664 000765 000024 00000005234 13574721672 017552 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}, {printer_is_accepting_jobs=0?Aufträge ablehnen:Aufträge annehmen}, {server_is_sharing_printers=0?keine:{printer_is_shared=0?keine:}} Netzwerkfreigabe{default_name={printer_name}?, Standarddrucker:}, {printer_is_colormanaged=0?kein Farbmanagement:Farbmanagement})

Beschreibung:{printer_info}
Ort:{printer_location}
Treiber:{printer_make_and_model} ({color_supported=1?farbig:schwarz-weiß}{sides_supported?, 2-seitiges Drucken:})
Verbindung:{device_uri}
Standardeinstellungen:job-sheets={job_sheets_default} media={media_default?{media_default}:unbekannt} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/de/error.tmpl000664 000765 000024 00000000175 13574721672 017217 0ustar00mikestaff000000 000000

{?title} {?printer_name} Error

{?message?{message}:Fehler:}

{error}
cups-2.3.1/templates/de/job-release.tmpl000664 000765 000024 00000000206 13574721672 020251 0ustar00mikestaff000000 000000

Auftrag {job_id} freigeben

Auftrag {job_id} wurde zum Drucken freigegeben. cups-2.3.1/templates/de/choose-serial.tmpl000664 000765 000024 00000002610 13574721672 020617 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

{printer_name?:}
Verbindung: {device_uri}
Baudrate:
Parität:
Datenbits:
Flusskontrolle:
cups-2.3.1/templates/de/printer-deleted.tmpl000664 000765 000024 00000000157 13574721672 021155 0ustar00mikestaff000000 000000

Drucker {printer_name} löschen

Drucker {printer_name} wurde erfolgreich gelöscht. cups-2.3.1/templates/de/printer-accept.tmpl000664 000765 000024 00000000345 13574721672 021005 0ustar00mikestaff000000 000000

Aufträge für {is_class?Klasse:Drucker} {printer_name} annehmen

{is_class?Die Klasse:Der Drucker} {printer_name} nimmt jetzt Aufträge an.

cups-2.3.1/templates/de/norestart.tmpl000664 000765 000024 00000000211 13574721672 020076 0ustar00mikestaff000000 000000

Einstellungen ändern

Der Server wurde nicht neu gestartet, da die Konfiguration nicht geändert wurde…

cups-2.3.1/templates/de/printer-modified.tmpl000664 000765 000024 00000000225 13574721672 021323 0ustar00mikestaff000000 000000

Drucker {printer_name} ändern

Drucker {printer_name} wurde erfolgreich geändert. cups-2.3.1/templates/de/printer-default.tmpl000664 000765 000024 00000000747 13574721672 021200 0ustar00mikestaff000000 000000

{is_class?Klasse:Drucker} {printer_name} als Standard festlegen

{is_class?Die Klasse:Der Drucker} {printer_name} wurde {is_class?zur Standardklasse:zum Standarddrucker} gemacht.

Hinweis: Die Einstellungen {is_class?der Standardklasse:des Standarddruckers} welche von Benutzern mittels dem lpoptions Befehl gesetzt wurden, überschreiben diese Einstellung.
cups-2.3.1/templates/de/add-printer.tmpl000664 000765 000024 00000003306 13574721672 020276 0ustar00mikestaff000000 000000

Drucker hinzufügen (Schritt 3/5)

{?current_make!?:} {?current_make_and_model!?:}
Name:
(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)
Beschreibung:
(Menschenlesbare Beschreibung wie etwa "HP LaserJet mit Duplexer")
Ort:
(Menschenlesbarer Ort wie etwa "Labor 1")
Verbindung: {device_uri}
Freigabe:
cups-2.3.1/templates/de/class-deleted.tmpl000664 000765 000024 00000000161 13574721672 020572 0ustar00mikestaff000000 000000

Klasse {printer_name} löschen

Die Klasse {printer_name} wurde erfolgreich gelöscht. cups-2.3.1/templates/de/users.tmpl000664 000765 000024 00000002105 13574721672 017222 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Erlaubte Benutzer für {printer_name}

Benutzer:
cups-2.3.1/templates/de/modify-printer.tmpl000664 000765 000024 00000002524 13574721672 021036 0ustar00mikestaff000000 000000

{printer_name} ändern

Beschreibung:
(Menschenlesbare Beschreibung wie etwa "HP LaserJet mit Duplexer")
Ort:
(Menschenlesbarer Ort wie etwa "Labor 1")
Verbindung: {device_uri}
Freigabe:
cups-2.3.1/templates/de/classes-header.tmpl000664 000765 000024 00000000144 13574721672 020745 0ustar00mikestaff000000 000000

{total=0?Keine Klassen:Zeige {#printer_name} von {total} Klasse{total=1?:n}}.

cups-2.3.1/templates/de/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023466 0ustar00mikestaff000000 000000
cups-2.3.1/templates/de/edit-config.tmpl000664 000765 000024 00000001137 13574721672 020255 0ustar00mikestaff000000 000000

Konfigurationsdatei bearbeiten

cups-2.3.1/templates/de/printer-confirm.tmpl000664 000765 000024 00000000730 13574721672 021201 0ustar00mikestaff000000 000000

Drucker {printer_name} löschen

Warnung: Sind Sie sicher, dass Sie den Drucker {printer_name} wirklich löschen möchten?

cups-2.3.1/templates/de/job-hold.tmpl000664 000765 000024 00000000204 13574721672 017555 0ustar00mikestaff000000 000000

Auftrag {job_id} anhalten

Auftrag {job_id} wurde vom Drucken abgehalten. cups-2.3.1/templates/de/class-added.tmpl000664 000765 000024 00000000216 13574721672 020226 0ustar00mikestaff000000 000000

Klasse hinzufügen

Die Klasse {printer_name} wurde erfolgreich hinzugefügt. cups-2.3.1/templates/de/classes.tmpl000664 000765 000024 00000001006 13574721672 017515 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
KlasseBeschreibungOrtMitgliederStatus
{printer_name}{printer_info}{printer_location}{?member_uris=?Keine:{member_uris}}{printer_state=3?Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/de/test-page.tmpl000664 000765 000024 00000000267 13574721672 017761 0ustar00mikestaff000000 000000

Testseite für Drucker {printer_name}

Testseite wurde gesendet; Auftragsnummer lautet {printer_name}-{job_id}.

cups-2.3.1/templates/de/printer-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 021722 0ustar00mikestaff000000 000000

Aufträge

cups-2.3.1/templates/de/job-moved.tmpl000664 000765 000024 00000000352 13574721672 017745 0ustar00mikestaff000000 000000

{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}

{job_id?Auftrag {job_id}:Alle Aufträge} nach {job_printer_name} verschoben.

cups-2.3.1/templates/de/add-class.tmpl000664 000765 000024 00000002076 13574721672 017723 0ustar00mikestaff000000 000000

Klasse hinzufügen

Name:
(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)
Beschreibung:
(Menschenlesbare Beschreibung wie etwa "HP LaserJet mit Duplexer")
Ort:
(Menschenlesbarer Ort wie etwa "Labor 1")
Mitglieder:
cups-2.3.1/templates/ru/restart.tmpl000664 000765 000024 00000005153 13574721672 017611 0ustar00mikestaff000000 000000

Применение изменений параметров

Ожидание Дождитесь перезапуска сервера...

cups-2.3.1/templates/ru/option-conflict.tmpl000664 000765 000024 00000000475 13574721672 021236 0ustar00mikestaff000000 000000

Ошибка: следующие параметры конфликтуют:

Измените один или несколько параметров для того, чтобы избежать конфликта.

cups-2.3.1/templates/ru/trailer.tmpl000664 000765 000024 00000000604 13574721672 017563 0ustar00mikestaff000000 000000
cups-2.3.1/templates/ru/printer-start.tmpl000664 000765 000024 00000000433 13574721672 020737 0ustar00mikestaff000000 000000

Возобновить работу {is_class?группы:принтера} {printer_name}

{is_class?Группа:Принтер} {printer_name} теперь принимает задания.

cups-2.3.1/templates/ru/choose-make.tmpl000664 000765 000024 00000004241 13574721672 020315 0ustar00mikestaff000000 000000

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

{printer_name?:} {op=modify-printer?:}
Название: {printer_name}
Описание: {printer_info}
Расположение: {printer_location}
Подключение: {device_uri}
Совместный доступ: {?printer_is_shared=?Нет совместного доступа:{?printer_is_shared=0?Нет совместного доступа:Разрешить совместный доступ}} к этому принтеру
Создать:
 
или использовать файл PPD:
cups-2.3.1/templates/ru/option-header.tmpl000664 000765 000024 00000000131 13574721672 020652 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/ru/job-cancel.tmpl000664 000765 000024 00000000212 13574721672 020111 0ustar00mikestaff000000 000000

Отмена задания {job_id}

Задание {job_id} отменено. cups-2.3.1/templates/ru/option-trailer.tmpl000664 000765 000024 00000000153 13574721672 021070 0ustar00mikestaff000000 000000

cups-2.3.1/templates/ru/printer-added.tmpl000664 000765 000024 00000000241 13574721672 020640 0ustar00mikestaff000000 000000

Добавить принтер

Принтер {printer_name} успешно добавлен. cups-2.3.1/templates/ru/command.tmpl000664 000765 000024 00000001011 13574721672 017530 0ustar00mikestaff000000 000000

{title} для {printer_name}

{job_state>5?:Ожидание }Обработка задания {job_state=3?в очереди:{job_state=4?удерживается: {job_state=5?обрабатывается:{job_state=6?остановлено: {job_state=7?отменено:{job_state=8?прервано:завершено}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/ru/help-printable.tmpl000664 000765 000024 00000000562 13574721672 021032 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/ru/printer-reject.tmpl000664 000765 000024 00000000437 13574721672 021062 0ustar00mikestaff000000 000000

Отмена заданий для {is_class?группы:принтера} {printer_name}

{is_class?Группа:Принтер} {printer_name} больше не принимает задания.

cups-2.3.1/templates/ru/class.tmpl000664 000765 000024 00000005516 13574721672 017235 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?ожидает:{printer_state=4?печать:приостановлен}}, {printer_is_accepting_jobs=0?не принимает задания:принимает задания}, {server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}} {default_name={printer_name}?, Сервер по умолчанию:})

Описание:{printer_info}
Расположение:{printer_location}
Состав:{?member_uris=?Нет принтеров:{member_uris}}
По умолчанию:job-sheets={job_sheets_default} media={media_default?{media_default}:неизвестный} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/ru/modify-class.tmpl000664 000765 000024 00000001637 13574721672 020522 0ustar00mikestaff000000 000000

Изменение группы {printer_name}

Описание:
Расположение:
Состав группы:
cups-2.3.1/templates/ru/list-available-printers.tmpl000664 000765 000024 00000001341 13574721672 022655 0ustar00mikestaff000000 000000

Доступные принтеры

{#device_uri=0?

Не обнаружено ни одного принтера.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/ru/printer-stop.tmpl000664 000765 000024 00000000464 13574721672 020573 0ustar00mikestaff000000 000000

Приостановить {is_class?группу:принтер} {printer_name}

{is_class?Группа:Принтер} {printer_name} {is_class?была приостановлена:был приостановлен}.

cups-2.3.1/templates/ru/printer-cancel-jobs.tmpl000664 000765 000024 00000000404 13574721672 021760 0ustar00mikestaff000000 000000

Отмена заданий для {is_class?Class:Printer} {printer_name}

Все задания для {is_class?class:printer} {printer_name} были отменены.

cups-2.3.1/templates/ru/choose-model.tmpl000664 000765 000024 00000005006 13574721672 020500 0ustar00mikestaff000000 000000

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

{printer_name?:} {op=modify-printer?:}
Название: {printer_name}
Описание: {printer_info}
Расположение: {printer_location}
Подключение: {device_uri}
Совместный доступ: {?printer_is_shared=?Нет совместного доступа:{?printer_is_shared=0?Нет совместного доступа:Разрешить совместный доступ}} к этому принтеру
Создать: {PPD_MAKE}
Модель:
или использовать файл PPD:
cups-2.3.1/templates/ru/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021251 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/ru/choose-device.tmpl000664 000765 000024 00000004371 13574721672 020643 0ustar00mikestaff000000 000000

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Сейчас подключен\:
Установленные принтеры\: {[device_uri]{device_class!network?
:}}
Найденные сетевые принтеры\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Другие сетевые принтеры\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Ожидание Поиск принтеров...

} cups-2.3.1/templates/ru/jobs.tmpl000664 000765 000024 00000005676 13574721672 017074 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
НомерНазваниеПользовательРазмерСтраницСтатусУправление
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Неизвестное:{job_name}}  {?job_originating_user_name=?Приостановлено пользователем:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Неизвестно:{?job_impressions_completed}}  {job_state=3?В очереди
{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?Приостановлено с
{?time_at_creation=?Unknown:{time_at_creation}}: {job_state=5?Создано
{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?Остановлено: {job_state=7?Отменено
{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?Прервано:Завершено
{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/ru/class-jobs-header.tmpl000664 000765 000024 00000000046 13574721672 021407 0ustar00mikestaff000000 000000

Задания

cups-2.3.1/templates/ru/help-header.tmpl000664 000765 000024 00000004226 13574721672 020303 0ustar00mikestaff000000 000000
{TOPIC?:}

Поиск {HELPTITLE?в {HELPTITLE}:{TOPIC?в {TOPIC}:по справке}}:

{QUERY?

Результаты поиска в {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:всей справке}}\:

{QTEXT?:} :

Не найдено совпадений.

}
:} {HELPTITLE?
:

Справка

Это справка CUPS. Введите выше слова для поиска в справке и нажмите "Поиск", чтобы показать результаты поиска.

Если вы пока мало знакомы с CUPS, прочтите раздел "Введение в CUPS". Опытные пользователи могут обратиться к разделу "Что нового в CUPS 1.6".

Веб-сайт CUPS так же содержит большое количество ресурсов для пользователей, включая форум, ответы на часто задаваемые вопросы и форму для регистрации ошибок и пожеланий.

} cups-2.3.1/templates/ru/pager.tmpl000664 000765 000024 00000002342 13574721672 017220 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/ru/option-pickone.tmpl000664 000765 000024 00000001731 13574721672 021061 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/ru/printers.tmpl000664 000765 000024 00000001135 13574721672 017767 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
НаименованиеОписаниеРасположениеДрайверСтатус
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?ожидает:{printer_state=4?печатает:приостановлен}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/ru/job-move.tmpl000664 000765 000024 00000001367 13574721672 017646 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Перемещение задания {job_id}:Перемещение всех заданий}

Переместить на принтер:
cups-2.3.1/templates/ru/admin.tmpl000664 000765 000024 00000014703 13574721672 017216 0ustar00mikestaff000000 000000

Принтеры

Группы

Задания

Сервер

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Параметры сервера\:

Дополнительные параметры

        Максимум клиентов\:
        
        

{have_gssapi?
:}

        Количество заданий (0 без ограничений)\:
        Записывать метаданные(Retain Metadata)\:
        Существующие документы(Retain Documents)\:

        Максимальный размер журнала\:

:

Параметры сервера:

Дополнительные параметры

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/ru/choose-uri.tmpl000664 000765 000024 00000002261 13574721672 020177 0ustar00mikestaff000000 000000

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

{printer_name?:}
Подключение:
Примеры:
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

Смотрите раздел "Сетевые принтеры" для выяснения правильного адреса вашего принтера.

cups-2.3.1/templates/ru/header.tmpl.in000664 000765 000024 00000003447 13574721672 017766 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/ru/class-confirm.tmpl000664 000765 000024 00000001013 13574721672 020654 0ustar00mikestaff000000 000000

Удаление группы {printer_name}

Предупреждение: Вы действительно хотите удалить группу {printer_name}?

cups-2.3.1/templates/ru/search.tmpl000664 000765 000024 00000001071 13574721672 017365 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Поиск {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?задания:принтера}}}:

cups-2.3.1/templates/ru/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021045 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/ru/set-printer-options-header.tmpl000664 000765 000024 00000001634 13574721672 023320 0ustar00mikestaff000000 000000

Установить параметры по умолчанию для {printer_name}

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/ru/job-restart.tmpl000664 000765 000024 00000000237 13574721672 020357 0ustar00mikestaff000000 000000

Перезапуск задания {job_id}

Задание {job_id} запущено заново. cups-2.3.1/templates/ru/printer-configured.tmpl000664 000765 000024 00000000466 13574721672 021735 0ustar00mikestaff000000 000000

Настройки по умолчанию для {printer_name}

{OP=set-class-options?Группа :Принтер }{printer_name} теперь использует параметры по умолчанию. cups-2.3.1/templates/ru/class-modified.tmpl000664 000765 000024 00000000255 13574721672 021006 0ustar00mikestaff000000 000000

Изменение группы {printer_name}

Группа {printer_name} успешно изменена. cups-2.3.1/templates/ru/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020477 0ustar00mikestaff000000 000000 cups-2.3.1/templates/ru/error-op.tmpl000664 000765 000024 00000000240 13574721672 017662 0ustar00mikestaff000000 000000

{?title} {?printer_name} - ошибка

Ошибка:

Неизвестная операция "{op}"!
cups-2.3.1/templates/ru/printers-header.tmpl000664 000765 000024 00000000147 13574721672 021217 0ustar00mikestaff000000 000000

{total=0?Нет принтеров:Принтер {#printer_name} из {total}}.

cups-2.3.1/templates/ru/jobs-header.tmpl000664 000765 000024 00000001460 13574721672 020305 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/ru/printer.tmpl000664 000765 000024 00000006316 13574721672 017612 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?ожидает:{printer_state=4?печать:приостановлен}}, {printer_is_accepting_jobs=0?не принимает задания:принимает задания}, {server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}} {default_name={printer_name}?, По умолчанию:})

Описание:{printer_info}
Расположение:{printer_location}
Драйвер:{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported=one-sided?:, дуплексная печать})
Подключение:{device_uri}
По умолчанию:job-sheets={job_sheets_default} media={media_default?{media_default}:unknown} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/ru/error.tmpl000664 000765 000024 00000000214 13574721672 017247 0ustar00mikestaff000000 000000

{?title} {?printer_name} - ошибка

{?message?{message}:Ошибка}:

{error}
cups-2.3.1/templates/ru/job-release.tmpl000664 000765 000024 00000000250 13574721672 020306 0ustar00mikestaff000000 000000

Разблокирование задания {job_id}

Задание {job_id} разблокировано. cups-2.3.1/templates/ru/choose-serial.tmpl000664 000765 000024 00000003021 13574721672 020652 0ustar00mikestaff000000 000000

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

{printer_name?:}
Подключение: {device_uri}
Скорость передачи:
Четность:
Биты данных:
Управление:
cups-2.3.1/templates/ru/printer-deleted.tmpl000664 000765 000024 00000000207 13574721672 021207 0ustar00mikestaff000000 000000

Удаление принтера {printer_name}

Принтер {printer_name} успешно удален. cups-2.3.1/templates/ru/printer-accept.tmpl000664 000765 000024 00000000427 13574721672 021044 0ustar00mikestaff000000 000000

Прием заданий {is_class?в группу:на принтер} {printer_name}

{is_class?Группа:Принтер} {printer_name} теперь принимает задания.

cups-2.3.1/templates/ru/norestart.tmpl000664 000765 000024 00000000324 13574721672 020141 0ustar00mikestaff000000 000000

Применение изменений

Сервер не был перезапущен,поскольку не произошло изменений в конфигурации...

cups-2.3.1/templates/ru/printer-modified.tmpl000664 000765 000024 00000000310 13574721672 021354 0ustar00mikestaff000000 000000

Изменение принтера {printer_name}

Параметры принтера {printer_name} успешно изменены.cups-2.3.1/templates/ru/printer-default.tmpl000664 000765 000024 00000001015 13574721672 021223 0ustar00mikestaff000000 000000

Установка {is_class?группы:принтера} {printer_name} по умолчанию

{is_class?Группа:Принтер} {printer_name} установлены на сервере по умолчанию для новых заданий.

Примечания: вы можете переопределить это поведение с помощью команды lpoptions.
cups-2.3.1/templates/ru/add-printer.tmpl000664 000765 000024 00000003720 13574721672 020334 0ustar00mikestaff000000 000000

Добавление принтера

{?current_make!?:} {?current_make_and_model!?:}
Название:
(может содержать любые символы, кроме "/","#" и пробела)
Описание:
(расширенное описание, например, "HP LaserJet с дуплексной печатью")
Расположение:
(месторасположение принтера, например, "Кабинет 55")
Подключение: {device_uri}
Совместный доступ:
cups-2.3.1/templates/ru/class-deleted.tmpl000664 000765 000024 00000000203 13574721672 020625 0ustar00mikestaff000000 000000

Удаление группы {printer_name}

Группа {printer_name} успешно удалена. cups-2.3.1/templates/ru/users.tmpl000664 000765 000024 00000002245 13574721672 017265 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Доступ пользователей на {printer_name}

Пользователи:
cups-2.3.1/templates/ru/modify-printer.tmpl000664 000765 000024 00000003140 13574721672 021067 0ustar00mikestaff000000 000000

Изменение принтера {printer_name}

Описание:
(расширенное описание принтера, например, "HP LaserJet с дуплексной печатью")
Расположение:
(местоположение принтера, например, "Кабинет 55")
Подключение: {device_uri}
Совместный доступ:
cups-2.3.1/templates/ru/classes-header.tmpl000664 000765 000024 00000000173 13574721672 021005 0ustar00mikestaff000000 000000

{total=0?Нет групп:Показать {#printer_name} из {total} группы{total=1?:es}}.

cups-2.3.1/templates/ru/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023524 0ustar00mikestaff000000 000000
cups-2.3.1/templates/ru/edit-config.tmpl000664 000765 000024 00000001217 13574721672 020312 0ustar00mikestaff000000 000000

Редактирование файла конфигурации

cups-2.3.1/templates/ru/printer-confirm.tmpl000664 000765 000024 00000001025 13574721672 021235 0ustar00mikestaff000000 000000

Удаление принтера {printer_name}

Предупреждение: вы действительно хотите удалить принтер {printer_name}?

cups-2.3.1/templates/ru/job-hold.tmpl000664 000765 000024 00000000242 13574721672 017615 0ustar00mikestaff000000 000000

Приостановка задания {job_id}

Задание {job_id} приостановлено. cups-2.3.1/templates/ru/class-added.tmpl000664 000765 000024 00000000230 13574721672 020260 0ustar00mikestaff000000 000000

Новая группа

Группа {printer_name} успешно добавлена. cups-2.3.1/templates/ru/classes.tmpl000664 000765 000024 00000001162 13574721672 017556 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
НаименованиеОписаниеРасположениеСоставСтатус
{printer_name}{printer_info}{printer_location}{?member_uris=?Нет принтеров:{member_uris}}{printer_state=3?ожидает:{printer_state=4?печатает:приостановлен}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/ru/test-page.tmpl000664 000765 000024 00000000403 13574721672 020007 0ustar00mikestaff000000 000000

Печать пробной страницы на {printer_name}

Пробная страница отправлена на печать;Номер задания {printer_name}-{job_id}.

cups-2.3.1/templates/ru/printer-jobs-header.tmpl000664 000765 000024 00000000046 13574721672 021765 0ustar00mikestaff000000 000000

Задания

cups-2.3.1/templates/ru/job-moved.tmpl000664 000765 000024 00000000523 13574721672 020003 0ustar00mikestaff000000 000000

{job_id?Перемещение задания {job_id}:Перемещение всех заданий}

{job_id?Задание {job_id}:Все задания} перемещены на {job_printer_name}.

cups-2.3.1/templates/ru/add-class.tmpl000664 000765 000024 00000002365 13574721672 017762 0ustar00mikestaff000000 000000

Новая группа

Название:
(может содержать любые символы, кроме "/", "#" и пробела)
Описание:
(Расширенное описание группы, например, "Дуплексный принтер")
Расположение:
(Месторасположение группы, например, "Кабинет 55")
Состав группы:
cups-2.3.1/templates/ja/restart.tmpl000664 000765 000024 00000005106 13574721672 017553 0ustar00mikestaff000000 000000

設定の変更

Busy Indicator サーバーが再起動する間しばらくお待ちください...

cups-2.3.1/templates/ja/option-conflict.tmpl000664 000765 000024 00000000373 13574721672 021177 0ustar00mikestaff000000 000000

エラー: 以下のオプションは競合します:

競合を解決するために、1 つ以上のオプションを変更してください。

cups-2.3.1/templates/ja/trailer.tmpl000664 000765 000024 00000000332 13574721672 017525 0ustar00mikestaff000000 000000
cups-2.3.1/templates/ja/printer-start.tmpl000664 000765 000024 00000000344 13574721672 020704 0ustar00mikestaff000000 000000

{is_class?クラス:プリンター} {printer_name} の再開

{is_class?クラス:プリンター} {printer_name} は再開しました。

cups-2.3.1/templates/ja/choose-make.tmpl000664 000765 000024 00000003655 13574721672 020271 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name}の変更:プリンターの追加}

{printer_name?:} {op=modify-printer?:}
名前: {printer_name}
説明: {printer_info}
場所: {printer_location}
接続: {device_uri}
共有: このプリンターを共有{?printer_is_shared=?しない:{?printer_is_shared=0?しない:する}}
メーカー:
 
または PPD ファイルを提供:
cups-2.3.1/templates/ja/option-header.tmpl000664 000765 000024 00000000131 13574721672 020616 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/ja/job-cancel.tmpl000664 000765 000024 00000000231 13574721672 020056 0ustar00mikestaff000000 000000

ジョブ {job_id} のキャンセル

ジョブ {job_id} はキャンセルされました。 cups-2.3.1/templates/ja/option-trailer.tmpl000664 000765 000024 00000000155 13574721672 021036 0ustar00mikestaff000000 000000

cups-2.3.1/templates/ja/printer-added.tmpl000664 000765 000024 00000000240 13574721672 020603 0ustar00mikestaff000000 000000

プリンターの追加

プリンター {printer_name} は正しく追加されました。 cups-2.3.1/templates/ja/command.tmpl000664 000765 000024 00000000713 13574721672 017504 0ustar00mikestaff000000 000000

{printer_name} の {title}

{job_state>5?:Busy Indicator }プリンターコマンドジョブ {job_state=3?ペンディング中:{job_state=4?ホールド中: {job_state=5?処理中:{job_state=6?停止中: {job_state=7?キャンセル:{job_state=8?破棄:完了}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/ja/help-printable.tmpl000664 000765 000024 00000000562 13574721672 020776 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/ja/printer-reject.tmpl000664 000765 000024 00000000413 13574721672 021020 0ustar00mikestaff000000 000000

{is_class?クラス:プリンター} {printer_name} のジョブの拒否

{is_class?クラス:プリンター} {printer_name} はジョブを受け付けなくなりました。

cups-2.3.1/templates/ja/class.tmpl000664 000765 000024 00000004571 13574721672 017201 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?待機中:{printer_state=4?処理中:停止}}, {printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中}, {server_is_sharing_printers=0?非:{printer_is_shared=0?非:}} 共有{default_name={printer_name}?, サーバーのデフォルト:})

説明:{printer_info}
場所:{printer_location}
メンバー:{?member_uris=?なし:{member_uris}}
デフォルト:job-sheets={job_sheets_default} media={media_default?{media_default}:不明} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/ja/modify-class.tmpl000664 000765 000024 00000001537 13574721672 020465 0ustar00mikestaff000000 000000

クラス {printer_name} の変更

説明:
場所:
メンバー:
cups-2.3.1/templates/ja/list-available-printers.tmpl000664 000765 000024 00000001253 13574721672 022623 0ustar00mikestaff000000 000000

利用可能なプリンター

{#device_uri=0?

プリンターが見つかりません。

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/ja/printer-stop.tmpl000664 000765 000024 00000000344 13574721672 020534 0ustar00mikestaff000000 000000

{is_class?クラス:プリンター} {printer_name} の停止

{is_class?クラス:プリンター} {printer_name} は停止しました。

cups-2.3.1/templates/ja/printer-cancel-jobs.tmpl000664 000765 000024 00000000454 13574721672 021731 0ustar00mikestaff000000 000000

Cancel Jobs On {is_class?クラス:プリンター} {printer_name} のジョブのキャンセル

{is_class?クラス:プリンター} {printer_name} のすべてのジョブはキャンセルされました。

cups-2.3.1/templates/ja/choose-model.tmpl000664 000765 000024 00000004422 13574721672 020445 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name}の変更:プリンターの追加}

{printer_name?:} {op=modify-printer?:}
名前: {printer_name}
説明: {printer_info}
場所: {printer_location}
接続: {device_uri}
共有: このプリンターを共有{?printer_is_shared=?しない:{?printer_is_shared=0?しない:する}}
メーカー: {PPD_MAKE}
モデル:
または PPD ファイルを提供:
cups-2.3.1/templates/ja/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021215 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/ja/choose-device.tmpl000664 000765 000024 00000004274 13574721672 020611 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name} の変更:プリンターの追加}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
現在の接続\:
ローカルプリンター\: {[device_uri]{device_class!network?
:}}
発見されたネットワークプリンター\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
その他のネットワークプリンター\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Busy Indicator プリンターを探しています...

} cups-2.3.1/templates/ja/jobs.tmpl000664 000765 000024 00000005405 13574721672 017026 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
ID名前ユーザーサイズページ状態制御
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?未知:{job_name}}  {?job_originating_user_name=?隠匿:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?不明:{?job_impressions_completed}}  {job_state=3?{?time_at_creation=?Unknown:{time_at_creation}}
から保留中:{job_state=4?{?time_at_creation=?Unknown:{time_at_creation}}
から保留中: {job_state=5?{?time_at_processing=?Unknown:{time_at_processing}}
から処理中:{job_state=6?に停止: {job_state=7?{?time_at_completed=?Unknown:{time_at_completed}}
にキャンセル:{job_state=8?に中断:{?time_at_completed=?Unknown:{time_at_completed}}
に完了}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/ja/class-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 021346 0ustar00mikestaff000000 000000

ジョブ

cups-2.3.1/templates/ja/help-header.tmpl000664 000765 000024 00000003726 13574721672 020253 0ustar00mikestaff000000 000000
{TOPIC?:}

{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメント}}内を検索:

{QUERY?

{HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメント}}の検索結果\:

{QTEXT?:} :

マッチするものは見つかりませんでした。

}
:} {HELPTITLE?
:

オンラインヘルプ

これは、CUPS のオンラインヘルプインターフェイスです。 オンラインヘルプ情報を表示するには、検索語句を上に入力するか、 ドキュメントリンクのいずれかをクリックしてください。

あなたが CUPS について初心者なら、 "CUPS の概要" ページを読んでください。

CUPS ホームページ でも、 ユーザーディスカッションフォーラム、FAQ、 バグ報告や機能リクエストを申請するフォームといった、 多くのリソースを提供しています。

} cups-2.3.1/templates/ja/pager.tmpl000664 000765 000024 00000002266 13574721672 017171 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/ja/option-pickone.tmpl000664 000765 000024 00000001735 13574721672 021031 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/ja/printers.tmpl000664 000765 000024 00000001022 13574721672 017726 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
キュー名説明場所メーカーとモデル状態
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?待機中:{printer_state=4?処理中:停止}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/ja/job-move.tmpl000664 000765 000024 00000001215 13574721672 017602 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?ジョブ {job_id} の移動:すべてのジョブの移動}

新しい宛先:
cups-2.3.1/templates/ja/admin.tmpl000664 000765 000024 00000013204 13574721672 017155 0ustar00mikestaff000000 000000

プリンター

クラス

ジョブ

サーバー

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

サーバー設定\:

詳細

        最大クライアント数\:
        
        

{have_gssapi?
:}

        最大ジョブ数 (0 は無制限)\:
        メタデータを保持\:
        ドキュメントを保持\:

        最大ログファイルサイズ\:

:

サーバー設定:

詳細

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/ja/choose-uri.tmpl000664 000765 000024 00000002135 13574721672 020143 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name}の変更:プリンターの追加}

{printer_name?:}
接続:
例:
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

あなたのプリンターにふさわしい URI については、"ネットワークプリンター"を参照してください。

cups-2.3.1/templates/ja/header.tmpl.in000664 000765 000024 00000002744 13574721672 017731 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/ja/class-confirm.tmpl000664 000765 000024 00000000721 13574721672 020625 0ustar00mikestaff000000 000000

クラス {printer_name} の削除

警告: 本当にクラス {printer_name} を削除してもよいですか?

cups-2.3.1/templates/ja/search.tmpl000664 000765 000024 00000001050 13574721672 017326 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?クラス:{SECTION=jobs?ジョブ:プリンター}}} 内を検索:

cups-2.3.1/templates/ja/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021011 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/ja/set-printer-options-header.tmpl000664 000765 000024 00000001564 13574721672 023266 0ustar00mikestaff000000 000000

{printer_name} のデフォルトオプションの変更

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/ja/job-restart.tmpl000664 000765 000024 00000000215 13574721672 020317 0ustar00mikestaff000000 000000

ジョブ {job_id} の再印刷

ジョブ {job_id} は再印刷されました。 cups-2.3.1/templates/ja/printer-configured.tmpl000664 000765 000024 00000000445 13574721672 021676 0ustar00mikestaff000000 000000

{printer_name} のデフォルトオプションの設定

{OP=set-class-options?クラス :プリンター }{printer_name} のデフォルトオプションは正しく設定されました。 cups-2.3.1/templates/ja/class-modified.tmpl000664 000765 000024 00000000242 13574721672 020746 0ustar00mikestaff000000 000000

クラス {printer_name} の変更

クラス {printer_name} は正しく変更されました。 cups-2.3.1/templates/ja/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020443 0ustar00mikestaff000000 000000 cups-2.3.1/templates/ja/error-op.tmpl000664 000765 000024 00000000214 13574721672 017627 0ustar00mikestaff000000 000000

{?title} {?printer_name} のエラー

エラー:

"{op}" は未知の操作です!
cups-2.3.1/templates/ja/printers-header.tmpl000664 000765 000024 00000000214 13574721672 021156 0ustar00mikestaff000000 000000

{total=0?プリンターはありません:{total} 台のプリンターのうち {#printer_name} 台を表示中}。

cups-2.3.1/templates/ja/jobs-header.tmpl000664 000765 000024 00000001404 13574721672 020247 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/ja/printer.tmpl000664 000765 000024 00000005425 13574721672 017556 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?待機中:{printer_state=4?処理中:一時停止中}}, {printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中}, {server_is_sharing_printers=0?非:{printer_is_shared=0?非:}} 共有{default_name={printer_name}?, サーバーのデフォルト:})

説明:{printer_info}
場所:{printer_location}
プリンタードライバー:{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported=one-sided?:, 両面可})
接続:{device_uri}
デフォルト設定:バナー={job_sheets_default} 用紙サイズ={media_default?{media_default}:不明} {sides_default?両面指定={sides_default}:}
cups-2.3.1/templates/ja/error.tmpl000664 000765 000024 00000000207 13574721672 017215 0ustar00mikestaff000000 000000

{?title} {?printer_name} のエラー

{?message?{message}:エラー}:

{error}
cups-2.3.1/templates/ja/job-release.tmpl000664 000765 000024 00000000223 13574721672 020252 0ustar00mikestaff000000 000000

ジョブ {job_id} の解放

ジョブ {job_id} は印刷から解放されました。 cups-2.3.1/templates/ja/choose-serial.tmpl000664 000765 000024 00000002700 13574721672 020621 0ustar00mikestaff000000 000000

{op=modify-printer?{printer_name}の変更:プリンターの追加}

{printer_name?:}
接続: {device_uri}
ボーレート:
パリティ:
データビット:
フロー制御:
cups-2.3.1/templates/ja/printer-deleted.tmpl000664 000765 000024 00000000210 13574721672 021145 0ustar00mikestaff000000 000000

プリンター {printer_name} の削除

プリンター {printer_name} は正しく削除されました。 cups-2.3.1/templates/ja/printer-accept.tmpl000664 000765 000024 00000000427 13574721672 021010 0ustar00mikestaff000000 000000

{is_class?クラス:プリンター} {printer_name} のジョブの受け付け

{is_class?クラス:プリンター} {printer_name} はジョブを受け付けるようになりました。

cups-2.3.1/templates/ja/norestart.tmpl000664 000765 000024 00000000227 13574721672 020107 0ustar00mikestaff000000 000000

設定変更

設定に何も変更が行われなかったため、サーバーは再起動されませんでした...

cups-2.3.1/templates/ja/printer-modified.tmpl000664 000765 000024 00000000257 13574721672 021332 0ustar00mikestaff000000 000000

プリンター {printer_name} の変更

プリンター {printer_name} は正しく変更されました。 cups-2.3.1/templates/ja/printer-default.tmpl000664 000765 000024 00000000750 13574721672 021174 0ustar00mikestaff000000 000000

{is_class?クラス:プリンター} {printer_name} をデフォルトに設定

{is_class?クラス:プリンター} {printer_name} をサーバーのデフォルトプリンターに設定しました。

注意: lpoptions コマンドで設定されたユーザーのデフォルトは、 このサーバーのデフォルト設定を上書きします。
cups-2.3.1/templates/ja/add-printer.tmpl000664 000765 000024 00000003344 13574721672 020302 0ustar00mikestaff000000 000000

新しいプリンターの追加

{?current_make!?:} {?current_make_and_model!?:}
名前:
("/"、"#"、スペースを除く表示可能文字を含めることができます)
説明:
("両面ありHP LaserJet" のように人が読みやすい説明)
場所:
("研究室1" のように人が読みやすい場所)
接続: {device_uri}
共有:
cups-2.3.1/templates/ja/class-deleted.tmpl000664 000765 000024 00000000174 13574721672 020600 0ustar00mikestaff000000 000000

クラス {printer_name} の削除

クラス {printer_name} は正しく削除されました。 cups-2.3.1/templates/ja/users.tmpl000664 000765 000024 00000002135 13574721672 017227 0ustar00mikestaff000000 000000

{IS_CLASS?:}

{printer_name} に許可するユーザー

ユーザー:
cups-2.3.1/templates/ja/modify-printer.tmpl000664 000765 000024 00000002545 13574721672 021043 0ustar00mikestaff000000 000000

{printer_name} の変更

説明:
("両面ありHP LaserJet" のように人が読みやすい説明)
場所:
("研究室1" のように人が読みやすい場所)
接続: {device_uri}
共有:
cups-2.3.1/templates/ja/classes-header.tmpl000664 000765 000024 00000000200 13574721672 020740 0ustar00mikestaff000000 000000

{total=0?クラスはありません:{total} 個のクラスのうち {#printer_name} 個を表示中}。

cups-2.3.1/templates/ja/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023470 0ustar00mikestaff000000 000000
cups-2.3.1/templates/ja/edit-config.tmpl000664 000765 000024 00000001136 13574721672 020256 0ustar00mikestaff000000 000000

設定ファイルの編集

cups-2.3.1/templates/ja/printer-confirm.tmpl000664 000765 000024 00000000741 13574721672 021205 0ustar00mikestaff000000 000000

プリンター {printer_name} の削除

警告: 本当にプリンター {printer_name} を削除してよいですか?

cups-2.3.1/templates/ja/job-hold.tmpl000664 000765 000024 00000000220 13574721672 017555 0ustar00mikestaff000000 000000

ジョブ {job_id} の保留

ジョブ {job_id} は印刷を保留されました。 cups-2.3.1/templates/ja/class-added.tmpl000664 000765 000024 00000000222 13574721672 020225 0ustar00mikestaff000000 000000

クラスの追加

クラス {printer_name} は正しく追加されました。 cups-2.3.1/templates/ja/classes.tmpl000664 000765 000024 00000001014 13574721672 017516 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
キュー名説明場所メンバー状態
{printer_name}{printer_info}{printer_location}{?member_uris=?なし:{member_uris}}{printer_state=3?待機中:{printer_state=4?処理中:停止}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/ja/test-page.tmpl000664 000765 000024 00000000317 13574721672 017757 0ustar00mikestaff000000 000000

{printer_name} のテストページ印刷

テストページを送信しました; ジョブ ID は {printer_name}-{job_id} です。

cups-2.3.1/templates/ja/printer-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 021724 0ustar00mikestaff000000 000000

ジョブ

cups-2.3.1/templates/ja/job-moved.tmpl000664 000765 000024 00000000442 13574721672 017747 0ustar00mikestaff000000 000000

{job_id?ジョブ {job_id} の移動:すべてのジョブの移動}

{job_id?ジョブ {job_id}:すべてのジョブ} は {job_printer_name} に移動しました。

cups-2.3.1/templates/ja/add-class.tmpl000664 000765 000024 00000002131 13574721672 017715 0ustar00mikestaff000000 000000

クラスの追加

名前:
説明:
("両面ありHP LaserJet" のように人が読みやすい説明)
場所:
("研究室1" のように人が読みやすい場所)
メンバー:
cups-2.3.1/templates/pt_BR/restart.tmpl000664 000765 000024 00000005122 13574721672 020165 0ustar00mikestaff000000 000000

Alterar configurações

Busy Indicator Por favor, aguarde enquanto o servidor é reiniciado...

cups-2.3.1/templates/pt_BR/option-conflict.tmpl000664 000765 000024 00000000370 13574721672 021610 0ustar00mikestaff000000 000000

Erro: As seguintes opções estão conflitando:

Por favor, altere uma ou mais opções para resolver os conflitos.

cups-2.3.1/templates/pt_BR/trailer.tmpl000664 000765 000024 00000000353 13574721672 020144 0ustar00mikestaff000000 000000
cups-2.3.1/templates/pt_BR/printer-start.tmpl000664 000765 000024 00000000326 13574721672 021320 0ustar00mikestaff000000 000000

Resumir a {is_class?classe:impressora} {printer_name}

A {is_class?classe:impressora} {printer_name} foi resumida com sucesso.

cups-2.3.1/templates/pt_BR/choose-make.tmpl000664 000765 000024 00000003744 13574721672 020704 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Adicionar impressora}

{printer_name?:} {op=modify-printer?:}
Nome: {printer_name}
Descrição: {printer_info}
Localização: {printer_location}
Conexão: {device_uri}
Compartilhamento: {?printer_is_shared=?Não compartilhar:{?printer_is_shared=0?Não compartilhar:Compartilhar}} esta impressora
Fabricante:
 
Ou forneça um arquivo PPD:
cups-2.3.1/templates/pt_BR/option-header.tmpl000664 000765 000024 00000000131 13574721672 021232 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/pt_BR/job-cancel.tmpl000664 000765 000024 00000000167 13574721672 020502 0ustar00mikestaff000000 000000

Cancelar trabalho {job_id}

Trabalho {job_id} foi cancelado. cups-2.3.1/templates/pt_BR/option-trailer.tmpl000664 000765 000024 00000000160 13574721672 021446 0ustar00mikestaff000000 000000

cups-2.3.1/templates/pt_BR/printer-added.tmpl000664 000765 000024 00000000217 13574721672 021223 0ustar00mikestaff000000 000000

Adicionar impressora

A impressora {printer_name} foi adicionada com sucesso. cups-2.3.1/templates/pt_BR/command.tmpl000664 000765 000024 00000000656 13574721672 020126 0ustar00mikestaff000000 000000

{title} em {printer_name}

{job_state>5?:Busy Indicator }Trabalho de comando de impressora {job_state=3?pendente:{job_state=4?retido: {job_state=5?processando:{job_state=6?parado: {job_state=7?cancelado:{job_state=8?abortado:completo}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/pt_BR/help-printable.tmpl000664 000765 000024 00000000562 13574721672 021412 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/pt_BR/printer-reject.tmpl000664 000765 000024 00000000372 13574721672 021440 0ustar00mikestaff000000 000000

Rejeitar trabalhos na {is_class?classe:impressora} {printer_name}

A {is_class?classe:impressora} {printer_name} não está mais aceitando trabalhos.

cups-2.3.1/templates/pt_BR/class.tmpl000664 000765 000024 00000004654 13574721672 017617 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?ociosa:{printer_state=4?processando:pausada}}, {printer_is_accepting_jobs=0?rejeitando trabalhos:aceitando trabalhos}, {server_is_sharing_printers=0?não compartilhada:{printer_is_shared=0?não compartilhada:compartilhada}} {default_name={printer_name}?, padrão do servidor:})

Descrição:{printer_info}
Localização:{printer_location}
Membros:{?member_uris=?None:{member_uris}}
Padrões:job-sheets={job_sheets_default} media={media_default?{media_default}:desconhecido} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/pt_BR/modify-class.tmpl000664 000765 000024 00000001571 13574721672 021077 0ustar00mikestaff000000 000000

Modificar classe {printer_name}

Descrição:
Localização:
Membros:
cups-2.3.1/templates/pt_BR/list-available-printers.tmpl000664 000765 000024 00000001232 13574721672 023234 0ustar00mikestaff000000 000000

Impressoras disponíveis

{#device_uri=0?

Nenhuma impressora encontrada.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/pt_BR/printer-stop.tmpl000664 000765 000024 00000000310 13574721672 021141 0ustar00mikestaff000000 000000

Pausar a {is_class?classe:impressora} {printer_name}

A {is_class?classe:impressora} {printer_name} foi pausada.

cups-2.3.1/templates/pt_BR/printer-cancel-jobs.tmpl000664 000765 000024 00000000357 13574721672 022347 0ustar00mikestaff000000 000000

Cancelar trabalhos na {is_class?classe:impressora} {printer_name}

Todos os trabalhos da {is_class?classe:impressora} {printer_name} foram cancelados.

cups-2.3.1/templates/pt_BR/choose-model.tmpl000664 000765 000024 00000004460 13574721672 021063 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Adicionar impressora}

{printer_name?:} {op=modify-printer?:}
Nome: {printer_name}
Descrição: {printer_info}
Localização: {printer_location}
Conexão: {device_uri}
Compartilhamento: {?printer_is_shared=?Não compartilhar:{?printer_is_shared=0?Não compartilhar:Compartilhar}} esta impressora
Fabricante: {PPD_MAKE}
Modelo:
Ou forneça um arquivo PPD:
cups-2.3.1/templates/pt_BR/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021631 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/pt_BR/choose-device.tmpl000664 000765 000024 00000004172 13574721672 021222 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Adicionar impressora}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Conexão atual\:
Impressoras locais\: {[device_uri]{device_class!network?
:}}
Impressoras de rede descobertas\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Outras impressoras de rede\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Ocupado Procurando impressoras...

} cups-2.3.1/templates/pt_BR/jobs.tmpl000664 000765 000024 00000005406 13574721672 017443 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNomeUsuárioTamanhoPáginasEstadoControle
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Desconhecido:{job_name}}  {?job_originating_user_name=?Retido:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Desconhecido:{?job_impressions_completed}}  {job_state=3?Pendente desde
{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?Retido desde
{?time_at_creation=?Unknown:{time_at_creation}}: {job_state=5?Processando desde
{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?parado: {job_state=7?Cancelado em
{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?Abortado:Concluído em
{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/pt_BR/class-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 021762 0ustar00mikestaff000000 000000

Trabalhos

cups-2.3.1/templates/pt_BR/help-header.tmpl000664 000765 000024 00000003614 13574721672 020663 0ustar00mikestaff000000 000000
{TOPIC?:}

Pesquisar em {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:todos os documentos}}:

{QUERY?

Pesquisar resultados em {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Todos os documentos}}\:

{QTEXT?:} :

Nenhum resultado encontrado.

}
:} {HELPTITLE?

{HELPTITLE}

:

Ajuda online

Essa é a interface de ajuda online do CUPS. Forneça expressões de pesquisa acima ou clique em qualquer um dos links de documentação para mostrar a informação de ajuda online.

Se você é novo no CUPS, leia a página "Visão geral do CUPS".

A página inicial do CUPS também fornece muitos recursos incluindo fórums de discussão de usuários, respostas a perguntas frequentes e um formulário para enviar registros de erros e pedidos de melhorias.

} cups-2.3.1/templates/pt_BR/pager.tmpl000664 000765 000024 00000002332 13574721672 017577 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/pt_BR/option-pickone.tmpl000664 000765 000024 00000001713 13574721672 021441 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/pt_BR/printers.tmpl000664 000765 000024 00000001050 13574721672 020343 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nome da filaDescriçãoLocalizaçãoMarca e modeloEstado
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Ociosa:{printer_state=4?Processando:Pausada}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/pt_BR/job-move.tmpl000664 000765 000024 00000001165 13574721672 020222 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Mover trabalho {job_id}:Mover todos trabalhos}

Novo destino:
cups-2.3.1/templates/pt_BR/admin.tmpl000664 000765 000024 00000013523 13574721672 017575 0ustar00mikestaff000000 000000

Impressoras

Classes

Trabalhos

Servidor

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Configurações do servidor\:

Avançado

        Máximo de clientes\:
        
        

{have_gssapi?
:}

        Máximo de trabalhos (0 para sem limite)\:
        Reter metadados\:
        Reter documentos\:

        Tamanho máximo do arquivo de log\:

:

Configurações do servidor:

Avançado

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/pt_BR/choose-uri.tmpl000664 000765 000024 00000002055 13574721672 020560 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Adicionar impressora}

{printer_name?:}
Conexão:
Exemplos:
    http://hostname:631/ipp/
    http://hostname:631/ipp/port1

    ipp://hostname/ipp/
    ipp://hostname/ipp/port1

    lpd://hostname/queue

    socket://hostname
    socket://hostname:9100

Veja "Network Printers" para a URI correta a ser usada para sua impressora.

cups-2.3.1/templates/pt_BR/header.tmpl.in000664 000765 000024 00000003335 13574721672 020342 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@

{title}

cups-2.3.1/templates/pt_BR/class-confirm.tmpl000664 000765 000024 00000000700 13574721672 021236 0ustar00mikestaff000000 000000

Excluir classe {printer_name}

Aviso: Você tem certeza que quer excluir a classe {printer_name}?

cups-2.3.1/templates/pt_BR/search.tmpl000664 000765 000024 00000001041 13574721672 017742 0ustar00mikestaff000000 000000
{WHICH_JOBS?:} {ORDER?:}

Pesquisar em {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?classes:{SECTION=jobs?trabalhos:impressoras}}}:

cups-2.3.1/templates/pt_BR/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021425 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/pt_BR/set-printer-options-header.tmpl000664 000765 000024 00000001561 13574721672 023677 0ustar00mikestaff000000 000000

Definir opções padrões para {printer_name}

{HAVE_AUTOCONFIGURE?:}

{[group_id] {group}     }

cups-2.3.1/templates/pt_BR/job-restart.tmpl000664 000765 000024 00000000172 13574721672 020735 0ustar00mikestaff000000 000000

Reimprimir trabalho {job_id}

Trabalho {job_id} foi reiniciado. cups-2.3.1/templates/pt_BR/printer-configured.tmpl000664 000765 000024 00000000451 13574721672 022307 0ustar00mikestaff000000 000000

Configurar opções padrão para {printer_name}

As opções padrões da {OP=set-class-options?classe :impressora }{printer_name} foram configuradas com sucesso. cups-2.3.1/templates/pt_BR/class-modified.tmpl000664 000765 000024 00000000225 13574721672 021363 0ustar00mikestaff000000 000000

Modificar classe {printer_name}

A classe {printer_name} foi modificada com sucesso. cups-2.3.1/templates/pt_BR/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 021057 0ustar00mikestaff000000 000000 cups-2.3.1/templates/pt_BR/error-op.tmpl000664 000765 000024 00000000211 13574721672 020240 0ustar00mikestaff000000 000000

Erro {?title} {?printer_name}

Erro:

Operação desconhecida "{op}"!
cups-2.3.1/templates/pt_BR/printers-header.tmpl000664 000765 000024 00000000160 13574721672 021572 0ustar00mikestaff000000 000000

{total=0?Nenhuma impressora:Mostrando {#printer_name} de {total} impressora{total=1?:s}}.

cups-2.3.1/templates/pt_BR/jobs-header.tmpl000664 000765 000024 00000001366 13574721672 020672 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
} {?which_jobs=all?:
}

{?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

cups-2.3.1/templates/pt_BR/printer.tmpl000664 000765 000024 00000005420 13574721672 020165 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?ociosa:{printer_state=4?processando:pausada}}, {printer_is_accepting_jobs=0?rejeitando trabalhos:aceitando trabalhos}, {server_is_sharing_printers=0?não compartilhada:{printer_is_shared=0?não compartilhada:compartilhada}} {default_name={printer_name}?, padrão do servidor:})

Descrição:{printer_info}
Localização:{printer_location}
Driver:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
Conexão:{device_uri}
Padrões:job-sheets={job_sheets_default} media={media_default?{media_default}:desconhecido} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/pt_BR/error.tmpl000664 000765 000024 00000000172 13574721672 017632 0ustar00mikestaff000000 000000

Erro {?title} {?printer_name}

{?message?{message}:Erro}:

{error}
cups-2.3.1/templates/pt_BR/job-release.tmpl000664 000765 000024 00000000213 13574721672 020665 0ustar00mikestaff000000 000000

Liberar trabalho {job_id}

Trabalho {job_id} foi liberado para impressão. cups-2.3.1/templates/pt_BR/choose-serial.tmpl000664 000765 000024 00000002655 13574721672 021246 0ustar00mikestaff000000 000000

{op=modify-printer?Modificar {printer_name}:Adicionar impressora}

{printer_name?:}
Conexão: {device_uri}
Taxa de dados (Baud Rate):
Paridade:
Bits de Dados:
Controle de Fluxo:
cups-2.3.1/templates/pt_BR/printer-deleted.tmpl000664 000765 000024 00000000171 13574721672 021567 0ustar00mikestaff000000 000000

Excluir Impressora {printer_name}

A impressora {printer_name} foi excluída com sucesso.cups-2.3.1/templates/pt_BR/printer-accept.tmpl000664 000765 000024 00000000357 13574721672 021426 0ustar00mikestaff000000 000000

Aceitar trabalhos na {is_class?classe:impressora} {printer_name}

A {is_class?classe:impressora} {printer_name} agora está aceitando trabalhos.

cups-2.3.1/templates/pt_BR/norestart.tmpl000664 000765 000024 00000000272 13574721672 020523 0ustar00mikestaff000000 000000

Alterar configurações

O servidor não foi reiniciado porque nenhuma alteração foi feita na configuração...

cups-2.3.1/templates/pt_BR/printer-modified.tmpl000664 000765 000024 00000000235 13574721672 021742 0ustar00mikestaff000000 000000

Modificar impressora {printer_name}

A impressora {printer_name} foi modificada com sucesso.cups-2.3.1/templates/pt_BR/printer-default.tmpl000664 000765 000024 00000000725 13574721672 021612 0ustar00mikestaff000000 000000

Definir a {is_class?classe:impressora} {printer_name} como padrão

A {is_class?classe:impressora} {printer_name} foi definida como a impressora padrão no servidor.

Nota: O padrão de qualquer usuário que tenha sido configurado via do comando lpoptions vai sobrepor esta configuração padrão.
cups-2.3.1/templates/pt_BR/add-printer.tmpl000664 000765 000024 00000003504 13574721672 020714 0ustar00mikestaff000000 000000

Adicionar impressora

{?current_make!?:} {?current_make_and_model!?:}
Nome:
(Pode conter qualquer caractere imprimível, exceto "/", "#" e espaço em branco)
Descrição:
(Descrição legível para humanos, tal como "HP LaserJet com Duplexador")
Localização:
(Localização legível para humanos, tal como "Laboratório 1")
Conexão: {device_uri}
Compartilhamento:
cups-2.3.1/templates/pt_BR/class-deleted.tmpl000664 000765 000024 00000000162 13574721672 021211 0ustar00mikestaff000000 000000

Excluir classe {printer_name}

A classe {printer_name} foi excluída com sucesso. cups-2.3.1/templates/pt_BR/users.tmpl000664 000765 000024 00000002146 13574721672 017645 0ustar00mikestaff000000 000000

{IS_CLASS?:}

Usuários permitidos para {printer_name}

Usuários:
cups-2.3.1/templates/pt_BR/modify-printer.tmpl000664 000765 000024 00000002715 13574721672 021456 0ustar00mikestaff000000 000000

Modificar {printer_name}

Descrição:
(Descrição legível para humanos, tal como "HP LaserJet com Duplexador")
Localização:
(Localização legível para humanos, tal como "Laboratório 1")
Conexão: {device_uri}
Compartilhamento:
cups-2.3.1/templates/pt_BR/classes-header.tmpl000664 000765 000024 00000000150 13574721672 021360 0ustar00mikestaff000000 000000

{total=0?Nenhuma classe:Mostrando {#printer_name} de {total} classe{total=1?:s}}.

cups-2.3.1/templates/pt_BR/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 024104 0ustar00mikestaff000000 000000
cups-2.3.1/templates/pt_BR/edit-config.tmpl000664 000765 000024 00000001212 13574721672 020665 0ustar00mikestaff000000 000000

Editar arquivo de configuração

cups-2.3.1/templates/pt_BR/printer-confirm.tmpl000664 000765 000024 00000000705 13574721672 021621 0ustar00mikestaff000000 000000

Excluir impressora {printer_name}

Aviso: Tem certeza que deseja excluir a impressora {printer_name}?

cups-2.3.1/templates/pt_BR/job-hold.tmpl000664 000765 000024 00000000216 13574721672 020176 0ustar00mikestaff000000 000000

Reter trabalho {job_id}

Trabalho {job_id} foi retido para não ser impresso. cups-2.3.1/templates/pt_BR/class-added.tmpl000664 000765 000024 00000000206 13574721672 020643 0ustar00mikestaff000000 000000

Adicionar classe

A classe {printer_name} foi adicionada com sucesso. cups-2.3.1/templates/pt_BR/classes.tmpl000664 000765 000024 00000001043 13574721672 020134 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
Nome da filaDescriçãoLocalizaçãoMembrosEstado
{printer_name}{printer_info}{printer_location}{?member_uris=?Nenhum:{member_uris}}{printer_state=3?ociosa:{printer_state=4?processando:pausada}}{printer_state_message? - "{printer_state_message}":}

} cups-2.3.1/templates/pt_BR/test-page.tmpl000664 000765 000024 00000000315 13574721672 020371 0ustar00mikestaff000000 000000

Imprimir página de teste em {printer_name}

Página de teste enviada; o ID do trabalho é {printer_name}-{job_id}.

cups-2.3.1/templates/pt_BR/printer-jobs-header.tmpl000664 000765 000024 00000000041 13574721672 022340 0ustar00mikestaff000000 000000

Trabalhos

cups-2.3.1/templates/pt_BR/job-moved.tmpl000664 000765 000024 00000000410 13574721672 020356 0ustar00mikestaff000000 000000

{job_id?Mover trabalho {job_id}:Mover trabalhos}

{job_id?Trabalho {job_id} for movido:Todos trabalhos foram movidos} para {job_printer_name}.

cups-2.3.1/templates/pt_BR/add-class.tmpl000664 000765 000024 00000002266 13574721672 020342 0ustar00mikestaff000000 000000

Adicionar classe

Nome:
(Pode conter qualquer caractere imprimível, exceto "/", "#", e espaço em branco)
Descrição:
(Descrição legível para humanos, tal como "HP LaserJet com Duplexador")
Localização:
(Localização legível para humanos, tal como "Laboratório 1")
Membros:
cups-2.3.1/templates/da/restart.tmpl000664 000765 000024 00000005062 13574721672 017546 0ustar00mikestaff000000 000000

Skift indstillinger

Optaget-indikator Vent venligst, mens serveren genstartes...

cups-2.3.1/templates/da/option-conflict.tmpl000664 000765 000024 00000000325 13574721672 021166 0ustar00mikestaff000000 000000

Fejl: Følgende tilvalg er i konflikt:

Ændr venligst en eller flere af tilvalgene for at løse konflikterne.

cups-2.3.1/templates/da/trailer.tmpl000664 000765 000024 00000000352 13574721672 017521 0ustar00mikestaff000000 000000
cups-2.3.1/templates/da/printer-start.tmpl000664 000765 000024 00000000313 13574721672 020672 0ustar00mikestaff000000 000000

Genoptag {is_class?klassen:printeren} {printer_name}

{is_class?Klassen:Printeren} {printer_name} blev genoptaget.

cups-2.3.1/templates/da/choose-make.tmpl000664 000765 000024 00000003553 13574721672 020260 0ustar00mikestaff000000 000000

{op=modify-printer?Rediger {printer_name}:Tilføj printer}

{printer_name?:} {op=modify-printer?:}
Navn: {printer_name}
Beskrivelse: {printer_info}
Placering: {printer_location}
Forbindelse: {device_uri}
Deling: Del {?printer_is_shared=?ikke:{?printer_is_shared=0?ikke:}} printeren
Producent:
 
Eller angiv en PPD-fil:
cups-2.3.1/templates/da/option-header.tmpl000664 000765 000024 00000000131 13574721672 020610 0ustar00mikestaff000000 000000

{group}

cups-2.3.1/templates/da/job-cancel.tmpl000664 000765 000024 00000000165 13574721672 020056 0ustar00mikestaff000000 000000

Annuller jobbet {job_id}

Jobbet {job_id} blev annulleret. cups-2.3.1/templates/da/option-trailer.tmpl000664 000765 000024 00000000135 13574721672 021026 0ustar00mikestaff000000 000000

cups-2.3.1/templates/da/printer-added.tmpl000664 000765 000024 00000000173 13574721672 020602 0ustar00mikestaff000000 000000

Tilføj printer

Printeren {printer_name} blev tilføjet. cups-2.3.1/templates/da/command.tmpl000664 000765 000024 00000000651 13574721672 017477 0ustar00mikestaff000000 000000

{title} på {printer_name}

{job_state>5?:Optaget-indikator }Printerkommandojob {job_state=3?afventer:{job_state=4?tilbageholdt: {job_state=5?behandler:{job_state=6?stoppet: {job_state=7?annulleret:{job_state=8?afbrudt:fuldført}}}}}}{job_state=9?:{job_printer_state_message?, "{job_printer_state_message}":}}

cups-2.3.1/templates/da/help-printable.tmpl000664 000765 000024 00000000562 13574721672 020770 0ustar00mikestaff000000 000000 {HELPTITLE} cups-2.3.1/templates/da/printer-reject.tmpl000664 000765 000024 00000000337 13574721672 021017 0ustar00mikestaff000000 000000

Afvis jobs på {is_class?klassen:printeren} {printer_name}

{is_class?Klassen:Printeren} {printer_name} accepterer ikke længere jobs.

cups-2.3.1/templates/da/class.tmpl000664 000765 000024 00000004346 13574721672 017173 0ustar00mikestaff000000 000000

{printer_name} ({printer_state=3?Inaktiv:{printer_state=4?Behandler:Sat på pause}}, {printer_is_accepting_jobs=0?Afviser jobs:Accepterer jobs}, {server_is_sharing_printers=0?Ikke:{printer_is_shared=0?Ikke:}} Delt{default_name={printer_name}?, Server Default:})

Beskrivelse:{printer_info}
Placering:{printer_location}
Medlemmer:{?member_uris=?None:{member_uris}}
Standarder:job-sheets={job_sheets_default} media={media_default?{media_default}:ukendt} {sides_default?sides={sides_default}:}
cups-2.3.1/templates/da/modify-class.tmpl000664 000765 000024 00000001534 13574721672 020454 0ustar00mikestaff000000 000000

Rediger klassen {printer_name}

Beskrivelse:
Placering:
Medlemmer:
cups-2.3.1/templates/da/list-available-printers.tmpl000664 000765 000024 00000001202 13574721672 022607 0ustar00mikestaff000000 000000

Tilgængelige printere

{#device_uri=0?

Ingen printere fundet.

:
    {[device_uri]
  • {device_make_and_model} ({device_info})
  • }
} cups-2.3.1/templates/da/printer-stop.tmpl000664 000765 000024 00000000324 13574721672 020524 0ustar00mikestaff000000 000000

Sæt {is_class?klassen:printeren} {printer_name} på pause

{is_class?Klassen:Printeren} {printer_name} blev sat på pause.

cups-2.3.1/templates/da/printer-cancel-jobs.tmpl000664 000765 000024 00000000342 13574721672 021717 0ustar00mikestaff000000 000000

Annuller jobs på {is_class?klassen:printeren} {printer_name}

Alle jobs på {is_class?klassen:printeren} {printer_name} blev annulleret.

cups-2.3.1/templates/da/choose-model.tmpl000664 000765 000024 00000004271 13574721672 020441 0ustar00mikestaff000000 000000

{op=modify-printer?Rediger {printer_name}:Tilføj printer}

{printer_name?:} {op=modify-printer?:}
Navn: {printer_name}
Beskrivelse: {printer_info}
Placering: {printer_location}
Forbindelse: {device_uri}
Deling: Del {?printer_is_shared=?ikke:{?printer_is_shared=0?ikke:}} printeren
Producent: {PPD_MAKE}
Model:
Eller angiv en PPD-fil:
cups-2.3.1/templates/da/option-pickmany.tmpl000664 000765 000024 00000000377 13574721672 021207 0ustar00mikestaff000000 000000 {keytext}: cups-2.3.1/templates/da/choose-device.tmpl000664 000765 000024 00000004157 13574721672 020603 0ustar00mikestaff000000 000000

{op=modify-printer?Rediger {printer_name}:Tilføj printer}

{CUPS_GET_DEVICES_DONE?
{printer_name?:} {op=add-printer?:}
Nuværende forbindelse\:
Lokale printere\: {[device_uri]{device_class!network?
:}}
Opdagede netværksprintere\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?
:}:}}
Andre netværksprintere\: {[device_uri]{device_class=network?{device_uri~[a-z]+://?:
}:}}
:

Optaget-indikator Leder efter printere...

} cups-2.3.1/templates/da/jobs.tmpl000664 000765 000024 00000005312 13574721672 017015 0ustar00mikestaff000000 000000 {#job_id=0?: {[job_id] }
IDNavnBrugerStørrelseSiderTilstandStyring
{job_printer_name}-{job_id}{?phone? ({phone}):}  {?job_name=?Ukendt:{job_name}}  {?job_originating_user_name=?Tilbageholdt:{job_originating_user_name}}  {job_k_octets}k  {job_impressions_completed=0?Ukendt:{?job_impressions_completed}}  {job_state=3?afventer siden
{?time_at_creation=?Ukendt:{time_at_creation}}:{job_state=4?tilbageholdt siden
{?time_at_creation=?Ukendt:{time_at_creation}}: {job_state=5?behandler siden
{?time_at_processing=?Ukendt:{time_at_processing}}:{job_state=6?stoppet: {job_state=7?annulleret ved
{?time_at_completed=?Ukendt:{time_at_completed}}:{job_state=8?afbrudt:fuldtført ved
{?time_at_completed=?Ukendt:{time_at_completed}}}}}}}} {job_printer_state_message?
"{job_printer_state_message}":}
{job_preserved>0?{job_state>5?
:}:} {job_state=4?
:} {job_state=3?
:} {job_state<7?
:}  
} cups-2.3.1/templates/da/class-jobs-header.tmpl000664 000765 000024 00000000034 13574721672 021342 0ustar00mikestaff000000 000000

Jobs

cups-2.3.1/templates/da/help-header.tmpl000664 000765 000024 00000003273 13574721672 020242 0ustar00mikestaff000000 000000
{TOPIC?:}

Søg i {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Alle dokumenter}}:

{QUERY?

Søg efter resultater i {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Alle dokumenter}}\:

{QTEXT?:} :

Ingen match fundet.

}
:} {HELPTITLE?
:

Onlinehjælp

Dette er grænsefladen til CUPS-onlinehjælp. Indtast søgeord ovenfor eller klik på dokumentationenslinkene for at vise information om onlinehjælp.

Hvis CUPS er nyt for dig, så læs "Oversigt over CUPS"-siden.

CUPS-hjemmesiden giver også mange ressourcer, inklusiv fora til brugerdiskussion, svar på oftest stillede spørgsmål, og en formular til indsendelse af fejlrapporter og anmodninger om funktionaliteter.

} cups-2.3.1/templates/da/pager.tmpl000664 000765 000024 00000002351 13574721672 017156 0ustar00mikestaff000000 000000
{PREV?{PREV>0?
:}
: }
{NEXT?
: } {LAST?
:}
cups-2.3.1/templates/da/option-pickone.tmpl000664 000765 000024 00000001662 13574721672 021022 0ustar00mikestaff000000 000000 {keytext}: {iscustom=1?{[params] }
{paramtext}: {params=Units?:}
:} cups-2.3.1/templates/da/printers.tmpl000664 000765 000024 00000001010 13574721672 017715 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
KønavnBeskrivelsePlaceringProducent og modelStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inaktiv:{printer_state=4?Behandler:Sat på pause}}{printer_state_message? - "{printer_state_message}":}
} cups-2.3.1/templates/da/job-move.tmpl000664 000765 000024 00000001141 13574721672 017572 0ustar00mikestaff000000 000000
{job_id?:}

{job_id?Flyt jobbet {job_id}:Flyt alle jobs}

Ny destination:
cups-2.3.1/templates/da/admin.tmpl000664 000765 000024 00000012605 13574721672 017153 0ustar00mikestaff000000 000000

Printere

Klasser

Jobs

Server

{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

{SETTINGS_ERROR}
:
{ADVANCEDSETTINGS?

Serverindstillinger\:

Avanceret

        Maks. klienter\:
        
        

{have_gssapi?
:}

        Maksimum jobs (0 for ubegrænset)\:
        Bevar metadata\:
        Bevar dokumenter\:

        Maks. størrelse på logfil\:

:

Serverindstillinger:

Avanceret

        

{have_gssapi?
:}

}

}
cups-2.3.1/templates/da/choose-uri.tmpl000664 000765 000024 00000002052 13574721672 020133 0ustar00mikestaff000000 000000

{op=modify-printer?Rediger {printer_name}:Tilføj printer}

{printer_name?:}
Forbindelse:
Eksempler:
    http://værtsnavn:631/ipp/
    http://værtsnavn:631/ipp/port1

    ipp://værtsnavn/ipp/
    ipp://værtsnavn/ipp/port1

    lpd://værtsnavn/kø

    socket://værtsnavn
    socket://værtsnavn:9100

Se "Netværksprintere " for den korrekte URI til brug med din printer.

cups-2.3.1/templates/da/header.tmpl.in000664 000765 000024 00000003326 13574721672 017720 0ustar00mikestaff000000 000000 {refresh_page?:} {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@
\n" "\n" "\n"); httpWrite2(client->http, "", 0); } /* * 'html_header()' - Show the web interface header and title. */ static void html_header(ippeve_client_t *client, /* I - Client */ const char *title, /* I - Title */ int refresh) /* I - Refresh timer, if any */ { html_printf(client, "\n" "\n" "\n" "%s\n" "\n" "\n" "\n", title); if (refresh > 0) html_printf(client, "\n", refresh); html_printf(client, "\n" "\n" "\n" "\n" "" "" "" "" "
StatusSuppliesMedia
\n" "
\n", !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : ""); } /* * 'html_printf()' - Send formatted text to the client, quoting as needed. */ static void html_printf(ippeve_client_t *client, /* I - Client */ const char *format, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { va_list ap; /* Pointer to arguments */ const char *start; /* Start of string */ char size, /* Size character (h, l, L) */ type; /* Format type character */ int width, /* Width of field */ prec; /* Number of characters of precision */ char tformat[100], /* Temporary format string for sprintf() */ *tptr, /* Pointer into temporary format */ temp[1024]; /* Buffer for formatted numbers */ char *s; /* Pointer to string */ /* * Loop through the format string, formatting as needed... */ va_start(ap, format); start = format; while (*format) { if (*format == '%') { if (format > start) httpWrite2(client->http, start, (size_t)(format - start)); tptr = tformat; *tptr++ = *format++; if (*format == '%') { httpWrite2(client->http, "%", 1); format ++; start = format; continue; } else if (strchr(" -+#\'", *format)) *tptr++ = *format++; if (*format == '*') { /* * Get width from argument... */ format ++; width = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width); tptr += strlen(tptr); } else { width = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; width = width * 10 + *format++ - '0'; } } if (*format == '.') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; format ++; if (*format == '*') { /* * Get precision from argument... */ format ++; prec = va_arg(ap, int); snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec); tptr += strlen(tptr); } else { prec = 0; while (isdigit(*format & 255)) { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; prec = prec * 10 + *format++ - '0'; } } } if (*format == 'l' && format[1] == 'l') { size = 'L'; if (tptr < (tformat + sizeof(tformat) - 2)) { *tptr++ = 'l'; *tptr++ = 'l'; } format += 2; } else if (*format == 'h' || *format == 'l' || *format == 'L') { if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; size = *format++; } else size = 0; if (!*format) { start = format; break; } if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; type = *format++; *tptr = '\0'; start = format; switch (type) { case 'E' : /* Floating point formats */ case 'G' : case 'e' : case 'f' : case 'g' : if ((size_t)(width + 2) > sizeof(temp)) break; sprintf(temp, tformat, va_arg(ap, double)); httpWrite2(client->http, temp, strlen(temp)); break; case 'B' : /* Integer formats */ case 'X' : case 'b' : case 'd' : case 'i' : case 'o' : case 'u' : case 'x' : if ((size_t)(width + 2) > sizeof(temp)) break; # ifdef HAVE_LONG_LONG if (size == 'L') sprintf(temp, tformat, va_arg(ap, long long)); else # endif /* HAVE_LONG_LONG */ if (size == 'l') sprintf(temp, tformat, va_arg(ap, long)); else sprintf(temp, tformat, va_arg(ap, int)); httpWrite2(client->http, temp, strlen(temp)); break; case 'p' : /* Pointer value */ if ((size_t)(width + 2) > sizeof(temp)) break; sprintf(temp, tformat, va_arg(ap, void *)); httpWrite2(client->http, temp, strlen(temp)); break; case 'c' : /* Character or character array */ if (width <= 1) { temp[0] = (char)va_arg(ap, int); temp[1] = '\0'; html_escape(client, temp, 1); } else html_escape(client, va_arg(ap, char *), (size_t)width); break; case 's' : /* String */ if ((s = va_arg(ap, char *)) == NULL) s = "(null)"; html_escape(client, s, strlen(s)); break; } } else format ++; } if (format > start) httpWrite2(client->http, start, (size_t)(format - start)); va_end(ap); } /* * 'ipp_cancel_job()' - Cancel a job. */ static void ipp_cancel_job(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job information */ /* * Get the job... */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); return; } /* * See if the job is already completed, canceled, or aborted; if so, * we can't cancel... */ switch (job->state) { case IPP_JSTATE_CANCELED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is already canceled - can\'t cancel.", job->id); break; case IPP_JSTATE_ABORTED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is already aborted - can\'t cancel.", job->id); break; case IPP_JSTATE_COMPLETED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is already completed - can\'t cancel.", job->id); break; default : /* * Cancel the job... */ _cupsRWLockWrite(&(client->printer->rwlock)); if (job->state == IPP_JSTATE_PROCESSING || (job->state == IPP_JSTATE_HELD && job->fd >= 0)) job->cancel = 1; else { job->state = IPP_JSTATE_CANCELED; job->completed = time(NULL); } _cupsRWUnlock(&(client->printer->rwlock)); respond_ipp(client, IPP_STATUS_OK, NULL); break; } } /* * 'ipp_close_job()' - Close an open job. */ static void ipp_close_job(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job information */ /* * Get the job... */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); return; } /* * See if the job is already completed, canceled, or aborted; if so, * we can't cancel... */ switch (job->state) { case IPP_JSTATE_CANCELED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is canceled - can\'t close.", job->id); break; case IPP_JSTATE_ABORTED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is aborted - can\'t close.", job->id); break; case IPP_JSTATE_COMPLETED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is completed - can\'t close.", job->id); break; case IPP_JSTATE_PROCESSING : case IPP_JSTATE_STOPPED : respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job #%d is already closed.", job->id); break; default : respond_ipp(client, IPP_STATUS_OK, NULL); break; } } /* * 'ipp_create_job()' - Create a job object. */ static void ipp_create_job(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* New job */ cups_array_t *ra; /* Attributes to send in response */ /* * Validate print job attributes... */ if (!valid_job_attributes(client)) { httpFlush(client->http); return; } /* * Do we have a file to print? */ if (httpGetState(client->http) == HTTP_STATE_POST_RECV) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unexpected document data following request."); return; } /* * Create the job... */ if ((job = create_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } /* * Return the job info... */ respond_ipp(client, IPP_STATUS_OK, NULL); ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-message"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); } /* * 'ipp_get_job_attributes()' - Get the attributes for a job object. */ static void ipp_get_job_attributes( ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job */ cups_array_t *ra; /* requested-attributes */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job not found."); return; } respond_ipp(client, IPP_STATUS_OK, NULL); ra = ippCreateRequestedArray(client->request); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); } /* * 'ipp_get_jobs()' - Get a list of job objects. */ static void ipp_get_jobs(ippeve_client_t *client) /* I - Client */ { ipp_attribute_t *attr; /* Current attribute */ const char *which_jobs = NULL; /* which-jobs values */ int job_comparison; /* Job comparison */ ipp_jstate_t job_state; /* job-state value */ int first_job_id, /* First job ID */ limit, /* Maximum number of jobs to return */ count; /* Number of jobs that match */ const char *username; /* Username */ ippeve_job_t *job; /* Current job pointer */ cups_array_t *ra; /* Requested attributes array */ /* * See if the "which-jobs" attribute have been specified... */ if ((attr = ippFindAttribute(client->request, "which-jobs", IPP_TAG_KEYWORD)) != NULL) { which_jobs = ippGetString(attr, 0, NULL); fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->hostname, which_jobs); } if (!which_jobs || !strcmp(which_jobs, "not-completed")) { job_comparison = -1; job_state = IPP_JSTATE_STOPPED; } else if (!strcmp(which_jobs, "completed")) { job_comparison = 1; job_state = IPP_JSTATE_CANCELED; } else if (!strcmp(which_jobs, "aborted")) { job_comparison = 0; job_state = IPP_JSTATE_ABORTED; } else if (!strcmp(which_jobs, "all")) { job_comparison = 1; job_state = IPP_JSTATE_PENDING; } else if (!strcmp(which_jobs, "canceled")) { job_comparison = 0; job_state = IPP_JSTATE_CANCELED; } else if (!strcmp(which_jobs, "pending")) { job_comparison = 0; job_state = IPP_JSTATE_PENDING; } else if (!strcmp(which_jobs, "pending-held")) { job_comparison = 0; job_state = IPP_JSTATE_HELD; } else if (!strcmp(which_jobs, "processing")) { job_comparison = 0; job_state = IPP_JSTATE_PROCESSING; } else if (!strcmp(which_jobs, "processing-stopped")) { job_comparison = 0; job_state = IPP_JSTATE_STOPPED; } else { respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "The which-jobs value \"%s\" is not supported.", which_jobs); ippAddString(client->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, "which-jobs", NULL, which_jobs); return; } /* * See if they want to limit the number of jobs reported... */ if ((attr = ippFindAttribute(client->request, "limit", IPP_TAG_INTEGER)) != NULL) { limit = ippGetInteger(attr, 0); fprintf(stderr, "%s Get-Jobs limit=%d", client->hostname, limit); } else limit = 0; if ((attr = ippFindAttribute(client->request, "first-job-id", IPP_TAG_INTEGER)) != NULL) { first_job_id = ippGetInteger(attr, 0); fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->hostname, first_job_id); } else first_job_id = 1; /* * See if we only want to see jobs for a specific user... */ username = NULL; if ((attr = ippFindAttribute(client->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL) { int my_jobs = ippGetBoolean(attr, 0); fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->hostname, my_jobs ? "true" : "false"); if (my_jobs) { if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Need requesting-user-name with my-jobs."); return; } username = ippGetString(attr, 0, NULL); fprintf(stderr, "%s Get-Jobs requesting-user-name=\"%s\"\n", client->hostname, username); } } /* * OK, build a list of jobs for this printer... */ ra = ippCreateRequestedArray(client->request); respond_ipp(client, IPP_STATUS_OK, NULL); _cupsRWLockRead(&(client->printer->rwlock)); for (count = 0, job = (ippeve_job_t *)cupsArrayFirst(client->printer->jobs); (limit <= 0 || count < limit) && job; job = (ippeve_job_t *)cupsArrayNext(client->printer->jobs)) { /* * Filter out jobs that don't match... */ if ((job_comparison < 0 && job->state > job_state) || (job_comparison == 0 && job->state != job_state) || (job_comparison > 0 && job->state < job_state) || job->id < first_job_id || (username && job->username && strcasecmp(username, job->username))) continue; if (count > 0) ippAddSeparator(client->response); count ++; copy_job_attributes(client, job, ra); } cupsArrayDelete(ra); _cupsRWUnlock(&(client->printer->rwlock)); } /* * 'ipp_get_printer_attributes()' - Get the attributes for a printer object. */ static void ipp_get_printer_attributes( ippeve_client_t *client) /* I - Client */ { cups_array_t *ra; /* Requested attributes array */ ippeve_printer_t *printer; /* Printer */ /* * Send the attributes... */ ra = ippCreateRequestedArray(client->request); printer = client->printer; respond_ipp(client, IPP_STATUS_OK, NULL); _cupsRWLockRead(&(printer->rwlock)); copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO, IPP_TAG_CUPS_CONST); if (!ra || cupsArrayFind(ra, "printer-config-change-date-time")) ippAddDate(client->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time)); if (!ra || cupsArrayFind(ra, "printer-config-change-time")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-config-change-time", (int)(printer->config_time - printer->start_time)); if (!ra || cupsArrayFind(ra, "printer-current-time")) ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL))); if (!ra || cupsArrayFind(ra, "printer-state")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state); if (!ra || cupsArrayFind(ra, "printer-state-change-date-time")) ippAddDate(client->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time)); if (!ra || cupsArrayFind(ra, "printer-state-change-time")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-state-change-time", (int)(printer->state_time - printer->start_time)); if (!ra || cupsArrayFind(ra, "printer-state-message")) { static const char * const messages[] = { "Idle.", "Printing.", "Stopped." }; ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->state - IPP_PSTATE_IDLE]); } if (!ra || cupsArrayFind(ra, "printer-state-reasons")) { if (printer->state_reasons == IPPEVE_PREASON_NONE) { ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", NULL, "none"); } else { ipp_attribute_t *attr = NULL; /* printer-state-reasons */ ippeve_preason_t bit; /* Reason bit */ int i; /* Looping var */ char reason[32]; /* Reason string */ for (i = 0, bit = 1; i < (int)(sizeof(ippeve_preason_strings) / sizeof(ippeve_preason_strings[0])); i ++, bit *= 2) { if (printer->state_reasons & bit) { snprintf(reason, sizeof(reason), "%s-%s", ippeve_preason_strings[i], printer->state == IPP_PSTATE_IDLE ? "report" : printer->state == IPP_PSTATE_PROCESSING ? "warning" : "error"); if (attr) ippSetString(client->response, &attr, ippGetCount(attr), reason); else attr = ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "printer-state-reasons", NULL, reason); } } } } if (!ra || cupsArrayFind(ra, "printer-up-time")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time)); if (!ra || cupsArrayFind(ra, "queued-job-count")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED); _cupsRWUnlock(&(printer->rwlock)); cupsArrayDelete(ra); } /* * 'ipp_identify_printer()' - Beep or display a message. */ static void ipp_identify_printer( ippeve_client_t *client) /* I - Client */ { ipp_attribute_t *actions, /* identify-actions */ *message; /* message */ actions = ippFindAttribute(client->request, "identify-actions", IPP_TAG_KEYWORD); message = ippFindAttribute(client->request, "message", IPP_TAG_TEXT); if (!actions || ippContainsString(actions, "sound")) { putchar(0x07); fflush(stdout); } if (ippContainsString(actions, "display")) printf("IDENTIFY from %s: %s\n", client->hostname, message ? ippGetString(message, 0, NULL) : "No message supplied"); respond_ipp(client, IPP_STATUS_OK, NULL); } /* * 'ipp_print_job()' - Create a job object with an attached document. */ static void ipp_print_job(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* New job */ /* * Validate print job attributes... */ if (!valid_job_attributes(client)) { httpFlush(client->http); return; } /* * Do we have a file to print? */ if (httpGetState(client->http) == HTTP_STATE_POST_SEND) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request."); return; } /* * Create the job... */ if ((job = create_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } /* * Then finish getting the document data and process things... */ finish_document_data(client, job); } /* * 'ipp_print_uri()' - Create a job object with a referenced document. */ static void ipp_print_uri(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* New job */ /* * Validate print job attributes... */ if (!valid_job_attributes(client)) { httpFlush(client->http); return; } /* * Create the job... */ if ((job = create_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } /* * Then finish getting the document data and process things... */ finish_document_uri(client, job); } /* * 'ipp_send_document()' - Add an attached document to a job object created with * Create-Job. */ static void ipp_send_document( ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job information */ ipp_attribute_t *attr; /* Current attribute */ /* * Get the job... */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); httpFlush(client->http); return; } /* * See if we already have a document for this job or the job has already * in a non-pending state... */ if (job->state > IPP_JSTATE_HELD) { respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); httpFlush(client->http); return; } else if (job->filename || job->fd >= 0) { respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); httpFlush(client->http); return; } /* * Make sure we have the "last-document" operation attribute... */ if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute."); httpFlush(client->http); return; } else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group."); httpFlush(client->http); return; } else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0)) { respond_unsupported(client, attr); httpFlush(client->http); return; } /* * Validate document attributes... */ if (!valid_doc_attributes(client)) { httpFlush(client->http); return; } /* * Then finish getting the document data and process things... */ _cupsRWLockWrite(&(client->printer->rwlock)); copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else job->format = "application/octet-stream"; _cupsRWUnlock(&(client->printer->rwlock)); finish_document_data(client, job); } /* * 'ipp_send_uri()' - Add a referenced document to a job object created with * Create-Job. */ static void ipp_send_uri(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job information */ ipp_attribute_t *attr; /* Current attribute */ /* * Get the job... */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); httpFlush(client->http); return; } /* * See if we already have a document for this job or the job has already * in a non-pending state... */ if (job->state > IPP_JSTATE_HELD) { respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); httpFlush(client->http); return; } else if (job->filename || job->fd >= 0) { respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); httpFlush(client->http); return; } if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute."); httpFlush(client->http); return; } else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group."); httpFlush(client->http); return; } else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0)) { respond_unsupported(client, attr); httpFlush(client->http); return; } /* * Validate document attributes... */ if (!valid_doc_attributes(client)) { httpFlush(client->http); return; } /* * Then finish getting the document data and process things... */ _cupsRWLockWrite(&(client->printer->rwlock)); copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else job->format = "application/octet-stream"; _cupsRWUnlock(&(client->printer->rwlock)); finish_document_uri(client, job); } /* * 'ipp_validate_job()' - Validate job creation attributes. */ static void ipp_validate_job(ippeve_client_t *client) /* I - Client */ { if (valid_job_attributes(client)) respond_ipp(client, IPP_STATUS_OK, NULL); } /* * 'ippserver_attr_cb()' - Determine whether an attribute should be loaded. */ static int /* O - 1 to use, 0 to ignore */ ippserver_attr_cb( _ipp_file_t *f, /* I - IPP file */ void *user_data, /* I - User data pointer (unused) */ const char *attr) /* I - Attribute name */ { int i, /* Current element */ result; /* Result of comparison */ static const char * const ignored[] = { /* Ignored attributes */ "attributes-charset", "attributes-natural-language", "charset-configured", "charset-supported", "device-service-count", "device-uuid", "document-format-varying-attributes", "generated-natural-language-supported", "identify-actions-default", "identify-actions-supported", "ipp-features-supported", "ipp-versions-supproted", "ippget-event-life", "job-hold-until-supported", "job-hold-until-time-supported", "job-ids-supported", "job-k-octets-supported", "job-settable-attributes-supported", "multiple-document-jobs-supported", "multiple-operation-time-out", "multiple-operation-time-out-action", "natural-language-configured", "notify-attributes-supported", "notify-events-default", "notify-events-supported", "notify-lease-duration-default", "notify-lease-duration-supported", "notify-max-events-supported", "notify-pull-method-supported", "operations-supported", "printer-alert", "printer-alert-description", "printer-camera-image-uri", "printer-charge-info", "printer-charge-info-uri", "printer-config-change-date-time", "printer-config-change-time", "printer-current-time", "printer-detailed-status-messages", "printer-dns-sd-name", "printer-fax-log-uri", "printer-get-attributes-supported", "printer-icons", "printer-id", "printer-info", "printer-is-accepting-jobs", "printer-message-date-time", "printer-message-from-operator", "printer-message-time", "printer-more-info", "printer-service-type", "printer-settable-attributes-supported", "printer-state", "printer-state-message", "printer-state-reasons", "printer-static-resource-directory-uri", "printer-static-resource-k-octets-free", "printer-static-resource-k-octets-supported", "printer-strings-languages-supported", "printer-strings-uri", "printer-supply-info-uri", "printer-up-time", "printer-uri-supported", "printer-xri-supported", "queued-job-count", "reference-uri-scheme-supported", "uri-authentication-supported", "uri-security-supported", "which-jobs-supported", "xri-authentication-supported", "xri-security-supported", "xri-uri-scheme-supported" }; (void)f; (void)user_data; for (i = 0, result = 1; i < (int)(sizeof(ignored) / sizeof(ignored[0])); i ++) { if ((result = strcmp(attr, ignored[i])) <= 0) break; } return (result != 0); } /* * 'ippserver_error_cb()' - Log an error message. */ static int /* O - 1 to continue, 0 to stop */ ippserver_error_cb( _ipp_file_t *f, /* I - IPP file data */ void *user_data, /* I - User data pointer (unused) */ const char *error) /* I - Error message */ { (void)f; (void)user_data; _cupsLangPrintf(stderr, "%s\n", error); return (1); } /* * 'ippserver_token_cb()' - Process ippserver-specific config file tokens. */ static int /* O - 1 to continue, 0 to stop */ ippserver_token_cb( _ipp_file_t *f, /* I - IPP file data */ _ipp_vars_t *vars, /* I - IPP variables */ void *user_data, /* I - User data pointer (unused) */ const char *token) /* I - Current token */ { (void)vars; (void)user_data; if (!token) { /* * NULL token means do the initial setup - create an empty IPP message and * return... */ f->attrs = ippNew(); f->group_tag = IPP_TAG_PRINTER; } else { _cupsLangPrintf(stderr, _("Unknown directive \"%s\" on line %d of \"%s\" ignored."), token, f->linenum, f->filename); } return (1); } /* * 'load_ippserver_attributes()' - Load IPP attributes from an ippserver file. */ static ipp_t * /* O - IPP attributes or `NULL` on error */ load_ippserver_attributes( const char *servername, /* I - Server name or `NULL` for default */ int serverport, /* I - Server port number */ const char *filename, /* I - ippserver attribute filename */ cups_array_t *docformats) /* I - document-format-supported values */ { ipp_t *attrs; /* IPP attributes */ _ipp_vars_t vars; /* IPP variables */ char temp[256]; /* Temporary string */ (void)docformats; /* for now */ /* * Setup callbacks and variables for the printer configuration file... * * The following additional variables are supported: * * - SERVERNAME: The host name of the server. * - SERVERPORT: The default port of the server. */ _ippVarsInit(&vars, (_ipp_fattr_cb_t)ippserver_attr_cb, (_ipp_ferror_cb_t)ippserver_error_cb, (_ipp_ftoken_cb_t)ippserver_token_cb); if (servername) { _ippVarsSet(&vars, "SERVERNAME", servername); } else { httpGetHostname(NULL, temp, sizeof(temp)); _ippVarsSet(&vars, "SERVERNAME", temp); } snprintf(temp, sizeof(temp), "%d", serverport); _ippVarsSet(&vars, "SERVERPORT", temp); /* * Load attributes and values for the printer... */ attrs = _ippFileParse(&vars, filename, NULL); /* * Free memory and return... */ _ippVarsDeinit(&vars); return (attrs); } /* * 'load_legacy_attributes()' - Load IPP attributes using the old ippserver * options. */ static ipp_t * /* O - IPP attributes or `NULL` on error */ load_legacy_attributes( const char *make, /* I - Manufacturer name */ const char *model, /* I - Model name */ int ppm, /* I - pages-per-minute */ int ppm_color, /* I - pages-per-minute-color */ int duplex, /* I - Duplex support? */ cups_array_t *docformats) /* I - document-format-supported values */ { int i; /* Looping var */ ipp_t *attrs, /* IPP attributes */ *col; /* Collection value */ ipp_attribute_t *attr; /* Current attribute */ char device_id[1024],/* printer-device-id */ *ptr, /* Pointer into device ID */ make_model[128];/* printer-make-and-model */ const char *format, /* Current document format */ *prefix; /* Prefix for device ID */ int num_media; /* Number of media */ const char * const *media; /* List of media */ int num_ready; /* Number of loaded media */ const char * const *ready; /* List of loaded media */ pwg_media_t *pwg; /* PWG media size information */ static const char * const media_supported[] = { /* media-supported values */ "na_letter_8.5x11in", /* Letter */ "na_legal_8.5x14in", /* Legal */ "iso_a4_210x297mm", /* A4 */ "na_number-10_4.125x9.5in", /* #10 Envelope */ "iso_dl_110x220mm" /* DL Envelope */ }; static const char * const media_supported_color[] = { /* media-supported values */ "na_letter_8.5x11in", /* Letter */ "na_legal_8.5x14in", /* Legal */ "iso_a4_210x297mm", /* A4 */ "na_number-10_4.125x9.5in", /* #10 Envelope */ "iso_dl_110x220mm", /* DL Envelope */ "na_index-3x5_3x5in", /* Photo 3x5 */ "oe_photo-l_3.5x5in", /* Photo L */ "na_index-4x6_4x6in", /* Photo 4x6 */ "iso_a6_105x148mm", /* A6 */ "na_5x7_5x7in" /* Photo 5x7 aka 2L */ "iso_a5_148x210mm", /* A5 */ }; static const char * const media_ready[] = { /* media-ready values */ "na_letter_8.5x11in", /* Letter */ "na_number-10_4.125x9.5in" /* #10 */ }; static const char * const media_ready_color[] = { /* media-ready values */ "na_letter_8.5x11in", /* Letter */ "na_index-4x6_4x6in" /* Photo 4x6 */ }; static const char * const media_source_supported[] = { /* media-source-supported values */ "auto", "main", "manual", "by-pass-tray" /* AKA multi-purpose tray */ }; static const char * const media_source_supported_color[] = { /* media-source-supported values */ "auto", "main", "photo" }; static const char * const media_type_supported[] = { /* media-type-supported values */ "auto", "cardstock", "envelope", "labels", "other", "stationery", "stationery-letterhead", "transparency" }; static const char * const media_type_supported_color[] = { /* media-type-supported values */ "auto", "cardstock", "envelope", "labels", "other", "stationery", "stationery-letterhead", "transparency", "photographic-glossy", "photographic-high-gloss", "photographic-matte", "photographic-satin", "photographic-semi-gloss" }; static const int media_bottom_margin_supported[] = { /* media-bottom-margin-supported values */ 635 /* 1/4" */ }; static const int media_bottom_margin_supported_color[] = { /* media-bottom/top-margin-supported values */ 0, /* Borderless */ 1168 /* 0.46" (common HP inkjet bottom margin) */ }; static const int media_lr_margin_supported[] = { /* media-left/right-margin-supported values */ 340, /* 3.4mm (historical HP PCL A4 margin) */ 635 /* 1/4" */ }; static const int media_lr_margin_supported_color[] = { /* media-left/right-margin-supported values */ 0, /* Borderless */ 340, /* 3.4mm (historical HP PCL A4 margin) */ 635 /* 1/4" */ }; static const int media_top_margin_supported[] = { /* media-top-margin-supported values */ 635 /* 1/4" */ }; static const int media_top_margin_supported_color[] = { /* media-top/top-margin-supported values */ 0, /* Borderless */ 102 /* 0.04" (common HP inkjet top margin */ }; static const int orientation_requested_supported[4] = { /* orientation-requested-supported values */ IPP_ORIENT_PORTRAIT, IPP_ORIENT_LANDSCAPE, IPP_ORIENT_REVERSE_LANDSCAPE, IPP_ORIENT_REVERSE_PORTRAIT }; static const char * const overrides_supported[] = { /* overrides-supported values */ "document-numbers", "media", "media-col", "orientation-requested", "pages" }; static const char * const print_color_mode_supported[] = { /* print-color-mode-supported values */ "monochrome" }; static const char * const print_color_mode_supported_color[] = { /* print-color-mode-supported values */ "auto", "color", "monochrome" }; static const int print_quality_supported[] = { /* print-quality-supported values */ IPP_QUALITY_DRAFT, IPP_QUALITY_NORMAL, IPP_QUALITY_HIGH }; static const char * const printer_input_tray[] = { /* printer-input-tray values */ "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto", "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=100;status=0;name=main", "type=sheetFeedManual;mediafeed=0;mediaxfeed=0;maxcapacity=1;level=-2;status=0;name=manual", "type=sheetFeedAutoNonRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=25;level=-2;status=0;name=by-pass-tray" }; static const char * const printer_input_tray_color[] = { /* printer-input-tray values */ "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto", "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=-2;status=0;name=main", "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=25;level=-2;status=0;name=photo" }; static const char * const printer_supply[] = { /* printer-supply values */ "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=75;colorantname=black;" }; static const char * const printer_supply_color[] = { /* printer-supply values */ "index=1;class=receptacleThatIsFilled;type=wasteInk;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=75;colorantname=black;", "index=3;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=50;colorantname=cyan;", "index=4;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=33;colorantname=magenta;", "index=5;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=67;colorantname=yellow;" }; static const char * const printer_supply_description[] = { /* printer-supply-description values */ "Toner Waste Tank", "Black Toner" }; static const char * const printer_supply_description_color[] = { /* printer-supply-description values */ "Ink Waste Tank", "Black Ink", "Cyan Ink", "Magenta Ink", "Yellow Ink" }; static const int pwg_raster_document_resolution_supported[] = { 300, 600 }; static const char * const pwg_raster_document_type_supported[] = { "black_1", "sgray_8" }; static const char * const pwg_raster_document_type_supported_color[] = { "black_1", "sgray_8", "srgb_8", "srgb_16" }; static const char * const sides_supported[] = { /* sides-supported values */ "one-sided", "two-sided-long-edge", "two-sided-short-edge" }; static const char * const urf_supported[] = { /* urf-supported values */ "CP1", "IS1-4-5-19", "MT1-2-3-4-5-6", "RS600", "V1.4", "W8" }; static const char * const urf_supported_color[] = { /* urf-supported values */ "CP1", "IS1-4-5-7-19", "MT1-2-3-4-5-6-8-9-10-11-12-13", "RS600", "SRGB24", "V1.4", "W8" }; static const char * const urf_supported_color_duplex[] = { /* urf-supported values */ "CP1", "IS1-4-5-7-19", "MT1-2-3-4-5-6-8-9-10-11-12-13", "RS600", "SRGB24", "V1.4", "W8", "DM3" }; static const char * const urf_supported_duplex[] = { /* urf-supported values */ "CP1", "IS1-4-5-19", "MT1-2-3-4-5-6", "RS600", "V1.4", "W8", "DM1" }; attrs = ippNew(); if (ppm_color > 0) { num_media = (int)(sizeof(media_supported_color) / sizeof(media_supported_color[0])); media = media_supported_color; num_ready = (int)(sizeof(media_ready_color) / sizeof(media_ready_color[0])); ready = media_ready_color; } else { num_media = (int)(sizeof(media_supported) / sizeof(media_supported[0])); media = media_supported; num_ready = (int)(sizeof(media_ready) / sizeof(media_ready[0])); ready = media_ready; } /* color-supported */ ippAddBoolean(attrs, IPP_TAG_PRINTER, "color-supported", ppm_color > 0); /* copies-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1); /* copies-supported */ ippAddRange(attrs, IPP_TAG_PRINTER, "copies-supported", 1, (cupsArrayFind(docformats, (void *)"application/pdf") != NULL || cupsArrayFind(docformats, (void *)"image/jpeg") != NULL) ? 999 : 1); /* document-password-supported */ if (cupsArrayFind(docformats, (void *)"application/pdf")) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 1023); /* finishings-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); /* finishings-supported */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE); /* media-bottom-margin-supported */ if (ppm_color > 0) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_bottom_margin_supported) / sizeof(media_bottom_margin_supported[0])), media_bottom_margin_supported); else ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_bottom_margin_supported_color) / sizeof(media_bottom_margin_supported_color[0])), media_bottom_margin_supported_color); /* media-col-database and media-col-default */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-database", num_media, NULL); for (i = 0; i < num_media; i ++) { int bottom, left, /* media-xxx-margins */ right, top; const char *source; /* media-source, if any */ pwg = pwgMediaForPWG(media[i]); if (pwg->width < 21000 && pwg->length < 21000) { source = "photo"; /* Photo size media from photo tray */ bottom = /* Borderless margins */ left = right = top = 0; } else if (pwg->width < 21000) { source = "by-pass-tray"; /* Envelopes from multi-purpose tray */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are standard */ right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else if (pwg->width == 21000) { source = NULL; /* A4 from any tray */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are reduced */ right = media_lr_margin_supported[0]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else { source = NULL; /* Other size media from any tray */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are standard */ right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } col = create_media_col(media[i], source, NULL, pwg->width, pwg->length, bottom, left, right, top); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* media-col-default */ pwg = pwgMediaForPWG(ready[0]); if (pwg->width == 21000) col = create_media_col(ready[0], "main", "stationery", pwg->width, pwg->length, ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[0], media_lr_margin_supported[0], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); else col = create_media_col(ready[0], "main", "stationery", pwg->width, pwg->length, ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[1], media_lr_margin_supported[1], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-default", col); ippDelete(col); /* media-col-ready */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-ready", num_ready, NULL); for (i = 0; i < num_ready; i ++) { int bottom, left, /* media-xxx-margins */ right, top; const char *source, /* media-source */ *type; /* media-type */ pwg = pwgMediaForPWG(ready[i]); if (pwg->width < 21000 && pwg->length < 21000) { source = "photo"; /* Photo size media from photo tray */ type = "photographic-glossy"; /* Glossy photo paper */ bottom = /* Borderless margins */ left = right = top = 0; } else if (pwg->width < 21000) { source = "by-pass-tray"; /* Envelopes from multi-purpose tray */ type = "envelope"; /* Envelope */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are standard */ right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else if (pwg->width == 21000) { source = "main"; /* A4 from main tray */ type = "stationery"; /* Plain paper */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are reduced */ right = media_lr_margin_supported[0]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else { source = "main"; /* A4 from main tray */ type = "stationery"; /* Plain paper */ bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; left = /* Left/right margins are standard */ right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } col = create_media_col(ready[i], source, type, pwg->width, pwg->length, bottom, left, right, top); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* media-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-default", NULL, media[0]); /* media-left/right-margin-supported */ if (ppm_color > 0) { ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", (int)(sizeof(media_lr_margin_supported_color) / sizeof(media_lr_margin_supported_color[0])), media_lr_margin_supported_color); ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", (int)(sizeof(media_lr_margin_supported_color) / sizeof(media_lr_margin_supported_color[0])), media_lr_margin_supported_color); } else { ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", (int)(sizeof(media_lr_margin_supported) / sizeof(media_lr_margin_supported[0])), media_lr_margin_supported); ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", (int)(sizeof(media_lr_margin_supported) / sizeof(media_lr_margin_supported[0])), media_lr_margin_supported); } /* media-ready */ ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", num_ready, NULL, ready); /* media-supported */ ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-supported", num_media, NULL, media); /* media-size-supported */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-size-supported", num_media, NULL); for (i = 0; i < num_media; i ++) { pwg = pwgMediaForPWG(media[i]); col = create_media_size(pwg->width, pwg->length); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* media-source-supported */ if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported_color) / sizeof(media_source_supported_color[0])), NULL, media_source_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported) / sizeof(media_source_supported[0])), NULL, media_source_supported); /* media-top-margin-supported */ if (ppm_color > 0) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_top_margin_supported) / sizeof(media_top_margin_supported[0])), media_top_margin_supported); else ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_top_margin_supported_color) / sizeof(media_top_margin_supported_color[0])), media_top_margin_supported_color); /* media-type-supported */ if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported_color) / sizeof(media_type_supported_color[0])), NULL, media_type_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported) / sizeof(media_type_supported[0])), NULL, media_type_supported); /* orientation-requested-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-default", IPP_ORIENT_PORTRAIT); /* orientation-requested-supported */ if (cupsArrayFind(docformats, (void *)"application/pdf") || cupsArrayFind(docformats, (void *)"image/jpeg")) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", (int)(sizeof(orientation_requested_supported) / sizeof(orientation_requested_supported[0])), orientation_requested_supported); else ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", IPP_ORIENT_PORTRAIT); /* output-bin-default */ if (ppm_color > 0) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-up"); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down"); /* output-bin-supported */ if (ppm_color > 0) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-up"); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down"); /* overrides-supported */ if (cupsArrayFind(docformats, (void *)"application/pdf")) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "overrides-supported", (int)(sizeof(overrides_supported) / sizeof(overrides_supported[0])), NULL, overrides_supported); /* page-ranges-supported */ ippAddBoolean(attrs, IPP_TAG_PRINTER, "page-ranges-supported", cupsArrayFind(docformats, (void *)"application/pdf") != NULL); /* pages-per-minute */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute", ppm); /* pages-per-minute-color */ if (ppm_color > 0) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute-color", ppm_color); /* print-color-mode-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, ppm_color > 0 ? "auto" : "monochrome"); /* print-color-mode-supported */ if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported_color) / sizeof(print_color_mode_supported_color[0])), NULL, print_color_mode_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported); /* print-content-optimize-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto"); /* print-content-optimize-supported */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto"); /* print-quality-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); /* print-quality-supported */ ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported); /* print-rendering-intent-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto"); /* print-rendering-intent-supported */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto"); /* printer-device-id */ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;", make, model); ptr = device_id + strlen(device_id); prefix = "CMD:"; for (format = (const char *)cupsArrayFirst(docformats); format; format = (const char *)cupsArrayNext(docformats)) { if (!strcasecmp(format, "application/pdf")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPDF", prefix); else if (!strcasecmp(format, "application/postscript")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPS", prefix); else if (!strcasecmp(format, "application/vnd.hp-PCL")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPCL", prefix); else if (!strcasecmp(format, "image/jpeg")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sJPEG", prefix); else if (!strcasecmp(format, "image/png")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPNG", prefix); else if (!strcasecmp(format, "image/pwg-raster")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPWG", prefix); else if (!strcasecmp(format, "image/urf")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sURF", prefix); else continue; ptr += strlen(ptr); prefix = ","; } if (ptr < (device_id + sizeof(device_id) - 1)) { *ptr++ = ';'; *ptr = '\0'; } ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); /* printer-input-tray */ if (ppm_color > 0) { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray_color[0], (int)strlen(printer_input_tray_color[0])); for (i = 1; i < (int)(sizeof(printer_input_tray_color) / sizeof(printer_input_tray_color[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_input_tray_color[i], (int)strlen(printer_input_tray_color[i])); } else { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray[0], (int)strlen(printer_input_tray[0])); for (i = 1; i < (int)(sizeof(printer_input_tray) / sizeof(printer_input_tray[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_input_tray[i], (int)strlen(printer_input_tray[i])); } /* printer-make-and-model */ snprintf(make_model, sizeof(make_model), "%s %s", make, model); ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-make-and-model", NULL, make_model); /* printer-resolution-default */ ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600); /* printer-resolution-supported */ ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600); /* printer-supply and printer-supply-description */ if (ppm_color > 0) { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply_color[0], (int)strlen(printer_supply_color[0])); for (i = 1; i < (int)(sizeof(printer_supply_color) / sizeof(printer_supply_color[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_supply_color[i], (int)strlen(printer_supply_color[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description_color) / sizeof(printer_supply_description_color[0])), NULL, printer_supply_description_color); } else { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply[0], (int)strlen(printer_supply[0])); for (i = 1; i < (int)(sizeof(printer_supply) / sizeof(printer_supply[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_supply[i], (int)strlen(printer_supply[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description) / sizeof(printer_supply_description[0])), NULL, printer_supply_description); } /* pwg-raster-document-xxx-supported */ if (cupsArrayFind(docformats, (void *)"image/pwg-raster")) { ippAddResolutions(attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", (int)(sizeof(pwg_raster_document_resolution_supported) / sizeof(pwg_raster_document_resolution_supported[0])), IPP_RES_PER_INCH, pwg_raster_document_resolution_supported, pwg_raster_document_resolution_supported); if (ppm_color > 0 && duplex) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "rotated"); else if (duplex) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "normal"); if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported_color) / sizeof(pwg_raster_document_type_supported_color[0])), NULL, pwg_raster_document_type_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported) / sizeof(pwg_raster_document_type_supported[0])), NULL, pwg_raster_document_type_supported); } /* sides-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided"); /* sides-supported */ if (duplex) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", (int)(sizeof(sides_supported) / sizeof(sides_supported[0])), NULL, sides_supported); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", NULL, "one-sided"); /* urf-supported */ if (cupsArrayFind(docformats, (void *)"image/urf")) { if (ppm_color > 0) { if (duplex) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color_duplex) / sizeof(urf_supported_color_duplex[0])), NULL, urf_supported_color_duplex); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color) / sizeof(urf_supported_color[0])), NULL, urf_supported_color); } else if (duplex) { ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_duplex) / sizeof(urf_supported_duplex[0])), NULL, urf_supported_duplex); } else { ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])), NULL, urf_supported); } } return (attrs); } #if !CUPS_LITE /* * 'load_ppd_attributes()' - Load IPP attributes from a PPD file. */ static ipp_t * /* O - IPP attributes or `NULL` on error */ load_ppd_attributes( const char *ppdfile, /* I - PPD filename */ cups_array_t *docformats) /* I - document-format-supported values */ { int i, j; /* Looping vars */ ipp_t *attrs; /* Attributes */ ipp_attribute_t *attr; /* Current attribute */ ipp_t *col; /* Current collection value */ ppd_file_t *ppd; /* PPD data */ ppd_attr_t *ppd_attr; /* PPD attribute */ ppd_choice_t *ppd_choice; /* PPD choice */ ppd_size_t *ppd_size; /* Default PPD size */ pwg_size_t *pwg_size, /* Current PWG size */ *default_size = NULL; /* Default PWG size */ const char *default_source = NULL, /* Default media source */ *default_type = NULL; /* Default media type */ pwg_map_t *pwg_map; /* Mapping from PWG to PPD keywords */ _ppd_cache_t *pc; /* PPD cache */ _pwg_finishings_t *finishings; /* Current finishings value */ const char *template; /* Current finishings-template value */ int num_margins; /* Number of media-xxx-margin-supported values */ int margins[10]; /* media-xxx-margin-supported values */ int xres, /* Default horizontal resolution */ yres; /* Default vertical resolution */ int num_urf; /* Number of urf-supported values */ const char *urf[10]; /* urf-supported values */ char urf_rs[32]; /* RS value */ static const int orientation_requested_supported[4] = { /* orientation-requested-supported values */ IPP_ORIENT_PORTRAIT, IPP_ORIENT_LANDSCAPE, IPP_ORIENT_REVERSE_LANDSCAPE, IPP_ORIENT_REVERSE_PORTRAIT }; static const char * const overrides_supported[] = { /* overrides-supported */ "document-numbers", "media", "media-col", "orientation-requested", "pages" }; static const char * const print_color_mode_supported[] = { /* print-color-mode-supported values */ "monochrome" }; static const char * const print_color_mode_supported_color[] = { /* print-color-mode-supported values */ "auto", "color", "monochrome" }; static const int print_quality_supported[] = { /* print-quality-supported values */ IPP_QUALITY_DRAFT, IPP_QUALITY_NORMAL, IPP_QUALITY_HIGH }; static const char * const printer_supply[] = { /* printer-supply values */ "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=75;colorantname=black;" }; static const char * const printer_supply_color[] = { /* printer-supply values */ "index=1;class=receptacleThatIsFilled;type=wasteInk;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=75;colorantname=black;", "index=3;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=50;colorantname=cyan;", "index=4;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=33;colorantname=magenta;", "index=5;class=supplyThatIsConsumed;type=ink;unit=percent;" "maxcapacity=100;level=67;colorantname=yellow;" }; static const char * const printer_supply_description[] = { /* printer-supply-description values */ "Toner Waste Tank", "Black Toner" }; static const char * const printer_supply_description_color[] = { /* printer-supply-description values */ "Ink Waste Tank", "Black Ink", "Cyan Ink", "Magenta Ink", "Yellow Ink" }; static const char * const pwg_raster_document_type_supported[] = { "black_1", "sgray_8" }; static const char * const pwg_raster_document_type_supported_color[] = { "black_1", "sgray_8", "srgb_8", "srgb_16" }; static const char * const sides_supported[] = { /* sides-supported values */ "one-sided", "two-sided-long-edge", "two-sided-short-edge" }; /* * Open the PPD file... */ if ((ppd = ppdOpenFile(ppdfile)) == NULL) { ppd_status_t status; /* Load error */ status = ppdLastError(&i); _cupsLangPrintf(stderr, _("ippeveprinter: Unable to open \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), i); return (NULL); } ppdMarkDefaults(ppd); pc = _ppdCacheCreateWithPPD(ppd); if ((ppd_size = ppdPageSize(ppd, NULL)) != NULL) { /* * Look up default size... */ for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) { if (!strcmp(pwg_size->map.ppd, ppd_size->name)) { default_size = pwg_size; break; } } } if (!default_size) { /* * Default to A4 or Letter... */ for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) { if (!strcmp(pwg_size->map.ppd, "Letter") || !strcmp(pwg_size->map.ppd, "A4")) { default_size = pwg_size; break; } } if (!default_size) default_size = pc->sizes; /* Last resort: first size */ } if ((ppd_choice = ppdFindMarkedChoice(ppd, "InputSlot")) != NULL) default_source = _ppdCacheGetSource(pc, ppd_choice->choice); if ((ppd_choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) default_source = _ppdCacheGetType(pc, ppd_choice->choice); if ((ppd_attr = ppdFindAttr(ppd, "DefaultResolution", NULL)) != NULL) { /* * Use the PPD-defined default resolution... */ if ((i = sscanf(ppd_attr->value, "%dx%d", &xres, &yres)) == 1) yres = xres; else if (i < 0) xres = yres = 300; } else { /* * Use default of 300dpi... */ xres = yres = 300; } snprintf(urf_rs, sizeof(urf_rs), "RS%d", yres < xres ? yres : xres); num_urf = 0; urf[num_urf ++] = "V1.4"; urf[num_urf ++] = "CP1"; urf[num_urf ++] = urf_rs; urf[num_urf ++] = "W8"; if (pc->sides_2sided_long) urf[num_urf ++] = "DM1"; if (ppd->color_device) urf[num_urf ++] = "SRGB24"; /* * PostScript printers accept PDF via one of the CUPS PDF to PostScript * filters, along with PostScript (of course) and JPEG... */ cupsArrayAdd(docformats, "application/pdf"); cupsArrayAdd(docformats, "application/postscript"); cupsArrayAdd(docformats, "image/jpeg"); /* * Create the attributes... */ attrs = ippNew(); /* color-supported */ ippAddBoolean(attrs, IPP_TAG_PRINTER, "color-supported", (char)ppd->color_device); /* copies-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1); /* copies-supported */ ippAddRange(attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999); /* document-password-supported */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 127); /* finishing-template-supported */ attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template-supported", cupsArrayCount(pc->templates) + 1, NULL, NULL); ippSetString(attrs, &attr, 0, "none"); for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) ippSetString(attrs, &attr, i, template); /* finishings-col-database */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "finishings-col-database", cupsArrayCount(pc->templates) + 1, NULL); col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); ippSetCollection(attrs, &attr, 0, col); ippDelete(col); for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) { col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, template); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* finishings-col-default */ col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col); ippDelete(col); /* finishings-col-ready */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "finishings-col-ready", cupsArrayCount(pc->templates) + 1, NULL); col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); ippSetCollection(attrs, &attr, 0, col); ippDelete(col); for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) { col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, template); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* finishings-col-supported */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishings-col-supported", NULL, "finishing-template"); /* finishings-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); /* finishings-ready */ attr = ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", cupsArrayCount(pc->finishings) + 1, NULL); ippSetInteger(attrs, &attr, 0, IPP_FINISHINGS_NONE); for (i = 1, finishings = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); finishings; i ++, finishings = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) ippSetInteger(attrs, &attr, i, (int)finishings->value); /* finishings-supported */ attr = ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", cupsArrayCount(pc->finishings) + 1, NULL); ippSetInteger(attrs, &attr, 0, IPP_FINISHINGS_NONE); for (i = 1, finishings = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); finishings; i ++, finishings = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) ippSetInteger(attrs, &attr, i, (int)finishings->value); /* media-bottom-margin-supported */ for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) { for (j = 0; j < num_margins; j ++) { if (margins[j] == pwg_size->bottom) break; } if (j >= num_margins) margins[num_margins ++] = pwg_size->bottom; } for (i = 0; i < (num_margins - 1); i ++) { for (j = i + 1; j < num_margins; j ++) { if (margins[i] > margins[j]) { int mtemp = margins[i]; margins[i] = margins[j]; margins[j] = mtemp; } } } ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", num_margins, margins); /* media-col-database */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-database", pc->num_sizes, NULL); for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) { col = create_media_col(pwg_size->map.pwg, NULL, NULL, pwg_size->width, pwg_size->length, pwg_size->bottom, pwg_size->left, pwg_size->right, pwg_size->top); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* media-col-default */ col = create_media_col(default_size->map.pwg, default_source, default_type, default_size->width, default_size->length, default_size->bottom, default_size->left, default_size->right, default_size->top); ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-default", col); ippDelete(col); /* media-col-ready */ col = create_media_col(default_size->map.pwg, default_source, default_type, default_size->width, default_size->length, default_size->bottom, default_size->left, default_size->right, default_size->top); ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-ready", col); ippDelete(col); /* media-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-default", NULL, default_size->map.pwg); /* media-left-margin-supported */ for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) { for (j = 0; j < num_margins; j ++) { if (margins[j] == pwg_size->left) break; } if (j >= num_margins) margins[num_margins ++] = pwg_size->left; } for (i = 0; i < (num_margins - 1); i ++) { for (j = i + 1; j < num_margins; j ++) { if (margins[i] > margins[j]) { int mtemp = margins[i]; margins[i] = margins[j]; margins[j] = mtemp; } } } ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", num_margins, margins); /* media-ready */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", NULL, default_size->map.pwg); /* media-right-margin-supported */ for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) { for (j = 0; j < num_margins; j ++) { if (margins[j] == pwg_size->right) break; } if (j >= num_margins) margins[num_margins ++] = pwg_size->right; } for (i = 0; i < (num_margins - 1); i ++) { for (j = i + 1; j < num_margins; j ++) { if (margins[i] > margins[j]) { int mtemp = margins[i]; margins[i] = margins[j]; margins[j] = mtemp; } } } ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", num_margins, margins); /* media-supported */ attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-supported", pc->num_sizes, NULL, NULL); for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) ippSetString(attrs, &attr, i, pwg_size->map.pwg); /* media-size-supported */ attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-size-supported", pc->num_sizes, NULL); for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) { col = create_media_size(pwg_size->width, pwg_size->length); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } /* media-source-supported */ if (pc->num_sources > 0) { attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source-supported", pc->num_sources, NULL, NULL); for (i = 0, pwg_map = pc->sources; i < pc->num_sources; i ++, pwg_map ++) ippSetString(attrs, &attr, i, pwg_map->pwg); } else { ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", NULL, "auto"); } /* media-top-margin-supported */ for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) { for (j = 0; j < num_margins; j ++) { if (margins[j] == pwg_size->top) break; } if (j >= num_margins) margins[num_margins ++] = pwg_size->top; } for (i = 0; i < (num_margins - 1); i ++) { for (j = i + 1; j < num_margins; j ++) { if (margins[i] > margins[j]) { int mtemp = margins[i]; margins[i] = margins[j]; margins[j] = mtemp; } } } ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", num_margins, margins); /* media-type-supported */ if (pc->num_types > 0) { attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type-supported", pc->num_types, NULL, NULL); for (i = 0, pwg_map = pc->types; i < pc->num_types; i ++, pwg_map ++) ippSetString(attrs, &attr, i, pwg_map->pwg); } else { ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", NULL, "auto"); } /* orientation-requested-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-default", IPP_ORIENT_PORTRAIT); /* orientation-requested-supported */ ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", (int)(sizeof(orientation_requested_supported) / sizeof(orientation_requested_supported[0])), orientation_requested_supported); /* output-bin-default */ if (pc->num_bins > 0) ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "output-bin-default", NULL, pc->bins->pwg); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down"); /* output-bin-supported */ if (pc->num_bins > 0) { attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "output-bin-supported", pc->num_bins, NULL, NULL); for (i = 0, pwg_map = pc->bins; i < pc->num_bins; i ++, pwg_map ++) ippSetString(attrs, &attr, i, pwg_map->pwg); } else { ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down"); } /* overrides-supported */ ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "overrides-supported", (int)(sizeof(overrides_supported) / sizeof(overrides_supported[0])), NULL, overrides_supported); /* page-ranges-supported */ ippAddBoolean(attrs, IPP_TAG_PRINTER, "page-ranges-supported", 1); /* pages-per-minute */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute", ppd->throughput); /* pages-per-minute-color */ if (ppd->color_device) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute-color", ppd->throughput); /* print-color-mode-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, ppd->color_device ? "auto" : "monochrome"); /* print-color-mode-supported */ if (ppd->color_device) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported_color) / sizeof(print_color_mode_supported_color[0])), NULL, print_color_mode_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported); /* print-content-optimize-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto"); /* print-content-optimize-supported */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto"); /* print-quality-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); /* print-quality-supported */ ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported); /* print-rendering-intent-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto"); /* print-rendering-intent-supported */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto"); /* printer-device-id */ if ((ppd_attr = ppdFindAttr(ppd, "1284DeviceId", NULL)) != NULL) { /* * Use the device ID string from the PPD... */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, ppd_attr->value); } else { /* * Synthesize a device ID string... */ char device_id[1024]; /* Device ID string */ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;CMD:PS;", ppd->manufacturer, ppd->modelname); ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); } /* printer-input-tray */ if (pc->num_sources > 0) { for (i = 0, attr = NULL; i < pc->num_sources; i ++) { char input_tray[1024]; /* printer-input-tray value */ if (!strcmp(pc->sources[i].pwg, "manual") || strstr(pc->sources[i].pwg, "-man") != NULL) snprintf(input_tray, sizeof(input_tray), "type=sheetFeedManual;mediafeed=0;mediaxfeed=0;maxcapacity=1;level=-2;status=0;name=%s", pc->sources[i].pwg); else snprintf(input_tray, sizeof(input_tray), "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=125;status=0;name=%s", pc->sources[i].pwg); if (attr) ippSetOctetString(attrs, &attr, i, input_tray, (int)strlen(input_tray)); else attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", input_tray, (int)strlen(input_tray)); } } else { static const char *printer_input_tray = "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto"; ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray, (int)strlen(printer_input_tray)); } /* printer-make-and-model */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-make-and-model", NULL, ppd->nickname); /* printer-resolution-default */ ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, xres, yres); /* printer-resolution-supported */ ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, xres, yres); /* printer-supply and printer-supply-description */ if (ppd->color_device) { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply_color[0], (int)strlen(printer_supply_color[0])); for (i = 1; i < (int)(sizeof(printer_supply_color) / sizeof(printer_supply_color[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_supply_color[i], (int)strlen(printer_supply_color[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description_color) / sizeof(printer_supply_description_color[0])), NULL, printer_supply_description_color); } else { attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply[0], (int)strlen(printer_supply[0])); for (i = 1; i < (int)(sizeof(printer_supply) / sizeof(printer_supply[0])); i ++) ippSetOctetString(attrs, &attr, i, printer_supply[i], (int)strlen(printer_supply[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description) / sizeof(printer_supply_description[0])), NULL, printer_supply_description); } /* pwg-raster-document-xxx-supported */ if (cupsArrayFind(docformats, (void *)"image/pwg-raster")) { ippAddResolution(attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", IPP_RES_PER_INCH, xres, yres); if (pc->sides_2sided_long) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "normal"); if (ppd->color_device) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported_color) / sizeof(pwg_raster_document_type_supported_color[0])), NULL, pwg_raster_document_type_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported) / sizeof(pwg_raster_document_type_supported[0])), NULL, pwg_raster_document_type_supported); } /* sides-default */ ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided"); /* sides-supported */ if (pc->sides_2sided_long) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", (int)(sizeof(sides_supported) / sizeof(sides_supported[0])), NULL, sides_supported); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", NULL, "one-sided"); /* urf-supported */ if (cupsArrayFind(docformats, (void *)"image/urf")) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", num_urf, NULL, urf); /* * Free the PPD file and return the attributes... */ _ppdCacheDestroy(pc); ppdClose(ppd); return (attrs); } #endif /* !CUPS_LITE */ #if HAVE_LIBPAM /* * 'pam_func()' - PAM conversation function. */ static int /* O - Success or failure */ pam_func( int num_msg, /* I - Number of messages */ const struct pam_message **msg, /* I - Messages */ struct pam_response **resp, /* O - Responses */ void *appdata_ptr) /* I - Pointer to connection */ { int i; /* Looping var */ struct pam_response *replies; /* Replies */ ippeve_authdata_t *data; /* Pointer to auth data */ /* * Allocate memory for the responses... */ if ((replies = malloc(sizeof(struct pam_response) * (size_t)num_msg)) == NULL) return (PAM_CONV_ERR); /* * Answer all of the messages... */ data = (ippeve_authdata_t *)appdata_ptr; for (i = 0; i < num_msg; i ++) { switch (msg[i]->msg_style) { case PAM_PROMPT_ECHO_ON: replies[i].resp_retcode = PAM_SUCCESS; replies[i].resp = strdup(data->username); break; case PAM_PROMPT_ECHO_OFF: replies[i].resp_retcode = PAM_SUCCESS; replies[i].resp = strdup(data->password); break; case PAM_TEXT_INFO: replies[i].resp_retcode = PAM_SUCCESS; replies[i].resp = NULL; break; case PAM_ERROR_MSG: replies[i].resp_retcode = PAM_SUCCESS; replies[i].resp = NULL; break; default: free(replies); return (PAM_CONV_ERR); } } /* * Return the responses back to PAM... */ *resp = replies; return (PAM_SUCCESS); } #endif /* HAVE_LIBPAM */ /* * 'parse_options()' - Parse URL options into CUPS options. * * The client->options string is destroyed by this function. */ static int /* O - Number of options */ parse_options(ippeve_client_t *client, /* I - Client */ cups_option_t **options)/* O - Options */ { char *name, /* Name */ *value, /* Value */ *next; /* Next name=value pair */ int num_options = 0; /* Number of options */ *options = NULL; for (name = client->options; name && *name; name = next) { if ((value = strchr(name, '=')) == NULL) break; *value++ = '\0'; if ((next = strchr(value, '&')) != NULL) *next++ = '\0'; num_options = cupsAddOption(name, value, num_options, options); } return (num_options); } /* * 'process_attr_message()' - Process an ATTR: message from a command. */ static void process_attr_message( ippeve_job_t *job, /* I - Job */ char *message) /* I - Message */ { int i, /* Looping var */ num_options = 0; /* Number of name=value pairs */ cups_option_t *options = NULL, /* name=value pairs from message */ *option; /* Current option */ ipp_attribute_t *attr; /* Current attribute */ /* * Grab attributes from the message line... */ num_options = cupsParseOptions(message + 5, num_options, &options); /* * Loop through the options and record them in the printer or job objects... */ for (i = num_options, option = options; i > 0; i --, option ++) { if (!strcmp(option->name, "job-impressions")) { /* * Update job-impressions attribute... */ job->impressions = atoi(option->value); } else if (!strcmp(option->name, "job-impressions-completed")) { /* * Update job-impressions-completed attribute... */ job->impcompleted = atoi(option->value); } else if (!strncmp(option->name, "marker-", 7) || !strcmp(option->name, "printer-alert") || !strcmp(option->name, "printer-alert-description") || !strcmp(option->name, "printer-supply") || !strcmp(option->name, "printer-supply-description")) { /* * Update Printer Status attribute... */ _cupsRWLockWrite(&job->printer->rwlock); if ((attr = ippFindAttribute(job->printer->attrs, option->name, IPP_TAG_ZERO)) != NULL) ippDeleteAttribute(job->printer->attrs, attr); cupsEncodeOption(job->printer->attrs, IPP_TAG_PRINTER, option->name, option->value); _cupsRWUnlock(&job->printer->rwlock); } else { /* * Something else that isn't currently supported... */ fprintf(stderr, "[Job %d] Ignoring update of attribute \"%s\" with value \"%s\".\n", job->id, option->name, option->value); } } cupsFreeOptions(num_options, options); } /* * 'process_client()' - Process client requests on a thread. */ static void * /* O - Exit status */ process_client(ippeve_client_t *client) /* I - Client */ { /* * Loop until we are out of requests or timeout (30 seconds)... */ #ifdef HAVE_SSL int first_time = 1; /* First time request? */ #endif /* HAVE_SSL */ while (httpWait(client->http, 30000)) { #ifdef HAVE_SSL if (first_time) { /* * See if we need to negotiate a TLS connection... */ char buf[1]; /* First byte from client */ if (recv(httpGetFd(client->http), buf, 1, MSG_PEEK) == 1 && (!buf[0] || !strchr("DGHOPT", buf[0]))) { fprintf(stderr, "%s Starting HTTPS session.\n", client->hostname); if (httpEncryption(client->http, HTTP_ENCRYPTION_ALWAYS)) { fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString()); break; } fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); } first_time = 0; } #endif /* HAVE_SSL */ if (!process_http(client)) break; } /* * Close the conection to the client and return... */ delete_client(client); return (NULL); } /* * 'process_http()' - Process a HTTP request. */ int /* O - 1 on success, 0 on failure */ process_http(ippeve_client_t *client) /* I - Client connection */ { char uri[1024]; /* URI */ http_state_t http_state; /* HTTP state */ http_status_t http_status; /* HTTP status */ ipp_state_t ipp_state; /* State of IPP transfer */ char scheme[32], /* Method/scheme */ userpass[128], /* Username:password */ hostname[HTTP_MAX_HOST]; /* Hostname */ int port; /* Port number */ static const char * const http_states[] = { /* Strings for logging HTTP method */ "WAITING", "OPTIONS", "GET", "GET_SEND", "HEAD", "POST", "POST_RECV", "POST_SEND", "PUT", "PUT_RECV", "DELETE", "TRACE", "CONNECT", "STATUS", "UNKNOWN_METHOD", "UNKNOWN_VERSION" }; /* * Clear state variables... */ client->username[0] = '\0'; ippDelete(client->request); ippDelete(client->response); client->request = NULL; client->response = NULL; client->operation = HTTP_STATE_WAITING; /* * Read a request from the connection... */ while ((http_state = httpReadRequest(client->http, uri, sizeof(uri))) == HTTP_STATE_WAITING) usleep(1); /* * Parse the request line... */ if (http_state == HTTP_STATE_ERROR) { if (httpError(client->http) == EPIPE) fprintf(stderr, "%s Client closed connection.\n", client->hostname); else fprintf(stderr, "%s Bad request line (%s).\n", client->hostname, strerror(httpError(client->http))); return (0); } else if (http_state == HTTP_STATE_UNKNOWN_METHOD) { fprintf(stderr, "%s Bad/unknown operation.\n", client->hostname); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } else if (http_state == HTTP_STATE_UNKNOWN_VERSION) { fprintf(stderr, "%s Bad HTTP version.\n", client->hostname); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } fprintf(stderr, "%s %s %s\n", client->hostname, http_states[http_state], uri); /* * Separate the URI into its components... */ if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK && (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*"))) { fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } if ((client->options = strchr(client->uri, '?')) != NULL) *(client->options)++ = '\0'; /* * Process the request... */ client->start = time(NULL); client->operation = httpGetState(client->http); /* * Parse incoming parameters until the status changes... */ while ((http_status = httpUpdate(client->http)) == HTTP_STATUS_CONTINUE); if (http_status != HTTP_STATUS_OK) { respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] && httpGetVersion(client->http) >= HTTP_VERSION_1_1) { /* * HTTP/1.1 and higher require the "Host:" field... */ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } /* * Handle HTTP Upgrade... */ if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION), "Upgrade")) { #ifdef HAVE_SSL if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http)) { if (!respond_http(client, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, NULL, 0)) return (0); fprintf(stderr, "%s Upgrading to encrypted connection.\n", client->hostname); if (httpEncryption(client->http, HTTP_ENCRYPTION_REQUIRED)) { fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString()); return (0); } fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); } else #endif /* HAVE_SSL */ if (!respond_http(client, HTTP_STATUS_NOT_IMPLEMENTED, NULL, NULL, 0)) return (0); } /* * Handle new transfers... */ switch (client->operation) { case HTTP_STATE_OPTIONS : /* * Do OPTIONS command... */ return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0)); case HTTP_STATE_HEAD : if (!strcmp(client->uri, "/icon.png")) return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0)); else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies")) return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)); else return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); case HTTP_STATE_GET : if (!strcmp(client->uri, "/icon.png")) { /* * Send PNG icon file. */ if (client->printer->icon) { int fd; /* Icon file */ struct stat fileinfo; /* Icon file information */ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon); if (!stat(client->printer->icon, &fileinfo) && (fd = open(client->printer->icon, O_RDONLY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { close(fd); return (0); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) httpWrite2(client->http, buffer, (size_t)bytes); httpFlushWrite(client->http); close(fd); } else return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); } else { fputs("Icon file is internal printer.png.\n", stderr); if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_png))) return (0); httpWrite2(client->http, (const char *)printer_png, sizeof(printer_png)); httpFlushWrite(client->http); } } else { /* * Authenticate if needed... */ if ((http_status = authenticate_request(client)) != HTTP_STATUS_CONTINUE) { return (respond_http(client, http_status, NULL, NULL, 0)); } if (!strcmp(client->uri, "/")) { /* * Show web status page... */ return (show_status(client)); } else if (!strcmp(client->uri, "/media")) { /* * Show web media page... */ return (show_media(client)); } else if (!strcmp(client->uri, "/supplies")) { /* * Show web supplies page... */ return (show_supplies(client)); } else return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); } break; case HTTP_STATE_POST : if (strcmp(httpGetField(client->http, HTTP_FIELD_CONTENT_TYPE), "application/ipp")) { /* * Not an IPP request... */ return (respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0)); } /* * Read the IPP request... */ client->request = ippNew(); while ((ipp_state = ippRead(client->http, client->request)) != IPP_STATE_DATA) { if (ipp_state == IPP_STATE_ERROR) { fprintf(stderr, "%s IPP read error (%s).\n", client->hostname, cupsLastErrorString()); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } } /* * Now that we have the IPP request, process the request... */ return (process_ipp(client)); default : break; /* Anti-compiler-warning-code */ } return (1); } /* * 'process_ipp()' - Process an IPP request. */ static int /* O - 1 on success, 0 on error */ process_ipp(ippeve_client_t *client) /* I - Client */ { ipp_tag_t group; /* Current group tag */ ipp_attribute_t *attr; /* Current attribute */ ipp_attribute_t *charset; /* Character set attribute */ ipp_attribute_t *language; /* Language attribute */ ipp_attribute_t *uri; /* Printer URI attribute */ int major, minor; /* Version number */ const char *name; /* Name of attribute */ http_status_t status; /* Authentication status */ debug_attributes("Request", client->request, 1); /* * First build an empty response message for this request... */ client->operation_id = ippGetOperation(client->request); client->response = ippNewResponse(client->request); /* * Then validate the request header and required attributes... */ major = ippGetVersion(client->request, &minor); if (major < 1 || major > 2) { /* * Return an error, since we only support IPP 1.x and 2.x. */ respond_ipp(client, IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, "Bad request version number %d.%d.", major, minor); } else if ((major * 10 + minor) > MaxVersion) { if (httpGetState(client->http) != HTTP_STATE_POST_SEND) httpFlush(client->http); /* Flush trailing (junk) data */ respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } else if (ippGetRequestId(client->request) <= 0) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad request-id %d.", ippGetRequestId(client->request)); } else if (!ippFirstAttribute(client->request)) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No attributes in request."); } else { /* * Make sure that the attributes are provided in the correct order and * don't repeat groups... */ for (attr = ippFirstAttribute(client->request), group = ippGetGroupTag(attr); attr; attr = ippNextAttribute(client->request)) { if (ippGetGroupTag(attr) < group && ippGetGroupTag(attr) != IPP_TAG_ZERO) { /* * Out of order; return an error... */ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Attribute groups are out of order (%x < %x).", ippGetGroupTag(attr), group); break; } else group = ippGetGroupTag(attr); } if (!attr) { /* * Then make sure that the first three attributes are: * * attributes-charset * attributes-natural-language * printer-uri/job-uri */ attr = ippFirstAttribute(client->request); name = ippGetName(attr); if (attr && name && !strcmp(name, "attributes-charset") && ippGetValueTag(attr) == IPP_TAG_CHARSET) charset = attr; else charset = NULL; attr = ippNextAttribute(client->request); name = ippGetName(attr); if (attr && name && !strcmp(name, "attributes-natural-language") && ippGetValueTag(attr) == IPP_TAG_LANGUAGE) language = attr; else language = NULL; if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) uri = attr; else if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) uri = attr; else uri = NULL; if (charset && strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") && strcasecmp(ippGetString(charset, 0, NULL), "utf-8")) { /* * Bad character set... */ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unsupported character set \"%s\".", ippGetString(charset, 0, NULL)); } else if (!charset || !language || !uri) { /* * Return an error, since attributes-charset, * attributes-natural-language, and printer-uri/job-uri are required * for all operations. */ respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required attributes."); } else { char scheme[32], /* URI scheme */ userpass[32], /* Username/password in URI */ host[256], /* Host name in URI */ resource[256]; /* Resource path in URI */ int port; /* Port number in URI */ name = ippGetName(uri); if (httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL), scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Bad %s value '%s'.", name, ippGetString(uri, 0, NULL)); else if ((!strcmp(name, "job-uri") && strncmp(resource, "/ipp/print/", 11)) || (!strcmp(name, "printer-uri") && strcmp(resource, "/ipp/print"))) respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.", name, ippGetString(uri, 0, NULL)); else if (client->operation_id != IPP_OP_GET_PRINTER_ATTRIBUTES && (status = authenticate_request(client)) != HTTP_STATUS_CONTINUE) { httpFlush(client->http); return (respond_http(client, status, NULL, NULL, 0)); } else { /* * Handle HTTP Expect... */ if (httpGetExpect(client->http)) { if (httpGetExpect(client->http) == HTTP_STATUS_CONTINUE) { /* * Send 100-continue header... */ if (!respond_http(client, HTTP_STATUS_CONTINUE, NULL, NULL, 0)) return (0); } else { /* * Send 417-expectation-failed header... */ if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0)) return (0); httpFlush(client->http); return (1); } } /* * Try processing the operation... */ switch (client->operation_id) { case IPP_OP_PRINT_JOB : ipp_print_job(client); break; case IPP_OP_PRINT_URI : ipp_print_uri(client); break; case IPP_OP_VALIDATE_JOB : ipp_validate_job(client); break; case IPP_OP_CREATE_JOB : ipp_create_job(client); break; case IPP_OP_SEND_DOCUMENT : ipp_send_document(client); break; case IPP_OP_SEND_URI : ipp_send_uri(client); break; case IPP_OP_CANCEL_JOB : ipp_cancel_job(client); break; case IPP_OP_GET_JOB_ATTRIBUTES : ipp_get_job_attributes(client); break; case IPP_OP_GET_JOBS : ipp_get_jobs(client); break; case IPP_OP_GET_PRINTER_ATTRIBUTES : ipp_get_printer_attributes(client); break; case IPP_OP_CLOSE_JOB : ipp_close_job(client); break; case IPP_OP_IDENTIFY_PRINTER : ipp_identify_printer(client); break; default : respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, "Operation not supported."); break; } } } } } /* * Send the HTTP header and return... */ if (httpGetState(client->http) != HTTP_STATE_POST_SEND) httpFlush(client->http); /* Flush trailing (junk) data */ return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp", ippLength(client->response))); } /* * 'process_job()' - Process a print job. */ static void * /* O - Thread exit status */ process_job(ippeve_job_t *job) /* I - Job */ { job->state = IPP_JSTATE_PROCESSING; job->printer->state = IPP_PSTATE_PROCESSING; job->processing = time(NULL); while (job->printer->state_reasons & IPPEVE_PREASON_MEDIA_EMPTY) { job->printer->state_reasons |= IPPEVE_PREASON_MEDIA_NEEDED; sleep(1); } job->printer->state_reasons &= (ippeve_preason_t)~IPPEVE_PREASON_MEDIA_NEEDED; if (job->printer->command) { /* * Execute a command with the job spool file and wait for it to complete... */ int pid, /* Process ID */ status; /* Exit status */ struct timeval start, /* Start time */ end; /* End time */ char *myargv[3], /* Command-line arguments */ *myenvp[400]; /* Environment variables */ int myenvc; /* Number of environment variables */ ipp_attribute_t *attr; /* Job attribute */ char val[1280], /* IPP_NAME=value */ *valptr; /* Pointer into string */ #ifndef _WIN32 int mystdout = -1; /* File for stdout */ int mypipe[2]; /* Pipe for stderr */ char line[2048], /* Line from stderr */ *ptr, /* Pointer into line */ *endptr; /* End of line */ ssize_t bytes; /* Bytes read */ #endif /* !_WIN32 */ fprintf(stderr, "[Job %d] Running command \"%s %s\".\n", job->id, job->printer->command, job->filename); gettimeofday(&start, NULL); /* * Setup the command-line arguments... */ myargv[0] = job->printer->command; myargv[1] = job->filename; myargv[2] = NULL; /* * Copy the current environment, then add environment variables for every * Job attribute and Printer -default attributes... */ for (myenvc = 0; environ[myenvc] && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); myenvc ++) myenvp[myenvc] = strdup(environ[myenvc]); if (myenvc > (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 32)) { fprintf(stderr, "[Job %d] Too many environment variables to process job.\n", job->id); job->state = IPP_JSTATE_ABORTED; goto error; } snprintf(val, sizeof(val), "CONTENT_TYPE=%s", job->format); myenvp[myenvc ++] = strdup(val); if (job->printer->device_uri) { snprintf(val, sizeof(val), "DEVICE_URI=%s", job->printer->device_uri); myenvp[myenvc ++] = strdup(val); } if (job->printer->output_format) { snprintf(val, sizeof(val), "OUTPUT_TYPE=%s", job->printer->output_format); myenvp[myenvc ++] = strdup(val); } #if !CUPS_LITE if (job->printer->ppdfile) { snprintf(val, sizeof(val), "PPD=%s", job->printer->ppdfile); myenvp[myenvc++] = strdup(val); } #endif /* !CUPS_LITE */ for (attr = ippFirstAttribute(job->printer->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->printer->attrs)) { /* * Convert "attribute-name-default" to "IPP_ATTRIBUTE_NAME_DEFAULT=" and * "pwg-xxx" to "IPP_PWG_XXX", then add the value(s) from the attribute. */ const char *name = ippGetName(attr), /* Attribute name */ *suffix = strstr(name, "-default"); /* Suffix on attribute name */ if (strncmp(name, "pwg-", 4) && (!suffix || suffix[8])) continue; valptr = val; *valptr++ = 'I'; *valptr++ = 'P'; *valptr++ = 'P'; *valptr++ = '_'; while (*name && valptr < (val + sizeof(val) - 2)) { if (*name == '-') *valptr++ = '_'; else *valptr++ = (char)toupper(*name & 255); name ++; } *valptr++ = '='; ippAttributeString(attr, valptr, sizeof(val) - (size_t)(valptr - val)); myenvp[myenvc++] = strdup(val); } for (attr = ippFirstAttribute(job->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->attrs)) { /* * Convert "attribute-name" to "IPP_ATTRIBUTE_NAME=" and then add the * value(s) from the attribute. */ const char *name = ippGetName(attr); /* Attribute name */ if (!name) continue; valptr = val; *valptr++ = 'I'; *valptr++ = 'P'; *valptr++ = 'P'; *valptr++ = '_'; while (*name && valptr < (val + sizeof(val) - 2)) { if (*name == '-') *valptr++ = '_'; else *valptr++ = (char)toupper(*name & 255); name ++; } *valptr++ = '='; ippAttributeString(attr, valptr, sizeof(val) - (size_t)(valptr - val)); myenvp[myenvc++] = strdup(val); } if (attr) { fprintf(stderr, "[Job %d] Too many environment variables to process job.\n", job->id); job->state = IPP_JSTATE_ABORTED; goto error; } myenvp[myenvc] = NULL; /* * Now run the program... */ #ifdef _WIN32 status = _spawnvpe(_P_WAIT, job->printer->command, myargv, myenvp); #else if (job->printer->device_uri) { char scheme[32], /* URI scheme */ userpass[256], /* username:password (unused) */ host[256], /* Hostname or IP address */ resource[256]; /* Resource path */ int port; /* Port number */ if (httpSeparateURI(HTTP_URI_CODING_ALL, job->printer->device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { fprintf(stderr, "[Job %d] Bad device URI \"%s\".\n", job->id, job->printer->device_uri); } else if (!strcmp(scheme, "file")) { struct stat fileinfo; /* See if this is a file or directory... */ if (stat(resource, &fileinfo)) { if (errno == ENOENT) { if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC, 0666)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to create \"%s\": %s\n", job->id, resource, strerror(errno)); } else fprintf(stderr, "[Job %d] Unable to access \"%s\": %s\n", job->id, resource, strerror(errno)); } else if (S_ISDIR(fileinfo.st_mode)) { if ((mystdout = create_job_file(job, line, sizeof(line), resource, "prn")) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, line); else fprintf(stderr, "[Job %d] Unable to create \"%s\": %s\n", job->id, line, strerror(errno)); } else if (!S_ISREG(fileinfo.st_mode)) { if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC, 0666)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to create \"%s\": %s\n", job->id, resource, strerror(errno)); } else if ((mystdout = open(resource, O_WRONLY)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to open \"%s\": %s\n", job->id, resource, strerror(errno)); } else if (!strcmp(scheme, "socket")) { http_addrlist_t *addrlist; /* List of addresses */ char service[32]; /* Service number */ snprintf(service, sizeof(service), "%d", port); if ((addrlist = httpAddrGetList(host, AF_UNSPEC, service)) == NULL) fprintf(stderr, "[Job %d] Unable to find \"%s\": %s\n", job->id, host, cupsLastErrorString()); else if (!httpAddrConnect2(addrlist, &mystdout, 30000, &(job->cancel))) fprintf(stderr, "[Job %d] Unable to connect to \"%s\": %s\n", job->id, host, cupsLastErrorString()); httpAddrFreeList(addrlist); } else { fprintf(stderr, "[Job %d] Unsupported device URI scheme \"%s\".\n", job->id, scheme); } } else if ((mystdout = create_job_file(job, line, sizeof(line), job->printer->directory, "prn")) >= 0) { fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, line); } if (mystdout < 0) mystdout = open("/dev/null", O_WRONLY); if (pipe(mypipe)) { fprintf(stderr, "[Job %d] Unable to create pipe for stderr: %s\n", job->id, strerror(errno)); mypipe[0] = mypipe[1] = -1; } if ((pid = fork()) == 0) { /* * Child comes here... */ close(1); dup2(mystdout, 1); close(mystdout); close(2); dup2(mypipe[1], 2); close(mypipe[0]); close(mypipe[1]); execve(job->printer->command, myargv, myenvp); exit(errno); } else if (pid < 0) { /* * Unable to fork process... */ fprintf(stderr, "[Job %d] Unable to start job processing command: %s\n", job->id, strerror(errno)); status = -1; close(mystdout); close(mypipe[0]); close(mypipe[1]); /* * Free memory used for environment... */ while (myenvc > 0) free(myenvp[-- myenvc]); } else { /* * Free memory used for environment... */ while (myenvc > 0) free(myenvp[-- myenvc]); /* * Close the output file in the parent process... */ close(mystdout); /* * If the pipe exists, read from it until EOF... */ if (mypipe[0] >= 0) { close(mypipe[1]); endptr = line; while ((bytes = read(mypipe[0], endptr, sizeof(line) - (size_t)(endptr - line) - 1)) > 0) { endptr += bytes; *endptr = '\0'; while ((ptr = strchr(line, '\n')) != NULL) { int level = 3; /* Message log level */ *ptr++ = '\0'; if (!strncmp(line, "ATTR:", 5)) { /* * Process job/printer attribute updates. */ process_attr_message(job, line); } else if (!strncmp(line, "DEBUG:", 6)) { /* * Debug message... */ level = 2; } else if (!strncmp(line, "ERROR:", 6)) { /* * Error message... */ level = 0; job->message = strdup(line + 6); job->msglevel = 0; } else if (!strncmp(line, "INFO:", 5)) { /* * Informational/progress message... */ level = 1; if (job->msglevel) { job->message = strdup(line + 5); job->msglevel = 1; } } else if (!strncmp(line, "STATE:", 6)) { /* * Process printer-state-reasons keywords. */ process_state_message(job, line); } if (Verbosity >= level) fprintf(stderr, "[Job %d] Command - %s\n", job->id, line); bytes = ptr - line; if (ptr < endptr) memmove(line, ptr, (size_t)(endptr - ptr)); endptr -= bytes; *endptr = '\0'; } } close(mypipe[0]); } /* * Wait for child to complete... */ # ifdef HAVE_WAITPID while (waitpid(pid, &status, 0) < 0); # else while (wait(&status) < 0); # endif /* HAVE_WAITPID */ } #endif /* _WIN32 */ if (status) { #ifndef _WIN32 if (WIFEXITED(status)) #endif /* !_WIN32 */ fprintf(stderr, "[Job %d] Command \"%s\" exited with status %d.\n", job->id, job->printer->command, WEXITSTATUS(status)); #ifndef _WIN32 else fprintf(stderr, "[Job %d] Command \"%s\" terminated with signal %d.\n", job->id, job->printer->command, WTERMSIG(status)); #endif /* !_WIN32 */ job->state = IPP_JSTATE_ABORTED; } else if (status < 0) job->state = IPP_JSTATE_ABORTED; else fprintf(stderr, "[Job %d] Command \"%s\" completed successfully.\n", job->id, job->printer->command); /* * Report the total processing time... */ gettimeofday(&end, NULL); fprintf(stderr, "[Job %d] Processing time was %.3f seconds.\n", job->id, end.tv_sec - start.tv_sec + 0.000001 * (end.tv_usec - start.tv_usec)); } else { /* * Sleep for a random amount of time to simulate job processing. */ sleep((unsigned)(5 + (CUPS_RAND() % 11))); } if (job->cancel) job->state = IPP_JSTATE_CANCELED; else if (job->state == IPP_JSTATE_PROCESSING) job->state = IPP_JSTATE_COMPLETED; error: job->completed = time(NULL); job->printer->state = IPP_PSTATE_IDLE; job->printer->active_job = NULL; return (NULL); } /* * 'process_state_message()' - Process a STATE: message from a command. */ static void process_state_message( ippeve_job_t *job, /* I - Job */ char *message) /* I - Message */ { int i; /* Looping var */ ippeve_preason_t state_reasons, /* printer-state-reasons values */ bit; /* Current reason bit */ char *ptr, /* Pointer into message */ *next; /* Next keyword in message */ int remove; /* Non-zero if we are removing keywords */ /* * Skip leading "STATE:" and any whitespace... */ for (message += 6; *message; message ++) if (*message != ' ' && *message != '\t') break; /* * Support the following forms of message: * * "keyword[,keyword,...]" to set the printer-state-reasons value(s). * * "-keyword[,keyword,...]" to remove keywords. * * "+keyword[,keyword,...]" to add keywords. * * Keywords may or may not have a suffix (-report, -warning, -error) per * RFC 8011. */ if (*message == '-') { remove = 1; state_reasons = job->printer->state_reasons; message ++; } else if (*message == '+') { remove = 0; state_reasons = job->printer->state_reasons; message ++; } else { remove = 0; state_reasons = IPPEVE_PREASON_NONE; } while (*message) { if ((next = strchr(message, ',')) != NULL) *next++ = '\0'; if ((ptr = strstr(message, "-error")) != NULL) *ptr = '\0'; else if ((ptr = strstr(message, "-report")) != NULL) *ptr = '\0'; else if ((ptr = strstr(message, "-warning")) != NULL) *ptr = '\0'; for (i = 0, bit = 1; i < (int)(sizeof(ippeve_preason_strings) / sizeof(ippeve_preason_strings[0])); i ++, bit *= 2) { if (!strcmp(message, ippeve_preason_strings[i])) { if (remove) state_reasons &= ~bit; else state_reasons |= bit; } } if (next) message = next; else break; } job->printer->state_reasons = state_reasons; } /* * 'register_printer()' - Register a printer object via Bonjour. */ static int /* O - 1 on success, 0 on error */ register_printer( ippeve_printer_t *printer, /* I - Printer */ const char *subtypes) /* I - Service subtype(s) */ { #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ippeve_txt_t ipp_txt; /* Bonjour IPP TXT record */ int i, /* Looping var */ count; /* Number of values */ ipp_attribute_t *color_supported, *document_format_supported, *printer_location, *printer_make_and_model, *printer_more_info, *printer_uuid, *sides_supported, *urf_supported; /* Printer attributes */ const char *value; /* Value string */ char formats[252], /* List of supported formats */ urf[252], /* List of supported URF values */ *ptr; /* Pointer into string */ if (!strcmp(subtypes, "off")) return (1); color_supported = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN); document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE); printer_location = ippFindAttribute(printer->attrs, "printer-location", IPP_TAG_TEXT); printer_make_and_model = ippFindAttribute(printer->attrs, "printer-make-and-model", IPP_TAG_TEXT); printer_more_info = ippFindAttribute(printer->attrs, "printer-more-info", IPP_TAG_URI); printer_uuid = ippFindAttribute(printer->attrs, "printer-uuid", IPP_TAG_URI); sides_supported = ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_KEYWORD); urf_supported = ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_KEYWORD); for (i = 0, count = ippGetCount(document_format_supported), ptr = formats; i < count; i ++) { value = ippGetString(document_format_supported, i, NULL); if (!strcasecmp(value, "application/octet-stream")) continue; if (ptr > formats && ptr < (formats + sizeof(formats) - 1)) *ptr++ = ','; strlcpy(ptr, value, sizeof(formats) - (size_t)(ptr - formats)); ptr += strlen(ptr); if (ptr >= (formats + sizeof(formats) - 1)) break; } urf[0] = '\0'; for (i = 0, count = ippGetCount(urf_supported), ptr = urf; i < count; i ++) { value = ippGetString(urf_supported, i, NULL); if (ptr > urf && ptr < (urf + sizeof(urf) - 1)) *ptr++ = ','; strlcpy(ptr, value, sizeof(urf) - (size_t)(ptr - urf)); ptr += strlen(ptr); if (ptr >= (urf + sizeof(urf) - 1)) break; } #endif /* HAVE_DNSSD || HAVE_AVAHI */ #ifdef HAVE_DNSSD DNSServiceErrorType error; /* Error from Bonjour */ char regtype[256]; /* Bonjour service type */ uint32_t interface; /* Interface index */ /* * Build the TXT record for IPP... */ TXTRecordCreate(&ipp_txt, 1024, NULL); TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print"); if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(value), value); if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(value), value); if ((value = ippGetString(printer_location, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(value), value); TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats), formats); TXTRecordSetValue(&ipp_txt, "Color", 1, ippGetBoolean(color_supported, 0) ? "T" : "F"); TXTRecordSetValue(&ipp_txt, "Duplex", 1, ippGetCount(sides_supported) > 1 ? "T" : "F"); if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "UUID", (uint8_t)strlen(value) - 9, value + 9); # ifdef HAVE_SSL TXTRecordSetValue(&ipp_txt, "TLS", 3, "1.2"); # endif /* HAVE_SSL */ if (urf[0]) TXTRecordSetValue(&ipp_txt, "URF", (uint8_t)strlen(urf), urf); TXTRecordSetValue(&ipp_txt, "txtvers", 1, "1"); TXTRecordSetValue(&ipp_txt, "qtotal", 1, "1"); /* * Register the _printer._tcp (LPD) service type with a port number of 0 to * defend our service name but not actually support LPD... */ interface = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; printer->printer_ref = DNSSDMaster; if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error); return (0); } /* * Then register the _ipp._tcp (IPP) service type with the real port number to * advertise our IPP printer... */ printer->ipp_ref = DNSSDMaster; if (subtypes && *subtypes) snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtypes); else strlcpy(regtype, "_ipp._tcp", sizeof(regtype)); if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); return (0); } # ifdef HAVE_SSL /* * Then register the _ipps._tcp (IPP) service type with the real port number to * advertise our IPPS printer... */ printer->ipps_ref = DNSSDMaster; if (subtypes && *subtypes) snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtypes); else strlcpy(regtype, "_ipps._tcp", sizeof(regtype)); if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); return (0); } # endif /* HAVE_SSL */ /* * Similarly, register the _http._tcp,_printer (HTTP) service type with the * real port number to advertise our IPP printer... */ printer->http_ref = DNSSDMaster; if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error); return (0); } TXTRecordDeallocate(&ipp_txt); #elif defined(HAVE_AVAHI) char temp[256]; /* Subtype service string */ /* * Create the TXT record... */ ipp_txt = NULL; ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print"); if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s", value); if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", value); if ((value = ippGetString(printer_location, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", value); ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats); ipp_txt = avahi_string_list_add_printf(ipp_txt, "Color=%s", ippGetBoolean(color_supported, 0) ? "T" : "F"); ipp_txt = avahi_string_list_add_printf(ipp_txt, "Duplex=%s", ippGetCount(sides_supported) > 1 ? "T" : "F"); if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "UUID=%s", value + 9); # ifdef HAVE_SSL ipp_txt = avahi_string_list_add_printf(ipp_txt, "TLS=1.2"); # endif /* HAVE_SSL */ if (urf[0]) ipp_txt = avahi_string_list_add_printf(ipp_txt, "URF=%s", urf); ipp_txt = avahi_string_list_add_printf(ipp_txt, "txtvers=1"); ipp_txt = avahi_string_list_add_printf(ipp_txt, "qtotal=1"); /* * Register _printer._tcp (LPD) with port 0 to reserve the service name... */ avahi_threaded_poll_lock(DNSSDMaster); printer->ipp_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, NULL); avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL); /* * Then register the _ipp._tcp (IPP)... */ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt); if (subtypes && *subtypes) { char *temptypes = strdup(subtypes), *start, *end; for (start = temptypes; *start; start = end) { if ((end = strchr(start, ',')) != NULL) *end++ = '\0'; else end = start + strlen(start); snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", start); avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp); } free(temptypes); } #ifdef HAVE_SSL /* * _ipps._tcp (IPPS) for secure printing... */ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt); if (subtypes && *subtypes) { char *temptypes = strdup(subtypes), *start, *end; for (start = temptypes; *start; start = end) { if ((end = strchr(start, ',')) != NULL) *end++ = '\0'; else end = start + strlen(start); snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", start); avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp); } free(temptypes); } #endif /* HAVE_SSL */ /* * Finally _http.tcp (HTTP) for the web interface... */ avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL); avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp"); /* * Commit it... */ avahi_entry_group_commit(printer->ipp_ref); avahi_threaded_poll_unlock(DNSSDMaster); avahi_string_list_free(ipp_txt); #endif /* HAVE_DNSSD */ return (1); } /* * 'respond_http()' - Send a HTTP response. */ int /* O - 1 on success, 0 on failure */ respond_http( ippeve_client_t *client, /* I - Client */ http_status_t code, /* I - HTTP status of response */ const char *content_encoding, /* I - Content-Encoding of response */ const char *type, /* I - MIME media type of response */ size_t length) /* I - Length of response */ { char message[1024]; /* Text message */ fprintf(stderr, "%s %s\n", client->hostname, httpStatus(code)); if (code == HTTP_STATUS_CONTINUE) { /* * 100-continue doesn't send any headers... */ return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE) == 0); } /* * Format an error message... */ if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS) { snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code)); type = "text/plain"; length = strlen(message); } else message[0] = '\0'; /* * Send the HTTP response header... */ httpClearFields(client->http); if (code == HTTP_STATUS_METHOD_NOT_ALLOWED || client->operation == HTTP_STATE_OPTIONS) httpSetField(client->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST"); if (code == HTTP_STATUS_UNAUTHORIZED) { char value[256]; /* WWW-Authenticate value */ snprintf(value, sizeof(value), "Basic realm=\"%s\"", PAMService); httpSetField(client->http, HTTP_FIELD_WWW_AUTHENTICATE, value); } if (type) { if (!strcmp(type, "text/html")) httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, "text/html; charset=utf-8"); else httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, type); if (content_encoding) httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, content_encoding); } httpSetLength(client->http, length); if (httpWriteResponse(client->http, code) < 0) return (0); /* * Send the response data... */ if (message[0]) { /* * Send a plain text message. */ if (httpPrintf(client->http, "%s", message) < 0) return (0); if (httpWrite2(client->http, "", 0) < 0) return (0); } else if (client->response) { /* * Send an IPP response... */ debug_attributes("Response", client->response, 2); ippSetState(client->response, IPP_STATE_IDLE); if (ippWrite(client->http, client->response) != IPP_STATE_DATA) return (0); } return (1); } /* * 'respond_ipp()' - Send an IPP response. */ static void respond_ipp(ippeve_client_t *client, /* I - Client */ ipp_status_t status, /* I - status-code */ const char *message, /* I - printf-style status-message */ ...) /* I - Additional args as needed */ { const char *formatted = NULL; /* Formatted message */ ippSetStatusCode(client->response, status); if (message) { va_list ap; /* Pointer to additional args */ ipp_attribute_t *attr; /* New status-message attribute */ va_start(ap, message); if ((attr = ippFindAttribute(client->response, "status-message", IPP_TAG_TEXT)) != NULL) ippSetStringfv(client->response, &attr, 0, message, ap); else attr = ippAddStringfv(client->response, IPP_TAG_OPERATION, IPP_TAG_TEXT, "status-message", NULL, message, ap); va_end(ap); formatted = ippGetString(attr, 0, NULL); } if (formatted) fprintf(stderr, "%s %s %s (%s)\n", client->hostname, ippOpString(client->operation_id), ippErrorString(status), formatted); else fprintf(stderr, "%s %s %s\n", client->hostname, ippOpString(client->operation_id), ippErrorString(status)); } /* * 'respond_unsupported()' - Respond with an unsupported attribute. */ static void respond_unsupported( ippeve_client_t *client, /* I - Client */ ipp_attribute_t *attr) /* I - Atribute */ { ipp_attribute_t *temp; /* Copy of attribute */ respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Unsupported %s %s%s value.", ippGetName(attr), ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr))); temp = ippCopyAttribute(client->response, attr, 0); ippSetGroupTag(client->response, &temp, IPP_TAG_UNSUPPORTED_GROUP); } /* * 'run_printer()' - Run the printer service. */ static void run_printer(ippeve_printer_t *printer) /* I - Printer */ { int num_fds; /* Number of file descriptors */ struct pollfd polldata[3]; /* poll() data */ int timeout; /* Timeout for poll() */ ippeve_client_t *client; /* New client */ /* * Setup poll() data for the Bonjour service socket and IPv4/6 listeners... */ polldata[0].fd = printer->ipv4; polldata[0].events = POLLIN; polldata[1].fd = printer->ipv6; polldata[1].events = POLLIN; num_fds = 2; #ifdef HAVE_DNSSD polldata[num_fds ].fd = DNSServiceRefSockFD(DNSSDMaster); polldata[num_fds ++].events = POLLIN; #endif /* HAVE_DNSSD */ /* * Loop until we are killed or have a hard error... */ for (;;) { if (cupsArrayCount(printer->jobs)) timeout = 10; else timeout = -1; if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR) { perror("poll() failed"); break; } if (polldata[0].revents & POLLIN) { if ((client = create_client(printer, printer->ipv4)) != NULL) { _cups_thread_t t = _cupsThreadCreate((_cups_thread_func_t)process_client, client); if (t) { _cupsThreadDetach(t); } else { perror("Unable to create client thread"); delete_client(client); } } } if (polldata[1].revents & POLLIN) { if ((client = create_client(printer, printer->ipv6)) != NULL) { _cups_thread_t t = _cupsThreadCreate((_cups_thread_func_t)process_client, client); if (t) { _cupsThreadDetach(t); } else { perror("Unable to create client thread"); delete_client(client); } } } #ifdef HAVE_DNSSD if (polldata[2].revents & POLLIN) DNSServiceProcessResult(DNSSDMaster); #endif /* HAVE_DNSSD */ /* * Clean out old jobs... */ clean_jobs(printer); } } /* * 'show_media()' - Show media load state. */ static int /* O - 1 on success, 0 on failure */ show_media(ippeve_client_t *client) /* I - Client connection */ { ippeve_printer_t *printer = client->printer; /* Printer */ int i, j, /* Looping vars */ num_ready, /* Number of ready media */ num_sizes, /* Number of media sizes */ num_sources, /* Number of media sources */ num_types; /* Number of media types */ ipp_attribute_t *media_col_ready,/* media-col-ready attribute */ *media_ready, /* media-ready attribute */ *media_sizes, /* media-supported attribute */ *media_sources, /* media-source-supported attribute */ *media_types, /* media-type-supported attribute */ *input_tray; /* printer-input-tray attribute */ ipp_t *media_col; /* media-col value */ const char *media_size, /* media value */ *media_source, /* media-source value */ *media_type, /* media-type value */ *ready_size, /* media-col-ready media-size[-name] value */ *ready_source, /* media-col-ready media-source value */ *ready_tray, /* printer-input-tray value */ *ready_type; /* media-col-ready media-type value */ char tray_str[1024], /* printer-input-tray string value */ *tray_ptr; /* Pointer into value */ int tray_len; /* Length of printer-input-tray value */ int ready_sheets; /* printer-input-tray sheets value */ int num_options = 0;/* Number of form options */ cups_option_t *options = NULL;/* Form options */ static const int sheets[] = /* Number of sheets */ { 250, 125, 50, 25, 5, 0, -2 }; if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)) return (0); html_header(client, printer->name, 0); if ((media_col_ready = ippFindAttribute(printer->attrs, "media-col-ready", IPP_TAG_BEGIN_COLLECTION)) == NULL) { html_printf(client, "

Error: No media-col-ready defined for printer.

\n"); html_footer(client); return (1); } media_ready = ippFindAttribute(printer->attrs, "media-ready", IPP_TAG_ZERO); if ((media_sizes = ippFindAttribute(printer->attrs, "media-supported", IPP_TAG_ZERO)) == NULL) { html_printf(client, "

Error: No media-supported defined for printer.

\n"); html_footer(client); return (1); } if ((media_sources = ippFindAttribute(printer->attrs, "media-source-supported", IPP_TAG_ZERO)) == NULL) { html_printf(client, "

Error: No media-source-supported defined for printer.

\n"); html_footer(client); return (1); } if ((media_types = ippFindAttribute(printer->attrs, "media-type-supported", IPP_TAG_ZERO)) == NULL) { html_printf(client, "

Error: No media-type-supported defined for printer.

\n"); html_footer(client); return (1); } if ((input_tray = ippFindAttribute(printer->attrs, "printer-input-tray", IPP_TAG_STRING)) == NULL) { html_printf(client, "

Error: No printer-input-tray defined for printer.

\n"); html_footer(client); return (1); } num_ready = ippGetCount(media_col_ready); num_sizes = ippGetCount(media_sizes); num_sources = ippGetCount(media_sources); num_types = ippGetCount(media_types); if (num_sources != ippGetCount(input_tray)) { html_printf(client, "

Error: Different number of trays in media-source-supported and printer-input-tray defined for printer.

\n"); html_footer(client); return (1); } /* * Process form data if present... */ if (printer->web_forms) num_options = parse_options(client, &options); if (num_options > 0) { /* * WARNING: A real printer/server implementation MUST NOT implement * media updates via a GET request - GET requests are supposed to be * idempotent (without side-effects) and we obviously are not * authenticating access here. This form is provided solely to * enable testing and development! */ char name[255]; /* Form name */ const char *val; /* Form value */ pwg_media_t *media; /* Media info */ _cupsRWLockWrite(&printer->rwlock); ippDeleteAttribute(printer->attrs, media_col_ready); media_col_ready = NULL; if (media_ready) { ippDeleteAttribute(printer->attrs, media_ready); media_ready = NULL; } printer->state_reasons &= (ippeve_preason_t)~(IPPEVE_PREASON_MEDIA_LOW | IPPEVE_PREASON_MEDIA_EMPTY | IPPEVE_PREASON_MEDIA_NEEDED); for (i = 0; i < num_sources; i ++) { media_source = ippGetString(media_sources, i, NULL); if (!strcmp(media_source, "auto") || !strcmp(media_source, "manual") || strstr(media_source, "-man") != NULL) continue; snprintf(name, sizeof(name), "size%d", i); if ((media_size = cupsGetOption(name, num_options, options)) != NULL && (media = pwgMediaForPWG(media_size)) != NULL) { snprintf(name, sizeof(name), "type%d", i); if ((media_type = cupsGetOption(name, num_options, options)) != NULL && !*media_type) media_type = NULL; if (media_ready) ippSetString(printer->attrs, &media_ready, ippGetCount(media_ready), media_size); else media_ready = ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", NULL, media_size); media_col = create_media_col(media_size, media_source, media_type, media->width, media->length, -1, -1, -1, -1); if (media_col_ready) ippSetCollection(printer->attrs, &media_col_ready, ippGetCount(media_col_ready), media_col); else media_col_ready = ippAddCollection(printer->attrs, IPP_TAG_PRINTER, "media-col-ready", media_col); ippDelete(media_col); } else media = NULL; snprintf(name, sizeof(name), "level%d", i); if ((val = cupsGetOption(name, num_options, options)) != NULL) ready_sheets = atoi(val); else ready_sheets = 0; snprintf(tray_str, sizeof(tray_str), "type=sheetFeedAuto%sRemovableTray;mediafeed=%d;mediaxfeed=%d;maxcapacity=%d;level=%d;status=0;name=%s;", !strcmp(media_source, "by-pass-tray") ? "Non" : "", media ? media->length : 0, media ? media->width : 0, strcmp(media_source, "by-pass-tray") ? 250 : 25, ready_sheets, media_source); ippSetOctetString(printer->attrs, &input_tray, i, tray_str, (int)strlen(tray_str)); if (ready_sheets == 0) { printer->state_reasons |= IPPEVE_PREASON_MEDIA_EMPTY; if (printer->active_job) printer->state_reasons |= IPPEVE_PREASON_MEDIA_NEEDED; } else if (ready_sheets < 25 && ready_sheets > 0) printer->state_reasons |= IPPEVE_PREASON_MEDIA_LOW; } if (!media_col_ready) media_col_ready = ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-col-ready"); if (!media_ready) media_ready = ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-ready"); _cupsRWUnlock(&printer->rwlock); } if (printer->web_forms) html_printf(client, "
\n"); html_printf(client, "\n"); for (i = 0; i < num_sources; i ++) { media_source = ippGetString(media_sources, i, NULL); if (!strcmp(media_source, "auto") || !strcmp(media_source, "manual") || strstr(media_source, "-man") != NULL) continue; for (j = 0, ready_size = NULL, ready_type = NULL; j < num_ready; j ++) { media_col = ippGetCollection(media_col_ready, j); ready_size = ippGetString(ippFindAttribute(media_col, "media-size-name", IPP_TAG_ZERO), 0, NULL); ready_source = ippGetString(ippFindAttribute(media_col, "media-source", IPP_TAG_ZERO), 0, NULL); ready_type = ippGetString(ippFindAttribute(media_col, "media-type", IPP_TAG_ZERO), 0, NULL); if (ready_source && !strcmp(ready_source, media_source)) break; ready_source = NULL; ready_size = NULL; ready_type = NULL; } html_printf(client, "", media_source); /* * Media size... */ if (printer->web_forms) { html_printf(client, "\n"); } else if (ready_sheets == 1) html_printf(client, ", 1 sheet\n"); else if (ready_sheets > 0) html_printf(client, ", %d sheets\n", ready_sheets); else html_printf(client, "\n"); } if (printer->web_forms) { html_printf(client, "
%s:"); } else html_printf(client, "%s", ready_size); /* * Media type... */ if (printer->web_forms) { html_printf(client, " "); } else if (ready_type) html_printf(client, ", %s", ready_type); /* * Level/sheets loaded... */ if ((ready_tray = ippGetOctetString(input_tray, i, &tray_len)) != NULL) { if (tray_len > (int)(sizeof(tray_str) - 1)) tray_len = (int)sizeof(tray_str) - 1; memcpy(tray_str, ready_tray, (size_t)tray_len); tray_str[tray_len] = '\0'; if ((tray_ptr = strstr(tray_str, "level=")) != NULL) ready_sheets = atoi(tray_ptr + 6); else ready_sheets = 0; } else ready_sheets = 0; if (printer->web_forms) { html_printf(client, "
"); if (num_options > 0) html_printf(client, " Media updated.\n"); html_printf(client, "
\n"); if (num_options > 0) html_printf(client, "\n"); } else html_printf(client, "\n"); html_footer(client); return (1); } /* * 'show_status()' - Show printer/system state. */ static int /* O - 1 on success, 0 on failure */ show_status(ippeve_client_t *client) /* I - Client connection */ { ippeve_printer_t *printer = client->printer; /* Printer */ ippeve_job_t *job; /* Current job */ int i; /* Looping var */ ippeve_preason_t reason; /* Current reason */ static const char * const reasons[] = /* Reason strings */ { "Other", "Cover Open", "Input Tray Missing", "Marker Supply Empty", "Marker Supply Low", "Marker Waste Almost Full", "Marker Waste Full", "Media Empty", "Media Jam", "Media Low", "Media Needed", "Moving to Paused", "Paused", "Spool Area Full", "Toner Empty", "Toner Low" }; static const char * const state_colors[] = { /* State colors */ "#0C0", /* Idle */ "#EE0", /* Processing */ "#C00" /* Stopped */ }; if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)) return (0); html_header(client, printer->name, printer->state == IPP_PSTATE_PROCESSING ? 5 : 15); html_printf(client, "

%s Jobs

\n", state_colors[printer->state - IPP_PSTATE_IDLE], printer->name); html_printf(client, "

%s, %d job(s).", printer->state == IPP_PSTATE_IDLE ? "Idle" : printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(printer->jobs)); for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1) if (printer->state_reasons & reason) html_printf(client, "\n
    %s", reasons[i]); html_printf(client, "

\n"); if (cupsArrayCount(printer->jobs) > 0) { _cupsRWLockRead(&(printer->rwlock)); html_printf(client, "\n"); for (job = (ippeve_job_t *)cupsArrayFirst(printer->jobs); job; job = (ippeve_job_t *)cupsArrayNext(printer->jobs)) { char when[256], /* When job queued/started/finished */ hhmmss[64]; /* Time HH:MM:SS */ switch (job->state) { case IPP_JSTATE_PENDING : case IPP_JSTATE_HELD : snprintf(when, sizeof(when), "Queued at %s", time_string(job->created, hhmmss, sizeof(hhmmss))); break; case IPP_JSTATE_PROCESSING : case IPP_JSTATE_STOPPED : snprintf(when, sizeof(when), "Started at %s", time_string(job->processing, hhmmss, sizeof(hhmmss))); break; case IPP_JSTATE_ABORTED : snprintf(when, sizeof(when), "Aborted at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); break; case IPP_JSTATE_CANCELED : snprintf(when, sizeof(when), "Canceled at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); break; case IPP_JSTATE_COMPLETED : snprintf(when, sizeof(when), "Completed at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); break; } html_printf(client, "\n", job->id, job->name, job->username, when); } html_printf(client, "
Job #NameOwnerStatus
%d%s%s%s
\n"); _cupsRWUnlock(&(printer->rwlock)); } html_footer(client); return (1); } /* * 'show_supplies()' - Show printer supplies. */ static int /* O - 1 on success, 0 on failure */ show_supplies( ippeve_client_t *client) /* I - Client connection */ { ippeve_printer_t *printer = client->printer; /* Printer */ int i, /* Looping var */ num_supply; /* Number of supplies */ ipp_attribute_t *supply, /* printer-supply attribute */ *supply_desc; /* printer-supply-description attribute */ int num_options = 0; /* Number of form options */ cups_option_t *options = NULL; /* Form options */ int supply_len, /* Length of supply value */ level; /* Supply level */ const char *supply_value; /* Supply value */ char supply_text[1024], /* Supply string */ *supply_ptr; /* Pointer into supply string */ static const char * const printer_supply[] = { /* printer-supply values */ "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" "maxcapacity=100;level=%d;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=%d;colorantname=black;", "index=3;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=%d;colorantname=cyan;", "index=4;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=%d;colorantname=magenta;", "index=5;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=%d;colorantname=yellow;" }; static const char * const backgrounds[] = { /* Background colors for the supply-level bars */ "#777 linear-gradient(#333,#777)", "#000 linear-gradient(#666,#000)", "#0FF linear-gradient(#6FF,#0FF)", "#F0F linear-gradient(#F6F,#F0F)", "#CC0 linear-gradient(#EE6,#EE0)" }; static const char * const colors[] = /* Text colors for the supply-level bars */ { "#fff", "#fff", "#000", "#000", "#000" }; if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)) return (0); html_header(client, printer->name, 0); if ((supply = ippFindAttribute(printer->attrs, "printer-supply", IPP_TAG_STRING)) == NULL) { html_printf(client, "

Error: No printer-supply defined for printer.

\n"); html_footer(client); return (1); } num_supply = ippGetCount(supply); if ((supply_desc = ippFindAttribute(printer->attrs, "printer-supply-description", IPP_TAG_TEXT)) == NULL) { html_printf(client, "

Error: No printer-supply-description defined for printer.

\n"); html_footer(client); return (1); } if (num_supply != ippGetCount(supply_desc)) { html_printf(client, "

Error: Different number of values for printer-supply and printer-supply-description defined for printer.

\n"); html_footer(client); return (1); } if (printer->web_forms) num_options = parse_options(client, &options); if (num_options > 0) { /* * WARNING: A real printer/server implementation MUST NOT implement * supply updates via a GET request - GET requests are supposed to be * idempotent (without side-effects) and we obviously are not * authenticating access here. This form is provided solely to * enable testing and development! */ char name[64]; /* Form field */ const char *val; /* Form value */ _cupsRWLockWrite(&printer->rwlock); ippDeleteAttribute(printer->attrs, supply); supply = NULL; printer->state_reasons &= (ippeve_preason_t)~(IPPEVE_PREASON_MARKER_SUPPLY_EMPTY | IPPEVE_PREASON_MARKER_SUPPLY_LOW | IPPEVE_PREASON_MARKER_WASTE_ALMOST_FULL | IPPEVE_PREASON_MARKER_WASTE_FULL | IPPEVE_PREASON_TONER_EMPTY | IPPEVE_PREASON_TONER_LOW); for (i = 0; i < num_supply; i ++) { snprintf(name, sizeof(name), "supply%d", i); if ((val = cupsGetOption(name, num_options, options)) != NULL) { level = atoi(val); /* New level */ snprintf(supply_text, sizeof(supply_text), printer_supply[i], level); if (supply) ippSetOctetString(printer->attrs, &supply, ippGetCount(supply), supply_text, (int)strlen(supply_text)); else supply = ippAddOctetString(printer->attrs, IPP_TAG_PRINTER, "printer-supply", supply_text, (int)strlen(supply_text)); if (i == 0) { if (level == 100) printer->state_reasons |= IPPEVE_PREASON_MARKER_WASTE_FULL; else if (level > 90) printer->state_reasons |= IPPEVE_PREASON_MARKER_WASTE_ALMOST_FULL; } else { if (level == 0) printer->state_reasons |= IPPEVE_PREASON_TONER_EMPTY; else if (level < 10) printer->state_reasons |= IPPEVE_PREASON_TONER_LOW; } } } _cupsRWUnlock(&printer->rwlock); } if (printer->web_forms) html_printf(client, "
\n"); html_printf(client, "\n"); for (i = 0; i < num_supply; i ++) { supply_value = ippGetOctetString(supply, i, &supply_len); if (supply_len > (int)(sizeof(supply_text) - 1)) supply_len = (int)sizeof(supply_text) - 1; memcpy(supply_text, supply_value, (size_t)supply_len); supply_text[supply_len] = '\0'; if ((supply_ptr = strstr(supply_text, "level=")) != NULL) level = atoi(supply_ptr + 6); else level = 50; if (printer->web_forms) html_printf(client, "", ippGetString(supply_desc, i, NULL), i, level); else html_printf(client, "", ippGetString(supply_desc, i, NULL)); if (level < 10) html_printf(client, "\n", backgrounds[i], level * 2, level); else html_printf(client, "\n", backgrounds[i], colors[i], level * 2, level); } if (printer->web_forms) { html_printf(client, "\n
%s:
%s: %d%%
%d%%
"); if (num_options > 0) html_printf(client, " Supplies updated.\n"); html_printf(client, "
\n
\n"); if (num_options > 0) html_printf(client, "\n"); } else html_printf(client, "\n"); html_footer(client); return (1); } /* * 'time_string()' - Return the local time in hours, minutes, and seconds. */ static char * time_string(time_t tv, /* I - Time value */ char *buffer, /* I - Buffer */ size_t bufsize) /* I - Size of buffer */ { struct tm date; /* Local time and date */ localtime_r(&tv, &date); strftime(buffer, bufsize, "%X", &date); return (buffer); } /* * 'usage()' - Show program usage. */ static void usage(int status) /* O - Exit status */ { _cupsLangPuts(stdout, _("Usage: ippeveprinter [options] \"name\"")); _cupsLangPuts(stdout, _("Options:")); _cupsLangPuts(stdout, _("--help Show program help")); _cupsLangPuts(stdout, _("--no-web-forms Disable web forms for media and supplies")); _cupsLangPuts(stdout, _("--pam-service service Use the named PAM service")); _cupsLangPuts(stdout, _("--version Show program version")); _cupsLangPuts(stdout, _("-2 Set 2-sided printing support (default=1-sided)")); _cupsLangPuts(stdout, _("-A Enable authentication")); _cupsLangPuts(stdout, _("-D device-uri Set the device URI for the printer")); _cupsLangPuts(stdout, _("-F output-type/subtype Set the output format for the printer")); #ifdef HAVE_SSL _cupsLangPuts(stdout, _("-K keypath Set location of server X.509 certificates and keys.")); #endif /* HAVE_SSL */ _cupsLangPuts(stdout, _("-M manufacturer Set manufacturer name (default=Test)")); _cupsLangPuts(stdout, _("-P filename.ppd Load printer attributes from PPD file")); _cupsLangPuts(stdout, _("-V version Set default IPP version")); _cupsLangPuts(stdout, _("-a filename.conf Load printer attributes from conf file")); _cupsLangPuts(stdout, _("-c command Set print command")); _cupsLangPuts(stdout, _("-d spool-directory Set spool directory")); _cupsLangPuts(stdout, _("-f type/subtype[,...] Set supported file types")); _cupsLangPuts(stdout, _("-i iconfile.png Set icon file")); _cupsLangPuts(stdout, _("-k Keep job spool files")); _cupsLangPuts(stdout, _("-l location Set location of printer")); _cupsLangPuts(stdout, _("-m model Set model name (default=Printer)")); _cupsLangPuts(stdout, _("-n hostname Set hostname for printer")); _cupsLangPuts(stdout, _("-p port Set port number for printer")); _cupsLangPuts(stdout, _("-r subtype,[subtype] Set DNS-SD service subtype")); _cupsLangPuts(stdout, _("-s speed[,color-speed] Set speed in pages per minute")); _cupsLangPuts(stdout, _("-v Be verbose")); exit(status); } /* * 'valid_doc_attributes()' - Determine whether the document attributes are * valid. * * When one or more document attributes are invalid, this function adds a * suitable response and attributes to the unsupported group. */ static int /* O - 1 if valid, 0 if not */ valid_doc_attributes( ippeve_client_t *client) /* I - Client */ { int valid = 1; /* Valid attributes? */ ipp_op_t op = ippGetOperation(client->request); /* IPP operation */ const char *op_name = ippOpString(op); /* IPP operation name */ ipp_attribute_t *attr, /* Current attribute */ *supported; /* xxx-supported attribute */ const char *compression = NULL, /* compression value */ *format = NULL; /* document-format value */ /* * Check operation attributes... */ if ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL) { /* * If compression is specified, only accept a supported value in a Print-Job * or Send-Document request... */ compression = ippGetString(attr, 0, NULL); supported = ippFindAttribute(client->printer->attrs, "compression-supported", IPP_TAG_KEYWORD); if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD || ippGetGroupTag(attr) != IPP_TAG_OPERATION || (op != IPP_OP_PRINT_JOB && op != IPP_OP_SEND_DOCUMENT && op != IPP_OP_VALIDATE_JOB) || !ippContainsString(supported, compression)) { respond_unsupported(client, attr); valid = 0; } else { fprintf(stderr, "%s %s compression=\"%s\"\n", client->hostname, op_name, compression); ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "compression-supplied", NULL, compression); if (strcmp(compression, "none")) { if (Verbosity) fprintf(stderr, "Receiving job file with \"%s\" compression.\n", compression); httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, compression); } } } /* * Is it a format we support? */ if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE || ippGetGroupTag(attr) != IPP_TAG_OPERATION) { respond_unsupported(client, attr); valid = 0; } else { format = ippGetString(attr, 0, NULL); fprintf(stderr, "%s %s document-format=\"%s\"\n", client->hostname, op_name, format); ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, format); } } else { format = ippGetString(ippFindAttribute(client->printer->attrs, "document-format-default", IPP_TAG_MIMETYPE), 0, NULL); if (!format) format = "application/octet-stream"; /* Should never happen */ attr = ippAddString(client->request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format); } if (format && !strcmp(format, "application/octet-stream") && (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT)) { /* * Auto-type the file using the first 8 bytes of the file... */ unsigned char header[8]; /* First 8 bytes of file */ memset(header, 0, sizeof(header)); httpPeek(client->http, (char *)header, sizeof(header)); if (!memcmp(header, "%PDF", 4)) format = "application/pdf"; else if (!memcmp(header, "%!", 2)) format = "application/postscript"; else if (!memcmp(header, "\377\330\377", 3) && header[3] >= 0xe0 && header[3] <= 0xef) format = "image/jpeg"; else if (!memcmp(header, "\211PNG", 4)) format = "image/png"; else if (!memcmp(header, "RAS2", 4)) format = "image/pwg-raster"; else if (!memcmp(header, "UNIRAST", 8)) format = "image/urf"; else format = NULL; if (format) { fprintf(stderr, "%s %s Auto-typed document-format=\"%s\"\n", client->hostname, op_name, format); ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, format); } } if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format)) { respond_unsupported(client, attr); valid = 0; } /* * document-name */ if ((attr = ippFindAttribute(client->request, "document-name", IPP_TAG_NAME)) != NULL) ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL)); return (valid); } /* * 'valid_job_attributes()' - Determine whether the job attributes are valid. * * When one or more job attributes are invalid, this function adds a suitable * response and attributes to the unsupported group. */ static int /* O - 1 if valid, 0 if not */ valid_job_attributes( ippeve_client_t *client) /* I - Client */ { int i, /* Looping var */ count, /* Number of values */ valid = 1; /* Valid attributes? */ ipp_attribute_t *attr, /* Current attribute */ *supported; /* xxx-supported attribute */ /* * Check operation attributes... */ valid = valid_doc_attributes(client); /* * Check the various job template attributes... */ if ((attr = ippFindAttribute(client->request, "copies", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 999) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "job-hold-until", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && ippGetValueTag(attr) != IPP_TAG_NAMELANG && ippGetValueTag(attr) != IPP_TAG_KEYWORD) || strcmp(ippGetString(attr, 0, NULL), "no-hold")) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 0) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && ippGetValueTag(attr) != IPP_TAG_NAMELANG)) { respond_unsupported(client, attr); valid = 0; } ippSetGroupTag(client->request, &attr, IPP_TAG_JOB); } else ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled"); if ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 100) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "job-sheets", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && ippGetValueTag(attr) != IPP_TAG_NAMELANG && ippGetValueTag(attr) != IPP_TAG_KEYWORD) || strcmp(ippGetString(attr, 0, NULL), "none")) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "media", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && ippGetValueTag(attr) != IPP_TAG_NAMELANG && ippGetValueTag(attr) != IPP_TAG_KEYWORD)) { respond_unsupported(client, attr); valid = 0; } else { supported = ippFindAttribute(client->printer->attrs, "media-supported", IPP_TAG_KEYWORD); if (!ippContainsString(supported, ippGetString(attr, 0, NULL))) { respond_unsupported(client, attr); valid = 0; } } } if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL) { ipp_t *col, /* media-col collection */ *size; /* media-size collection */ ipp_attribute_t *member, /* Member attribute */ *x_dim, /* x-dimension */ *y_dim; /* y-dimension */ int x_value, /* y-dimension value */ y_value; /* x-dimension value */ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION) { respond_unsupported(client, attr); valid = 0; } col = ippGetCollection(attr, 0); if ((member = ippFindAttribute(col, "media-size-name", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(member) != 1 || (ippGetValueTag(member) != IPP_TAG_NAME && ippGetValueTag(member) != IPP_TAG_NAMELANG && ippGetValueTag(member) != IPP_TAG_KEYWORD)) { respond_unsupported(client, attr); valid = 0; } else { supported = ippFindAttribute(client->printer->attrs, "media-supported", IPP_TAG_KEYWORD); if (!ippContainsString(supported, ippGetString(member, 0, NULL))) { respond_unsupported(client, attr); valid = 0; } } } else if ((member = ippFindAttribute(col, "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL) { if (ippGetCount(member) != 1) { respond_unsupported(client, attr); valid = 0; } else { size = ippGetCollection(member, 0); if ((x_dim = ippFindAttribute(size, "x-dimension", IPP_TAG_INTEGER)) == NULL || ippGetCount(x_dim) != 1 || (y_dim = ippFindAttribute(size, "y-dimension", IPP_TAG_INTEGER)) == NULL || ippGetCount(y_dim) != 1) { respond_unsupported(client, attr); valid = 0; } else { x_value = ippGetInteger(x_dim, 0); y_value = ippGetInteger(y_dim, 0); supported = ippFindAttribute(client->printer->attrs, "media-size-supported", IPP_TAG_BEGIN_COLLECTION); count = ippGetCount(supported); for (i = 0; i < count ; i ++) { size = ippGetCollection(supported, i); x_dim = ippFindAttribute(size, "x-dimension", IPP_TAG_ZERO); y_dim = ippFindAttribute(size, "y-dimension", IPP_TAG_ZERO); if (ippContainsInteger(x_dim, x_value) && ippContainsInteger(y_dim, y_value)) break; } if (i >= count) { respond_unsupported(client, attr); valid = 0; } } } } } if ((attr = ippFindAttribute(client->request, "multiple-document-handling", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD || (strcmp(ippGetString(attr, 0, NULL), "separate-documents-uncollated-copies") && strcmp(ippGetString(attr, 0, NULL), "separate-documents-collated-copies"))) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "orientation-requested", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM || ippGetInteger(attr, 0) < IPP_ORIENT_PORTRAIT || ippGetInteger(attr, 0) > IPP_ORIENT_REVERSE_PORTRAIT) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "page-ranges", IPP_TAG_ZERO)) != NULL) { if (ippGetValueTag(attr) != IPP_TAG_RANGE) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "print-quality", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM || ippGetInteger(attr, 0) < IPP_QUALITY_DRAFT || ippGetInteger(attr, 0) > IPP_QUALITY_HIGH) { respond_unsupported(client, attr); valid = 0; } } if ((attr = ippFindAttribute(client->request, "printer-resolution", IPP_TAG_ZERO)) != NULL) { supported = ippFindAttribute(client->printer->attrs, "printer-resolution-supported", IPP_TAG_RESOLUTION); if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_RESOLUTION || !supported) { respond_unsupported(client, attr); valid = 0; } else { int xdpi, /* Horizontal resolution for job template attribute */ ydpi, /* Vertical resolution for job template attribute */ sydpi; /* Vertical resolution for supported value */ ipp_res_t units, /* Units for job template attribute */ sunits; /* Units for supported value */ xdpi = ippGetResolution(attr, 0, &ydpi, &units); count = ippGetCount(supported); for (i = 0; i < count; i ++) { if (xdpi == ippGetResolution(supported, i, &sydpi, &sunits) && ydpi == sydpi && units == sunits) break; } if (i >= count) { respond_unsupported(client, attr); valid = 0; } } } if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL) { const char *sides = ippGetString(attr, 0, NULL); /* "sides" value... */ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD) { respond_unsupported(client, attr); valid = 0; } else if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL) { if (!ippContainsString(supported, sides)) { respond_unsupported(client, attr); valid = 0; } } else if (strcmp(sides, "one-sided")) { respond_unsupported(client, attr); valid = 0; } } return (valid); } cups-2.3.1/tools/ipptool.c000664 000765 000024 00000426712 13574721672 015605 0ustar00mikestaff000000 000000 /* * ipptool command for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include #include #include #ifdef _WIN32 # include # ifndef R_OK # define R_OK 0 # endif /* !R_OK */ #else # include # include #endif /* _WIN32 */ #ifndef O_BINARY # define O_BINARY 0 #endif /* !O_BINARY */ /* * Types... */ typedef enum _cups_transfer_e /**** How to send request data ****/ { _CUPS_TRANSFER_AUTO, /* Chunk for files, length for static */ _CUPS_TRANSFER_CHUNKED, /* Chunk always */ _CUPS_TRANSFER_LENGTH /* Length always */ } _cups_transfer_t; typedef enum _cups_output_e /**** Output mode ****/ { _CUPS_OUTPUT_QUIET, /* No output */ _CUPS_OUTPUT_TEST, /* Traditional CUPS test output */ _CUPS_OUTPUT_PLIST, /* XML plist test output */ _CUPS_OUTPUT_IPPSERVER, /* ippserver attribute file output */ _CUPS_OUTPUT_LIST, /* Tabular list output */ _CUPS_OUTPUT_CSV /* Comma-separated values output */ } _cups_output_t; typedef enum _cups_with_e /**** WITH flags ****/ { _CUPS_WITH_LITERAL = 0, /* Match string is a literal value */ _CUPS_WITH_ALL = 1, /* Must match all values */ _CUPS_WITH_REGEX = 2, /* Match string is a regular expression */ _CUPS_WITH_HOSTNAME = 4, /* Match string is a URI hostname */ _CUPS_WITH_RESOURCE = 8, /* Match string is a URI resource */ _CUPS_WITH_SCHEME = 16 /* Match string is a URI scheme */ } _cups_with_t; typedef struct _cups_expect_s /**** Expected attribute info ****/ { int optional, /* Optional attribute? */ not_expect, /* Don't expect attribute? */ expect_all; /* Expect all attributes to match/not match */ char *name, /* Attribute name */ *of_type, /* Type name */ *same_count_as, /* Parallel attribute name */ *if_defined, /* Only required if variable defined */ *if_not_defined, /* Only required if variable is not defined */ *with_value, /* Attribute must include this value */ *with_value_from, /* Attribute must have one of the values in this attribute */ *define_match, /* Variable to define on match */ *define_no_match, /* Variable to define on no-match */ *define_value; /* Variable to define with value */ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat test on match */ repeat_no_match, /* Repeat test on no match */ with_flags, /* WITH flags */ count; /* Expected count if > 0 */ ipp_tag_t in_group; /* IN-GROUP value */ } _cups_expect_t; typedef struct _cups_status_s /**** Status info ****/ { ipp_status_t status; /* Expected status code */ char *if_defined, /* Only if variable is defined */ *if_not_defined, /* Only if variable is not defined */ *define_match, /* Variable to define on match */ *define_no_match, /* Variable to define on no-match */ *define_value; /* Variable to define with value */ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat the test when it does not match */ repeat_no_match; /* Repeat the test when it matches */ } _cups_status_t; typedef struct _cups_testdata_s /**** Test Data ****/ { /* Global Options */ http_encryption_t encryption; /* Encryption for connection */ int family; /* Address family */ _cups_output_t output; /* Output mode */ int stop_after_include_error; /* Stop after include errors? */ double timeout; /* Timeout for connection */ int validate_headers, /* Validate HTTP headers in response? */ verbosity; /* Show all attributes? */ /* Test Defaults */ int def_ignore_errors; /* Default IGNORE-ERRORS value */ _cups_transfer_t def_transfer; /* Default TRANSFER value */ int def_version; /* Default IPP version */ /* Global State */ http_t *http; /* HTTP connection to printer/server */ cups_file_t *outfile; /* Output file */ int show_header, /* Show the test header? */ xml_header; /* 1 if XML plist header was written */ int pass, /* Have we passed all tests? */ test_count, /* Number of tests (total) */ pass_count, /* Number of tests that passed */ fail_count, /* Number of tests that failed */ skip_count; /* Number of tests that were skipped */ /* Per-Test State */ cups_array_t *errors; /* Errors array */ int prev_pass, /* Result of previous test */ skip_previous; /* Skip on previous test failure? */ char compression[16]; /* COMPRESSION value */ useconds_t delay; /* Initial delay */ int num_displayed; /* Number of displayed attributes */ char *displayed[200]; /* Displayed attributes */ int num_expects; /* Number of expected attributes */ _cups_expect_t expects[200], /* Expected attributes */ *expect, /* Current expected attribute */ *last_expect; /* Last EXPECT (for predicates) */ char file[1024], /* Data filename */ file_id[1024]; /* File identifier */ int ignore_errors; /* Ignore test failures? */ char name[1024]; /* Test name */ useconds_t repeat_interval; /* Repeat interval (delay) */ int request_id; /* Current request ID */ char resource[512]; /* Resource for request */ int skip_test, /* Skip this test? */ num_statuses; /* Number of valid status codes */ _cups_status_t statuses[100], /* Valid status codes */ *last_status; /* Last STATUS (for predicates) */ char test_id[1024]; /* Test identifier */ _cups_transfer_t transfer; /* To chunk or not to chunk */ int version; /* IPP version number to use */ } _cups_testdata_t; /* * Globals... */ static int Cancel = 0; /* Cancel test? */ /* * Local functions... */ static void add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3); static int compare_uris(const char *a, const char *b); static void copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize); static int do_test(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data); static int do_tests(const char *testfile, _ipp_vars_t *vars, _cups_testdata_t *data); static int error_cb(_ipp_file_t *f, _cups_testdata_t *data, const char *error); static int expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag); static char *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize); static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize); static void init_data(_cups_testdata_t *data); static char *iso_date(const ipp_uchar_t *date); static void pause_message(const char *message); static void print_attr(cups_file_t *outfile, _cups_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); static void print_csv(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); static void print_fatal_error(_cups_testdata_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); static void print_ippserver_attr(_cups_testdata_t *data, ipp_attribute_t *attr, int indent); static void print_ippserver_string(_cups_testdata_t *data, const char *s, size_t len); static void print_line(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); static void print_xml_header(_cups_testdata_t *data); static void print_xml_string(cups_file_t *outfile, const char *element, const char *s); static void print_xml_trailer(_cups_testdata_t *data, int success, const char *message); #ifndef _WIN32 static void sigterm_handler(int sig); #endif /* _WIN32 */ static int timeout_cb(http_t *http, void *user_data); static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data, const char *token); static void usage(void) _CUPS_NORETURN; static const char *with_flags_string(int flags); static int with_value(_cups_testdata_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); static int with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); /* * 'main()' - Parse options and do tests. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int status; /* Status of tests... */ char *opt, /* Current option */ name[1024], /* Name/value buffer */ *value, /* Pointer to value */ filename[1024], /* Real filename */ testname[1024]; /* Real test filename */ const char *ext, /* Extension on filename */ *testfile; /* Test file to use */ int interval, /* Test interval in microseconds */ repeat; /* Repeat count */ _cups_testdata_t data; /* Test data */ _ipp_vars_t vars; /* Variables */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ #ifndef _WIN32 /* * Catch SIGINT and SIGTERM... */ signal(SIGINT, sigterm_handler); signal(SIGTERM, sigterm_handler); #endif /* !_WIN32 */ /* * Initialize the locale and variables... */ _cupsSetLocale(argv); init_data(&data); _ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb); _ippVarsSet(&vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); /* * We need at least: * * ipptool URI testfile */ interval = 0; repeat = 0; status = 0; testfile = NULL; for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) { usage(); } else if (!strcmp(argv[i], "--ippserver")) { i ++; if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing filename for \"--ippserver\".")); usage(); } if (data.outfile != cupsFileStdout()) usage(); if ((data.outfile = cupsFileOpen(argv[i], "w")) == NULL) { _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno)); exit(1); } data.output = _CUPS_OUTPUT_IPPSERVER; } else if (!strcmp(argv[i], "--stop-after-include-error")) { data.stop_after_include_error = 1; } else if (!strcmp(argv[i], "--version")) { puts(CUPS_SVERSION); return (0); } else if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case '4' : /* Connect using IPv4 only */ data.family = AF_INET; break; #ifdef AF_INET6 case '6' : /* Connect using IPv6 only */ data.family = AF_INET6; break; #endif /* AF_INET6 */ case 'C' : /* Enable HTTP chunking */ data.def_transfer = _CUPS_TRANSFER_CHUNKED; break; case 'E' : /* Encrypt with TLS */ #ifdef HAVE_SSL data.encryption = HTTP_ENCRYPT_REQUIRED; #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'I' : /* Ignore errors */ data.def_ignore_errors = 1; break; case 'L' : /* Disable HTTP chunking */ data.def_transfer = _CUPS_TRANSFER_LENGTH; break; case 'P' : /* Output to plist file */ i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Missing filename for \"-P\"."), "ipptool"); usage(); } if (data.outfile != cupsFileStdout()) usage(); if ((data.outfile = cupsFileOpen(argv[i], "w")) == NULL) { _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno)); exit(1); } data.output = _CUPS_OUTPUT_PLIST; if (interval || repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\".")); usage(); } break; case 'S' : /* Encrypt with SSL */ #ifdef HAVE_SSL data.encryption = HTTP_ENCRYPT_ALWAYS; #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'T' : /* Set timeout */ i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ipptool"); usage(); } data.timeout = _cupsStrScand(argv[i], NULL, localeconv()); break; case 'V' : /* Set IPP version */ i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ipptool"); usage(); } if (!strcmp(argv[i], "1.0")) { data.def_version = 10; } else if (!strcmp(argv[i], "1.1")) { data.def_version = 11; } else if (!strcmp(argv[i], "2.0")) { data.def_version = 20; } else if (!strcmp(argv[i], "2.1")) { data.def_version = 21; } else if (!strcmp(argv[i], "2.2")) { data.def_version = 22; } else { _cupsLangPrintf(stderr, _("%s: Bad version %s for \"-V\"."), "ipptool", argv[i]); usage(); } break; case 'X' : /* Produce XML output */ data.output = _CUPS_OUTPUT_PLIST; if (interval || repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\".")); usage(); } break; case 'c' : /* CSV output */ data.output = _CUPS_OUTPUT_CSV; break; case 'd' : /* Define a variable */ i ++; if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing name=value for \"-d\".")); usage(); } strlcpy(name, argv[i], sizeof(name)); if ((value = strchr(name, '=')) != NULL) *value++ = '\0'; else value = name + strlen(name); _ippVarsSet(&vars, name, value); break; case 'f' : /* Set the default test filename */ i ++; if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing filename for \"-f\".")); usage(); } if (access(argv[i], 0)) { /* * Try filename.gz... */ snprintf(filename, sizeof(filename), "%s.gz", argv[i]); if (access(filename, 0) && filename[0] != '/' #ifdef _WIN32 && (!isalpha(filename[0] & 255) || filename[1] != ':') #endif /* _WIN32 */ ) { snprintf(filename, sizeof(filename), "%s/ipptool/%s", cg->cups_datadir, argv[i]); if (access(filename, 0)) { snprintf(filename, sizeof(filename), "%s/ipptool/%s.gz", cg->cups_datadir, argv[i]); if (access(filename, 0)) strlcpy(filename, argv[i], sizeof(filename)); } } } else strlcpy(filename, argv[i], sizeof(filename)); _ippVarsSet(&vars, "filename", filename); if ((ext = strrchr(filename, '.')) != NULL) { /* * Guess the MIME media type based on the extension... */ if (!_cups_strcasecmp(ext, ".gif")) _ippVarsSet(&vars, "filetype", "image/gif"); else if (!_cups_strcasecmp(ext, ".htm") || !_cups_strcasecmp(ext, ".htm.gz") || !_cups_strcasecmp(ext, ".html") || !_cups_strcasecmp(ext, ".html.gz")) _ippVarsSet(&vars, "filetype", "text/html"); else if (!_cups_strcasecmp(ext, ".jpg") || !_cups_strcasecmp(ext, ".jpeg")) _ippVarsSet(&vars, "filetype", "image/jpeg"); else if (!_cups_strcasecmp(ext, ".pcl") || !_cups_strcasecmp(ext, ".pcl.gz")) _ippVarsSet(&vars, "filetype", "application/vnd.hp-PCL"); else if (!_cups_strcasecmp(ext, ".pdf")) _ippVarsSet(&vars, "filetype", "application/pdf"); else if (!_cups_strcasecmp(ext, ".png")) _ippVarsSet(&vars, "filetype", "image/png"); else if (!_cups_strcasecmp(ext, ".ps") || !_cups_strcasecmp(ext, ".ps.gz")) _ippVarsSet(&vars, "filetype", "application/postscript"); else if (!_cups_strcasecmp(ext, ".pwg") || !_cups_strcasecmp(ext, ".pwg.gz") || !_cups_strcasecmp(ext, ".ras") || !_cups_strcasecmp(ext, ".ras.gz")) _ippVarsSet(&vars, "filetype", "image/pwg-raster"); else if (!_cups_strcasecmp(ext, ".tif") || !_cups_strcasecmp(ext, ".tiff")) _ippVarsSet(&vars, "filetype", "image/tiff"); else if (!_cups_strcasecmp(ext, ".txt") || !_cups_strcasecmp(ext, ".txt.gz")) _ippVarsSet(&vars, "filetype", "text/plain"); else if (!_cups_strcasecmp(ext, ".urf") || !_cups_strcasecmp(ext, ".urf.gz")) _ippVarsSet(&vars, "filetype", "image/urf"); else if (!_cups_strcasecmp(ext, ".xps")) _ippVarsSet(&vars, "filetype", "application/openxps"); else _ippVarsSet(&vars, "filetype", "application/octet-stream"); } else { /* * Use the "auto-type" MIME media type... */ _ippVarsSet(&vars, "filetype", "application/octet-stream"); } break; case 'h' : /* Validate response headers */ data.validate_headers = 1; break; case 'i' : /* Test every N seconds */ i ++; if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing seconds for \"-i\".")); usage(); } else { interval = (int)(_cupsStrScand(argv[i], NULL, localeconv()) * 1000000.0); if (interval <= 0) { _cupsLangPuts(stderr, _("ipptool: Invalid seconds for \"-i\".")); usage(); } } if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && interval) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); } break; case 'l' : /* List as a table */ data.output = _CUPS_OUTPUT_LIST; break; case 'n' : /* Repeat count */ i ++; if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing count for \"-n\".")); usage(); } else repeat = atoi(argv[i]); if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); } break; case 'q' : /* Be quiet */ data.output = _CUPS_OUTPUT_QUIET; break; case 't' : /* CUPS test output */ data.output = _CUPS_OUTPUT_TEST; break; case 'v' : /* Be verbose */ data.verbosity ++; break; default : _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."), "ipptool", *opt); usage(); } } } else if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "http://", 7) #ifdef HAVE_SSL || !strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8) #endif /* HAVE_SSL */ ) { /* * Set URI... */ if (vars.uri) { _cupsLangPuts(stderr, _("ipptool: May only specify a single URI.")); usage(); } #ifdef HAVE_SSL if (!strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8)) data.encryption = HTTP_ENCRYPT_ALWAYS; #endif /* HAVE_SSL */ if (!_ippVarsSet(&vars, "uri", argv[i])) { _cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]); return (1); } if (vars.username[0] && vars.password) cupsSetPasswordCB2(_ippVarsPasswordCB, &vars); } else { /* * Run test... */ if (!vars.uri) { _cupsLangPuts(stderr, _("ipptool: URI required before test file.")); _cupsLangPuts(stderr, argv[i]); usage(); } if (access(argv[i], 0) && argv[i][0] != '/' #ifdef _WIN32 && (!isalpha(argv[i][0] & 255) || argv[i][1] != ':') #endif /* _WIN32 */ ) { snprintf(testname, sizeof(testname), "%s/ipptool/%s", cg->cups_datadir, argv[i]); if (access(testname, 0)) testfile = argv[i]; else testfile = testname; } else testfile = argv[i]; if (!do_tests(testfile, &vars, &data)) status = 1; } } if (!vars.uri || !testfile) usage(); /* * Loop if the interval is set... */ if (data.output == _CUPS_OUTPUT_PLIST) print_xml_trailer(&data, !status, NULL); else if (interval > 0 && repeat > 0) { while (repeat > 1) { usleep((useconds_t)interval); do_tests(testfile, &vars, &data); repeat --; } } else if (interval > 0) { for (;;) { usleep((useconds_t)interval); do_tests(testfile, &vars, &data); } } if ((data.output == _CUPS_OUTPUT_TEST || (data.output == _CUPS_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) { /* * Show a summary report if there were multiple tests... */ cupsFilePrintf(cupsFileStdout(), "\nSummary: %d tests, %d passed, %d failed, %d skipped\nScore: %d%%\n", data.test_count, data.pass_count, data.fail_count, data.skip_count, 100 * (data.pass_count + data.skip_count) / data.test_count); } cupsFileClose(data.outfile); /* * Exit... */ return (status); } /* * 'add_stringf()' - Add a formatted string to an array. */ static void add_stringf(cups_array_t *a, /* I - Array */ const char *s, /* I - Printf-style format string */ ...) /* I - Additional args as needed */ { char buffer[10240]; /* Format buffer */ va_list ap; /* Argument pointer */ /* * Don't bother is the array is NULL... */ if (!a) return; /* * Format the message... */ va_start(ap, s); vsnprintf(buffer, sizeof(buffer), s, ap); va_end(ap); /* * Add it to the array... */ cupsArrayAdd(a, buffer); } /* * 'compare_uris()' - Compare two URIs... */ static int /* O - Result of comparison */ compare_uris(const char *a, /* I - First URI */ const char *b) /* I - Second URI */ { char ascheme[32], /* Components of first URI */ auserpass[256], ahost[256], aresource[256]; int aport; char bscheme[32], /* Components of second URI */ buserpass[256], bhost[256], bresource[256]; int bport; char *ptr; /* Pointer into string */ int result; /* Result of comparison */ /* * Separate the URIs into their components... */ if (httpSeparateURI(HTTP_URI_CODING_ALL, a, ascheme, sizeof(ascheme), auserpass, sizeof(auserpass), ahost, sizeof(ahost), &aport, aresource, sizeof(aresource)) < HTTP_URI_STATUS_OK) return (-1); if (httpSeparateURI(HTTP_URI_CODING_ALL, b, bscheme, sizeof(bscheme), buserpass, sizeof(buserpass), bhost, sizeof(bhost), &bport, bresource, sizeof(bresource)) < HTTP_URI_STATUS_OK) return (-1); /* * Strip trailing dots from the host components, if present... */ if ((ptr = ahost + strlen(ahost) - 1) > ahost && *ptr == '.') *ptr = '\0'; if ((ptr = bhost + strlen(bhost) - 1) > bhost && *ptr == '.') *ptr = '\0'; /* * Compare each component... */ if ((result = _cups_strcasecmp(ascheme, bscheme)) != 0) return (result); if ((result = strcmp(auserpass, buserpass)) != 0) return (result); if ((result = _cups_strcasecmp(ahost, bhost)) != 0) return (result); if (aport != bport) return (aport - bport); if (!_cups_strcasecmp(ascheme, "mailto") || !_cups_strcasecmp(ascheme, "urn")) return (_cups_strcasecmp(aresource, bresource)); else return (strcmp(aresource, bresource)); } /* * 'copy_hex_string()' - Copy an octetString to a C string and encode as hex if * needed. */ static void copy_hex_string(char *buffer, /* I - String buffer */ unsigned char *data, /* I - octetString data */ int datalen, /* I - octetString length */ size_t bufsize) /* I - Size of string buffer */ { char *bufptr, /* Pointer into string buffer */ *bufend = buffer + bufsize - 2; /* End of string buffer */ unsigned char *dataptr, /* Pointer into octetString data */ *dataend = data + datalen; /* End of octetString data */ static const char *hexdigits = "0123456789ABCDEF"; /* Hex digits */ /* * First see if there are any non-ASCII bytes in the octetString... */ for (dataptr = data; dataptr < dataend; dataptr ++) if (*dataptr < 0x20 || *dataptr >= 0x7f) break; if (dataptr < dataend) { /* * Yes, encode as hex... */ *buffer = '<'; for (bufptr = buffer + 1, dataptr = data; bufptr < bufend && dataptr < dataend; dataptr ++) { *bufptr++ = hexdigits[*dataptr >> 4]; *bufptr++ = hexdigits[*dataptr & 15]; } if (bufptr < bufend) *bufptr++ = '>'; *bufptr = '\0'; } else { /* * No, copy as a string... */ if ((size_t)datalen > bufsize) datalen = (int)bufsize - 1; memcpy(buffer, data, (size_t)datalen); buffer[datalen] = '\0'; } } /* * 'do_test()' - Do a single test from the test file. */ static int /* O - 1 on success, 0 on failure */ do_test(_ipp_file_t *f, /* I - IPP data file */ _ipp_vars_t *vars, /* I - IPP variables */ _cups_testdata_t *data) /* I - Test data */ { int i, /* Looping var */ status_ok, /* Did we get a matching status? */ repeat_count = 0, /* Repeat count */ repeat_test; /* Repeat the test? */ _cups_expect_t *expect; /* Current expected attribute */ ipp_t *request, /* IPP request */ *response; /* IPP response */ size_t length; /* Length of IPP request */ http_status_t status; /* HTTP status */ cups_array_t *a; /* Duplicate attribute array */ ipp_tag_t group; /* Current group */ ipp_attribute_t *attrptr, /* Attribute pointer */ *found; /* Found attribute */ char temp[1024]; /* Temporary string */ cups_file_t *reqfile; /* File to send */ ssize_t bytes; /* Bytes read/written */ char buffer[131072]; /* Copy buffer */ size_t widths[200]; /* Width of columns */ const char *error; /* Current error */ if (Cancel) return (0); /* * Take over control of the attributes in the request... */ request = f->attrs; f->attrs = NULL; /* * Submit the IPP request... */ data->test_count ++; ippSetVersion(request, data->version / 10, data->version % 10); ippSetRequestId(request, data->request_id); if (data->output == _CUPS_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Name\n"); print_xml_string(data->outfile, "string", data->name); if (data->file_id[0]) { cupsFilePuts(data->outfile, "FileId\n"); print_xml_string(data->outfile, "string", data->file_id); } if (data->test_id[0]) { cupsFilePuts(data->outfile, "TestId\n"); print_xml_string(data->outfile, "string", data->test_id); } cupsFilePuts(data->outfile, "Version\n"); cupsFilePrintf(data->outfile, "%d.%d\n", data->version / 10, data->version % 10); cupsFilePuts(data->outfile, "Operation\n"); print_xml_string(data->outfile, "string", ippOpString(ippGetOperation(request))); cupsFilePuts(data->outfile, "RequestId\n"); cupsFilePrintf(data->outfile, "%d\n", data->request_id); cupsFilePuts(data->outfile, "RequestAttributes\n"); cupsFilePuts(data->outfile, "\n"); if (ippFirstAttribute(request)) { cupsFilePuts(data->outfile, "\n"); for (attrptr = ippFirstAttribute(request), group = ippGetGroupTag(attrptr); attrptr; attrptr = ippNextAttribute(request)) print_attr(data->outfile, data->output, attrptr, &group); cupsFilePuts(data->outfile, "\n"); } cupsFilePuts(data->outfile, "\n"); } if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { if (data->verbosity) { cupsFilePrintf(cupsFileStdout(), " %s:\n", ippOpString(ippGetOperation(request))); for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request)) print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); } cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); } if ((data->skip_previous && !data->prev_pass) || data->skip_test) { data->skip_count ++; ippDelete(request); request = NULL; response = NULL; if (data->output == _CUPS_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Skipped\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "StatusCode\n"); print_xml_string(data->outfile, "string", "skip"); cupsFilePuts(data->outfile, "ResponseAttributes\n"); cupsFilePuts(data->outfile, "\n"); } if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) cupsFilePuts(cupsFileStdout(), "SKIP]\n"); goto skip_error; } vars->password_tries = 0; do { if (data->delay > 0) usleep(data->delay); data->delay = data->repeat_interval; repeat_count ++; status = HTTP_STATUS_OK; if (data->transfer == _CUPS_TRANSFER_CHUNKED || (data->transfer == _CUPS_TRANSFER_AUTO && data->file[0])) { /* * Send request using chunking - a 0 length means "chunk". */ length = 0; } else { /* * Send request using content length... */ length = ippLength(request); if (data->file[0] && (reqfile = cupsFileOpen(data->file, "r")) != NULL) { /* * Read the file to get the uncompressed file size... */ while ((bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0) length += (size_t)bytes; cupsFileClose(reqfile); } } /* * Send the request... */ data->prev_pass = 1; repeat_test = 0; response = NULL; if (status != HTTP_STATUS_ERROR) { while (!response && !Cancel && data->prev_pass) { status = cupsSendRequest(data->http, request, data->resource, length); #ifdef HAVE_LIBZ if (data->compression[0]) httpSetField(data->http, HTTP_FIELD_CONTENT_ENCODING, data->compression); #endif /* HAVE_LIBZ */ if (!Cancel && status == HTTP_STATUS_CONTINUE && ippGetState(request) == IPP_DATA && data->file[0]) { if ((reqfile = cupsFileOpen(data->file, "r")) != NULL) { while (!Cancel && (bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0) { if ((status = cupsWriteRequestData(data->http, buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE) break; } cupsFileClose(reqfile); } else { snprintf(buffer, sizeof(buffer), "%s: %s", data->file, strerror(errno)); _cupsSetError(IPP_INTERNAL_ERROR, buffer, 0); status = HTTP_STATUS_ERROR; } } /* * Get the server's response... */ if (!Cancel && status != HTTP_STATUS_ERROR) { response = cupsGetResponse(data->http, data->resource); status = httpGetStatus(data->http); } if (!Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && #ifdef _WIN32 httpError(data->http) != WSAETIMEDOUT) #else httpError(data->http) != ETIMEDOUT) #endif /* _WIN32 */ { if (httpReconnect2(data->http, 30000, NULL)) data->prev_pass = 0; } else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED) { data->prev_pass = 0; break; } else if (status != HTTP_STATUS_OK) { httpFlush(data->http); if (status == HTTP_STATUS_UNAUTHORIZED) continue; break; } } } if (!Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && #ifdef _WIN32 httpError(data->http) != WSAETIMEDOUT) #else httpError(data->http) != ETIMEDOUT) #endif /* _WIN32 */ { if (httpReconnect2(data->http, 30000, NULL)) data->prev_pass = 0; } else if (status == HTTP_STATUS_ERROR) { if (!Cancel) httpReconnect2(data->http, 30000, NULL); data->prev_pass = 0; } else if (status != HTTP_STATUS_OK) { httpFlush(data->http); data->prev_pass = 0; } /* * Check results of request... */ cupsArrayClear(data->errors); if (httpGetVersion(data->http) != HTTP_1_1) { int version = (int)httpGetVersion(data->http); add_stringf(data->errors, "Bad HTTP version (%d.%d)", version / 100, version % 100); } if (data->validate_headers) { const char *header; /* HTTP header value */ if ((header = httpGetField(data->http, HTTP_FIELD_CONTENT_TYPE)) == NULL || _cups_strcasecmp(header, "application/ipp")) add_stringf(data->errors, "Bad HTTP Content-Type in response (%s)", header && *header ? header : ""); if ((header = httpGetField(data->http, HTTP_FIELD_DATE)) != NULL && *header && httpGetDateTime(header) == 0) add_stringf(data->errors, "Bad HTTP Date in response (%s)", header); } if (!response) { /* * No response, log error... */ add_stringf(data->errors, "IPP request failed with status %s (%s)", ippErrorString(cupsLastError()), cupsLastErrorString()); } else { /* * Collect common attribute values... */ if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); _ippVarsSet(vars, "job-id", temp); } if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL) _ippVarsSet(vars, "job-uri", ippGetString(attrptr, 0, NULL)); if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); _ippVarsSet(vars, "notify-subscription-id", temp); } /* * Check response, validating groups and attributes and logging errors * as needed... */ if (ippGetState(response) != IPP_DATA) add_stringf(data->errors, "Missing end-of-attributes-tag in response (RFC 2910 section 3.5.1)"); if (data->version) { int major, minor; /* IPP version */ major = ippGetVersion(response, &minor); if (major != (data->version / 10) || minor != (data->version % 10)) add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 2911 section 3.1.8).", major, minor, data->version / 10, data->version % 10); } if (ippGetRequestId(response) != data->request_id) add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 2911 section 3.1.1)", ippGetRequestId(response), data->request_id); attrptr = ippFirstAttribute(response); if (!attrptr) { add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); } else { if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset")) add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); attrptr = ippNextAttribute(response); if (!attrptr) add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language")) add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); } if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL) { const char *status_message = ippGetString(attrptr, 0, NULL); /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 2911 section 3.1.6.2).", ippGetCount(attrptr)); if (status_message && strlen(status_message) > 255) add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 2911 section 3.1.6.2).", (int)strlen(status_message)); } if ((attrptr = ippFindAttribute(response, "detailed-status-message", IPP_TAG_ZERO)) != NULL) { const char *detailed_status_message = ippGetString(attrptr, 0, NULL); /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong " "value tag %s (RFC 2911 section 3.1.6.3).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong " "group tag %s (RFC 2911 section 3.1.6.3).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values" " (RFC 2911 section 3.1.6.3).", ippGetCount(attrptr)); if (detailed_status_message && strlen(detailed_status_message) > 1023) add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad " "length %d (RFC 2911 section 3.1.6.3).", (int)strlen(detailed_status_message)); } a = cupsArrayNew((cups_array_func_t)strcmp, NULL); for (attrptr = ippFirstAttribute(response), group = ippGetGroupTag(attrptr); attrptr; attrptr = ippNextAttribute(response)) { if (ippGetGroupTag(attrptr) != group) { int out_of_order = 0; /* Are attribute groups out-of-order? */ cupsArrayClear(a); switch (ippGetGroupTag(attrptr)) { case IPP_TAG_ZERO : break; case IPP_TAG_OPERATION : out_of_order = 1; break; case IPP_TAG_UNSUPPORTED_GROUP : if (group != IPP_TAG_OPERATION) out_of_order = 1; break; case IPP_TAG_JOB : case IPP_TAG_PRINTER : if (group != IPP_TAG_OPERATION && group != IPP_TAG_UNSUPPORTED_GROUP) out_of_order = 1; break; case IPP_TAG_SUBSCRIPTION : if (group > ippGetGroupTag(attrptr) && group != IPP_TAG_DOCUMENT) out_of_order = 1; break; default : if (group > ippGetGroupTag(attrptr)) out_of_order = 1; break; } if (out_of_order) add_stringf(data->errors, "Attribute groups out of order (%s < %s)", ippTagString(ippGetGroupTag(attrptr)), ippTagString(group)); if (ippGetGroupTag(attrptr) != IPP_TAG_ZERO) group = ippGetGroupTag(attrptr); } if (!ippValidateAttribute(attrptr)) cupsArrayAdd(data->errors, (void *)cupsLastErrorString()); if (ippGetName(attrptr)) { if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < _CUPS_OUTPUT_LIST) add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", ippGetName(attrptr), ippTagString(group)); cupsArrayAdd(a, (void *)ippGetName(attrptr)); } } cupsArrayDelete(a); /* * Now check the test-defined expected status-code and attribute * values... */ for (i = 0, status_ok = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined && !_ippVarsGet(vars, data->statuses[i].if_defined)) continue; if (data->statuses[i].if_not_defined && _ippVarsGet(vars, data->statuses[i].if_not_defined)) continue; if (ippGetStatusCode(response) == data->statuses[i].status) { status_ok = 1; if (data->statuses[i].repeat_match && repeat_count < data->statuses[i].repeat_limit) repeat_test = 1; if (data->statuses[i].define_match) _ippVarsSet(vars, data->statuses[i].define_match, "1"); } else { if (data->statuses[i].repeat_no_match && repeat_count < data->statuses[i].repeat_limit) repeat_test = 1; if (data->statuses[i].define_no_match) { _ippVarsSet(vars, data->statuses[i].define_no_match, "1"); status_ok = 1; } } } if (!status_ok && data->num_statuses > 0) { for (i = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined && !_ippVarsGet(vars, data->statuses[i].if_defined)) continue; if (data->statuses[i].if_not_defined && _ippVarsGet(vars, data->statuses[i].if_not_defined)) continue; if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit) add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", ippErrorString(data->statuses[i].status), ippErrorString(cupsLastError())); } if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT)) != NULL) add_stringf(data->errors, "status-message=\"%s\"", ippGetString(attrptr, 0, NULL)); } for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) { ipp_attribute_t *group_found; /* Found parent attribute for group tests */ if (expect->if_defined && !_ippVarsGet(vars, expect->if_defined)) continue; if (expect->if_not_defined && _ippVarsGet(vars, expect->if_not_defined)) continue; if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found)) { while ((found = ippFindNextAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL) if (expect->in_group == ippGetGroupTag(found)) break; } do { group_found = found; if (expect->in_group && strchr(expect->name, '/')) { char group_name[256],/* Parent attribute name */ *group_ptr; /* Pointer into parent attribute name */ strlcpy(group_name, expect->name, sizeof(group_name)); if ((group_ptr = strchr(group_name, '/')) != NULL) *group_ptr = '\0'; group_found = ippFindAttribute(response, group_name, IPP_TAG_ZERO); } if ((found && expect->not_expect) || (!found && !(expect->not_expect || expect->optional)) || (found && !expect_matches(expect, ippGetValueTag(found))) || (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group)) { if (expect->define_no_match) _ippVarsSet(vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (found && expect->not_expect && !expect->with_value && !expect->with_value_from) add_stringf(data->errors, "NOT EXPECTED: %s", expect->name); else if (!found && !(expect->not_expect || expect->optional)) add_stringf(data->errors, "EXPECTED: %s", expect->name); else if (found) { if (!expect_matches(expect, ippGetValueTag(found))) add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)", expect->name, expect->of_type, ippTagString(ippGetValueTag(found))); if (expect->in_group && ippGetGroupTag(group_found) != expect->in_group) add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).", expect->name, ippTagString(expect->in_group), ippTagString(ippGetGroupTag(group_found))); } } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) repeat_test = 1; break; } if (found) ippAttributeString(found, buffer, sizeof(buffer)); if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer))) { if (expect->define_no_match) _ippVarsSet(vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit)) { add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from); with_value_from(data->errors, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer)); } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) repeat_test = 1; break; } else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) { if (expect->define_no_match) _ippVarsSet(vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && !expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit)) { if (expect->with_flags & _CUPS_WITH_REGEX) add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value); else add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value); with_value(data, data->errors, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)); } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) repeat_test = 1; break; } if (found && expect->count > 0 && ippGetCount(found) != expect->count) { if (expect->define_no_match) _ippVarsSet(vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found)); } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) repeat_test = 1; break; } if (found && expect->same_count_as) { attrptr = ippFindAttribute(response, expect->same_count_as, IPP_TAG_ZERO); if (!attrptr || ippGetCount(attrptr) != ippGetCount(found)) { if (expect->define_no_match) _ippVarsSet(vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (!attrptr) add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s " "(not returned)", expect->name, ippGetCount(found), expect->same_count_as); else if (ippGetCount(attrptr) != ippGetCount(found)) add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s " "(%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr)); } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) repeat_test = 1; break; } } if (found && expect->define_match) _ippVarsSet(vars, expect->define_match, "1"); if (found && expect->define_value) { if (!expect->with_value) { int last = ippGetCount(found) - 1; /* Last element in attribute */ switch (ippGetValueTag(found)) { case IPP_TAG_ENUM : case IPP_TAG_INTEGER : snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last)); break; case IPP_TAG_BOOLEAN : if (ippGetBoolean(found, last)) strlcpy(buffer, "true", sizeof(buffer)); else strlcpy(buffer, "false", sizeof(buffer)); break; case IPP_TAG_RESOLUTION : { int xres, /* Horizontal resolution */ yres; /* Vertical resolution */ ipp_res_t units; /* Resolution units */ xres = ippGetResolution(found, last, &yres, &units); if (xres == yres) snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } break; case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : case IPP_TAG_URI : case IPP_TAG_URISCHEME : strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer)); break; default : ippAttributeString(found, buffer, sizeof(buffer)); break; } } _ippVarsSet(vars, expect->define_value, buffer); } if (found && expect->repeat_match && repeat_count < expect->repeat_limit) repeat_test = 1; } while (expect->expect_all && (found = ippFindNextAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL); } } /* * If we are going to repeat this test, display intermediate results... */ if (repeat_test) { if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), "%04d]\n", repeat_count); \ if (data->num_displayed > 0) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { const char *attrname = ippGetName(attrptr); if (attrname) { for (i = 0; i < data->num_displayed; i ++) { if (!strcmp(data->displayed[i], attrname)) { print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); break; } } } } } } if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); } ippDelete(response); response = NULL; } } while (repeat_test); ippDelete(request); request = NULL; if (cupsArrayCount(data->errors) > 0) data->prev_pass = data->pass = 0; if (data->prev_pass) data->pass_count ++; else data->fail_count ++; if (data->output == _CUPS_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, data->prev_pass ? "\n" : "\n"); cupsFilePuts(data->outfile, "StatusCode\n"); print_xml_string(data->outfile, "string", ippErrorString(cupsLastError())); cupsFilePuts(data->outfile, "ResponseAttributes\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); for (attrptr = ippFirstAttribute(response), group = ippGetGroupTag(attrptr); attrptr; attrptr = ippNextAttribute(response)) print_attr(data->outfile, data->output, attrptr, &group); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); } else if (data->output == _CUPS_OUTPUT_IPPSERVER && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { if (!ippGetName(attrptr) || ippGetGroupTag(attrptr) != IPP_TAG_PRINTER) continue; print_ippserver_attr(data, attrptr, 0); } } if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePuts(cupsFileStdout(), data->prev_pass ? "PASS]\n" : "FAIL]\n"); if (!data->prev_pass || (data->verbosity && response)) { cupsFilePrintf(cupsFileStdout(), " RECEIVED: %lu bytes in response\n", (unsigned long)ippLength(response)); cupsFilePrintf(cupsFileStdout(), " status-code = %s (%s)\n", ippErrorString(cupsLastError()), cupsLastErrorString()); if (data->verbosity && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); } } } else if (!data->prev_pass && data->output != _CUPS_OUTPUT_QUIET) fprintf(stderr, "%s\n", cupsLastErrorString()); if (data->prev_pass && data->output >= _CUPS_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) { size_t width; /* Length of value */ for (i = 0; i < data->num_displayed; i ++) { widths[i] = strlen(data->displayed[i]); for (attrptr = ippFindAttribute(response, data->displayed[i], IPP_TAG_ZERO); attrptr; attrptr = ippFindNextAttribute(response, data->displayed[i], IPP_TAG_ZERO)) { width = ippAttributeString(attrptr, NULL, 0); if (width > widths[i]) widths[i] = width; } } if (data->output == _CUPS_OUTPUT_CSV) print_csv(data, NULL, NULL, data->num_displayed, data->displayed, widths); else print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths); attrptr = ippFirstAttribute(response); while (attrptr) { while (attrptr && ippGetGroupTag(attrptr) <= IPP_TAG_OPERATION) attrptr = ippNextAttribute(response); if (attrptr) { if (data->output == _CUPS_OUTPUT_CSV) print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths); else print_line(data, response, attrptr, data->num_displayed, data->displayed, widths); while (attrptr && ippGetGroupTag(attrptr) > IPP_TAG_OPERATION) attrptr = ippNextAttribute(response); } } } else if (!data->prev_pass) { if (data->output == _CUPS_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Errors\n"); cupsFilePuts(data->outfile, "\n"); for (error = (char *)cupsArrayFirst(data->errors); error; error = (char *)cupsArrayNext(data->errors)) print_xml_string(data->outfile, "string", error); cupsFilePuts(data->outfile, "\n"); } if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { for (error = (char *)cupsArrayFirst(data->errors); error; error = (char *)cupsArrayNext(data->errors)) cupsFilePrintf(cupsFileStdout(), " %s\n", error); } } if (data->num_displayed > 0 && !data->verbosity && response && (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { if (ippGetName(attrptr)) { for (i = 0; i < data->num_displayed; i ++) { if (!strcmp(data->displayed[i], ippGetName(attrptr))) { print_attr(data->outfile, data->output, attrptr, NULL); break; } } } } } skip_error: if (data->output == _CUPS_OUTPUT_PLIST) cupsFilePuts(data->outfile, "\n"); ippDelete(response); response = NULL; for (i = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined) free(data->statuses[i].if_defined); if (data->statuses[i].if_not_defined) free(data->statuses[i].if_not_defined); if (data->statuses[i].define_match) free(data->statuses[i].define_match); if (data->statuses[i].define_no_match) free(data->statuses[i].define_no_match); } data->num_statuses = 0; for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) { free(expect->name); if (expect->of_type) free(expect->of_type); if (expect->same_count_as) free(expect->same_count_as); if (expect->if_defined) free(expect->if_defined); if (expect->if_not_defined) free(expect->if_not_defined); if (expect->with_value) free(expect->with_value); if (expect->define_match) free(expect->define_match); if (expect->define_no_match) free(expect->define_no_match); if (expect->define_value) free(expect->define_value); } data->num_expects = 0; for (i = 0; i < data->num_displayed; i ++) free(data->displayed[i]); data->num_displayed = 0; return (data->ignore_errors || data->prev_pass); } /* * 'do_tests()' - Do tests as specified in the test file. */ static int /* O - 1 on success, 0 on failure */ do_tests(const char *testfile, /* I - Test file to use */ _ipp_vars_t *vars, /* I - Variables */ _cups_testdata_t *data) /* I - Test data */ { http_encryption_t encryption; /* Encryption mode */ /* * Connect to the printer/server... */ if (!_cups_strcasecmp(vars->scheme, "https") || !_cups_strcasecmp(vars->scheme, "ipps")) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = data->encryption; if ((data->http = httpConnect2(vars->host, vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) { print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", vars->host, vars->port, cupsLastErrorString()); return (0); } #ifdef HAVE_LIBZ httpSetDefaultField(data->http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); #else httpSetDefaultField(data->http, HTTP_FIELD_ACCEPT_ENCODING, "identity"); #endif /* HAVE_LIBZ */ if (data->timeout > 0.0) httpSetTimeout(data->http, data->timeout, timeout_cb, NULL); /* * Run tests... */ _ippFileParse(vars, testfile, (void *)data); /* * Close connection and return... */ httpClose(data->http); data->http = NULL; return (data->pass); } /* * 'error_cb()' - Print/add an error message. */ static int /* O - 1 to continue, 0 to stop */ error_cb(_ipp_file_t *f, /* I - IPP file data */ _cups_testdata_t *data, /* I - Test data */ const char *error) /* I - Error message */ { (void)f; print_fatal_error(data, "%s", error); return (1); } /* * 'expect_matches()' - Return true if the tag matches the specification. */ static int /* O - 1 if matches, 0 otherwise */ expect_matches( _cups_expect_t *expect, /* I - Expected attribute */ ipp_tag_t value_tag) /* I - Value tag for attribute */ { int match; /* Match? */ char *of_type, /* Type name to match */ *next, /* Next name to match */ sep; /* Separator character */ /* * If we don't expect a particular type, return immediately... */ if (!expect->of_type) return (1); /* * Parse the "of_type" value since the string can contain multiple attribute * types separated by "," or "|"... */ for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next) { /* * Find the next separator, and set it (temporarily) to nul if present. */ for (next = of_type; *next && *next != '|' && *next != ','; next ++); if ((sep = *next) != '\0') *next = '\0'; /* * Support some meta-types to make it easier to write the test file. */ if (!strcmp(of_type, "text")) match = value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT; else if (!strcmp(of_type, "name")) match = value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME; else if (!strcmp(of_type, "collection")) match = value_tag == IPP_TAG_BEGIN_COLLECTION; else match = value_tag == ippTagValue(of_type); /* * Restore the separator if we have one... */ if (sep) *next++ = sep; } return (match); } /* * 'get_filename()' - Get a filename based on the current test file. */ static char * /* O - Filename */ get_filename(const char *testfile, /* I - Current test file */ char *dst, /* I - Destination filename */ const char *src, /* I - Source filename */ size_t dstsize) /* I - Size of destination buffer */ { char *dstptr; /* Pointer into destination */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ if (*src == '<' && src[strlen(src) - 1] == '>') { /* * Map to CUPS_DATADIR/ipptool/filename... */ snprintf(dst, dstsize, "%s/ipptool/%s", cg->cups_datadir, src + 1); dstptr = dst + strlen(dst) - 1; if (*dstptr == '>') *dstptr = '\0'; } else if (!access(src, R_OK) || *src == '/' #ifdef _WIN32 || (isalpha(*src & 255) && src[1] == ':') #endif /* _WIN32 */ ) { /* * Use the path as-is... */ strlcpy(dst, src, dstsize); } else { /* * Make path relative to testfile... */ strlcpy(dst, testfile, dstsize); if ((dstptr = strrchr(dst, '/')) != NULL) dstptr ++; else dstptr = dst; /* Should never happen */ strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst)); } return (dst); } /* * 'get_string()' - Get a pointer to a string value or the portion of interest. */ static const char * /* O - Pointer to string */ get_string(ipp_attribute_t *attr, /* I - IPP attribute */ int element, /* I - Element to fetch */ int flags, /* I - Value ("with") flags */ char *buffer, /* I - Temporary buffer */ size_t bufsize) /* I - Size of temporary buffer */ { const char *value; /* Value */ char *ptr, /* Pointer into value */ scheme[256], /* URI scheme */ userpass[256], /* Username/password */ hostname[256], /* Hostname */ resource[1024]; /* Resource */ int port; /* Port number */ value = ippGetString(attr, element, NULL); if (flags & _CUPS_WITH_HOSTNAME) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; ptr = buffer + strlen(buffer) - 1; if (ptr >= buffer && *ptr == '.') *ptr = '\0'; /* Drop trailing "." */ return (buffer); } else if (flags & _CUPS_WITH_RESOURCE) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; return (buffer); } else if (flags & _CUPS_WITH_SCHEME) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; return (buffer); } else if (ippGetValueTag(attr) == IPP_TAG_URI && (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8))) { http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); if (status < HTTP_URI_STATUS_OK) { /* * Bad URI... */ buffer[0] = '\0'; } else { /* * Normalize URI with no trailing dot... */ if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.') *ptr = '\0'; httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource); } return (buffer); } else return (value); } /* * 'init_data()' - Initialize test data. */ static void init_data(_cups_testdata_t *data) /* I - Data */ { memset(data, 0, sizeof(_cups_testdata_t)); data->output = _CUPS_OUTPUT_LIST; data->outfile = cupsFileStdout(); data->family = AF_UNSPEC; data->def_transfer = _CUPS_TRANSFER_AUTO; data->def_version = 11; data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); data->pass = 1; data->prev_pass = 1; data->request_id = (CUPS_RAND() % 1000) * 137 + 1; data->show_header = 1; } /* * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime * value. */ static char * /* O - ISO 8601 date/time string */ iso_date(const ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */ { time_t utctime; /* UTC time since 1970 */ struct tm utcdate; /* UTC date/time */ static char buffer[255]; /* String buffer */ utctime = ippDateToTime(date); gmtime_r(&utctime, &utcdate); snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ", utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); return (buffer); } /* * 'pause_message()' - Display the message and pause until the user presses a key. */ static void pause_message(const char *message) /* I - Message */ { #ifdef _WIN32 HANDLE tty; /* Console handle */ DWORD mode; /* Console mode */ char key; /* Key press */ DWORD bytes; /* Bytes read for key press */ /* * Disable input echo and set raw input... */ if ((tty = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!GetConsoleMode(tty, &mode)) return; if (!SetConsoleMode(tty, 0)) return; #else int tty; /* /dev/tty - never read from stdin */ struct termios original, /* Original input mode */ noecho; /* No echo input mode */ char key; /* Current key press */ /* * Disable input echo and set raw input... */ if ((tty = open("/dev/tty", O_RDONLY)) < 0) return; if (tcgetattr(tty, &original)) { close(tty); return; } noecho = original; noecho.c_lflag &= (tcflag_t)~(ICANON | ECHO | ECHOE | ISIG); if (tcsetattr(tty, TCSAFLUSH, &noecho)) { close(tty); return; } #endif /* _WIN32 */ /* * Display the prompt... */ cupsFilePrintf(cupsFileStdout(), "%s\n---- PRESS ANY KEY ----", message); #ifdef _WIN32 /* * Read a key... */ ReadFile(tty, &key, 1, &bytes, NULL); /* * Cleanup... */ SetConsoleMode(tty, mode); #else /* * Read a key... */ read(tty, &key, 1); /* * Cleanup... */ tcsetattr(tty, TCSAFLUSH, &original); close(tty); #endif /* _WIN32 */ /* * Erase the "press any key" prompt... */ cupsFilePuts(cupsFileStdout(), "\r \r"); } /* * 'print_attr()' - Print an attribute on the screen. */ static void print_attr(cups_file_t *outfile, /* I - Output file */ _cups_output_t output, /* I - Output format */ ipp_attribute_t *attr, /* I - Attribute to print */ ipp_tag_t *group) /* IO - Current group */ { int i, /* Looping var */ count; /* Number of values */ ipp_attribute_t *colattr; /* Collection attribute */ if (output == _CUPS_OUTPUT_PLIST) { if (!ippGetName(attr) || (group && *group != ippGetGroupTag(attr))) { if (ippGetGroupTag(attr) != IPP_TAG_ZERO) { cupsFilePuts(outfile, "\n"); cupsFilePuts(outfile, "\n"); } if (group) *group = ippGetGroupTag(attr); } if (!ippGetName(attr)) return; print_xml_string(outfile, "key", ippGetName(attr)); if ((count = ippGetCount(attr)) > 1) cupsFilePuts(outfile, "\n"); switch (ippGetValueTag(attr)) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : for (i = 0; i < count; i ++) cupsFilePrintf(outfile, "%d\n", ippGetInteger(attr, i)); break; case IPP_TAG_BOOLEAN : for (i = 0; i < count; i ++) cupsFilePuts(outfile, ippGetBoolean(attr, i) ? "\n" : "\n"); break; case IPP_TAG_RANGE : for (i = 0; i < count; i ++) { int lower, upper; /* Lower and upper ranges */ lower = ippGetRange(attr, i, &upper); cupsFilePrintf(outfile, "lower%dupper%d\n", lower, upper); } break; case IPP_TAG_RESOLUTION : for (i = 0; i < count; i ++) { int xres, yres; /* Resolution values */ ipp_res_t units; /* Resolution units */ xres = ippGetResolution(attr, i, &yres, &units); cupsFilePrintf(outfile, "xres%dyres%dunits%s\n", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } break; case IPP_TAG_DATE : for (i = 0; i < count; i ++) cupsFilePrintf(outfile, "%s\n", iso_date(ippGetDate(attr, i))); break; case IPP_TAG_STRING : for (i = 0; i < count; i ++) { int datalen; /* Length of data */ void *data = ippGetOctetString(attr, i, &datalen); /* Data */ char buffer[IPP_MAX_LENGTH * 5 / 4 + 1]; /* Base64 output buffer */ cupsFilePrintf(outfile, "%s\n", httpEncode64_2(buffer, sizeof(buffer), data, datalen)); } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : 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 ++) print_xml_string(outfile, "string", ippGetString(attr, i, NULL)); break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : for (i = 0; i < count; i ++) { const char *s, /* String */ *lang; /* Language */ s = ippGetString(attr, i, &lang); cupsFilePuts(outfile, "language"); print_xml_string(outfile, NULL, lang); cupsFilePuts(outfile, "string"); print_xml_string(outfile, NULL, s); cupsFilePuts(outfile, "\n"); } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0; i < count; i ++) { ipp_t *col = ippGetCollection(attr, i); /* Collection value */ cupsFilePuts(outfile, "\n"); for (colattr = ippFirstAttribute(col); colattr; colattr = ippNextAttribute(col)) print_attr(outfile, output, colattr, NULL); cupsFilePuts(outfile, "\n"); } break; default : cupsFilePrintf(outfile, "<<%s>>\n", ippTagString(ippGetValueTag(attr))); break; } if (count > 1) cupsFilePuts(outfile, "\n"); } else { char buffer[131072]; /* Value buffer */ if (output == _CUPS_OUTPUT_TEST) { if (!ippGetName(attr)) { cupsFilePuts(outfile, " -- separator --\n"); return; } cupsFilePrintf(outfile, " %s (%s%s) = ", ippGetName(attr), ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr))); } ippAttributeString(attr, buffer, sizeof(buffer)); cupsFilePrintf(outfile, "%s\n", buffer); } } /* * 'print_csv()' - Print a line of CSV text. */ static void print_csv( _cups_testdata_t *data, /* I - Test data */ ipp_t *ipp, /* I - Response message */ ipp_attribute_t *attr, /* I - First attribute for line */ int num_displayed, /* I - Number of attributes to display */ char **displayed, /* I - Attributes to display */ size_t *widths) /* I - Column widths */ { int i; /* Looping var */ size_t maxlength; /* Max length of all columns */ char *buffer, /* String buffer */ *bufptr; /* Pointer into buffer */ ipp_attribute_t *current; /* Current attribute */ /* * Get the maximum string length we have to show and allocate... */ for (i = 1, maxlength = widths[0]; i < num_displayed; i ++) if (widths[i] > maxlength) maxlength = widths[i]; maxlength += 2; if ((buffer = malloc(maxlength)) == NULL) return; /* * Loop through the attributes to display... */ if (attr) { for (i = 0; i < num_displayed; i ++) { if (i) cupsFilePutChar(data->outfile, ','); buffer[0] = '\0'; for (current = attr; current; current = ippNextAttribute(ipp)) { if (!ippGetName(current)) break; else if (!strcmp(ippGetName(current), displayed[i])) { ippAttributeString(current, buffer, maxlength); break; } } if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL || strchr(buffer, '\\') != NULL) { cupsFilePutChar(cupsFileStdout(), '\"'); for (bufptr = buffer; *bufptr; bufptr ++) { if (*bufptr == '\\' || *bufptr == '\"') cupsFilePutChar(cupsFileStdout(), '\\'); cupsFilePutChar(cupsFileStdout(), *bufptr); } cupsFilePutChar(cupsFileStdout(), '\"'); } else cupsFilePuts(data->outfile, buffer); } cupsFilePutChar(cupsFileStdout(), '\n'); } else { for (i = 0; i < num_displayed; i ++) { if (i) cupsFilePutChar(cupsFileStdout(), ','); cupsFilePuts(data->outfile, displayed[i]); } cupsFilePutChar(cupsFileStdout(), '\n'); } free(buffer); } /* * 'print_fatal_error()' - Print a fatal error message. */ static void print_fatal_error( _cups_testdata_t *data, /* I - Test data */ const char *s, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { char buffer[10240]; /* Format buffer */ va_list ap; /* Pointer to arguments */ /* * Format the error message... */ va_start(ap, s); vsnprintf(buffer, sizeof(buffer), s, ap); va_end(ap); /* * Then output it... */ if (data->output == _CUPS_OUTPUT_PLIST) { print_xml_header(data); print_xml_trailer(data, 0, buffer); } _cupsLangPrintf(stderr, "ipptool: %s", buffer); } /* * 'print_ippserver_attr()' - Print a attribute suitable for use by ippserver. */ static void print_ippserver_attr( _cups_testdata_t *data, /* I - Test data */ ipp_attribute_t *attr, /* I - Attribute to print */ int indent) /* I - Indentation level */ { int i, /* Looping var */ count = ippGetCount(attr); /* Number of values */ ipp_attribute_t *colattr; /* Collection attribute */ if (indent == 0) cupsFilePrintf(data->outfile, "ATTR %s %s", ippTagString(ippGetValueTag(attr)), ippGetName(attr)); else cupsFilePrintf(data->outfile, "%*sMEMBER %s %s", indent, "", ippTagString(ippGetValueTag(attr)), ippGetName(attr)); switch (ippGetValueTag(attr)) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : for (i = 0; i < count; i ++) cupsFilePrintf(data->outfile, "%s%d", i ? "," : " ", ippGetInteger(attr, i)); break; case IPP_TAG_BOOLEAN : cupsFilePuts(data->outfile, ippGetBoolean(attr, 0) ? " true" : " false"); for (i = 1; i < count; i ++) cupsFilePuts(data->outfile, ippGetBoolean(attr, 1) ? ",true" : ",false"); break; case IPP_TAG_RANGE : for (i = 0; i < count; i ++) { int upper, lower = ippGetRange(attr, i, &upper); cupsFilePrintf(data->outfile, "%s%d-%d", i ? "," : " ", lower, upper); } break; case IPP_TAG_RESOLUTION : for (i = 0; i < count; i ++) { ipp_res_t units; int yres, xres = ippGetResolution(attr, i, &yres, &units); cupsFilePrintf(data->outfile, "%s%dx%d%s", i ? "," : " ", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } break; case IPP_TAG_DATE : for (i = 0; i < count; i ++) cupsFilePrintf(data->outfile, "%s%s", i ? "," : " ", iso_date(ippGetDate(attr, i))); break; case IPP_TAG_STRING : for (i = 0; i < count; i ++) { int len; const char *s = (const char *)ippGetOctetString(attr, i, &len); cupsFilePuts(data->outfile, i ? "," : " "); print_ippserver_string(data, s, (size_t)len); } break; case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_KEYWORD : 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 ++) { const char *s = ippGetString(attr, i, NULL); cupsFilePuts(data->outfile, i ? "," : " "); print_ippserver_string(data, s, strlen(s)); } break; case IPP_TAG_BEGIN_COLLECTION : for (i = 0; i < count; i ++) { ipp_t *col = ippGetCollection(attr, i); cupsFilePuts(data->outfile, i ? ",{\n" : " {\n"); for (colattr = ippFirstAttribute(col); colattr; colattr = ippNextAttribute(col)) print_ippserver_attr(data, colattr, indent + 4); cupsFilePrintf(data->outfile, "%*s}", indent, ""); } break; default : /* Out-of-band value */ break; } cupsFilePuts(data->outfile, "\n"); } /* * 'print_ippserver_string()' - Print a string suitable for use by ippserver. */ static void print_ippserver_string( _cups_testdata_t *data, /* I - Test data */ const char *s, /* I - String to print */ size_t len) /* I - Length of string */ { cupsFilePutChar(data->outfile, '\"'); while (len > 0) { if (*s == '\"') cupsFilePutChar(data->outfile, '\\'); cupsFilePutChar(data->outfile, *s); s ++; len --; } cupsFilePutChar(data->outfile, '\"'); } /* * 'print_line()' - Print a line of formatted or CSV text. */ static void print_line( _cups_testdata_t *data, /* I - Test data */ ipp_t *ipp, /* I - Response message */ ipp_attribute_t *attr, /* I - First attribute for line */ int num_displayed, /* I - Number of attributes to display */ char **displayed, /* I - Attributes to display */ size_t *widths) /* I - Column widths */ { int i; /* Looping var */ size_t maxlength; /* Max length of all columns */ char *buffer; /* String buffer */ ipp_attribute_t *current; /* Current attribute */ /* * Get the maximum string length we have to show and allocate... */ for (i = 1, maxlength = widths[0]; i < num_displayed; i ++) if (widths[i] > maxlength) maxlength = widths[i]; maxlength += 2; if ((buffer = malloc(maxlength)) == NULL) return; /* * Loop through the attributes to display... */ if (attr) { for (i = 0; i < num_displayed; i ++) { if (i) cupsFilePutChar(cupsFileStdout(), ' '); buffer[0] = '\0'; for (current = attr; current; current = ippNextAttribute(ipp)) { if (!ippGetName(current)) break; else if (!strcmp(ippGetName(current), displayed[i])) { ippAttributeString(current, buffer, maxlength); break; } } cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], buffer); } cupsFilePutChar(cupsFileStdout(), '\n'); } else { for (i = 0; i < num_displayed; i ++) { if (i) cupsFilePutChar(cupsFileStdout(), ' '); cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], displayed[i]); } cupsFilePutChar(cupsFileStdout(), '\n'); for (i = 0; i < num_displayed; i ++) { if (i) cupsFilePutChar(cupsFileStdout(), ' '); memset(buffer, '-', widths[i]); buffer[widths[i]] = '\0'; cupsFilePuts(data->outfile, buffer); } cupsFilePutChar(cupsFileStdout(), '\n'); } free(buffer); } /* * 'print_xml_header()' - Print a standard XML plist header. */ static void print_xml_header(_cups_testdata_t *data)/* I - Test data */ { if (!data->xml_header) { cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "ipptoolVersion\n"); cupsFilePuts(data->outfile, "" CUPS_SVERSION "\n"); cupsFilePuts(data->outfile, "Transfer\n"); cupsFilePrintf(data->outfile, "%s\n", data->transfer == _CUPS_TRANSFER_AUTO ? "auto" : data->transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length"); cupsFilePuts(data->outfile, "Tests\n"); cupsFilePuts(data->outfile, "\n"); data->xml_header = 1; } } /* * 'print_xml_string()' - Print an XML string with escaping. */ static void print_xml_string(cups_file_t *outfile, /* I - Test data */ const char *element, /* I - Element name or NULL */ const char *s) /* I - String to print */ { if (element) cupsFilePrintf(outfile, "<%s>", element); while (*s) { if (*s == '&') cupsFilePuts(outfile, "&"); else if (*s == '<') cupsFilePuts(outfile, "<"); else if (*s == '>') cupsFilePuts(outfile, ">"); else if ((*s & 0xe0) == 0xc0) { /* * Validate UTF-8 two-byte sequence... */ if ((s[1] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); s ++; } else { cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s); } } else if ((*s & 0xf0) == 0xe0) { /* * Validate UTF-8 three-byte sequence... */ if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); s += 2; } else { cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s); } } else if ((*s & 0xf8) == 0xf0) { /* * Validate UTF-8 four-byte sequence... */ if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[3] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); s += 3; } else { cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s++); cupsFilePutChar(outfile, *s); } } else if ((*s & 0x80) || (*s < ' ' && !isspace(*s & 255))) { /* * Invalid control character... */ cupsFilePutChar(outfile, '?'); } else cupsFilePutChar(outfile, *s); s ++; } if (element) cupsFilePrintf(outfile, "\n", element); } /* * 'print_xml_trailer()' - Print the XML trailer with success/fail value. */ static void print_xml_trailer( _cups_testdata_t *data, /* I - Test data */ int success, /* I - 1 on success, 0 on failure */ const char *message) /* I - Error message or NULL */ { if (data->xml_header) { cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, success ? "\n" : "\n"); if (message) { cupsFilePuts(data->outfile, "ErrorMessage\n"); print_xml_string(data->outfile, "string", message); } cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); data->xml_header = 0; } } #ifndef _WIN32 /* * 'sigterm_handler()' - Handle SIGINT and SIGTERM. */ static void sigterm_handler(int sig) /* I - Signal number (unused) */ { (void)sig; Cancel = 1; signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); } #endif /* !_WIN32 */ /* * 'timeout_cb()' - Handle HTTP timeouts. */ static int /* O - 1 to continue, 0 to cancel */ timeout_cb(http_t *http, /* I - Connection to server */ void *user_data) /* I - User data (unused) */ { int buffered = 0; /* Bytes buffered but not yet sent */ (void)user_data; /* * If the socket still have data waiting to be sent to the printer (as can * happen if the printer runs out of paper), continue to wait until the output * buffer is empty... */ #ifdef SO_NWRITE /* macOS and some versions of Linux */ socklen_t len = sizeof(buffered); /* Size of return value */ if (getsockopt(httpGetFd(http), SOL_SOCKET, SO_NWRITE, &buffered, &len)) buffered = 0; #elif defined(SIOCOUTQ) /* Others except Windows */ if (ioctl(httpGetFd(http), SIOCOUTQ, &buffered)) buffered = 0; #else /* Windows (not possible) */ (void)http; #endif /* SO_NWRITE */ return (buffered > 0); } /* * 'token_cb()' - Parse test file-specific tokens and run tests. */ static int /* O - 1 to continue, 0 to stop */ token_cb(_ipp_file_t *f, /* I - IPP file data */ _ipp_vars_t *vars, /* I - IPP variables */ _cups_testdata_t *data, /* I - Test data */ const char *token) /* I - Current token */ { char name[1024], /* Name string */ temp[1024], /* Temporary string */ value[1024], /* Value string */ *ptr; /* Pointer into value */ if (!token) { /* * Initialize state as needed (nothing for now...) */ return (1); } else if (f->attrs) { /* * Parse until we see a close brace... */ if (_cups_strcasecmp(token, "COUNT") && _cups_strcasecmp(token, "DEFINE-MATCH") && _cups_strcasecmp(token, "DEFINE-NO-MATCH") && _cups_strcasecmp(token, "DEFINE-VALUE") && _cups_strcasecmp(token, "IF-DEFINED") && _cups_strcasecmp(token, "IF-NOT-DEFINED") && _cups_strcasecmp(token, "IN-GROUP") && _cups_strcasecmp(token, "OF-TYPE") && _cups_strcasecmp(token, "REPEAT-LIMIT") && _cups_strcasecmp(token, "REPEAT-MATCH") && _cups_strcasecmp(token, "REPEAT-NO-MATCH") && _cups_strcasecmp(token, "SAME-COUNT-AS") && _cups_strcasecmp(token, "WITH-ALL-VALUES") && _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") && _cups_strcasecmp(token, "WITH-ALL-RESOURCES") && _cups_strcasecmp(token, "WITH-ALL-SCHEMES") && _cups_strcasecmp(token, "WITH-HOSTNAME") && _cups_strcasecmp(token, "WITH-RESOURCE") && _cups_strcasecmp(token, "WITH-SCHEME") && _cups_strcasecmp(token, "WITH-VALUE") && _cups_strcasecmp(token, "WITH-VALUE-FROM")) data->last_expect = NULL; if (_cups_strcasecmp(token, "DEFINE-MATCH") && _cups_strcasecmp(token, "DEFINE-NO-MATCH") && _cups_strcasecmp(token, "IF-DEFINED") && _cups_strcasecmp(token, "IF-NOT-DEFINED") && _cups_strcasecmp(token, "REPEAT-LIMIT") && _cups_strcasecmp(token, "REPEAT-MATCH") && _cups_strcasecmp(token, "REPEAT-NO-MATCH")) data->last_status = NULL; if (!strcmp(token, "}")) { return (do_test(f, vars, data)); } else if (!strcmp(token, "COMPRESSION")) { /* * COMPRESSION none * COMPRESSION deflate * COMPRESSION gzip */ if (_ippFileReadToken(f, temp, sizeof(temp))) { _ippVarsExpand(vars, data->compression, temp, sizeof(data->compression)); #ifdef HAVE_LIBZ if (strcmp(data->compression, "none") && strcmp(data->compression, "deflate") && strcmp(data->compression, "gzip")) #else if (strcmp(data->compression, "none")) #endif /* HAVE_LIBZ */ { print_fatal_error(data, "Unsupported COMPRESSION value \"%s\" on line %d of \"%s\".", data->compression, f->linenum, f->filename); return (0); } if (!strcmp(data->compression, "none")) data->compression[0] = '\0'; } else { print_fatal_error(data, "Missing COMPRESSION value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "DEFINE")) { /* * DEFINE name value */ if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) { _ippVarsExpand(vars, value, temp, sizeof(value)); _ippVarsSet(vars, name, value); } else { print_fatal_error(data, "Missing DEFINE name and/or value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "IGNORE-ERRORS")) { /* * IGNORE-ERRORS yes * IGNORE-ERRORS no */ if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->ignore_errors = !_cups_strcasecmp(temp, "yes"); } else { print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "NAME")) { /* * Name of test... */ _ippFileReadToken(f, temp, sizeof(temp)); _ippVarsExpand(vars, data->name, temp, sizeof(data->name)); } else if (!_cups_strcasecmp(token, "PAUSE")) { /* * Pause with a message... */ if (_ippFileReadToken(f, temp, sizeof(temp))) { pause_message(temp); } else { print_fatal_error(data, "Missing PAUSE message on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "REQUEST-ID")) { /* * REQUEST-ID # * REQUEST-ID random */ if (_ippFileReadToken(f, temp, sizeof(temp))) { if (isdigit(temp[0] & 255)) { data->request_id = atoi(temp); } else if (!_cups_strcasecmp(temp, "random")) { data->request_id = (CUPS_RAND() % 1000) * 137 + 1; } else { print_fatal_error(data, "Bad REQUEST-ID value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Missing REQUEST-ID value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "SKIP-IF-DEFINED")) { /* * SKIP-IF-DEFINED variable */ if (_ippFileReadToken(f, name, sizeof(name))) { if (_ippVarsGet(vars, name)) data->skip_test = 1; } else { print_fatal_error(data, "Missing SKIP-IF-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "SKIP-IF-MISSING")) { /* * SKIP-IF-MISSING filename */ if (_ippFileReadToken(f, temp, sizeof(temp))) { char filename[1024]; /* Filename */ _ippVarsExpand(vars, value, temp, sizeof(value)); get_filename(f->filename, filename, temp, sizeof(filename)); if (access(filename, R_OK)) data->skip_test = 1; } else { print_fatal_error(data, "Missing SKIP-IF-MISSING filename on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "SKIP-IF-NOT-DEFINED")) { /* * SKIP-IF-NOT-DEFINED variable */ if (_ippFileReadToken(f, name, sizeof(name))) { if (!_ippVarsGet(vars, name)) data->skip_test = 1; } else { print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "SKIP-PREVIOUS-ERROR")) { /* * SKIP-PREVIOUS-ERROR yes * SKIP-PREVIOUS-ERROR no */ if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->skip_previous = !_cups_strcasecmp(temp, "yes"); } else { print_fatal_error(data, "Missing SKIP-PREVIOUS-ERROR value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "TEST-ID")) { /* * TEST-ID "string" */ if (_ippFileReadToken(f, temp, sizeof(temp))) { _ippVarsExpand(vars, data->test_id, temp, sizeof(data->test_id)); } else { print_fatal_error(data, "Missing TEST-ID value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "TRANSFER")) { /* * TRANSFER auto * TRANSFER chunked * TRANSFER length */ if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) { data->transfer = _CUPS_TRANSFER_AUTO; } else if (!strcmp(temp, "chunked")) { data->transfer = _CUPS_TRANSFER_CHUNKED; } else if (!strcmp(temp, "length")) { data->transfer = _CUPS_TRANSFER_LENGTH; } else { print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Missing TRANSFER value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "VERSION")) { if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "0.0")) { data->version = 0; } else if (!strcmp(temp, "1.0")) { data->version = 10; } else if (!strcmp(temp, "1.1")) { data->version = 11; } else if (!strcmp(temp, "2.0")) { data->version = 20; } else if (!strcmp(temp, "2.1")) { data->version = 21; } else if (!strcmp(temp, "2.2")) { data->version = 22; } else { print_fatal_error(data, "Bad VERSION \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Missing VERSION number on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "RESOURCE")) { /* * Resource name... */ if (!_ippFileReadToken(f, data->resource, sizeof(data->resource))) { print_fatal_error(data, "Missing RESOURCE path on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "OPERATION")) { /* * Operation... */ ipp_op_t op; /* Operation code */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing OPERATION code on line %d of \"%s\".", f->linenum, f->filename); return (0); } _ippVarsExpand(vars, value, temp, sizeof(value)); if ((op = ippOpValue(value)) == (ipp_op_t)-1 && (op = (ipp_op_t)strtol(value, NULL, 0)) == 0) { print_fatal_error(data, "Bad OPERATION code \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } ippSetOperation(f->attrs, op); } else if (!_cups_strcasecmp(token, "GROUP")) { /* * Attribute group... */ ipp_tag_t group_tag; /* Group tag */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing GROUP tag on line %d of \"%s\".", f->linenum, f->filename); return (0); } if ((group_tag = ippTagValue(temp)) == IPP_TAG_ZERO || group_tag >= IPP_TAG_UNSUPPORTED_VALUE) { print_fatal_error(data, "Bad GROUP tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } if (group_tag == f->group_tag) ippAddSeparator(f->attrs); f->group_tag = group_tag; } else if (!_cups_strcasecmp(token, "DELAY")) { /* * Delay before operation... */ double dval; /* Delay value */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename); return (0); } _ippVarsExpand(vars, value, temp, sizeof(value)); if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ',')) { print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } data->delay = (useconds_t)(1000000.0 * dval); if (*ptr == ',') { if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr) { print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); return (0); } data->repeat_interval = (useconds_t)(1000000.0 * dval); } else data->repeat_interval = data->delay; } else if (!_cups_strcasecmp(token, "FILE")) { /* * File... */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing FILE filename on line %d of \"%s\".", f->linenum, f->filename); return (0); } _ippVarsExpand(vars, value, temp, sizeof(value)); get_filename(f->filename, data->file, value, sizeof(data->file)); if (access(data->file, R_OK)) { print_fatal_error(data, "Filename \"%s\" (mapped to \"%s\") on line %d of \"%s\" cannot be read.", value, data->file, f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "STATUS")) { /* * Status... */ if (data->num_statuses >= (int)(sizeof(data->statuses) / sizeof(data->statuses[0]))) { print_fatal_error(data, "Too many STATUS's on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing STATUS code on line %d of \"%s\".", f->linenum, f->filename); return (0); } if ((data->statuses[data->num_statuses].status = ippErrorValue(temp)) == (ipp_status_t)-1 && (data->statuses[data->num_statuses].status = (ipp_status_t)strtol(temp, NULL, 0)) == 0) { print_fatal_error(data, "Bad STATUS code \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } data->last_status = data->statuses + data->num_statuses; data->num_statuses ++; data->last_status->define_match = NULL; data->last_status->define_no_match = NULL; data->last_status->if_defined = NULL; data->last_status->if_not_defined = NULL; data->last_status->repeat_limit = 1000; data->last_status->repeat_match = 0; data->last_status->repeat_no_match = 0; } else if (!_cups_strcasecmp(token, "EXPECT") || !_cups_strcasecmp(token, "EXPECT-ALL")) { /* * Expected attributes... */ int expect_all = !_cups_strcasecmp(token, "EXPECT-ALL"); if (data->num_expects >= (int)(sizeof(data->expects) / sizeof(data->expects[0]))) { print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (!_ippFileReadToken(f, name, sizeof(name))) { print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename); return (0); } data->last_expect = data->expects + data->num_expects; data->num_expects ++; memset(data->last_expect, 0, sizeof(_cups_expect_t)); data->last_expect->repeat_limit = 1000; data->last_expect->expect_all = expect_all; if (name[0] == '!') { data->last_expect->not_expect = 1; data->last_expect->name = strdup(name + 1); } else if (name[0] == '?') { data->last_expect->optional = 1; data->last_expect->name = strdup(name + 1); } else data->last_expect->name = strdup(name); } else if (!_cups_strcasecmp(token, "COUNT")) { int count; /* Count value */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename); return (0); } if ((count = atoi(temp)) <= 0) { print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->count = count; } else { print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-MATCH")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->define_match = strdup(temp); } else if (data->last_status) { data->last_status->define_match = strdup(temp); } else { print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->define_no_match = strdup(temp); } else if (data->last_status) { data->last_status->define_no_match = strdup(temp); } else { print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-VALUE")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->define_value = strdup(temp); } else { print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "OF-TYPE")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->of_type = strdup(temp); } else { print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "IN-GROUP")) { ipp_tag_t in_group; /* IN-GROUP value */ if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename); return (0); } if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE) { print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } else if (data->last_expect) { data->last_expect->in_group = in_group; } else { print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "REPEAT-LIMIT")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing REPEAT-LIMIT value on line %d of \"%s\".", f->linenum, f->filename); return (0); } else if (atoi(temp) <= 0) { print_fatal_error(data, "Bad REPEAT-LIMIT value on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_status) { data->last_status->repeat_limit = atoi(temp); } else if (data->last_expect) { data->last_expect->repeat_limit = atoi(temp); } else { print_fatal_error(data, "REPEAT-LIMIT without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "REPEAT-MATCH")) { if (data->last_status) { data->last_status->repeat_match = 1; } else if (data->last_expect) { data->last_expect->repeat_match = 1; } else { print_fatal_error(data, "REPEAT-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "REPEAT-NO-MATCH")) { if (data->last_status) { data->last_status->repeat_no_match = 1; } else if (data->last_expect) { data->last_expect->repeat_no_match = 1; } else { print_fatal_error(data, "REPEAT-NO-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "SAME-COUNT-AS")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing SAME-COUNT-AS name on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->same_count_as = strdup(temp); } else { print_fatal_error(data, "SAME-COUNT-AS without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "IF-DEFINED")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->if_defined = strdup(temp); } else if (data->last_status) { data->last_status->if_defined = strdup(temp); } else { print_fatal_error(data, "IF-DEFINED without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (data->last_expect) { data->last_expect->if_not_defined = strdup(temp); } else if (data->last_status) { data->last_status->if_not_defined = strdup(temp); } else { print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") || !_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME") || !_cups_strcasecmp(token, "WITH-RESOURCE") || !_cups_strcasecmp(token, "WITH-SCHEME") || !_cups_strcasecmp(token, "WITH-VALUE")) { off_t lastpos; /* Last file position */ int lastline; /* Last line number */ if (data->last_expect) { if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME")) data->last_expect->with_flags = _CUPS_WITH_HOSTNAME; else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-RESOURCE")) data->last_expect->with_flags = _CUPS_WITH_RESOURCE; else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-SCHEME")) data->last_expect->with_flags = _CUPS_WITH_SCHEME; if (!_cups_strncasecmp(token, "WITH-ALL-", 9)) data->last_expect->with_flags |= _CUPS_WITH_ALL; } if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } /* * Read additional comma-delimited values - needed since legacy test files * will have unquoted WITH-VALUE values with commas... */ ptr = temp + strlen(temp); for (;;) { lastpos = cupsFileTell(f->fp); lastline = f->linenum; ptr += strlen(ptr); if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; if (!strcmp(ptr, ",")) { /* * Append a value... */ ptr += strlen(ptr); if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; } else { /* * Not another value, stop here... */ cupsFileSeek(f->fp, lastpos); f->linenum = lastline; *ptr = '\0'; break; } } if (data->last_expect) { /* * Expand any variables in the value and then save it. */ _ippVarsExpand(vars, value, temp, sizeof(value)); ptr = value + strlen(value) - 1; if (value[0] == '/' && ptr > value && *ptr == '/') { /* * WITH-VALUE is a POSIX extended regular expression. */ data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); data->last_expect->with_flags |= _CUPS_WITH_REGEX; if (data->last_expect->with_value) memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1)); } else { /* * WITH-VALUE is a literal value... */ for (ptr = value; *ptr; ptr ++) { if (*ptr == '\\' && ptr[1]) { /* * Remove \ from \foo... */ _cups_strcpy(ptr, ptr + 1); } } data->last_expect->with_value = strdup(value); data->last_expect->with_flags |= _CUPS_WITH_LITERAL; } } else { print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "WITH-VALUE-FROM")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } if (data->last_expect) { /* * Expand any variables in the value and then save it. */ _ippVarsExpand(vars, value, temp, sizeof(value)); data->last_expect->with_value_from = strdup(value); data->last_expect->with_flags = _CUPS_WITH_LITERAL; } else { print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } } else if (!_cups_strcasecmp(token, "DISPLAY")) { /* * Display attributes... */ if (data->num_displayed >= (int)(sizeof(data->displayed) / sizeof(data->displayed[0]))) { print_fatal_error(data, "Too many DISPLAY's on line %d of \"%s\".", f->linenum, f->filename); return (0); } if (!_ippFileReadToken(f, temp, sizeof(temp))) { print_fatal_error(data, "Missing DISPLAY name on line %d of \"%s\".", f->linenum, f->filename); return (0); } data->displayed[data->num_displayed] = strdup(temp); data->num_displayed ++; } else { print_fatal_error(data, "Unexpected token %s seen on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } } else { /* * Scan for the start of a test (open brace)... */ if (!strcmp(token, "{")) { /* * Start new test... */ if (data->show_header) { if (data->output == _CUPS_OUTPUT_PLIST) print_xml_header(data); if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename); data->show_header = 0; } data->compression[0] = '\0'; data->delay = 0; data->num_expects = 0; data->last_expect = NULL; data->file[0] = '\0'; data->ignore_errors = data->def_ignore_errors; strlcpy(data->name, f->filename, sizeof(data->name)); if ((ptr = strrchr(data->name, '.')) != NULL) *ptr = '\0'; data->repeat_interval = 5000000; data->request_id ++; strlcpy(data->resource, vars->resource, sizeof(data->resource)); data->skip_previous = 0; data->skip_test = 0; data->num_statuses = 0; data->last_status = NULL; data->test_id[0] = '\0'; data->transfer = data->def_transfer; data->version = data->def_version; _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); f->attrs = ippNew(); f->group_tag = IPP_TAG_ZERO; } else if (!strcmp(token, "DEFINE")) { /* * DEFINE name value */ if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) { _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); _ippVarsExpand(vars, value, temp, sizeof(value)); _ippVarsSet(vars, name, value); } else { print_fatal_error(data, "Missing DEFINE name and/or value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "DEFINE-DEFAULT")) { /* * DEFINE-DEFAULT name value */ if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) { if (!_ippVarsGet(vars, name)) { _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); _ippVarsExpand(vars, value, temp, sizeof(value)); _ippVarsSet(vars, name, value); } } else { print_fatal_error(data, "Missing DEFINE-DEFAULT name and/or value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "FILE-ID")) { /* * FILE-ID "string" */ if (_ippFileReadToken(f, temp, sizeof(temp))) { _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); _ippVarsExpand(vars, data->file_id, temp, sizeof(data->file_id)); } else { print_fatal_error(data, "Missing FILE-ID value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "IGNORE-ERRORS")) { /* * IGNORE-ERRORS yes * IGNORE-ERRORS no */ if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->def_ignore_errors = !_cups_strcasecmp(temp, "yes"); } else { print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "INCLUDE")) { /* * INCLUDE "filename" * INCLUDE */ if (_ippFileReadToken(f, temp, sizeof(temp))) { /* * Map the filename to and then run the tests... */ _cups_testdata_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); inc_data.http = NULL; inc_data.pass = 1; inc_data.prev_pass = 1; inc_data.show_header = 1; if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); } } else { print_fatal_error(data, "Missing INCLUDE filename on line %d of \"%s\".", f->linenum, f->filename); return (0); } data->show_header = 1; } else if (!strcmp(token, "INCLUDE-IF-DEFINED")) { /* * INCLUDE-IF-DEFINED name "filename" * INCLUDE-IF-DEFINED name */ if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) { /* * Map the filename to and then run the tests... */ _cups_testdata_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); inc_data.http = NULL; inc_data.pass = 1; inc_data.prev_pass = 1; inc_data.show_header = 1; if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); } } else { print_fatal_error(data, "Missing INCLUDE-IF-DEFINED name or filename on line %d of \"%s\".", f->linenum, f->filename); return (0); } data->show_header = 1; } else if (!strcmp(token, "INCLUDE-IF-NOT-DEFINED")) { /* * INCLUDE-IF-NOT-DEFINED name "filename" * INCLUDE-IF-NOT-DEFINED name */ if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) { /* * Map the filename to and then run the tests... */ _cups_testdata_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); inc_data.http = NULL; inc_data.pass = 1; inc_data.prev_pass = 1; inc_data.show_header = 1; if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); } } else { print_fatal_error(data, "Missing INCLUDE-IF-NOT-DEFINED name or filename on line %d of \"%s\".", f->linenum, f->filename); return (0); } data->show_header = 1; } else if (!strcmp(token, "SKIP-IF-DEFINED")) { /* * SKIP-IF-DEFINED variable */ if (_ippFileReadToken(f, name, sizeof(name))) { if (_ippVarsGet(vars, name)) data->skip_test = 1; } else { print_fatal_error(data, "Missing SKIP-IF-DEFINED variable on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "SKIP-IF-NOT-DEFINED")) { /* * SKIP-IF-NOT-DEFINED variable */ if (_ippFileReadToken(f, name, sizeof(name))) { if (!_ippVarsGet(vars, name)) data->skip_test = 1; } else { print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED variable on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "STOP-AFTER-INCLUDE-ERROR")) { /* * STOP-AFTER-INCLUDE-ERROR yes * STOP-AFTER-INCLUDE-ERROR no */ if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->stop_after_include_error = !_cups_strcasecmp(temp, "yes"); } else { print_fatal_error(data, "Missing STOP-AFTER-INCLUDE-ERROR value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "TRANSFER")) { /* * TRANSFER auto * TRANSFER chunked * TRANSFER length */ if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) data->def_transfer = _CUPS_TRANSFER_AUTO; else if (!strcmp(temp, "chunked")) data->def_transfer = _CUPS_TRANSFER_CHUNKED; else if (!strcmp(temp, "length")) data->def_transfer = _CUPS_TRANSFER_LENGTH; else { print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Missing TRANSFER value on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else if (!strcmp(token, "VERSION")) { if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "1.0")) data->def_version = 10; else if (!strcmp(temp, "1.1")) data->def_version = 11; else if (!strcmp(temp, "2.0")) data->def_version = 20; else if (!strcmp(temp, "2.1")) data->def_version = 21; else if (!strcmp(temp, "2.2")) data->def_version = 22; else { print_fatal_error(data, "Bad VERSION \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Missing VERSION number on line %d of \"%s\".", f->linenum, f->filename); return (0); } } else { print_fatal_error(data, "Unexpected token %s seen on line %d of \"%s\".", token, f->linenum, f->filename); return (0); } } return (1); } /* * 'usage()' - Show program usage. */ static void usage(void) { _cupsLangPuts(stderr, _("Usage: ipptool [options] URI filename [ ... filenameN ]")); _cupsLangPuts(stderr, _("Options:")); _cupsLangPuts(stderr, _("--ippserver filename Produce ippserver attribute file")); _cupsLangPuts(stderr, _("--stop-after-include-error\n" " Stop tests after a failed INCLUDE")); _cupsLangPuts(stderr, _("--version Show version")); _cupsLangPuts(stderr, _("-4 Connect using IPv4")); _cupsLangPuts(stderr, _("-6 Connect using IPv6")); _cupsLangPuts(stderr, _("-C Send requests using chunking (default)")); _cupsLangPuts(stderr, _("-E Test with encryption using HTTP Upgrade to TLS")); _cupsLangPuts(stderr, _("-I Ignore errors")); _cupsLangPuts(stderr, _("-L Send requests using content-length")); _cupsLangPuts(stderr, _("-P filename.plist Produce XML plist to a file and test report to standard output")); _cupsLangPuts(stderr, _("-S Test with encryption using HTTPS")); _cupsLangPuts(stderr, _("-T seconds Set the receive/send timeout in seconds")); _cupsLangPuts(stderr, _("-V version Set default IPP version")); _cupsLangPuts(stderr, _("-X Produce XML plist instead of plain text")); _cupsLangPuts(stderr, _("-c Produce CSV output")); _cupsLangPuts(stderr, _("-d name=value Set named variable to value")); _cupsLangPuts(stderr, _("-f filename Set default request filename")); _cupsLangPuts(stderr, _("-h Validate HTTP response headers")); _cupsLangPuts(stderr, _("-i seconds Repeat the last file with the given time interval")); _cupsLangPuts(stderr, _("-l Produce plain text output")); _cupsLangPuts(stderr, _("-n count Repeat the last file the given number of times")); _cupsLangPuts(stderr, _("-q Run silently")); _cupsLangPuts(stderr, _("-t Produce a test report")); _cupsLangPuts(stderr, _("-v Be verbose")); exit(1); } /* * 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to the flags. */ static const char * /* O - WITH-xxx string */ with_flags_string(int flags) /* I - WITH flags */ { if (flags & _CUPS_WITH_ALL) { if (flags & _CUPS_WITH_HOSTNAME) return ("WITH-ALL-HOSTNAMES"); else if (flags & _CUPS_WITH_RESOURCE) return ("WITH-ALL-RESOURCES"); else if (flags & _CUPS_WITH_SCHEME) return ("WITH-ALL-SCHEMES"); else return ("WITH-ALL-VALUES"); } else if (flags & _CUPS_WITH_HOSTNAME) return ("WITH-HOSTNAME"); else if (flags & _CUPS_WITH_RESOURCE) return ("WITH-RESOURCE"); else if (flags & _CUPS_WITH_SCHEME) return ("WITH-SCHEME"); else return ("WITH-VALUE"); } /* * 'with_value()' - Test a WITH-VALUE predicate. */ static int /* O - 1 on match, 0 on non-match */ with_value(_cups_testdata_t *data, /* I - Test data */ cups_array_t *errors, /* I - Errors array */ char *value, /* I - Value string */ int flags, /* I - Flags for match */ ipp_attribute_t *attr, /* I - Attribute to compare */ char *matchbuf, /* I - Buffer to hold matching value */ size_t matchlen) /* I - Length of match buffer */ { int i, /* Looping var */ count, /* Number of values */ match; /* Match? */ char temp[1024], /* Temporary value string */ *valptr; /* Pointer into value */ const char *name; /* Attribute name */ *matchbuf = '\0'; match = (flags & _CUPS_WITH_ALL) ? 1 : 0; /* * NULL matches everything. */ if (!value || !*value) return (1); /* * Compare the value string to the attribute value. */ name = ippGetName(attr); count = ippGetCount(attr); switch (ippGetValueTag(attr)) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : for (i = 0; i < count; i ++) { char op, /* Comparison operator */ *nextptr; /* Next pointer */ int intvalue, /* Integer value */ attrvalue = ippGetInteger(attr, i), /* Attribute value */ valmatch = 0; /* Does the current value match? */ valptr = value; while (isspace(*valptr & 255) || isdigit(*valptr & 255) || *valptr == '-' || *valptr == ',' || *valptr == '<' || *valptr == '=' || *valptr == '>') { op = '='; while (*valptr && !isdigit(*valptr & 255) && *valptr != '-') { if (*valptr == '<' || *valptr == '>' || *valptr == '=') op = *valptr; valptr ++; } if (!*valptr) break; intvalue = (int)strtol(valptr, &nextptr, 0); if (nextptr == valptr) break; valptr = nextptr; if ((op == '=' && attrvalue == intvalue) || (op == '<' && attrvalue < intvalue) || (op == '>' && attrvalue > intvalue)) { if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d", attrvalue); valmatch = 1; break; } } if (flags & _CUPS_WITH_ALL) { if (!valmatch) { match = 0; break; } } else if (valmatch) { match = 1; break; } } if (!match && errors) { for (i = 0; i < count; i ++) add_stringf(data->errors, "GOT: %s=%d", name, ippGetInteger(attr, i)); } break; case IPP_TAG_RANGE : for (i = 0; i < count; i ++) { char op, /* Comparison operator */ *nextptr; /* Next pointer */ int intvalue, /* Integer value */ lower, /* Lower range */ upper, /* Upper range */ valmatch = 0; /* Does the current value match? */ lower = ippGetRange(attr, i, &upper); valptr = value; while (isspace(*valptr & 255) || isdigit(*valptr & 255) || *valptr == '-' || *valptr == ',' || *valptr == '<' || *valptr == '=' || *valptr == '>') { op = '='; while (*valptr && !isdigit(*valptr & 255) && *valptr != '-') { if (*valptr == '<' || *valptr == '>' || *valptr == '=') op = *valptr; valptr ++; } if (!*valptr) break; intvalue = (int)strtol(valptr, &nextptr, 0); if (nextptr == valptr) break; valptr = nextptr; if ((op == '=' && (lower == intvalue || upper == intvalue)) || (op == '<' && upper < intvalue) || (op == '>' && upper > intvalue)) { if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d-%d", lower, upper); valmatch = 1; break; } } if (flags & _CUPS_WITH_ALL) { if (!valmatch) { match = 0; break; } } else if (valmatch) { match = 1; break; } } if (!match && errors) { for (i = 0; i < count; i ++) { int lower, upper; /* Range values */ lower = ippGetRange(attr, i, &upper); add_stringf(data->errors, "GOT: %s=%d-%d", name, lower, upper); } } break; case IPP_TAG_BOOLEAN : for (i = 0; i < count; i ++) { if ((!strcmp(value, "true") || !strcmp(value, "1")) == ippGetBoolean(attr, i)) { if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } if (!match && errors) { for (i = 0; i < count; i ++) add_stringf(data->errors, "GOT: %s=%s", name, ippGetBoolean(attr, i) ? "true" : "false"); } break; case IPP_TAG_RESOLUTION : for (i = 0; i < count; i ++) { int xres, yres; /* Resolution values */ ipp_res_t units; /* Resolution units */ xres = ippGetResolution(attr, i, &yres, &units); if (xres == yres) snprintf(temp, sizeof(temp), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else snprintf(temp, sizeof(temp), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); if (!strcmp(value, temp)) { if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } if (!match && errors) { for (i = 0; i < count; i ++) { int xres, yres; /* Resolution values */ ipp_res_t units; /* Resolution units */ xres = ippGetResolution(attr, i, &yres, &units); if (xres == yres) snprintf(temp, sizeof(temp), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else snprintf(temp, sizeof(temp), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); if (strcmp(value, temp)) add_stringf(data->errors, "GOT: %s=%s", name, temp); } } break; case IPP_TAG_NOVALUE : case IPP_TAG_UNKNOWN : return (1); case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : case IPP_TAG_URI : case IPP_TAG_URISCHEME : if (flags & _CUPS_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... */ regex_t re; /* Regular expression */ if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) { regerror(i, &re, temp, sizeof(temp)); print_fatal_error(data, "Unable to compile WITH-VALUE regular expression \"%s\" - %s", value, temp); return (0); } /* * See if ALL of the values match the given regular expression. */ for (i = 0; i < count; i ++) { if (!regexec(&re, get_string(attr, i, flags, temp, sizeof(temp)), 0, NULL, 0)) { if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } regfree(&re); } else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME | _CUPS_WITH_RESOURCE))) { /* * Value is a literal URI string, see if the value(s) match... */ for (i = 0; i < count; i ++) { if (!compare_uris(value, get_string(attr, i, flags, temp, sizeof(temp)))) { if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } } else { /* * Value is a literal string, see if the value(s) match... */ for (i = 0; i < count; i ++) { int result; switch (ippGetValueTag(attr)) { case IPP_TAG_URI : /* * Some URI components are case-sensitive, some not... */ if (flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME)) result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); else result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))); break; case IPP_TAG_MIMETYPE : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : /* * mimeMediaType, nameWithoutLanguage, nameWithLanguage, * textWithoutLanguage, and textWithLanguage are defined to * be case-insensitive strings... */ result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); break; default : /* * Other string syntaxes are defined as lowercased so we use * case-sensitive comparisons to catch problems... */ result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))); break; } if (!result) { if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } } if (!match && errors) { for (i = 0; i < count; i ++) add_stringf(data->errors, "GOT: %s=\"%s\"", name, ippGetString(attr, i, NULL)); } break; case IPP_TAG_STRING : if (flags & _CUPS_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... */ void *adata; /* Pointer to octetString data */ int adatalen; /* Length of octetString */ regex_t re; /* Regular expression */ if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) { regerror(i, &re, temp, sizeof(temp)); print_fatal_error(data, "Unable to compile WITH-VALUE regular expression \"%s\" - %s", value, temp); return (0); } /* * See if ALL of the values match the given regular expression. */ for (i = 0; i < count; i ++) { if ((adata = ippGetOctetString(attr, i, &adatalen)) == NULL || adatalen >= (int)sizeof(temp)) { match = 0; break; } memcpy(temp, adata, (size_t)adatalen); temp[adatalen] = '\0'; if (!regexec(&re, temp, 0, NULL, 0)) { if (!matchbuf[0]) strlcpy(matchbuf, temp, matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } regfree(&re); if (!match && errors) { for (i = 0; i < count; i ++) { adata = ippGetOctetString(attr, i, &adatalen); copy_hex_string(temp, adata, adatalen, sizeof(temp)); add_stringf(data->errors, "GOT: %s=\"%s\"", name, temp); } } } else { /* * Value is a literal or hex-encoded string... */ unsigned char withdata[1023], /* WITH-VALUE data */ *adata; /* Pointer to octetString data */ int withlen, /* Length of WITH-VALUE data */ adatalen; /* Length of octetString */ if (*value == '<') { /* * Grab hex-encoded value... */ if ((withlen = (int)strlen(value)) & 1 || withlen > (int)(2 * (sizeof(withdata) + 1))) { print_fatal_error(data, "Bad WITH-VALUE hex value."); return (0); } withlen = withlen / 2 - 1; for (valptr = value + 1, adata = withdata; *valptr; valptr += 2) { int ch; /* Current character/byte */ if (isdigit(valptr[0])) ch = (valptr[0] - '0') << 4; else if (isalpha(valptr[0])) ch = (tolower(valptr[0]) - 'a' + 10) << 4; else break; if (isdigit(valptr[1])) ch |= valptr[1] - '0'; else if (isalpha(valptr[1])) ch |= tolower(valptr[1]) - 'a' + 10; else break; *adata++ = (unsigned char)ch; } if (*valptr) { print_fatal_error(data, "Bad WITH-VALUE hex value."); return (0); } } else { /* * Copy literal string value... */ withlen = (int)strlen(value); memcpy(withdata, value, (size_t)withlen); } for (i = 0; i < count; i ++) { adata = ippGetOctetString(attr, i, &adatalen); if (withlen == adatalen && !memcmp(withdata, adata, (size_t)withlen)) { if (!matchbuf[0]) copy_hex_string(matchbuf, adata, adatalen, matchlen); if (!(flags & _CUPS_WITH_ALL)) { match = 1; break; } } else if (flags & _CUPS_WITH_ALL) { match = 0; break; } } if (!match && errors) { for (i = 0; i < count; i ++) { adata = ippGetOctetString(attr, i, &adatalen); copy_hex_string(temp, adata, adatalen, sizeof(temp)); add_stringf(data->errors, "GOT: %s=\"%s\"", name, temp); } } } break; default : break; } return (match); } /* * 'with_value_from()' - Test a WITH-VALUE-FROM predicate. */ static int /* O - 1 on match, 0 on non-match */ with_value_from( cups_array_t *errors, /* I - Errors array */ ipp_attribute_t *fromattr, /* I - "From" attribute */ ipp_attribute_t *attr, /* I - Attribute to compare */ char *matchbuf, /* I - Buffer to hold matching value */ size_t matchlen) /* I - Length of match buffer */ { int i, j, /* Looping vars */ count = ippGetCount(attr), /* Number of attribute values */ match = 1; /* Match? */ *matchbuf = '\0'; /* * Compare the from value(s) to the attribute value(s)... */ switch (ippGetValueTag(attr)) { case IPP_TAG_INTEGER : if (ippGetValueTag(fromattr) != IPP_TAG_INTEGER && ippGetValueTag(fromattr) != IPP_TAG_RANGE) goto wrong_value_tag; for (i = 0; i < count; i ++) { int value = ippGetInteger(attr, i); /* Current integer value */ if (ippContainsInteger(fromattr, value)) { if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d", value); } else { add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value); match = 0; } } break; case IPP_TAG_ENUM : if (ippGetValueTag(fromattr) != IPP_TAG_ENUM) goto wrong_value_tag; for (i = 0; i < count; i ++) { int value = ippGetInteger(attr, i); /* Current integer value */ if (ippContainsInteger(fromattr, value)) { if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d", value); } else { add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value); match = 0; } } break; case IPP_TAG_RESOLUTION : if (ippGetValueTag(fromattr) != IPP_TAG_RESOLUTION) goto wrong_value_tag; for (i = 0; i < count; i ++) { int xres, yres; ipp_res_t units; int fromcount = ippGetCount(fromattr); int fromxres, fromyres; ipp_res_t fromunits; xres = ippGetResolution(attr, i, &yres, &units); for (j = 0; j < fromcount; j ++) { fromxres = ippGetResolution(fromattr, j, &fromyres, &fromunits); if (fromxres == xres && fromyres == yres && fromunits == units) break; } if (j < fromcount) { if (!matchbuf[0]) { if (xres == yres) snprintf(matchbuf, matchlen, "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else snprintf(matchbuf, matchlen, "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } } else { if (xres == yres) add_stringf(errors, "GOT: %s=%d%s", ippGetName(attr), xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else add_stringf(errors, "GOT: %s=%dx%d%s", ippGetName(attr), xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); match = 0; } } break; case IPP_TAG_NOVALUE : case IPP_TAG_UNKNOWN : return (1); case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : case IPP_TAG_NAME : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : case IPP_TAG_URISCHEME : for (i = 0; i < count; i ++) { const char *value = ippGetString(attr, i, NULL); /* Current string value */ if (ippContainsString(fromattr, value)) { if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); } else { add_stringf(errors, "GOT: %s='%s'", ippGetName(attr), value); match = 0; } } break; case IPP_TAG_URI : for (i = 0; i < count; i ++) { const char *value = ippGetString(attr, i, NULL); /* Current string value */ int fromcount = ippGetCount(fromattr); for (j = 0; j < fromcount; j ++) { if (!compare_uris(value, ippGetString(fromattr, j, NULL))) { if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); break; } } if (j >= fromcount) { add_stringf(errors, "GOT: %s='%s'", ippGetName(attr), value); match = 0; } } break; default : match = 0; break; } return (match); /* value tag mismatch between fromattr and attr */ wrong_value_tag : add_stringf(errors, "GOT: %s OF-TYPE %s", ippGetName(attr), ippTagString(ippGetValueTag(attr))); return (0); } cups-2.3.1/tools/printer.png000664 000765 000024 00000011305 13574721672 016130 0ustar00mikestaff000000 000000 PNG  IHDR>aIDATxD,Q%EHdB(($)P)TPQP( 2v۾m~9 ۻF\T*d觀n(a;*Yvo.6`[*sn~ ۥJ[??oݪIu:VYp$yJf>??eg|X^^f~~sR~0#_uhssSl[[[*ɉ555m_;=<rss9Ąͭ3nmeee5Ծz11333b31hhh毮Z]]czzZ׌'E\ܱuckQ5bTVV1>>jN⮡&<: w!"mkk _Oq[8w,<XYY$\@gggV=:,jXL D|yD~-o]X^%oW8==C);_t-{a Lt_v@#& @QDT )P.#! Rt-<<,ooΜ9<#GϜaZi q:eH9AE2Vq{{wwwb)2\]]أVi)2 ((T+4/J:Ar$sBe-AGP"B$]w:2+ 2ZI):;;@]e %ޣ ^>?9a?Mek2Hd=䃀X?Y+h>'M O`xC|[kDIo?ps #hyJ~qFd?`#|蓵"h@l>/XU TPSHP`m)A$hUCZa)! 􏌌>Zke)[̿V,*{`MZ@W݁a]r%߀h SO= l*ZΧ{|'a`>FZ>W_vuW?{`Q,@w.@c>iz [ع/pĊ-$h=+X'T$Тvۍ= h\;0BsgTYwK?ܣ,81$_vevla(;憇LU*o6zGNa/&Τa +ˇA` }G;QIsN qs6p/gq/@. iA!;zp4m BلsLx$p>r H3AڮMۺ!hIע< _ScX(A' \xEqe3 gppX(\ iTW'O /V@JA픕-!o_DAd˿gb>ѝ 1 D:n ґL@k|pO@ E!˼maܦN9Uo}8ˁn y"/xYn9 ícuٰ IENDB`cups-2.3.1/tools/printer-png.h000664 000765 000024 00000060623 13574721672 016364 0ustar00mikestaff000000 000000 static const unsigned char printer_png[] = { 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x08,0x06,0x00,0x00,0x00,0xc3,0x3e,0x61, 0xcb,0x00,0x00,0x12,0x8c,0x49,0x44,0x41,0x54,0x78,0x01,0xec,0xd5,0x01,0x44,0x2c, 0x51,0x14,0xc6,0xf1,0xcf,0x06,0x10,0x25,0x45,0xa9,0x01,0x12,0x48,0x02,0x01,0x10, 0x64,0x42,0x28,0x28,0x03,0xa1,0x24,0x01,0xc5,0x14,0x04,0x29,0x50,0x29,0x54,0x01, 0x50,0x51,0xa0,0xc8,0xc0,0x50,0xa1,0x28,0x80,0x0a,0x02,0x01,0xad,0x10,0xb2,0xc4, 0x32,0xbb,0xcb,0xff,0xed,0xbb,0x76,0xc7,0x1a,0xdb,0xbe,0x17,0xc0,0x6d,0x7e,0x1c, 0xec,0x39,0xe3,0x0c,0xf7,0xdb,0xbb,0xab,0x46,0x00,0x07,0xf0,0x81,0x10,0xc8,0x02, 0x11,0x16,0xb0,0x5c,0x54,0xc9,0x2a,0xac,0x64,0xe7,0xe8,0xa7,0x80,0x6e,0xe0,0x18, 0x28,0x61,0x3b,0xfb,0x95,0x2a,0x59,0x76,0xff,0x6f,0xf8,0x2e,0x90,0xc3,0x36,0xa9, 0x1c,0xe0,0xaa,0x11,0x60,0xce,0xea,0x5b,0x9f,0x2a,0x01,0x73,0x8d,0x6e,0x7e,0x09, 0xdb,0xa5,0x4a,0x80,0x5b,0xef,0x3f,0x3f,0xc7,0x6f,0x91,0xca,0x01,0xdd,0xaa,0x02, 0x8e,0x49,0x18,0x1c,0x1c,0xa4,0xa7,0xa7,0x87,0xf5,0xf5,0x75,0xac,0x94,0x3a,0x56, 0x59,0x06,0x70,0x24,0x79,0x4a,0xc8,0x66,0xb3,0xa6,0x3e,0x3f,0x3f,0x65,0xa5,0x94, 0x67,0xb2,0x07,0x7c,0xea,0x58,0x5e,0x5e,0x66,0x7e,0x7e,0x9e,0xf3,0xf3,0x73,0x52, 0xd6,0xf2,0x05,0x84,0xa4,0x7e,0xab,0x30,0x23,0xa9,0x5f,0x75,0x1c,0x1c,0x1c,0x68, 0x73,0x73,0x53,0xb7,0xb7,0xb7,0xaa,0xf5,0xfc,0xfc,0x6c,0xfa,0x5b,0x5b,0x5b,0x2a, 0x16,0x8b,0xfa,0xf8,0xf8,0xd0,0xc9,0xc9,0x89,0xa6,0xa7,0xa7,0x35,0x35,0x35,0xa5, 0xed,0xed,0x6d,0xbd,0xbf,0xbf,0xeb,0x5f,0x3b,0x01,0x3d,0x3c,0x3c,0x68,0x6d,0x6d, 0x4d,0x63,0x63,0x63,0x5a,0x5a,0x5a,0x52,0x10,0x04,0x6a,0xe4,0xed,0xed,0x4d,0xbb, 0xbb,0xbb,0xf2,0x3c,0x4f,0x13,0x13,0x13,0xda,0xd8,0xd8,0xd0,0xeb,0xeb,0xab,0x6a, 0xed,0xed,0xed,0x99,0x77,0x5c,0x5d,0x5d,0xe9,0x3b,0x37,0x37,0x37,0xe6,0x99,0xa3, 0xa3,0x23,0x25,0x5d,0x5e,0x5e,0xca,0xf7,0x7d,0x8d,0x8e,0x8e,0x6a,0x61,0x61,0x41, 0xa7,0xa7,0xa7,0x02,0x64,0xa9,0x7e,0x01,0x11,0x75,0xb4,0xb7,0xb7,0x23,0x89,0xc5, 0xc5,0x45,0x6a,0xed,0xef,0xef,0x23,0xc9,0xd4,0xd3,0xd3,0x13,0x9d,0x9d,0x9d,0x48, 0xaa,0x2d,0xd3,0x2b,0x87,0xdb,0x70,0xe7,0xca,0xca,0x0a,0x92,0x48,0xd6,0xec,0xec, 0x2c,0x85,0x42,0x81,0xa4,0x30,0x0c,0x69,0x6b,0x6b,0x23,0xf9,0x7c,0x4b,0x4b,0x8b, 0x99,0x55,0xb9,0xae,0x6b,0xfa,0xbd,0xbd,0xbd,0x7c,0xa7,0xaf,0xaf,0x0f,0x49,0x94, 0x03,0xa6,0xea,0xeb,0xeb,0x8b,0xc9,0xc9,0x49,0xd3,0x4f,0xd6,0xf8,0xf8,0x38,0xf9, 0x7c,0x1e,0x0b,0x45,0x22,0xf6,0xf3,0x2f,0x40,0x57,0x57,0x17,0x99,0x4c,0x86,0xa1, 0xa1,0x21,0x73,0x98,0xc3,0xc3,0xc3,0xf1,0xcc,0x71,0x1c,0xa2,0x28,0xaa,0xbb,0xb3, 0xb5,0xb5,0x15,0x49,0x7f,0x3f,0x9b,0x43,0x9f,0x99,0x99,0xa9,0xce,0x4c,0x1d,0x1e, 0x1e,0x52,0xeb,0xe5,0xe5,0x85,0xa6,0xa6,0x26,0x33,0x1b,0x19,0x19,0x21,0x08,0x02, 0x2e,0x2e,0x2e,0x18,0x18,0x18,0x30,0xbd,0x8e,0x8e,0x8e,0x38,0xa0,0xb3,0xb3,0xb3, 0x78,0xcf,0xfd,0xfd,0x3d,0x49,0x77,0x77,0x77,0xf1,0xfc,0xf1,0xf1,0x91,0x2a,0xcf, 0xf3,0x4c,0xaf,0xb9,0xb9,0x99,0x9d,0x9d,0x1d,0xae,0xaf,0xaf,0x59,0x5d,0x5d,0x8d, 0xdf,0x5b,0xfe,0xc5,0xc3,0x46,0x7f,0xd8,0x33,0x03,0x8f,0xda,0x82,0x20,0x8c,0x7f, 0x3d,0xb7,0xaa,0x22,0x88,0x50,0x54,0x49,0x52,0x10,0x08,0x55,0x55,0x10,0x08,0x22, 0x80,0x0a,0xa8,0xa0,0x84,0x82,0x42,0xe8,0x9f,0xa8,0x92,0x84,0x90,0x00,0xa9,0x28, 0x54,0x14,0x92,0x84,0x40,0x44,0x29,0x52,0xa9,0x54,0x29,0x85,0x6a,0xde,0x67,0x98, 0x63,0x9d,0xb7,0x75,0xea,0x7a,0x91,0xea,0xc7,0x70,0xdf,0xee,0xdb,0xdd,0x75,0x76, 0x76,0x67,0xbe,0x29,0x6e,0x07,0xb0,0xdb,0xb7,0xb8,0xb8,0x28,0x0e,0xea,0x08,0xd6, 0x3f,0x3a,0x3a,0xea,0x9b,0x53,0xad,0xb9,0xb9,0x59,0xee,0xef,0xef,0xc5,0xd8,0xdb, 0xdb,0x93,0x8c,0x8c,0x8c,0xc0,0x79,0x18,0x5e,0xc4,0x68,0x6c,0x6c,0xd4,0xf6,0xd2, 0xd2,0x52,0x79,0x7a,0x7a,0x12,0x83,0xa1,0x46,0x92,0x92,0x92,0xb4,0x8f,0xe1,0x45, 0xdb,0x1e,0x1e,0x1e,0x74,0x5f,0x00,0xa4,0xb3,0xb3,0x53,0xc2,0x30,0x54,0x69,0x5f, 0x79,0x79,0xb9,0x18,0x9b,0x9b,0x9b,0x92,0x90,0x90,0x20,0x00,0xd4,0x81,0x5c,0xba, 0xba,0xba,0xcc,0xd9,0x6d,0x4f,0xc6,0xaf,0x03,0x6c,0x6f,0x6f,0x4b,0x98,0xe3,0xe3, 0xe3,0xe0,0xd6,0xb4,0xb4,0xb4,0x78,0xe7,0x6c,0x6a,0x6a,0x92,0x97,0x97,0x17,0x09, 0xa1,0xaa,0xc3,0xe6,0x66,0x6c,0xd7,0xb6,0xf3,0xf3,0xf3,0xa0,0x8d,0xf9,0x85,0x84, 0xa9,0xaa,0xaa,0xd2,0xbe,0xb6,0xb6,0x36,0x31,0x3a,0x3a,0x3a,0x82,0x97,0xe6,0xf1, 0xf1,0x51,0x8c,0x9b,0x9b,0x1b,0x49,0x4b,0x4b,0xd3,0xbe,0xb1,0xb1,0xb1,0xf0,0x21, 0xab,0x03,0x86,0xf7,0xc5,0x5c,0x22,0x58,0x7f,0x7f,0x7f,0xdf,0xe9,0xf9,0x75,0x00, 0xfd,0xa0,0x3e,0x72,0x73,0x73,0xb5,0x9f,0x87,0x13,0x39,0xa7,0xcb,0xc4,0xc4,0x84, 0xcd,0xad,0x1f,0x9e,0xe8,0x33,0x6e,0x6d,0x65,0x65,0x65,0xc2,0xe4,0xcf,0x35,0xc9, 0xcc,0xcc,0xd4,0xbe,0xfa,0xfa,0x7a,0x31,0xdc,0x31,0x33,0x33,0x33,0x62,0x8c,0x8c, 0x8c,0xd8,0x33,0xaf,0x31,0xdf,0x68,0x68,0x68,0xd0,0xf6,0xc4,0xc4,0xc4,0x7f,0xe6, 0xaf,0xae,0xae,0x0e,0xe6,0x5a,0x5d,0x5d,0x15,0x63,0x7a,0x7a,0x5a,0xd7,0x8c,0xb2, 0x9e,0x9e,0x1e,0xf9,0xca,0xfc,0xc1,0x27,0xc0,0x83,0x06,0xc1,0xc5,0xc5,0x45,0x5c, 0xe3,0xdc,0xb1,0xbc,0x75,0xae,0x02,0x01,0x63,0xbf,0x6b,0xb8,0xbc,0xbc,0x04,0x51, 0x35,0x62,0x54,0x56,0x56,0xa2,0xa8,0xa8,0x08,0xc4,0xcd,0xf4,0x31,0x3e,0x3e,0x0e, 0xa2,0x6a,0x85,0x4e,0x00,0xe2,0xae,0xa1,0xaa,0x26,0x3c,0xff,0xfa,0xfa,0x3a,0x0c, 0x77,0x8d,0x83,0x83,0x03,0xd0,0x21,0x22,0x6d,0x6b,0x6b,0x0b,0x5f,0x99,0x4f,0x71, 0x80,0xdb,0xdb,0x5b,0x10,0xb0,0x94,0x1c,0xd7,0x38,0x77,0x2c,0x13,0x3c,0x18,0x94, 0x8c,0x58,0x59,0x59,0xf1,0xda,0xe4,0xe4,0x24,0x5c,0x18,0x12,0x40,0xc0,0x1c,0x05, 0x67,0x67,0x67,0xea,0x3c,0x76,0x18,0xed,0xed,0xed,0x30,0xdc,0x35,0x0a,0x0a,0x0a, 0xbc,0x73,0x9b,0xf1,0x46,0x83,0xd8,0x1c,0x3a,0x67,0x84,0xa9,0x44,0xfe,0xca,0xc4, 0xf0,0x9f,0x61,0x92,0x86,0x93,0x93,0x93,0xe0,0x83,0x7e,0x84,0xa3,0xa3,0x23,0x18, 0x36,0x96,0x89,0x1f,0x0c,0x11,0xb1,0x43,0x88,0xa4,0xb5,0xb5,0x15,0x83,0x83,0x83, 0xba,0x1f,0x6a,0x79,0xbd,0xb1,0x04,0x54,0x0e,0xa0,0x6a,0x81,0x61,0x6b,0x6c,0x6c, 0x6c,0xe8,0xbe,0x2b,0x2a,0x2a,0x90,0x9c,0x9c,0x8c,0x28,0x18,0x7a,0xd4,0xe2,0xe0, 0xfb,0xbc,0x00,0xd4,0xeb,0x08,0x33,0x3f,0x3f,0x0f,0x66,0xf7,0x20,0x60,0x0e,0x10, 0x3d,0xce,0x81,0xf1,0x3a,0x38,0xfc,0xec,0xec,0x6c,0x80,0x50,0x11,0x20,0x3f,0x3f, 0x1f,0x20,0xc3,0xc3,0xc3,0xb8,0xbe,0xbe,0xc6,0x7b,0xc8,0xcb,0xcb,0x03,0x65,0x29, 0x40,0x98,0xf0,0x61,0x6a,0x6a,0xca,0x77,0xfb,0x95,0x9a,0x9a,0x1a,0x80,0x30,0x61, 0x04,0x25,0x20,0xe2,0xe0,0x67,0x3a,0x40,0x6d,0x6d,0xad,0x1b,0xe3,0xb4,0x52,0xc7, 0x02,0x0f,0x88,0x1e,0x1a,0x55,0x00,0x7c,0x30,0x19,0x43,0x7f,0x7f,0xbf,0xeb,0x08, 0x5a,0x99,0x63,0x61,0x09,0x20,0x03,0x03,0x03,0xa0,0x2c,0x83,0x5b,0xdd,0x23,0xfa, 0x94,0xb3,0x28,0x83,0xc3,0xc3,0x43,0x18,0xcf,0xcf,0xcf,0x3a,0x6e,0x69,0x69,0x09, 0x61,0x28,0xf9,0x00,0xb2,0xbb,0xbb,0x8b,0xab,0xab,0x2b,0xa4,0xa6,0xa6,0xfa,0xf6, 0xa4,0xe1,0x82,0xb2,0x10,0x20,0x43,0x43,0x43,0xea,0x30,0x22,0x02,0x83,0x4a,0x04, 0x73,0x73,0x73,0xfa,0x42,0x7c,0x3b,0xe2,0x55,0x01,0xae,0x15,0x17,0x17,0x0b,0x6f, 0x91,0xa4,0xa7,0xa7,0xeb,0xbf,0xf9,0x84,0xca,0xec,0xec,0xec,0x6b,0x73,0x9a,0x69, 0x36,0x5e,0x57,0x57,0xa7,0x55,0x3b,0x6b,0xa3,0x53,0x79,0x2b,0x81,0xdd,0xdd,0xdd, 0xc1,0xff,0xa1,0xf6,0x57,0x45,0xc0,0xa7,0xdc,0xd6,0xd4,0xdf,0x61,0xee,0xee,0xee, 0x74,0x0d,0x00,0x8e,0x54,0xf4,0xb3,0xb3,0xb3,0x23,0x39,0x39,0x39,0x6e,0x91,0x4b, 0x55,0x4c,0x61,0x61,0x61,0xd0,0xb6,0xb0,0xb0,0xf0,0x73,0x64,0x60,0x56,0x56,0x96, 0x00,0x90,0xde,0xde,0xde,0x57,0x1d,0x60,0x79,0x79,0x59,0x4a,0x4a,0x4a,0xdc,0x43, 0xd5,0x0f,0xc6,0xcc,0xf9,0x2d,0xa7,0x52,0xdd,0xdd,0xd7,0xd7,0x27,0x29,0x29,0x29, 0xc1,0x38,0xfe,0x16,0x3e,0xcf,0x56,0x3d,0xf4,0xc2,0x3a,0xbd,0xeb,0x2c,0x6a,0xb1, 0x58,0x4c,0x0b,0x44,0x7c,0x79,0x44,0xf1,0x17,0x7e,0xd4,0xd6,0xd6,0xd6,0xe4,0x2d, 0xf8,0xa7,0x6f,0xad,0x5d,0x58,0xad,0xc0,0x8c,0xb1,0x5e,0x25,0x1d,0x93,0xba,0x6f, 0xea,0x00,0x1f,0xc0,0x57,0x07,0x38,0x3d,0x3d,0xd5,0x43,0xe7,0x13,0x29,0xca,0x3b, 0x5f,0x15,0xde,0x74,0x2d,0xc7,0xd2,0xf4,0xf7,0x7b,0x61,0x1e,0x20,0x4c,0xda,0x74, 0xdc,0x5f,0x76,0xce,0x40,0x23,0xde,0x26,0x0a,0xe3,0x07,0xdd,0x40,0xd7,0x51,0xa1, 0x44,0x00,0x54,0x20,0x29,0x50,0x04,0xd0,0x05,0xa4,0x1b,0x88,0x80,0x82,0xa8,0x00, 0xba,0x82,0x84,0x2e,0x23,0x21,0x20,0x52,0x74,0x2d,0xf3,0xfd,0x3c,0x3c,0x2c,0x8d, 0xf5,0x1d,0xbb,0xfd,0x8d,0xed,0xfc,0x18,0x6f,0x6f,0xb3,0xdb,0xf6,0xce,0x9c,0x9d, 0x99,0x39,0xe7,0x3c,0x23,0x47,0xcf,0x9c,0x61,0x5a,0x69,0x9f,0x9f,0x9f,0x0d,0x83, 0x91,0xb7,0x71,0x3a,0x65,0x00,0xd3,0x48,0x39,0x82,0x8a,0xa1,0x1d,0x41,0x45,0xed, 0x02,0x8a,0x32,0x00,0x56,0xed,0x71,0x7b,0x7b,0x1b,0x77,0x77,0x77,0xc1,0x62,0x29, 0x32,0x5c,0x5d,0x5d,0xe9,0xbd,0xf8,0xd8,0xa3,0x18,0x84,0x56,0xfc,0x69,0xa2,0xf5, 0x29,0xca,0x00,0x8a,0x32,0x80,0xa2,0x0c,0xa0,0x28,0x03,0x28,0xca,0x11,0x54,0xac, 0xaf,0xaf,0x2b,0x34,0x8d,0x16,0xe1,0x2f,0xfa,0x01,0x8a,0xdf,0xd4,0x4a,0x92,0x88, 0x3a,0xba,0x01,0x14,0xa7,0xa7,0xa7,0x41,0xd6,0x72,0x90,0x24,0x1a,0x73,0x42,0x0e, 0xb1,0xe5,0xe5,0x65,0xe5,0x2d,0xfc,0x41,0x47,0x50,0xb1,0xb2,0xb2,0xd2,0x22,0x42, 0xa2,0x94,0x24,0xb5,0x06,0x98,0x5d,0x77,0xd8,0xd7,0x3a,0x32,0xcc,0x2b,0xf5,0x0c, 0xe1,0x8a,0x32,0x97,0xb2,0x5a,0x49,0x84,0x29,0xca,0x1e,0x3a,0x3b,0x3b,0x8b,0xc3, 0xc3,0xc3,0x40,0x5d,0xe4,0xcc,0x65,0xe1,0x0c,0x25,0xde,0xa3,0x0c,0xa7,0x80,0xf7, 0xf7,0xf7,0xe0,0x5e,0xe5,0xfe,0xfe,0x3e,0xaf,0x89,0xcc,0x3f,0xcf,0xe2,0x8d,0x00, 0x39,0xdd,0x61,0x3f,0xbc,0x4d,0x8e,0x81,0x65,0x6b,0xd6,0x0e,0xa6,0x32,0xa4,0x48, 0x3c,0x6d,0x9b,0x9b,0x9b,0xbe,0x9f,0xcc,0x2e,0x92,0xc0,0xc5,0x90,0x9f,0xd8,0xfd, 0xff,0x9c,0x25,0x95,0xd7,0x44,0xe6,0x9f,0xc7,0x2c,0x9c,0x01,0x24,0x75,0x87,0x6e, 0x30,0x6b,0x0c,0x2d,0x40,0x51,0x63,0xd1,0x51,0x09,0x03,0x90,0x20,0xd5,0x1d,0x2e, 0x63,0x5b,0x5d,0x5d,0x75,0x9d,0x32,0xa0,0xcc,0xc7,0xc7,0x47,0xbb,0xbe,0xbe,0xf6, 0xdf,0x6c,0x6b,0x6b,0x6b,0xba,0xa7,0x34,0x82,0x65,0x69,0x4d,0x64,0xe2,0x79,0x16, 0xdb,0x00,0x12,0xba,0xc3,0x5e,0x83,0x49,0xe8,0xfa,0xfc,0xfc,0x3c,0x53,0x8e,0x24, 0xd3,0x8d,0x32,0x8a,0x40,0x57,0xe7,0x24,0x92,0xa1,0x9c,0x5e,0x03,0x24,0x34,0x91, 0x89,0xe7,0x59,0x70,0x3f,0x00,0xba,0xc3,0x78,0x7a,0x7a,0x72,0xa8,0x5a,0xf0,0xcd, 0xd4,0xfc,0xe9,0xf9,0x54,0x59,0xc5,0x1d,0x98,0x37,0xf5,0xfe,0x59,0x76,0x0a,0x37, 0x37,0x37,0x41,0xc3,0x07,0xe8,0xba,0xb1,0xb1,0x11,0xa0,0x75,0x40,0x06,0x94,0x51, 0x4a,0xb1,0xf7,0xdf,0x65,0x24,0x08,0xc3,0x08,0xe3,0x2c,0xe6,0x78,0x7d,0x7d,0x0d, 0x48,0x3c,0xcf,0x82,0x6f,0x03,0xd1,0x14,0x38,0xa5,0xdc,0x08,0x8b,0x41,0x2c,0xeb, 0xea,0xc1,0xb0,0x1d,0x33,0xa0,0xce,0x37,0x86,0xb3,0x12,0x22,0x0d,0x7c,0x7d,0x7d, 0x85,0x41,0x5d,0xa4,0x45,0xdc,0x64,0x61,0x21,0xf9,0x43,0x4c,0x93,0x7e,0x1e,0x58, 0x8a,0x45,0x23,0xa1,0x3b,0x9c,0x37,0xfa,0xe6,0xcf,0x4e,0x4f,0x13,0xa9,0xd2,0x43, 0x7a,0xc5,0x72,0x04,0xe5,0x75,0x87,0xa3,0x93,0xd3,0x44,0x4e,0xa1,0x46,0x80,0xbe, 0xee,0x70,0x24,0xac,0x42,0x32,0x79,0x4d,0x64,0x8d,0x00,0x69,0xdd,0xe1,0x08,0x78, 0x61,0xf7,0xfd,0xfd,0x1d,0x06,0xf2,0x9a,0xc8,0x32,0x80,0xbc,0xee,0x70,0x00,0xb4, 0x3b,0x09,0x78,0x7b,0x7b,0xeb,0xcc,0xe5,0x09,0x4d,0xe4,0xe0,0x06,0xa0,0x68,0xd7, 0xe3,0xe3,0xa3,0x24,0xdb,0x7b,0x7b,0x7b,0xe1,0xc2,0x89,0x5e,0x81,0x83,0x23,0x76, 0x76,0x76,0x54,0x76,0x77,0x77,0x55,0xf8,0x9d,0x5c,0xb8,0x47,0x47,0x47,0x0a,0x94, 0x70,0xca,0x46,0x5c,0x5e,0x5e,0x06,0x7b,0xdc,0x60,0x5f,0x1b,0x34,0x98,0xc4,0x9e, 0x1d,0xd4,0x30,0x38,0x54,0x24,0xdd,0x66,0xd8,0xd4,0x41,0x11,0x78,0x06,0x2d,0x66, 0xd5,0xdf,0x1b,0x04,0x3d,0xa3,0xff,0x67,0x9c,0x46,0xc1,0xbd,0x5c,0xc8,0x66,0x7f, 0x7f,0x3f,0xd0,0x44,0x06,0xe8,0xb0,0x09,0x4e,0x37,0x0b,0x8e,0xf0,0x8d,0xad,0xad, 0xad,0xc0,0x13,0xa8,0x10,0xf5,0xc5,0xc5,0xc5,0x98,0xc1,0x20,0x3a,0xbd,0xe1,0x37, 0x97,0x53,0x86,0x8e,0x68,0x9c,0xbb,0xa7,0x42,0xa7,0xfb,0xda,0x2d,0xae,0x9b,0xf6, 0x7a,0x4e,0x00,0x91,0x63,0x85,0x86,0xd3,0xe7,0xcc,0xa0,0x3b,0x94,0x67,0xd0,0xaf, 0x63,0xa1,0xd8,0xfe,0x97,0x56,0x32,0xf1,0xfe,0x93,0x93,0x13,0xd5,0xd1,0x71,0xad, 0x07,0x1d,0x68,0x51,0xaa,0x0a,0x9d,0x9b,0xd6,0x44,0xe6,0x9f,0x47,0x88,0xf8,0x8d, 0x8e,0xe7,0xdb,0xd9,0x8e,0x8f,0x8f,0x1b,0xdf,0x6a,0x79,0xb3,0x26,0x0b,0x56,0xed, 0xeb,0xe4,0xcf,0xbd,0xfa,0x1f,0x85,0x50,0xac,0x3a,0x1f,0xa3,0x52,0x21,0xf0,0x22, 0x0f,0x19,0x9f,0x99,0xd0,0x1d,0x8e,0x86,0xda,0x4c,0xea,0x64,0x8e,0xb0,0x93,0x40, 0x35,0xaf,0x89,0x1c,0x23,0x25,0x4c,0x5a,0x41,0x9c,0x16,0x8d,0x28,0x58,0x3b,0x38, 0x38,0x98,0x57,0x51,0xc7,0xe3,0xf9,0xd2,0xe9,0x62,0x93,0x07,0x38,0xb1,0x9f,0x57, 0x43,0x30,0x12,0xe4,0x75,0x87,0xa2,0x58,0x8a,0x39,0x40,0xa4,0x4b,0xe1,0x56,0x0e, 0x57,0x0c,0x3a,0x64,0x5e,0x0e,0x11,0x39,0x6c,0xd0,0xf8,0x6b,0xdf,0xce,0x09,0x5e, 0x61,0x0c,0x75,0x3a,0xce,0x85,0xe1,0x30,0x8a,0x7f,0xeb,0x07,0xd0,0xc2,0xe5,0xe5, 0xe5,0x45,0xb1,0x6f,0x5c,0xab,0xba,0xf7,0xd6,0xa6,0xb5,0xd6,0x5d,0x69,0x83,0xeb, 0x74,0x05,0xff,0xac,0xab,0xeb,0xf1,0x9b,0xcb,0xa8,0xd8,0x0a,0x69,0x31,0xe7,0xd7, 0xf8,0x24,0x2f,0x46,0x1a,0x79,0xf6,0x98,0x02,0x82,0x29,0x40,0x75,0x22,0x4f,0x91, 0x9d,0xab,0x58,0x81,0xb7,0xf3,0xf3,0x73,0x0d,0xc7,0x84,0x5b,0x7f,0x14,0xe6,0x7e, 0x5f,0xbb,0xc5,0x75,0xbd,0xd7,0x33,0xcf,0xeb,0x1c,0xdf,0xed,0xed,0xed,0xc6,0xb6, 0x47,0x9f,0xe1,0x2b,0x53,0x81,0x16,0x93,0x04,0x57,0x14,0xde,0xe4,0x77,0x9a,0x37, 0x31,0x16,0x45,0xf7,0x1e,0x1e,0x1e,0x14,0x4a,0xfd,0xaf,0xbd,0x73,0x80,0xb5,0x2d, 0x87,0xc2,0x70,0xc7,0x7c,0xf6,0xbb,0x1a,0xdb,0xb6,0xad,0x60,0x3c,0xc1,0xd8,0x88, 0x86,0xe1,0x8d,0xed,0x0c,0xc3,0x61,0xcc,0xb1,0x1d,0x8c,0x6d,0xdb,0xf3,0x6c,0xf5, 0x7b,0xc9,0x9f,0xa4,0x3b,0xdd,0x39,0x7d,0xa7,0xe9,0x3e,0xf7,0xec,0xbb,0xfe,0x64, 0xa5,0x3d,0xdd,0x3c,0xfd,0x57,0xd7,0xaa,0x76,0xcb,0x37,0xfd,0x05,0x60,0x2e,0x00, 0xd3,0xce,0x4c,0x14,0x46,0xa8,0x0a,0x42,0x3d,0x60,0x28,0xa6,0x9a,0x90,0x98,0x7a, 0x4a,0x3d,0xa5,0x1f,0x4b,0x83,0x70,0x5c,0x92,0x31,0x90,0x63,0xd8,0x38,0xc1,0x42, 0x40,0x3e,0xed,0xd3,0xd2,0xe4,0x83,0x80,0x58,0x3f,0xd9,0xc1,0xb1,0xf4,0x3c,0x75, 0x01,0xde,0xc1,0x37,0xe3,0x1c,0x1d,0x3c,0x84,0xbd,0x06,0x4a,0xe8,0x57,0x46,0x71, 0x7e,0x25,0x91,0xf6,0xd6,0x01,0x20,0x81,0x3f,0xca,0xa7,0xe0,0x6f,0xbf,0xfd,0x76, 0x63,0xfd,0xe2,0x90,0x4c,0x89,0x87,0x68,0x9e,0x4f,0x88,0x25,0x20,0x8e,0xcf,0x27, 0x2c,0x05,0xba,0x5c,0x21,0x56,0xc2,0xca,0x60,0x28,0x21,0xbd,0x70,0xcc,0xaf,0xa3, 0x57,0x8e,0xa9,0xe1,0xbc,0x07,0x56,0xc7,0xef,0xac,0xa2,0x3a,0x4c,0xfb,0x14,0x80, 0x4c,0xf7,0xb3,0x69,0xe8,0xc5,0x6b,0x74,0x60,0x84,0x6e,0x51,0x9e,0x2d,0xb2,0x31, 0xfd,0x8a,0x13,0x72,0x0c,0x49,0x04,0xd6,0x23,0x20,0x54,0x71,0x48,0x65,0x82,0x08, 0x69,0x58,0x19,0xc8,0xa7,0x05,0xc3,0x72,0x72,0x6a,0x59,0xe8,0xf9,0x00,0xc5,0xe4, 0xfd,0x98,0xa0,0x01,0xf1,0x4c,0xcc,0xa0,0xd2,0xcb,0xbb,0x70,0x1d,0x4a,0xd0,0x1a, 0x05,0x10,0x01,0x74,0xbd,0x36,0x5d,0xcb,0x26,0xa3,0xe5,0xeb,0x45,0x3c,0x69,0x22, 0x5f,0x35,0x7f,0x08,0xc3,0x52,0x30,0xd4,0x8b,0xd2,0x40,0x2a,0x84,0x32,0xf2,0x47, 0xa9,0x25,0x8d,0xd2,0x0a,0x81,0xcc,0x10,0xf2,0xd3,0xa8,0x20,0x4a,0x56,0x86,0x38, 0x04,0x22,0x34,0x33,0x99,0xbc,0x11,0x90,0x28,0x05,0x40,0x81,0x68,0x71,0xd0,0x95, 0xcd,0xb7,0x01,0x0c,0xd5,0x72,0x2f,0xd2,0x7c,0x2f,0x23,0xd7,0xa8,0xe9,0xdb,0x2a, 0x05,0xc0,0xf4,0xf6,0x64,0xb1,0x63,0x99,0x7e,0x44,0xa4,0x4b,0x01,0xc8,0x78,0x32, 0xdd,0xaf,0xd9,0xc7,0x78,0x38,0x71,0xc8,0x83,0xd4,0xa0,0x29,0x8a,0x50,0x8a,0x21, 0x95,0x78,0x2a,0x20,0x53,0xf7,0x62,0xc5,0x53,0x2a,0xa0,0xbe,0x85,0xe2,0xce,0x3b, 0xef,0x3c,0xe7,0x27,0x9c,0xf2,0x2e,0x28,0x9c,0xf3,0xeb,0x13,0x42,0x3a,0xef,0xd3, 0xbe,0x3a,0x80,0x32,0x00,0x0d,0xf7,0xeb,0xff,0x37,0xdd,0x2c,0x0d,0x2c,0x80,0x94, 0x00,0x62,0x10,0x4a,0x3d,0x5f,0xd3,0x30,0xc8,0x03,0xc1,0x9d,0xfa,0x15,0xaa,0xf7, 0xd6,0xfd,0x24,0x58,0x07,0x14,0x84,0xf3,0x65,0x5d,0x28,0xf1,0xa4,0x33,0x18,0xe5, 0x97,0x92,0x67,0x65,0x71,0x8e,0x51,0x29,0x85,0x78,0x07,0xa4,0x60,0xfd,0x6a,0xfa, 0x85,0x8d,0x68,0x0b,0xc6,0x4a,0x3f,0xe4,0xe3,0x17,0x99,0x54,0xd8,0x24,0x18,0xab, 0xf7,0x1b,0x51,0x88,0x0c,0x85,0x10,0x87,0xe9,0x85,0x7c,0x99,0x5b,0x91,0x1a,0x90, 0xa9,0x50,0xd7,0xe8,0xb7,0xd2,0x20,0x8d,0xde,0x43,0x59,0x12,0x84,0xdf,0x31,0xa9, 0x27,0x36,0xde,0x81,0xa5,0xb4,0xfa,0xf3,0xd3,0x3a,0xc8,0x72,0x81,0xd5,0xe2,0xff, 0xfa,0xb1,0x05,0xee,0xd9,0x9d,0x05,0x20,0xb3,0x7a,0xd5,0xdc,0xc2,0x02,0xc8,0xec, 0x53,0x1a,0xfd,0x87,0x11,0xf8,0x70,0x7d,0xe9,0x12,0x25,0x15,0x42,0x25,0x90,0xc7, 0xf9,0x8a,0x13,0x4a,0xc8,0x90,0x14,0x2b,0xc4,0x7f,0xcf,0x21,0x38,0x83,0xd0,0x6e, 0x15,0x48,0xf9,0x45,0xef,0x29,0x8a,0xcd,0x6f,0xf2,0x46,0x2e,0x30,0xdd,0x02,0x90, 0xa9,0x7e,0x47,0x0d,0x2a,0x52,0x5a,0x5c,0xb9,0x09,0xf0,0xf2,0xf8,0x5d,0x2c,0x0f, 0xa5,0x57,0x04,0xe2,0xe3,0x51,0x08,0xe2,0xf2,0xf9,0x1c,0x23,0x44,0xc8,0x94,0x08, 0x01,0xe9,0xae,0xa1,0xfc,0xf9,0x65,0x15,0x48,0x95,0x64,0x2c,0xa4,0xf2,0x02,0x3c, 0xfa,0xe8,0xa3,0x2a,0x08,0xa4,0xa5,0x5b,0x00,0xbd,0x00,0x99,0xde,0x14,0x78,0x16, 0xcf,0xc4,0xb7,0xfb,0x0f,0x26,0xe4,0x93,0x35,0xf1,0x03,0xb3,0x9f,0xff,0x69,0x75, 0x79,0xc2,0x1b,0xaf,0x2f,0xe1,0xaa,0xfd,0x5c,0x05,0x0a,0x42,0x90,0x2e,0x57,0x40, 0x7a,0xdc,0x0a,0x24,0x28,0x00,0xd2,0x14,0xd4,0xfe,0xa6,0x94,0xf3,0x5c,0x2c,0x10, 0x69,0x94,0x78,0x90,0x5b,0xc2,0x0b,0x12,0x5a,0xbe,0xc4,0x47,0xce,0xa7,0x25,0x42, 0xab,0x84,0x3a,0x51,0xec,0x3a,0xf5,0xa4,0x4e,0x98,0x30,0x81,0x78,0x5f,0xcc,0x0a, 0x46,0x53,0x71,0x03,0x68,0x2d,0xca,0x90,0x91,0x81,0x79,0xc7,0x13,0x90,0xa7,0x90, 0x19,0xef,0x43,0xc1,0x20,0x7f,0x66,0xcd,0x9a,0x15,0xdc,0x2b,0xf6,0x7e,0xaa,0x4b, 0xf5,0xcd,0xb4,0x70,0xea,0x1e,0x32,0xf9,0x06,0x21,0xf9,0x4b,0xa3,0xaa,0x32,0x49, 0x5a,0x3a,0x2b,0xd8,0x20,0x72,0x43,0xa2,0x23,0xbf,0x4d,0x01,0x5a,0x48,0x3c,0xa2, 0xb8,0x10,0x4b,0x2b,0xa6,0x00,0x34,0x2d,0x68,0x76,0x98,0x94,0x11,0xa6,0x7d,0x47, 0x50,0x5b,0xd2,0xc3,0xb0,0xec,0x94,0x30,0x7c,0x0c,0x2f,0x48,0x65,0x24,0xb5,0x62, 0x44,0x73,0x05,0xe9,0xf8,0x82,0x54,0xfe,0x68,0xbb,0xf6,0x15,0x0a,0x74,0x06,0x31, 0xc8,0x15,0x83,0xee,0x59,0x7d,0x66,0xfc,0x78,0x21,0x0b,0x00,0x41,0x34,0xcf,0x34, 0x9a,0x46,0x88,0xf0,0x60,0x85,0x8a,0x83,0xbf,0xfe,0x5e,0xe4,0x96,0x2c,0x1f,0x70, 0xdb,0x4c,0x3a,0xc1,0xcb,0x89,0x0e,0xd9,0x76,0xb2,0x42,0xc4,0x8b,0x8f,0x6f,0xb9, 0xed,0x91,0xfe,0xdc,0x95,0xea,0x9f,0xaf,0x4a,0xf5,0x79,0x41,0x5a,0x81,0xf3,0x25, 0x75,0xd7,0xa7,0xfc,0x7f,0xc2,0xe4,0xe7,0x4b,0xf8,0xff,0xd4,0xe0,0x37,0xd4,0xff, 0x57,0x95,0xaf,0x98,0x05,0xf0,0xab,0x6d,0x24,0x0f,0x7f,0xfe,0xfd,0xcf,0x02,0x37, 0x77,0xe4,0x14,0x37,0x77,0x70,0x5f,0xe7,0x5f,0xd5,0xf9,0xac,0x71,0x80,0xc0,0xff, 0x24,0x0c,0xb0,0x62,0xf9,0x6f,0x2c,0xa7,0xc0,0xfd,0xfb,0xb7,0x04,0xe7,0x7f,0xc9, 0x9c,0x40,0x7e,0x7d,0x9a,0xe2,0x45,0x14,0x80,0x92,0xcf,0x88,0x58,0x0a,0xd0,0xe4, 0xb5,0x9b,0x4c,0x75,0xbb,0xec,0x75,0xa4,0xdb,0xa8,0x23,0xa1,0x90,0xbf,0xc4,0xad, 0x5e,0x33,0x0f,0x05,0x23,0xe3,0x73,0x08,0xeb,0x5b,0x97,0x41,0x3b,0x9f,0xee,0xf0, 0xf8,0x54,0xf7,0xfa,0x52,0xae,0x74,0x42,0xc5,0x4b,0x28,0x00,0x3d,0x4b,0x98,0xa9, 0xa4,0xce,0x8c,0xff,0xe7,0xcd,0x77,0x7b,0x1d,0x74,0xa1,0x9b,0x39,0x94,0xb6,0x4a, 0xc6,0xd7,0x9f,0xbe,0xe9,0x26,0x6c,0xbd,0x9a,0xfb,0xa7,0x76,0xa6,0x60,0x29,0x82, 0xe7,0x2b,0x2c,0xdf,0x59,0x53,0xe4,0x7e,0x9a,0x0d,0x95,0x66,0x01,0xe2,0xc7,0x8a, 0xba,0x00,0x4a,0x3f,0x95,0xbf,0xa4,0x3f,0xb8,0x6a,0xed,0x96,0x6e,0xbb,0xdd,0xf6, 0x71,0x13,0xa6,0x4c,0x8c,0xa9,0x3f,0x17,0x10,0x3a,0xb0,0x64,0xd1,0x3c,0xf7,0xc3, 0x97,0x2f,0xb9,0x99,0x33,0xa6,0xa7,0x29,0x58,0x01,0xf4,0xb8,0x7b,0x19,0xd3,0x4f, 0xe9,0x97,0xfb,0x4b,0xb7,0x00,0x21,0xf9,0x65,0x15,0x40,0x93,0x20,0x92,0xb0,0x66, 0x99,0xfb,0xfa,0x93,0x57,0xdd,0xc0,0x0e,0x7b,0x05,0x99,0x53,0xad,0x02,0x2c,0x5e, 0xf0,0x8f,0xfb,0xf2,0x83,0x17,0xdc,0xa4,0xad,0x56,0x78,0xe5,0xda,0xba,0xbc,0xc9, 0x2f,0x74,0xbf,0x9c,0xe7,0x51,0xea,0x7f,0xf8,0xe1,0x07,0x92,0x89,0xeb,0x58,0xf2, 0xb0,0x70,0x24,0xad,0x8c,0x02,0xa0,0xa1,0xb8,0x81,0x14,0x0c,0x0d,0xcc,0x72,0x7f, 0x7d,0xf3,0xb2,0xfb,0xe3,0xab,0x17,0x6b,0x4b,0x88,0xfa,0x14,0x66,0xae,0x9f,0xe8, 0x31,0xa1,0xe9,0x01,0x9b,0xc0,0x85,0x28,0x4e,0x98,0x8f,0xf4,0xe7,0x21,0xfe,0x83, 0x4f,0xea,0x4c,0x1d,0x09,0xcd,0xef,0x00,0xca,0x54,0x00,0x96,0x28,0xc5,0x05,0xf0, 0x69,0x16,0xa6,0x5a,0xa4,0x44,0x10,0x0c,0xea,0x44,0x50,0x74,0x00,0xa7,0xbc,0xcf, 0xce,0x9f,0x05,0xc4,0xa4,0x13,0x26,0xb2,0xb2,0xe2,0x57,0x75,0xc8,0x56,0x33,0x8d, 0x53,0xfa,0xfd,0xeb,0xd3,0x0b,0x35,0x03,0xd9,0x6b,0x1f,0x68,0xae,0x7e,0xea,0xc3, 0x9a,0xaf,0x64,0x35,0x72,0x7e,0xce,0xff,0x87,0x78,0x5a,0x3d,0x01,0xf9,0xca,0xdb, 0x84,0x0a,0x20,0xe7,0x05,0xef,0xa1,0x78,0xa9,0x3a,0x00,0x9d,0x40,0x9a,0x30,0x9a, 0xdc,0xec,0x50,0x66,0x25,0xa7,0xe7,0xfb,0xda,0x84,0x4a,0x53,0xde,0x00,0x4c,0xee, 0x71,0x08,0xd7,0x9c,0x44,0xde,0x2f,0x3f,0x5f,0x9a,0xa9,0x04,0xf2,0x62,0x68,0x2c, 0x12,0x4c,0x1f,0xcf,0xce,0x5c,0x83,0x20,0x05,0x49,0xb1,0x42,0x4a,0x8b,0x59,0xce, 0x66,0x46,0x03,0x35,0x6b,0x07,0x53,0xc6,0x43,0x0d,0xf9,0xf9,0xc9,0xac,0xa8,0x14, 0xff,0x1f,0x49,0xcf,0xe8,0x07,0xc8,0x34,0xb9,0x45,0x3f,0x90,0x30,0xa4,0x5a,0x83, 0x8c,0xe1,0xe0,0xd6,0xc0,0xe6,0x03,0x80,0xd6,0x29,0x80,0x21,0x7d,0x3e,0x80,0x59, 0x80,0xf6,0x2b,0x80,0xc2,0x68,0x85,0xb0,0xfd,0x16,0xc0,0x90,0x3e,0x1f,0xc0,0x14, 0xa0,0xa5,0xe4,0x27,0xa4,0xb5,0x4d,0x01,0x0c,0xa1,0xe9,0x4f,0xa8,0x03,0xb4,0x60, 0xb9,0x78,0x43,0xde,0x7c,0x80,0xf6,0x5b,0x00,0x6b,0x05,0x44,0x49,0x6f,0x9f,0x02, 0x18,0xa2,0xa6,0x3f,0x85,0x70,0x73,0x01,0xed,0xaf,0x00,0x8e,0xe3,0x8e,0x20,0xeb, 0x0d,0x14,0xac,0x23,0x68,0x1c,0x12,0xaf,0x79,0x03,0x4a,0xb3,0x7e,0x80,0x71,0xaa, 0x14,0xe5,0x46,0x03,0xf9,0x64,0xbb,0x3f,0x60,0x23,0x80,0xa4,0x87,0xf1,0x7c,0x05, 0xe8,0x93,0xb5,0xf8,0xad,0x22,0x68,0xcd,0x40,0x1b,0x18,0x1a,0x17,0xeb,0x03,0x18, 0x6c,0x3e,0x80,0x91,0x2f,0xd8,0x58,0x80,0x55,0x02,0x15,0x0f,0xd6,0x0c,0x54,0xfa, 0xf8,0x50,0x00,0x53,0x04,0x48,0x8f,0xc5,0xcd,0x05,0xb4,0x14,0xfa,0x96,0x50,0x02, 0xe9,0x92,0x60,0x6d,0xe5,0xf6,0x29,0x80,0x41,0x24,0x8b,0x68,0x91,0x1d,0x84,0xed, 0x55,0x00,0x43,0x95,0xf8,0x5a,0x61,0xff,0xe5,0xf6,0x29,0x80,0x21,0x20,0xbe,0xae, 0xf4,0x8f,0x8c,0x8c,0xb8,0xa3,0x8f,0x3e,0x5a,0x6b,0x14,0x65,0x29,0xc0,0x18,0x5b, 0xb1,0xcb,0xcc,0xbf,0x56,0x06,0xaf,0xf3,0xfb,0x2c,0xad,0xef,0xb7,0xd5,0xd5,0x2a, 0xeb,0xfa,0x82,0xbb,0x7b,0x05,0x60,0x4d,0x5a,0xc3,0xd8,0x40,0xb5,0xa4,0x57,0xdd, 0x81,0xdf,0x61,0xdc,0x5d,0x72,0xc9,0x25,0xac,0xdf,0x80,0x68,0xf3,0xab,0xee,0x14, 0x80,0x8b,0x90,0xbd,0xf7,0xde,0xdb,0xf5,0x1c,0x06,0x11,0x0e,0xd1,0x0a,0x83,0xb4, 0x53,0x4f,0x3d,0x15,0xbf,0xcf,0x0a,0xe2,0x6c,0x18,0xc1,0x2a,0xe2,0x5a,0xce,0xa7, 0x7b,0x05,0xc0,0x7c,0xb0,0x93,0x27,0x61,0xef,0x60,0xd0,0x3e,0x46,0xd5,0x5a,0x3e, 0x04,0xb3,0xa7,0xd1,0xd5,0x57,0x5f,0xed,0x76,0xdd,0x75,0x57,0xcc,0x3f,0x7b,0x07, 0x60,0xb5,0x51,0x00,0x2c,0x40,0x77,0x2e,0x40,0xe4,0x63,0x3e,0xb8,0xd1,0x69,0xa7, 0x9d,0xe6,0x7a,0x02,0x83,0xb6,0x81,0x09,0x9a,0x7f,0xfb,0xed,0xb7,0x1f,0x5b,0xd8, 0xb9,0x8b,0x2f,0xbe,0xd8,0xed,0xb8,0xe3,0x8e,0x70,0xc4,0x8a,0x2d,0xac,0x24,0x8e, 0x10,0xc7,0x05,0x68,0x9b,0xbc,0x8e,0x3d,0x81,0x2b,0x58,0xa6,0x27,0xa6,0x00,0x54, 0x24,0xd0,0xa2,0xdd,0x76,0xdb,0x8d,0xe5,0xcb,0x1a,0xda,0x3d,0xd4,0x20,0x68,0xbb, 0x5c,0xd5,0xc5,0x0e,0x3b,0xec,0x30,0x42,0xed,0x73,0xc8,0x67,0xf9,0x54,0xd2,0x59, 0xab,0x81,0xd2,0x0f,0xf1,0x84,0x90,0x0f,0x77,0x1d,0x4b,0x3f,0xdc,0xa3,0x1e,0x7f, 0xc7,0x2c,0x00,0xa5,0x1f,0xf2,0xb9,0x19,0x0f,0x38,0xf0,0xc0,0x03,0xf1,0x31,0xe6, 0x0e,0x1a,0x24,0x1f,0xa1,0x84,0x5f,0x76,0xd9,0x65,0xec,0xde,0xc6,0x76,0xfa,0x6c, 0x61,0x07,0xc9,0x28,0x02,0x3b,0xac,0x91,0xe6,0x86,0x87,0x87,0xdd,0xc0,0xc0,0x00, 0x8b,0x4c,0xc3,0x55,0x2a,0xf9,0xe0,0x6f,0x36,0x8d,0x7a,0xc6,0x47,0x4e,0x8d,0xf9, 0x1d,0xb6,0x1c,0x61,0x2f,0x7f,0xf6,0x0e,0xd4,0x26,0xce,0xa4,0x61,0x0d,0xbe,0xfa, 0xea,0x2b,0xf6,0xf8,0xe7,0xb7,0xcb,0x87,0x41,0x80,0x60,0x0a,0x1e,0x15,0xb9,0x7d, 0xf6,0xd9,0x47,0x3b,0xa2,0x51,0xda,0x49,0xc7,0xef,0x73,0x4e,0x20,0xa4,0x71,0x8c, 0x73,0x36,0x70,0x2f,0xc3,0x67,0x71,0x01,0x2f,0xc6,0x14,0x40,0x2e,0x00,0x0b,0x80, 0x69,0x41,0x21,0x00,0x3b,0x7a,0x70,0x8c,0x34,0x6d,0xe3,0x0e,0x08,0x0d,0xf9,0xeb, 0x1a,0x11,0x42,0xa0,0x88,0x17,0xe9,0xf0,0x00,0xd9,0x84,0xfc,0xc6,0xf4,0x73,0x4c, 0xdb,0xe2,0x89,0x78,0x24,0x15,0x70,0xbf,0xc9,0xe8,0xe8,0xe8,0xcf,0x3e,0x72,0x0b, 0x15,0xc2,0x48,0x33,0x10,0xb2,0x03,0xe1,0x41,0xda,0xae,0x4d,0xdb,0xba,0x21,0x68, 0x9f,0x49,0xd7,0xa2,0x3c,0x0c,0x08,0x97,0x5f,0xc7,0xdc,0x53,0xbb,0xc7,0xc4,0x63, 0x19,0x58,0xaa,0x9f,0xe3,0x28,0x41,0xa4,0xc3,0x27,0x15,0x0c,0x16,0x5c,0xbd,0xb1, 0xbf,0x08,0x05,0x78,0xcc,0x45,0xa0,0xbd,0x71,0x65,0x05,0xf0,0x33,0xf8,0x1b,0x09, 0xfe,0x67,0x70,0x70,0x10,0xe1,0x58,0x86,0x98,0x28,0x1f,0x11,0xf2,0x95,0xee,0x5c, 0x09,0x69,0xec,0x54,0x8e,0x02,0xd0,0xce,0x57,0x27,0x4f,0x97,0xc4,0x0b,0x8f,0xc1, 0xbd,0xe6,0x03,0xdc,0xe5,0xe5,0x1c,0x2f,0x93,0xaa,0x56,0x40,0x4a,0xa0,0x10,0xad, 0xa3,0xd9,0x41,0xed,0x94,0x95,0x2d,0xb5,0xac,0xa9,0x21,0x1f,0xca,0x6f,0xb9,0x5f, 0x44,0xd6,0x41,0x64,0xcb,0xbf,0x67,0x62,0x3e,0x9c,0x13,0xd1,0x9d,0x20,0x91,0xc6, 0xfe,0x13,0xb8,0xff,0x9a,0x31,0xe8,0xea,0x20,0x44,0xc1,0x3a,0x80,0xd5,0x01,0xe4, 0x6e,0x09,0x11,0xd2,0x91,0x4c,0xc8,0xf4,0x9f,0xe5,0xef,0xf5,0x8c,0x14,0x40,0x80, 0xc4,0x6b,0x7c,0x70,0x4f,0x8d,0x12,0xe8,0x9c,0x40,0x0c,0x45,0x94,0x21,0x90,0x00, 0xf9,0xe4,0xdf,0xe0,0xef,0xf9,0x80,0xab,0x03,0x96,0xc0,0xcb,0xbc,0xb5,0x6d,0x83, 0x61,0x1e,0xdc,0xa6,0x4e,0x39,0x1a,0xf0,0xf2,0x90,0x97,0x55,0x96,0x6f,0x7d,0x0f, 0x38,0x84,0xcb,0x81,0x6e,0xe6,0x9e,0x0d,0x79,0xb9,0x8d,0xce,0x22,0x2f,0xbf,0x78, 0x59,0x6e,0xf9,0x39,0xe6,0xb1,0x1c,0xae,0xe0,0x0c,0xee,0xe0,0xd0,0xd5,0xc3,0xad, 0x03,0x63,0x75,0xc1,0xae,0xdd,0xd9,0xb0,0x20,0x00,0x00,0x00,0x00,0x49,0x45,0x4e, 0x44,0xae,0x42,0x60,0x82, }; cups-2.3.1/berkeley/lprm.c000664 000765 000024 00000011737 13574721672 015530 0ustar00mikestaff000000 000000 /* * "lprm" command for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include /* * Local functions... */ static void usage(void) _CUPS_NORETURN; /* * 'main()' - Parse options and cancel jobs. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int job_id; /* Job ID */ const char *name; /* Destination printer */ char *instance, /* Pointer to instance name */ *opt; /* Option pointer */ cups_dest_t *dest, /* Destination */ *defdest; /* Default destination */ int did_cancel; /* Did we cancel something? */ _cupsSetLocale(argv); /* * Setup to cancel individual print jobs... */ did_cancel = 0; defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); name = defdest ? defdest->name : NULL; /* * Process command-line arguments... */ for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) usage(); else if (argv[i][0] == '-' && argv[i][1] != '\0') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'E' : /* Encrypt */ #ifdef HAVE_SSL cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'P' : /* Cancel jobs on a printer */ if (opt[1] != '\0') { name = opt + 1; opt += strlen(opt) - 1; } else { i ++; name = argv[i]; } if ((instance = strchr(name, '/')) != NULL) *instance = '\0'; if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, name, NULL)) == NULL) { _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], name); goto error; } cupsFreeDests(1, dest); break; case 'U' : /* Username */ if (opt[1] != '\0') { cupsSetUser(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]); usage(); } cupsSetUser(argv[i]); } break; case 'h' : /* Connect to host */ if (opt[1] != '\0') { cupsSetServer(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]); usage(); } else cupsSetServer(argv[i]); } if (defdest) cupsFreeDests(1, defdest); defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); name = defdest ? defdest->name : NULL; break; default : _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt); usage(); } } } else { /* * Cancel a job or printer... */ if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL)) != NULL) cupsFreeDests(1, dest); if (dest) { name = argv[i]; job_id = 0; } else if (isdigit(argv[i][0] & 255)) { name = NULL; job_id = atoi(argv[i]); } else if (!strcmp(argv[i], "-")) { /* * Cancel all jobs */ job_id = -1; } else { _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], argv[i]); goto error; } if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); goto error; } did_cancel = 1; } } /* * If nothing has been canceled yet, cancel the current job on the specified * (or default) printer... */ if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); goto error; } if (defdest) cupsFreeDests(1, defdest); return (0); /* * If we get here there was an error, so clean up... */ error: if (defdest) cupsFreeDests(1, defdest); return (1); } /* * 'usage()' - Show program usage and exit. */ static void usage(void) { _cupsLangPuts(stdout, _("Usage: lprm [options] [id]\n" " lprm [options] -")); _cupsLangPuts(stdout, _("Options:")); _cupsLangPuts(stdout, _("- Cancel all jobs")); _cupsLangPuts(stdout, _("-E Encrypt the connection to the server")); _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port")); _cupsLangPuts(stdout, _("-P destination Specify the destination")); _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication")); exit(1); } cups-2.3.1/berkeley/Makefile000664 000765 000024 00000004327 13574721672 016047 0ustar00mikestaff000000 000000 # # Berkeley commands makefile for CUPS. # # Copyright 2007-2019 by Apple Inc. # Copyright 1997-2006 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more information. # include ../Makedefs TARGETS = lpc lpq lpr lprm OBJS = lpc.o lpq.o lpr.o lprm.o # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all object files... # clean: $(RM) $(OBJS) $(TARGETS) # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: echo Installing Berkeley user printing commands in $(BINDIR)... $(INSTALL_DIR) -m 755 $(BINDIR) $(INSTALL_BIN) lpq $(BINDIR) $(INSTALL_BIN) lpr $(BINDIR) $(INSTALL_BIN) lprm $(BINDIR) echo Installing Berkeley admin printing commands in $(BINDIR)... $(INSTALL_DIR) -m 755 $(SBINDIR) $(INSTALL_BIN) lpc $(SBINDIR) if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ for file in $(TARGETS); do \ cp $$file $(SYMROOT); \ dsymutil $(SYMROOT)/$$file; \ done \ fi # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall all targets... # uninstall: $(RM) $(BINDIR)/lpq $(RM) $(BINDIR)/lpr $(RM) $(BINDIR)/lprm $(RM) $(SBINDIR)/lpc -$(RMDIR) $(SBINDIR) -$(RMDIR) $(BINDIR) # # lpc # lpc: lpc.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o lpc lpc.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # lpq # lpq: lpq.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o lpq lpq.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # lpr # lpr: lpr.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o lpr lpr.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # lprm # lprm: lprm.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o lprm lprm.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Dependencies... # include Dependencies cups-2.3.1/berkeley/Dependencies000664 000765 000024 00000003006 13574721672 016711 0ustar00mikestaff000000 000000 lpc.o: lpc.c ../cups/cups-private.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \ ../cups/ipp-private.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h lpq.o: lpq.c ../cups/cups-private.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \ ../cups/ipp-private.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h lpr.o: lpr.c ../cups/cups-private.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \ ../cups/ipp-private.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h lprm.o: lprm.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h cups-2.3.1/berkeley/lpr.c000664 000765 000024 00000030145 13574721672 015345 0ustar00mikestaff000000 000000 /* * "lpr" command for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include /* * Local functions... */ static void usage(void) _CUPS_NORETURN; /* * 'main()' - Parse options and send files for printing. */ int main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i, j; /* Looping var */ int job_id; /* Job ID */ char ch; /* Option character */ char *printer, /* Destination printer or class */ *instance, /* Instance */ *opt; /* Option pointer */ const char *title; /* Job title */ int num_copies; /* Number of copies per file */ int num_files; /* Number of files to print */ const char *files[1000]; /* Files to print */ cups_dest_t *dest; /* Selected destination */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ int deletefile; /* Delete file after print? */ char buffer[8192]; /* Copy buffer */ _cupsSetLocale(argv); deletefile = 0; printer = NULL; dest = NULL; num_options = 0; options = NULL; num_files = 0; title = NULL; for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) usage(); else if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) { switch (ch = *opt) { case 'E' : /* Encrypt */ #ifdef HAVE_SSL cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'U' : /* Username */ if (opt[1] != '\0') { cupsSetUser(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]); usage(); } cupsSetUser(argv[i]); } break; case 'H' : /* Connect to host */ if (opt[1] != '\0') { cupsSetServer(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-H\" option."), argv[0]); usage(); } else cupsSetServer(argv[i]); } break; case '1' : /* TROFF font set 1 */ case '2' : /* TROFF font set 2 */ case '3' : /* TROFF font set 3 */ case '4' : /* TROFF font set 4 */ case 'i' : /* indent */ case 'w' : /* width */ if (opt[1] != '\0') { opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected value after \"-%c\" " "option."), argv[0], ch); usage(); } } case 'c' : /* CIFPLOT */ case 'd' : /* DVI */ case 'f' : /* FORTRAN */ case 'g' : /* plot */ case 'n' : /* Ditroff */ case 't' : /* Troff */ case 'v' : /* Raster image */ _cupsLangPrintf(stderr, _("%s: Warning - \"%c\" format modifier not supported - output may not be correct."), argv[0], ch); break; case 'o' : /* Option */ if (opt[1] != '\0') { num_options = cupsParseOptions(opt + 1, num_options, &options); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected option=value after \"-o\" option."), argv[0]); usage(); } num_options = cupsParseOptions(argv[i], num_options, &options); } break; case 'l' : /* Literal/raw */ num_options = cupsAddOption("raw", "true", num_options, &options); break; case 'p' : /* Prettyprint */ num_options = cupsAddOption("prettyprint", "true", num_options, &options); break; case 'h' : /* Suppress burst page */ num_options = cupsAddOption("job-sheets", "none", num_options, &options); break; case 's' : /* Don't use symlinks */ break; case 'm' : /* Mail on completion */ { char email[1024]; /* EMail address */ snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(), httpGetHostname(NULL, buffer, sizeof(buffer))); num_options = cupsAddOption("notify-recipient-uri", email, num_options, &options); } break; case 'q' : /* Queue file but don't print */ num_options = cupsAddOption("job-hold-until", "indefinite", num_options, &options); break; case 'r' : /* Remove file after printing */ deletefile = 1; break; case 'P' : /* Destination printer or class */ if (opt[1] != '\0') { printer = opt + 1; opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected destination after \"-P\" option."), argv[0]); usage(); } printer = argv[i]; } if ((instance = strrchr(printer, '/')) != NULL) *instance++ = '\0'; if ((dest = cupsGetNamedDest(NULL, printer, instance)) != NULL) { for (j = 0; j < dest->num_options; j ++) if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) num_options = cupsAddOption(dest->options[j].name, dest->options[j].value, num_options, &options); } else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED) { _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]); return (1); } break; case '#' : /* Number of copies */ if (opt[1] != '\0') { num_copies = atoi(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected copies after \"-#\" option."), argv[0]); usage(); } num_copies = atoi(argv[i]); } if (num_copies < 1) { _cupsLangPrintf(stderr, _("%s: Error - copies must be 1 or more."), argv[0]); return (1); } sprintf(buffer, "%d", num_copies); num_options = cupsAddOption("copies", buffer, num_options, &options); break; case 'C' : /* Class */ case 'J' : /* Job name */ case 'T' : /* Title */ if (opt[1] != '\0') { title = opt + 1; opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected name after \"-%c\" option."), argv[0], ch); usage(); } title = argv[i]; } break; default : _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt); return (1); } } } else if (num_files < 1000) { /* * Print a file... */ if (access(argv[i], R_OK) != 0) { _cupsLangPrintf(stderr, _("%s: Error - unable to access \"%s\" - %s"), argv[0], argv[i], strerror(errno)); return (1); } files[num_files] = argv[i]; num_files ++; if (title == NULL) { if ((title = strrchr(argv[i], '/')) != NULL) title ++; else title = argv[i]; } } else { _cupsLangPrintf(stderr, _("%s: Error - too many files - \"%s\"."), argv[0], argv[i]); } } /* * See if we have any files to print; if not, print from stdin... */ if (printer == NULL) { if ((dest = cupsGetNamedDest(NULL, NULL, NULL)) != NULL) { printer = dest->name; for (j = 0; j < dest->num_options; j ++) if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) num_options = cupsAddOption(dest->options[j].name, dest->options[j].value, num_options, &options); } else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED) { _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server " "name."), argv[0]); return (1); } } if (printer == NULL) { if (!cupsGetNamedDest(NULL, NULL, NULL) && cupsLastError() == IPP_STATUS_ERROR_NOT_FOUND) _cupsLangPrintf(stderr, _("%s: Error - %s"), argv[0], cupsLastErrorString()); else _cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."), argv[0]); return (1); } if (num_files > 0) { job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options); if (deletefile && job_id > 0) { /* * Delete print files after printing... */ for (i = 0; i < num_files; i ++) unlink(files[i]); } } else if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer, title ? title : "(stdin)", num_options, options)) > 0) { http_status_t status; /* Write status */ const char *format; /* Document format */ ssize_t bytes; /* Bytes read */ if (cupsGetOption("raw", num_options, options)) format = CUPS_FORMAT_RAW; else if ((format = cupsGetOption("document-format", num_options, options)) == NULL) format = CUPS_FORMAT_AUTO; status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id, NULL, format, 1); while (status == HTTP_CONTINUE && (bytes = read(0, buffer, sizeof(buffer))) > 0) status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes); if (status != HTTP_CONTINUE) { _cupsLangPrintf(stderr, _("%s: Error - unable to queue from stdin - %s."), argv[0], httpStatus(status)); cupsFinishDocument(CUPS_HTTP_DEFAULT, printer); cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); return (1); } if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); return (1); } } if (job_id < 1) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); return (1); } return (0); } /* * 'usage()' - Show program usage and exit. */ static void usage(void) { _cupsLangPuts(stdout, _("Usage: lpr [options] [file(s)]")); _cupsLangPuts(stdout, _("Options:")); _cupsLangPuts(stdout, _("-# num-copies Specify the number of copies to print")); _cupsLangPuts(stdout, _("-E Encrypt the connection to the server")); _cupsLangPuts(stdout, _("-H server[:port] Connect to the named server and port")); _cupsLangPuts(stdout, _("-m Send an email notification when the job completes")); _cupsLangPuts(stdout, _("-o option[=value] Specify a printer-specific option")); _cupsLangPuts(stdout, _("-o job-sheets=standard Print a banner page with the job")); _cupsLangPuts(stdout, _("-o media=size Specify the media size to use")); _cupsLangPuts(stdout, _("-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)")); _cupsLangPuts(stdout, _("-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation")); _cupsLangPuts(stdout, _("-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)")); _cupsLangPuts(stdout, _("-o sides=one-sided Specify 1-sided printing")); _cupsLangPuts(stdout, _("-o sides=two-sided-long-edge\n" " 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, _("-T title Specify the job title")); _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication")); exit(1); } cups-2.3.1/berkeley/lpq.c000664 000765 000024 00000035760 13574721672 015354 0ustar00mikestaff000000 000000 /* * "lpq" command for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include /* * Local functions... */ static http_t *connect_server(const char *, http_t *); static int show_jobs(const char *, http_t *, const char *, const char *, const int, const int); static void show_printer(const char *, http_t *, const char *); static void usage(void) _CUPS_NORETURN; /* * 'main()' - Parse options and commands. */ int main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ http_t *http; /* Connection to server */ const char *opt, /* Option pointer */ *dest, /* Desired printer */ *user, /* Desired user */ *val; /* Environment variable name */ char *instance; /* Printer instance */ int id, /* Desired job ID */ all, /* All printers */ interval, /* Reporting interval */ longstatus; /* Show file details */ cups_dest_t *named_dest; /* Named destination */ _cupsSetLocale(argv); /* * Check for command-line options... */ http = NULL; dest = NULL; user = NULL; id = 0; interval = 0; longstatus = 0; all = 0; for (i = 1; i < argc; i ++) { if (argv[i][0] == '+') { interval = atoi(argv[i] + 1); } else if (!strcmp(argv[i], "--help")) usage(); else if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'E' : /* Encrypt */ #ifdef HAVE_SSL cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); if (http) httpEncryption(http, HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); #endif /* HAVE_SSL */ break; case 'U' : /* Username */ if (opt[1] != '\0') { cupsSetUser(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]); return (1); } cupsSetUser(argv[i]); } break; case 'P' : /* Printer */ if (opt[1] != '\0') { dest = opt + 1; opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { httpClose(http); usage(); } dest = argv[i]; } if ((instance = strchr(dest, '/')) != NULL) *instance++ = '\0'; http = connect_server(argv[0], http); if ((named_dest = cupsGetNamedDest(http, dest, instance)) == NULL) { if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED) _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]); else if (instance) _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s/%s\"."), argv[0], dest, instance); else _cupsLangPrintf(stderr, _("%s: Unknown destination \"%s\"."), argv[0], dest); return (1); } cupsFreeDests(1, named_dest); break; case 'a' : /* All printers */ all = 1; break; case 'h' : /* Connect to host */ if (http) { httpClose(http); http = NULL; } if (opt[1] != '\0') { cupsSetServer(opt + 1); opt += strlen(opt) - 1; } else { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]); return (1); } else cupsSetServer(argv[i]); } break; case 'l' : /* Long status */ longstatus = 1; break; default : httpClose(http); usage(); } } } else if (isdigit(argv[i][0] & 255)) { id = atoi(argv[i]); } else { user = argv[i]; } } http = connect_server(argv[0], http); if (dest == NULL && !all) { if ((named_dest = cupsGetNamedDest(http, NULL, NULL)) == NULL) { if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED) { _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]); return (1); } val = NULL; if ((dest = getenv("LPDEST")) == NULL) { if ((dest = getenv("PRINTER")) != NULL) { if (!strcmp(dest, "lp")) dest = NULL; else val = "PRINTER"; } } else val = "LPDEST"; if (dest && val) _cupsLangPrintf(stderr, _("%s: Error - %s environment variable names " "non-existent destination \"%s\"."), argv[0], val, dest); else _cupsLangPrintf(stderr, _("%s: Error - no default destination available."), argv[0]); httpClose(http); return (1); } dest = named_dest->name; } /* * Show the status in a loop... */ for (;;) { if (dest) show_printer(argv[0], http, dest); i = show_jobs(argv[0], http, dest, user, id, longstatus); if (i && interval) { fflush(stdout); sleep((unsigned)interval); } else break; } /* * Close the connection to the server and return... */ httpClose(http); return (0); } /* * 'connect_server()' - Connect to the server as necessary... */ static http_t * /* O - New HTTP connection */ connect_server(const char *command, /* I - Command name */ http_t *http) /* I - Current HTTP connection */ { if (!http) { http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); if (http == NULL) { _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), command); exit(1); } } return (http); } /* * 'show_jobs()' - Show jobs. */ static int /* O - Number of jobs in queue */ show_jobs(const char *command, /* I - Command name */ http_t *http, /* I - HTTP connection to server */ const char *dest, /* I - Destination */ const char *user, /* I - User */ const int id, /* I - Job ID */ const int longstatus) /* I - 1 if long report desired */ { ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ const char *jobdest, /* Pointer into job-printer-uri */ *jobuser, /* Pointer to job-originating-user-name */ *jobname; /* Pointer to job-name */ ipp_jstate_t jobstate; /* job-state */ int jobid, /* job-id */ jobsize, /* job-k-octets */ jobcount, /* Number of jobs */ jobcopies, /* Number of copies */ rank; /* Rank of job */ char resource[1024]; /* Resource string */ char rankstr[255]; /* Rank string */ char namestr[1024]; /* Job name string */ static const char * const jobattrs[] =/* Job attributes we want to see */ { "copies", "job-id", "job-k-octets", "job-name", "job-originating-user-name", "job-printer-uri", "job-priority", "job-state" }; static const char * const ranks[10] = /* Ranking strings */ { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" }; if (http == NULL) return (0); /* * Build an IPP_GET_JOBS or IPP_GET_JOB_ATTRIBUTES request, which requires * the following attributes: * * attributes-charset * attributes-natural-language * job-uri or printer-uri * requested-attributes * requesting-user-name */ request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS); if (id) { snprintf(resource, sizeof(resource), "ipp://localhost/jobs/%d", id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, resource); } else if (dest) { httpAssembleURIf(HTTP_URI_CODING_ALL, resource, sizeof(resource), "ipp", NULL, "localhost", 0, "/printers/%s", dest); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, resource); } else ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/"); if (user) { ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); } else ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(jobattrs) / sizeof(jobattrs[0])), NULL, jobattrs); /* * Do the request and get back a response... */ jobcount = 0; if ((response = cupsDoRequest(http, request, "/")) != NULL) { if (response->request.status.status_code > IPP_OK_CONFLICT) { _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); ippDelete(response); return (0); } rank = 1; /* * Loop through the job list and display them... */ for (attr = response->attrs; attr != NULL; attr = attr->next) { /* * Skip leading attributes until we hit a job... */ while (attr != NULL && attr->group_tag != IPP_TAG_JOB) attr = attr->next; if (attr == NULL) break; /* * Pull the needed attributes from this job... */ jobid = 0; jobsize = 0; jobstate = IPP_JOB_PENDING; jobname = "unknown"; jobuser = "unknown"; jobdest = NULL; jobcopies = 1; while (attr != NULL && attr->group_tag == IPP_TAG_JOB) { if (!strcmp(attr->name, "job-id") && attr->value_tag == IPP_TAG_INTEGER) jobid = attr->values[0].integer; if (!strcmp(attr->name, "job-k-octets") && attr->value_tag == IPP_TAG_INTEGER) jobsize = attr->values[0].integer; if (!strcmp(attr->name, "job-state") && attr->value_tag == IPP_TAG_ENUM) jobstate = (ipp_jstate_t)attr->values[0].integer; if (!strcmp(attr->name, "job-printer-uri") && attr->value_tag == IPP_TAG_URI) if ((jobdest = strrchr(attr->values[0].string.text, '/')) != NULL) jobdest ++; if (!strcmp(attr->name, "job-originating-user-name") && attr->value_tag == IPP_TAG_NAME) jobuser = attr->values[0].string.text; if (!strcmp(attr->name, "job-name") && attr->value_tag == IPP_TAG_NAME) jobname = attr->values[0].string.text; if (!strcmp(attr->name, "copies") && attr->value_tag == IPP_TAG_INTEGER) jobcopies = attr->values[0].integer; attr = attr->next; } /* * See if we have everything needed... */ if (jobdest == NULL || jobid == 0) { if (attr == NULL) break; else continue; } if (!longstatus && jobcount == 0) _cupsLangPuts(stdout, _("Rank Owner Job File(s)" " Total Size")); jobcount ++; /* * Display the job... */ if (jobstate == IPP_JOB_PROCESSING) strlcpy(rankstr, "active", sizeof(rankstr)); else { /* * Make the rank show the "correct" suffix for each number * (11-13 are the only special cases, for English anyways...) */ if ((rank % 100) >= 11 && (rank % 100) <= 13) snprintf(rankstr, sizeof(rankstr), "%dth", rank); else snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]); rank ++; } if (longstatus) { _cupsLangPuts(stdout, "\n"); if (jobcopies > 1) snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies, jobname); else strlcpy(namestr, jobname, sizeof(namestr)); _cupsLangPrintf(stdout, _("%s: %-33.33s [job %d localhost]"), jobuser, rankstr, jobid); _cupsLangPrintf(stdout, _(" %-39.39s %.0f bytes"), namestr, 1024.0 * jobsize); } else _cupsLangPrintf(stdout, _("%-7s %-7.7s %-7d %-31.31s %.0f bytes"), rankstr, jobuser, jobid, jobname, 1024.0 * jobsize); if (attr == NULL) break; } ippDelete(response); } else { _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); return (0); } if (jobcount == 0) _cupsLangPuts(stdout, _("no entries")); return (jobcount); } /* * 'show_printer()' - Show printer status. */ static void show_printer(const char *command, /* I - Command name */ http_t *http, /* I - HTTP connection to server */ const char *dest) /* I - Destination */ { ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ ipp_pstate_t state; /* Printer state */ char uri[HTTP_MAX_URI]; /* Printer URI */ if (http == NULL) return; /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", dest); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { if (response->request.status.status_code > IPP_OK_CONFLICT) { _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); ippDelete(response); return; } if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) state = (ipp_pstate_t)attr->values[0].integer; else state = IPP_PRINTER_STOPPED; switch (state) { case IPP_PRINTER_IDLE : _cupsLangPrintf(stdout, _("%s is ready"), dest); break; case IPP_PRINTER_PROCESSING : _cupsLangPrintf(stdout, _("%s is ready and printing"), dest); break; case IPP_PRINTER_STOPPED : _cupsLangPrintf(stdout, _("%s is not ready"), dest); break; } ippDelete(response); } else _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); } /* * 'usage()' - Show program usage. */ static void usage(void) { _cupsLangPuts(stderr, _("Usage: lpq [options] [+interval]")); _cupsLangPuts(stdout, _("Options:")); _cupsLangPuts(stdout, _("-a Show jobs on all destinations")); _cupsLangPuts(stdout, _("-E Encrypt the connection to the server")); _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port")); _cupsLangPuts(stdout, _("-l Show verbose (long) output")); _cupsLangPuts(stdout, _("-P destination Show status for the specified destination")); _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication")); exit(1); } cups-2.3.1/berkeley/lpc.c000664 000765 000024 00000022603 13574721672 015326 0ustar00mikestaff000000 000000 /* * "lpc" command for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include /* * Local functions... */ static int compare_strings(const char *, const char *, size_t); static void do_command(http_t *, const char *, const char *); static void show_help(const char *); static void show_status(http_t *, const char *); /* * 'main()' - Parse options and commands. */ int main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { http_t *http; /* Connection to server */ char line[1024], /* Input line from user */ *params; /* Pointer to parameters */ _cupsSetLocale(argv); /* * Connect to the scheduler... */ http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); if (argc > 1) { /* * Process a single command on the command-line... */ do_command(http, argv[1], argv[2]); } else { /* * Do the command prompt thing... */ _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no-newline version */ while (fgets(line, sizeof(line), stdin) != NULL) { /* * Strip trailing whitespace... */ for (params = line + strlen(line) - 1; params >= line;) if (!isspace(*params & 255)) break; else *params-- = '\0'; /* * Strip leading whitespace... */ for (params = line; isspace(*params & 255); params ++); if (params > line) _cups_strcpy(line, params); if (!line[0]) { /* * Nothing left, just show a prompt... */ _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ continue; } /* * Find any options in the string... */ for (params = line; *params != '\0'; params ++) if (isspace(*params & 255)) break; /* * Remove whitespace between the command and parameters... */ while (isspace(*params & 255)) *params++ = '\0'; /* * The "quit" and "exit" commands exit; otherwise, process as needed... */ if (!compare_strings(line, "quit", 1) || !compare_strings(line, "exit", 2)) break; if (*params == '\0') do_command(http, line, NULL); else do_command(http, line, params); /* * Put another prompt out to the user... */ _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ } } /* * Close the connection to the server and return... */ httpClose(http); return (0); } /* * 'compare_strings()' - Compare two command-line strings. */ static int /* O - -1 or 1 = no match, 0 = match */ compare_strings(const char *s, /* I - Command-line string */ const char *t, /* I - Option string */ size_t tmin) /* I - Minimum number of unique chars in option */ { size_t slen; /* Length of command-line string */ slen = strlen(s); if (slen < tmin) return (-1); else return (strncmp(s, t, slen)); } /* * 'do_command()' - Do an lpc command... */ static void do_command(http_t *http, /* I - HTTP connection to server */ const char *command, /* I - Command string */ const char *params) /* I - Parameters for command */ { if (!compare_strings(command, "status", 4)) show_status(http, params); else if (!compare_strings(command, "help", 1) || !strcmp(command, "?")) show_help(params); else _cupsLangPrintf(stdout, _("%s is not implemented by the CUPS version of lpc."), command); } /* * 'show_help()' - Show help messages. */ static void show_help(const char *command) /* I - Command to describe or NULL */ { if (!command) { _cupsLangPrintf(stdout, _("Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?")); } else if (!compare_strings(command, "help", 1) || !strcmp(command, "?")) _cupsLangPrintf(stdout, _("help\t\tGet help on commands.")); else if (!compare_strings(command, "status", 4)) _cupsLangPrintf(stdout, _("status\t\tShow status of daemon and queue.")); else _cupsLangPrintf(stdout, _("?Invalid help command unknown.")); } /* * 'show_status()' - Show printers. */ static void show_status(http_t *http, /* I - HTTP connection to server */ const char *dests) /* I - Destinations */ { ipp_t *request, /* IPP Request */ *response; /* IPP Response */ ipp_attribute_t *attr; /* Current attribute */ char *printer, /* Printer name */ *device, /* Device URI */ *delimiter; /* Char search result */ ipp_pstate_t pstate; /* Printer state */ int accepting; /* Is printer accepting jobs? */ int jobcount; /* Count of current jobs */ const char *dptr, /* Pointer into destination list */ *ptr; /* Pointer into printer name */ int match; /* Non-zero if this job matches */ static const char *requested[] = /* Requested attributes */ { "device-uri", "printer-is-accepting-jobs", "printer-name", "printer-state", "queued-job-count" }; if (http == NULL) return; /* * Build a CUPS_GET_PRINTERS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language */ request = ippNewRequest(CUPS_GET_PRINTERS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(requested) / sizeof(requested[0]), NULL, requested); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Loop through the printers returned in the list and display * their status... */ for (attr = response->attrs; attr != NULL; attr = attr->next) { /* * Skip leading attributes until we hit a job... */ while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) attr = attr->next; if (attr == NULL) break; /* * Pull the needed attributes from this job... */ printer = NULL; device = "file:/dev/null"; pstate = IPP_PRINTER_IDLE; jobcount = 0; accepting = 1; while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) { if (!strcmp(attr->name, "device-uri") && attr->value_tag == IPP_TAG_URI) device = attr->values[0].string.text; else if (!strcmp(attr->name, "printer-is-accepting-jobs") && attr->value_tag == IPP_TAG_BOOLEAN) accepting = attr->values[0].boolean; else if (!strcmp(attr->name, "printer-name") && attr->value_tag == IPP_TAG_NAME) printer = attr->values[0].string.text; else if (!strcmp(attr->name, "printer-state") && attr->value_tag == IPP_TAG_ENUM) pstate = (ipp_pstate_t)attr->values[0].integer; else if (!strcmp(attr->name, "queued-job-count") && attr->value_tag == IPP_TAG_INTEGER) jobcount = attr->values[0].integer; attr = attr->next; } /* * See if we have everything needed... */ if (printer == NULL) { if (attr == NULL) break; else continue; } /* * A single 'all' printer name is special, meaning all printers. */ if (dests != NULL && !strcmp(dests, "all")) dests = NULL; /* * See if this is a printer we're interested in... */ match = dests == NULL; if (dests != NULL) { for (dptr = dests; *dptr != '\0';) { /* * Skip leading whitespace and commas... */ while (isspace(*dptr & 255) || *dptr == ',') dptr ++; if (*dptr == '\0') break; /* * Compare names... */ for (ptr = printer; *ptr != '\0' && *dptr != '\0' && *ptr == *dptr; ptr ++, dptr ++) /* do nothing */; if (*ptr == '\0' && (*dptr == '\0' || *dptr == ',' || isspace(*dptr & 255))) { match = 1; break; } /* * Skip trailing junk... */ while (!isspace(*dptr & 255) && *dptr != '\0') dptr ++; while (isspace(*dptr & 255) || *dptr == ',') dptr ++; if (*dptr == '\0') break; } } /* * Display the printer entry if needed... */ if (match) { /* * Display it... */ printf("%s:\n", printer); if (!strncmp(device, "file:", 5)) _cupsLangPrintf(stdout, _("\tprinter is on device \'%s\' speed -1"), device + 5); else { /* * Just show the scheme... */ if ((delimiter = strchr(device, ':')) != NULL ) { *delimiter = '\0'; _cupsLangPrintf(stdout, _("\tprinter is on device \'%s\' speed -1"), device); } } if (accepting) _cupsLangPuts(stdout, _("\tqueuing is enabled")); else _cupsLangPuts(stdout, _("\tqueuing is disabled")); if (pstate != IPP_PRINTER_STOPPED) _cupsLangPuts(stdout, _("\tprinting is enabled")); else _cupsLangPuts(stdout, _("\tprinting is disabled")); if (jobcount == 0) _cupsLangPuts(stdout, _("\tno entries")); else _cupsLangPrintf(stdout, _("\t%d entries"), jobcount); _cupsLangPuts(stdout, _("\tdaemon present")); } if (attr == NULL) break; } ippDelete(response); } } cups-2.3.1/packaging/cups.spec.in000664 000765 000024 00000026231 13574721672 016762 0ustar00mikestaff000000 000000 # # RPM "spec" file for CUPS. # # Original version by Jason McMullan . # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1999-2007 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Conditional build options (--with name/--without name): # # dbus - Enable/disable DBUS support (default = enable) # dnssd - Enable/disable DNS-SD support (default = enable) # libusb1 - Enable/disable LIBUSB 1.0 support (default = enable) # static - Enable/disable static libraries (default = enable) # systemd - Enable/disable systemd support (default = enable) %{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}} %{?_with_dbus: %define _dbus --enable-dbus} %{!?_with_dbus: %define _dbus --disable-dbus} %{!?_with_dnssd: %{!?_without_dnssd: %define _with_dnssd --with-dnssd}} %{?_with_dnssd: %define _dnssd --enable-avahi} %{!?_with_dnssd: %define _dnssd --disable-avahi} %{!?_with_libusb1: %{!?_without_libusb1: %define _with_libusb1 --with-libusb1}} %{?_with_libusb1: %define _libusb1 --enable-libusb} %{!?_with_libusb1: %define _libusb1 --disable-libusb} %{!?_with_static: %{!?_without_static: %define _without_static --without-static}} %{?_with_static: %define _static --enable-static} %{!?_with_static: %define _static --disable-static} %{!?_with_systemd: %{!?_without_systemd: %define _with_systemd --with-systemd}} %{?_with_systemd: %define _systemd --enable-systemd} %{!?_with_systemd: %define _systemd --disable-systemd} Summary: CUPS Name: cups Version: @CUPS_VERSION@ Release: 0 Epoch: 1 License: GPL Group: System Environment/Daemons Source: https://github.com/apple/cups/releases/download/v%{version}/cups-%{version}-source.tar.gz Url: http://www.cups.org Packager: Anonymous Vendor: Example Corp # Package names are as defined for Red Hat (and clone) distributions BuildRequires: gnutls-devel, pam-devel %if %{?_with_dbus:1}%{!?_with_dbus:0} BuildRequires: dbus-devel %endif %if %{?_with_dnssd:1}%{!?_with_dnssd:0} BuildRequires: avahi-devel %endif %if %{?_with_libusb1:1}%{!?_with_libusb1:0} BuildRequires: libusb-devel >= 1.0 %endif %if %{?_with_systemd:1}%{!?_with_systemd:0} BuildRequires: systemd-devel %endif # Use buildroot so as not to disturb the version already installed BuildRoot: /tmp/%{name}-root # Dependencies... Requires: %{name}-libs = %{epoch}:%{version} Obsoletes: lpd, lpr, LPRng Provides: lpd, lpr, LPRng Obsoletes: cups-da, cups-de, cups-es, cups-et, cups-fi, cups-fr, cups-he Obsoletes: cups-id, cups-it, cups-ja, cups-ko, cups-nl, cups-no, cups-pl Obsoletes: cups-pt, cups-ru, cups-sv, cups-zh %package devel Summary: CUPS - development environment Group: Development/Libraries Requires: %{name}-libs = %{epoch}:%{version} %package libs Summary: CUPS - shared libraries Group: System Environment/Libraries Provides: libcups1 %package lpd Summary: CUPS - LPD support Group: System Environment/Daemons Requires: %{name} = %{epoch}:%{version} xinetd %description CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems. %description devel This package provides the CUPS headers and development environment. %description libs This package provides the CUPS shared libraries. %description lpd This package provides LPD client support. %prep %setup %build CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \ ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static} %{_systemd} # If we got this far, all prerequisite libraries must be here. make %install # Make sure the RPM_BUILD_ROOT directory exists. rm -rf $RPM_BUILD_ROOT make BUILDROOT=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT/usr/share/cups/banners $RPM_BUILD_ROOT/usr/share/cups/data %post %if %{?_with_systemd:1}%{!?_with_systemd:0} /bin/systemctl enable org.cups.cupsd.service if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl start org.cups.cupsd.service fi %else /sbin/chkconfig --add cups /sbin/chkconfig cups on # Restart cupsd if we are upgrading... if test $1 -gt 1; then /sbin/service cups stop /sbin/service cups start fi %endif %post libs /sbin/ldconfig %preun %if %{?_with_systemd:1}%{!?_with_systemd:0} if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl disable org.cups.cupsd.service fi %else if test $1 = 0; then /sbin/service cups stop /sbin/chkconfig --del cups fi %endif %postun %if %{?_with_systemd:1}%{!?_with_systemd:0} if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl start org.cups.cupsd.service fi %else if test $1 -ge 1; then /sbin/service cups stop /sbin/service cups start fi %endif %postun libs /sbin/ldconfig %clean rm -rf $RPM_BUILD_ROOT %files %docdir /usr/share/doc/cups %defattr(-,root,root) %dir /etc/cups %config(noreplace) /etc/cups/*.conf /etc/cups/cups-files.conf.default /etc/cups/cupsd.conf.default /etc/cups/snmp.conf.default %dir /etc/cups/ppd %attr(0700,root,root) %dir /etc/cups/ssl %if %{?_with_dbus:1}%{!?_with_dbus:0} # DBUS /etc/dbus-1/system.d/* %endif # PAM %dir /etc/pam.d /etc/pam.d/* %if %{?_with_systemd:1}%{!?_with_systemd:0} # SystemD /usr/lib/systemd/system/org.cups.cupsd.* %else # Legacy init support on Linux /etc/init.d/* /etc/rc0.d/* /etc/rc2.d/* /etc/rc3.d/* /etc/rc5.d/* %endif /usr/bin/cancel /usr/bin/cupstestppd /usr/bin/ippeveprinter /usr/bin/ipptool /usr/bin/lp* %dir /usr/lib/cups %dir /usr/lib/cups/backend %if %{?_with_dnssd:1}%{!?_with_dnssd:0} # DNS-SD /usr/bin/ippfind /usr/lib/cups/backend/dnssd %endif /usr/lib/cups/backend/http /usr/lib/cups/backend/https %attr(0700,root,root) /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipps %attr(0700,root,root) /usr/lib/cups/backend/lpd /usr/lib/cups/backend/snmp /usr/lib/cups/backend/socket /usr/lib/cups/backend/usb %dir /usr/lib/cups/cgi-bin /usr/lib/cups/cgi-bin/* %dir /usr/lib/cups/command /usr/lib/cups/command/* %dir /usr/lib/cups/daemon /usr/lib/cups/daemon/cups-deviced /usr/lib/cups/daemon/cups-driverd /usr/lib/cups/daemon/cups-exec %dir /usr/lib/cups/driver %dir /usr/lib/cups/filter /usr/lib/cups/filter/* %dir /usr/lib/cups/monitor /usr/lib/cups/monitor/* %dir /usr/lib/cups/notifier /usr/lib/cups/notifier/* /usr/sbin/* %dir /usr/share/cups %dir /usr/share/cups/drv /usr/share/cups/drv/* %dir /usr/share/cups/ipptool /usr/share/cups/ipptool/* %dir /usr/share/cups/mime /usr/share/cups/mime/* %dir /usr/share/cups/model %dir /usr/share/cups/ppdc /usr/share/cups/ppdc/* %dir /usr/share/cups/templates /usr/share/cups/templates/* %if %{?_with_libusb1:1}%{!?_with_libusb1:0} # LIBUSB quirks files %dir /usr/share/cups/usb /usr/share/cups/usb/* %endif %dir /usr/share/doc/cups /usr/share/doc/cups/*.* %dir /usr/share/doc/cups/help /usr/share/doc/cups/help/accounting.html /usr/share/doc/cups/help/admin.html /usr/share/doc/cups/help/cgi.html /usr/share/doc/cups/help/encryption.html /usr/share/doc/cups/help/firewalls.html /usr/share/doc/cups/help/glossary.html /usr/share/doc/cups/help/kerberos.html /usr/share/doc/cups/help/license.html /usr/share/doc/cups/help/man-*.html /usr/share/doc/cups/help/network.html /usr/share/doc/cups/help/options.html /usr/share/doc/cups/help/overview.html /usr/share/doc/cups/help/policies.html /usr/share/doc/cups/help/ref-*.html /usr/share/doc/cups/help/security.html /usr/share/doc/cups/help/sharing.html /usr/share/doc/cups/help/translation.html %dir /usr/share/doc/cups/images /usr/share/doc/cups/images/* #%dir /usr/share/doc/cups/ca #/usr/share/doc/cups/ca/* #%dir /usr/share/doc/cups/cs #/usr/share/doc/cups/cs/* %dir /usr/share/doc/cups/de /usr/share/doc/cups/de/* %dir /usr/share/doc/cups/es /usr/share/doc/cups/es/* #%dir /usr/share/doc/cups/fr #/usr/share/doc/cups/fr/* %dir /usr/share/doc/cups/ja /usr/share/doc/cups/ja/* %dir /usr/share/doc/cups/pt_BR /usr/share/doc/cups/pt_BR/* %dir /usr/share/doc/cups/ru /usr/share/doc/cups/ru/* %dir /usr/share/locale/ca /usr/share/locale/ca/cups_ca.po %dir /usr/share/locale/cs /usr/share/locale/cs/cups_cs.po %dir /usr/share/locale/de /usr/share/locale/de/cups_de.po %dir /usr/share/locale/en /usr/share/locale/en/cups_en.po %dir /usr/share/locale/es /usr/share/locale/es/cups_es.po %dir /usr/share/locale/fr /usr/share/locale/fr/cups_fr.po %dir /usr/share/locale/it /usr/share/locale/it/cups_it.po %dir /usr/share/locale/ja /usr/share/locale/ja/cups_ja.po %dir /usr/share/locale/pt_BR /usr/share/locale/pt_BR/cups_pt_BR.po %dir /usr/share/locale/ru /usr/share/locale/ru/cups_ru.po %dir /usr/share/locale/zh_CN /usr/share/locale/zh_CN/cups_zh_CN.po %dir /usr/share/man/man1 /usr/share/man/man1/cancel.1.gz /usr/share/man/man1/cups.1.gz /usr/share/man/man1/cupstestppd.1.gz /usr/share/man/man1/ippeveprinter.1.gz %if %{?_with_dnssd:1}%{!?_with_dnssd:0} # DNS-SD /usr/share/man/man1/ippfind.1.gz %endif /usr/share/man/man1/ipptool.1.gz /usr/share/man/man1/lp.1.gz /usr/share/man/man1/lpoptions.1.gz /usr/share/man/man1/lpq.1.gz /usr/share/man/man1/lpr.1.gz /usr/share/man/man1/lprm.1.gz /usr/share/man/man1/lpstat.1.gz %dir /usr/share/man/man5 /usr/share/man/man5/*.conf.5.gz /usr/share/man/man5/cupsd-logs.5.gz /usr/share/man/man5/ipptoolfile.5.gz /usr/share/man/man5/mime.*.5.gz %dir /usr/share/man/man7 /usr/share/man/man7/ippevepcl.7.gz /usr/share/man/man7/ippeveps.7.gz %dir /usr/share/man/man8 /usr/share/man/man8/cups-deviced.8.gz /usr/share/man/man8/cups-driverd.8.gz /usr/share/man/man8/cups-exec.8.gz /usr/share/man/man8/cups-snmp.8.gz /usr/share/man/man8/cupsaccept.8.gz /usr/share/man/man8/cupsctl.8.gz /usr/share/man/man8/cupsfilter.8.gz /usr/share/man/man8/cupsd.8.gz /usr/share/man/man8/cupsd-helper.8.gz /usr/share/man/man8/cupsdisable.8.gz /usr/share/man/man8/cupsenable.8.gz /usr/share/man/man8/cupsreject.8.gz /usr/share/man/man8/lpadmin.8.gz /usr/share/man/man8/lpc.8.gz /usr/share/man/man8/lpinfo.8.gz /usr/share/man/man8/lpmove.8.gz %dir /var/cache/cups %attr(0775,root,sys) %dir /var/cache/cups/rss %dir /var/log/cups %dir /var/run/cups %attr(0711,lp,sys) %dir /var/run/cups/certs %attr(0710,lp,sys) %dir /var/spool/cups %attr(1770,lp,sys) %dir /var/spool/cups/tmp # Desktop files /usr/share/applications/* /usr/share/icons/* %files devel %defattr(-,root,root) %dir /usr/share/cups/examples /usr/share/cups/examples/* %dir /usr/share/man/man1 /usr/share/man/man1/cups-config.1.gz /usr/share/man/man1/ppd*.1.gz %dir /usr/share/man/man5 /usr/share/man/man5/ppdcfile.5.gz /usr/share/man/man7/backend.7.gz /usr/share/man/man7/filter.7.gz /usr/share/man/man7/notifier.7.gz /usr/bin/cups-config /usr/bin/ppd* %dir /usr/include/cups /usr/include/cups/* /usr/lib*/*.so %if %{?_with_static:1}%{!?_with_static:0} /usr/lib*/*.a %endif %dir /usr/share/doc/cups/help /usr/share/doc/cups/help/api*.html /usr/share/doc/cups/help/cupspm.* /usr/share/doc/cups/help/postscript-driver.html /usr/share/doc/cups/help/ppd-compiler.html /usr/share/doc/cups/help/raster-driver.html /usr/share/doc/cups/help/spec*.html %files libs %defattr(-,root,root) /usr/lib*/*.so.* %files lpd %defattr(-,root,root) %if %{?_with_systemd:1}%{!?_with_systemd:0} # SystemD /usr/lib/systemd/system/org.cups.cups-lpd* %else # Legacy xinetd /etc/xinetd.d/cups-lpd %endif %dir /usr/lib/cups %dir /usr/lib/cups/daemon /usr/lib/cups/daemon/cups-lpd %dir /usr/share/man/man8 /usr/share/man/man8/cups-lpd.8.gz cups-2.3.1/packaging/cups.spec000664 000765 000024 00000026206 13574721706 016355 0ustar00mikestaff000000 000000 # # RPM "spec" file for CUPS. # # Original version by Jason McMullan . # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1999-2007 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Conditional build options (--with name/--without name): # # dbus - Enable/disable DBUS support (default = enable) # dnssd - Enable/disable DNS-SD support (default = enable) # libusb1 - Enable/disable LIBUSB 1.0 support (default = enable) # static - Enable/disable static libraries (default = enable) # systemd - Enable/disable systemd support (default = enable) %{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}} %{?_with_dbus: %define _dbus --enable-dbus} %{!?_with_dbus: %define _dbus --disable-dbus} %{!?_with_dnssd: %{!?_without_dnssd: %define _with_dnssd --with-dnssd}} %{?_with_dnssd: %define _dnssd --enable-avahi} %{!?_with_dnssd: %define _dnssd --disable-avahi} %{!?_with_libusb1: %{!?_without_libusb1: %define _with_libusb1 --with-libusb1}} %{?_with_libusb1: %define _libusb1 --enable-libusb} %{!?_with_libusb1: %define _libusb1 --disable-libusb} %{!?_with_static: %{!?_without_static: %define _without_static --without-static}} %{?_with_static: %define _static --enable-static} %{!?_with_static: %define _static --disable-static} %{!?_with_systemd: %{!?_without_systemd: %define _with_systemd --with-systemd}} %{?_with_systemd: %define _systemd --enable-systemd} %{!?_with_systemd: %define _systemd --disable-systemd} Summary: CUPS Name: cups Version: 2.3.1 Release: 0 Epoch: 1 License: GPL Group: System Environment/Daemons Source: https://github.com/apple/cups/releases/download/v2.3.1/cups-2.3.1-source.tar.gz Url: http://www.cups.org Packager: Anonymous Vendor: Example Corp # Package names are as defined for Red Hat (and clone) distributions BuildRequires: gnutls-devel, pam-devel %if %{?_with_dbus:1}%{!?_with_dbus:0} BuildRequires: dbus-devel %endif %if %{?_with_dnssd:1}%{!?_with_dnssd:0} BuildRequires: avahi-devel %endif %if %{?_with_libusb1:1}%{!?_with_libusb1:0} BuildRequires: libusb-devel >= 1.0 %endif %if %{?_with_systemd:1}%{!?_with_systemd:0} BuildRequires: systemd-devel %endif # Use buildroot so as not to disturb the version already installed BuildRoot: /tmp/%{name}-root # Dependencies... Requires: %{name}-libs = %{epoch}:%{version} Obsoletes: lpd, lpr, LPRng Provides: lpd, lpr, LPRng Obsoletes: cups-da, cups-de, cups-es, cups-et, cups-fi, cups-fr, cups-he Obsoletes: cups-id, cups-it, cups-ja, cups-ko, cups-nl, cups-no, cups-pl Obsoletes: cups-pt, cups-ru, cups-sv, cups-zh %package devel Summary: CUPS - development environment Group: Development/Libraries Requires: %{name}-libs = %{epoch}:%{version} %package libs Summary: CUPS - shared libraries Group: System Environment/Libraries Provides: libcups1 %package lpd Summary: CUPS - LPD support Group: System Environment/Daemons Requires: %{name} = %{epoch}:%{version} xinetd %description CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems. %description devel This package provides the CUPS headers and development environment. %description libs This package provides the CUPS shared libraries. %description lpd This package provides LPD client support. %prep %setup %build CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \ ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static} %{_systemd} # If we got this far, all prerequisite libraries must be here. make %install # Make sure the RPM_BUILD_ROOT directory exists. rm -rf $RPM_BUILD_ROOT make BUILDROOT=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT/usr/share/cups/banners $RPM_BUILD_ROOT/usr/share/cups/data %post %if %{?_with_systemd:1}%{!?_with_systemd:0} /bin/systemctl enable org.cups.cupsd.service if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl start org.cups.cupsd.service fi %else /sbin/chkconfig --add cups /sbin/chkconfig cups on # Restart cupsd if we are upgrading... if test $1 -gt 1; then /sbin/service cups stop /sbin/service cups start fi %endif %post libs /sbin/ldconfig %preun %if %{?_with_systemd:1}%{!?_with_systemd:0} if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl disable org.cups.cupsd.service fi %else if test $1 = 0; then /sbin/service cups stop /sbin/chkconfig --del cups fi %endif %postun %if %{?_with_systemd:1}%{!?_with_systemd:0} if test $1 -ge 1; then /bin/systemctl stop org.cups.cupsd.service /bin/systemctl start org.cups.cupsd.service fi %else if test $1 -ge 1; then /sbin/service cups stop /sbin/service cups start fi %endif %postun libs /sbin/ldconfig %clean rm -rf $RPM_BUILD_ROOT %files %docdir /usr/share/doc/cups %defattr(-,root,root) %dir /etc/cups %config(noreplace) /etc/cups/*.conf /etc/cups/cups-files.conf.default /etc/cups/cupsd.conf.default /etc/cups/snmp.conf.default %dir /etc/cups/ppd %attr(0700,root,root) %dir /etc/cups/ssl %if %{?_with_dbus:1}%{!?_with_dbus:0} # DBUS /etc/dbus-1/system.d/* %endif # PAM %dir /etc/pam.d /etc/pam.d/* %if %{?_with_systemd:1}%{!?_with_systemd:0} # SystemD /usr/lib/systemd/system/org.cups.cupsd.* %else # Legacy init support on Linux /etc/init.d/* /etc/rc0.d/* /etc/rc2.d/* /etc/rc3.d/* /etc/rc5.d/* %endif /usr/bin/cancel /usr/bin/cupstestppd /usr/bin/ippeveprinter /usr/bin/ipptool /usr/bin/lp* %dir /usr/lib/cups %dir /usr/lib/cups/backend %if %{?_with_dnssd:1}%{!?_with_dnssd:0} # DNS-SD /usr/bin/ippfind /usr/lib/cups/backend/dnssd %endif /usr/lib/cups/backend/http /usr/lib/cups/backend/https %attr(0700,root,root) /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipps %attr(0700,root,root) /usr/lib/cups/backend/lpd /usr/lib/cups/backend/snmp /usr/lib/cups/backend/socket /usr/lib/cups/backend/usb %dir /usr/lib/cups/cgi-bin /usr/lib/cups/cgi-bin/* %dir /usr/lib/cups/command /usr/lib/cups/command/* %dir /usr/lib/cups/daemon /usr/lib/cups/daemon/cups-deviced /usr/lib/cups/daemon/cups-driverd /usr/lib/cups/daemon/cups-exec %dir /usr/lib/cups/driver %dir /usr/lib/cups/filter /usr/lib/cups/filter/* %dir /usr/lib/cups/monitor /usr/lib/cups/monitor/* %dir /usr/lib/cups/notifier /usr/lib/cups/notifier/* /usr/sbin/* %dir /usr/share/cups %dir /usr/share/cups/drv /usr/share/cups/drv/* %dir /usr/share/cups/ipptool /usr/share/cups/ipptool/* %dir /usr/share/cups/mime /usr/share/cups/mime/* %dir /usr/share/cups/model %dir /usr/share/cups/ppdc /usr/share/cups/ppdc/* %dir /usr/share/cups/templates /usr/share/cups/templates/* %if %{?_with_libusb1:1}%{!?_with_libusb1:0} # LIBUSB quirks files %dir /usr/share/cups/usb /usr/share/cups/usb/* %endif %dir /usr/share/doc/cups /usr/share/doc/cups/*.* %dir /usr/share/doc/cups/help /usr/share/doc/cups/help/accounting.html /usr/share/doc/cups/help/admin.html /usr/share/doc/cups/help/cgi.html /usr/share/doc/cups/help/encryption.html /usr/share/doc/cups/help/firewalls.html /usr/share/doc/cups/help/glossary.html /usr/share/doc/cups/help/kerberos.html /usr/share/doc/cups/help/license.html /usr/share/doc/cups/help/man-*.html /usr/share/doc/cups/help/network.html /usr/share/doc/cups/help/options.html /usr/share/doc/cups/help/overview.html /usr/share/doc/cups/help/policies.html /usr/share/doc/cups/help/ref-*.html /usr/share/doc/cups/help/security.html /usr/share/doc/cups/help/sharing.html /usr/share/doc/cups/help/translation.html %dir /usr/share/doc/cups/images /usr/share/doc/cups/images/* #%dir /usr/share/doc/cups/ca #/usr/share/doc/cups/ca/* #%dir /usr/share/doc/cups/cs #/usr/share/doc/cups/cs/* %dir /usr/share/doc/cups/de /usr/share/doc/cups/de/* %dir /usr/share/doc/cups/es /usr/share/doc/cups/es/* #%dir /usr/share/doc/cups/fr #/usr/share/doc/cups/fr/* %dir /usr/share/doc/cups/ja /usr/share/doc/cups/ja/* %dir /usr/share/doc/cups/pt_BR /usr/share/doc/cups/pt_BR/* %dir /usr/share/doc/cups/ru /usr/share/doc/cups/ru/* %dir /usr/share/locale/ca /usr/share/locale/ca/cups_ca.po %dir /usr/share/locale/cs /usr/share/locale/cs/cups_cs.po %dir /usr/share/locale/de /usr/share/locale/de/cups_de.po %dir /usr/share/locale/en /usr/share/locale/en/cups_en.po %dir /usr/share/locale/es /usr/share/locale/es/cups_es.po %dir /usr/share/locale/fr /usr/share/locale/fr/cups_fr.po %dir /usr/share/locale/it /usr/share/locale/it/cups_it.po %dir /usr/share/locale/ja /usr/share/locale/ja/cups_ja.po %dir /usr/share/locale/pt_BR /usr/share/locale/pt_BR/cups_pt_BR.po %dir /usr/share/locale/ru /usr/share/locale/ru/cups_ru.po %dir /usr/share/locale/zh_CN /usr/share/locale/zh_CN/cups_zh_CN.po %dir /usr/share/man/man1 /usr/share/man/man1/cancel.1.gz /usr/share/man/man1/cups.1.gz /usr/share/man/man1/cupstestppd.1.gz /usr/share/man/man1/ippeveprinter.1.gz %if %{?_with_dnssd:1}%{!?_with_dnssd:0} # DNS-SD /usr/share/man/man1/ippfind.1.gz %endif /usr/share/man/man1/ipptool.1.gz /usr/share/man/man1/lp.1.gz /usr/share/man/man1/lpoptions.1.gz /usr/share/man/man1/lpq.1.gz /usr/share/man/man1/lpr.1.gz /usr/share/man/man1/lprm.1.gz /usr/share/man/man1/lpstat.1.gz %dir /usr/share/man/man5 /usr/share/man/man5/*.conf.5.gz /usr/share/man/man5/cupsd-logs.5.gz /usr/share/man/man5/ipptoolfile.5.gz /usr/share/man/man5/mime.*.5.gz %dir /usr/share/man/man7 /usr/share/man/man7/ippevepcl.7.gz /usr/share/man/man7/ippeveps.7.gz %dir /usr/share/man/man8 /usr/share/man/man8/cups-deviced.8.gz /usr/share/man/man8/cups-driverd.8.gz /usr/share/man/man8/cups-exec.8.gz /usr/share/man/man8/cups-snmp.8.gz /usr/share/man/man8/cupsaccept.8.gz /usr/share/man/man8/cupsctl.8.gz /usr/share/man/man8/cupsfilter.8.gz /usr/share/man/man8/cupsd.8.gz /usr/share/man/man8/cupsd-helper.8.gz /usr/share/man/man8/cupsdisable.8.gz /usr/share/man/man8/cupsenable.8.gz /usr/share/man/man8/cupsreject.8.gz /usr/share/man/man8/lpadmin.8.gz /usr/share/man/man8/lpc.8.gz /usr/share/man/man8/lpinfo.8.gz /usr/share/man/man8/lpmove.8.gz %dir /var/cache/cups %attr(0775,root,sys) %dir /var/cache/cups/rss %dir /var/log/cups %dir /var/run/cups %attr(0711,lp,sys) %dir /var/run/cups/certs %attr(0710,lp,sys) %dir /var/spool/cups %attr(1770,lp,sys) %dir /var/spool/cups/tmp # Desktop files /usr/share/applications/* /usr/share/icons/* %files devel %defattr(-,root,root) %dir /usr/share/cups/examples /usr/share/cups/examples/* %dir /usr/share/man/man1 /usr/share/man/man1/cups-config.1.gz /usr/share/man/man1/ppd*.1.gz %dir /usr/share/man/man5 /usr/share/man/man5/ppdcfile.5.gz /usr/share/man/man7/backend.7.gz /usr/share/man/man7/filter.7.gz /usr/share/man/man7/notifier.7.gz /usr/bin/cups-config /usr/bin/ppd* %dir /usr/include/cups /usr/include/cups/* /usr/lib*/*.so %if %{?_with_static:1}%{!?_with_static:0} /usr/lib*/*.a %endif %dir /usr/share/doc/cups/help /usr/share/doc/cups/help/api*.html /usr/share/doc/cups/help/cupspm.* /usr/share/doc/cups/help/postscript-driver.html /usr/share/doc/cups/help/ppd-compiler.html /usr/share/doc/cups/help/raster-driver.html /usr/share/doc/cups/help/spec*.html %files libs %defattr(-,root,root) /usr/lib*/*.so.* %files lpd %defattr(-,root,root) %if %{?_with_systemd:1}%{!?_with_systemd:0} # SystemD /usr/lib/systemd/system/org.cups.cups-lpd* %else # Legacy xinetd /etc/xinetd.d/cups-lpd %endif %dir /usr/lib/cups %dir /usr/lib/cups/daemon /usr/lib/cups/daemon/cups-lpd %dir /usr/share/man/man8 /usr/share/man/man8/cups-lpd.8.gz cups-2.3.1/packaging/cups.list.in000664 000765 000024 00000053546 13574721672 017014 0ustar00mikestaff000000 000000 # # ESP Package Manager (EPM) file list for CUPS. # # 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. # # Product information %product CUPS %copyright 2007-2019 by Apple Inc. %vendor Apple Inc. #%license LICENSE %readme LICENSE %format rpm # Red Hat and their epochs... %version 1:@CUPS_VERSION@ %format !rpm %version @CUPS_VERSION@ %format all %description CUPS is the standards-based, open source printing system developed by %description Apple Inc. for macOS® and other UNIX®-like operating systems. %format rpm %provides lpd %provides lpr %provides LPRng %replaces lpd %replaces lpr %replaces LPRng %requires cups-libs 1:@CUPS_VERSION@ # Replace all of the old localization subpackages from CUPS 1.2/1.3 %replaces cups-da %replaces cups-de %replaces cups-es %replaces cups-et %replaces cups-fi %replaces cups-fr %replaces cups-he %replaces cups-id %replaces cups-it %replaces cups-ja %replaces cups-ko %replaces cups-nl %replaces cups-no %replaces cups-pl %replaces cups-pt %replaces cups-ru %replaces cups-sv %replaces cups-zh %format deb %provides cupsys %provides cupsys-client %provides cupsys-bsd %requires cups-libs # Replace all of the old localization subpackages from CUPS 1.2/1.3 %replaces cups-da %replaces cups-de %replaces cups-es %replaces cups-et %replaces cups-fi %replaces cups-fr %replaces cups-he %replaces cups-id %replaces cups-it %replaces cups-ja %replaces cups-ko %replaces cups-nl %replaces cups-no %replaces cups-pl %replaces cups-pt %replaces cups-ru %replaces cups-sv %replaces cups-zh %format pkg %replaces SUNWlpmsg LP Alerts %replaces SUNWlpr LP Print Service, (Root) %replaces SUNWlps LP Print Service - Server, (Usr) %replaces SUNWlpu LP Print Service - Client, (Usr) %replaces SUNWpsu LP Print Server, (Usr) %replaces SUNWpsr LP Print Server, (Root) %replaces SUNWpcu LP Print Client, (Usr) %replaces SUNWpcr LP Print Client, (Root) %replaces SUNWppm %replaces SUNWmp %replaces SUNWscplp SunOS Print Compatibility %format inst %replaces patch*.print_*.* 0 0 1289999999 1289999999 %replaces maint*.print_*.* 0 0 1289999999 1289999999 %replaces print 0 0 1289999999 1289999999 %replaces fw_cups 0 0 1289999999 1289999999 %incompat patch*.print_*.* 0 0 1289999999 1289999999 %incompat maint*.print_*.* 0 0 1289999999 1289999999 %incompat print 0 0 1289999999 1289999999 %incompat fw_cups 0 0 1289999999 1289999999 %requires cups.sw.libs # Replace all of the old localization subpackages from CUPS 1.2/1.3 %replaces cups.sw.da %replaces cups.sw.de %replaces cups.sw.es %replaces cups.sw.et %replaces cups.sw.fi %replaces cups.sw.fr %replaces cups.sw.he %replaces cups.sw.id %replaces cups.sw.it %replaces cups.sw.ja %replaces cups.sw.ko %replaces cups.sw.nl %replaces cups.sw.no %replaces cups.sw.pl %replaces cups.sw.pt %replaces cups.sw.ru %replaces cups.sw.sv %replaces cups.sw.zh %format portable %requires cups-libs # Replace all of the old localization subpackages from CUPS 1.2/1.3 %replaces cups-da %replaces cups-de %replaces cups-es %replaces cups-et %replaces cups-fi %replaces cups-fr %replaces cups-he %replaces cups-id %replaces cups-it %replaces cups-ja %replaces cups-ko %replaces cups-nl %replaces cups-no %replaces cups-pl %replaces cups-pt %replaces cups-ru %replaces cups-sv %replaces cups-zh %format all %subpackage libs %description Shared libraries %format deb %provides libcups1 %provides libcupsys2 %provides libcupsys2-gnutls10 %provides libcupsimage2 %format all %subpackage devel %description Development environment %format deb %provides libcupsys2-dev %provides libcupsimage2-dev %format all %subpackage lpd %description LPD support %subpackage # # GNU variables... # $prefix=@prefix@ $exec_prefix=@exec_prefix@ $bindir=@bindir@ $datarootdir=@datarootdir@ $datadir=@datadir@ $includedir=@includedir@ $infodir=@infodir@ $libdir=@libdir@ $libexecdir=@libexecdir@ $localstatedir=@localstatedir@ $mandir=@mandir@ $oldincludedir=@oldincludedir@ $sbindir=@sbindir@ $sharedstatedir=@sharedstatedir@ $srcdir=@srcdir@ $sysconfdir=@sysconfdir@ $top_srcdir=@top_srcdir@ # # CUPS variables... # $AMANDIR=@AMANDIR@ $BINDIR=@bindir@ $CACHEDIR=@CUPS_CACHEDIR@ $DATADIR=@CUPS_DATADIR@ $DOCDIR=@CUPS_DOCROOT@ $INCLUDEDIR=${includedir} $INITDIR=@INITDIR@ $INITDDIR=@INITDDIR@ $LIBDIR=${libdir} $LOCALEDIR=@CUPS_LOCALEDIR@ $LOGDIR=@CUPS_LOGDIR@ $MANDIR=@mandir@ $PAMDIR=@PAMDIR@ $PMANDIR=@PMANDIR@ $REQUESTS=@CUPS_REQUESTS@ $SBINDIR=@sbindir@ $SERVERBIN=@CUPS_SERVERBIN@ $SERVERROOT=@CUPS_SERVERROOT@ $STATEDIR=@CUPS_STATEDIR@ $XINETD=@XINETD@ $LIB32DIR=@LIB32DIR@ $LIB64DIR=@LIB64DIR@ $MDNS=@MDNS@ $CUPS_USER=@CUPS_USER@ $CUPS_GROUP=@CUPS_GROUP@ $CUPS_PRIMARY_SYSTEM_GROUP=@CUPS_PRIMARY_SYSTEM_GROUP@ $CUPS_PERM=0@CUPS_CONFIG_FILE_PERM@ $INSTALLSTATIC=@INSTALLSTATIC@ $LIBZ=@LIBZ@ $DSOLIBS=@DSOLIBS@ # Make sure the MD5 password file is now owned by CUPS_USER... %postinstall if test -f $SERVERROOT/passwd.md5; then %postinstall chown $CUPS_USER $SERVERROOT/passwd.md5 %postinstall fi # Make sure the shared libraries are refreshed... %subpackage libs %system linux %postinstall ldconfig %system all %subpackage # Server programs %system all # Server files f 0555 root sys $SBINDIR/cupsd scheduler/cupsd d 0755 root sys $SERVERBIN - %system darwin d 0755 root sys $SERVERBIN/apple - f 0555 root sys $SERVERBIN/apple/ipp backend/ipp l 0755 root sys $SERVERBIN/apple/http ipp l 0755 root sys $SERVERBIN/apple/https ipp l 0755 root sys $SERVERBIN/apple/ipps ipp %system all d 0755 root sys $SERVERBIN/backend - f 0500 root sys $SERVERBIN/backend/ipp backend/ipp l 0700 root sys $SERVERBIN/backend/http ipp l 0700 root sys $SERVERBIN/backend/https ipp l 0700 root sys $SERVERBIN/backend/ipps ipp f 0500 root sys $SERVERBIN/backend/lpd backend/lpd %if DNSSD_BACKEND f 0500 root sys $SERVERBIN/backend/dnssd backend/dnssd %system darwin l 0700 root sys $SERVERBIN/backend/mdns dnssd %system all %endif f 0555 root sys $SERVERBIN/backend/snmp backend/snmp f 0555 root sys $SERVERBIN/backend/socket backend/socket f 0555 root sys $SERVERBIN/backend/usb backend/usb d 0755 root sys $SERVERBIN/cgi-bin - f 0555 root sys $SERVERBIN/cgi-bin/admin.cgi cgi-bin/admin.cgi f 0555 root sys $SERVERBIN/cgi-bin/classes.cgi cgi-bin/classes.cgi f 0555 root sys $SERVERBIN/cgi-bin/help.cgi cgi-bin/help.cgi f 0555 root sys $SERVERBIN/cgi-bin/jobs.cgi cgi-bin/jobs.cgi f 0555 root sys $SERVERBIN/cgi-bin/printers.cgi cgi-bin/printers.cgi d 0755 root sys $SERVERBIN/command - f 0555 root sys $SERVERBIN/command/ippevepcl tools/ippevepcl f 0555 root sys $SERVERBIN/command/ippeveps tools/ippeveps d 0755 root sys $SERVERBIN/daemon - f 0555 root sys $SERVERBIN/daemon/cups-deviced scheduler/cups-deviced f 0555 root sys $SERVERBIN/daemon/cups-driverd scheduler/cups-driverd d 0755 root sys $SERVERBIN/driver - d 0755 root sys $SERVERBIN/filter - f 0555 root sys $SERVERBIN/filter/commandtops filter/commandtops f 0555 root sys $SERVERBIN/filter/gziptoany filter/gziptoany f 0555 root sys $SERVERBIN/filter/pstops filter/pstops f 0555 root sys $SERVERBIN/filter/rastertolabel filter/rastertolabel l 0755 root sys $SERVERBIN/filter/rastertodymo rastertolabel f 0555 root sys $SERVERBIN/filter/rastertoepson filter/rastertoepson f 0555 root sys $SERVERBIN/filter/rastertohp filter/rastertohp f 0555 root sys $SERVERBIN/filter/rastertopwg filter/rastertopwg d 0755 root sys $SERVERBIN/notifier - f 0555 root sys $SERVERBIN/notifier/mailto notifier/mailto %subpackage lpd d 0755 root sys $SERVERBIN/daemon - f 0555 root sys $SERVERBIN/daemon/cups-lpd scheduler/cups-lpd %subpackage # Admin commands d 0755 root sys $SBINDIR - f 0555 root sys $SBINDIR/cupsaccept systemv/cupsaccept f 0555 root sys $SBINDIR/cupsctl systemv/cupsctl l 0755 root sys $SBINDIR/cupsdisable cupsaccept l 0755 root sys $SBINDIR/cupsenable cupsaccept l 0755 root sys $SBINDIR/cupsreject cupsaccept f 0555 root sys $SBINDIR/lpadmin systemv/lpadmin f 0555 root sys $SBINDIR/lpc berkeley/lpc f 0555 root sys $SBINDIR/lpinfo systemv/lpinfo f 0555 root sys $SBINDIR/lpmove systemv/lpmove %system irix l 0755 root sys /usr/etc/lpc $SBINDIR/lpc %system all # User commands d 0755 root sys $BINDIR - f 0555 root sys $BINDIR/cancel systemv/cancel f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd f 0555 root sys $BINDIR/ippeveprinter tools/ippeveprinter %if DNSSD_BACKEND f 0555 root sys $BINDIR/ippfind tools/ippfind %endif f 0555 root sys $BINDIR/ipptool tools/ipptool f 0555 root sys $BINDIR/lp systemv/lp f 0555 root sys $BINDIR/lpoptions systemv/lpoptions f 0555 root sys $BINDIR/lpq berkeley/lpq f 0555 root sys $BINDIR/lpr berkeley/lpr f 0555 root sys $BINDIR/lprm berkeley/lprm f 0555 root sys $BINDIR/lpstat systemv/lpstat %system irix l 0755 root sys /usr/bsd/lpq $BINDIR/lpq l 0755 root sys /usr/bsd/lpr $BINDIR/lpr l 0755 root sys /usr/bsd/lprm $BINDIR/lprm %system all # DSOs %if DSOLIBS %subpackage libs %system darwin f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib nostrip() l 0755 root sys $LIBDIR/libcups.dylib libcups.2.dylib f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib nostrip() l 0755 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib %system !darwin f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2 nostrip() l 0755 root sys $LIBDIR/libcups.so libcups.so.2 f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2 nostrip() l 0755 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2 %system all %subpackage %endif # Directories d 0755 root sys $LOGDIR - d 0710 root $CUPS_GROUP $REQUESTS - d 1770 root $CUPS_GROUP $REQUESTS/tmp - d 0775 root $CUPS_GROUP $CACHEDIR - d 0775 root $CUPS_GROUP $CACHEDIR/rss - #d 0755 root $CUPS_GROUP $CACHEDIR/ppd - %system !darwin d 0755 root $CUPS_GROUP $STATEDIR - %system all d 0511 root $CUPS_PRIMARY_SYSTEM_GROUP $STATEDIR/certs - # Data files f 0444 root sys $LOCALEDIR/ca/cups_ca.po locale/cups_ca.po f 0444 root sys $LOCALEDIR/cs/cups_cs.po locale/cups_cs.po #f 0444 root sys $LOCALEDIR/da/cups_da.po locale/cups_da.po f 0444 root sys $LOCALEDIR/de/cups_de.po locale/cups_de.po f 0444 root sys $LOCALEDIR/es/cups_es.po locale/cups_es.po #f 0444 root sys $LOCALEDIR/et/cups_et.po locale/cups_et.po #f 0444 root sys $LOCALEDIR/eu/cups_eu.po locale/cups_eu.po #f 0444 root sys $LOCALEDIR/fi/cups_fi.po locale/cups_fi.po f 0444 root sys $LOCALEDIR/fr/cups_fr.po locale/cups_fr.po #f 0444 root sys $LOCALEDIR/he/cups_he.po locale/cups_he.po #f 0444 root sys $LOCALEDIR/id/cups_id.po locale/cups_id.po f 0444 root sys $LOCALEDIR/it/cups_it.po locale/cups_it.po f 0444 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po #f 0444 root sys $LOCALEDIR/ko/cups_ko.po locale/cups_ko.po #f 0444 root sys $LOCALEDIR/nl/cups_nl.po locale/cups_nl.po #f 0444 root sys $LOCALEDIR/no/cups_no.po locale/cups_no.po #f 0444 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po #f 0444 root sys $LOCALEDIR/pt/cups_pt.po locale/cups_pt.po f 0444 root sys $LOCALEDIR/pt_BR/cups_pt_BR.po locale/cups_pt_BR.po f 0444 root sys $LOCALEDIR/ru/cups_ru.po locale/cups_ru.po #f 0444 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po #f 0444 root sys $LOCALEDIR/zh/cups_zh.po locale/cups_zh.po #f 0444 root sys $LOCALEDIR/zh_TW/cups_zh_TW.po locale/cups_zh_TW.po d 0755 root sys $DATADIR - d 0755 root sys $DATADIR/banners - d 0755 root sys $DATADIR/data - d 0755 root sys $DATADIR/drv - f 0444 root sys $DATADIR/drv/sample.drv ppdc/sample.drv d 0755 root sys $DATADIR/examples - f 0444 root sys $DATADIR/examples examples/*.drv d 0755 root sys $DATADIR/ipptool - f 0444 root sys $DATADIR/ipptool examples/*.jpg f 0444 root sys $DATADIR/ipptool examples/*.test f 0444 root sys $DATADIR/ipptool examples/document-*.p* f 0444 root sys $DATADIR/ipptool examples/onepage-*.p* f 0444 root sys $DATADIR/ipptool examples/testfile.* d 0755 root sys $DATADIR/mime - f 0444 root sys $DATADIR/mime/mime.convs conf/mime.convs f 0444 root sys $DATADIR/mime/mime.types conf/mime.types d 0755 root sys $DATADIR/model - d 0755 root sys $DATADIR/ppdc - f 0444 root sys $DATADIR/ppdc data/*.defs f 0444 root sys $DATADIR/ppdc data/*.h d 0755 root sys $DATADIR/templates - f 0444 root sys $DATADIR/templates templates/*.tmpl ## Template files d 0755 root sys $DATADIR/templates/de f 0444 root sys $DATADIR/templates/de templates/de/*.tmpl d 0755 root sys $DATADIR/templates/es f 0444 root sys $DATADIR/templates/es templates/es/*.tmpl #d 0755 root sys $DATADIR/templates/et #f 0444 root sys $DATADIR/templates/et templates/et/*.tmpl #d 0755 root sys $DATADIR/templates/eu #f 0444 root sys $DATADIR/templates/eu templates/eu/*.tmpl d 0755 root sys $DATADIR/templates/fr f 0444 root sys $DATADIR/templates/fr templates/fr/*.tmpl #d 0755 root sys $DATADIR/templates/he #f 0444 root sys $DATADIR/templates/he templates/he/*.tmpl #d 0755 root sys $DATADIR/templates/id #f 0444 root sys $DATADIR/templates/id templates/id/*.tmpl #d 0755 root sys $DATADIR/templates/it #f 0444 root sys $DATADIR/templates/it templates/it/*.tmpl d 0755 root sys $DATADIR/templates/ja f 0444 root sys $DATADIR/templates/ja templates/ja/*.tmpl #d 0755 root sys $DATADIR/templates/pl #f 0444 root sys $DATADIR/templates/pl templates/pl/*.tmpl d 0755 root sys $DATADIR/templates/pt_BR f 0444 root sys $DATADIR/templates/pt_BR templates/pt_BR/*.tmpl d 0755 root sys $DATADIR/templates/ru f 0444 root sys $DATADIR/templates/ru templates/ru/*.tmpl #d 0755 root sys $DATADIR/templates/sv #f 0444 root sys $DATADIR/templates/sv templates/sv/*.tmpl #d 0755 root sys $DATADIR/templates/zh_TW #f 0444 root sys $DATADIR/templates/zh_TW templates/zh_TW/*.tmpl # Config files d 0755 root $CUPS_GROUP $SERVERROOT - d 0755 root $CUPS_GROUP $SERVERROOT/ppd - d 0700 root $CUPS_GROUP $SERVERROOT/ssl - c $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cups-files.conf conf/cups-files.conf f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cups-files.conf.default conf/cups-files.conf c $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cupsd.conf conf/cupsd.conf f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cupsd.conf.default conf/cupsd.conf c $CUPS_PERM root $CUPS_GROUP $SERVERROOT/snmp.conf conf/snmp.conf %if PAMDIR d 0755 root sys $PAMDIR - c 0644 root sys $PAMDIR/cups conf/@PAMFILE@ %endif %subpackage devel # Developer files f 0555 root sys $BINDIR/cups-config cups-config d 0755 root sys $INCLUDEDIR/cups - f 0444 root sys $INCLUDEDIR/cups/adminutil.h cups/adminutil.h f 0444 root sys $INCLUDEDIR/cups/array.h cups/array.h f 0444 root sys $INCLUDEDIR/cups/backend.h cups/backend.h f 0444 root sys $INCLUDEDIR/cups/cups.h cups/cups.h f 0444 root sys $INCLUDEDIR/cups/dir.h cups/dir.h f 0444 root sys $INCLUDEDIR/cups/file.h cups/file.h f 0444 root sys $INCLUDEDIR/cups/http.h cups/http.h f 0444 root sys $INCLUDEDIR/cups/ipp.h cups/ipp.h f 0444 root sys $INCLUDEDIR/cups/language.h cups/language.h f 0444 root sys $INCLUDEDIR/cups/ppd.h cups/ppd.h f 0444 root sys $INCLUDEDIR/cups/pwg.h cups/pwg.h f 0444 root sys $INCLUDEDIR/cups/raster.h cups/raster.h f 0444 root sys $INCLUDEDIR/cups/sidechannel.h cups/sidechannel.h f 0444 root sys $INCLUDEDIR/cups/transcode.h cups/transcode.h f 0444 root sys $INCLUDEDIR/cups/versioning.h cups/versioning.h %if INSTALLSTATIC f 0444 root sys $LIBDIR/libcups.a cups/libcups.a f 0444 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a %endif d 0755 root sys $DOCDIR/help - f 0444 root sys $DOCDIR/help doc/help/api*.html f 0444 root sys $DOCDIR/help doc/help/cupspm.* f 0444 root sys $DOCDIR/help/postscript-driver.html doc/help/postscript-driver.html f 0444 root sys $DOCDIR/help/ppd-compiler.html doc/help/ppd-compiler.html f 0444 root sys $DOCDIR/help/raster-driver.html doc/help/raster-driver.html f 0444 root sys $DOCDIR/help doc/help/spec*.html %subpackage # Documentation files d 0755 root sys $DOCDIR - f 0444 root sys $DOCDIR doc/*.css f 0444 root sys $DOCDIR doc/*.html f 0444 root sys $DOCDIR/apple-touch-icon.png doc/apple-touch-icon.png d 0755 root sys $DOCDIR/help - f 0444 root sys $DOCDIR/help/accounting.html doc/help/accounting.html f 0444 root sys $DOCDIR/help/admin.html doc/help/admin.html f 0444 root sys $DOCDIR/help/cgi.html doc/help/cgi.html f 0444 root sys $DOCDIR/help/encryption.html doc/help/encryption.html f 0444 root sys $DOCDIR/help/firewalls.html doc/help/firewalls.html f 0444 root sys $DOCDIR/help/glossary.html doc/help/glossary.html f 0444 root sys $DOCDIR/help/kerberos.html doc/help/kerberos.html f 0444 root sys $DOCDIR/help/license.html doc/help/license.html f 0444 root sys $DOCDIR/help/network.html doc/help/network.html f 0444 root sys $DOCDIR/help/options.html doc/help/options.html f 0444 root sys $DOCDIR/help/overview.html doc/help/overview.html f 0444 root sys $DOCDIR/help/policies.html doc/help/policies.html f 0444 root sys $DOCDIR/help/security.html doc/help/security.html f 0444 root sys $DOCDIR/help/sharing.html doc/help/sharing.html f 0444 root sys $DOCDIR/help/translation.html doc/help/translation.html f 0444 root sys $DOCDIR/help doc/help/man-*.html f 0444 root sys $DOCDIR/help doc/help/ref-*.html d 0755 root sys $DOCDIR/images - f 0444 root sys $DOCDIR/images doc/images/*.gif f 0444 root sys $DOCDIR/images doc/images/*.jpg f 0444 root sys $DOCDIR/images doc/images/*.png f 0444 root sys $DOCDIR/robots.txt doc/robots.txt # Localized documentation files d 0755 root sys $DOCDIR/de f 0444 root sys $DOCDIR/de doc/de/*.html d 0755 root sys $DOCDIR/es f 0444 root sys $DOCDIR/es doc/es/*.html #d 0755 root sys $DOCDIR/et #f 0444 root sys $DOCDIR/et doc/et/*.html #d 0755 root sys $DOCDIR/eu #f 0444 root sys $DOCDIR/eu doc/eu/*.html #d 0755 root sys $DOCDIR/fr #f 0444 root sys $DOCDIR/fr doc/fr/*.html #d 0755 root sys $DOCDIR/he #f 0444 root sys $DOCDIR/he doc/he/*.html #f 0444 root sys $DOCDIR/he/cups.css doc/he/cups.css #d 0755 root sys $DOCDIR/id #f 0444 root sys $DOCDIR/id doc/id/*.html #d 0755 root sys $DOCDIR/it #f 0444 root sys $DOCDIR/it doc/it/*.html d 0755 root sys $DOCDIR/ja f 0444 root sys $DOCDIR/ja doc/ja/*.html #d 0755 root sys $DOCDIR/pl #f 0444 root sys $DOCDIR/pl doc/pl/*.html d 0755 root sys $DOCDIR/pt_BR f 0444 root sys $DOCDIR/pt_BR doc/pt_BR/*.html d 0755 root sys $DOCDIR/ru f 0444 root sys $DOCDIR/ru doc/ru/*.html #d 0755 root sys $DOCDIR/sv #f 0444 root sys $DOCDIR/sv doc/sv/*.html #d 0755 root sys $DOCDIR/zh_TW #f 0444 root sys $DOCDIR/zh_TW doc/zh_TW/*.html # Man pages d 0755 root sys $AMANDIR - d 0755 root sys $AMANDIR/man8 - d 0755 root sys $MANDIR - d 0755 root sys $MANDIR/man1 - d 0755 root sys $MANDIR/man5 - d 0755 root sys $MANDIR/man7 - f 0444 root sys $MANDIR/man1/cancel.1 man/cancel.1 f 0444 root sys $MANDIR/man1/cups.1 man/cups.1 f 0444 root sys $MANDIR/man1/cupstestppd.1 man/cupstestppd.1 f 0444 root sys $MANDIR/man1/ippeveprinter.1 man/ippeveprinter.1 f 0444 root sys $MANDIR/man1/ippfind.1 man/ippfind.1 f 0444 root sys $MANDIR/man1/ipptool.1 man/ipptool.1 f 0444 root sys $MANDIR/man1/lp.1 man/lp.1 f 0444 root sys $MANDIR/man1/lpoptions.1 man/lpoptions.1 f 0444 root sys $MANDIR/man1/lpq.1 man/lpq.1 f 0444 root sys $MANDIR/man1/lpr.1 man/lpr.1 f 0444 root sys $MANDIR/man1/lprm.1 man/lprm.1 f 0444 root sys $MANDIR/man1/lpstat.1 man/lpstat.1 f 0444 root sys $MANDIR/man5/classes.conf.5 man/classes.conf.5 f 0444 root sys $MANDIR/man5/client.conf.5 man/client.conf.5 f 0444 root sys $MANDIR/man5/cups-files.conf.5 man/cups-files.conf.5 f 0444 root sys $MANDIR/man5/cups-snmp.conf.5 man/cups-snmp.conf.5 f 0444 root sys $MANDIR/man5/cupsd.conf.5 man/cupsd.conf.5 f 0444 root sys $MANDIR/man5/cupsd-logs.5 man/cupsd-logs.5 f 0444 root sys $MANDIR/man5/ipptoolfile.5 man/ipptoolfile.5 f 0444 root sys $MANDIR/man5/mailto.conf.5 man/mailto.conf.5 f 0444 root sys $MANDIR/man5/mime.convs.5 man/mime.convs.5 f 0444 root sys $MANDIR/man5/mime.types.5 man/mime.types.5 f 0444 root sys $MANDIR/man5/printers.conf.5 man/printers.conf.5 f 0444 root sys $MANDIR/man7/ippevepcl.7 man/ippevepcl.7 l 0644 root sys $MANDIR/man7/ippeveps.7 ippevepcl.7 f 0444 root sys $AMANDIR/man8/cupsaccept.8 man/cupsaccept.8 l 0644 root sys $AMANDIR/man8/cupsreject.8 cupsaccept.8 f 0444 root sys $AMANDIR/man8/cupsctl.8 man/cupsctl.8 f 0444 root sys $AMANDIR/man8/cupsfilter.8 man/cupsfilter.8 f 0444 root sys $AMANDIR/man8/cups-snmp.8 man/cups-snmp.8 f 0444 root sys $AMANDIR/man8/cupsd.8 man/cupsd.8 f 0444 root sys $AMANDIR/man8/cupsd-helper.8 man/cupsd-helper.8 l 0644 root sys $AMANDIR/man8/cupsdisable.8 cupsenable.8 f 0444 root sys $AMANDIR/man8/cupsenable.8 man/cupsenable.8 f 0444 root sys $AMANDIR/man8/lpadmin.8 man/lpadmin.8 f 0444 root sys $AMANDIR/man8/lpc.8 man/lpc.8 f 0444 root sys $AMANDIR/man8/lpinfo.8 man/lpinfo.8 f 0444 root sys $AMANDIR/man8/lpmove.8 man/lpmove.8 %subpackage devel f 0444 root sys $MANDIR/man1/cups-config.1 man/cups-config.1 f 0444 root sys $MANDIR/man1/ man/ppd*.1 f 0444 root sys $MANDIR/man5/ppdcfile.5 man/ppdcfile.5 f 0444 root sys $MANDIR/man7/backend.7 man/backend.7 f 0444 root sys $MANDIR/man7/filter.7 man/filter.7 f 0444 root sys $MANDIR/man7/notifier.7 man/notifier.7 %subpackage lpd d 0755 root sys $AMANDIR/man8 - f 0444 root sys $AMANDIR/man8/cups-lpd.8 man/cups-lpd.8 %subpackage # Startup scripts %system darwin f 0444 root sys /System/Library/LaunchDaemons/org.cups.cupsd.plist scheduler/org.cups.cupsd.plist %preremove <\fR .TP 5 \fB#include "\fIfilename\fB"\fR .TP 5 \fB#media \fIname width length\fR .TP 5 \fB#media "\fIname\fB/\fItext\fB" \fIwidth length\fR .TP 5 \fB#po \fIlocale \fB"\fIfilename\fB"\fR .TP 5 \fBAttribute \fIname \fB"" \fIvalue\fR .TP 5 \fBAttribute \fIname keyword value\fR .TP 5 \fBAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR .TP 5 \fBChoice \fIname \fB"\fIcode\fB"\fR .TP 5 \fBChoice \fB"\fIname\fB/\fItext\fB" "\fIcode\fB"\fR .TP 5 \fBColorDevice \fIboolean-value\fR .TP 5 \fBColorModel \fIname colorspace colororder compression\fR .TP 5 \fBColorModel "\fIname\fB/\fItext\fB" \fIcolorspace colororder compression\fR .TP 5 \fBColorProfile \fIresolution\fB/\fImediatype gamma density matrix\fR .TP 5 \fBCopyright "\fItext\fR" .TP 5 \fBCustomMedia \fIname width length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR .TP 5 \fBCustomMedia "\fIname\fB/\fItext\fB" \fIwidth length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR .TP 5 \fBCutter \fIboolean-value\fR .TP 5 \fBDarkness \fItemperature name\fR .TP 5 \fBDarkness \fItemperature \fB"\fIname\fB/\fItext\fB"\fR .TP 5 \fBDriverType \fItype\fR .TP 5 \fBDuplex \fItype\fR .TP 5 \fBFilter \fImime-type cost program\fR .TP 5 \fBFinishing \fIname\fR .TP 5 \fBFinishing "\fIname\fB/\fItext\fB"\fR .TP 5 \fBFont *\fR .TP 5 \fBFont \fIname encoding \fB"\fIversion\fB" \fIcharset status\fR .TP 5 \fBGroup \fIname\fR .TP 5 \fBGroup "\fIname\fB/\fItext\fB"\fR .TP 5 \fBHWMargins \fIleft bottom right top\fR .TP 5 \fBInputSlot \fIposition name\fR .TP 5 \fBInputSlot \fIposition \fB"\fIname\fB/\fItext\fB"\fR .TP 5 \fBInstallable \fIname\fR .TP 5 \fBInstallable "\fIname\fB/\fItext\fB"\fR .TP 5 \fBLocAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR .TP 5 \fBManualCopies \fIboolean-value\fR .TP 5 \fBManufacturer "\fIname\fB"\fR .TP 5 \fBMaxSize \fIwidth length\fR .TP 5 \fBMediaSize \fIname\fR .TP 5 \fBMediaType \fItype name\fR .TP 5 \fBMediaType \fItype \fB"\fIname\fB/\fItext\fB"\fR .TP 5 \fBMinSize \fIwidth length\fR .TP 5 \fBModelName "\fIname\fB"\fR .TP 5 \fBModelNumber \fInumber\fR .TP 5 \fBOption \fIname type section order\fR .TP 5 \fBOption "\fIname\fB/\fItext\fB" \fItype section order\fR .TP 5 \fBPCFileName "\fIfilename.ppd\fB"\fR .TP 5 \fBResolution \fIcolorspace bits-per-color row-count row-feed row-step name\fR .TP 5 \fBResolution \fIcolorspace bits-per-color row-count row-feed row-step \fB"\fIname\fB/\fItext\fB"\fR .TP 5 \fBSimpleColorProfile \fIresolution\fB/\fImediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust\fR .TP 5 \fBThroughput \fIpages-per-minute\fR .TP 5 \fBUIConstraints "\fI*Option1 *Option2\fB"\fR .TP 5 \fBUIConstraints "\fI*Option1 Choice1 *Option2\fB"\fR .TP 5 \fBUIConstraints "\fI*Option1 *Option2 Choice2\fB"\fR .TP 5 \fBUIConstraints "\fI*Option1 Choice1 *Option2 Choice2\fB"\fR .TP 5 \fBVariablePaperSize \fIboolean-value\fR .TP 5 \fBVersion \fInumber\fR .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR ppdc (1), .BR ppdhtml (1), .BR ppdi (1), .BR ppdmerge (1), .BR ppdpo (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpr.1000664 000765 000024 00000011002 13574721672 014223 0ustar00mikestaff000000 000000 .\" .\" lpr man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpr 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpr \- print files .SH SYNOPSIS .B lpr [ .B \-E ] [ \fB\-H \fIserver\fR[\fB:\fIport\fR] ] [ .B \-U .I username ] [ \fB\-P \fIdestination\fR[\fB/\fIinstance\fR] ] [ .B \-# .I num-copies [ .B \-h ] [ .B \-l ] [ .B \-m ] [ \fB\-o \fIoption\fR[\fB=\fIvalue\fR] ] [ .B \-p ] [ .B \-q ] [ .B \-r ] [ .B \-C .I title ] [ .B \-J .I title ] [ .B \-T .I title ] [ .I file(s) ] .SH DESCRIPTION \fBlpr\fR submits files for printing. Files named on the command line are sent to the named printer or the default destination if no destination is specified. If no files are listed on the command-line, \fBlpr\fR reads the print file from the standard input. .SS THE DEFAULT DESTINATION CUPS provides many ways to set the default destination. The \fBLPDEST\fR and \fBPRINTER\fR environment variables are consulted first. If neither are set, the current default set using the .BR lpoptions (1) command is used, followed by the default set using the .BR lpadmin (8) command. .SH OPTIONS The following options are recognized by \fIlpr\fR: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-H \fIserver\fR[\fB:\fIport\fR] Specifies an alternate server. .TP 5 \fB\-C "\fIname\fB"\fR .TP 5 \fB\-J "\fIname\fB"\fR .TP 5 \fB\-T "\fIname\fB"\fR Sets the job name/title. .TP 5 \fB\-P \fIdestination\fR[\fB/\fIinstance\fR] Prints files to the named printer. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username. .TP 5 \fB\-# \fIcopies\fR Sets the number of copies to print. .TP 5 .B \-h Disables banner printing. This option is equivalent to \fI-o job\-sheets=none\fR. .TP 5 .B \-l Specifies that the print file is already formatted for the destination and should be sent without filtering. This option is equivalent to \fI-o raw\fR. .TP 5 .B \-m Send an email on job completion. .TP 5 \fB\-o \fIoption\fR[\fB=\fIvalue\fR] Sets a job option. See "COMMON JOB OPTIONS" below. .TP 5 .B \-p Specifies that the print file should be formatted with a shaded header with the date, time, job name, and page number. This option is equivalent to \fI\-o prettyprint\fR and is only useful when printing text files. .TP 5 .B \-q Hold job for printing. .TP 5 .B \-r Specifies that the named print files should be deleted after submitting them. .SS COMMON JOB OPTIONS Aside from the printer-specific options reported by the .BR lpoptions (1) command, the following generic options are available: .TP 5 \fB\-o job-sheets=\fIname\fR\fR Prints a cover page (banner) with the document. The "name" can be "classified", "confidential", "secret", "standard", "topsecret", or "unclassified". .TP 5 \fB\-o media=\fIsize\fR Sets the page size to \fIsize\fR. Most printers support at least the size names "a4", "letter", and "legal". .TP 5 \fB\-o number\-up=\fR{\fI2|4|6|9|16\fR} Prints 2, 4, 6, 9, or 16 document (input) pages on each output page. .TP 5 \fB\-o orientation\-requested=4\fR Prints the job in landscape (rotated 90 degrees counter-clockwise). .TP 5 \fB\-o orientation\-requested=5\fR Prints the job in landscape (rotated 90 degrees clockwise). .TP 5 \fB\-o orientation\-requested=6\fR Prints the job in reverse portrait (rotated 180 degrees). .TP 5 \fB\-o print\-quality=3\fR .TP 5 \fB\-o print\-quality=4\fR .TP 5 \fB\-o print\-quality=5\fR Specifies the output quality - draft (3), normal (4), or best (5). .TP 5 \fB\-o sides=one\-sided\fR Prints on one side of the paper. .TP 5 \fB\-o sides=two\-sided\-long\-edge\fR Prints on both sides of the paper for portrait output. .TP 5 \fB\-o sides=two\-sided\-short\-edge\fR Prints on both sides of the paper for landscape output. .SH NOTES The \fI\-c\fR, \fI\-d\fR, \fI\-f\fR, \fI\-g\fR, \fI\-i\fR, \fI\-n\fR, \fI\-t\fR, \fI\-v\fR, and \fI\-w\fR options are not supported by CUPS and produce a warning message if used. .SH EXAMPLES Print two copies of a document to the default printer: .nf lpr -# 2 filename .fi Print a double-sided legal document to a printer called "foo": .nf lpr -P foo -o media=legal -o sides=two-sided-long-edge filename .fi Print a presentation document 2-up to a printer called "foo": .nf lpr -P foo -o number-up=2 filename .fi .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpadmin (8), .BR lpoptions (1), .BR lpq (1), .BR lprm (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/notifier.7000664 000765 000024 00000002224 13574721672 015261 0ustar00mikestaff000000 000000 .\" .\" notifier man page for CUPS. .\" .\" 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 .\" information. .\" .TH notifier 7 "CUPS" "26 April 2019" "Apple Inc." .SH NAME notifier \- cups notification interface .SH SYNOPSIS .B notifier .I recipient [ .I user-data ] .SH DESCRIPTION The CUPS notifier interface provides a standard method for adding support for new event notification methods to CUPS. Each notifier delivers one or more IPP events from the standard input to the specified recipient. .LP Notifiers \fBMUST\fR read IPP messages from the standard input using the .BR ippNew () and .BR ippReadFile () functions and exit on error. Notifiers are encouraged to exit after a suitable period of inactivity, however they may exit after reading the first message or stay running until an error is seen. Notifiers inherit the environment and can use the logging mechanism documented in .BR filter (7). .SH SEE ALSO .BR cupsd (8), .BR filter (7), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/mailto.conf.5000664 000765 000024 00000003320 13574721672 015647 0ustar00mikestaff000000 000000 .\" .\" mailto.conf man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH mailto.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME mailto.conf \- configuration file for cups email notifier .SH DESCRIPTION The \fBmailto.conf\fR file defines the local mail server and email notification preferences for CUPS. .LP Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character. .SS DIRECTIVES .TP 5 \fBCc \fIcc-address@domain.com\fR Specifies an additional recipient for all email notifications. .TP 5 \fBFrom \fIfrom-address@domain.com\fR Specifies the sender of email notifications. .TP 5 \fBSendmail \fIsendmail command and options\fR Specifies the sendmail command to use when sending email notifications. Only one \fISendmail\fR or \fISMTPServer\fR line may be present in the \fBmailto.conf\fR file. If multiple lines are present, only the last one is used. .TP 5 \fBSMTPServer \fIservername\fR Specifies a SMTP server to send email notifications to. Only one \fISendmail\fR or \fISMTPServer\fR line may be present in the \fBmailto.conf\fR file. If multiple lines are present, only the last one is used. .TP 5 \fBSubject \fIsubject-prefix\fR Specifies a prefix string for the subject line of an email notification. .SH SEE ALSO .BR cupsd (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ppdpo.1000664 000765 000024 00000003242 13574721672 014557 0ustar00mikestaff000000 000000 .\" .\" ppdpo man page for CUPS. .\" .\" 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 .\" information. .\" .TH ppdpo 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME ppdpo \- ppd message catalog generator (deprecated) .SH SYNOPSIS .B ppdpo [ \fB\-D \fIname\fR[\fB=\fIvalue\fR] ] [ .B \-I .I include-directory ] [ .B \-o .I output-file ] .I source-file .SH DESCRIPTION \fBppdpo\fR extracts UI strings from PPDC source files and updates either a GNU gettext or macOS strings format message catalog source file for translation. \fBThis program is deprecated and will be removed in a future release of CUPS.\fR .SH OPTIONS \fBppdpo\fR supports the following options: .TP 5 \fB\-D \fIname\fR[\fB=\fIvalue\fR] Sets the named variable for use in the source file. It is equivalent to using the \fI#define\fR directive in the source file. .TP 5 \fB\-I \fIinclude-directory\fR Specifies an alternate include directory. Multiple \fI-I\fR options can be supplied to add additional directories. .TP 5 \fB\-o \fIoutput-file\fR Specifies the output file. The supported extensions are \fI.po\fR or \fI.po.gz\fR for GNU gettext format message catalogs and \fI.strings\fR for macOS strings files. .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR ppdc (1), .BR ppdhtml (1), .BR ppdi (1), .BR ppdmerge (1), .BR ppdcfile(5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ipptool.1000664 000765 000024 00000013520 13574721672 015123 0ustar00mikestaff000000 000000 .\" .\" ipptool man page. .\" .\" Copyright © 2010-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH ipptool 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME ipptool \- perform internet printing protocol requests .SH SYNOPSIS .B ipptool [ .B \-\-help ] [ .B \-\-ippserver .I filename ] [ .B \-\-stop\-after\-include\-error ] [ .B \-\-version ] [ .B \-4 ] [ .B \-6 ] [ .B \-C ] [ .B \-E ] [ .B \-I ] [ .B \-L ] [ .B \-P .I filename.plist ] [ .B \-S ] [ .B \-T .I seconds ] [ .B \-V .I version ] [ .B \-X ] [ .B \-c ] [ .B \-d .I name=value ] [ .B \-f .I filename ] [ .B \-h ] [ .B \-i .I seconds ] [ .B \-n .I repeat-count ] [ .B \-q ] [ .B \-t ] [ .B \-v ] .I printer-uri .I testfile [ ... .I testfile ] .SH DESCRIPTION .B ipptool sends IPP requests to the specified .I printer-uri and tests and/or displays the results. Each named .I testfile defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The .I testfile format is described in .BR ipptoolfile (5). .SH OPTIONS The following options are recognized by .B ipptool: .TP 5 .B \-\-help Shows program help. .TP 5 \fB\-\-ippserver \fIfilename\fR Specifies that the test results should be written to the named .B ippserver attributes file. .TP 5 .B \-\-stop-after-include-error Tells .B ipptool to stop if an error occurs in an included file. Normally .B ipptool will continue with subsequent tests after the INCLUDE directive. .TP 5 .B \-\-version Shows the version of .B ipptool being used. .TP 5 .B \-4 Specifies that .B ipptool must connect to the printer or server using IPv4. .TP 5 .B \-6 Specifies that .B ipptool must connect to the printer or server using IPv6. .TP 5 .B \-C Specifies that requests should be sent using the HTTP/1.1 "Transfer\-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. .TP 5 .B \-E Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header. .TP 5 .B \-I Specifies that .B ipptool will continue past errors. .TP 5 .B \-L Specifies that requests should be sent using the HTTP/1.0 "Content\-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. .TP 5 .BI \-P \ filename.plist Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR). This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. .TP 5 .B \-S Forces (dedicated) TLS encryption when connecting to the server. .TP 5 .BI \-T \ seconds Specifies a timeout for IPP requests in seconds. .TP 5 .BI \-V \ version Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used. .TP 5 .B \-X Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. .TP 5 .B \-c Specifies that CSV (comma\-separated values) output is desired instead of the plain text output. .TP 5 .BI \-d \ name=value Defines the named variable. .TP 5 .BI \-f \ filename Defines the default request filename for tests. .TP 5 .B \-h Validate HTTP response headers. .TP 5 .BI \-i \ seconds Specifies that the (last) .I testfile should be repeated at the specified interval. This option is incompatible with the \fB\-X\fR (XML plist output) option. .TP 5 .B \-l Specifies that plain text output is desired. .TP 5 .BI \-n \ repeat\-count Specifies that the (last) .I testfile should be repeated the specified number of times. This option is incompatible with the \fI\-X\fR (XML plist output) option. .TP 5 .B \-q Be quiet and produce no output. .TP 5 .B \-t Specifies that CUPS test report output is desired instead of the plain text output. .TP 5 .B \-v Specifies that all request and response attributes should be output in CUPS test mode (\fB\-t\fR). This is the default for XML output. .SH EXIT STATUS The .B ipptool program returns 0 if all tests were successful and 1 otherwise. .SH FILES The following standard files are available: .nf .I color.jpg .I create\-printer\-subscription.test .I document\-a4.pdf .I document\-a4.ps .I document\-letter.pdf .I document\-letter.ps .I get\-completed\-jobs.test .I get\-jobs.test .I get\-notifications.test .I get\-printer\-attributes.test .I get\-subscriptions.test .I gray.jpg .I ipp\-1.1.test .I ipp\-2.0.test .I ipp\-2.1.test .I ipp\-2.2.test .I ipp\-everywhere.test .I onepage\-a4.pdf .I onepage\-a4.ps .I onepage\-letter.pdf .I onepage\-letter.ps .I print\-job.test .I print\-job\-deflate.test .I print\-job\-gzip.test .I testfile.jpg .I testfile.pcl .I testfile.pdf .I testfile.ps .I testfile.txt .I validate\-job.test .fi .SH CONFORMING TO The .B ipptool program is unique to CUPS and conforms to the Internet Printing Protocol up to version 2.2. .SH EXAMPLES Get a list of completed jobs for "myprinter": .nf ipptool ipp://localhost/printers/myprinter get\-completed\-jobs.test .fi .LP Send email notifications to "user@example.com" when "myprinter" changes: .nf ipptool \-d recipient=mailto:user@example.com \\ ipp://localhost/printers/myprinter create\-printer\-subscription.test .fi .SH SEE ALSO .BR ipptoolfile (5), IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) RFC 8011 (http://tools.ietf.org/html/rfc8011), .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsd-logs.5000664 000765 000024 00000020715 13574721672 015525 0ustar00mikestaff000000 000000 .\" .\" cupsd-logs man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsd-logs 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsd\-logs \- cupsd log files (access_log, error_log, and page_log) .SH DESCRIPTION .BR cupsd (8) normally maintains three log files: \fIaccess_log\fR to track requests that are submitted to the scheduler, \fIerror_log\fR to track progress and errors, and \fIpage_log\fR to track pages that are printed. Configuration directives in .BR cupsd.conf (5) and .BR cups-files.conf (5) control what information is logged and where it is stored. .SS ACCESS LOG FILE FORMAT The \fIaccess_log\fR file lists each HTTP resource that is accessed by a web browser or client. Each line is in an extended version of the so-called "Common Log Format" used by many web servers and web reporting tools: .nf \fIhost group user date-time \fR"\fImethod resource version\fR" \fIstatus bytes ipp-operation ipp-status\fR .fi For example: .nf 10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200 317 CUPS-Get-Printers successful-ok-ignored-or-substituted-attributes localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1" 200 0 - - localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200 157 CUPS-Get-Printers successful-ok-ignored-or-substituted-attributes localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200 1411 CUPS-Get-Devices - localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1" 200 6667 - - .fi The \fIhost\fR field will normally only be an IP address unless you have enabled the HostNameLookups directive in the \fIcupsd.conf\fR file or if the IP address corresponds to your local machine. .LP The \fIgroup\fR field always contains "-". .LP The \fIuser\fR field is the authenticated username of the requesting user. If no username and password is supplied for the request then this field contains "-". .LP The \fIdate-time\fR field is the date and time of the request in local time and is in the format "[DD/MON/YYYY:HH:MM:SS +ZZZZ]". .LP The \fImethod\fR field is the HTTP method used: "GET", "HEAD", "OPTIONS", "POST", or "PUT". "GET" requests are used to get files from the server, both for the web interface and to get configuration and log files. "HEAD" requests are used to get information about a resource prior to a "GET". "OPTIONS" requests are used to upgrade connections to TLS encryption. "POST" requests are used for web interface forms and IPP requests. "PUT" requests are used to upload configuration files. .LP The \fIresource\fR field is the filename of the requested resource. .LP The \fIversion\fR field is the HTTP specification version used by the client. For CUPS clients this will always be "HTTP/1.1". .LP The \fIstatus\fR field contains the HTTP result status of the request, as follows: .RS 5 .TP 5 200 Successful operation. .TP 5 201 File created/modified successfully. .TP 5 304 The requested file has not changed. .TP 5 400 Bad HTTP request; typically this means that you have a malicious program trying to access your server. .TP 5 401 Unauthorized, authentication (username + password) is required. .TP 5 403 Access is forbidden; typically this means that a client tried to access a file or resource they do not have permission to access. .TP 5 404 The file or resource does not exist. .TP 5 405 URL access method is not allowed; typically this means you have a web browser using your server as a proxy. .TP 5 413 Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize allows. .TP 5 426 Upgrading to TLS-encrypted connection. .TP 5 500 Server error; typically this happens when the server is unable to open/create a file - consult the error_log file for details. .TP 5 501 The client requested encryption but encryption support is not enabled/compiled in. .TP 5 505 HTTP version number not supported; typically this means that you have a malicious program trying to access your server. .RE .LP The \fIbytes\fR field contains the number of bytes in the request. For POST requests the bytes field contains the number of bytes of non-IPP data that is received from the client. .LP The \fIipp-operation\fR field contains either "-" for non-IPP requests or the IPP operation name for POST requests containing an IPP request. .LP The \fIipp-status\fR field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response. .SS ERROR LOG FILE FORMAT The \fIerror_log\fR file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the .BR cupsd.conf (5) file controls which messages are logged: .nf level date-time message .fi For example: .nf I [20/May/1999:19:18:28 +0000] [Job 1] Queued on 'DeskJet' by 'mike'. D [20/May/1999:19:18:28 +0000] [Job 1] argv[0]="DeskJet" D [20/May/1999:19:18:28 +0000] [Job 1] argv[1]="1" D [20/May/1999:19:18:28 +0000] [Job 1] argv[2]="mike" D [20/May/1999:19:18:28 +0000] [Job 1] argv[3]="myjob" D [20/May/1999:19:18:28 +0000] [Job 1] argv[4]="1" D [20/May/1999:19:18:28 +0000] [Job 1] argv[5]="media= na_letter_8.5x11in sides=one-sided" D [20/May/1999:19:18:28 +0000] [Job 1] argv[6]="/var/spool/cups/ d000001-001" I [20/May/1999:19:21:02 +0000] [Job 2] Queued on 'DeskJet' by 'mike'. I [20/May/1999:19:22:24 +0000] [Job 2] Canceled by 'mike'. .fi The \fIlevel\fR field contains the type of message: .TP 5 A Alert message (LogLevel alert) .TP 5 C Critical error message (LogLevel crit) .TP 5 D Debugging message (LogLevel debug) .TP 5 d Detailed debugging message (LogLevel debug2) .TP 5 E Normal error message (LogLevel error) .TP 5 I Informational message (LogLevel info) .TP 5 N Notice message (LogLevel notice) .TP 5 W Warning message (LogLevel warn) .TP 5 X Emergency error message (LogLevel emerg) .LP The \fIdate-time\fR field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the \fIaccess_log\fR file. .LP The \fImessage\fR field contains a free-form textual message. Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID. .SS PAGE LOG FILE FORMAT The \fIpage_log\fR file lists the total number of pages (sheets) that are printed. By default, each line contains the following information: .nf \fIprinter user job-id date-time \fBtotal \fInum-sheets job-billing job-originating-host-name job-name media sides\fR .fi For example the entry for a two page job called "myjob" might look like: .nf DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123 localhost myjob na_letter_8.5x11in one-sided .fi The PageLogFormat directive in the .BR cupsd.conf (5) file can be used to change this information. .LP The \fIprinter\fR field contains the name of the printer that printed the page. If you send a job to a printer class, this field will contain the name of the printer that was assigned the job. .LP The \fIuser\fR field contains the name of the user (the IPP requesting-user-name attribute) that submitted this file for printing. .LP The \fIjob-id\fR field contains the job number of the page being printed. .LP The \fIdate-time\fR field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the \fIaccess_log\fR file. .LP The \fInum-sheets\fR field provides the total number of pages (sheets) that have been printed on for the job. .LP The \fIjob-billing\fR field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided. .LP The \fIjob-originating-host-name\fR field contains the hostname or IP address of the client that printed the job. .LP The \fIjob-name\fR field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided. .LP The \fImedia\fR field contains a copy of the media or media-col/media-size attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided. .LP The \fIsides\fR field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided. .SH SEE ALSO .BR cupsd (8), .BR cupsd.conf (5), .BR cups-files.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cups-snmp.8000664 000765 000024 00000004445 13574721672 015377 0ustar00mikestaff000000 000000 .\" .\" SNMP backend man page for CUPS. .\" .\" Copyright © 2012-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cups-snmp 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME snmp \- cups snmp backend (deprecated) .SH SYNOPSIS .B /usr/lib/cups/backend/snmp .I ip-address-or-hostname .br .B /usr/libexec/cups/backend/snmp .I ip-address-or-hostname .br .B lpinfo .B \-v .B \-\-include-schemes snmp .SH DESCRIPTION The \fBDEPRECATED\fR CUPS SNMP backend provides legacy discovery and identification of network printers using SNMPv1. When used for discovery through the scheduler, the backend will list all printers that respond to a broadcast SNMPv1 query with the "public" community name. Additional queries are then sent to printers that respond in order to determine the correct device URI, make and model, and other information needed for printing. .LP In the first form, the SNMP backend is run directly by the user to look up the device URI and other information when you have an IP address or hostname. This can be used for programs that need to configure print queues where the user has supplied an address but nothing else. .LP In the second form, the SNMP backend is run indirectly using the .BR lpinfo (8) command. The output provides all printers detected via SNMP on the configured broadcast addresses. \fINote: no broadcast addresses are configured by default.\fR .SH ENVIRONMENT The DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment variable. The MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME environment variable. .SH FILES The SNMP backend reads the \fI/etc/cups/snmp.conf\fR configuration file, if present, to set the default broadcast address, community name, and logging level. .SH NOTES The CUPS SNMP backend is deprecated and will no longer be supported in a future version of CUPS. .SH CONFORMING TO The CUPS SNMP backend uses the information from the Host, Printer, and Port Monitor MIBs along with some vendor private MIBs and intelligent port probes to determine the correct device URI and make and model for each printer. .SH SEE ALSO .BR backend (7), .BR cups-snmp.conf (5), .BR cupsd (8), .BR lpinfo (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/mime.convs.5000664 000765 000024 00000004441 13574721672 015521 0ustar00mikestaff000000 000000 .\" .\" mime.convs man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH mime.convs 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME mime.convs \- mime type conversion file for cups (deprecated) .SH DESCRIPTION The \fBmime.convs\fR file defines the filters that are available for converting files from one format to another. The standard filters support text, PDF, PostScript, and many types of image files. .LP Additional filters are specified in files with the extension \fI.convs\fR in the CUPS configuration directory. .LP Each line in the \fBmime.convs\fR file is a comment, blank, or filter line. Comment lines start with the # character. Filter lines specify the source and destination MIME types along with a relative cost associated with the filter and the filter to run: .nf source/type destination/type cost filter .fi The \fIsource/type\fR field specifies the source MIME media type that is consumed by the filter. .LP The \fIdestination/type\fR field specifies the destination MIME media type that is produced by the filter. .LP The \fIcost\fR field specifies the relative cost for running the filter. A value of 100 means that the filter uses a large amount of resources while a value of 0 means that the filter uses very few resources. .LP The \fIfilter\fR field specifies the filter program filename. Filenames are relative to the CUPS filter directory. .SH FILES \fI/etc/cups\fR - Typical CUPS configuration directory. .br \fI/usr/lib/cups/filter\fR - Typical CUPS filter directory. .br \fI/usr/libexec/cups/filter\fR - CUPS filter directory on macOS. .SH EXAMPLES Define a filter that converts PostScript documents to CUPS Raster format: .nf application/vnd.cups\-postscript application/vnd.cups\-raster 50 pstoraster .fi .SH NOTES CUPS filters are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR cups-files.conf (5), .BR cupsd.conf (5), .BR cupsd (8), .BR cupsfilter (8), .BR mime.types (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/Makefile000664 000765 000024 00000010063 13574721672 015012 0ustar00mikestaff000000 000000 # # Man page makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1993-2006 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs # # Man pages... # MAN1 = cancel.1 \ cups.1 \ cups-config.1 \ cupstestppd.1 \ ippeveprinter.1 \ $(IPPFIND_MAN) \ ipptool.1 \ lp.1 \ lpoptions.1 \ lpq.1 \ lprm.1 \ lpr.1 \ lpstat.1 \ ppdc.1 \ ppdhtml.1 \ ppdi.1 \ ppdmerge.1 \ ppdpo.1 MAN5 = classes.conf.5 \ client.conf.5 \ cups-files.conf.5 \ cups-snmp.conf.5 \ cupsd.conf.5 \ cupsd-logs.5 \ ipptoolfile.5 \ mailto.conf.5 \ mime.convs.5 \ mime.types.5 \ ppdcfile.5 \ printers.conf.5 \ subscriptions.conf.5 MAN7 = backend.7 \ filter.7 \ ippevepcl.7 \ notifier.7 MAN8 = cupsaccept.8 \ cupsctl.8 \ cupsfilter.8 \ cups-lpd.8 \ cups-snmp.8 \ cupsd.8 \ cupsd-helper.8 \ cupsenable.8 \ lpadmin.8 \ lpinfo.8 \ lpmove.8 \ lpc.8 # # Make everything... # all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all config and object files... # clean: $(RM) mantohtml mantohtml.o # # Dummy depend target... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: all echo Installing man pages in $(MANDIR)/man1... $(INSTALL_DIR) -m 755 $(MANDIR)/man1 for file in $(MAN1); do \ $(INSTALL_MAN) $$file $(MANDIR)/man1; \ done echo Installing man pages in $(MANDIR)/man5... $(INSTALL_DIR) -m 755 $(MANDIR)/man5 for file in $(MAN5); do \ $(INSTALL_MAN) $$file $(MANDIR)/man5; \ done echo Installing man pages in $(MANDIR)/man7... $(INSTALL_DIR) -m 755 $(MANDIR)/man7 for file in $(MAN7); do \ $(INSTALL_MAN) $$file $(MANDIR)/man7; \ done $(RM) $(MANDIR)/man7/ippeveps.7 $(LN) ippevepcl.7 $(MANDIR)/man7/ippeveps.7 echo Installing man pages in $(MANDIR)/man8... $(INSTALL_DIR) -m 755 $(MANDIR)/man8 for file in $(MAN8); do \ $(INSTALL_MAN) $$file $(MANDIR)/man8; \ done $(RM) $(MANDIR)/man8/cupsdisable.8 $(LN) cupsenable.8 $(MANDIR)/man8/cupsdisable.8 $(RM) $(MANDIR)/man8/cupsreject.8 $(LN) cupsaccept.8 $(MANDIR)/man8/cupsreject.8 for file in cups-deviced.8 cups-driverd.8 cups-exec.8; do \ $(RM) $(MANDIR)/man8/$$file; \ $(LN) cupsd-helper.8 $(MANDIR)/man8/$$file; \ done # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: echo Uninstalling man pages from $(MANDIR)/man1... for file in $(MAN1); do \ $(RM) $(MANDIR)/man1/$$file; \ done -$(RMDIR) $(MANDIR)/man1 echo Uninstalling man pages from $(MANDIR)/man5... for file in $(MAN5); do \ $(RM) $(MANDIR)/man5/$$file; \ done -$(RMDIR) $(MANDIR)/man5 echo Uninstalling man pages from $(MANDIR)/man7... for file in $(MAN7) ippeveps.7; do \ $(RM) $(MANDIR)/man7/$$file; \ done -$(RMDIR) $(MANDIR)/man7 echo Uninstalling man pages from $(MANDIR)/man8... for file in $(MAN8) cupsenable.8 cupsreject.8 cups-deviced.8 cups-driverd.8 cups-exec.8; do \ $(RM) $(MANDIR)/man8/$$file; \ done -$(RMDIR) $(MANDIR)/man8 # # Local programs (not built when cross-compiling...) # local: html # # Make html versions of man pages... # html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml echo Converting man pages to HTML... for file in $(MAN1); do \ echo " $$file..."; \ ./mantohtml $$file >../doc/help/man-`basename $$file .1`.html; \ done for file in $(MAN5); do \ echo " $$file..."; \ ./mantohtml $$file >../doc/help/man-`basename $$file .5`.html; \ done for file in $(MAN7); do \ echo " $$file..."; \ ./mantohtml $$file >../doc/help/man-`basename $$file .7`.html; \ done for file in $(MAN8); do \ echo " $$file..."; \ ./mantohtml $$file >../doc/help/man-`basename $$file .8`.html; \ done mantohtml: mantohtml.o ../cups/$(LIBCUPSSTATIC) $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ mantohtml.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ cups-2.3.1/man/ppdc.1000664 000765 000024 00000005460 13574721672 014367 0ustar00mikestaff000000 000000 .\" .\" ppdc man page for CUPS. .\" .\" 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 .\" information. .\" .TH ppdc 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME ppdc \- cups ppd compiler (deprecated) .SH SYNOPSIS .B ppdc [ \fB\-D \fIname\fR[\fB=\fIvalue\fR] ] [ .B \-I .I include-directory ] [ .B \-c .I message-catalog ] [ .B \-d .I output-directory ] [ .B \-l .I language(s) ] [ .B \-m ] [ .B \-t ] [ .B \-v ] [ .B \-z ] [ .B \-\-cr ] [ .B \-\-crlf ] [ .B \-\-lf ] .I source-file .SH DESCRIPTION \fBppdc\fR compiles PPDC source files into one or more PPD files. \fBThis program is deprecated and will be removed in a future release of CUPS.\fR .SH OPTIONS \fBppdc\fR supports the following options: .TP 5 \fB\-D \fIname\fR[\fB=\fIvalue\fR] Sets the named variable for use in the source file. It is equivalent to using the \fI#define\fR directive in the source file. .TP 5 \fB\-I \fIinclude-directory\fR Specifies an alternate include directory. Multiple \fI-I\fR options can be supplied to add additional directories. .TP 5 \fB\-c \fImessage-catalog\fR Specifies a single message catalog file in GNU gettext (filename.po) or Apple strings (filename.strings) format to be used for localization. .TP 5 \fB\-d \fIoutput-directory\fR Specifies the output directory for PPD files. The default output directory is "ppd". .TP 5 \fB\-l \fIlanguage(s)\fR Specifies one or more languages to use when localizing the PPD file(s). The default language is "en" (English). Separate multiple languages with commas, for example "de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD files with German, UK English, Spanish (Spain, Mexico, and US), French (France and Canada), and Italian languages in each file. .TP 5 .B \-m Specifies that the output filename should be based on the ModelName value instead of FileName or PCFilenName. .TP 5 .B \-t Specifies that PPD files should be tested instead of generated. .TP 5 .B \-v Specifies verbose output, basically a running status of which files are being loaded or written. .B \-z Generates compressed PPD files (filename.ppd.gz). The default is to generate uncompressed PPD files. .TP 5 \fB\-\-cr\fR .TP 5 \fB\-\-crlf\fR .TP 5 \fB\-\-lf\fR Specifies the line ending to use - carriage return, carriage return and line feed, or line feed alone. The default is to use the line feed character alone. .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR ppdhtml (1), .BR ppdi (1), .BR ppdmerge (1), .BR ppdpo (1), .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ppdi.1000664 000765 000024 00000003151 13574721672 014370 0ustar00mikestaff000000 000000 .\" .\" ppdi man page for CUPS. .\" .\" 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 .\" information. .\" .TH ppdi 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME ppdi \- import ppd files (deprecated) .SH SYNOPSIS .B ppdi [ .B \-I .I include-directory ] [ .B \-o .I source-file ] .I ppd-file [ ... .I ppd-file ] .SH DESCRIPTION \fBppdi\fR imports one or more PPD files into a PPD compiler source file. Multiple languages of the same PPD file are merged into a single printer definition to facilitate accurate changes for all localizations. \fBThis program is deprecated and will be removed in a future release of CUPS.\fR .SH OPTIONS \fBppdi\fR supports the following options: .TP 5 \fB\-I \fIinclude-directory\fR Specifies an alternate include directory. Multiple \fI-I\fR options can be supplied to add additional directories. .TP 5 \fB\-o \fIsource-file\fR Specifies the PPD source file to update. If the source file does not exist, a new source file is created. Otherwise the existing file is merged with the new PPD file(s) on the command-line. If no source file is specified, the filename \fIppdi.drv\fR is used. .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR ppdc (1), .BR ppdhtml (1), .BR ppdmerge (1), .BR ppdpo (1), .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/client.conf.5000664 000765 000024 00000013315 13574721672 015645 0ustar00mikestaff000000 000000 .\" .\" client.conf man page for CUPS. .\" .\" 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. .\" .TH client.conf 5 "CUPS" "15 October 2019" "Apple Inc." .SH NAME client.conf \- client configuration file for cups (deprecated on macos) .SH DESCRIPTION The \fBclient.conf\fR file configures the CUPS client and is normally located in the \fI/etc/cups\fR and/or \fI~/.cups\fR directories. Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character. .LP \fBNote:\fR Starting with macOS 10.7, this file is only used by command-line and X11 applications plus the IPP backend. The \fBServerName\fR directive is not supported on macOS at all. Starting with macOS 10.12, all applications can access these settings in the \fI/Library/Preferences/org.cups.PrintingPrefs.plist\fR file instead. See the NOTES section below for more information. .SS DIRECTIVES The following directives are understood by the client. Consult the online help for detailed descriptions: .\"#AllowAnyRoot .TP 5 \fBAllowAnyRoot Yes\fR .TP 5 \fBAllowAnyRoot No\fR Specifies whether to allow TLS with certificates that have not been signed by a trusted Certificate Authority. The default is "Yes". .\"#AllowExpiredCerts .TP 5 \fBAllowExpiredCerts Yes\fR .TP 5 \fBAllowExpiredCerts No\fR Specifies whether to allow TLS with expired certificates. The default is "No". .\"#DigestOptions .TP 5 \fBDigestOptions DenyMD5\fR .TP 5 \fBDigestOptions None\fR Specifies HTTP Digest authentication options. \fBDenyMD5\fR disables support for the original MD5 hash algorithm. .\"#Encryption .TP 5 \fBEncryption IfRequested\fR .TP 5 \fBEncryption Never\fR .TP 5 \fBEncryption Required\fR Specifies the level of encryption that should be used. .\"#GSSServiceName .TP 5 \fBGSSServiceName \fIname\fR Specifies the Kerberos service name that is used for authentication, typically "host", "http", or "ipp". CUPS adds the remote hostname ("name@server.example.com") for you. The default name is "http". .\"#ServerName .TP 5 \fBServerName \fIhostname-or-ip-address\fR[\fI:port\fR] .TP 5 \fBServerName \fI/domain/socket\fR Specifies the address and optionally the port to use when connecting to the server. \fBNote: This directive is not supported on macOS 10.7 or later.\fR .TP 5 \fBServerName \fIhostname-or-ip-address\fR[\fI:port\fR]\fB/version=1.1\fR Specifies the address and optionally the port to use when connecting to a server running CUPS 1.3.12 and earlier. .\"#SSLOptions .TP 5 \fBSSLOptions \fR[\fIAllowDH\fR] [\fIAllowRC4\fR] [\fIAllowSSL3\fR] [\fIDenyCBC\fR] [\fIDenyTLS1.0\fR] [\fIMaxTLS1.0\fR] [\fIMaxTLS1.1\fR] [\fIMaxTLS1.2\fR] [\fIMaxTLS1.3\fR] [\fIMinTLS1.0\fR] [\fIMinTLS1.1\fR] [\fIMinTLS1.2\fR] [\fIMinTLS1.3\fR] .TP 5 \fBSSLOptions None\fR Sets encryption options (only in /etc/cups/client.conf). By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites. Security is reduced when \fIAllow\fR options are used. Security is enhanced when \fIDeny\fR options are used. The \fIAllowDH\fR option enables cipher suites using plain Diffie-Hellman key negotiation (not supported on systems using GNU TLS). The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients. The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0. The \fIDenyCBC\fR option disables all CBC cipher suites. The \fIDenyTLS1.0\fR option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1. The \fIMinTLS\fR options set the minimum TLS version to support. The \fIMaxTLS\fR options set the maximum TLS version to support. Not all operating systems support TLS 1.3 at this time. .\"#TrustOnFirstUse .TP 5 \fBTrustOnFirstUse Yes\fR .TP 5 \fBTrustOnFirstUse No\fR Specifies whether to trust new TLS certificates by default. The default is "Yes". .\"#User .TP 5 \fBUser \fIname\fR Specifies the default user name to use for requests. .\"#UserAgentTokens .TP 5 \fBUserAgentTokens None\fR .TP 5 \fBUserAgentTokens ProductOnly\fR .TP 5 \fBUserAgentTokens Major\fR .TP 5 \fBUserAgentTokens Minor\fR .TP 5 \fBUserAgentTokens Minimal\fR .TP 5 \fBUserAgentTokens OS\fR .TP 5 \fBUserAgentTokens Full\fR Specifies what information is included in the User-Agent header of HTTP requests. "None" disables the User-Agent header. "ProductOnly" reports "CUPS". "Major" reports "CUPS/major IPP/2". "Minor" reports "CUPS/major.minor IPP/2.1". "Minimal" reports "CUPS/major.minor.patch IPP/2.1". "OS" reports "CUPS/major.minor.path (osname osversion) IPP/2.1". "Full" reports "CUPS/major.minor.path (osname osversion; architecture) IPP/2.1". The default is "Minimal". .\"#ValidateCerts .TP 5 \fBValidateCerts Yes\fR .TP 5 \fBValidateCerts No\fR Specifies whether to only allow TLS with certificates whose common name matches the hostname. The default is "No". .SH NOTES The \fBclient.conf\fR file is deprecated on macOS and will no longer be supported in a future version of CUPS. Configuration settings can instead be viewed or changed using the .BR defaults (1) command: .nf defaults write /Library/Preferences/org.cups.PrintingPrefs.plist Encryption Required defaults write /Library/Preferences/org.cups.PrintingPrefs.plist TrustOnFirstUse -bool NO defaults read /Library/Preferences/org.cups.PrintingPrefs.plist Encryption .fi On Linux and other systems using GNU TLS, the \fI/etc/cups/ssl/site.crl\fR file, if present, provides a list of revoked X.509 certificates and is used when validating certificates. .SH SEE ALSO .BR cups (1), .BR default (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpq.1000664 000765 000024 00000002741 13574721672 014234 0ustar00mikestaff000000 000000 .\" .\" lpq man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpq 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpq \- show printer queue status .SH SYNOPSIS .B lpq [ .B \-E ] [ .B \-U .I username ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ \fB\-P \fIdestination\fR[\fB/\fIinstance\fR] ] [ .B \-a ] [ .B \-l ] [ .BI + interval ] .SH DESCRIPTION \fBlpq\fR shows the current print queue status on the named printer. Jobs queued on the default destination will be shown if no printer or class is specified on the command-line. .LP The \fI+interval\fR option allows you to continuously report the jobs in the queue until the queue is empty; the list of jobs is shown once every \fIinterval\fR seconds. .SH OPTIONS \fBlpq\fR supports the following options: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-P \fIdestination\fR[\fB/\fIinstance\fR] Specifies an alternate printer or class name. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username. .TP 5 .B \-a Reports jobs on all printers. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Specifies an alternate server. .TP 5 .B \-l Requests a more verbose (long) reporting format. .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpr (1), .BR lprm (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsd.conf.5000664 000765 000024 00000072637 13574721672 015521 0ustar00mikestaff000000 000000 .\" .\" cupsd.conf man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsd.conf 5 "CUPS" "16 July 2019" "Apple Inc." .SH NAME cupsd.conf \- server configuration file for cups .SH DESCRIPTION The .I cupsd.conf file configures the CUPS scheduler, .BR cupsd (8). It is normally located in the .I /etc/cups directory. Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character. .SS TOP-LEVEL DIRECTIVES The following top-level directives are understood by .BR cupsd (8): .\"#AccessLogLevel .TP 5 \fBAccessLogLevel config\fR .TP 5 \fBAccessLogLevel actions\fR .TP 5 \fBAccessLogLevel all\fR Specifies the logging level for the AccessLog file. The "config" level logs when printers and classes are added, deleted, or modified and when configuration files are accessed or updated. The "actions" level logs when print jobs are submitted, held, released, modified, or canceled, and any of the conditions for "config". The "all" level logs all requests. The default access log level is "actions". .\"#AutoPurgeJobs .TP 5 \fBAutoPurgeJobs Yes\fR .TP 5 \fBAutoPurgeJobs No\fR .br Specifies whether to purge job history data automatically when it is no longer required for quotas. The default is "No". .\"#BrowseDNSSDSubTypes .TP 5 .BI BrowseDNSSDSubTypes _subtype[,...] Specifies a list of Bonjour sub-types to advertise for each shared printer. For example, "BrowseDNSSDSubTypes _cups,_print" will tell network clients that both CUPS sharing and IPP Everywhere are supported. The default is "_cups" which is necessary for printer sharing to work between systems using CUPS. .\"#BrowseLocalProtocols .TP 5 \fBBrowseLocalProtocols all\fR .TP 5 \fBBrowseLocalProtocols dnssd\fR .TP 5 \fBBrowseLocalProtocols none\fR Specifies which protocols to use for local printer sharing. The default is "dnssd" on systems that support Bonjour and "none" otherwise. .\"#BrowseWebIF .TP 5 \fBBrowseWebIF Yes\fR .TP 5 \fBBrowseWebIF No\fR .br Specifies whether the CUPS web interface is advertised. The default is "No". .\"#Browsing .TP 5 \fBBrowsing Yes\fR .TP 5 \fBBrowsing No\fR .br Specifies whether shared printers are advertised. The default is "No". .\"#DefaultAuthType .TP 5 \fBDefaultAuthType Basic\fR .TP 5 \fBDefaultAuthType Negotiate\fR .br Specifies the default type of authentication to use. The default is "Basic". .\"#DefaultEncryption .TP 5 \fBDefaultEncryption Never\fR .TP 5 \fBDefaultEncryption IfRequested\fR .TP 5 \fBDefaultEncryption Required\fR Specifies whether encryption will be used for authenticated requests. The default is "Required". .\"#DefaultLanguage .TP 5 \fBDefaultLanguage \fIlocale\fR Specifies the default language to use for text and web content. The default is "en". .\"#DefaultPaperSize .TP 5 \fBDefaultPaperSize Auto\fR .TP 5 \fBDefaultPaperSize None\fR .TP 5 \fBDefaultPaperSize \fIsizename\fR Specifies the default paper size for new print queues. "Auto" uses a locale-specific default, while "None" specifies there is no default paper size. Specific size names are typically "Letter" or "A4". The default is "Auto". .\"#DefaultPolicy .TP 5 \fBDefaultPolicy \fIpolicy-name\fR Specifies the default access policy to use. The default access policy is "default". .\"#DefaultShared .TP 5 \fBDefaultShared Yes\fR .TP 5 \fBDefaultShared No\fR Specifies whether local printers are shared by default. The default is "Yes". .\"#DirtyCleanInterval .TP 5 \fBDirtyCleanInterval \fIseconds\fR Specifies the delay for updating of configuration and state files. A value of 0 causes the update to happen as soon as possible, typically within a few milliseconds. The default value is "30". .\"#DNSSDHostName .TP 5 .BI DNSSDHostName hostname.example.com Specifies the fully-qualified domain name for the server that is used for Bonjour sharing. The default is typically the server's ".local" hostname. .\"#ErrorPolicy .TP 5 \fBErrorPolicy abort-job\fR Specifies that a failed print job should be aborted (discarded) unless otherwise specified for the printer. .TP 5 \fBErrorPolicy retry-current-job\fR Specifies that a failed print job should be retried immediately unless otherwise specified for the printer. .TP 5 \fBErrorPolicy retry-job\fR Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer. .TP 5 \fBErrorPolicy stop-printer\fR Specifies that a failed print job should stop the printer unless otherwise specified for the printer. The 'stop-printer' error policy is the default. .\"#FilterLimit .TP 5 \fBFilterLimit \fIlimit\fR Specifies the maximum cost of filters that are run concurrently, which can be used to minimize disk, memory, and CPU resource problems. A limit of 0 disables filter limiting. An average print to a non-PostScript printer needs a filter limit of about 200. A PostScript printer needs about half that (100). Setting the limit below these thresholds will effectively limit the scheduler to printing a single job at any time. The default limit is "0". .\"#FilterNice .TP 5 \fBFilterNice \fInice-value\fR Specifies the scheduling priority ( .BR nice (8) value) of filters that are run to print a job. The nice value ranges from 0, the highest priority, to 19, the lowest priority. The default is 0. .\"#GSSServiceName .TP 5 \fBGSSServiceName \fIname\fR Specifies the service name when using Kerberos authentication. The default service name is "http." .TP 5 .\"#HostNameLookups \fBHostNameLookups On\fR .TP 5 \fBHostNameLookups Off\fR .TP 5 \fBHostNameLookups Double\fR Specifies whether to do reverse lookups on connecting clients. The "Double" setting causes .BR cupsd (8) to verify that the hostname resolved from the address matches one of the addresses returned for that hostname. Double lookups also prevent clients with unregistered addresses from connecting to your server. The default is "Off" to avoid the potential server performance problems with hostname lookups. Only set this option to "On" or "Double" if absolutely required. .\"#IdleExitTimeout .TP 5 \fBIdleExitTimeout \fIseconds\fR Specifies the length of time to wait before shutting down due to inactivity. The default is "60" seconds. Note: Only applicable when .BR cupsd (8) is run on-demand (e.g., with \fB-l\fR). .\"#JobKillDelay .TP 5 \fBJobKillDelay \fIseconds\fR Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job. The default is "30". .\"#JobRetryInterval .TP 5 \fBJobRetryInterval \fIseconds\fR Specifies the interval between retries of jobs in seconds. This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job". The default is "30". .\"#JobRetryLimit .TP 5 \fBJobRetryLimit \fIcount\fR Specifies the number of retries that are done for jobs. This is typically used for fax queues but can also be used with normal print queues whose error policy is "retry-job" or "retry-current-job". The default is "5". .\"#KeepAlive .TP 5 \fBKeepAlive Yes\fR .TP 5 \fBKeepAlive No\fR Specifies whether to support HTTP keep-alive connections. The default is "Yes". .\"#KeepAliveTimeout .TP 5 \fBKeepAliveTimeout \fIseconds\fR Specifies how long an idle client connection remains open. The default is "30". .\"#LimitIPP .TP 5 \fB \fR... \fB\fR Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATION NAMES". .\"#Limit .TP 5 \fB \fR... \fB\fR .\"#LimitExcept .TP 5 \fB \fR... \fB\fR Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHOD NAMES". .\"#LimitRequestBody .TP 5 \fBLimitRequestBody \fIsize\fR Specifies the maximum size of print files, IPP requests, and HTML form data. The default is "0" which disables the limit check. .\"#Listen .TP 5 \fBListen \fIipv4-address\fB:\fIport\fR .TP 5 \fBListen [\fIipv6-address\fB]:\fIport\fR .TP 5 \fBListen *:\fIport\fR .TP 5 \fBListen \fI/path/to/domain/socket\fR Listens to the specified address and port or domain socket path for connections. Multiple Listen directives can be provided to listen on multiple addresses. The Listen directive is similar to the Port directive but allows you to restrict access to specific interfaces or networks. .\"#ListenBackLog .TP 5 \fBListenBackLog \fInumber\fR Specifies the number of pending connections that will be allowed. This normally only affects very busy servers that have reached the MaxClients limit, but can also be triggered by large numbers of simultaneous connections. When the limit is reached, the operating system will refuse additional connections until the scheduler can accept the pending ones. The default is the OS-defined default limit, typically either "5" for older operating systems or "128" for newer operating systems. .\"#Location .TP 5 \fB \fR... \fB\fR Specifies access control for the named location. Paths are documented below in the section "LOCATION PATHS". .\"#LogDebugHistory .TP 5 \fBLogDebugHistory \fInumber\fR Specifies the number of debugging messages that are retained for logging if an error occurs in a print job. Debug messages are logged regardless of the LogLevel setting. .\"#LogLevel .TP 5 \fBLogLevel \fRnone .TP 5 \fBLogLevel \fRemerg .TP 5 \fBLogLevel \fRalert .TP 5 \fBLogLevel \fRcrit .TP 5 \fBLogLevel \fRerror .TP 5 \fBLogLevel \fRwarn .TP 5 \fBLogLevel \fRnotice .TP 5 \fBLogLevel \fRinfo .TP 5 \fBLogLevel \fRdebug .TP 5 \fBLogLevel \fRdebug2 Specifies the level of logging for the ErrorLog file. The value "none" stops all logging while "debug2" logs everything. The default is "warn". .\"#LogTimeFormat .TP 5 \fBLogTimeFormat \fRstandard .TP 5 \fBLogTimeFormat \fRusecs Specifies the format of the date and time in the log files. The value "standard" is the default and logs whole seconds while "usecs" logs microseconds. .\"#MaxClients .TP 5 \fBMaxClients \fInumber\fR Specifies the maximum number of simultaneous clients that are allowed by the scheduler. The default is "100". .\"#MaxClientPerHost .TP 5 \fBMaxClientsPerHost \fInumber\fR Specifies the maximum number of simultaneous clients that are allowed from a single address. The default is the MaxClients value. .\"#MaxCopies .TP 5 \fBMaxCopies \fInumber\fR Specifies the maximum number of copies that a user can print of each job. The default is "9999". .\"#MaxHoldTime .TP 5 \fBMaxHoldTime \fIseconds\fR Specifies the maximum time a job may remain in the "indefinite" hold state before it is canceled. The default is "0" which disables cancellation of held jobs. .\"#MaxJobs .TP 5 \fBMaxJobs \fInumber\fR Specifies the maximum number of simultaneous jobs that are allowed. Set to "0" to allow an unlimited number of jobs. The default is "500". .\"#MaxJobsPerPrinter .TP 5 \fBMaxJobsPerPrinter \fInumber\fR Specifies the maximum number of simultaneous jobs that are allowed per printer. The default is "0" which allows up to MaxJobs jobs per printer. .\"#MaxJobsPerUser .TP 5 \fBMaxJobsPerUser \fInumber\fR Specifies the maximum number of simultaneous jobs that are allowed per user. The default is "0" which allows up to MaxJobs jobs per user. .\"#MaxJobTime .TP 5 \fBMaxJobTime \fIseconds\fR Specifies the maximum time a job may take to print before it is canceled. Set to "0" to disable cancellation of "stuck" jobs. The default is "10800" (3 hours). .\"#MaxLogSize .TP 5 \fBMaxLogSize \fIsize\fR Specifies the maximum size of the log files before they are rotated. The value "0" disables log rotation. The default is "1048576" (1MB). .\"#MultipleOperationTimeout .TP 5 \fBMultipleOperationTimeout \fIseconds\fR Specifies the maximum amount of time to allow between files in a multiple file print job. The default is "900" (15 minutes). .\"#Policy .TP 5 \fB \fR... \fB\fR Specifies access control for the named policy. .\"#Port .TP 5 \fBPort \fInumber\fR Listens to the specified port number for connections. .\"#PreserveJobFiles .TP 5 \fBPreserveJobFiles Yes\fR .TP 5 \fBPreserveJobFiles No\fR .TP 5 \fBPreserveJobFiles \fIseconds\fR Specifies whether job files (documents) are preserved after a job is printed. If a numeric value is specified, job files are preserved for the indicated number of seconds after printing. The default is "86400" (preserve 1 day). .\"#PreserveJobHistory .TP 5 \fBPreserveJobHistory Yes\fR .TP 5 \fBPreserveJobHistory No\fR .TP 5 \fBPreserveJobHistory \fIseconds\fR Specifies whether the job history is preserved after a job is printed. If a numeric value is specified, the job history is preserved for the indicated number of seconds after printing. If "Yes", the job history is preserved until the MaxJobs limit is reached. The default is "Yes". .\"#ReloadTimeout .TP 5 \fBReloadTimeout \fIseconds\fR Specifies the amount of time to wait for job completion before restarting the scheduler. The default is "30". .\"#ServerAdmin .TP 5 \fBServerAdmin \fIemail-address\fR Specifies the email address of the server administrator. The default value is "root@ServerName". .\"#ServerAlias .TP 5 \fBServerAlias \fIhostname \fR[ ... \fIhostname \fR] .TP 5 \fBServerAlias *\fR The ServerAlias directive is used for HTTP Host header validation when clients connect to the scheduler from external interfaces. Using the special name "*" can expose your system to known browser-based DNS rebinding attacks, even when accessing sites through a firewall. If the auto-discovery of alternate names does not work, we recommend listing each alternate name with a ServerAlias directive instead of using "*". .\"#ServerName .TP 5 \fBServerName \fIhostname\fR Specifies the fully-qualified hostname of the server. The default is the value reported by the .BR hostname (1) command. .\"#ServerTokens .TP 5 \fBServerTokens None\fR .TP 5 \fBServerTokens ProductOnly\fR .TP 5 \fBServerTokens Major\fR .TP 5 \fBServerTokens Minor\fR .TP 5 \fBServerTokens Minimal\fR .TP 5 \fBServerTokens OS\fR .TP 5 \fBServerTokens Full\fR Specifies what information is included in the Server header of HTTP responses. "None" disables the Server header. "ProductOnly" reports "CUPS". "Major" reports "CUPS/major IPP/2". "Minor" reports "CUPS/major.minor IPP/2.1". "Minimal" reports "CUPS/major.minor.patch IPP/2.1". "OS" reports "CUPS/major.minor.path (osname osversion) IPP/2.1". "Full" reports "CUPS/major.minor.path (osname osversion; architecture) IPP/2.1". The default is "Minimal". .\"#SSLListen .TP 5 \fBSSLListen \fIipv4-address\fB:\fIport\fR .TP 5 \fBSSLListen [\fIipv6-address\fB]:\fIport\fR .TP 5 \fBSSLListen *:\fIport\fR Listens on the specified address and port for encrypted connections. .\"#SSLOptions .TP 5 .TP 5 \fBSSLOptions \fR[\fIAllowDH\fR] [\fIAllowRC4\fR] [\fIAllowSSL3\fR] [\fIDenyCBC\fR] [\fIDenyTLS1.0\fR] [\fIMaxTLS1.0\fR] [\fIMaxTLS1.1\fR] [\fIMaxTLS1.2\fR] [\fIMaxTLS1.3\fR] [\fIMinTLS1.0\fR] [\fIMinTLS1.1\fR] [\fIMinTLS1.2\fR] [\fIMinTLS1.3\fR] .TP 5 \fBSSLOptions None\fR Sets encryption options (only in /etc/cups/client.conf). By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites. Security is reduced when \fIAllow\fR options are used. Security is enhanced when \fIDeny\fR options are used. The \fIAllowDH\fR option enables cipher suites using plain Diffie-Hellman key negotiation (not supported on systems using GNU TLS). The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients. The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0. The \fIDenyCBC\fR option disables all CBC cipher suites. The \fIDenyTLS1.0\fR option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1. The \fIMinTLS\fR options set the minimum TLS version to support. The \fIMaxTLS\fR options set the maximum TLS version to support. Not all operating systems support TLS 1.3 at this time. .\"#SSLPort .TP 5 \fBSSLPort \fIport\fR Listens on the specified port for encrypted connections. .\"#StrictConformance .TP 5 \fBStrictConformance Yes\fR .TP 5 \fBStrictConformance No\fR Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications. The default is "No". .\"#Timeout .TP 5 \fBTimeout \fIseconds\fR Specifies the HTTP request timeout. The default is "900" (15 minutes). .\"#WebInterface .TP 5 \fBWebInterface yes\fR .TP 5 \fBWebInterface no\fR Specifies whether the web interface is enabled. The default is "No". .SS HTTP METHOD NAMES The following HTTP methods are supported by .BR cupsd (8): .TP 5 GET Used by a client to download icons and other printer resources and to access the CUPS web interface. .TP 5 HEAD Used by a client to get the type, size, and modification date of resources. .TP 5 OPTIONS Used by a client to establish a secure (SSL/TLS) connection. .TP 5 POST Used by a client to submit IPP requests and HTML forms from the CUPS web interface. .TP 5 PUT Used by a client to upload configuration files. .SS IPP OPERATION NAMES The following IPP operations are supported by .BR cupsd (8): .TP 5 CUPS\-Accept\-Jobs Allows a printer to accept new jobs. .TP 5 CUPS\-Add\-Modify\-Class Adds or modifies a printer class. .TP 5 CUPS\-Add\-Modify\-Printer Adds or modifies a printer. .TP 5 CUPS\-Authenticate\-Job Releases a job that is held for authentication. .TP 5 CUPS\-Delete\-Class Deletes a printer class. .TP 5 CUPS\-Delete\-Printer Deletes a printer. .TP 5 CUPS\-Get\-Classes Gets a list of printer classes. .TP 5 CUPS\-Get\-Default Gets the server default printer or printer class. .TP 5 CUPS\-Get\-Devices Gets a list of devices that are currently available. .TP 5 CUPS\-Get\-Document Gets a document file for a job. .TP 5 CUPS\-Get\-PPD Gets a PPD file. .TP 5 CUPS\-Get\-PPDs Gets a list of installed PPD files. .TP 5 CUPS\-Get\-Printers Gets a list of printers. .TP 5 CUPS\-Move\-Job Moves a job. .TP 5 CUPS\-Reject\-Jobs Prevents a printer from accepting new jobs. .TP 5 CUPS\-Set\-Default Sets the server default printer or printer class. .TP 5 Cancel\-Job Cancels a job. .TP 5 Cancel\-Jobs Cancels one or more jobs. .TP 5 Cancel\-My\-Jobs Cancels one or more jobs creates by a user. .TP 5 Cancel\-Subscription Cancels a subscription. .TP 5 Close\-Job Closes a job that is waiting for more documents. .TP 5 Create\-Job Creates a new job with no documents. .TP 5 Create\-Job\-Subscriptions Creates a subscription for job events. .TP 5 Create\-Printer\-Subscriptions Creates a subscription for printer events. .TP 5 Get\-Job\-Attributes Gets information about a job. .TP 5 Get\-Jobs Gets a list of jobs. .TP 5 Get\-Notifications Gets a list of event notifications for a subscription. .TP 5 Get\-Printer\-Attributes Gets information about a printer or printer class. .TP 5 Get\-Subscription\-Attributes Gets information about a subscription. .TP 5 Get\-Subscriptions Gets a list of subscriptions. .TP 5 Hold\-Job Holds a job from printing. .TP 5 Hold\-New\-Jobs Holds all new jobs from printing. .TP 5 Pause\-Printer Stops processing of jobs by a printer or printer class. .TP 5 Pause\-Printer\-After\-Current\-Job Stops processing of jobs by a printer or printer class after the current job is finished. .TP 5 Print\-Job Creates a new job with a single document. .TP 5 Purge\-Jobs Cancels one or more jobs and deletes the job history. .TP 5 Release\-Held\-New\-Jobs Allows previously held jobs to print. .TP 5 Release\-Job Allows a job to print. .TP 5 Renew\-Subscription Renews a subscription. .TP 5 Restart\-Job Reprints a job, if possible. .TP 5 Send\-Document Adds a document to a job. .TP 5 Set\-Job\-Attributes Changes job information. .TP 5 Set\-Printer\-Attributes Changes printer or printer class information. .TP 5 Validate\-Job Validates options for a new job. .SS LOCATION PATHS The following paths are commonly used when configuring .BR cupsd (8): .TP 5 / The path for all get operations (get-printers, get-jobs, etc.) .TP 5 /admin The path for all administration operations (add-printer, delete-printer, start-printer, etc.) .TP 5 /admin/conf The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.) .TP 5 /admin/log The path for access to the CUPS log files (access_log, error_log, page_log) .TP 5 /classes The path for all printer classes .TP 5 /classes/name The resource for the named printer class .TP 5 /jobs The path for all jobs (hold-job, release-job, etc.) .TP 5 /jobs/id The path for the specified job .TP 5 /printers The path for all printers .TP 5 /printers/name The path for the named printer .TP 5 /printers/name.png The icon file path for the named printer .TP 5 /printers/name.ppd The PPD file path for the named printer .SS DIRECTIVES VALID WITHIN LOCATION AND LIMIT SECTIONS The following directives may be placed inside Location and Limit sections in the \fBcupsd.conf\fR file: .TP 5 \fBAllow all\fR .TP 5 \fBAllow none\fR .TP 5 \fBAllow \fIhost.domain.com\fR .TP 5 \fBAllow *.\fIdomain.com\fR .TP 5 \fBAllow \fIipv4-address\fR .TP 5 \fBAllow \fIipv4-address\fB/\fInetmask\fR .TP 5 \fBAllow \fIipv4-address\fB/\fImm\fR .TP 5 \fBAllow [\fIipv6-address\fB]\fR .TP 5 \fBAllow [\fIipv6-address\fB]/\fImm\fR .TP 5 \fBAllow @IF(\fIname\fB)\fR .TP 5 \fBAllow @LOCAL\fR Allows access from the named hosts, domains, addresses, or interfaces. The @IF(name) form uses the current subnets configured for the named interface. The @LOCAL form uses the current subnets configured for all interfaces that are not point-to-point, for example Ethernet and Wi-Fi interfaces are used but DSL and VPN interfaces are not. The Order directive controls whether Allow lines are evaluated before or after Deny lines. .TP 5 \fBAuthType None\fR .TP 5 \fBAuthType Basic\fR .TP 5 \fBAuthType Default\fR .TP 5 \fBAuthType Negotiate\fR Specifies the type of authentication required. The value "Default" corresponds to the DefaultAuthType value. .TP 5 \fBDeny all\fR .TP 5 \fBDeny none\fR .TP 5 \fBDeny \fIhost.domain.com\fR .TP 5 \fBDeny *.\fIdomain.com\fR .TP 5 \fBDeny \fIipv4-address\fR .TP 5 \fBDeny \fIipv4-address\fB/\fInetmask\fR .TP 5 \fBDeny \fIipv4-address\fB/\fImm\fR .TP 5 \fBDeny [\fIipv6-address\fB]\fR .TP 5 \fBDeny [\fIipv6-address\fB]/\fImm\fR .TP 5 \fBDeny @IF(\fIname\fB)\fR .TP 5 \fBDeny @LOCAL\fR Denies access from the named hosts, domains, addresses, or interfaces. The @IF(name) form uses the current subnets configured for the named interface. The @LOCAL form uses the current subnets configured for all interfaces that are not point-to-point, for example Ethernet and Wi-Fi interfaces are used but DSL and VPN interfaces are not. The Order directive controls whether Deny lines are evaluated before or after Allow lines. .TP 5 \fBEncryption IfRequested\fR .TP 5 \fBEncryption Never\fR .TP 5 \fBEncryption Required\fR Specifies the level of encryption that is required for a particular location. The default value is "IfRequested". .TP 5 \fBOrder allow,deny\fR Specifies that access is denied by default. Allow lines are then processed followed by Deny lines to determine whether a client may access a particular resource. .TP 5 \fBOrder deny,allow\fR Specifies that access is allowed by default. Deny lines are then processed followed by Allow lines to determine whether a client may access a particular resource. .TP 5 \fBRequire group \fIgroup-name \fR[ \fIgroup-name \fR... ] Specifies that an authenticated user must be a member of one of the named groups. .TP 5 \fBRequire user {\fIuser-name\fR|\fB@\fIgroup-name\fR} ... Specifies that an authenticated user must match one of the named users or be a member of one of the named groups. The group name "@SYSTEM" corresponds to the list of groups defined by the SystemGroup directive in the .BR cups-files.conf (5) file. The group name "@OWNER" corresponds to the owner of the resource, for example the person that submitted a print job. Note: The 'root' user is not special and must be granted privileges like any other user account. .TP 5 \fBRequire valid-user\fR Specifies that any authenticated user is acceptable. .TP 5 \fBSatisfy all\fR Specifies that all Allow, AuthType, Deny, Order, and Require conditions must be satisfied to allow access. .TP 5 \fBSatisfy any\fR Specifies that any a client may access a resource if either the authentication (AuthType/Require) or address (Allow/Deny/Order) conditions are satisfied. For example, this can be used to require authentication only for remote accesses. .SS DIRECTIVES VALID WITHIN POLICY SECTIONS The following directives may be placed inside Policy sections in the \fBcupsd.conf\fR file: .TP 5 \fBJobPrivateAccess all\fR .TP 5 \fBJobPrivateAccess default\fR .TP 5 \fBJobPrivateAccess \fR{\fIuser\fR|\fB@\fIgroup\fR|\fB@ACL\fR|\fB@OWNER\fR|\fB@SYSTEM\fR} ... Specifies an access list for a job's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values. "@OWNER" maps to the job's owner. "@SYSTEM" maps to the groups listed for the SystemGroup directive in the .BR cups-files.conf (5) file. .TP 5 \fBJobPrivateValues all\fR .TP 5 \fBJobPrivateValues default\fR .TP 5 \fBJobPrivateValues none\fR .TP 5 \fBJobPrivateValues \fIattribute-name \fR[ ... \fIattribute-name \fR] Specifies the list of job values to make private. The "default" values are "job-name", "job-originating-host-name", "job-originating-user-name", and "phone". .TP 5 \fBSubscriptionPrivateAccess all\fR .TP 5 \fBSubscriptionPrivateAccess default\fR .TP 5 \fBSubscriptionPrivateAccess \fR{\fIuser\fR|\fB@\fIgroup\fR|\fB@ACL\fR|\fB@OWNER\fR|\fB@SYSTEM\fR} ... Specifies an access list for a subscription's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed or requesting-user-name-denied values. "@OWNER" maps to the job's owner. "@SYSTEM" maps to the groups listed for the SystemGroup directive in the .BR cups-files.conf (5) file. .TP 5 \fBSubscriptionPrivateValues all\fR .TP 5 \fBSubscriptionPrivateValues default\fR .TP 5 \fBSubscriptionPrivateValues none\fR .TP 5 \fBSubscriptionPrivateValues \fIattribute-name \fR[ ... \fIattribute-name \fR] Specifies the list of subscription values to make private. The "default" values are "notify-events", "notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and "notify-user-data". .SS DEPRECATED DIRECTIVES The following directives are deprecated and will be removed in a future release of CUPS: .\"#Classification .TP 5 \fBClassification \fIbanner\fR .br Specifies the security classification of the server. Any valid banner name can be used, including "classified", "confidential", "secret", "topsecret", and "unclassified", or the banner can be omitted to disable secure printing functions. The default is no classification banner. .\"#ClassifyOverride .TP 5 \fBClassifyOverride Yes\fR .TP 5 \fBClassifyOverride No\fR .br Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option. The default is "No". .\"#PageLogFormat .TP 5 \fBPageLogFormat \fIformat-string\fR Specifies the format of PageLog lines. Sequences beginning with percent (%) characters are replaced with the corresponding information, while all other characters are copied literally. The following percent sequences are recognized: .nf "%%" inserts a single percent character. "%{name}" inserts the value of the specified IPP attribute. "%C" inserts the number of copies for the current page. "%P" inserts the current page number. "%T" inserts the current date and time in common log format. "%j" inserts the job ID. "%p" inserts the printer name. "%u" inserts the username. .fi The default is the empty string, which disables page logging. The string "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}" creates a page log with the standard items. Use "%{job-impressions-completed}" to insert the number of pages (sides) that were printed, or "%{job-media-sheets-completed}" to insert the number of sheets that were printed. .\"#RIPCache .TP 5 \fBRIPCache \fIsize\fR Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer. The default is "128m". .SH NOTES File, directory, and user configuration directives that used to be allowed in the \fBcupsd.conf\fR file are now stored in the .BR cups-files.conf (5) file instead in order to prevent certain types of privilege escalation attacks. .PP The scheduler MUST be restarted manually after making changes to the \fBcupsd.conf\fR file. On Linux this is typically done using the .BR systemctl (8) command, while on macOS the .BR launchctl (8) command is used instead. .PP The @LOCAL macro name can be confusing since the system running .B cupsd often belongs to a different set of subnets from its clients. .SH CONFORMING TO The \fBcupsd.conf\fR file format is based on the Apache HTTP Server configuration file format. .SH EXAMPLES Log everything with a maximum log file size of 32 megabytes: .nf AccessLogLevel all LogLevel debug2 MaxLogSize 32m .fi Require authentication for accesses from outside the 10. network: .nf Order allow,deny Allow from 10./8 AuthType Basic Require valid-user Satisfy any .fi .SH SEE ALSO .BR classes.conf (5), .BR cups-files.conf (5), .BR cupsd (8), .BR mime.convs (5), .BR mime.types (5), .BR printers.conf (5), .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/backend.7000664 000765 000024 00000020240 13574721672 015027 0ustar00mikestaff000000 000000 .\" .\" Backend man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH backend 7 "CUPS" "26 April 2019" "Apple Inc." .SH NAME backend \- cups backend transmission interfaces .SH SYNOPSIS .B backend .br .B backend .I job .I user .I title .I num-copies .I options [ .I filename ] .nf \fB#include \fR \fBconst char *cupsBackendDeviceURI\fR(\fBchar **\fIargv\fR); \fBvoid cupsBackendReport\fR(\fBconst char *\fIdevice_scheme\fR, \fBconst char *\fIdevice_uri\fR, \fBconst char *\fIdevice_make_and_model\fR, \fBconst char *\fIdevice_info\fR, \fBconst char *\fIdevice_id\fR, \fBconst char *\fIdevice_location\fR); \fBssize_t cupsBackChannelWrite\fR(\fBconst char *\fIbuffer\fR, \fBsize_t \fIbytes\fR, \fBdouble \fItimeout\fR); \fBint cupsSideChannelRead\fR(\fBcups_sc_command_t *\fIcommand\fR, \fBcups_sc_status_t *\fIstatus\fR, \fBchar *\fIdata\fR, \fBint *\fIdatalen\fR, \fBdouble \fItimeout\fR); \fBint cupsSideChannelWrite\fR(\fBcups_sc_command_t \fIcommand\fR, \fBcups_sc_status_t \fIstatus\fR, \fBconst char *\fIdata\fR, \fBint \fIdatalen\fR, \fBdouble \fItimeout\fR); .fi .SH DESCRIPTION Backends are a special type of .BR filter (7) which is used to send print data to and discover different devices on the system. .LP Like filters, backends must be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the physical interface. .LP The command name (\fIargv[0]\fR) is set to the device URI of the destination printer. Authentication information in .I argv[0] is removed, so backend developers are urged to use the .B DEVICE_URI environment variable whenever authentication information is required. The .BR cupsBackendDeviceURI () function may be used to retrieve the correct device URI. .LP Back-channel data from the device should be relayed to the job filters using the \fIcupsBackChannelWrite\fR function. .LP Backends are responsible for reading side-channel requests using the .BR cupsSideChannelRead () function and responding with the .BR cupsSideChannelWrite () function. The .B CUPS_SC_FD constant defines the file descriptor that should be monitored for incoming requests. .SS DEVICE DISCOVERY When run with no arguments, the backend should list the devices and schemes it supports or is advertising to the standard output. The output consists of zero or more lines consisting of any of the following forms: .nf device-class scheme "Unknown" "device-info" device-class device-uri "device-make-and-model" "device-info" device-class device-uri "device-make-and-model" "device-info" "device-id" device-class device-uri "device-make-and-model" "device-info" "device-id" "device-location" .fi .LP The .BR cupsBackendReport () function can be used to generate these lines and handle any necessary escaping of characters in the various strings. .LP The .I device-class field is one of the following values: .TP 5 .B direct The device-uri refers to a specific direct-access device with no options, such as a parallel, USB, or SCSI device. .TP 5 .B file The device-uri refers to a file on disk. .TP 5 .B network The device-uri refers to a networked device and conforms to the general form for network URIs. .TP 5 .B serial The device-uri refers to a serial device with configurable baud rate and other options. If the device-uri contains a baud value, it represents the maximum baud rate supported by the device. .LP The .I scheme field provides the URI scheme that is supported by the backend. Backends should use this form only when the backend supports any URI using that scheme. The .I device-uri field specifies the full URI to use when communicating with the device. .LP The .I device-make-and-model field specifies the make and model of the device, e.g. "Example Foojet 2000". If the make and model is not known, you must report "Unknown". .LP The .I device-info field specifies additional information about the device. Typically this includes the make and model along with the port number or network address, e.g. "Example Foojet 2000 USB #1". .LP The optional .I device-id field specifies the IEEE-1284 device ID string for the device, which is used to select a matching driver. .LP The optional .I device-location field specifies the physical location of the device, which is often used to pre-populate the printer-location attribute when adding a printer. .SS PERMISSIONS Backends without world read and execute permissions are run as the root user. Otherwise, the backend is run using an unprivileged user account, typically "lp". .SH EXIT STATUS The following exit codes are defined for backends: .TP 5 .B CUPS_BACKEND_OK The print file was successfully transmitted to the device or remote server. .TP 5 .B CUPS_BACKEND_FAILED .br The print file was not successfully transmitted to the device or remote server. The scheduler will respond to this by canceling the job, retrying the job, or stopping the queue depending on the state of the .I printer-error-policy attribute. .TP 5 .B CUPS_BACKEND_AUTH_REQUIRED The print file was not successfully transmitted because valid authentication information is required. The scheduler will respond to this by holding the job and adding the 'cups-held-for-authentication' keyword to the "job-reasons" Job Description attribute. .TP 5 .B CUPS_BACKEND_HOLD The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by holding the job. .TP 5 .B CUPS_BACKEND_STOP The print file was not successfully transmitted because it cannot be printed at this time. The scheduler will respond to this by stopping the queue. .TP 5 .B CUPS_BACKEND_CANCEL The print file was not successfully transmitted because one or more attributes are not supported or the job was canceled at the printer. The scheduler will respond to this by canceling the job. .TP 5 .B CUPS_BACKEND_RETRY The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job at a future time - other jobs may print before this one. .TP 5 .B CUPS_BACKEND_RETRY_CURRENT The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job immediately without allowing intervening jobs. .PP All other exit code values are reserved. .SH ENVIRONMENT In addition to the environment variables listed in .BR cups (1) and .BR filter (7), CUPS backends can expect the following environment variable: .TP 5 .B DEVICE_URI The device URI associated with the printer. .SH FILES .I /etc/cups/cups-files.conf .SH NOTES CUPS backends are not generally designed to be run directly by the user. Aside from the device URI issue ( .I argv[0] and .B DEVICE_URI environment variable contain the device URI), CUPS backends also expect specific environment variables and file descriptors, and typically run in a user session that (on macOS) has additional restrictions that affect how it runs. Backends can also be installed with restricted permissions (0500 or 0700) that tell the scheduler to run them as the "root" user instead of an unprivileged user (typically "lp") on the system. .LP Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the .BR lp (1) or .BR lpr (1) programs to send print jobs or .BR lpinfo (8) to query for available printers using the backend. The one exception is the SNMP backend - see .BR cups-snmp (8) for more information. .SH NOTES CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .IR cups (1), .IR cups-files.conf (5), .IR cups-snmp (8), .IR cupsd (8), .IR filter (7), .IR lp (1), .IR lpinfo (8), .IR lpr (1), .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpstat.1000664 000765 000024 00000007122 13574721672 014745 0ustar00mikestaff000000 000000 .\" .\" lpstat man page for CUPS. .\" .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more information. .\" .TH lpstat 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpstat \- print cups status information .SH SYNOPSIS .B lpstat [ .B \-E ] [ .B \-H ] [ .B \-U .I username ] [ \fB\-h \fIhostname\fR[\fB:\fIport\fR] ] [ .B \-l ] [ .B \-W .I which-jobs ] [ .B \-a [ .I destination(s) ] ] [ .B \-c [ .I class(es) ] ] [ .B \-d ] [ .B \-e ] [ .B \-o [ .I destination(s) ] ] [ .B \-p [ .I printer(s) ] ] [ .B \-r ] [ .B \-R ] [ .B \-s ] [ .B \-t ] [ .B \-u [ .I user(s) ] ] [ .B \-v [ .I printer(s) ] ] .SH DESCRIPTION \fBlpstat\fR displays status information about the current classes, jobs, and printers. When run with no arguments, \fBlpstat\fR will list active jobs queued by the current user. .SH OPTIONS The \fBlpstat\fR command supports the following options: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 .B \-H Shows the server hostname and port. .TP 5 .B \-R Shows the ranking of print jobs. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username. .TP 5 \fB\-W \fIwhich-jobs\fR Specifies which jobs to show, "completed" or "not-completed" (the default). This option \fImust\fR appear before the \fI-o\fR option and/or any printer names, otherwise the default ("not-completed") value will be used in the request to the scheduler. .TP 5 \fB\-a \fR[\fIprinter(s)\fR] Shows the accepting state of printer queues. If no printers are specified then all printers are listed. .TP 5 \fB\-c \fR[\fIclass(es)\fR] Shows the printer classes and the printers that belong to them. If no classes are specified then all classes are listed. .TP 5 .B \-d Shows the current default destination. .TP 5 .B \-e Shows all available destinations on the local network. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Specifies an alternate server. .TP 5 .B \-l Shows a long listing of printers, classes, or jobs. .TP 5 \fB\-o \fR[\fIdestination(s)\fR] Shows the jobs queued on the specified destinations. If no destinations are specified all jobs are shown. .TP 5 \fB\-p \fR[\fIprinter(s)\fR] Shows the printers and whether they are enabled for printing. If no printers are specified then all printers are listed. .TP 5 .B \-r Shows whether the CUPS server is running. .TP 5 .B \-s Shows a status summary, including the default destination, a list of classes and their member printers, and a list of printers and their associated devices. This is equivalent to using the \fI\-d\fR, \fI\-c\fR, and \fI\-v\fR options. .TP 5 .B \-t Shows all status information. This is equivalent to using the \fI\-r\fR, \fI\-d\fR, \fI\-c\fR, \fI\-v\fR, \fI\-a\fR, \fI\-p\fR, and \fI\-o\fR options. .TP 5 \fB\-u \fR[\fIuser(s)\fR] Shows a list of print jobs queued by the specified users. If no users are specified, lists the jobs queued by the current user. .TP 5 \fB\-v \fR[\fIprinter(s)\fR] Shows the printers and what device they are attached to. If no printers are specified then all printers are listed. .SH CONFORMING TO Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", and "#". Also, printer and class names are \fInot\fR case-sensitive. .LP The \fI\-h\fR, \fI-e\fR, \fI\-E\fR, \fI\-U\fR, and \fI\-W\fR options are unique to CUPS. .LP The Solaris \fI\-f\fR, \fI\-P\fR, and \fI\-S\fR options are silently ignored. .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpq (1), .BR lpr (1), .BR lprm (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsd.8000664 000765 000024 00000004672 13574721672 014572 0ustar00mikestaff000000 000000 .\" .\" cupsd man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsd 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsd \- cups scheduler .SH SYNOPSIS .B cupsd [ .B \-c .I cupsd.conf ] [ .B \-f ] [ .B \-F ] [ .B \-h ] [ .B \-l ] [ .B \-s .I cups-files.conf ] [ .B \-t ] .SH DESCRIPTION .B cupsd is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1, and supports most of the requirements for IPP Everywhere. If no options are specified on the command-line then the default configuration file .I /etc/cups/cupsd.conf will be used. .SH OPTIONS .TP 5 .BI \-c \ cupsd.conf Uses the named cupsd.conf configuration file. .TP 5 .B \-f Run .B cupsd in the foreground; the default is to run in the background as a "daemon". .TP 5 .B \-F Run .B cupsd in the foreground but detach the process from the controlling terminal and current directory. This is useful for running .B cupsd from .BR init (8). .TP 5 .B \-h Shows the program usage. .TP 5 .B \-l This option is passed to .B cupsd when it is run from .BR launchd (8) or .BR systemd (8). .TP 5 .BI \-s \ cups-files.conf Uses the named cups-files.conf configuration file. .TP 5 .B \-t Test the configuration file for syntax errors. .SH FILES .nf .I /etc/cups/classes.conf .I /etc/cups/cups-files.conf .I /etc/cups/cupsd.conf .I /usr/share/cups/mime/mime.convs .I /usr/share/cups/mime/mime.types .I /etc/cups/printers.conf .I /etc/cups/subscriptions.conf .fi .SH CONFORMING TO .B cupsd implements all of the required IPP/2.1 attributes and operations. It also implements several CUPS-specific administrative operations. .SH EXAMPLES Run .B cupsd in the background with the default configuration file: .nf cupsd .fi Test a configuration file called .IR test.conf : .nf cupsd \-t \-c test.conf .fi Run .B cupsd in the foreground with a test configuration file called .IR test.conf : .nf cupsd \-f \-c test.conf .fi .SH SEE ALSO .BR backend (7), .BR classes.conf (5), .BR cups (1), .BR cups-files.conf (5), .BR cups-lpd (8), .BR cupsd.conf (5), .BR cupsd-helper (8), .BR cupsd-logs (8), .BR filter (7), .BR launchd (8), .BR mime.convs (5), .BR mime.types (5), .BR printers.conf (5), .BR systemd (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ipptoolfile.5000664 000765 000024 00000055526 13574721672 016003 0ustar00mikestaff000000 000000 .\" .\" ipptoolfile man page. .\" .\" Copyright © 2010-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH ipptoolfile 5 "CUPS" "15 August 2019" "Apple Inc." .SH NAME ipptoolfile \- ipptool file format .SH DESCRIPTION The .BR ipptool (1) program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curly braces, for example: .nf # This is a comment { # The name of the test NAME "Print PDF File" # The request to send OPERATION Print\-Job GROUP operation\-attributes\-tag ATTR charset attributes\-charset utf\-8 ATTR language attributes\-natural\-language en ATTR uri printer\-uri $uri ATTR name requesting\-user\-name $user ATTR mimeMediaType document\-format application/pdf GROUP job\-attributes\-tag ATTR collection media\-col { # US Letter plain paper from the "main" tray MEMBER collection media\-size { MEMBER integer x\-dimension 21590 MEMBER integer y\-dimension 27940 } MEMBER integer media\-top\-margin 423 MEMBER integer media\-bottom\-margin 423 MEMBER integer media\-left\-margin 423 MEMBER integer media\-right\-margin 423 MEMBER keyword media\-source "main" MEMBER keyword media\-type "stationery" } FILE testfile.pdf # The response to expect STATUS successful\-ok EXPECT job\-id OF\-TYPE integer WITH\-VALUE >0 EXPECT job\-uri OF\-TYPE uri } { # The name of the test NAME "Wait for Job to Complete" # The request to send OPERATION Get\-Job\-Attributes GROUP operation\-attributes\-tag ATTR charset attributes\-charset utf\-8 ATTR language attributes\-natural\-language en ATTR uri printer\-uri $uri ATTR integer job\-id $job\-id ATTR name requesting\-user\-name $user # The response to expect STATUS successful\-ok EXPECT job\-id OF\-TYPE integer WITH\-VALUE $job\-id EXPECT job\-uri OF\-TYPE uri EXPECT job\-state OF\-TYPE enum WITH\-VALUE >5 REPEAT\-NO\-MATCH EXPECT job\-originating\-user\-name OF\-TYPE name WITH\-VALUE "$user" # Show the job state until completed... DISPLAY job-state DISPLAY job-state-reasons } .fi .SS TOP-LEVEL DIRECTIVES The following directives can be used outside of a \fItest\fR: .TP 5 \fB{ \fItest \fB}\fR Defines a test. .TP 5 \fBDEFINE \fIvariable-name value\fR Defines the named variable to the given value. This is equivalent to specifying \fI\-d variable-name=value\fR on the .BR ipptool (8) command-line. .TP 5 \fBDEFINE\-DEFAULT \fIvariable-name value\fR Defines the named variable to the given value if it does not already have a value. .TP 5 \fBFILE\-ID "\fIidentifier\fB"\fR Specifies an identifier string for the current file. .TP 5 \fBIGNORE\-ERRORS yes\fR .TP 5 \fBIGNORE\-ERRORS no\fR Specifies whether, by default, .BR ipptool (8) will ignore errors and continue with subsequent tests. .TP 5 \fBINCLUDE "\fIfilename\fB"\fR .TP 5 \fBINCLUDE <\fIfilename\fB>\fR Includes another test file. The first form includes a file relative to the current test file, while the second form includes a file from the .BR ipptool (8) include directory. .TP 5 \fBINCLUDE\-IF\-DEFINED \fIname \fB"\fIfilename\fB"\fR .TP 5 \fBINCLUDE\-IF\-DEFINED \fIname \fB<\fIfilename\fB>\fR Includes another test file if the named variable is defined. The first form includes a file relative to the current test file, while the second form includes a file from the .BR ipptool (8) include directory. .TP 5 \fBINCLUDE\-IF\-NOT\-DEFINED \fIname \fB"\fIfilename\fB"\fR .TP 5 \fBINCLUDE\-IF\-NOT\-DEFINED \fIname \fB<\fIfilename\fB>\fR Includes another test file if the named variable is not defined. The first form includes a file relative to the current test file, while the second form includes a file from the .BR ipptool (8) include directory. .TP 5 \fBSKIP\-IF\-DEFINED \fIvariable-name\fR .TP 5 \fBSKIP\-IF\-NOT\-DEFINED \fIvariable-name\fR Specifies that the remainder of the test file should be skipped when the variable is or is not defined. .TP 5 \fBSTOP\-AFTER\-INCLUDE\-ERROR no\fR .TP 5 \fBSTOP\-AFTER\-INCLUDE\-ERROR yes\fR Specifies whether tests will be stopped after an error in an included file. .TP 5 \fBTRANSFER auto\fR Specifies that tests will, by default, use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files. .TP 5 \fBTRANSFER chunked\fR Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: chunked" header. This is the default and is equivalent to specifying \fI\-c\fR on the .BR ipptool (8) command-line. Support for chunked requests is required for conformance with all versions of IPP. .TP 5 \fBTRANSFER length\fR Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" header. This is equivalent to specifying \fI\-l\fR on the .BR ipptool (8) command-line. Support for content length requests is required for conformance with all versions of IPP. .TP 5 \fBVERSION 1.0\fR .TP 5 \fBVERSION 1.1\fR .TP 5 \fBVERSION 2.0\fR .TP 5 \fBVERSION 2.1\fR .TP 5 \fBVERSION 2.2\fR Specifies the default IPP version number to use for the tests that follow. .SS TEST DIRECTIVES The following directives are understood within a \fItest\fR: .TP 5 \fBATTR \fIout-of-band-tag attribute-name\fR .TP 5 \fBATTR \fItag attribute-name value(s)\fR 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 delimited by the comma (",") character - escape commas using the "\\" character. Common attributes and values are listed in the IANA IPP registry - see references below. .TP 5 \fBATTR collection \fIattribute-name \fB{ MEMBER \fItag member-name value(s) ... \fB}\fR [ \fI... \fB,{ \fI... \fB} \fR] Adds a collection attribute to the test request. Member attributes follow the same syntax as regular attributes and can themselves be nested collections. Multiple collection values can be supplied as needed, separated by commas. .TP 5 \fBCOMPRESSION deflate\fR .TP 5 \fBCOMPRESSION gzip\fR .TP 5 \fBCOMPRESSION none\fR Uses the specified compression on the document data following the attributes in a Print-Job or Send-Document request. .TP 5 \fBDELAY \fIseconds\fR[\fI,repeat-seconds\fR] Specifies a delay in seconds before this test will be run. If two values are specified, the second value is used as the delay between repeated tests. .TP 5 \fBDISPLAY \fIattribute-name\fR Specifies that value of the named attribute should be output as part of the test report. .TP 5 \fBEXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR] .TP 5 \fBEXPECT ?\fIattribute-name predicate(s)\fR .TP 5 \fBEXPECT !\fIattribute-name\fR Specifies that the response must/may/must not include the named attribute. Additional requirements can be added as predicates - see the "EXPECT PREDICATES" section for more information on predicates. Attribute names can specify member attributes by separating the attribute and member names with the forward slash, for example "media\-col/media\-size/x\-dimension". .TP 5 \fBEXPECT-ALL \fIattribute-name \fR[ \fIpredicate(s) \fR] .TP 5 \fBEXPECT-ALL ?\fIattribute-name predicate(s)\fR Specifies that the response must/may include the named attribute and that all occurrences of that attribute must match the given predicates. .TP 5 \fBFILE filename\fR Specifies a file to include at the end of the request. This is typically used when sending a test print file. .TP 5 \fBGROUP tag\fR Specifies the group tag for subsequent attributes in the request. .TP 5 \fBIGNORE\-ERRORS yes\fR .TP 5 \fBIGNORE\-ERRORS no\fR Specifies whether .BR ipptool (8) will ignore errors and continue with subsequent tests. .TP 5 \fBNAME "\fIliteral string\fB"\fR Specifies the human-readable name of the test. .TP 5 \fBOPERATION \fIoperation-code\fR Specifies the operation to be performed. .TP 5 \fBPAUSE "\fImessage\fB"\fR Displays the provided message and waits for the user to press a key to continue. .TP 5 \fBREQUEST\-ID \fInumber\fR\fR .TP 5 \fBREQUEST\-ID random\fR Specifies the request-id value to use in the request, either an integer or the word "random" to use a randomly generated value (the default). .TP 5 \fBRESOURCE \fIpath\fR Specifies an alternate resource path that is used for the HTTP POST request. The default is the resource from the URI provided to the .BR ipptool (8) program. .TP 5 \fBSKIP\-IF\-DEFINED \fIvariable-name\fR .TP 5 \fBSKIP\-IF\-NOT\-DEFINED \fIvariable-name\fR Specifies that the current test should be skipped when the variable is or is not defined. .TP 5 \fBSKIP\-PREVIOUS\-ERROR yes\fR .TP 5 \fBSKIP\-PREVIOUS\-ERROR no\fR Specifies whether .BR ipptool (8) will skip the current test if the previous test resulted in an error/failure. .TP 5 \fBSTATUS \fIstatus-code \fR[ \fIpredicate\fR ] Specifies an expected response status-code value. Additional requirements can be added as predicates - see the "STATUS PREDICATES" section for more information on predicates. .TP 5 \fBTEST\-ID "\fIidentifier\fR" Specifies an identifier string for the current test. .TP 5 \fBTRANSFER auto\fR Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise. .TP 5 \fBTRANSFER chunked\fR Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header. .TP 5 \fBTRANSFER length\fR Specifies that this test will use the HTTP/1.0 "Content-Length:" header. .TP 5 \fBVERSION 1.0\fR .TP 5 \fBVERSION 1.1\fR .TP 5 \fBVERSION 2.0\fR .TP 5 \fBVERSION 2.1\fR .TP 5 \fBVERSION 2.2\fR Specifies the IPP version number to use for this test. .SS EXPECT PREDICATES The following predicates are understood following the \fBEXPECT\fR test directive: .TP 5 \fBCOUNT \fInumber\fR Requires the \fBEXPECT\fR attribute to have the specified number of values. .TP 5 \fBDEFINE\-MATCH \fIvariable-name\fR Defines the variable to "1" when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test. .TP 5 \fBDEFINE\-NO\-MATCH \fIvariable-name\fR Defines the variable to "1" when the \fBEXPECT\fR condition does not match. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test. .TP 5 \fBDEFINE\-VALUE \fIvariable-name\fR Defines the variable to the value of the attribute when the \fBEXPECT\fR condition matches. A side-effect of this predicate is that this \fBEXPECT\fR will never fail a test. .TP 5 \fBIF\-DEFINED \fIvariable-name\fR Makes the \fBEXPECT\fR conditions apply only if the specified variable is defined. .TP 5 \fBIF\-NOT\-DEFINED \fIvariable-name\fR Makes the \fBEXPECT\fR conditions apply only if the specified variable is not defined. .TP 5 \fBIN\-GROUP \fItag\fR Requires the \fBEXPECT\fR attribute to be in the specified group tag. .TP 5 \fBOF\-TYPE \fItag[|tag,...]\fR Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s). .TP 5 \fBREPEAT\-LIMIT \fInumber\fR .br Specifies the maximum number of times to repeat if the \fBREPEAT-MATCH\fR or \fBREPEAT-NO-MATCH\fR predicate is specified. The default value is 1000. .TP 5 \fBREPEAT\-MATCH\fR .TP 5 \fBREPEAT\-NO\-MATCH\fR Specifies that the current test should be repeated when the \fBEXPECT\fR condition matches or does not match. .TP 5 \fBSAME\-COUNT\-AS \fIattribute-name\fR Requires the \fBEXPECT\fR attribute to have the same number of values as the specified parallel attribute. .TP 5 \fBWITH\-ALL\-HOSTNAMES "\fIliteral string\fB"\fR .TP 5 \fBWITH\-ALL\-HOSTNAMES "/\fIregular expression\fB/"\fR Requires that all URI values contain a matching hostname. .TP 5 \fBWITH\-ALL\-RESOURCES "\fIliteral string\fB"\fR .TP 5 \fBWITH\-ALL\-RESOURCES "/\fIregular expression\fB/"\fR Requires that all URI values contain a matching resource (including leading /). .TP 5 \fBWITH\-ALL\-SCHEMES "\fIliteral string\fB"\fR .TP 5 \fBWITH\-ALL-SCHEMES "/\fIregular expression\fB/"\fR Requires that all URI values contain a matching scheme. .TP 5 \fBWITH\-ALL\-VALUES "\fIliteral string\fB"\fR Requires that all values of the \fBEXPECT\fR attribute match the literal string. Comparisons are case-sensitive. .TP 5 \fBWITH\-ALL\-VALUES <\fInumber\fR .TP 5 \fBWITH\-ALL\-VALUES =\fInumber\fR .TP 5 \fBWITH\-ALL\-VALUES >\fInumber\fR .TP 5 \fBWITH\-ALL\-VALUES \fInumber\fR[\fI,...,number\fR] Requires that all values of the \fBEXPECT\fR attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range. .TP 5 \fBWITH\-ALL\-VALUES "false"\fR .TP 5 \fBWITH\-ALL\-VALUES "true"\fR Requires that all values of the \fBEXPECT\fR attribute match the boolean value given. .TP 5 \fBWITH\-ALL\-VALUES "/\fIregular expression\fB/"\fR Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive. .TP 5 \fBWITH\-HOSTNAME "\fIliteral string\fB"\fR .TP 5 \fBWITH\-HOSTNAME "/\fIregular expression\fB/"\fR Requires that at least one URI value contains a matching hostname. .TP 5 \fBWITH\-RESOURCE "\fIliteral string\fB"\fR .TP 5 \fBWITH\-RESOURCE "/\fIregular expression\fB/"\fR Requires that at least one URI value contains a matching resource (including leading /). .TP 5 \fBWITH\-SCHEME "\fIliteral string\fB"\fR .TP 5 \fBWITH\-SCHEME "/\fIregular expression\fB/"\fR Requires that at least one URI value contains a matching scheme. .TP 5 \fBWITH\-VALUE "\fIliteral string\fB"\fR Requires that at least one value of the \fBEXPECT\fR attribute matches the literal string. Comparisons are case-sensitive. .TP 5 \fBWITH\-VALUE <\fInumber\fR .TP 5 \fBWITH\-VALUE =\fInumber\fR .TP 5 \fBWITH\-VALUE >\fInumber\fR .TP 5 \fBWITH\-VALUE \fInumber\fR[\fI,...,number\fR] Requires that at least one value of the \fBEXPECT\fR attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range. .TP 5 \fBWITH\-VALUE "false"\fR .TP 5 \fBWITH\-VALUE "true"\fR Requires that at least one value of the \fBEXPECT\fR attribute matches the boolean value given. .TP 5 \fBWITH\-VALUE "/\fIregular expression\fB/"\fR Requires that at least one value of the \fBEXPECT\fR attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive. .TP 5 \fBWITH\-VALUE\-FROM \fIattribute-name\fR Requires that the value(s) of the \fBEXPECT\fR attribute matches the value(s) in the specified attribute. For example, "EXPECT job\-sheets WITH\-VALUE\-FROM job\-sheets\-supported" requires that the "job\-sheets" value is listed as a value of the "job\-sheets\-supported" attribute. .SS STATUS PREDICATES The following predicates are understood following the \fBSTATUS\fR test directive: .TP 5 \fBDEFINE\-MATCH \fIvariable-name\fR Defines the variable to "1" when the \fBSTATUS\fR matches. A side-effect of this predicate is that this \fBSTATUS\fR will never fail a test. .TP 5 \fBDEFINE\-NO\-MATCH \fIvariable-name\fR Defines the variable to "1" when the \fBSTATUS\fR does not match. A side-effect of this predicate is that this \fBSTATUS\fR will never fail a test. .TP 5 \fBIF\-DEFINED \fIvariable-name\fR Makes the \fBSTATUS\fR apply only if the specified variable is defined. .TP 5 \fBIF\-NOT\-DEFINED \fIvariable-name\fR Makes the \fBSTATUS\fR apply only if the specified variable is not defined. .TP 5 \fBREPEAT\-LIMIT \fInumber\fR .br Specifies the maximum number of times to repeat. The default value is 1000. .TP 5 \fBREPEAT\-MATCH\fR .TP 5 \fBREPEAT\-NO\-MATCH\fR Specifies that the current test should be repeated when the response status-code matches or does not match the value specified by the STATUS directive. .SS OPERATION CODES Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of names supported by .BR ipptool (8): .nf Activate\-Printer CUPS\-Accept\-Jobs CUPS\-Add\-Modify\-Class CUPS\-Add\-Modify\-Printer CUPS\-Authenticate\-Job CUPS\-Delete\-Class CUPS\-Delete\-Printer CUPS\-Get\-Classes CUPS\-Get\-Default CUPS\-Get\-Devices CUPS\-Get\-Document CUPS\-Get\-PPD CUPS\-Get\-PPDs CUPS\-Get\-Printers CUPS\-Move\-Job CUPS\-Reject\-Jobs CUPS\-Set\-Default Cancel\-Current\-Job Cancel\-Job Cancel\-Jobs Cancel\-My\-Jobs Cancel\-Subscription Close\-Job Create\-Job Create\-Job\-Subscriptions Create\-Printer\-Subscriptions Deactivate\-Printer Disable\-Printer Enable\-Printer Get\-Job\-Attributes Get\-Jobs Get\-Notifications Get\-Printer\-Attributes Get\-Printer\-Support\-Files Get\-Printer\-Supported\-Values Get\-Subscription\-Attributes Get\-Subscriptions Hold\-Job Hold\-New\-Jobs Identify\-Printer Pause\-Printer Pause\-Printer\-After\-Current\-Job Print\-Job Print\-URI Promote\-Job Purge\-Jobs Release\-Held\-New\-Jobs Release\-Job Renew\-Subscription Reprocess\-Job Restart\-Job Restart\-Printer Resubmit\-Job Resume\-Job Resume\-Printer Schedule\-Job\-After Send\-Document Send\-Hardcopy\-Document Send\-Notifications Send\-URI Set\-Job\-Attributes Set\-Printer\-Attributes Shutdown\-Printer Startup\-Printer Suspend\-Current\-Job Validate\-Document Validate\-Job .fi .SS STATUS CODES Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of the names supported by .BR ipptool (8): .nf client\-error\-account\-authorization\-failed client\-error\-account\-closed client\-error\-account\-info\-needed client\-error\-account\-limit\-reached client\-error\-attributes\-not\-settable client\-error\-attributes\-or\-values\-not\-supported client\-error\-bad\-request client\-error\-charset\-not\-supported client\-error\-compression\-error client\-error\-compression\-not\-supported client\-error\-conflicting\-attributes client\-error\-document\-access\-error client\-error\-document\-format\-error client\-error\-document\-format\-not\-supported client\-error\-document\-password\-error client\-error\-document\-permission\-error client\-error\-document\-security\-error client\-error\-document\-unprintable\-error client\-error\-forbidden client\-error\-gone client\-error\-ignored\-all\-notifications client\-error\-ignored\-all\-subscriptions client\-error\-not\-authenticated client\-error\-not\-authorized client\-error\-not\-found client\-error\-not\-possible client\-error\-print\-support\-file\-not\-found client\-error\-request\-entity\-too\-large client\-error\-request\-value\-too\-long client\-error\-timeout client\-error\-too\-many\-subscriptions client\-error\-uri\-scheme\-not\-supported cups\-error\-account\-authorization\-failed cups\-error\-account\-closed cups\-error\-account\-info\-needed cups\-error\-account\-limit\-reached cups\-see\-other redirection\-other\-site server\-error\-busy server\-error\-device\-error server\-error\-internal\-error server\-error\-job\-canceled server\-error\-multiple\-document\-jobs\-not\-supported server\-error\-not\-accepting\-jobs server\-error\-operation\-not\-supported server\-error\-printer\-is\-deactivated server\-error\-service\-unavailable server\-error\-temporary\-error server\-error\-version\-not\-supported successful\-ok successful\-ok\-but\-cancel\-subscription successful\-ok\-conflicting\-attributes successful\-ok\-events\-complete successful\-ok\-ignored\-notifications successful\-ok\-ignored\-or\-substituted\-attributes successful\-ok\-ignored\-subscriptions successful\-ok\-too\-many\-events .fi .SS TAGS Value and group tags correspond to the names from RFC 8011 and other IPP extension specifications. Here are the group tags: .nf document\-attributes\-tag event\-notification\-attributes\-tag job\-attributes\-tag operation\-attributes\-tag printer\-attributes\-tag subscription\-attributes\-tag unsupported\-attributes\-tag .fi .LP Here are the value tags: .nf admin\-define boolean charset collection dateTime default delete\-attribute enum integer keyword mimeMediaType nameWithLanguage nameWithoutLanguage naturalLanguage no\-value not\-settable octetString rangeOfInteger resolution textWithLanguage textWithoutLanguage unknown unsupported uri uriScheme .fi .SS VARIABLES The .BR ipptool (8) program maintains a list of variables that can be used in any literal string or attribute value by specifying "\fI$variable-name\fR". Aside from variables defined using the \fI-d\fR option or \fBDEFINE\fR directive, the following pre-defined variables are available: .TP 5 \fB$$\fR Inserts a single "$" character. .TP 5 \fB$ENV[\fIname\fB]\fR Inserts the value of the named environment variable, or an empty string if the environment variable is not defined. .TP 5 \fB$date-current\fR Inserts the current date and time using the ISO-8601 format ("yyyy-mm-ddThh:mm:ssZ"). .TP 5 \fB$date-start\fR Inserts the starting date and time using the ISO-8601 format ("yyyy-mm-ddThh:mm:ssZ"). .TP 5 \fB$filename\fR Inserts the filename provided to .BR ipptool (8) with the \fI-f\fR option. .TP 5 \fB$filetype\fR Inserts the MIME media type for the filename provided to .BR ipptool (8) with the \fI-f\fR option. .TP 5 \fB$hostname\fR Inserts the hostname from the URI provided to .BR ipptool (8). .TP 5 \fB$job\-id\fR Inserts the last "job\-id" attribute value returned in a test response or 0 if no "job\-id" attribute has been seen. .TP 5 \fB$job\-uri\fR Inserts the last "job\-uri" attribute value returned in a test response or an empty string if no "job\-uri" attribute has been seen. .TP 5 \fB$notify\-subscription\-id\fR Inserts the last "notify\-subscription\-id" attribute value returned in a test response or 0 if no "notify\-subscription\-id" attribute has been seen. .TP 5 \fB$port\fR Inserts the port number from the URI provided to .BR ipptool (8). .TP 5 \fB$resource\fR Inserts the resource path from the URI provided to .BR ipptool (8). .TP 5 \fB$scheme\fR Inserts the scheme from the URI provided to .BR ipptool (8). .TP 5 \fB$uri\fR Inserts the URI provided to .BR ipptool (8). .TP 5 \fB$uriuser\fR Inserts the username from the URI provided to .BR ipptool (8), if any. .TP 5 \fB$user\fR Inserts the current user's login name. .SH SEE ALSO .BR ipptool (1), IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), RFC 8011 (http://tools.ietf.org/html/rfc8011) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsfilter.8000664 000765 000024 00000006402 13574721672 015625 0ustar00mikestaff000000 000000 .\" .\" cupsfilter man page for CUPS. .\" .\" Copyright 2007-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsfilter 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsfilter \- convert a file to another format using cups filters (deprecated) .SH SYNOPSIS .B cupsfilter [ .B \-\-list\-filters ] [ .B \-D ] [ .B \-U .I user ] [ .B \-c .I config-file ] [ .B \-d .I printer ] [ .B \-e ] [ .B \-i .I mime/type ] [ .B \-j .I job-id[,N] ] [ .B \-m .I mime/type ] [ .B \-n .I copies ] [ .B \-o .I name=value ] [ .B \-p .I filename.ppd ] [ .B \-t .I title ] [ .B \-u ] .I filename .SH DESCRIPTION .B cupsfilter is a front-end to the CUPS filter subsystem which allows you to convert a file to a specific format, just as if you had printed the file through CUPS. By default, .B cupsfilter generates a PDF file. The converted file is sent to the standard output. .SH OPTIONS .TP 5 .B \-\-list\-filters Do not actually run the filters, just print the filters used to stdout. .TP 5 .B \-D Delete the input file after conversion. .TP 5 \fB\-U \fIuser\fR Specifies the username passed to the filters. The default is the name of the current user. .TP 5 \fB\-c \fIconfig-file\fR Uses the named cups-files.conf configuration file. .TP 5 \fB\-d \fIprinter\fR Uses information from the named printer. .TP 5 .B \-e Use every filter from the PPD file. .TP 5 \fB\-i \fImime/type\fR Specifies the source file type. The default file type is guessed using the filename and contents of the file. .TP 5 \fB\-j \fIjob-id[,N]\fR Converts document N from the specified job. If N is omitted, document 1 is converted. .TP 5 \fB\-m \fImime/type\fR Specifies the destination file type. The default file type is application/pdf. Use printer/foo to convert to the printer format defined by the filters in the PPD file. .TP 5 \fB\-n \fIcopies\fR Specifies the number of copies to generate. .TP 5 \fB\-o \fIname=value\fR Specifies options to pass to the CUPS filters. .TP 5 \fB\-p \fIfilename.ppd\fR Specifies the PPD file to use. .TP 5 \fB\-t \fItitle\fR Specifies the document title. .TP 5 .B \-u Delete the PPD file after conversion. .SH EXIT STATUS .B cupsfilter returns a non-zero exit status on any error. .SH ENVIRONMENT All of the standard .BR cups (1) environment variables affect the operation of .BR cupsfilter . .SH FILES .nf /etc/cups/cups-files.conf /etc/cups/*.convs /etc/cups/*.types /usr/share/cups/mime/*.convs /usr/share/cups/mime/*.types .SH NOTES CUPS printer drivers, filters, and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .LP Unlike when printing, filters run using the .B cupsfilter command use the current user and security session. This may result in different output or unexpected behavior. .SH EXAMPLE The following command will generate a PDF preview of job 42 for a printer named "myprinter" and save it to a file named "preview.pdf": .nf cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf .fi .SH SEE ALSO .BR cups (1), .BR cupsd.conf (5), .BR filter(7), .BR mime.convs (7), .BR mime.types (7), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpc.8000664 000765 000024 00000003236 13574721672 014225 0ustar00mikestaff000000 000000 .\" .\" lpc man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpc 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpc \- line printer control program (deprecated) .SH SYNOPSIS .B lpc [ .I command [ .I parameter(s) ] ] .SH DESCRIPTION \fBlpc\fR provides limited control over printer and class queues provided by CUPS. It can also be used to query the state of queues. .LP If no command is specified on the command-line, \fBlpc\fR displays a prompt and accepts commands from the standard input. .SS COMMANDS The \fBlpc\fR program accepts a subset of commands accepted by the Berkeley \fBlpc\fR program of the same name: .TP 5 .B exit Exits the command interpreter. .TP 5 \fBhelp \fR[\fIcommand\fR] .TP 5 \fB? \fR[\fIcommand\fR] Displays a short help message. .TP 5 .B quit Exits the command interpreter. .TP 5 \fBstatus \fR[\fIqueue\fR] Displays the status of one or more printer or class queues. .SH NOTES This program is deprecated and will be removed in a future feature release of CUPS. .LP Since \fBlpc\fR is geared towards the Berkeley printing system, it is impossible to use \fBlpc\fR to configure printer or class queues provided by CUPS. To configure printer or class queues you must use the .BR lpadmin (8) command or another CUPS-compatible client with that functionality. .SH SEE ALSO .BR cancel (1), .BR cupsaccept (8), .BR cupsenable (8), .BR lp (1), .BR lpadmin (8), .BR lpr (1), .BR lprm (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupstestppd.1000664 000765 000024 00000007415 13574721672 016021 0ustar00mikestaff000000 000000 .\" .\" cupstestppd man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupstestppd 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupstestppd \- test conformance of ppd files .SH SYNOPSIS .B cupstestppd [ .B \-I .I category ] [ .B \-R .I rootdir ] [ .B \-W .I category ] [ .B \-q ] [ .B \-r ] [ \fB\-v\fR[\fBv\fR] ] .I filename.ppd[.gz] [ ... .I filename.ppd[.gz] ] .br .B cupstestppd [ .B \-R .I rootdir ] [ .B \-W .I category ] [ .B \-q ] [ .B \-r ] [ \fB\-v\fR[\fBv\fR] ] .B \- .SH DESCRIPTION \fBcupstestppd\fR tests the conformance of PPD files to the Adobe PostScript Printer Description file format specification version 4.3. It can also be used to list the supported options and available fonts in a PPD file. The results of testing and any other output are sent to the standard output. .LP The first form of \fBcupstestppd\fR tests one or more PPD files on the command-line. The second form tests the PPD file provided on the standard input. .SH OPTIONS \fBcupstestppd\fR supports the following options: .TP 5 \fB\-I filename\fR Ignores all PCFileName warnings. .TP 5 \fB\-I filters\fR Ignores all filter errors. .TP 5 \fB\-I profiles\fR Ignores all profile errors. .TP 5 \fB\-R \fIrootdir\fR Specifies an alternate root directory for the filter, pre-filter, and other support file checks. .TP 5 \fB\-W constraints\fR Report all UIConstraint errors as warnings. .TP 5 \fB\-W defaults\fR Except for size-related options, report all default option errors as warnings. .TP 5 \fB\-W filters\fR Report all filter errors as warnings. .TP 5 \fB\-W profiles\fR Report all profile errors as warnings. .TP 5 \fB\-W sizes\fR Report all media size errors as warnings. .TP 5 \fB\-W translations\fR Report all translation errors as warnings. .TP 5 \fB\-W all\fR Report all of the previous errors as warnings. .TP 5 \fB\-W none\fR Report all of the previous errors as errors. .TP 5 .B \-q Specifies that no information should be displayed. .TP 5 .B \-r Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors. .TP 5 .B \-v Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status. .TP 5 .B \-vv Specifies that all information in the PPD file should be displayed in addition to the detailed conformance testing results. .LP The \fI-q\fR, \fI-v\fR, and \fI-vv\fR options are mutually exclusive. .SH EXIT STATUS \fBcupstestppd\fR returns zero on success and non-zero on error. The error codes are as follows: .TP 5 1 Bad command-line arguments or missing PPD filename. .TP 5 2 Unable to open or read PPD file. .TP 5 3 The PPD file contains format errors that cannot be skipped. .TP 5 4 The PPD file does not conform to the Adobe PPD specification. .SH EXAMPLES The following command will test all PPD files under the current directory and print the names of each file that does not conform: .nf find . \-name \\*.ppd \\! \-exec cupstestppd \-q '{}' \\; \-print .fi The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform: .nf find . \-name \\*.ppd \\! \-exec cupstestppd \-q '{}' \\; \\ \-exec cupstestppd \-v '{}' \\; .fi .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR lpadmin (8), CUPS Online Help (http://localhost:631/help), Adobe PostScript Printer Description File Format Specification, Version 4.3. .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsaccept.8000664 000765 000024 00000003753 13574721672 015605 0ustar00mikestaff000000 000000 .\" .\" cupsaccept/reject man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsaccept 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsaccept/cupsreject \- accept/reject jobs sent to a destination .SH SYNOPSIS .B cupsaccept [ .B \-E ] [ .B \-U .I username ] [ .B \-h .I hostname[:port] ] .I destination(s) .br .B cupsreject [ .B \-E ] [ .B \-U .I username ] [ .B \-h .I hostname[:port] ] [ .B \-r .I reason ] .I destination(s) .SH DESCRIPTION The .B cupsaccept command instructs the printing system to accept print jobs to the specified destinations. .LP The .B cupsreject command instructs the printing system to reject print jobs to the specified destinations. The \fI-r\fR option sets the reason for rejecting print jobs. If not specified, the reason defaults to "Reason Unknown". .SH OPTIONS The following options are supported by both .B cupsaccept and .BR cupsreject : .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB-U \fIusername\fR Sets the username that is sent when connecting to the server. .TP 5 \fB-h \fIhostname[:port]\fR Chooses an alternate server. .TP 5 \fB-r \fR"\fIreason\fR" Sets the reason string that is shown for a printer that is rejecting jobs. .SH CONFORMING TO The .B cupsaccept and .B cupsreject commands correspond to the System V printing system commands "accept" and "reject", respectively. Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive. .LP Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration. .SH SEE ALSO .BR cancel (1), .BR cupsenable (8), .BR lp (1), .BR lpadmin (8), .BR lpstat (1), .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cups-files.conf.5000664 000765 000024 00000023551 13574721672 016444 0ustar00mikestaff000000 000000 .\" .\" cups-files.conf man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cups-files.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cups\-files.conf \- file and directory configuration file for cups .SH DESCRIPTION The \fBcups\-files.conf\fR file configures the files and directories used by the CUPS scheduler, .BR cupsd (8). It is normally located in the \fI/etc/cups\fR directory. .LP Each line in the file can be a configuration directive, a blank line, or a comment. Configuration directives typically consist of a name and zero or more values separated by whitespace. The configuration directive name and values are case-insensitive. Comment lines start with the # character. .SS DIRECTIVES The following directives are understood by .BR cupsd (8): .\"#AccessLog .TP 5 \fBAccessLog\fR .TP 5 \fBAccessLog \fIfilename\fR .TP 5 \fBAccessLog stderr\fR .TP 5 \fBAccessLog syslog\fR Defines the access log filename. Specifying a blank filename disables access log generation. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. The server name may be included in filenames using the string "%s", for example: .nf AccessLog /var/log/cups/%s-access_log .fi The default is "/var/log/cups/access_log". .\"#CacheDir .TP 5 \fBCacheDir \fIdirectory\fR Specifies the directory to use for long-lived temporary (cache) files. The default is "/var/spool/cups/cache" or "/var/cache/cups" depending on the platform. .\"#ConfigFilePerm .TP 5 \fBConfigFilePerm \fImode\fR Specifies the permissions for all configuration files that the scheduler writes. The default is "0644" on macOS and "0640" on all other operating systems. .LP \fBNote:\fR The permissions for the \fIprinters.conf\fR file are currently masked to only allow access from the scheduler user (typically root). This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system. There is no way to disable this security feature. .\"#CreateSelfSignedCerts .TP 5 \fBCreateSelfSignedCerts yes\fR .TP 5 \fBCreateSelfSignedCerts no\fR Specifies whether the scheduler automatically creates self-signed certificates for client connections using TLS. The default is yes. .\"#DataDir .TP 5 \fBDataDir \fIpath\fR Specifies the directory where data files can be found. The default is usually "/usr/share/cups". .\"#DocumentRoot .TP 5 \fBDocumentRoot \fIdirectory\fR Specifies the root directory for the CUPS web interface content. The default is usually "/usr/share/doc/cups". .\"#ErrorLog .TP 5 \fBErrorLog\fR .TP 5 \fBErrorLog \fIfilename\fR .TP 5 \fBErrorLog stderr\fR .TP 5 \fBErrorLog syslog\fR Defines the error log filename. Specifying a blank filename disables error log generation. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. The server name may be included in filenames using the string "%s", for example: .nf ErrorLog /var/log/cups/%s-error_log .fi The default is "/var/log/cups/error_log". .\"#FatalErrors .TP 5 \fBFatalErrors none\fR .TP 5 \fBFatalErrors all \fI\-kind \fR[ ... \fI\-kind \fR] .TP 5 \fBFatalErrors \fIkind \fR[ ... \fIkind \fR] Specifies which errors are fatal, causing the scheduler to exit. The default is "config". The \fIkind\fR strings are: .RS 5 .TP 5 .B none No errors are fatal. .TP 5 .B all All of the errors below are fatal. .TP 5 .B browse Browsing initialization errors are fatal, for example failed connections to the DNS-SD daemon. .TP 5 .B config Configuration file syntax errors are fatal. .TP 5 .B listen Listen or Port errors are fatal, except for IPv6 failures on the loopback or "any" addresses. .TP 5 .B log Log file creation or write errors are fatal. .TP 5 .B permissions Bad startup file permissions are fatal, for example shared TLS certificate and key files with world-read permissions. .RE .\"#Group .TP 5 \fBGroup \fIgroup-name-or-number\fR Specifies the group name or ID that will be used when executing external programs. The default group is operating system specific but is usually "lp" or "nobody". .\"#LogFilePerm .TP 5 \fBLogFilePerm \fImode\fR Specifies the permissions of all log files that the scheduler writes. The default is "0644". .\"#PageLog .TP 5 \fBPageLog \fR[ \fIfilename\fR ] .TP 5 \fBPageLog stderr\fR .TP 5 \fBPageLog syslog\fR Defines the page log filename. The value "stderr" causes log entries to be sent to the standard error file when the scheduler is running in the foreground, or to the system log daemon when run in the background. The value "syslog" causes log entries to be sent to the system log daemon. Specifying a blank filename disables page log generation. The server name may be included in filenames using the string "%s", for example: .nf PageLog /var/log/cups/%s-page_log .fi The default is "/var/log/cups/page_log". .\"#PassEnv .TP 5 \fBPassEnv \fIvariable \fR[ ... \fIvariable \fR] Passes the specified environment variable(s) to child processes. Note: the standard CUPS filter and backend environment variables cannot be overridden using this directive. .\"#RemoteRoot .TP 5 \fBRemoteRoot \fIusername\fR Specifies the username that is associated with unauthenticated accesses by clients claiming to be the root user. The default is "remroot". .\"#RequestRoot .TP 5 \fBRequestRoot \fIdirectory\fR Specifies the directory that contains print jobs and other HTTP request data. The default is "/var/spool/cups". .\"#Sandboxing .TP 5 \fBSandboxing relaxed\fR .TP 5 \fBSandboxing strict\fR Specifies the level of security sandboxing that is applied to print filters, backends, and other child processes of the scheduler. The default is "strict". This directive is currently only used/supported on macOS. .\"#ServerBin .TP 5 \fBServerBin \fIdirectory\fR Specifies the directory containing the backends, CGI programs, filters, helper programs, notifiers, and port monitors. The default is "/usr/lib/cups" or "/usr/libexec/cups" depending on the platform. .\"#ServerKeychain .TP 5 \fBServerKeychain \fIpath\fR Specifies the location of TLS certificates and private keys. The default is "/Library/Keychains/System.keychain" on macOS and "/etc/cups/ssl" on all other operating systems. macOS uses its keychain database to store certificates and keys while other platforms use separate files in the specified directory, *.crt for PEM-encoded certificates and *.key for PEM-encoded private keys. .\"#ServerRoot .TP 5 \fBServerRoot \fIdirectory\fR Specifies the directory containing the server configuration files. The default is "/etc/cups". .\"#SetEnv .TP 5 \fBSetEnv \fIvariable value\fR Set the specified environment variable to be passed to child processes. Note: the standard CUPS filter and backend environment variables cannot be overridden using this directive. .\"#StateDir .TP 5 \fBStateDir \fIdirectory\fR Specifies the directory to use for PID and local certificate files. The default is "/var/run/cups" or "/etc/cups" depending on the platform. .\"#SyncOnClose .TP 5 \fBSyncOnClose Yes\fR .TP 5 \fBSyncOnClose No\fR Specifies whether the scheduler calls .BR fsync (2) after writing configuration or state files. The default is "No". .\"#SystemGroup .TP 5 \fBSystemGroup \fIgroup-name \fR[ ... \fIgroup-name\fR ] Specifies the group(s) to use for \fI@SYSTEM\fR group authentication. The default contains "admin", "lpadmin", "root", "sys", and/or "system". .\"#TempDir .TP 5 \fBTempDir \fIdirectory\fR Specifies the directory where short-term temporary files are stored. The default is "/var/spool/cups/tmp". .\"#User .TP 5 \fBUser \fIusername\fR Specifies the user name or ID that is used when running external programs. The default is "lp". .SS DEPRECATED DIRECTIVES The following directives are deprecated and will be removed from a future version of CUPS: .\"#FileDevice .TP 5 \fBFileDevice Yes\fR .TP 5 \fBFileDevice No\fR Specifies whether the file pseudo-device can be used for new printer queues. The URI "file:///dev/null" is always allowed. File devices cannot be used with "raw" print queues - a PPD file is required. The specified file is overwritten for every print job. Writing to directories is not supported. .\"#FontPath .TP 5 \fBFontPath \fIdirectory[:...:directoryN]\fR Specifies a colon separated list of directories where fonts can be found. On Linux the .BR font-config (1) mechanism is used instead. On macOS the Font Book application manages system-installed fonts. .\"#LPDConfigFile .TP 5 \fB LPDConfigFile \fIfilename\fR Specifies the LPD service configuration file to update. .\"#Printcap .TP 5 \fBPrintcap \fIfilename\fR Specifies a file that is filled with a list of local print queues. .\"#PrintcapFormat .TP 5 \fBPrintcapFormat bsd\fR .TP 5 \fBPrintcapFormat plist\fR .TP 5 \fBPrintcapFormat solaris\fR Specifies the format to use for the Printcap file. "bsd" is the historical LPD printcap file format. "plist" is the Apple plist file format. "solaris" is the historical Solaris LPD printcap file format. .\"#SMBConfigFile .TP 5 \fBSMBConfigFile \fIfilename\fR Specifies the SMB service configuration file to update. .SH NOTES The scheduler MUST be restarted manually after making changes to the \fBcups-files.conf\fR file. On Linux this is typically done using the .BR systemctl (8) command, while on macOS the .BR launchctl (8) command is used instead. .SH SEE ALSO .BR classes.conf (5), .BR cups (1), .BR cupsd (8), .BR cupsd.conf (5), .BR mime.convs (5), .BR mime.types (5), .BR printers.conf (5), .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/printers.conf.5000664 000765 000024 00000001740 13574721672 016234 0ustar00mikestaff000000 000000 .\" .\" printers.conf man page for CUPS. .\" .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more information. .\" .TH printers.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME printers.conf \- printer configuration file for cups .SH DESCRIPTION The \fBprinters.conf\fR file defines the local printers that are available. It is normally located in the \fI/etc/cups\fR directory and is maintained by the .BR cupsd (8) program. This file is not intended to be edited or managed manually. .SH NOTES The name, location, and format of this file are an implementation detail that will change in future releases of CUPS. .SH SEE ALSO .BR classes.conf (5), .BR cups-files.conf (5), .BR cupsd (8), .BR cupsd.conf (5), .BR mime.convs (5), .BR mime.types (5), .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/mime.types.5000664 000765 000024 00000011071 13574721672 015532 0ustar00mikestaff000000 000000 .\" .\" mime.types man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH mime.types 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME mime.types \- mime type description file for cups .SH DESCRIPTION The \fBmime.types\fR file defines the recognized file types. .LP Additional file types are specified in files with the extension \fI.types\fR in the CUPS configuration directory. .LP Each line in the \fBmime.types\fR file is a comment, blank, or rule line. Comment lines start with the # character. Rule lines start with the MIME media type and are optionally followed by a series of file recognition rules: .nf \fImime/type \fR[ \fIrule \fR... \fIrule \fR] .fi Rules can be extended over multiple lines using the backslash character (\\): .nf \fImime/type \fR[ \fIreally-really-really-long-rule \fR... \fB\\ \fIrule \fR] .fi MIME media types specified by the \fImime/type\fR field are case-insensitive and are sorted in ascending alphanumeric order for the purposes of matching. See the "TYPE MATCHING AND PRIORITY" section for more information. .LP The rules may be grouped using parenthesis, joined using "+" for a logical AND, joined using "," or whitespace for a logical OR, and negated using "!". .SS RULES Rules take two forms - a filename extension by itself and functions with test values inside parenthesis. The following functions are available: .TP 5 \fBmatch("\fIpattern\fB")\fR True if the filename matches the given shell wildcard \fIpattern\fR. .TP 5 \fBascii(\fIoffset\fB,\fIlength\fB)\fR True if the \fIlength\fR bytes starting at \fIoffset\fR are valid printable ASCII (CR, NL, TAB, BS, 32-126). .TP 5 \fBprintable(\fIoffset\fB,\fIlength\fB)\fR True if the \fIlength\fR bytes starting at \fIoffset\fR are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254). .TP 5 \fBpriority(\fInumber\fB)\fR Specifies the relative priority of this MIME media type. The default priority is 100. Larger values have higher priority while smaller values have lower priority. .TP 5 \fBstring(\fIoffset\fB,"\fIstring\fB")\fR True if the bytes starting at \fIoffset\fR are identical to \fIstring\fR. .TP 5 \fBistring(\fIoffset\fB,"\fIstring\fB")\fR True if the bytes starting at \fIoffset\fR match \fIstring\fR without respect to case. .TP 5 \fBchar(\fIoffset\fB,\fIvalue\fB)\fR True if the byte at \fIoffset\fR is identical to \fIvalue\fR. .TP 5 \fBshort(\fIoffset\fB,\fIvalue\fB)\fR True if the 16-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR. .TP 5 \fBint(\fIoffset\fB,\fIvalue\fB)\fR True if the 32-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR. .TP 5 \fBlocale("\fIstring\fB")\fR True if current locale matches \fIstring\fR. .TP 5 \fBcontains(\fIoffset\fB,\fIrange\fB,"\fIstring\fB")\fR True if the bytes starting at \fIoffset\fR for \fIrange\fR bytes contains \fIstring\fR. .SS STRING CONSTANTS String constants can be specified inside quotes ("") for strings containing whitespace and angle brackets (<>) for hexadecimal strings. .SS TYPE MATCHING AND PRIORITY When CUPS needs to determine the MIME media type of a given file, it checks every MIME media type defined in the \fI.types\fR files. When two or more types match a given file, the type chosen will depend on the type name and priority, with higher-priority types being used over lower-priority ones. If the types have the same priority, the type names are sorted alphanumerically in ascending order and the first type is chosen. .LP For example, if two types "text/bar" and "text/foo" are defined as matching the extension "doc", normally the type "text/bar" will be chosen since its name is alphanumerically smaller than "text/foo". However, if "text/foo" also defines a higher priority than "text/bar", "text/foo" will be chosen instead. .SH FILES \fI/etc/cups\fR - Typical CUPS configuration directory. .SH EXAMPLES Define two MIME media types for raster data, with one being a subset with higher priority: .nf application/vnd.cups\-raster string(0,"RaSt") string(0,"tSaR") \\ string(0,"RaS2") string(0,"2SaR") \\ string(0,"RaS3") string(0,"3SaR") image/pwg-raster string(0,"RaS2") + \\ string(4,PwgRaster<00>) priority(150) .fi .SH SEE ALSO .BR cups-files.conf (5), .BR cupsd.conf (5), .BR cupsd (8), .BR cupsfilter (8), .BR mime.convs (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsd-helper.8000664 000765 000024 00000004271 13574721672 016042 0ustar00mikestaff000000 000000 .\" .\" cupsd-helper man page for CUPS. .\" .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsd-helper 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsd\-helper \- cupsd helper programs (deprecated) .SH SYNOPSIS .B cups\-deviced .I request-id .I limit .I user-id .I options .br .B cups\-driverd .B cat .I ppd-name .br .B cups\-driverd .B list .I request_id .I limit .I options .br .B cups\-exec .I sandbox-profile [ .I \-g .I group-id ] [ .I \-n .I nice-value ] [ .I \-u .I user-id ] .I /path/to/program .I argv0 .I ... .I argvN .SH DESCRIPTION The \fBcupsd\-helper\fR programs perform long-running operations on behalf of the scheduler, .BR cupsd (8). The \fBcups-deviced\fR helper program runs each CUPS .BR backend (7) with no arguments in order to discover the available printers. .LP The \fBcups-driverd\fR helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file. .LP The \fBcups-exec\fR helper program runs backends, filters, and other programs. On macOS these programs are run in a secure sandbox. .SH FILES The \fBcups-driverd\fR program looks for PPD and driver information files in the following directories: .nf \fI/Library/Printers\fR \fI/opt/share/ppd\fR \fI/System/Library/Printers\fR \fI/usr/local/share/ppd\fR \fI/usr/share/cups/drv\fR \fI/usr/share/cups/model\fR \fI/usr/share/ppd\fR .fi .LP PPD files can be compressed using the .BR gzip (1) program or placed in compressed .BR tar (1) archives to further reduce their size. .LP Driver information files must conform to the format defined in .BR ppdcfile (5). .SH NOTES CUPS printer drivers, backends, and PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR backend (7), .BR cups (1), .BR cupsd (8), .BR cupsd.conf (5), .BR filter (7), .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cancel.1000664 000765 000024 00000003616 13574721672 014667 0ustar00mikestaff000000 000000 .\" .\" cancel man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cancel 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cancel \- cancel jobs .SH SYNOPSIS .B cancel [ .B \-E ] [ .B \-U .I username ] [ .B \-a ] [ .B \-h .I hostname[:port] ] [ .B \-u .I username ] [ .B \-x ] [ .I id ] [ .I destination ] [ .I destination\-id ] .SH DESCRIPTION The \fBcancel\fR command cancels print jobs. If no \fIdestination\fR or \fIid\fR is specified, the currently printing job on the default destination is canceled. .SH OPTIONS The following options are recognized by \fBcancel\fR: .TP 5 .B \-a Cancel all jobs on the named destination, or all jobs on all destinations if none is provided. .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-h \fIhostname\fR[\fI:port\fR] Specifies an alternate server. .TP 5 \fB\-U \fIusername\fR Specifies the username to use when connecting to the server. .TP 5 \fB\-u \fIusername\fR Cancels jobs owned by \fIusername\fR. .TP 5 .B \-x Deletes job data files in addition to canceling. .SH CONFORMING TO Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive. .SH EXAMPLES Cancel the current print job: .nf cancel .fi Cancel job "myprinter-42": .nf cancel myprinter\-42 .fi Cancel all jobs: .nf cancel \-a .fi .SH NOTES Administrators wishing to prevent unauthorized cancellation of jobs via the \fI\-u\fR option should require authentication for Cancel-Jobs operations in .BR cupsd.conf (5). .SH SEE ALSO .BR cupsd.conf (5), .BR lp (1), .BR lpmove (8), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/subscriptions.conf.5000664 000765 000024 00000002025 13574721672 017272 0ustar00mikestaff000000 000000 .\" .\" subscriptions.conf man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH subscriptions.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME subscriptions.conf \- subscription configuration file for cups .SH DESCRIPTION The \fBsubscriptions.conf\fR file defines the local event notification subscriptions that are active. It is normally located in the \fI/etc/cups\fR directory and is maintained by the .BR cupsd (8) program. This file is not intended to be edited or managed manually. .SH NOTES The name, location, and format of this file are an implementation detail that will change in future releases of CUPS. .SH SEE ALSO .BR classes.conf (5), .BR cups-files.conf (5), .BR cupsd (8), .BR cupsd.conf (5), .BR mime.convs (5), .BR mime.types (5), .BR printers.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lprm.1000664 000765 000024 00000003012 13574721672 014402 0ustar00mikestaff000000 000000 .\" .\" lprm man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprm 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lprm \- cancel print jobs .SH SYNOPSIS .B lprm [ .B \-E ] [ .B \-U .I username ] [ .B \-h .IR server [ :port ] ] [ .B \-P .IR destination [ /instance ] ] [ .B \- ] [ .I job-id(s) ] .SH DESCRIPTION .B lprm cancels print jobs that have been queued for printing. If no arguments are supplied, the current job on the default destination is canceled. You can specify one or more job ID numbers to cancel those jobs or use the \fI\-\fR option to cancel all jobs. .SH OPTIONS The .B lprm command supports the following options: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-P \fIdestination\fR[\fI/instance\fR] Specifies the destination printer or class. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username. .TP 5 \fB\-h \fIserver\fR[\fI:port\fR] Specifies an alternate server. .SH CONFORMING TO The CUPS version of .B lprm is compatible with the standard Berkeley command of the same name. .SH EXAMPLES Cancel the current job on the default printer: .nf lprm .fi Cancel job 1234: .nf lprm 1234 .fi Cancel all jobs: .nf lprm \- .fi .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpq (1), .BR lpr (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/classes.conf.5000664 000765 000024 00000001725 13574721672 016026 0ustar00mikestaff000000 000000 .\" .\" classes.conf man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH classes.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME classes.conf \- class configuration file for cups .SH DESCRIPTION The \fBclasses.conf\fR file defines the local printer classes that are available. It is normally located in the \fI/etc/cups\fR directory and is maintained by the .BR cupsd (8) program. This file is not intended to be edited or managed manually. .SH NOTES The name, location, and format of this file are an implementation detail that will change in future releases of CUPS. .SH SEE ALSO .BR cupsd (8), .BR cupsd.conf (5), .BR mime.convs (5), .BR mime.types (5), .BR printers.conf (5), .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/mantohtml.c000664 000765 000024 00000056305 13574721672 015532 0ustar00mikestaff000000 000000 /* * Man page to HTML conversion program. * * Copyright 2007-2017 by Apple Inc. * Copyright 2004-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers. */ #include #include #include /* * Local globals... */ static const char /* Start/end tags for fonts */ * const start_fonts[] = { "", "", "" }, * const end_fonts[] = { "", "", "" }; /* * Local functions... */ static void html_alternate(const char *s, const char *first, const char *second, FILE *fp); static void html_fputs(const char *s, int *font, FILE *fp); static void html_putc(int ch, FILE *fp); static void strmove(char *d, const char *s); /* * 'main()' - Convert a man page to HTML. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { FILE *infile, /* Input file */ *outfile; /* Output file */ char line[1024], /* Line from file */ *lineptr, /* Pointer into line */ anchor[1024], /* Anchor */ name[1024], /* Man page name */ ddpost[256]; /* Tagged list post markup */ int section = -1, /* Man page section */ pre = 0, /* Preformatted */ font = 0, /* Current font */ linenum = 0; /* Current line number */ float list_indent = 0.0f, /* Current list indentation */ nested_indent = 0.0f; /* Nested list indentation, if any */ const char *list = NULL, /* Current list, if any */ *nested = NULL; /* Nested list, if any */ const char *post = NULL; /* Text to add after the current line */ /* * Check arguments... */ if (argc > 3) { fputs("Usage: mantohtml [filename.man [filename.html]]\n", stderr); return (1); } /* * Open files as needed... */ if (argc > 1) { if ((infile = fopen(argv[1], "r")) == NULL) { perror(argv[1]); return (1); } } else infile = stdin; if (argc > 2) { if ((outfile = fopen(argv[2], "w")) == NULL) { perror(argv[2]); fclose(infile); return (1); } } else outfile = stdout; /* * Read from input and write the output... */ fputs("\n" "\n" "\n" "\n" "\t\n", outfile); anchor[0] = '\0'; while (fgets(line, sizeof(line), infile)) { size_t linelen = strlen(line); /* Length of line */ if (linelen > 0 && line[linelen - 1] == '\n') line[linelen - 1] = '\0'; linenum ++; if (line[0] == '.') { /* * Strip leading whitespace... */ while (line[1] == ' ' || line[1] == '\t') strmove(line + 1, line + 2); /* * Process man page commands... */ if (!strncmp(line, ".TH ", 4) && section < 0) { /* * Grab man page title... */ sscanf(line + 4, "%s%d", name, §ion); fprintf(outfile, "\t%s(%d)\n" "\n" "\n" "

%s(%d)

\n" "%s", name, section, name, section, start_fonts[font]); } else if (section < 0) continue; else if (!strncmp(line, ".SH ", 4) || !strncmp(line, ".SS ", 4)) { /* * Grab heading... */ int first = 1; fputs(end_fonts[font], outfile); font = 0; if (list) { fprintf(outfile, "\n", list); list = NULL; } if (line[2] == 'H') fputs("

", outfile); for (lineptr = line + 4; *lineptr; lineptr ++) { if (*lineptr == '\"') continue; else if (*lineptr == ' ') { html_putc(' ', outfile); first = 1; } else { if (first) html_putc(*lineptr, outfile); else html_putc(tolower(*lineptr & 255), outfile); first = 0; } } if (line[2] == 'H') fputs("

\n", outfile); else fputs("\n", outfile); } else if (!strncmp(line, ".B ", 3)) { /* * Grab bold text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 3, "b", "b", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".I ", 3)) { /* * Grab italic text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 3, "i", "i", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".BI ", 4)) { /* * Alternating bold and italic text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "b", "i", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".BR ", 4)) { /* * Alternating bold and roman (plain) text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "b", NULL, outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".IB ", 4)) { /* * Alternating italic and bold text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "i", "b", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".IR ", 4)) { /* * Alternating italic and roman (plain) text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "i", NULL, outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".RB ", 4)) { /* * Alternating roman (plain) and bold text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, NULL, "b", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".RI ", 4)) { /* * Alternating roman (plain) and italic text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, NULL, "i", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".SB ", 4)) { /* * Alternating small and bold text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "small", "b", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strncmp(line, ".SM ", 4)) { /* * Small text... */ fputs(end_fonts[font], outfile); font = 0; if (anchor[0]) fprintf(outfile, "", anchor); html_alternate(line + 4, "small", "small", outfile); if (anchor[0]) { fputs("", outfile); anchor[0] = '\0'; } if (post) { fputs(post, outfile); post = NULL; } } else if (!strcmp(line, ".LP") || !strcmp(line, ".PP") || !strcmp(line, ".P")) { /* * New paragraph... */ fputs(end_fonts[font], outfile); font = 0; if (list) { fprintf(outfile, "\n", list); list = NULL; } fputs("

", outfile); if (anchor[0]) { fprintf(outfile, "", anchor); anchor[0] = '\0'; } } else if (!strcmp(line, ".RS") || !strncmp(line, ".RS ", 4)) { /* * Indent... */ float amount = 3.0; /* Indentation */ if (line[3]) amount = (float)atof(line + 4); fputs(end_fonts[font], outfile); font = 0; if (list) { nested = list; list = NULL; nested_indent = list_indent; list_indent = 0.0f; } fprintf(outfile, "

\n", amount - nested_indent); } else if (!strcmp(line, ".RE")) { /* * Unindent... */ fputs(end_fonts[font], outfile); font = 0; fputs("
\n", outfile); if (nested) { list = nested; nested = NULL; list_indent = nested_indent; nested_indent = 0.0f; } } else if (!strcmp(line, ".HP") || !strncmp(line, ".HP ", 4)) { /* * Hanging paragraph... * * .HP i */ float amount = 3.0; /* Indentation */ if (line[3]) amount = (float)atof(line + 4); fputs(end_fonts[font], outfile); font = 0; if (list) { fprintf(outfile, "\n", list); list = NULL; } fprintf(outfile, "

", amount, -amount); if (anchor[0]) { fprintf(outfile, "", anchor); anchor[0] = '\0'; } if (line[1] == 'T') post = "
\n"; } else if (!strcmp(line, ".TP") || !strncmp(line, ".TP ", 4)) { /* * Tagged list... * * .TP i */ float amount = 3.0; /* Indentation */ if (line[3]) amount = (float)atof(line + 4); fputs(end_fonts[font], outfile); font = 0; if (list && strcmp(list, "dl")) { fprintf(outfile, "\n", list); list = NULL; } if (!list) { fputs("

\n", outfile); list = "dl"; list_indent = amount; } fputs("
", outfile); snprintf(ddpost, sizeof(ddpost), "
", amount); post = ddpost; if (anchor[0]) { fprintf(outfile, "", anchor); anchor[0] = '\0'; } } else if (!strncmp(line, ".IP ", 4)) { /* * Indented paragraph... * * .IP x i */ float amount = 3.0; /* Indentation */ const char *newlist = NULL; /* New list style */ const char *newtype = NULL; /* New list numbering type */ fputs(end_fonts[font], outfile); font = 0; lineptr = line + 4; while (isspace(*lineptr & 255)) lineptr ++; if (!strncmp(lineptr, "\\(bu", 4) || !strncmp(lineptr, "\\(em", 4)) { /* * Bullet list... */ newlist = "ul"; } else if (isdigit(*lineptr & 255)) { /* * Numbered list... */ newlist = "ol"; } else if (islower(*lineptr & 255)) { /* * Lowercase alpha list... */ newlist = "ol"; newtype = "a"; } else if (isupper(*lineptr & 255)) { /* * Lowercase alpha list... */ newlist = "ol"; newtype = "A"; } while (!isspace(*lineptr & 255)) lineptr ++; while (isspace(*lineptr & 255)) lineptr ++; if (isdigit(*lineptr & 255)) amount = (float)atof(lineptr); if (newlist && list && strcmp(newlist, list)) { fprintf(outfile, "\n", list); list = NULL; } if (newlist && !list) { if (newtype) fprintf(outfile, "<%s type=\"%s\">\n", newlist, newtype); else fprintf(outfile, "<%s>\n", newlist); list = newlist; } if (list) fprintf(outfile, "
  • ", amount); else fprintf(outfile, "

    ", amount); if (anchor[0]) { fprintf(outfile, "", anchor); anchor[0] = '\0'; } } else if (!strncmp(line, ".br", 3)) { /* * Grab line break... */ fputs("
    \n", outfile); } else if (!strncmp(line, ".de ", 4)) { /* * Define macro - ignore... */ while (fgets(line, sizeof(line), infile)) { linenum ++; if (!strncmp(line, "..", 2)) break; } } else if (!strncmp(line, ".ds ", 4) || !strncmp(line, ".rm ", 4) || !strncmp(line, ".tr ", 4) || !strncmp(line, ".hy ", 4) || !strncmp(line, ".IX ", 4) || !strncmp(line, ".PD", 3) || !strncmp(line, ".Sp", 3)) { /* * Ignore unused commands... */ } else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3) || !strncmp(line, ".EX", 3)) { /* * Start preformatted... */ fputs(end_fonts[font], outfile); font = 0; // if (list) // { // fprintf(outfile, "\n", list); // list = NULL; // } pre = 1; fputs("

    \n", outfile);
          }
          else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3) || !strncmp(line, ".EE", 3))
          {
           /*
            * End preformatted...
    	*/
    
    	fputs(end_fonts[font], outfile);
    	font = 0;
    
            if (pre)
    	{
              pre = 0;
    	  fputs("
    \n", outfile); } } else if (!strncmp(line, ".\\}", 3)) { /* * Ignore close block... */ } else if (!strncmp(line, ".ie", 3) || !strncmp(line, ".if", 3) || !strncmp(line, ".el", 3)) { /* * If/else - ignore... */ if (strchr(line, '{') != NULL) { /* * Skip whole block... */ while (fgets(line, sizeof(line), infile)) { linenum ++; if (strchr(line, '}') != NULL) break; } } } #if 0 else if (!strncmp(line, ". ", 4)) { /* * Grab ... */ } #endif /* 0 */ else if (!strncmp(line, ".\\\"#", 4)) { /* * Anchor for HTML output... */ strlcpy(anchor, line + 4, sizeof(anchor)); } else if (strncmp(line, ".\\\"", 3)) { /* * Unknown... */ if ((lineptr = strchr(line, ' ')) != NULL) *lineptr = '\0'; else if ((lineptr = strchr(line, '\n')) != NULL) *lineptr = '\0'; fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d.\n", line, linenum); } /* * Skip continuation lines... */ lineptr = line + strlen(line) - 1; if (lineptr >= line && *lineptr == '\\') { while (fgets(line, sizeof(line), infile)) { linenum ++; lineptr = line + strlen(line) - 2; if (lineptr < line || *lineptr != '\\') break; } } } else { /* * Process man page text... */ html_fputs(line, &font, outfile); putc('\n', outfile); if (post) { fputs(post, outfile); post = NULL; } } } fprintf(outfile, "%s\n", end_fonts[font]); font = 0; if (list) { fprintf(outfile, "\n", list); list = NULL; } fputs("\n" "\n", outfile); /* * Close files... */ if (infile != stdin) fclose(infile); if (outfile != stdout) fclose(outfile); /* * Return with no errors... */ return (0); } /* * 'html_alternate()' - Alternate words between two styles of text. */ static void html_alternate(const char *s, /* I - String */ const char *first, /* I - First style or NULL */ const char *second, /* I - Second style of NULL */ FILE *fp) /* I - File */ { int i = 0; /* Which style */ int quote = 0; /* Saw quote? */ int dolinks, /* Do hyperlinks to other man pages? */ link = 0; /* Doing a link now? */ /* * Skip leading whitespace... */ while (isspace(*s & 255)) s ++; dolinks = first && !strcmp(first, "b") && !second; while (*s) { if (!i && dolinks) { /* * See if we need to make a link to a man page... */ const char *end; /* End of current word */ const char *next; /* Start of next word */ for (end = s; *end && !isspace(*end & 255); end ++); for (next = end; isspace(*next & 255); next ++); if (isalnum(*s & 255) && *next == '(') { /* * See if the man file is available locally... */ char name[1024], /* Name */ manfile[1024], /* Man page filename */ manurl[1024]; /* Man page URL */ strlcpy(name, s, sizeof(name)); if ((size_t)(end - s) < sizeof(name)) name[end - s] = '\0'; snprintf(manfile, sizeof(manfile), "%s.man", name); snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages", name); if (!access(manfile, 0)) { /* * Local man page, do a link... */ fprintf(fp, "", manurl); link = 1; } } } if (!i && first) fprintf(fp, "<%s>", first); else if (i && second) fprintf(fp, "<%s>", second); while ((!isspace(*s & 255) || quote) && *s) { if (*s == '\"') quote = !quote; if (*s == '\\' && s[1]) { s ++; html_putc(*s++, fp); } else html_putc(*s++, fp); } if (!i && first) fprintf(fp, "", first); else if (i && second) fprintf(fp, "", second); if (i && link) { fputs("", fp); link = 0; } i = 1 - i; /* * Skip trailing whitespace... */ while (isspace(*s & 255)) s ++; } putc('\n', fp); } /* * 'html_fputs()' - Output a string, quoting as needed HTML entities. */ static void html_fputs(const char *s, /* I - String */ int *font, /* IO - Font */ FILE *fp) /* I - File */ { while (*s) { if (*s == '\\') { s ++; if (!*s) break; if (*s == 'f') { int newfont; /* New font */ s ++; if (!*s) break; if (!font) { s ++; continue; } switch (*s++) { case 'R' : case 'P' : newfont = 0; break; case 'b' : case 'B' : newfont = 1; break; case 'i' : case 'I' : newfont = 2; break; default : fprintf(stderr, "mantohtml: Unknown font \"\\f%c\" ignored.\n", s[-1]); newfont = *font; break; } if (newfont != *font) { fputs(end_fonts[*font], fp); *font = newfont; fputs(start_fonts[*font], fp); } } else if (*s == '*') { /* * Substitute macro... */ s ++; if (!*s) break; switch (*s++) { case 'R' : fputs("®", fp); break; case '(' : if (!strncmp(s, "lq", 2)) fputs("“", fp); else if (!strncmp(s, "rq", 2)) fputs("”", fp); else if (!strncmp(s, "Tm", 2)) fputs("TM", fp); else fprintf(stderr, "mantohtml: Unknown macro \"\\*(%2s\" ignored.\n", s); if (*s) s ++; if (*s) s ++; break; default : fprintf(stderr, "mantohtml: Unknown macro \"\\*%c\" ignored.\n", s[-1]); break; } } else if (*s == '(') { if (!strncmp(s, "(em", 3)) { fputs("—", fp); s += 3; } else if (!strncmp(s, "(en", 3)) { fputs("–", fp); s += 3; } else { putc(*s, fp); s ++; } } else if (*s == '[') { /* * Substitute escaped character... */ s ++; if (!strncmp(s, "co]", 3)) fputs("©", fp); else if (!strncmp(s, "de]", 3)) fputs("°", fp); else if (!strncmp(s, "rg]", 3)) fputs("®", fp); else if (!strncmp(s, "tm]", 3)) fputs("TM", fp); if (*s) s ++; if (*s) s ++; if (*s) s ++; } else if (isdigit(s[0]) && isdigit(s[1]) && isdigit(s[2])) { fprintf(fp, "&#%d;", ((s[0] - '0') * 8 + s[1] - '0') * 8 + s[2] - '0'); s += 3; } else { if (*s != '\\' && *s != '\"' && *s != '\'' && *s != '-') { fprintf(stderr, "mantohtml: Unrecognized escape \"\\%c\" ignored.\n", *s); html_putc('\\', fp); } html_putc(*s++, fp); } } else if (!strncmp(s, "http://", 7) || !strncmp(s, "https://", 8) || !strncmp(s, "ftp://", 6)) { /* * Embed URL... */ char temp[1024]; /* Temporary string */ const char *end = s + 6; /* End of URL */ while (*end && !isspace(*end & 255)) end ++; if (end[-1] == ',' || end[-1] == '.' || end[-1] == ')') end --; strlcpy(temp, s, sizeof(temp)); if ((size_t)(end -s) < sizeof(temp)) temp[end - s] = '\0'; fprintf(fp, "%s", temp, temp); s = end; } else html_putc(*s++ & 255, fp); } } /* * 'html_putc()' - Put a single character, using entities as needed. */ static void html_putc(int ch, /* I - Character */ FILE *fp) /* I - File */ { if (ch == '&') fputs("&", fp); else if (ch == '<') fputs("<", fp); else putc(ch, fp); } /* * 'strmove()' - Move characters within a string. */ static void strmove(char *d, /* I - Destination */ const char *s) /* I - Source */ { while (*s) *d++ = *s++; *d = '\0'; } cups-2.3.1/man/cups-snmp.conf.5000664 000765 000024 00000005151 13574721672 016313 0ustar00mikestaff000000 000000 .\" .\" snmp.conf man page for CUPS. .\" .\" 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. .\" .TH snmp.conf 5 "CUPS" "26 April 2019" "Apple Inc." .SH NAME snmp.conf \- snmp configuration file for cups (deprecated) .SH DESCRIPTION The .B snmp.conf file configures how the standard CUPS network backends (http, https, ipp, ipps, lpd, snmp, and socket) access printer information using SNMPv1 and is normally located in the \fI/etc/cups\fR directory. Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character. .LP The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend - .BR cups-snmp (8). .SH DIRECTIVES The following directives are understood by the CUPS network backends: .TP 5 \fBAddress @IF(\fIname\fB)\fR .TP 5 \fBAddress @LOCAL\fR .TP 5 \fBAddress \fIaddress\fR Sends SNMP broadcast queries (for discovery) to the specified address(es). There is no default for the broadcast address. .TP 5 \fBCommunity \fIname\fR Specifies the community name to use. Only a single community name may be specified. The default community name is "public". If no name is specified, all SNMP functions are disabled. .TP 5 \fBDebugLevel \fInumber\fR Specifies the logging level from 0 (none) to 3 (everything). Typically only used for debugging (thus the name). The default debug level is 0. .TP 5 \fBDeviceURI "\fIregular expression\fB" \fIdevice-uri \fR[... \fIdevice-uri\fR] Specifies one or more device URIs that should be used for a given make and model string. The regular expression is used to match the detected make and model, and the device URI strings must be of the form "scheme://%s[:port]/[path]", where "%s" represents the detected address or hostname. There are no default device URI matching rules. .TP 5 \fBHostNameLookups on\fR .TP 5 \fBHostNameLookups off\fR Specifies whether the addresses of printers should be converted to hostnames or left as numeric IP addresses. The default is "off". .TP 5 \fBMaxRunTime \fIseconds\fR Specifies the maximum number of seconds that the SNMP backend will scan the network for printers. The default is 120 seconds (2 minutes). .SH NOTES CUPS backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR cups-snmp (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ippevepcl.7000664 000765 000024 00000003057 13574721672 015436 0ustar00mikestaff000000 000000 .\" .\" ippevepcl/ps man page for CUPS. .\" .\" Copyright © 2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH ippevepcl/ps 7 "CUPS" "24 April 2019" "Apple Inc." .SH NAME ippevepcl/ps \- pcl and postscript print commands for ippeveprinter .SH SYNOPSIS .B ippevepcl [ .I filename ] .br .B ippeveps [ .I filename ] .SH DESCRIPTION .B ippevepcl and .B ippeveps are print commands for .BR ippeveprinter (1). As with all print commands, these commands read either the filename specified on the command-line or from the standard input. Output is sent to the standard output. Status and progress messages are sent to the standard error. .PP .B ippevepcl prints to B&W HP PCL laser printers and supports printing of HP PCL (application/vnd.hp-pcl), PWG Raster (image/pwg-raster), and Apple Raster (image/urf) print files. .PP .B ippeveps print to Adobe PostScript printers and supports printing of PDF (application/pdf), PostScript (application/postscript), JPEG (image/jpeg), PWG Raster (image/pwg-raster), and Apple Raster (image/urf) print files. Printer-specific commands are read from a supplied PPD file. If no PPD file is specified, generic commands suitable for any Level 2 or Level 3 PostScript printer are used instead to specify duplex printing and media size. .SH EXIT STATUS These programs return 1 on error and 0 on success. .SH ENVIRONMENT These program inherit the environment provided by the .B ippeveprinter program. .SH SEE ALSO .BR ippeveprinter (8) .SH COPYRIGHT Copyright \[co] 2019 by Apple Inc. cups-2.3.1/man/cups-config.1000664 000765 000024 00000004767 13574721672 015667 0ustar00mikestaff000000 000000 .\" .\" cups-config man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cups-config 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cups\-config \- get cups api, compiler, directory, and link information. .SH SYNOPSIS .B cups\-config .I \-\-api\-version .br .B cups\-config .I \-\-build .br .B cups\-config .I \-\-cflags .br .B cups\-config .I \-\-datadir .br .B cups\-config .I \-\-help .br .B cups\-config .I \-\-ldflags .br .B cups\-config [ .I \-\-image ] [ .I \-\-static ] .I \-\-libs .br .B cups\-config .I \-\-serverbin .br .B cups\-config .I \-\-serverroot .br .B cups-config .I \-\-version .br .SH DESCRIPTION The \fBcups-config\fR command allows application developers to determine the necessary command-line options for the compiler and linker, as well as the installation directories for filters, configuration files, and drivers. All values are reported to the standard output. .SH OPTIONS The \fBcups-config\fR command accepts the following command-line options: .TP 5 .B \-\-api-version Reports the current API version (major.minor). .TP 5 .B \-\-build Reports a system-specific build number. .TP 5 .B \-\-cflags Reports the necessary compiler options. .TP 5 .B \-\-datadir Reports the default CUPS data directory. .TP 5 .B \-\-help Reports the program usage message. .TP 5 .B \-\-ldflags Reports the necessary linker options. .TP 5 .B \-\-libs Reports the necessary libraries to link to. .TP 5 .B \-\-serverbin Reports the default CUPS binary directory, where filters and backends are stored. .TP 5 .B \-\-serverroot Reports the default CUPS configuration file directory. .TP 5 .B \-\-static When used with \fI\-\-libs\fR, reports the static libraries instead of the default (shared) libraries. .TP 5 .B \-\-version Reports the full version number of the CUPS installation (major.minor.patch). .SH EXAMPLES Show the currently installed version of CUPS: .nf cups-config \-\-version .fi Compile a simple one-file CUPS filter: .nf cc `cups\-config \-\-cflags \-\-ldflags` \-o filter filter.c \\ `cups\-config \-\-libs` .fi .SH DEPRECATED OPTIONS The following options are deprecated but continue to work for backwards compatibility: .TP 5 .B \-\-image Formerly used to add the CUPS imaging library to the list of libraries. .SH SEE ALSO .BR cups (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsenable.8000664 000765 000024 00000004574 13574721672 015576 0ustar00mikestaff000000 000000 .\" .\" cupsenable/cupsdisable man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsenable 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsdisable, cupsenable \- stop/start printers and classes .SH SYNOPSIS .B cupsdisable [ .B \-E ] [ .B \-U .I username ] [ .B \-c ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-r .I reason ] [ .B \-\-hold ] .I destination(s) .br .B cupsenable [ .B \-E ] [ .B \-U .I username ] [ .B \-c ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-\-release ] .I destination(s) .SH DESCRIPTION .B cupsenable starts the named printers or classes while .B cupsdisable stops the named printers or classes. .SH OPTIONS The following options may be used: .TP 5 .B \-E Forces encryption of the connection to the server. .TP 5 \fB\-U \fIusername\fR Uses the specified username when connecting to the server. .TP 5 .B \-c Cancels all jobs on the named destination. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Uses the specified server and port. .TP 5 .B \-\-hold Holds remaining jobs on the named printer. Useful for allowing the current job to complete before performing maintenance. .TP 5 \fB\-r "\fIreason\fB"\fR Sets the message associated with the stopped state. If no reason is specified then the message is set to "Reason Unknown". .TP 5 .B \-\-release Releases pending jobs for printing. Use after running \fBcupsdisable\fR with the \fI\-\-hold\fR option to resume printing. .SH CONFORMING TO Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive. .LP The System V versions of these commands are \fBdisable\fR and \fBenable\fR, respectively. They have been renamed to avoid conflicts with the .BR bash (1) build-in commands of the same names. .LP The CUPS versions of \fBdisable\fR and \fBenable\fR may ask the user for an access password depending on the printing system configuration. This differs from the System V versions which require the root user to execute these commands. .SH SEE ALSO .BR cupsaccept (8), .BR cupsreject (8), .BR cancel (1), .BR lp (1), .BR lpadmin (8), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ippfind.1000664 000765 000024 00000015613 13574721672 015073 0ustar00mikestaff000000 000000 .\" .\" ippfind man page. .\" .\" Copyright © 2013-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH ippfind 1 "ippsample" "26 April 2019" "Apple Inc." .SH NAME ippfind \- find internet printing protocol printers .SH SYNOPSIS .B ippfind [ .I options ] \fIregtype\fR[\fB,\fIsubtype\fR][\fB.\fIdomain\fB.\fR] ... [ .I expression ... ] .br .B ippfind [ .I options ] \fIname\fR[\fB.\fIregtype\fR[\fB.\fIdomain\fB.\fR]] ... [ .I expression ... ] .br .B ippfind .B \-\-help .br .B ippfind .B \-\-version .SH DESCRIPTION \fBippfind\fR finds services registered with a DNS server or available through local devices. Its primary purpose is to find IPP printers and show their URIs, show their current status, or run commands. .SS REGISTRATION TYPES \fBippfind\fR supports the following registration types: .TP 5 _http._tcp HyperText Transport Protocol (HTTP, RFC 2616) .TP 5 _https._tcp Secure HyperText Transport Protocol (HTTPS, RFC 2818) .TP 5 _ipp._tcp Internet Printing Protocol (IPP, RFC 2911) .TP 5 _ipps._tcp Secure Internet Printing Protocol (IPPS, draft) .TP 5 _printer._tcp Line Printer Daemon (LPD, RFC 1179) .SS EXPRESSIONS \fBippfind\fR supports expressions much like the .BR find (1) utility. However, unlike .BR find (1), \fBippfind\fR uses POSIX regular expressions instead of shell filename matching patterns. If \fI\-\-exec\fR, \fI\-l\fR, \fI\-\-ls\fR, \fI\-p\fR, \fI\-\-print\fR, \fI\-\-print\-name\fR, \fI\-q\fR, \fI\-\-quiet\fR, \fI\-s\fR, or \fI\-x\fR is not specified, \fBippfind\fR adds \fI\-\-print\fR to print the service URI of anything it finds. The following expressions are supported: .TP 5 \fB\-d \fIregex\fR .TP 5 \fB\-\-domain \fIregex\fR True if the domain matches the given regular expression. .TP 5 .B \-\-false Always false. .TP 5 \fB\-h \fIregex\fR .TP 5 \fB\-\-host \fIregex\fR True is the hostname matches the given regular expression. .TP 5 .B \-l .TP 5 .B \-\-ls Lists attributes returned by Get-Printer-Attributes for IPP printers and traditional \fIfind\fR "-ls" output for HTTP URLs. The result is true if the URI is accessible, false otherwise. .TP 5 .B \-\-local True if the service is local to this computer. .TP 5 \fB\-N \fIname\fR .TP 5 \fB\-\-literal\-name \fIname\fR True if the service instance name matches the given name. .TP 5 \fB\-n \fIregex\fR .TP 5 \fB\-\-name \fIregex\fR True if the service instance name matches the given regular expression. .TP 5 \fB\-\-path \fIregex\fR True if the URI resource path matches the given regular expression. .TP 5 \fB\-P \fInumber\fR[\fB-\fInumber\fR] .TP 5 \fB\-\-port \fInumber\fR[\fB-\fInumber\fR] True if the port matches the given number or range. .TP 5 .B \-p .TP 5 .B \-\-print Prints the URI if the result of previous expressions is true. The result is always true. .TP 5 .B \-q .TP 5 .B \-\-quiet Quiet mode - just returns the exit codes below. .TP 5 .B \-r .TP 5 .B \-\-remote True if the service is not local to this computer. .TP 5 .B \-s .TP 5 .B \-\-print\-name Prints the service instance name if the result of previous expressions is true. The result is always true. .TP 5 .B \-\-true Always true. .TP 5 \fB\-t \fIkey\fR .TP 5 \fB\-\-txt \fIkey\fR True if the TXT record contains the named key. .TP 5 \fB\-\-txt\-\fIkey regex\fR True if the TXT record contains the named key and matches the given regular expression. .TP 5 \fB\-u \fIregex\fR .TP 5 \fB\-\-uri \fIregex\fR True if the URI matches the given regular expression. .TP 5 \fB\-x \fIutility \fR[ \fIargument \fR... ] \fB;\fR .TP 5 \fB\-\-exec \fIutility \fR[ \fIargument \fR... ] \fB;\fR Executes the specified program if the current result is true. "{foo}" arguments are replaced with the corresponding value - see SUBSTITUTIONS below. .PP Expressions may also contain modifiers: .TP 5 \fB( \fIexpression \fB)\fR Group the result of expressions. .TP 5 \fB! \fIexpression\fR .TP 5 \fB\-\-not \fIexpression\fR Unary NOT of the expression. .TP 5 \fIexpression expression\fR .TP 5 \fIexpression \fB\-\-and \fIexpression\fR Logical AND of expressions. .TP 5 \fIexpression \fB\-\-or \fIexpression\fR Logical OR of expressions. .SS SUBSTITUTIONS The substitutions for "{foo}" in \fI\-e\fR and \fI\-\-exec\fR are: .TP 5 .B {service_domain} Domain name, e.g., "example.com.", "local.", etc. .TP 5 .B {service_hostname} Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc. .TP 5 .B {service_name} Service instance name, e.g., "My Fine Printer". .TP 5 .B {service_port} Port number for server, typically 631 for IPP and 80 for HTTP. .TP 5 .B {service_regtype} DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc. .TP 5 .B {service_scheme} URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc. .TP 5 .B {} .TP 5 .B {service_uri} URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc. .TP 5 \fB{txt_\fIkey\fB}\fR Value of TXT record \fIkey\fR (lowercase). .SH OPTIONS \fBippfind\fR supports the following options: .TP 5 .B \-\-help Show program help. .TP 5 .B \-\-version Show program version. .TP 5 .B \-4 Use IPv4 when listing. .TP 5 .B \-6 Use IPv6 when listing. .TP 5 \fB\-T \fIseconds\fR Specify find timeout in seconds. If 1 or less, \fBippfind\fR stops as soon as it thinks it has found everything. The default timeout is 1 second. .TP 5 \fB\-V \fIversion\fR Specifies the IPP version when listing. Supported values are "1.1", "2.0", "2.1", and "2.2". .SH EXIT STATUS \fBippfind\fR returns 0 if the result for all processed expressions is true, 1 if the result of any processed expression is false, 2 if browsing or any query or resolution failed, 3 if an undefined option or invalid expression was specified, and 4 if it ran out of memory. .SH ENVIRONMENT When executing a program, \fBippfind\fR sets the following environment variables for the matching service registration: .TP 5 .B IPPFIND_SERVICE_DOMAIN Domain name, e.g., "example.com.", "local.", etc. .TP 5 .B IPPFIND_SERVICE_HOSTNAME Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc. .TP 5 .B IPPFIND_SERVICE_NAME Service instance name, e.g., "My Fine Printer". .TP 5 .B IPPFIND_SERVICE_PORT Port number for server, typically 631 for IPP and 80 for HTTP. .TP 5 .B IPPFIND_SERVICE_REGTYPE DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc. .TP 5 .B IPPFIND_SERVICE_SCHEME URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc. .TP 5 .B IPPFIND_SERVICE_URI URI for service, e.g., "ipp://printer.local./ipp/print", "http://printer.local./", etc. .TP 5 .B IPPFIND_TXT_\fIKEY\fR Values of TXT record \fIKEY\fR (uppercase). .SH EXAMPLES To show the status of all registered IPP printers on your network, run: .nf ippfind \-\-ls .fi Similarly, to send a PostScript test page to every PostScript printer, run: .nf ippfind \-\-txt\-pdl application/postscript \-\-exec ipptool \-f onepage\-letter.ps '{}' print\-job.test \\; .fi .SH SEE ALSO .BR ipptool (1) .SH COPYRIGHT Copyright \[co] 2013-2019 by Apple Inc. cups-2.3.1/man/lpinfo.8000664 000765 000024 00000005527 13574721672 014743 0ustar00mikestaff000000 000000 .\" .\" lpinfo man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpinfo 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpinfo \- show available devices or drivers (deprecated) .SH SYNOPSIS .B lpinfo [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-l ] [ .B \-\-device\-id .I device-id-string ] [ .B \-\-exclude\-schemes .I scheme-list ] [ .B \-\-include\-schemes .I scheme-list ] [ .B \-\-language .I locale ] [ .B \-\-make\-and\-model .I name ] [ .B \-\-product .I name ] .B \-m .br .B lpinfo [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-l ] [ .B \-\-exclude\-schemes .I scheme-list ] [ .B \-\-include\-schemes .I scheme-list ] [ .B \-\-timeout .I seconds ] .B \-v .SH DESCRIPTION \fBlpinfo\fR lists the available devices or drivers known to the CUPS server. The first form (\fI-m\fR) lists the available drivers, while the second form (\fI-v\fR) lists the available devices. .SH OPTIONS \fBlpinfo\fR accepts the following options: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Selects an alternate server. .TP 5 .B \-l Shows a "long" listing of devices or drivers. .TP 5 \fB\-\-device\-id \fIdevice-id-string\fR Specifies the IEEE-1284 device ID to match when listing drivers with the \fI\-m\fR option. .TP 5 \fB\-\-exclude\-schemes \fIscheme-list\fR Specifies a comma-delimited list of device or PPD schemes that should be excluded from the results. Static PPD files use the "file" scheme. .TP 5 \fB\-\-include\-schemes \fIscheme-list\fR Specifies a comma-delimited list of device or PPD schemes that should be included in the results. Static PPD files use the "file" scheme. .TP 5 \fB\-\-language \fIlocale\fR Specifies the language to match when listing drivers with the \fI\-m\fR option. .TP 5 \fB\-\-make\-and\-model \fIname\fR Specifies the make and model to match when listing drivers with the \fI\-m\fR option. .TP 5 \fB\-\-product \fIname\fR Specifies the product to match when listing drivers with the \fI\-m\fR option. .TP 5 \fB\-\-timeout \fIseconds\fR Specifies the timeout when listing devices with the \fI\-v\fR option. .SH CONFORMING TO The \fIlpinfo\fR command is unique to CUPS. .SH EXAMPLES List all devices: .nf lpinfo \-v .fi List all drivers: .nf lpinfo \-m .fi List drivers matching "HP LaserJet": .nf lpinfo \-\-make\-and\-model "HP LaserJet" \-m .fi .SH NOTES CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR lpadmin (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpoptions.1000664 000765 000024 00000006171 13574721672 015470 0ustar00mikestaff000000 000000 .\" .\" lpoptions man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpoptions 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpoptions \- display or set printer options and defaults .SH SYNOPSIS .B lpoptions [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] \fB\-d \fIdestination\fR[\fB/\fIinstance\fR] [ .B \-l ] .br .B lpoptions [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ \fB\-p \fIdestination\fR[\fB/\fIinstance\fR] ] \fB\-o \fIoption\fR[\fB=\fIvalue\fR] ... .br .B lpoptions [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ \fB\-p \fIdestination\fR[\fB/\fIinstance\fR] ] .B \-r .I option .br .B lpoptions [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] \fB\-x \fIdestination\fR[\fB/\fIinstance\fR] .SH DESCRIPTION \fBlpoptions\fR displays or sets printer options and defaults. If no printer is specified using the \fI\-p\fR option, the default printer is used as described in .BR lp (1). .LP If no \fI\-l\fR, \fI\-o\fR, or \fI\-r\fR options are specified, the current options are reported on the standard output. .LP Options set with the \fBlpoptions\fR command are used by the .BR lp (1) and .BR lpr (1) commands when submitting jobs. .LP When run by the root user, \fBlpoptions\fR gets and sets default options and instances for all users in the \fI/etc/cups/lpoptions\fR file. Otherwise, the per-user defaults are managed in the \fI~/.cups/lpoptions\fR file. .SH OPTIONS \fBlpoptions\fR supports the following options: .TP 5 .B \-E Enables encryption when communicating with the CUPS server. .TP 5 \fB\-d \fIdestination\fR[\fB/\fIinstance\fR] Sets the user default printer to \fIdestination\fR. If \fIinstance\fR is supplied then that particular instance is used. This option overrides the system default printer for the current user. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Uses an alternate server. .TP 5 .B \-l Lists the printer specific options and their current settings. .TP 5 \fB\-o \fIoption\fR[\fB=\fIvalue\fR] Specifies a new option for the named destination. .TP 5 \fB\-p \fIdestination\fR[\fB/\fIinstance\fR] Sets the destination and instance, if specified, for any options that follow. If the named instance does not exist then it is created. Destinations can only be created using the .BR lpadmin (8) program. .TP 5 \fB\-r \fIoption\fR Removes the specified option from the named destination. .TP 5 \fB\-x \fIdestination\fR[\fB/\fIinstance\fR] Removes the options for the named destination and instance, if specified. If the named instance does not exist then this does nothing. Destinations can only be removed using the .BR lpadmin (8) command. .SH FILES \fI~/.cups/lpoptions\fR - user defaults and instances created by non-root users. .br \fI/etc/cups/lpoptions\fR - system-wide defaults and instances created by the root user. .SH CONFORMING TO The \fBlpoptions\fR command is unique to CUPS. .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpadmin (8), .BR lpr (1), .BR lprm (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ppdhtml.1000664 000765 000024 00000002677 13574721672 015120 0ustar00mikestaff000000 000000 .\" .\" ppdhtml man page for CUPS. .\" .\" 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 .\" information. .\" .TH ppdhtml 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME ppdhtml \- cups html summary generator (deprecated) .SH SYNOPSIS .B ppdhtml [ \fB\-D \fIname\fR[\fB=\fIvalue\fR] ] [ .B \-I .I include-directory ] .I source-file .SH DESCRIPTION \fBppdhtml\fR reads a driver information file and produces a HTML summary page that lists all of the drivers in a file and the supported options. \fBThis program is deprecated and will be removed in a future release of CUPS.\fR .SH OPTIONS \fBppdhtml\fR supports the following options: .TP 5 \fB\-D \fIname\fR[\fB=\fIvalue\fR] Sets the named variable for use in the source file. It is equivalent to using the \fI#define\fR directive in the source file. .TP 5 \fB\-I \fIinclude-directory\fR Specifies an alternate include directory. Multiple \fI-I\fR options can be supplied to add additional directories. .SH NOTES PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .SH SEE ALSO .BR ppdc (1), .BR ppdcfile (5), .BR ppdi (1), .BR ppdmerge (1), .BR ppdpo (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cupsctl.8000664 000765 000024 00000004344 13574721672 015125 0ustar00mikestaff000000 000000 .\" .\" cupsctl man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cupsctl 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cupsctl \- configure cupsd.conf options .SH SYNOPSIS .B cupsctl [ .B \-E ] [ .B \-U .I username ] [ .B \-h \fIserver\fR[\fB:\fIport\fR] ] [ \fB\-\-\fR[\fBno\-\fR]\fBdebug\-logging\fR ] [ \fB\-\-\fR[\fBno\-\fR]\fBremote\-admin\fR ] [ \fB\-\-\fR[\fBno\-\fR]\fBremote\-any\fR ] [ \fB\-\-\fR[\fBno\-\fR]\fBshare\-printers\fR ] [ \fB\-\-\fR[\fBno\-\fR]\fBuser\-cancel\-any\fR ] [ .I name=value ] .SH DESCRIPTION \fBcupsctl\fR updates or queries the \fIcupsd.conf\fR file for a server. When no changes are requested, the current configuration values are written to the standard output in the format "name=value", one per line. .SH OPTIONS The following options are recognized: .TP 5 .B \-E Enables encryption on the connection to the scheduler. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username to use when authenticating with the scheduler. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Specifies the server address. .TP 5 \fB\-\-\fR[\fBno\-\fR]\fBdebug\-logging\fR Enables (disables) debug logging to the \fIerror_log\fR file. .TP 5 \fB\-\-\fR[\fBno\-\fR]\fBremote\-admin\fR Enables (disables) remote administration. .TP 5 \fB\-\-\fR[\fBno\-\fR]\fBremote\-any\fR Enables (disables) printing from any address, e.g., the Internet. .TP 5 \fB\-\-\fR[\fBno\-\fR]\fBshare\-printers\fR Enables (disables) sharing of local printers with other computers. .TP 5 \fB\-\-\fR[\fBno\-\fR]\fBuser\-cancel\-any\fR Allows (prevents) users to cancel jobs owned by others. .SH EXAMPLES Display the current settings: .nf cupsctl .fi Enable debug logging: .nf cupsctl --debug-logging .fi Get the current debug logging state: .nf cupsctl | grep '^_debug_logging' | awk -F= '{print $2}' .fi Disable printer sharing: .nf cupsctl --no-share-printers .fi .SH KNOWN ISSUES You cannot set the Listen or Port directives using \fBcupsctl\fR. .SH SEE ALSO .BR cupsd.conf (5), .BR cupsd (8), .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/ippeveprinter.1000664 000765 000024 00000020147 13574721672 016334 0ustar00mikestaff000000 000000 .\" .\" ippeveprinter man page for CUPS. .\" .\" Copyright © 2014-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH ippeveprinter 1 "CUPS" "2 December 2019" "Apple Inc." .SH NAME ippeveprinter \- an ipp everywhere printer application for cups .SH SYNOPSIS .B ippeveprinter [ .B \-\-help ] [ .B \-\-no\-web\-forms ] [ .B \-\-pam\-service .I service ] [ .B \-\-version ] [ .B \-2 ] [ .B \-A ] [ .B \-D .I device-uri ] [ .B \-F .I output-type/subtype ] [ .B \-K .I keypath ] [ .B \-M .I manufacturer ] [ .B \-P .I filename.ppd ] [ .B \-V .I ipp-version ] [ .B \-a .I filename.conf ] [ .B \-c .I command ] [ .B \-d .I spool-directory ] [ .B \-f .I type/subtype[,...] ] [ .B \-i .I iconfile.png ] [ .B \-k ] [ .B \-l .I location ] [ .B \-m .I model ] [ .B \-n .I hostname ] [ .B \-p .I port ] [ .B \-r .I subtype[,subtype] ] [ .B \-s .I speed[,color-speed] ] [ .B \-v[vvv] ] .I service-name .SH DESCRIPTION .B ippeveprinter is a simple Internet Printing Protocol (IPP) server conforming to the IPP Everywhere (PWG 5100.14) specification. It can be used to test client software or act as a very basic print server that runs a command for every job that is printed. .SH OPTIONS The following options are recognized by .B ippeveprinter: .TP 5 .B \-\-help Show program usage. .TP 5 .B \-\-no\-web\-forms Disable the web interface forms used to update the media and supply levels. .TP 5 \fB\-\-pam\-service \fIservice\fR Set the PAM service name. The default service is "cups". .TP 5 .B \-\-version Show the CUPS version. .TP 5 .B \-2 Report support for two-sided (duplex) printing. .TP 5 .B \-A Enable authentication for the created printer. .B ippeveprinter uses PAM to authenticate HTTP Basic credentials. .TP 5 \fB\-D \fIdevice-uri\fR Set the device URI for print output. The URI can be a filename, directory, or a network socket URI of the form "socket://ADDRESS[:PORT]" (where the default port number is 9100). When specifying a directory, .B ippeveprinter will create an output file using the job ID and name. .TP 5 \fB\-F \fIoutput-type/subtype[,...]\fR Specifies the output MIME media type. The default is "application/postscript" when the \fB\-P\fR option is specified. .TP 5 \fB\-M \fImanufacturer\fR Set the manufacturer of the printer. The default is "Example". .TP 5 \fB\-P \fIfilename.ppd\fR Load printer attributes from the specified PPD file. This option is typically used in conjunction with the .BR ippeveps (7) printer command ("\-c ippeveps"). .TP 5 \fB\-V 1.1\fR .TP 5 \fB\-V 2.0\fR Specifies the maximum IPP version to report. 2.0 is the default. .TP 5 \fB\-c \fIcommand\fR Run the specified command for each document that is printed. If "command" is not an absolute path ("/path/to/command"), .B ippeveprinter looks for the command in the "command" subdirectory of the CUPS binary directory, typically /usr/lib/cups/command or /usr/libexec/cups/command. The .BR cups-config (1) command can be used to discover the correct binary directory ("cups-config --serverbin"). In addition, the CUPS_SERVERBIN environment variable can be used to override the default location of this directory - see the .BR cups (1) man page for more details. .TP 5 \fB\-d \fIspool-directory\fR Specifies the directory that will hold the print files. The default is a directory under the user's current temporary directory. .TP 5 \fB\-f \fItype/subtype[,...]\fR Specifies a list of MIME media types that the server will accept. The default depends on the type of printer created. .TP 5 \fB\-i \fIiconfile.png\fR Specifies the printer icon file for the server. The file must be a PNG format image. The default is an internally-provided PNG image. .TP 5 .B \-k Keeps the print documents in the spool directory rather than deleting them. .TP 5 \fB\-l \fIlocation\fR Specifies the human-readable location string that is reported by the server. The default is the empty string. .TP 5 \fB\-m \fImodel\fR Specifies the model name of the printer. The default is "Printer". .TP 5 \fB\-n \fIhostname\fR Specifies the hostname that is reported by the server. The default is the name returned by the .BR hostname (1) command. .TP 5 \fB\-p \fIport\fR Specifies the port number to listen on. The default is a user-specific number from 8000 to 8999. .TP 5 .B \-r off Turns off DNS-SD service advertisements entirely. .TP 5 \fB\-r \fIsubtype[,subtype]\fR Specifies the DNS-SD subtype(s) to advertise. Separate multiple subtypes with a comma. The default is "_print". .TP 5 \fB\-s \fIspeed[,color-speed]\fR Specifies the printer speed in pages per minute. If two numbers are specified and the second number is greater than zero, the server will report support for color printing. The default is "10,0". .TP 5 .B \-v[vvv] Be (very) verbose when logging activity to standard error. .SH EXIT STATUS The .B ippeveprinter program returns 1 if it is unable to process the command-line arguments or register the IPP service. Otherwise .B ippeveprinter will run continuously until terminated. .SH CONFORMING TO The .B ippeveprinter program is unique to CUPS and conforms to the IPP Everywhere (PWG 5100.14) specification. .SH ENVIRONMENT .B ippeveprinter adds environment variables starting with "IPP_" for all IPP Job attributes in the print request. For example, when executing a command for an IPP Job containing the "media" Job Template attribute, the "IPP_MEDIA" environment variable will be set to the value of that attribute. .LP In addition, all IPP "xxx-default" and "pwg-xxx" Printer Description attributes are added to the environment. For example, the "IPP_MEDIA_DEFAULT" environment variable will be set to the default value for the "media" Job Template attribute. .LP Enumerated values are converted to their keyword equivalents. For example, a "print-quality" Job Template attribute with a enum value of 3 will become the "IPP_PRINT_QUALITY" environment variable with a value of "draft". This string conversion only happens for standard Job Template attributes, currently "finishings", "orientation-requested", and "print-quality". .LP Finally, the "CONTENT_TYPE" environment variable contains the MIME media type of the document being printed, the "DEVICE_URI" environment variable contains the device URI as specified with the "\-D" option, the "OUTPUT_FORMAT" environment variable contains the output MIME media type, and the "PPD" environment variable contains the PPD filename as specified with the "\-P" option. .SH COMMAND OUTPUT Unless they communicate directly with a printer, print commands send printer-ready data to the standard output. .LP Print commands can send messages back to .B ippeveprinter on the standard error with one of the following prefixes: .TP 5 \fBATTR: \fIattribute=value[ attribute=value]\fR Sets the named attribute(s) to the given values. Currently only the "job-impressions" and "job-impressions-completed" Job Status attributes and the "marker-xxx", "printer-alert", "printer-alert-description", "printer-supply", and "printer-supply-description" Printer Status attributes can be set. .TP 5 \fBDEBUG: \fIDebugging message\fR Logs a debugging message if at least two \-v's have been specified. .TP 5 \fBERROR: \fIError message\fR Logs an error message and copies the message to the "job-state-message" attribute. .TP 5 \fBINFO: \fIInformational message\fR Logs an informational/progress message if \-v has been specified and copies the message to the "job-state-message" attribute unless an error has been reported. .TP 5 \fBSTATE: \fIkeyword[,keyword,...]\fR Sets the printer's "printer-state-reasons" attribute to the listed keywords. .TP 5 \fBSTATE: -\fIkeyword[,keyword,...]\fR Removes the listed keywords from the printer's "printer-state-reasons" attribute. .TP 5 \fBSTATE: +\fIkeyword[,keyword,...]\fR Adds the listed keywords to the printer's "printer-state-reasons" attribute. .SH EXAMPLES Run .B ippeveprinter with a service name of My Cool Printer: .nf ippeveprinter "My Cool Printer" .fi .LP Run the .BR file (1) command whenever a job is sent to the server: .nf ippeveprinter \-c /usr/bin/file "My Cool Printer" .fi .SH SEE ALSO .BR ippevepcl (7), .BR ippeveps (7), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/cups-lpd.8000664 000765 000024 00000010000 13574721672 015161 0ustar00mikestaff000000 000000 .\" .\" cups-lpd man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH cups-lpd 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME cups-lpd \- receive print jobs and report printer status to lpd clients (deprecated) .SH SYNOPSIS .B cups-lpd [ \fB\-h \fIhostname\fR[\fB:\fIport\fR] ] [ .B -n ] [ .B -o .I option=value ] .SH DESCRIPTION .B cups-lpd is the CUPS Line Printer Daemon ("LPD") mini-server that supports legacy client systems that use the LPD protocol. .B cups-lpd does not act as a standalone network daemon but instead operates using any of the Internet "super-servers" such as .BR inetd (8), .BR launchd (8), and .BR systemd (8). .SH OPTIONS .TP 5 \fB-h \fIhostname\fR[\fB:\fIport\fR] Sets the CUPS server (and port) to use. .TP 5 .B -n Disables reverse address lookups; normally .B cups-lpd will try to discover the hostname of the client via a reverse DNS lookup. .TP 5 \fB-o \fIname=value\fR Inserts options for all print queues. Most often this is used to disable the "l" filter so that remote print jobs are filtered as needed for printing; the .BR inetd (8) example below sets the "document-format" option to "application/octet-stream" which forces autodetection of the print file format. .SH CONFORMING TO .B cups-lpd does not enforce the restricted source port number specified in RFC 1179, as using restricted ports does not prevent users from submitting print jobs. While this behavior is different than standard Berkeley LPD implementations, it should not affect normal client operations. .LP The output of the status requests follows RFC 2569, Mapping between LPD and IPP Protocols. Since many LPD implementations stray from this definition, remote status reporting to LPD clients may be unreliable. .SH ERRORS Errors are sent to the system log. .SH FILES .nf .I /etc/inetd.conf .I /etc/xinetd.d/cups-lpd .I /System/Library/LaunchDaemons/org.cups.cups-lpd.plist .fi .SH NOTES The .B cups-lpd program is deprecated and will no longer be supported in a future feature release of CUPS. .SS PERFORMANCE .B cups-lpd performs well with small numbers of clients and printers. However, since a new process is created for each connection and since each process must query the printing system before each job submission, it does not scale to larger configurations. We highly recommend that large configurations use the native IPP support provided by CUPS instead. .SS SECURITY .B cups-lpd currently does not perform any access control based on the settings in \fIcupsd.conf(5)\fR or in the \fIhosts.allow(5)\fR or \fIhosts.deny(5)\fR files used by TCP wrappers. Therefore, running .B cups-lpd on your server will allow any computer on your network (and perhaps the entire Internet) to print to your server. .LP While .BR xinetd (8) has built-in access control support, you should use the TCP wrappers package with .BR inetd (8) to limit access to only those computers that should be able to print through your server. .LP .B cups-lpd is not enabled by the standard CUPS distribution. Please consult with your operating system vendor to determine whether it is enabled by default on your system. .SH EXAMPLE If you are using .BR inetd (8), add the following line to the \fIinetd.conf\fR file to enable the .B cups-lpd mini-server: .nf printer stream tcp nowait lp /usr/lib/cups/daemon/cups\-lpd cups\-lpd \\ \-o document\-format=application/octet\-stream .fi .LP \fINote:\fR If you are using Solaris 10 or higher, you must run the .BR inetdconv (1m) program to register the changes to the \fIinetd.conf\fR file. .LP CUPS includes configuration files for .BR launchd (8), .BR systemd (8), and .BR xinetd (8). Simply enable the .B cups-lpd service using the corresponding control program. .SH SEE ALSO .BR cups (1), .BR cupsd (8), .BR inetconv (1m), .BR inetd (8), .BR launchd (8), .BR xinetd (8), CUPS Online Help (http://localhost:631/help), RFC 2569 .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpmove.8000664 000765 000024 00000002642 13574721672 014751 0ustar00mikestaff000000 000000 .\" .\" lpmove man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpmove 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpmove \- move a job or all jobs to a new destination .SH SYNOPSIS .B lpmove [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-U .I username ] .I job .I destination .br .B lpmove [ .B \-E ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] [ .B \-U .I username ] .I source .I destination .SH DESCRIPTION \fBlpmove\fR moves the specified \fIjob\fR or all jobs from \fIsource\fR to \fIdestination\fR. \fIjob\fR can be the job ID number or the old destination and job ID. .SH OPTIONS The \fBlpmove\fR command supports the following options: .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-U \fIusername\fR Specifies an alternate username. .TP 5 \fB\-h \fIserver\fR[\fB:\fIport\fR] Specifies an alternate server. .SH EXAMPLES Move job 123 from "oldprinter" to "newprinter": .nf lpmove 123 newprinter \fIor\fR lpmove oldprinter-123 newprinter .fi Move all jobs from "oldprinter" to "newprinter": .nf lpmove oldprinter newprinter .fi .SH SEE ALSO .BR cancel (1), .BR lp (1), .BR lpr (1), .BR lprm (1), .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lp.1000664 000765 000024 00000013305 13574721672 014051 0ustar00mikestaff000000 000000 .\" .\" lp man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lp 1 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lp \- print files .SH SYNOPSIS .B lp [ .B \-E ] [ .B \-U .I username ] [ .B \-c ] [ \fB\-d \fIdestination\fR[\fB/\fIinstance\fR] ] [ \fB\-h \fIhostname\fR[\fB:\fIport\fR] ] [ .B \-m ] [ .B \-n .I num-copies ] [ \fB\-o \fIoption\fR[\fB=\fIvalue\fR] ] [ .B \-q .I priority ] [ .B \-s ] [ .B \-t .I title ] [ .B \-H .I handling ] [ .B \-P .I page-list ] [ .B \-\- ] [ .I file(s) ] .br .B lp [ .B \-E ] [ .B \-U .I username ] [ .B \-c ] [ \fB\-h \fIhostname\fR[\fB:\fIport\fR] ] [ .B \-i .I job-id ] [ .B \-n .I num-copies ] [ \fB\-o \fIoption\fR[\fB=\fIvalue\fR] ] [ .B \-q .I priority ] [ .B \-t .I title ] [ .B \-H .I handling ] [ .B \-P .I page-list ] .SH DESCRIPTION \fBlp\fR submits files for printing or alters a pending job. Use a filename of "-" to force printing from the standard input. .SS THE DEFAULT DESTINATION CUPS provides many ways to set the default destination. The \fBLPDEST\fR and \fBPRINTER\fR environment variables are consulted first. If neither are set, the current default set using the .BR lpoptions (1) command is used, followed by the default set using the .BR lpadmin (8) command. .SH OPTIONS The following options are recognized by \fIlp\fR: .TP 5 .B \-\- Marks the end of options; use this to print a file whose name begins with a dash (\-). .TP 5 .B \-E Forces encryption when connecting to the server. .TP 5 \fB\-U \fIusername\fR Specifies the username to use when connecting to the server. .TP 5 .B \-c This option is provided for backwards-compatibility only. On systems that support it, this option forces the print file to be copied to the spool directory before printing. In CUPS, print files are always sent to the scheduler via IPP which has the same effect. .TP 5 \fB\-d \fIdestination\fR Prints files to the named printer. .TP 5 \fB\-h \fIhostname\fR[\fB:\fIport\fR] Chooses an alternate server. .TP 5 \fB\-i \fIjob-id\fR Specifies an existing job to modify. .TP 5 .B \-m Sends an email when the job is completed. .TP 5 \fB\-n \fIcopies\fR Sets the number of copies to print. .TP 5 \fB\-o "\fIname\fB=\fIvalue \fR[ ... \fIname\fB=\fIvalue \fR]\fB"\fR Sets one or more job options. See "COMMON JOB OPTIONS" below. .TP 5 \fB\-q \fIpriority\fR Sets the job priority from 1 (lowest) to 100 (highest). The default priority is 50. .TP 5 .B \-s Do not report the resulting job IDs (silent mode.) .TP 5 \fB\-t "\fIname\fB"\fR Sets the job name. .TP 5 \fB\-H \fIhh:mm\fR .TP 5 \fB\-H hold\fR .TP 5 \fB-H immediate\fR .TP 5 \fB-H restart\fR .TP 5 \fB-H resume\fR Specifies when the job should be printed. A value of \fIimmediate\fR will print the file immediately, a value of \fIhold\fR will hold the job indefinitely, and a UTC time value (HH:MM) will hold the job until the specified UTC (not local) time. Use a value of \fIresume\fR with the \fI-i\fR option to resume a held job. Use a value of \fIrestart\fR with the \fI-i\fR option to restart a completed job. .TP 5 \fB\-P \fIpage-list\fR Specifies which pages to print in the document. The list can contain a list of numbers and ranges (#-#) separated by commas, e.g., "1,3-5,16". The page numbers refer to the output pages and not the document's original pages - options like "number-up" can affect the numbering of the pages. .SS COMMON JOB OPTIONS Aside from the printer-specific options reported by the .BR lpoptions (1) command, the following generic options are available: .TP 5 \fB\-o job-sheets=\fIname\fR\fR Prints a cover page (banner) with the document. The "name" can be "classified", "confidential", "secret", "standard", "topsecret", or "unclassified". .TP 5 \fB\-o media=\fIsize\fR Sets the page size to \fIsize\fR. Most printers support at least the size names "a4", "letter", and "legal". .TP 5 \fB\-o number\-up=\fR{\fI2|4|6|9|16\fR} Prints 2, 4, 6, 9, or 16 document (input) pages on each output page. .TP 5 \fB\-o orientation\-requested=4\fR Prints the job in landscape (rotated 90 degrees counter-clockwise). .TP 5 \fB\-o orientation\-requested=5\fR Prints the job in landscape (rotated 90 degrees clockwise). .TP 5 \fB\-o orientation\-requested=6\fR Prints the job in reverse portrait (rotated 180 degrees). .TP 5 \fB\-o print\-quality=3\fR .TP 5 \fB\-o print\-quality=4\fR .TP 5 \fB\-o print\-quality=5\fR Specifies the output quality - draft (3), normal (4), or best (5). .TP 5 \fB\-o sides=one\-sided\fR Prints on one side of the paper. .TP 5 \fB\-o sides=two\-sided\-long\-edge\fR Prints on both sides of the paper for portrait output. .TP 5 \fB\-o sides=two\-sided\-short\-edge\fR Prints on both sides of the paper for landscape output. .SH CONFORMING TO Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive. .LP The \fI-q\fR option accepts a different range of values than the Solaris lp command, matching the IPP job priority values (1-100, 100 is highest priority) instead of the Solaris values (0-39, 0 is highest priority). .SH EXAMPLES Print two copies of a document to the default printer: .nf lp -n 2 filename .fi Print a double-sided legal document to a printer called "foo": .nf lp -d foo -o media=legal -o sides=two-sided-long-edge filename .fi Print a presentation document 2-up to a printer called "bar": .nf lp -d bar -o number-up=2 filename .fi .SH SEE ALSO .BR cancel (1), .BR lpadmin (8), .BR lpoptions (1), .BR lpq (1), .BR lpr (1), .BR lprm (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/filter.7000664 000765 000024 00000023142 13574721672 014731 0ustar00mikestaff000000 000000 .\" .\" filter man page for CUPS. .\" .\" 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 .\" information. .\" .TH filter 7 "CUPS" "26 April 2019" "Apple Inc." .SH NAME filter \- cups file conversion filter interface .SH SYNOPSIS .B filter .I job .I user .I title .I num-copies .I options [ .I filename ] .nf \fB#include \fR \fBssize_t cupsBackChannelRead\fR(\fBchar *\fIbuffer\fR, \fBsize_t \fIbytes\fR, \fBdouble \fItimeout\fR); \fBcups_sc_status_t cupsSideChannelDoRequest\fR(\fBcups_sc_command_t \fIcommand\fR, \fBchar *\fIdata\fR, \fBint *\fIdatalen\fR, \fBdouble \fItimeout\fR); \fB#include \fR \fBconst char *cupsGetOption\fR(\fBconst char *\fIname\fR, \fBint \fInum_options\fR, \fBcups_option_t *\fIoptions\fR); \fBint cupsMarkOptions\fR(\fBppd_file_t *\fIppd\fR, \fBint \fInum_options\fR, \fBcups_option_t *\fIoptions\fR); \fBint cupsParseOptions\fR(\fBconst char *\fIarg\fR, \fBint \fInum_options\fR, \fBcups_option_t **\fIoptions\fR); \fBppd_choice_t *ppdFindMarkedChoice\fR(\fBppd_file_t *\fIppd\fR, \fBconst char *\fIkeyword\fR); \fBvoid ppdMarkDefaults\fR(\fBppd_file_t *\fIppd\fR); \fBppd_file_t *ppdOpenFile\fR(\fBconst char *\fIfilename\fR); .fi .SH DESCRIPTION The CUPS filter interface provides a standard method for adding support for new document types or printers to CUPS. Each filter is capable of converting from one or more input formats to another format that can either be printed directly or piped into another filter to get it to a printable format. .LP Filters \fBMUST\fR be capable of reading from a filename on the command-line or from the standard input, copying the standard input to a temporary file as required by the file format. All output \fBMUST\fR be sent to the standard output. Filters \fBMUST NOT\fR attempt to communicate directly with the printer, other processes, or other services. .LP The command name (\fIargv[0]\fR) is set to the name of the destination printer but is also available in the \fBPRINTER\fI environment variable. .SH OPTIONS Options are passed in \fIargv[5]\fR and are encoded from the corresponding IPP attributes used when the job was submitted. Use the .BR cupsParseOptions () function to load the options into a \fBcups_option_t\fR array and the .BR cupsGetOption () function to get the value of a specific attribute. Be careful to look for common aliases of IPP attributes such as "landscape" for the IPP "orientation-requested" attribute. .LP Options passed on the command-line typically do not include the default choices the printer's PPD file. Use the .BR ppdMarkDefaults () and .BR cupsMarkOptions () functions in the CUPS library to apply the options to the PPD defaults and map any IPP attributes to the corresponding PPD options. Use .BR ppdFindMarkedChoice () to get the user-selected choice for a PPD option. For example, a filter might use the following code to determine the current value of the \fBDuplex\fR PPD option: .nf ppd_file_t *ppd = ppdOpenFile(getenv("PPD")); cups_option_t *options = NULL; int num_options = cupsParseOptions(argv[5], 0, &options); ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, options); ppd_choice_t *choice = ppdFindMarkedChoice(ppd, "Duplex"); .fi .LP Raster filters should use option choices set through the raster page header, as those reflect the options in effect for a given page. Options specified on the command-line determine the default values for the entire job, which can be overridden on a per-page basis. .SH LOG MESSAGES Messages sent to the standard error are generally stored in the printer's "printer-state-message" attribute and the current \fBErrorLog\fR file. Each line begins with a standard prefix: .TP 5 \fBALERT: \fImessage\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "alert" log level. .TP 5 \fBATTR: \fIattribute=value \fR[ \fI... attribute=value\fR] Sets the named job or printer attribute(s). The following job attributes can be set: "job-media-progress". The following printer attributes can be set: "auth-info-required", "marker-colors", "marker-high-levels", "marker-levels", "marker-low-levels", "marker-message", "marker-names", "marker-types", "printer-alert", and "printer-alert-description". .TP 5 \fBCRIT: \fImessage\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "critical" log level. .TP 5 \fBDEBUG: \fImessage\fR Adds the specified message to the current \fBErrorLog\fR using the "debug" log level. \fBDEBUG\fR messages are never stored in the "printer-state-message" attribute. .TP 5 \fBDEBUG2: \fImessage\fR .br Adds the specified message to the current \fBErrorLog\fR using the "debug2" log level. \fBDEBUG2\fR messages are never stored in the "printer-state-message" attribute. .TP 5 \fBEMERG: \fImessage\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "emergency" log level. .TP 5 \fBERROR:\fI message\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "error" log level. .TP 5 \fBINFO:\fI message\fR Sets the "printer-state-message" attribute. If the current \fBLogLevel\fR is set to "debug2", also adds the specified message to the current \fBErrorLog\fR using the "info" log level. .TP 5 \fBNOTICE:\fI message\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "notice" log level. .TP 5 \fBPAGE:\fI page-number #-copies\fR .TP 5 \fBPAGE:\fI total #-pages\fR Adds an entry to the current \fBPageLog\fR. The first form adds \fI#-copies\fR to the "job-media-sheets-completed" attribute. The second form sets the "job-media-sheets-completed" attribute to \fI#-pages\fR. .TP 5 \fBPPD:\fI Keyword=Value\fR [ \fI... KeywordN=Value\fR ] Sets the named keywords in the printer's PPD file. This is typically used to update default option keywords such as \fBDefaultPageSize\fR and the various installable options in the PPD file. .TP 5 \fBSTATE:\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ] .TP 5 \fBSTATE: +\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ] .TP 5 \fBSTATE: -\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ] Sets, adds, or removes "printer-state-reason" keywords for the current queue. Typically this is used to indicate media, ink, and toner conditions on a printer. .TP 5 \fBWARNING:\fI message\fR Sets the "printer-state-message" attribute and adds the specified message to the current \fBErrorLog\fR using the "warning" log level. .SH ENVIRONMENT VARIABLES The following environment variables are defined by the CUPS server when executing the filter: .TP 5 .B CHARSET The default text character set, typically "utf-8". .TP 5 .B CLASS When a job is submitted to a printer class, contains the name of the destination printer class. Otherwise this environment variable will not be set. .TP 5 .B CONTENT_TYPE The MIME media type associated with the submitted job file, for example "application/postscript". .TP 5 .B CUPS_CACHEDIR The directory where semi-persistent cache files can be found and stored. .TP 5 .B CUPS_DATADIR The directory where data files can be found. .TP 5 .B CUPS_FILETYPE The type of file being printed: "job-sheet" for a banner page and "document" for a regular print file. .TP 5 .B CUPS_MAX_MESSAGE The maximum size of a message sent to \fIstderr\fR, including any leading prefix and the trailing newline. .TP 5 .B CUPS_SERVERROOT The root directory of the server. .TP 5 .B FINAL_CONTENT_TYPE The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript". .TP 5 .B LANG The default language locale (typically C or en). .TP 5 .B PATH The standard execution path for external programs that may be run by the filter. .TP 5 .B PPD The full pathname of the PostScript Printer Description (PPD) file for this printer. .TP 5 .B PRINTER The name of the printer. .TP 5 .B RIP_CACHE The recommended amount of memory to use for Raster Image Processors (RIPs). .TP 5 .B SOFTWARE The name and version number of the server (typically CUPS/\fImajor.minor\fR). .TP 5 .B TZ The timezone of the server. .TP 5 .B USER The user executing the filter, typically "lp" or "root"; consult the \fIcups-files.conf\fR file for the current setting. .SH CONFORMING TO While the filter interface is compatible with System V interface scripts, CUPS does not support System V interface scripts. .SH NOTES CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .LP CUPS filters are not meant to be run directly by the user. Aside from the legacy System V interface issues (\fIargv[0]\fR is the printer name), CUPS filters also expect specific environment variables and file descriptors, and typically run in a user session that (on macOS) has additional restrictions that affect how it runs. Unless you are a developer and know what you are doing, please do not run filters directly. Instead, use the .BR cupsfilter (8) program to use the appropriate filters to do the conversions you need. .SH SEE ALSO .BR backend (7), .BR cups (1), .BR cups-files.conf (5), .BR cupsd (8), .BR cupsfilter (8), .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/man/lpadmin.8000664 000765 000024 00000020714 13574721672 015073 0ustar00mikestaff000000 000000 .\" .\" lpadmin man page for CUPS. .\" .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lpadmin 8 "CUPS" "26 April 2019" "Apple Inc." .SH NAME lpadmin \- configure cups printers and classes .SH SYNOPSIS .B lpadmin [ .B \-E ] [ .B \-U .I username ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] .B \-d .I destination .br .B lpadmin [ .B \-E ] [ .B \-U .I username ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] .B \-p .I destination [ .B \-R .I name-default ] .I option(s) .br .B lpadmin [ .B \-E ] [ .B \-U .I username ] [ \fB\-h \fIserver\fR[\fB:\fIport\fR] ] .B \-x .I destination .SH DESCRIPTION \fBlpadmin\fR configures printer and class queues provided by CUPS. It can also be used to set the server default printer or class. .LP When specified before the \fI-d\fR, \fI-p\fR, or \fI-x\fR options, the \fI-E\fR option forces encryption when connecting to the server. .LP The first form of the command (\fI-d\fR) sets the default printer or class to \fIdestination\fR. Subsequent print jobs submitted via the .BR lp (1) or .BR lpr (1) commands will use this destination unless the user specifies otherwise with the .BR lpoptions (1) command. .LP The second form of the command (\fI-p\fR) configures the named printer or class. The additional options are described below. .LP The third form of the command (\fI-x\fR) deletes the printer or class \fIdestination\fR. Any jobs that are pending for the destination will be removed and any job that is currently printed will be aborted. .SH OPTIONS The following options are recognized when configuring a printer queue: .TP 5 \fB\-c \fIclass\fR Adds the named \fIprinter\fR to \fIclass\fR. If \fIclass\fR does not exist it is created automatically. .TP 5 \fB\-m \fImodel\fR Sets a standard PPD file for the printer from the \fImodel\fR directory or using one of the driver interfaces. Use the \fI-m\fR option with the .BR lpinfo (8) command to get a list of supported models. The model "raw" clears any existing PPD file and the model "everywhere" queries the printer referred to by the specified IPP \fIdevice-uri\fR. Note: Models other than "everywhere" are deprecated and will not be supported in a future version of CUPS. .TP 5 \fB\-o cupsIPPSupplies=true\fR .TP 5 \fB\-o cupsIPPSupplies=false\fR Specifies whether IPP supply level values should be reported. .TP 5 \fB\-o cupsSNMPSupplies=true\fR .TP 5 \fB\-o cupsSNMPSupplies=false\fR Specifies whether SNMP supply level (RFC 3805) values should be reported. .TP 5 \fB\-o job\-k\-limit=\fIvalue\fR Sets the kilobyte limit for per-user quotas. The value is an integer number of kilobytes; one kilobyte is 1024 bytes. .TP 5 \fB\-o job\-page\-limit=\fIvalue\fR Sets the page limit for per-user quotas. The value is the integer number of pages that can be printed; double-sided pages are counted as two pages. .TP 5 \fB-o job\-quota\-period=\fIvalue\fR Sets the accounting period for per-user quotas. The value is an integer number of seconds; 86,400 seconds are in one day. .TP 5 \fB\-o job\-sheets\-default=\fIbanner\fR .TP 5 \fB\-o job\-sheets\-default=\fIbanner\fB,\fIbanner\fR Sets the default banner page(s) to use for print jobs. .TP 5 \fB\-o \fIname\fB=\fIvalue\fR Sets a PPD option for the printer. PPD options can be listed using the \fI-l\fR option with the .BR lpoptions (1) command. .TP 5 \fB\-o \fIname\fB-default=\fIvalue\fR Sets a default server-side option for the destination. Any print-time option can be defaulted, e.g., "-o number-up-default=2" to set the default "number-up" option value to 2. .TP 5 \fB\-o port\-monitor=\fIname\fR Sets the binary communications program to use when printing, "none", "bcp", or "tbcp". The default program is "none". The specified port monitor must be listed in the printer's PPD file. .TP 5 \fB\-o printer-error-policy=\fIname\fR Sets the policy for errors such as printers that cannot be found or accessed, don't support the format being printed, fail during submission of the print data, or cause one or more filters to crash. The name must be one of "abort-job" (abort the job on error), "retry-job" (retry the job at a future time), "retry-current-job" (retry the current job immediately), or "stop-printer" (stop the printer on error). The default error policy is "stop-printer" for printers and "retry-current-job" for classes. .TP 5 \fB\-o printer\-is\-shared=true\fR .TP 5 \fB\-o printer\-is\-shared=false\fR Sets the destination to shared/published or unshared/unpublished. Shared/published destinations are publicly announced by the server on the LAN based on the browsing configuration in \fIcupsd.conf\fR, while unshared/unpublished destinations are not announced. The default value is "true". .TP 5 \fB\-o printer-op-policy=\fIname\fR Sets the IPP operation policy associated with the destination. The name must be defined in the \fIcupsd.conf\fR in a Policy section. The default operation policy is "default". .TP 5 \fB\-R \fIname\fB\-default\fR Deletes the named option from \fIprinter\fR. .TP 5 \fB\-r \fIclass\fR Removes the named \fIprinter\fR from \fIclass\fR. If the resulting class becomes empty it is removed. .TP 5 \fB-u allow:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}* .TP 5 \fB-u deny:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}* .TP 5 \fB\-u allow:all\fR .TP 5 \fB\-u deny:none\fR Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX groups. The latter two forms turn user-level access control off. Note: The user 'root' is not granted special access - using "-u allow:foo,bar" will allow users 'foo' and 'bar' to access the printer but NOT 'root'. .TP 5 \fB\-v "\fIdevice-uri\fB"\fR Sets the \fIdevice-uri\fR attribute of the printer queue. Use the \fI-v\fR option with the .BR lpinfo (8) command to get a list of supported device URIs and schemes. .TP 5 \fB\-D "\fIinfo\fB"\fR Provides a textual description of the destination. .TP 5 .B \-E When specified before the \fB\-d\fR, \fB\-p\fR, or \fB\-x\fR options, forces the use of TLS encryption on the connection to the scheduler. Otherwise, enables the destination and accepts jobs; this is the same as running the .BR cupsaccept (8) and .BR cupsenable (8) programs on the destination. .TP 5 \fB\-L "\fIlocation\fB"\fR Provides a textual location of the destination. .SH DEPRECATED OPTIONS The following \fBlpadmin\fR options are deprecated: .TP 5 \fB\-i \fIfilename\fR This option historically has been used to provide either a System V interface script or (as an implementation side-effect) a PPD file. Note: Interface scripts are not supported by CUPS. PPD files and printer drivers are deprecated and will not be supported in a future version of CUPS. .TP 5 \fB\-P \fIppd-file\fR Specifies a PostScript Printer Description (PPD) file to use with the printer. Note: PPD files and printer drivers are deprecated and will not be supported in a future version of CUPS. .SH CONFORMING TO Unlike the System V printing system, CUPS allows printer names to contain any printable character except SPACE, TAB, "/", or "#". Also, printer and class names are \fInot\fR case-sensitive. .PP Finally, the CUPS version of \fBlpadmin\fR may ask the user for an access password depending on the printing system configuration. This differs from the System V version which requires the root user to execute this command. .SH NOTES CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as .BR ippeveprinter (1). .LP The CUPS version of \fBlpadmin\fR does not support all of the System V or Solaris printing system configuration options. .PP Interface scripts are not supported for security reasons. .PP The double meaning of the \fB\-E\fR option is an unfortunate historical oddity. .PP The \fBlpadmin\fR command communicates with the scheduler (\fBcupsd\fR) to make changes to the printing system configuration. This configuration information is stored in several files including \fIprinters.conf\fR and \fIclasses.conf\fR. These files should not be edited directly and are an implementation detail of CUPS that is subject to change at any time. .SH EXAMPLE Create an IPP Everywhere print queue: .nf lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere .fi .SH SEE ALSO .BR cupsaccept (8), .BR cupsenable (8), .BR lpinfo (8), .BR lpoptions (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT Copyright \[co] 2007-2019 by Apple Inc. cups-2.3.1/xcode/CUPS.xcodeproj/000775 000765 000024 00000000000 13574721672 016447 5ustar00mikestaff000000 000000 cups-2.3.1/xcode/config.h000664 000765 000024 00000024360 13574721672 015324 0ustar00mikestaff000000 000000 /* * Configuration file for CUPS and Xcode. * * 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 information. */ #ifndef _CUPS_CONFIG_H_ #define _CUPS_CONFIG_H_ #include #include /* * Version of software... */ #define CUPS_SVERSION "CUPS v2.3.1" #define CUPS_MINIMAL "CUPS/2.3.1" /* * Default user and groups... */ #define CUPS_DEFAULT_USER "_lp" #define CUPS_DEFAULT_GROUP "_lp" #define CUPS_DEFAULT_SYSTEM_GROUPS "admin" #define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@AUTHKEY(system.print.operator) @admin @lpadmin" #define CUPS_DEFAULT_SYSTEM_AUTHKEY "system.print.admin" /* * Default file permissions... */ #define CUPS_DEFAULT_CONFIG_FILE_PERM 0644 #define CUPS_DEFAULT_LOG_FILE_PERM 0644 /* * Default logging settings... */ #define CUPS_DEFAULT_LOG_LEVEL "warn" #define CUPS_DEFAULT_ACCESS_LOG_LEVEL "none" /* * Default fatal error settings... */ #define CUPS_DEFAULT_FATAL_ERRORS "config" /* * Default browsing settings... */ #define CUPS_DEFAULT_BROWSING 1 #define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "dnssd" #define CUPS_DEFAULT_DEFAULT_SHARED 1 /* * Default IPP port... */ #define CUPS_DEFAULT_IPP_PORT 631 /* * Default printcap file... */ #define CUPS_DEFAULT_PRINTCAP "/Library/Preferences/org.cups.printers.plist" /* * Default Samba and LPD config files... */ #define CUPS_DEFAULT_SMB_CONFIG_FILE "" #define CUPS_DEFAULT_LPD_CONFIG_FILE "launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" /* * Default MaxCopies value... */ #define CUPS_DEFAULT_MAX_COPIES 9999 /* * Do we have domain socket support, and if so what is the default one? */ #define CUPS_DEFAULT_DOMAINSOCKET "/private/var/run/cupsd" /* * Default WebInterface value... */ #define CUPS_DEFAULT_WEBIF 0 /* * Where are files stored? * * Note: These are defaults, which can be overridden by environment * variables at run-time... */ #define CUPS_BINDIR "/usr/bin" #define CUPS_CACHEDIR "/private/var/spool/cups/cache" #define CUPS_DATADIR "/usr/share/cups" #define CUPS_DOCROOT "/usr/share/doc/cups" #define CUPS_FONTPATH "/usr/share/cups/fonts" #define CUPS_LOCALEDIR "/usr/share/locale" #define CUPS_LOGDIR "/private/var/log/cups" #define CUPS_REQUESTS "/private/var/spool/cups" #define CUPS_SBINDIR "/usr/sbin" #define CUPS_SERVERBIN "/usr/libexec/cups" #define CUPS_SERVERROOT "/private/etc/cups" #define CUPS_STATEDIR "/private/etc/cups" /* * Do we have posix_spawn? */ #define HAVE_POSIX_SPAWN 1 /* * Do we have ZLIB? */ #define HAVE_LIBZ 1 #define HAVE_INFLATECOPY 1 /* * Do we have PAM stuff? */ #if TARGET_OS_OSX # define HAVE_LIBPAM 1 /* #undef HAVE_PAM_PAM_APPL_H */ # define HAVE_PAM_SET_ITEM 1 # define HAVE_PAM_SETCRED 1 #endif /* TARGET_OS_OSX */ /* * Do we have ? */ /* #undef HAVE_SHADOW_H */ /* * Do we have ? */ /* #undef HAVE_CRYPT_H */ /* * Use ? */ #define HAVE_STDINT_H 1 /* * Use , , and/or ? */ #define HAVE_STRING_H 1 #define HAVE_STRINGS_H 1 /* #undef HAVE_BSTRING_H */ /* * Do we have the long long type? */ #define HAVE_LONG_LONG 1 #ifdef HAVE_LONG_LONG # define CUPS_LLFMT "%lld" # define CUPS_LLCAST (long long) #else # define CUPS_LLFMT "%ld" # define CUPS_LLCAST (long) #endif /* HAVE_LONG_LONG */ /* * Do we have the strtoll() function? */ #define HAVE_STRTOLL 1 #ifndef HAVE_STRTOLL # define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) #endif /* !HAVE_STRTOLL */ /* * Do we have the strXXX() functions? */ #define HAVE_STRDUP 1 #define HAVE_STRLCAT 1 #define HAVE_STRLCPY 1 /* * Do we have the geteuid() function? */ #define HAVE_GETEUID 1 /* * Do we have the setpgid() function? */ #define HAVE_SETPGID 1 /* * Do we have the vsyslog() function? */ #define HAVE_VSYSLOG 1 /* * Do we have the systemd journal functions? */ /* #undef HAVE_SYSTEMD_SD_JOURNAL_H */ /* * Do we have the (v)snprintf() functions? */ #define HAVE_SNPRINTF 1 #define HAVE_VSNPRINTF 1 /* * What signal functions to use? */ #define HAVE_SIGSET 1 #define HAVE_SIGACTION 1 /* * What wait functions to use? */ #define HAVE_WAITPID 1 #define HAVE_WAIT3 1 /* * Do we have the mallinfo function and malloc.h? */ /* #undef HAVE_MALLINFO */ /* #undef HAVE_MALLOC_H */ /* * Do we have the POSIX ACL functions? */ #define HAVE_ACL_INIT 1 /* * Do we have the langinfo.h header file? */ #define HAVE_LANGINFO_H 1 /* * Which encryption libraries do we have? */ #define HAVE_CDSASSL 1 /* #undef HAVE_GNUTLS */ /* #undef HAVE_SSPISSL */ #define HAVE_SSL 1 /* * Do we have the gnutls_transport_set_pull_timeout_function function? */ /* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */ /* * Do we have the gnutls_priority_set_direct function? */ /* #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT */ /* * What Security framework headers do we have? */ #if TARGET_OS_OSX # define HAVE_AUTHORIZATION_H 1 #endif /* TARGET_OS_OSX */ #define HAVE_SECCERTIFICATE_H 1 #define HAVE_SECITEM_H 1 #define HAVE_SECPOLICY_H 1 /* * Do we have the SecGenerateSelfSignedCertificate function? */ #if !TARGET_OS_OSX # define HAVE_SECGENERATESELFSIGNEDCERTIFICATE 1 #endif /* !TARGET_OS_OSX */ /* * Do we have libpaper? */ /* #undef HAVE_LIBPAPER */ /* * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)? */ #define HAVE_DNSSD 1 /* * Do we have Avahi for DNS Service Discovery (aka Bonjour)? */ /* #undef HAVE_AVAHI */ /* * Do we have ? */ #define HAVE_SYS_IOCTL_H 1 /* * Does the "stat" structure contain the "st_gen" member? */ #define HAVE_ST_GEN 1 /* * Does the "tm" structure contain the "tm_gmtoff" member? */ #define HAVE_TM_GMTOFF 1 /* * Do we have rresvport_af()? */ #define HAVE_RRESVPORT_AF 1 /* * Do we have getaddrinfo()? */ #define HAVE_GETADDRINFO 1 /* * Do we have getnameinfo()? */ #define HAVE_GETNAMEINFO 1 /* * Do we have getifaddrs()? */ #define HAVE_GETIFADDRS 1 /* * Do we have hstrerror()? */ #define HAVE_HSTRERROR 1 /* * Do we have res_init()? */ #define HAVE_RES_INIT 1 /* * Do we have */ #define HAVE_RESOLV_H 1 /* * Do we have the header file? */ #define HAVE_SYS_SOCKIO_H 1 /* * Does the sockaddr structure contain an sa_len parameter? */ /* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */ /* * Do we have pthread support? */ #define HAVE_PTHREAD_H 1 /* * Do we have on-demand support (launchd/systemd/upstart)? */ #define HAVE_ONDEMAND 1 /* * Do we have launchd support? */ #define HAVE_LAUNCH_H 1 #define HAVE_LAUNCHD 1 /* * Do we have systemd support? */ /* #undef HAVE_SYSTEMD */ /* * Do we have upstart support? */ /* #undef HAVE_UPSTART */ /* * Do we have CoreFoundation public headers? */ #define HAVE_COREFOUNDATION_H 1 /* * Do we have ApplicationServices public headers? */ #if TARGET_OS_OSX # define HAVE_APPLICATIONSERVICES_H 1 #endif /* TARGET_OS_OSX */ /* * Do we have the SCDynamicStoreCopyComputerName function? */ #if TARGET_OS_OSX # define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1 #endif /* TARGET_OS_OSX */ /* * Do we have the getgrouplist() function? */ #define HAVE_GETGROUPLIST 1 /* * Do we have macOS 10.4's mbr_XXX functions? */ #define HAVE_MEMBERSHIP_H 1 #define HAVE_MBR_UID_TO_UUID 1 /* * Do we have Darwin's notify_post header and function? */ #define HAVE_NOTIFY_H 1 #define HAVE_NOTIFY_POST 1 /* * Do we have DBUS? */ /* #undef HAVE_DBUS */ /* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ /* #undef HAVE_DBUS_THREADS_INIT */ /* * Do we have the GSSAPI support library (for Kerberos support)? */ #if TARGET_OS_OSX # define HAVE_GSS_ACQUIRED_CRED_EX_F 1 # define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1 # define HAVE_GSS_GSSAPI_H 1 /* #undef HAVE_GSS_GSSAPI_SPI_H */ # define HAVE_GSSAPI 1 /* #undef HAVE_GSSAPI_GSSAPI_H */ /* #undef HAVE_GSSAPI_H */ #endif /* TARGET_OS_OSX */ /* * Default GSS service name... */ #define CUPS_DEFAULT_GSSSERVICENAME "host" /* * Select/poll interfaces... */ #define HAVE_POLL 1 /* #undef HAVE_EPOLL */ #define HAVE_KQUEUE 1 /* * Do we have the header? */ #define HAVE_DLFCN_H 1 /* * Do we have ? */ #define HAVE_SYS_PARAM_H 1 /* * Do we have ? */ #define HAVE_SYS_UCRED_H 1 /* * Do we have removefile()? */ #define HAVE_REMOVEFILE 1 /* * Do we have ? */ #define HAVE_SANDBOX_H 1 /* * Which random number generator function to use... */ #define HAVE_ARC4RANDOM 1 #define HAVE_RANDOM 1 #define HAVE_LRAND48 1 #ifdef HAVE_ARC4RANDOM # define CUPS_RAND() arc4random() # define CUPS_SRAND(v) #elif defined(HAVE_RANDOM) # define CUPS_RAND() random() # define CUPS_SRAND(v) srandom(v) #elif defined(HAVE_LRAND48) # define CUPS_RAND() lrand48() # define CUPS_SRAND(v) srand48(v) #else # define CUPS_RAND() rand() # define CUPS_SRAND(v) srand(v) #endif /* HAVE_ARC4RANDOM */ /* * Do we have libusb? */ /* #undef HAVE_LIBUSB */ /* * Do we have libwrap and tcpd.h? */ /* #undef HAVE_TCPD_H */ /* * Do we have ? */ #define HAVE_ICONV_H 1 /* * Do we have statfs or statvfs and one of the corresponding headers? */ #define HAVE_STATFS 1 #define HAVE_STATVFS 1 #define HAVE_SYS_MOUNT_H 1 /* #undef HAVE_SYS_STATFS_H */ #define HAVE_SYS_STATVFS_H 1 /* #undef HAVE_SYS_VFS_H */ /* * Location of localization bundle, if any. */ #if TARGET_OS_OSX # define CUPS_BUNDLEDIR "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" #else # define CUPS_BUNDLEDIR "/System/Library/PrivateFrameworks/PrintKit.framework/Versions/A" #endif /* TARGET_OS_OSX */ /* * Do we have XPC? */ #define HAVE_XPC 1 /* * Do we have the C99 abs() function? */ #define HAVE_ABS 1 #if !defined(HAVE_ABS) && !defined(abs) # if defined(__GNUC__) || __STDC_VERSION__ >= 199901L # define abs(x) _cups_abs(x) static inline int _cups_abs(int i) { return (i < 0 ? -i : i); } # elif defined(_MSC_VER) # define abs(x) _cups_abs(x) static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } # else # define abs(x) ((x) < 0 ? -(x) : (x)) # endif /* __GNUC__ || __STDC_VERSION__ */ #endif /* !HAVE_ABS && !abs */ #endif /* !_CUPS_CONFIG_H_ */ cups-2.3.1/xcode/README.txt000664 000765 000024 00000000264 13574721672 015401 0ustar00mikestaff000000 000000 README - CUPS on macOS/iOS - 2016-08-08 --------------------------------------- This directory contains an Xcode project for building CUPS for macOS and the CUPS library for iOS. cups-2.3.1/xcode/CUPS.xcodeproj/project.pbxproj000664 000765 000024 00002236017 13574721672 021536 0ustar00mikestaff000000 000000 // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXAggregateTarget section */ 273BF6D91333B6260022CAAB /* Tests */ = { isa = PBXAggregateTarget; buildConfigurationList = 273BF6DA1333B6270022CAAB /* Build configuration list for PBXAggregateTarget "Tests" */; buildPhases = ( ); dependencies = ( 729181C12011560E005E7560 /* PBXTargetDependency */, 729181C32011560E005E7560 /* PBXTargetDependency */, 270D02281D707E5100EA9403 /* PBXTargetDependency */, 271287361CC1411000E517C7 /* PBXTargetDependency */, 2712871C1CC13FFA00E517C7 /* PBXTargetDependency */, 271286DC1CC13EF400E517C7 /* PBXTargetDependency */, 271286DE1CC13EF400E517C7 /* PBXTargetDependency */, 271286E01CC13EF400E517C7 /* PBXTargetDependency */, 271284911CC11FA500E517C7 /* PBXTargetDependency */, 271284931CC11FA500E517C7 /* PBXTargetDependency */, 271284951CC11FA500E517C7 /* PBXTargetDependency */, 271284971CC11FA500E517C7 /* PBXTargetDependency */, 271284991CC11FA500E517C7 /* PBXTargetDependency */, 2712849B1CC11FA500E517C7 /* PBXTargetDependency */, 2712849D1CC11FA500E517C7 /* PBXTargetDependency */, 2712849F1CC11FA500E517C7 /* PBXTargetDependency */, 271284A11CC11FA500E517C7 /* PBXTargetDependency */, 271284A31CC11FA500E517C7 /* PBXTargetDependency */, 271284A51CC11FA500E517C7 /* PBXTargetDependency */, 271284A71CC11FA500E517C7 /* PBXTargetDependency */, 271284A91CC11FA500E517C7 /* PBXTargetDependency */, 271284AB1CC11FA500E517C7 /* PBXTargetDependency */, 271284AD1CC11FA500E517C7 /* PBXTargetDependency */, 271284AF1CC11FA500E517C7 /* PBXTargetDependency */, 271284B11CC11FA500E517C7 /* PBXTargetDependency */, 271284B31CC11FA500E517C7 /* PBXTargetDependency */, 271284B51CC11FA500E517C7 /* PBXTargetDependency */, 271284B71CC11FA500E517C7 /* PBXTargetDependency */, 271284B91CC11FA500E517C7 /* PBXTargetDependency */, 271284BB1CC11FA500E517C7 /* PBXTargetDependency */, 271284BD1CC11FA500E517C7 /* PBXTargetDependency */, 271284BF1CC11FA500E517C7 /* PBXTargetDependency */, 271284C11CC11FA500E517C7 /* PBXTargetDependency */, 271284C31CC11FA500E517C7 /* PBXTargetDependency */, 271284C51CC11FA500E517C7 /* PBXTargetDependency */, 271284C71CC11FA500E517C7 /* PBXTargetDependency */, 274770E42345347D0089BC31 /* PBXTargetDependency */, 271284C91CC11FA500E517C7 /* PBXTargetDependency */, 726AD704135E8AA1002C930D /* PBXTargetDependency */, 2767FC5419267469000F61D3 /* PBXTargetDependency */, 273BF6DE1333B6370022CAAB /* PBXTargetDependency */, 2767FC5619267469000F61D3 /* PBXTargetDependency */, 278C58D6136B641D00836530 /* PBXTargetDependency */, 270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */, ); name = Tests; productName = Tests; }; 274FF5DE13332D3000317ECB /* All */ = { isa = PBXAggregateTarget; buildConfigurationList = 274FF5DF13332D3100317ECB /* Build configuration list for PBXAggregateTarget "All" */; buildPhases = ( ); dependencies = ( 273B1EC2226B3F2600428143 /* PBXTargetDependency */, 273B1EC4226B3F2600428143 /* PBXTargetDependency */, 271287061CC13F8F00E517C7 /* PBXTargetDependency */, 271287081CC13F8F00E517C7 /* PBXTargetDependency */, 271286E21CC13F0100E517C7 /* PBXTargetDependency */, 271286E41CC13F0100E517C7 /* PBXTargetDependency */, 271286351CC12F9000E517C7 /* PBXTargetDependency */, 271286371CC12F9000E517C7 /* PBXTargetDependency */, 271286391CC12F9000E517C7 /* PBXTargetDependency */, 2712863B1CC12F9000E517C7 /* PBXTargetDependency */, 2712863D1CC12F9000E517C7 /* PBXTargetDependency */, 2712863F1CC12F9000E517C7 /* PBXTargetDependency */, 271286411CC12F9000E517C7 /* PBXTargetDependency */, 271286431CC12F9000E517C7 /* PBXTargetDependency */, 271286451CC12F9000E517C7 /* PBXTargetDependency */, 271286471CC12F9000E517C7 /* PBXTargetDependency */, 2712857E1CC1295A00E517C7 /* PBXTargetDependency */, 271285801CC1295A00E517C7 /* PBXTargetDependency */, 271285841CC1295A00E517C7 /* PBXTargetDependency */, 271285861CC1295A00E517C7 /* PBXTargetDependency */, 271285881CC1295A00E517C7 /* PBXTargetDependency */, 2712858A1CC1295A00E517C7 /* PBXTargetDependency */, 2712858C1CC1295A00E517C7 /* PBXTargetDependency */, 2712858E1CC1295A00E517C7 /* PBXTargetDependency */, 271285901CC1295A00E517C7 /* PBXTargetDependency */, 271285921CC1295A00E517C7 /* PBXTargetDependency */, 271285941CC1295A00E517C7 /* PBXTargetDependency */, 27A034871A8BDC6900650675 /* PBXTargetDependency */, 274FF5E313332D4300317ECB /* PBXTargetDependency */, 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */, 72F75A711336FACD004BB496 /* PBXTargetDependency */, 274FF5E513332D4300317ECB /* PBXTargetDependency */, 274FF622133331D300317ECB /* PBXTargetDependency */, 2766836B1337AA25000D33D0 /* PBXTargetDependency */, 274FF5E713332D4300317ECB /* PBXTargetDependency */, 274FF6E21333B33F00317ECB /* PBXTargetDependency */, 72F75A731336FACD004BB496 /* PBXTargetDependency */, 274FF6391333348400317ECB /* PBXTargetDependency */, 274FF5E913332D4300317ECB /* PBXTargetDependency */, 274FF648133335A300317ECB /* PBXTargetDependency */, 274FF65E13333A3400317ECB /* PBXTargetDependency */, 724379531333FECE009631B9 /* PBXTargetDependency */, 724379111333E4EA009631B9 /* PBXTargetDependency */, 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */, 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */, 276683FF1337F7C5000D33D0 /* PBXTargetDependency */, 7243792B1333E962009631B9 /* PBXTargetDependency */, 276683D71337B24A000D33D0 /* PBXTargetDependency */, 276683D91337B24A000D33D0 /* PBXTargetDependency */, 276683DB1337B24A000D33D0 /* PBXTargetDependency */, 276683DD1337B24A000D33D0 /* PBXTargetDependency */, 276683DF1337B24A000D33D0 /* PBXTargetDependency */, 7258EAEF13459ADA009286F1 /* PBXTargetDependency */, 720DD6D11358FDBE0064AA82 /* PBXTargetDependency */, 7243793F1333FD23009631B9 /* PBXTargetDependency */, 724379C31333FF7D009631B9 /* PBXTargetDependency */, ); name = All; productName = All; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 270696001CADF3E200FFE5FB /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; 270696021CADF3E200FFE5FB /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBB1333056300FCA411 /* auth.c */; }; 270696071CADF3E200FFE5FB /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED1133305BB00FCA411 /* debug.c */; }; 270696081CADF3E200FFE5FB /* dest.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED2133305BB00FCA411 /* dest.c */; }; 270696091CADF3E200FFE5FB /* dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED3133305BB00FCA411 /* dir.c */; }; 2706960B1CADF3E200FFE5FB /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED6133305BB00FCA411 /* encode.c */; }; 2706960C1CADF3E200FFE5FB /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED8133305BB00FCA411 /* file.c */; }; 2706960F1CADF3E200FFE5FB /* getputfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDC133305BB00FCA411 /* getputfile.c */; }; 270696101CADF3E200FFE5FB /* globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDD133305BB00FCA411 /* globals.c */; }; 270696111CADF3E200FFE5FB /* http-addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDE133305BB00FCA411 /* http-addr.c */; }; 270696121CADF3E200FFE5FB /* http-addrlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDF133305BB00FCA411 /* http-addrlist.c */; }; 270696131CADF3E200FFE5FB /* http-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE1133305BB00FCA411 /* http-support.c */; }; 270696141CADF3E200FFE5FB /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE2133305BB00FCA411 /* http.c */; }; 270696161CADF3E200FFE5FB /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; }; 270696171CADF3E200FFE5FB /* ipp-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE5133305BB00FCA411 /* ipp-support.c */; }; 270696181CADF3E200FFE5FB /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE6133305BB00FCA411 /* ipp.c */; }; 270696191CADF3E200FFE5FB /* langprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE8133305BB00FCA411 /* langprintf.c */; }; 2706961A1CADF3E200FFE5FB /* language.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEA133305BB00FCA411 /* language.c */; }; 2706961D1CADF3E200FFE5FB /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEF133305BB00FCA411 /* md5.c */; }; 2706961E1CADF3E200FFE5FB /* md5passwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF0133305BB00FCA411 /* md5passwd.c */; }; 2706961F1CADF3E200FFE5FB /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 7284F9EF1BFCCD940026F886 /* hash.c */; }; 270696201CADF3E200FFE5FB /* notify.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF1133305BB00FCA411 /* notify.c */; }; 270696211CADF3E200FFE5FB /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF2133305BB00FCA411 /* options.c */; }; 270696221CADF3E200FFE5FB /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; }; 270696251CADF3E200FFE5FB /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; }; 270696271CADF3E200FFE5FB /* pwg-media.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF8133305BB00FCA411 /* pwg-media.c */; }; 270696281CADF3E200FFE5FB /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; }; 270696291CADF3E200FFE5FB /* request.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFB133305BB00FCA411 /* request.c */; }; 2706962C1CADF3E200FFE5FB /* snprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F00133305BB00FCA411 /* snprintf.c */; }; 2706962D1CADF3E200FFE5FB /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; 2706962E1CADF3E200FFE5FB /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; 2706962F1CADF3E200FFE5FB /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; 270696301CADF3E200FFE5FB /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; 270696311CADF3E200FFE5FB /* usersys.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F08133305BB00FCA411 /* usersys.c */; }; 270696341CADF3E200FFE5FB /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 270696351CADF3E200FFE5FB /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 270696381CADF3E200FFE5FB /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 270696391CADF3E200FFE5FB /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 2706963A1CADF3E200FFE5FB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 2706963B1CADF3E200FFE5FB /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 2706963E1CADF3E200FFE5FB /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB91333056300FCA411 /* array.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696401CADF3E200FFE5FB /* cups-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC01333056300FCA411 /* cups-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696421CADF3E200FFE5FB /* file-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED7133305BB00FCA411 /* file-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696431CADF3E200FFE5FB /* http-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE0133305BB00FCA411 /* http-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696441CADF3E200FFE5FB /* ipp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE4133305BB00FCA411 /* ipp-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696451CADF3E200FFE5FB /* language-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE9133305BB00FCA411 /* language-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696461CADF3E200FFE5FB /* md5-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEE133305BB00FCA411 /* md5-internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696481CADF3E200FFE5FB /* pwg-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF9133305BB00FCA411 /* pwg-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964A1CADF3E200FFE5FB /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964B1CADF3E200FFE5FB /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964C1CADF3E200FFE5FB /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F471333063D00FCA411 /* config.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964D1CADF3E200FFE5FB /* cups.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC11333056300FCA411 /* cups.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2706964E1CADF3E200FFE5FB /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (); }; }; 2706964F1CADF3E200FFE5FB /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED9133305BB00FCA411 /* file.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696501CADF3E200FFE5FB /* http.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE3133305BB00FCA411 /* http.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696511CADF3E200FFE5FB /* ipp.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE7133305BB00FCA411 /* ipp.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696521CADF3E200FFE5FB /* language.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEB133305BB00FCA411 /* language.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696551CADF3E200FFE5FB /* transcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F07133305BB00FCA411 /* transcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 270696561CADF3E200FFE5FB /* versioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F0A133305BB00FCA411 /* versioning.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2706965B1CAE1A9A00FFE5FB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F09133305BB00FCA411 /* util.c */; }; 270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */ = {isa = PBXBuildFile; fileRef = 270CCDBB135E3D3E00007BE2 /* testmime.c */; }; 270D02191D707E0200EA9403 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 270D021A1D707E0200EA9403 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 270D021B1D707E0200EA9403 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 270D021C1D707E0200EA9403 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 270D021D1D707E0200EA9403 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 270D021E1D707E0200EA9403 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 270D021F1D707E0200EA9403 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 270D02261D707E3700EA9403 /* testcreds.c in Sources */ = {isa = PBXBuildFile; fileRef = 270D02251D707E3700EA9403 /* testcreds.c */; }; 271284D21CC1231300E517C7 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; 271284D71CC124D700E517C7 /* libcupscgi_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA76B1CC03AF60092477B /* libcupscgi_static.a */; }; 271284D81CC124E300E517C7 /* libcupscgi_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA76B1CC03AF60092477B /* libcupscgi_static.a */; }; 271284D91CC124F000E517C7 /* libcupsppdc_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA7401CC03AAF0092477B /* libcupsppdc_static.a */; }; 271284DA1CC1251400E517C7 /* libcupsimage_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA70F1CC03A490092477B /* libcupsimage_static.a */; }; 271284DB1CC1251F00E517C7 /* libcupscgi_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA76B1CC03AF60092477B /* libcupscgi_static.a */; }; 271284DC1CC1254C00E517C7 /* libcupsmime_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA71F1CC03A990092477B /* libcupsmime_static.a */; }; 271284E71CC1261900E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271284ED1CC1262C00E517C7 /* cancel.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E089137A3F5200FAFEF6 /* cancel.c */; }; 271284F41CC1264B00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271284FA1CC1265800E517C7 /* cupsaccept.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08A137A3F5200FAFEF6 /* cupsaccept.c */; }; 2712850E1CC1267A00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285141CC1269400E517C7 /* lp.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08C137A3F5200FAFEF6 /* lp.c */; }; 2712851B1CC1269700E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285211CC126A700E517C7 /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 271284DD1CC125FC00E517C7 /* lpc.c */; }; 271285281CC126AA00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 2712852E1CC126BC00E517C7 /* lpinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08E137A3F5200FAFEF6 /* lpinfo.c */; }; 271285351CC1270B00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 2712853B1CC1271B00E517C7 /* lpmove.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08F137A3F5200FAFEF6 /* lpmove.c */; }; 271285421CC1271E00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285481CC1272900E517C7 /* lpoptions.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E090137A3F5200FAFEF6 /* lpoptions.c */; }; 2712854F1CC1272D00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285551CC1273C00E517C7 /* lpq.c in Sources */ = {isa = PBXBuildFile; fileRef = 271284DE1CC125FC00E517C7 /* lpq.c */; }; 2712855C1CC1274300E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285621CC1274F00E517C7 /* lpr.c in Sources */ = {isa = PBXBuildFile; fileRef = 271284DF1CC125FC00E517C7 /* lpr.c */; }; 271285691CC1275200E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 2712856F1CC1276000E517C7 /* lprm.c in Sources */ = {isa = PBXBuildFile; fileRef = 271284E01CC125FC00E517C7 /* lprm.c */; }; 271285761CC1276400E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 2712857C1CC1277000E517C7 /* lpstat.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E092137A3F5200FAFEF6 /* lpstat.c */; }; 2712859B1CC12D1300E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285A11CC12D2100E517C7 /* admin.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF02F192E3498001EF690 /* admin.c */; }; 271285A21CC12D2900E517C7 /* libcupscgi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */; }; 271285A91CC12D3A00E517C7 /* libcupscgi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */; }; 271285AA1CC12D3A00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285B01CC12D4A00E517C7 /* classes.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF032192E3498001EF690 /* classes.c */; }; 271285B71CC12D4E00E517C7 /* libcupscgi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */; }; 271285B81CC12D4E00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285BE1CC12D5C00E517C7 /* jobs.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF038192E3498001EF690 /* jobs.c */; }; 271285C51CC12D5E00E517C7 /* libcupscgi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */; }; 271285C61CC12D5E00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285CC1CC12D6D00E517C7 /* printers.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03A192E3498001EF690 /* printers.c */; }; 271285D31CC12DBF00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285D91CC12DD000E517C7 /* commandtops.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271881713746EA8001A2036 /* commandtops.c */; }; 271285E01CC12DDF00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285E61CC12DEF00E517C7 /* gziptoany.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271881A13746EA8001A2036 /* gziptoany.c */; }; 271285ED1CC12E2D00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271285F31CC12E3C00E517C7 /* pstops.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271882013746EA8001A2036 /* pstops.c */; }; 271285F41CC12E4200E517C7 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271881813746EA8001A2036 /* common.c */; }; 271285FB1CC12EEB00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286011CC12EFA00E517C7 /* rastertoepson.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271882113746EA8001A2036 /* rastertoepson.c */; }; 271286041CC12F0800E517C7 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; 2712860D1CC12F0B00E517C7 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; 2712860E1CC12F0B00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286141CC12F1800E517C7 /* rastertohp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271882213746EA8001A2036 /* rastertohp.c */; }; 2712861D1CC12F1A00E517C7 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; 2712861E1CC12F1A00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286241CC12F2600E517C7 /* rastertolabel.c in Sources */ = {isa = PBXBuildFile; fileRef = 7271882313746EA8001A2036 /* rastertolabel.c */; }; 2712865D1CC1309000E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2712865E1CC1309000E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 2712865F1CC1309000E517C7 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 271286601CC1309000E517C7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 271286611CC1309000E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 271286621CC1309000E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 271286691CC130C700E517C7 /* tlscheck.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286681CC130BD00E517C7 /* tlscheck.c */; }; 271286731CC1310E00E517C7 /* libcupsimage_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA70F1CC03A490092477B /* libcupsimage_static.a */; }; 271286741CC1310E00E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 271286751CC1310E00E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286761CC1310E00E517C7 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 271286771CC1310E00E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 271286781CC1310E00E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 2712867E1CC1311D00E517C7 /* rasterbench.c in Sources */ = {isa = PBXBuildFile; fileRef = 2712866A1CC130FF00E517C7 /* rasterbench.c */; }; 2712868D1CC13DC000E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2712868E1CC13DC000E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 2712868F1CC13DC000E517C7 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 271286901CC13DC000E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 271286911CC13DC000E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286971CC13DEA00E517C7 /* checkpo.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286831CC13D9600E517C7 /* checkpo.c */; }; 2712869E1CC13DF100E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2712869F1CC13DF100E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286A01CC13DF100E517C7 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 271286A11CC13DF100E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 271286A21CC13DF100E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286A81CC13DFD00E517C7 /* po2strings.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286851CC13D9600E517C7 /* po2strings.c */; }; 271286AF1CC13DFF00E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 271286B01CC13DFF00E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286B11CC13DFF00E517C7 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 271286B21CC13DFF00E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 271286B31CC13DFF00E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286B91CC13E1000E517C7 /* strings2po.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286861CC13D9600E517C7 /* strings2po.c */; }; 271286C11CC13E2100E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286C21CC13E2100E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286C31CC13E2100E517C7 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 271286C41CC13E2100E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286CA1CC13E2E00E517C7 /* bcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286801CC1396100E517C7 /* bcp.c */; }; 271286D11CC13E5B00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286D21CC13E5B00E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286D31CC13E5B00E517C7 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 271286D41CC13E5B00E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286DA1CC13E6A00E517C7 /* tbcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 271286811CC1396100E517C7 /* tbcp.c */; }; 271286EB1CC13F2000E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286EC1CC13F2000E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286ED1CC13F2000E517C7 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 271286EE1CC13F2000E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271286F41CC13F2F00E517C7 /* mailto.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA6D51CC039D00092477B /* mailto.c */; }; 271286FB1CC13F3F00E517C7 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 271286FC1CC13F3F00E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271286FD1CC13F3F00E517C7 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 271286FE1CC13F3F00E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 271287041CC13F4C00E517C7 /* rss.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA6D61CC039D00092477B /* rss.c */; }; 2712870F1CC13FAB00E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 271287101CC13FAB00E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 271287111CC13FAB00E517C7 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 271287121CC13FAB00E517C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 271287131CC13FAB00E517C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 2712871A1CC13FE800E517C7 /* mantohtml.c in Sources */ = {isa = PBXBuildFile; fileRef = 271287191CC13FDB00E517C7 /* mantohtml.c */; }; 2712872D1CC140D200E517C7 /* genstrings.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2712871D1CC140B400E517C7 /* genstrings.cxx */; }; 271287321CC140EB00E517C7 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 271287331CC140EB00E517C7 /* libcupsppdc_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA7401CC03AAF0092477B /* libcupsppdc_static.a */; }; 271287341CC140F500E517C7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 273B1EA1226B3E4800428143 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 273B1EA2226B3E4800428143 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 273B1EA3226B3E4800428143 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 273B1EA4226B3E4800428143 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 273B1EA5226B3E4800428143 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 273B1EB2226B3E5200428143 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 273B1EB3226B3E5200428143 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 273B1EB4226B3E5200428143 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 273B1EB5226B3E5200428143 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 273B1EB6226B3E5200428143 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 273B1EBF226B3EF300428143 /* ippevepcl.c in Sources */ = {isa = PBXBuildFile; fileRef = 273B1EBE226B3EE300428143 /* ippevepcl.c */; }; 273B1EC0226B3EFF00428143 /* ippeveps.c in Sources */ = {isa = PBXBuildFile; fileRef = 273B1EBC226B3EE300428143 /* ippeveps.c */; }; 273B1EC7226B41F700428143 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 273B1ECA226B420C00428143 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 273B1ECD226B421E00428143 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 273BF6C71333B5370022CAAB /* testcups.c in Sources */ = {isa = PBXBuildFile; fileRef = 273BF6C61333B5370022CAAB /* testcups.c */; }; 274770D72345342B0089BC31 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 274770D82345342B0089BC31 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 274770D92345342B0089BC31 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 274770DA2345342B0089BC31 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 274770DB2345342B0089BC31 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 274770E2234534660089BC31 /* testthreads.c in Sources */ = {isa = PBXBuildFile; fileRef = 274770E1234534660089BC31 /* testthreads.c */; }; 274FF5D913332CC700317ECB /* cups-driverd.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D613332CC700317ECB /* cups-driverd.cxx */; }; 274FF5DA13332CC700317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D713332CC700317ECB /* util.c */; }; 274FF5DD13332D0600317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 274FF60A1333315100317ECB /* ppdc-array.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F51333315100317ECB /* ppdc-array.cxx */; }; 274FF60B1333315100317ECB /* ppdc-attr.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F61333315100317ECB /* ppdc-attr.cxx */; }; 274FF60C1333315100317ECB /* ppdc-catalog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F71333315100317ECB /* ppdc-catalog.cxx */; }; 274FF60D1333315100317ECB /* ppdc-choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F81333315100317ECB /* ppdc-choice.cxx */; }; 274FF60E1333315100317ECB /* ppdc-constraint.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F91333315100317ECB /* ppdc-constraint.cxx */; }; 274FF60F1333315100317ECB /* ppdc-driver.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FA1333315100317ECB /* ppdc-driver.cxx */; }; 274FF6101333315100317ECB /* ppdc-file.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FB1333315100317ECB /* ppdc-file.cxx */; }; 274FF6111333315100317ECB /* ppdc-filter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FC1333315100317ECB /* ppdc-filter.cxx */; }; 274FF6121333315100317ECB /* ppdc-font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FD1333315100317ECB /* ppdc-font.cxx */; }; 274FF6131333315100317ECB /* ppdc-group.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FE1333315100317ECB /* ppdc-group.cxx */; }; 274FF6141333315100317ECB /* ppdc-import.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FF1333315100317ECB /* ppdc-import.cxx */; }; 274FF6151333315100317ECB /* ppdc-mediasize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6001333315100317ECB /* ppdc-mediasize.cxx */; }; 274FF6161333315100317ECB /* ppdc-message.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6011333315100317ECB /* ppdc-message.cxx */; }; 274FF6171333315100317ECB /* ppdc-option.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6021333315100317ECB /* ppdc-option.cxx */; }; 274FF6181333315100317ECB /* ppdc-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 274FF6031333315100317ECB /* ppdc-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 274FF6191333315100317ECB /* ppdc-profile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6041333315100317ECB /* ppdc-profile.cxx */; }; 274FF61A1333315100317ECB /* ppdc-shared.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6051333315100317ECB /* ppdc-shared.cxx */; }; 274FF61B1333315100317ECB /* ppdc-source.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6061333315100317ECB /* ppdc-source.cxx */; }; 274FF61C1333315100317ECB /* ppdc-string.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6071333315100317ECB /* ppdc-string.cxx */; }; 274FF61D1333315100317ECB /* ppdc-variable.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6081333315100317ECB /* ppdc-variable.cxx */; }; 274FF61E1333315100317ECB /* ppdc.h in Headers */ = {isa = PBXBuildFile; fileRef = 274FF6091333315100317ECB /* ppdc.h */; }; 274FF6231333321400317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 274FF6241333323B00317ECB /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 274FF6321333334A00317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 274FF6361333344400317ECB /* cups-deviced.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6351333344400317ECB /* cups-deviced.c */; }; 274FF6371333345900317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D713332CC700317ECB /* util.c */; }; 274FF64A1333398D00317ECB /* cups-exec.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6491333398D00317ECB /* cups-exec.c */; }; 274FF658133339D300317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 274FF65C133339FC00317ECB /* cups-lpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF65B133339FC00317ECB /* cups-lpd.c */; }; 274FF68513333B4300317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 274FF68613333B4300317ECB /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; 274FF68813333B6E00317ECB /* cupsfilter.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF68713333B6E00317ECB /* cupsfilter.c */; }; 274FF68B1333B1C400317ECB /* adminutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB51333052D00FCA411 /* adminutil.c */; }; 274FF68C1333B1C400317ECB /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; 274FF68D1333B1C400317ECB /* ppd-attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBA1333056300FCA411 /* ppd-attr.c */; }; 274FF68E1333B1C400317ECB /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBB1333056300FCA411 /* auth.c */; }; 274FF68F1333B1C400317ECB /* backchannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBC1333056300FCA411 /* backchannel.c */; }; 274FF6901333B1C400317ECB /* backend.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBD1333056300FCA411 /* backend.c */; }; 274FF6911333B1C400317ECB /* ppd-conflicts.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBF1333056300FCA411 /* ppd-conflicts.c */; }; 274FF6921333B1C400317ECB /* ppd-custom.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EC21333056300FCA411 /* ppd-custom.c */; }; 274FF6931333B1C400317ECB /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED1133305BB00FCA411 /* debug.c */; }; 274FF6941333B1C400317ECB /* dest.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED2133305BB00FCA411 /* dest.c */; }; 274FF6951333B1C400317ECB /* dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED3133305BB00FCA411 /* dir.c */; }; 274FF6961333B1C400317ECB /* ppd-emit.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED5133305BB00FCA411 /* ppd-emit.c */; }; 274FF6971333B1C400317ECB /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED6133305BB00FCA411 /* encode.c */; }; 274FF6981333B1C400317ECB /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED8133305BB00FCA411 /* file.c */; }; 274FF6991333B1C400317ECB /* getdevices.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDA133305BB00FCA411 /* getdevices.c */; }; 274FF69A1333B1C400317ECB /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDB133305BB00FCA411 /* getifaddrs.c */; }; 274FF69B1333B1C400317ECB /* getputfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDC133305BB00FCA411 /* getputfile.c */; }; 274FF69C1333B1C400317ECB /* globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDD133305BB00FCA411 /* globals.c */; }; 274FF69D1333B1C400317ECB /* http-addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDE133305BB00FCA411 /* http-addr.c */; }; 274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDF133305BB00FCA411 /* http-addrlist.c */; }; 274FF69F1333B1C400317ECB /* http-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE1133305BB00FCA411 /* http-support.c */; }; 274FF6A01333B1C400317ECB /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE2133305BB00FCA411 /* http.c */; }; 274FF6A11333B1C400317ECB /* ipp-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE5133305BB00FCA411 /* ipp-support.c */; }; 274FF6A21333B1C400317ECB /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE6133305BB00FCA411 /* ipp.c */; }; 274FF6A31333B1C400317ECB /* langprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE8133305BB00FCA411 /* langprintf.c */; }; 274FF6A41333B1C400317ECB /* language.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEA133305BB00FCA411 /* language.c */; }; 274FF6A51333B1C400317ECB /* ppd-localize.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEC133305BB00FCA411 /* ppd-localize.c */; }; 274FF6A61333B1C400317ECB /* ppd-mark.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EED133305BB00FCA411 /* ppd-mark.c */; }; 274FF6A71333B1C400317ECB /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEF133305BB00FCA411 /* md5.c */; }; 274FF6A81333B1C400317ECB /* md5passwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF0133305BB00FCA411 /* md5passwd.c */; }; 274FF6A91333B1C400317ECB /* notify.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF1133305BB00FCA411 /* notify.c */; }; 274FF6AA1333B1C400317ECB /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF2133305BB00FCA411 /* options.c */; }; 274FF6AB1333B1C400317ECB /* ppd-page.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF3133305BB00FCA411 /* ppd-page.c */; }; 274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF4133305BB00FCA411 /* ppd-cache.c */; }; 274FF6AD1333B1C400317ECB /* ppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF6133305BB00FCA411 /* ppd.c */; }; 274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF8133305BB00FCA411 /* pwg-media.c */; }; 274FF6AF1333B1C400317ECB /* request.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFB133305BB00FCA411 /* request.c */; }; 274FF6B01333B1C400317ECB /* sidechannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFC133305BB00FCA411 /* sidechannel.c */; }; 274FF6B11333B1C400317ECB /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFF133305BB00FCA411 /* snmp.c */; }; 274FF6B21333B1C400317ECB /* snprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F00133305BB00FCA411 /* snprintf.c */; }; 274FF6B31333B1C400317ECB /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; 274FF6B41333B1C400317ECB /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; 274FF6B51333B1C400317ECB /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; 274FF6B61333B1C400317ECB /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; 274FF6B71333B1C400317ECB /* usersys.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F08133305BB00FCA411 /* usersys.c */; }; 274FF6B81333B1C400317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F09133305BB00FCA411 /* util.c */; }; 274FF6C61333B1C400317ECB /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (); }; }; 276683671337A9E0000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683691337AA00000D33D0 /* cupsctl.c in Sources */ = {isa = PBXBuildFile; fileRef = 276683681337AA00000D33D0 /* cupsctl.c */; }; 276683B11337AD06000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683B21337AD06000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 276683B71337AD23000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683B81337AD23000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 276683B91337AD31000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683BA1337AD31000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 276683C31337B1B3000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683C41337B1B3000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 276683C91337B1C1000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683CA1337B1C1000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; 276683CD1337B201000D33D0 /* ppdc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683CC1337B201000D33D0 /* ppdc.cxx */; }; 276683CF1337B20D000D33D0 /* ppdhtml.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683CE1337B20D000D33D0 /* ppdhtml.cxx */; }; 276683D11337B21A000D33D0 /* ppdi.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D01337B21A000D33D0 /* ppdi.cxx */; }; 276683D31337B228000D33D0 /* ppdmerge.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D21337B228000D33D0 /* ppdmerge.cxx */; }; 276683D51337B237000D33D0 /* ppdpo.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D41337B237000D33D0 /* ppdpo.cxx */; }; 276683E21337B29C000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 276683E51337B2BE000D33D0 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; 276683FA1337F7A9000D33D0 /* ipptool.c in Sources */ = {isa = PBXBuildFile; fileRef = 276683F91337F7A9000D33D0 /* ipptool.c */; }; 276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 2767FC5219266A36000F61D3 /* testdest.c in Sources */ = {isa = PBXBuildFile; fileRef = 2767FC5119266A36000F61D3 /* testdest.c */; }; 2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 2767FC621926750C000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 2767FC631926750C000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 2767FC6819267538000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 2767FC6919267538000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 2767FC70192685E6000F61D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 2767FC7219268F06000F61D3 /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; }; 2767FC7319268F09000F61D3 /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; }; 2767FC7419268F0C000F61D3 /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; }; 278C58E3136B647200836530 /* testhttp.c in Sources */ = {isa = PBXBuildFile; fileRef = 278C58E2136B647200836530 /* testhttp.c */; }; 278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 278C58EB136B64B000836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 279AE6F52395B80F004DD600 /* libpam.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 279AE6F42395B80F004DD600 /* libpam.tbd */; }; 27A034821A8BDC3A00650675 /* lpadmin.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08D137A3F5200FAFEF6 /* lpadmin.c */; }; 27A034851A8BDC5C00650675 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 720DD6D31358FDDE0064AA82 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 720DD6D21358FDDE0064AA82 /* snmp.c */; }; 720DD6D413590AB90064AA82 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; }; 720E854320164E7B00C6C411 /* ipp-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854120164E7A00C6C411 /* ipp-file.c */; }; 720E854420164E7B00C6C411 /* ipp-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854120164E7A00C6C411 /* ipp-file.c */; }; 720E854520164E7B00C6C411 /* ipp-vars.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854220164E7A00C6C411 /* ipp-vars.c */; }; 720E854620164E7B00C6C411 /* ipp-vars.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854220164E7A00C6C411 /* ipp-vars.c */; }; 72220EB61333052D00FCA411 /* adminutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB51333052D00FCA411 /* adminutil.c */; }; 72220EC41333056300FCA411 /* adminutil.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB71333056300FCA411 /* adminutil.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220EC51333056300FCA411 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; 72220EC61333056300FCA411 /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB91333056300FCA411 /* array.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220EC71333056300FCA411 /* ppd-attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBA1333056300FCA411 /* ppd-attr.c */; }; 72220EC81333056300FCA411 /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBB1333056300FCA411 /* auth.c */; }; 72220EC91333056300FCA411 /* backchannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBC1333056300FCA411 /* backchannel.c */; }; 72220ECA1333056300FCA411 /* backend.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBD1333056300FCA411 /* backend.c */; }; 72220ECB1333056300FCA411 /* backend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EBE1333056300FCA411 /* backend.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220ECC1333056300FCA411 /* ppd-conflicts.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBF1333056300FCA411 /* ppd-conflicts.c */; }; 72220ECD1333056300FCA411 /* cups-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC01333056300FCA411 /* cups-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220ECE1333056300FCA411 /* cups.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC11333056300FCA411 /* cups.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220ECF1333056300FCA411 /* ppd-custom.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EC21333056300FCA411 /* ppd-custom.c */; }; 72220F0B133305BB00FCA411 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED1133305BB00FCA411 /* debug.c */; }; 72220F0C133305BB00FCA411 /* dest.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED2133305BB00FCA411 /* dest.c */; }; 72220F0D133305BB00FCA411 /* dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED3133305BB00FCA411 /* dir.c */; }; 72220F0E133305BB00FCA411 /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F0F133305BB00FCA411 /* ppd-emit.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED5133305BB00FCA411 /* ppd-emit.c */; }; 72220F10133305BB00FCA411 /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED6133305BB00FCA411 /* encode.c */; }; 72220F11133305BB00FCA411 /* file-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED7133305BB00FCA411 /* file-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F12133305BB00FCA411 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED8133305BB00FCA411 /* file.c */; }; 72220F13133305BB00FCA411 /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED9133305BB00FCA411 /* file.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F14133305BB00FCA411 /* getdevices.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDA133305BB00FCA411 /* getdevices.c */; }; 72220F15133305BB00FCA411 /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDB133305BB00FCA411 /* getifaddrs.c */; }; 72220F16133305BB00FCA411 /* getputfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDC133305BB00FCA411 /* getputfile.c */; }; 72220F17133305BB00FCA411 /* globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDD133305BB00FCA411 /* globals.c */; }; 72220F18133305BB00FCA411 /* http-addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDE133305BB00FCA411 /* http-addr.c */; }; 72220F19133305BB00FCA411 /* http-addrlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDF133305BB00FCA411 /* http-addrlist.c */; }; 72220F1A133305BB00FCA411 /* http-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE0133305BB00FCA411 /* http-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F1B133305BB00FCA411 /* http-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE1133305BB00FCA411 /* http-support.c */; }; 72220F1C133305BB00FCA411 /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE2133305BB00FCA411 /* http.c */; }; 72220F1D133305BB00FCA411 /* http.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE3133305BB00FCA411 /* http.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F1E133305BB00FCA411 /* ipp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE4133305BB00FCA411 /* ipp-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F1F133305BB00FCA411 /* ipp-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE5133305BB00FCA411 /* ipp-support.c */; }; 72220F20133305BB00FCA411 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE6133305BB00FCA411 /* ipp.c */; }; 72220F21133305BB00FCA411 /* ipp.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE7133305BB00FCA411 /* ipp.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F22133305BB00FCA411 /* langprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE8133305BB00FCA411 /* langprintf.c */; }; 72220F23133305BB00FCA411 /* language-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE9133305BB00FCA411 /* language-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F24133305BB00FCA411 /* language.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEA133305BB00FCA411 /* language.c */; }; 72220F25133305BB00FCA411 /* language.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEB133305BB00FCA411 /* language.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F26133305BB00FCA411 /* ppd-localize.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEC133305BB00FCA411 /* ppd-localize.c */; }; 72220F27133305BB00FCA411 /* ppd-mark.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EED133305BB00FCA411 /* ppd-mark.c */; }; 72220F28133305BB00FCA411 /* md5-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEE133305BB00FCA411 /* md5-internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F29133305BB00FCA411 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEF133305BB00FCA411 /* md5.c */; }; 72220F2A133305BB00FCA411 /* md5passwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF0133305BB00FCA411 /* md5passwd.c */; }; 72220F2B133305BB00FCA411 /* notify.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF1133305BB00FCA411 /* notify.c */; }; 72220F2C133305BB00FCA411 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF2133305BB00FCA411 /* options.c */; }; 72220F2D133305BB00FCA411 /* ppd-page.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF3133305BB00FCA411 /* ppd-page.c */; }; 72220F2E133305BB00FCA411 /* ppd-cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF4133305BB00FCA411 /* ppd-cache.c */; }; 72220F2F133305BB00FCA411 /* ppd-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF5133305BB00FCA411 /* ppd-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F30133305BB00FCA411 /* ppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF6133305BB00FCA411 /* ppd.c */; }; 72220F31133305BB00FCA411 /* ppd.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF7133305BB00FCA411 /* ppd.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F32133305BB00FCA411 /* pwg-media.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF8133305BB00FCA411 /* pwg-media.c */; }; 72220F33133305BB00FCA411 /* pwg-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF9133305BB00FCA411 /* pwg-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F35133305BB00FCA411 /* request.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFB133305BB00FCA411 /* request.c */; }; 72220F36133305BB00FCA411 /* sidechannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFC133305BB00FCA411 /* sidechannel.c */; }; 72220F37133305BB00FCA411 /* sidechannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFD133305BB00FCA411 /* sidechannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F38133305BB00FCA411 /* snmp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFE133305BB00FCA411 /* snmp-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F39133305BB00FCA411 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFF133305BB00FCA411 /* snmp.c */; }; 72220F3A133305BB00FCA411 /* snprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F00133305BB00FCA411 /* snprintf.c */; }; 72220F3B133305BB00FCA411 /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F3C133305BB00FCA411 /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; 72220F3D133305BB00FCA411 /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; 72220F3E133305BB00FCA411 /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F3F133305BB00FCA411 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; 72220F40133305BB00FCA411 /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; 72220F41133305BB00FCA411 /* transcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F07133305BB00FCA411 /* transcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F42133305BB00FCA411 /* usersys.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F08133305BB00FCA411 /* usersys.c */; }; 72220F43133305BB00FCA411 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F09133305BB00FCA411 /* util.c */; }; 72220F44133305BB00FCA411 /* versioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F0A133305BB00FCA411 /* versioning.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220F481333063D00FCA411 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F471333063D00FCA411 /* config.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F6613330A7000FCA411 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 72220F9013330B0C00FCA411 /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6913330B0C00FCA411 /* auth.c */; }; 72220F9113330B0C00FCA411 /* banners.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6B13330B0C00FCA411 /* banners.c */; }; 72220F9213330B0C00FCA411 /* cert.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6D13330B0C00FCA411 /* cert.c */; }; 72220F9313330B0C00FCA411 /* classes.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6F13330B0C00FCA411 /* classes.c */; }; 72220F9413330B0C00FCA411 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7113330B0C00FCA411 /* client.c */; }; 72220F9513330B0C00FCA411 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7313330B0C00FCA411 /* conf.c */; }; 72220F9613330B0C00FCA411 /* dirsvc.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7613330B0C00FCA411 /* dirsvc.c */; }; 72220F9713330B0C00FCA411 /* env.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7813330B0C00FCA411 /* env.c */; }; 72220F9813330B0C00FCA411 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7913330B0C00FCA411 /* ipp.c */; }; 72220F9913330B0C00FCA411 /* job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7A13330B0C00FCA411 /* job.c */; }; 72220F9A13330B0C00FCA411 /* listen.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7C13330B0C00FCA411 /* listen.c */; }; 72220F9B13330B0C00FCA411 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7D13330B0C00FCA411 /* log.c */; }; 72220F9C13330B0C00FCA411 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7E13330B0C00FCA411 /* main.c */; }; 72220F9D13330B0C00FCA411 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7F13330B0C00FCA411 /* network.c */; }; 72220F9E13330B0C00FCA411 /* policy.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8113330B0C00FCA411 /* policy.c */; }; 72220F9F13330B0C00FCA411 /* printers.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8313330B0C00FCA411 /* printers.c */; }; 72220FA013330B0C00FCA411 /* process.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8513330B0C00FCA411 /* process.c */; }; 72220FA113330B0C00FCA411 /* quotas.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8613330B0C00FCA411 /* quotas.c */; }; 72220FA313330B0C00FCA411 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8813330B0C00FCA411 /* select.c */; }; 72220FA413330B0C00FCA411 /* server.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8913330B0C00FCA411 /* server.c */; }; 72220FA513330B0C00FCA411 /* statbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8A13330B0C00FCA411 /* statbuf.c */; }; 72220FA613330B0C00FCA411 /* subscriptions.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8C13330B0C00FCA411 /* subscriptions.c */; }; 72220FA713330B0C00FCA411 /* sysman.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8E13330B0C00FCA411 /* sysman.c */; }; 72220FB613330BCE00FCA411 /* filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB213330BCE00FCA411 /* filter.c */; }; 72220FB713330BCE00FCA411 /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB313330BCE00FCA411 /* mime.c */; }; 72220FB813330BCE00FCA411 /* mime.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220FB413330BCE00FCA411 /* mime.h */; }; 72220FB913330BCE00FCA411 /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB513330BCE00FCA411 /* type.c */; }; 72220FBA13330BEE00FCA411 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 72220FBF13330C1000FCA411 /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; 722A24EF2178D00D000CAB20 /* debug-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24EE2178D00C000CAB20 /* debug-internal.h */; }; 722A24F02178D00D000CAB20 /* debug-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24EE2178D00C000CAB20 /* debug-internal.h */; }; 722A24F12178D00D000CAB20 /* debug-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24EE2178D00C000CAB20 /* debug-internal.h */; }; 722A24F32178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 722A24F42178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; }; 722A24F52178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; }; 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7234F41F1378A16F00D3E9C9 /* array-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724379081333E4A5009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7243790D1333E4E3009631B9 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790A1333E4E3009631B9 /* ipp.c */; }; 7243790E1333E4E3009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; 7243790F1333E4E3009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; 724379131333E516009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; 724379221333E928009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; 724379231333E928009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; 724379241333E928009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; 724379271333E93D009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 724379291333E952009631B9 /* lpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379281333E952009631B9 /* lpd.c */; }; 7243793B1333FB9D009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7243793D1333FD19009631B9 /* socket.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243793C1333FD19009631B9 /* socket.c */; }; 724379401333FD4B009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; 724379411333FD4B009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; 724379421333FD4B009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; 724379511333FEBB009631B9 /* dnssd.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379501333FEBB009631B9 /* dnssd.c */; }; 724379561333FF04009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 724379661333FF3B009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 724379C71333FFC7009631B9 /* usb.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379C51333FFC7009631B9 /* usb.c */; }; 724379CB1334000E009631B9 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; }; 724FA52A1CC0370C0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA52B1CC0370C0092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA52C1CC0370C0092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA52D1CC0370C0092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA52E1CC0370C0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA52F1CC0370C0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA5301CC0370C0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5361CC0372F0092477B /* testadmin.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF041192E3544001EF690 /* testadmin.c */; }; 724FA53D1CC037370092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA53E1CC037370092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA53F1CC037370092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA5401CC037370092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA5411CC037370092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA5421CC037370092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA5431CC037370092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5491CC037460092477B /* testarray.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF042192E3544001EF690 /* testarray.c */; }; 724FA5501CC037500092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA5511CC037500092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA5521CC037500092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA5531CC037500092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA5541CC037500092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA5551CC037500092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA5561CC037500092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA55C1CC0375F0092477B /* testcache.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF043192E3544001EF690 /* testcache.c */; }; 724FA5631CC037670092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA5641CC037670092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA5651CC037670092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA5661CC037670092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA5671CC037670092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA5681CC037670092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA5691CC037670092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA56F1CC037760092477B /* testconflicts.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF044192E3544001EF690 /* testconflicts.c */; }; 724FA5761CC037810092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5771CC037810092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA5781CC037810092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA5791CC037810092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA57A1CC037810092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA57B1CC037810092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA57C1CC037810092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA5821CC0378E0092477B /* testfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF045192E3544001EF690 /* testfile.c */; }; 724FA5891CC037980092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA58A1CC037980092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA58B1CC037980092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA58C1CC037980092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 724FA58D1CC037980092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 724FA58E1CC037980092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 724FA58F1CC037980092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5951CC037A50092477B /* testi18n.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF046192E3544001EF690 /* testi18n.c */; }; 724FA59C1CC037AA0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA59D1CC037AA0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA59E1CC037AA0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA59F1CC037AA0092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 724FA5A01CC037AA0092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 724FA5A11CC037AA0092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 724FA5A21CC037AA0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5A81CC037B70092477B /* testipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF047192E3544001EF690 /* testipp.c */; }; 724FA5AF1CC037C60092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5B01CC037C60092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA5B11CC037C60092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA5B21CC037C60092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 724FA5B31CC037C60092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 724FA5B41CC037C60092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 724FA5B51CC037C60092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5BB1CC037D30092477B /* testlang.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF048192E3544001EF690 /* testlang.c */; }; 724FA5C21CC037D90092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5C31CC037D90092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA5C41CC037D90092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA5C51CC037D90092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 724FA5C61CC037D90092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 724FA5C71CC037D90092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 724FA5C81CC037D90092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5CE1CC037E50092477B /* testlpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04D192E3602001EF690 /* testlpd.c */; }; 724FA5D71CC037F00092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5D81CC037F00092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA5D91CC037F00092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA5DA1CC037F00092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5DB1CC037F00092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA5E21CC037FD0092477B /* testoptions.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF049192E3544001EF690 /* testoptions.c */; }; 724FA5EB1CC038040092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA5EC1CC038040092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA5ED1CC038040092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA5EE1CC038040092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA5EF1CC038040092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA5F61CC0380F0092477B /* testppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04A192E3544001EF690 /* testppd.c */; }; 724FA5FF1CC038190092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6001CC038190092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6011CC038190092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6021CC038190092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6031CC038190092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA60A1CC038250092477B /* testpwg.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04B192E3544001EF690 /* testpwg.c */; }; 724FA6131CC0382B0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6141CC0382B0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6151CC0382B0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6161CC0382B0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6171CC0382B0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA61E1CC0383B0092477B /* testraster.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F89DA21B3AC43B00E5A4B7 /* testraster.c */; }; 724FA6271CC038410092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6281CC038410092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6291CC038410092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA62A1CC038410092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA62B1CC038410092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA6321CC038510092477B /* testsnmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04C192E3544001EF690 /* testsnmp.c */; }; 724FA63B1CC038560092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA63C1CC038560092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA63D1CC038560092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA63E1CC038560092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA63F1CC038560092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA6461CC038650092477B /* testspeed.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04E192E3602001EF690 /* testspeed.c */; }; 724FA64F1CC0386E0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6501CC0386E0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6511CC0386E0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6521CC0386E0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6531CC0386E0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA65A1CC038790092477B /* testsub.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF04F192E3602001EF690 /* testsub.c */; }; 724FA6661CC038A50092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6671CC038A50092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6681CC038A50092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6691CC038A50092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA66A1CC038A50092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA66B1CC038A50092477B /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; 724FA6711CC038B30092477B /* test1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA65B1CC0389F0092477B /* test1284.c */; }; 724FA6781CC038BD0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA6791CC038BD0092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA67A1CC038BD0092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA67B1CC038BD0092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA67C1CC038BD0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA67D1CC038BD0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA67E1CC038BD0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6841CC038CA0092477B /* testbackend.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA65C1CC0389F0092477B /* testbackend.c */; }; 724FA68D1CC038D90092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA68E1CC038D90092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA68F1CC038D90092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6901CC038D90092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6911CC038D90092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA6981CC038E70092477B /* testsupplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA65D1CC0389F0092477B /* testsupplies.c */; }; 724FA69F1CC039200092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; }; 724FA6A01CC039200092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5A1926750C000F61D3 /* libiconv.dylib */; }; 724FA6A11CC039200092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; }; 724FA6A21CC039200092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; }; 724FA6A31CC039200092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; }; 724FA6A41CC039200092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; }; 724FA6A51CC039200092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6AB1CC0392E0092477B /* testcgi.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03D192E3498001EF690 /* testcgi.c */; }; 724FA6B21CC0393E0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6B31CC0393E0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6B41CC0393E0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6B51CC0393E0092477B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 724FA6B61CC0393E0092477B /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 724FA6B71CC0393E0092477B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 724FA6B81CC0393E0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6BE1CC0394C0092477B /* testhi.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03E192E3498001EF690 /* testhi.c */; }; 724FA6C71CC0395A0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6C81CC0395A0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6C91CC0395A0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6CA1CC0395A0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6CB1CC0395A0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA6D21CC039680092477B /* testtemplate.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03F192E3498001EF690 /* testtemplate.c */; }; 724FA6E01CC039DE0092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6E11CC039DE0092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6E21CC039DE0092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6E31CC039DE0092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6E41CC039DE0092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA6EB1CC039EB0092477B /* testnotify.c in Sources */ = {isa = PBXBuildFile; fileRef = 724FA6D71CC039D00092477B /* testnotify.c */; }; 724FA6F51CC03A210092477B /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 724FA6F61CC03A210092477B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 724FA6F71CC03A210092477B /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 724FA6F81CC03A210092477B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 724FA6F91CC03A210092477B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 724FA7001CC03A2F0092477B /* testcatalog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 724FA6EC1CC03A1D0092477B /* testcatalog.cxx */; }; 724FA7141CC03A990092477B /* filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB213330BCE00FCA411 /* filter.c */; }; 724FA7151CC03A990092477B /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB313330BCE00FCA411 /* mime.c */; }; 724FA7161CC03A990092477B /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB513330BCE00FCA411 /* type.c */; }; 724FA71A1CC03A990092477B /* mime.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220FB413330BCE00FCA411 /* mime.h */; }; 724FA71B1CC03A990092477B /* mime-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7271883C1374AB14001A2036 /* mime-private.h */; }; 724FA7241CC03AAF0092477B /* ppdc-array.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F51333315100317ECB /* ppdc-array.cxx */; }; 724FA7251CC03AAF0092477B /* ppdc-attr.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F61333315100317ECB /* ppdc-attr.cxx */; }; 724FA7261CC03AAF0092477B /* ppdc-catalog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F71333315100317ECB /* ppdc-catalog.cxx */; }; 724FA7271CC03AAF0092477B /* ppdc-choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F81333315100317ECB /* ppdc-choice.cxx */; }; 724FA7281CC03AAF0092477B /* ppdc-constraint.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F91333315100317ECB /* ppdc-constraint.cxx */; }; 724FA7291CC03AAF0092477B /* ppdc-driver.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FA1333315100317ECB /* ppdc-driver.cxx */; }; 724FA72A1CC03AAF0092477B /* ppdc-file.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FB1333315100317ECB /* ppdc-file.cxx */; }; 724FA72B1CC03AAF0092477B /* ppdc-filter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FC1333315100317ECB /* ppdc-filter.cxx */; }; 724FA72C1CC03AAF0092477B /* ppdc-font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FD1333315100317ECB /* ppdc-font.cxx */; }; 724FA72D1CC03AAF0092477B /* ppdc-group.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FE1333315100317ECB /* ppdc-group.cxx */; }; 724FA72E1CC03AAF0092477B /* ppdc-import.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FF1333315100317ECB /* ppdc-import.cxx */; }; 724FA72F1CC03AAF0092477B /* ppdc-mediasize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6001333315100317ECB /* ppdc-mediasize.cxx */; }; 724FA7301CC03AAF0092477B /* ppdc-message.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6011333315100317ECB /* ppdc-message.cxx */; }; 724FA7311CC03AAF0092477B /* ppdc-option.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6021333315100317ECB /* ppdc-option.cxx */; }; 724FA7321CC03AAF0092477B /* ppdc-profile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6041333315100317ECB /* ppdc-profile.cxx */; }; 724FA7331CC03AAF0092477B /* ppdc-shared.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6051333315100317ECB /* ppdc-shared.cxx */; }; 724FA7341CC03AAF0092477B /* ppdc-source.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6061333315100317ECB /* ppdc-source.cxx */; }; 724FA7351CC03AAF0092477B /* ppdc-string.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6071333315100317ECB /* ppdc-string.cxx */; }; 724FA7361CC03AAF0092477B /* ppdc-variable.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6081333315100317ECB /* ppdc-variable.cxx */; }; 724FA73C1CC03AAF0092477B /* ppdc-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 274FF6031333315100317ECB /* ppdc-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724FA7491CC03ACC0092477B /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 724FA7511CC03AF20092477B /* help-index.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF033192E3498001EF690 /* help-index.c */; }; 724FA7521CC03AF20092477B /* help.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF035192E3498001EF690 /* help.c */; }; 724FA7531CC03AF20092477B /* html.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF036192E3498001EF690 /* html.c */; }; 724FA7541CC03AF20092477B /* ipp-var.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF037192E3498001EF690 /* ipp-var.c */; }; 724FA7551CC03AF20092477B /* search.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03B192E3498001EF690 /* search.c */; }; 724FA7561CC03AF20092477B /* template.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03C192E3498001EF690 /* template.c */; }; 724FA7571CC03AF20092477B /* var.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF040192E3498001EF690 /* var.c */; }; 724FA75D1CC03AF60092477B /* help-index.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF033192E3498001EF690 /* help-index.c */; }; 724FA75E1CC03AF60092477B /* help.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF035192E3498001EF690 /* help.c */; }; 724FA75F1CC03AF60092477B /* html.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF036192E3498001EF690 /* html.c */; }; 724FA7601CC03AF60092477B /* ipp-var.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF037192E3498001EF690 /* ipp-var.c */; }; 724FA7611CC03AF60092477B /* search.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03B192E3498001EF690 /* search.c */; }; 724FA7621CC03AF60092477B /* template.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF03C192E3498001EF690 /* template.c */; }; 724FA7631CC03AF60092477B /* var.c in Sources */ = {isa = PBXBuildFile; fileRef = 727EF040192E3498001EF690 /* var.c */; }; 724FA76C1CC03B4D0092477B /* cgi-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 727EF030192E3498001EF690 /* cgi-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724FA76D1CC03B4D0092477B /* cgi.h in Headers */ = {isa = PBXBuildFile; fileRef = 727EF031192E3498001EF690 /* cgi.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724FA76F1CC03B820092477B /* cgi-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 727EF030192E3498001EF690 /* cgi-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724FA7701CC03B820092477B /* cgi.h in Headers */ = {isa = PBXBuildFile; fileRef = 727EF031192E3498001EF690 /* cgi.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7253C454216E97FF00494ADD /* raster-error.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A691336FA8A004BB496 /* raster-error.c */; }; 7253C455216E980000494ADD /* raster-error.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A691336FA8A004BB496 /* raster-error.c */; }; 7253C456216E980200494ADD /* raster-error.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A691336FA8A004BB496 /* raster-error.c */; }; 7253C457216E981000494ADD /* raster-stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6B1336FA8A004BB496 /* raster-stream.c */; }; 7253C458216E981200494ADD /* raster-stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6B1336FA8A004BB496 /* raster-stream.c */; }; 7253C459216E981200494ADD /* raster-stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6B1336FA8A004BB496 /* raster-stream.c */; }; 7253C45A216E981900494ADD /* raster-interpret.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6A1336FA8A004BB496 /* raster-interpret.c */; }; 7253C45B216E981A00494ADD /* raster-interpret.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6A1336FA8A004BB496 /* raster-interpret.c */; }; 7253C45E216ED51500494ADD /* raster-interstub.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45C216ED51400494ADD /* raster-interstub.c */; }; 7253C460216ED51500494ADD /* raster-interstub.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45C216ED51400494ADD /* raster-interstub.c */; }; 7253C461216ED51500494ADD /* raster-interstub.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45C216ED51400494ADD /* raster-interstub.c */; }; 7253C462216ED51500494ADD /* raster-interstub.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45C216ED51400494ADD /* raster-interstub.c */; }; 7253C463216ED51500494ADD /* raster-stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45D216ED51500494ADD /* raster-stubs.c */; }; 7253C464216ED51500494ADD /* raster-stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45D216ED51500494ADD /* raster-stubs.c */; }; 7253C465216ED51500494ADD /* raster-stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45D216ED51500494ADD /* raster-stubs.c */; }; 7253C466216ED51500494ADD /* raster-stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45D216ED51500494ADD /* raster-stubs.c */; }; 7253C467216ED51500494ADD /* raster-stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = 7253C45D216ED51500494ADD /* raster-stubs.c */; }; 7253C468216ED5D300494ADD /* raster.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFA133305BB00FCA411 /* raster.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7253C469216ED5D400494ADD /* raster.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFA133305BB00FCA411 /* raster.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7253C46B216ED5E400494ADD /* raster-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC76192696A0000F61D3 /* raster-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7253C46C216ED5E500494ADD /* raster-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC76192696A0000F61D3 /* raster-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7253C46F216ED69200494ADD /* pwg.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC7519269687000F61D3 /* pwg.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7253C470216ED69400494ADD /* pwg.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC7519269687000F61D3 /* pwg.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7253C471216ED6C400494ADD /* array-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7234F41F1378A16F00D3E9C9 /* array-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7258EAED134594EB009286F1 /* rastertopwg.c in Sources */ = {isa = PBXBuildFile; fileRef = 7258EAEC134594EB009286F1 /* rastertopwg.c */; }; 7258EAF413459B6D009286F1 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; 726AD702135E8A90002C930D /* ippeveprinter.c in Sources */ = {isa = PBXBuildFile; fileRef = 726AD701135E8A90002C930D /* ippeveprinter.c */; }; 7271883D1374AB14001A2036 /* mime-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7271883C1374AB14001A2036 /* mime-private.h */; }; 727AD5B719100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; }; 727AD5B819100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; }; 7284F9F01BFCCDB10026F886 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 7284F9EF1BFCCD940026F886 /* hash.c */; }; 7284F9F11BFCCDB20026F886 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 7284F9EF1BFCCD940026F886 /* hash.c */; }; 728FB7E91536161C005426E1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 728FB7EA1536161C005426E1 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 728FB7EB1536161C005426E1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 728FB7ED1536161C005426E1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 728FB7EE15361642005426E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 728FB7F11536167A005426E1 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 728FB7F21536167A005426E1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 729181B4201155C1005E7560 /* libcupsimage_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 724FA70F1CC03A490092477B /* libcupsimage_static.a */; }; 729181B5201155C1005E7560 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 729181B6201155C1005E7560 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 729181B7201155C1005E7560 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 729181B8201155C1005E7560 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 729181B9201155C1005E7560 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 729181BF201155F1005E7560 /* testclient.c in Sources */ = {isa = PBXBuildFile; fileRef = 729181AB20115597005E7560 /* testclient.c */; }; 72A8B3D71C188CB800A1A547 /* ppd-util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A8B3D61C188BDE00A1A547 /* ppd-util.c */; }; 72A8B3D81C188CB900A1A547 /* ppd-util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A8B3D61C188BDE00A1A547 /* ppd-util.c */; }; 72BFD5FB191AF0A30005DA37 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; }; 72BFD5FC191AF0A30005DA37 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 72BFD5FD191AF0A30005DA37 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 72BFD5FE191AF0A30005DA37 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 72BFD5FF191AF0A30005DA37 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 72BFD600191AF0A30005DA37 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 72BFD601191AF0A30005DA37 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 72BFD602191AF1270005DA37 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 72BFD603191AF1270005DA37 /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; }; 72BFD604191AF1270005DA37 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 72BFD605191AF1270005DA37 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EF1536167A005426E1 /* libiconv.dylib */; }; 72BFD606191AF1270005DA37 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7F01536167A005426E1 /* libresolv.dylib */; }; 72BFD607191AF1270005DA37 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 72BFD608191AF1270005DA37 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 72BFD609191AF14C0005DA37 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 72C16CB9137B195D007E4BF4 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72C16CB8137B195D007E4BF4 /* file.c */; }; 72CEF95618A966E000FA9B81 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 72CF95E318A13543000FCAE4 /* dest-job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E018A13543000FCAE4 /* dest-job.c */; }; 72CF95E418A13543000FCAE4 /* dest-localization.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E118A13543000FCAE4 /* dest-localization.c */; }; 72CF95E518A13543000FCAE4 /* dest-options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95E218A13543000FCAE4 /* dest-options.c */; }; 72CF95EC18A19134000FCAE4 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 72CF95F318A19165000FCAE4 /* ippfind.c in Sources */ = {isa = PBXBuildFile; fileRef = 72CF95F218A19165000FCAE4 /* ippfind.c */; }; 72D53A2A15B49110003F877F /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; }; 72D53A2D15B4913D003F877F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 72D53A2E15B4915B003F877F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 72D53A2F15B49174003F877F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 72D53A3015B4923F003F877F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 72D53A3115B4923F003F877F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 72D53A3215B4923F003F877F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; 72D53A3415B4925B003F877F /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A3315B4925B003F877F /* ApplicationServices.framework */; }; 72D53A3515B49270003F877F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 72D53A3815B4929D003F877F /* colorman.c in Sources */ = {isa = PBXBuildFile; fileRef = 72D53A3615B4929D003F877F /* colorman.c */; }; 72D53A3A15B492FA003F877F /* libpam.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A3915B492FA003F877F /* libpam.dylib */; }; 72D53A3B15B4930A003F877F /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; }; 72D53A3C15B4930A003F877F /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; 72F75A5C1336F988004BB496 /* cupstestppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A5B1336F988004BB496 /* cupstestppd.c */; }; 72F75A671336FA38004BB496 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 270CCDB1135E3CDE00007BE2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 270CCDA6135E3C9E00007BE2; remoteInfo = testmime; }; 270CCDB7135E3CFD00007BE2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 270D02151D707E0200EA9403 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 270D02271D707E5100EA9403 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 270D02131D707E0200EA9403; remoteInfo = testcreds; }; 271284901CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 271284921CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7581CC03AF60092477B; remoteInfo = libcupscgi_static; }; 271284941CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7011CC03A490092477B; remoteInfo = libcupsimage_static; }; 271284961CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7101CC03A990092477B; remoteInfo = libcupsmime_static; }; 271284981CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7201CC03AAF0092477B; remoteInfo = libcupsppdc_static; }; 2712849A1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA65E1CC038A50092477B; remoteInfo = test1284; }; 2712849C1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5241CC0370C0092477B; remoteInfo = testadmin; }; 2712849E1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5371CC037370092477B; remoteInfo = testarray; }; 271284A01CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6721CC038BD0092477B; remoteInfo = testbackend; }; 271284A21CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA54A1CC037500092477B; remoteInfo = testcache; }; 271284A41CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6ED1CC03A210092477B; remoteInfo = testcatalog; }; 271284A61CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6991CC039200092477B; remoteInfo = testcgi; }; 271284A81CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA55D1CC037670092477B; remoteInfo = testconflicts; }; 271284AA1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5701CC037810092477B; remoteInfo = testfile; }; 271284AC1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6AC1CC0393E0092477B; remoteInfo = testhi; }; 271284AE1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5831CC037980092477B; remoteInfo = testi18n; }; 271284B01CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5961CC037AA0092477B; remoteInfo = testipp; }; 271284B21CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5A91CC037C60092477B; remoteInfo = testlang; }; 271284B41CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5BC1CC037D90092477B; remoteInfo = testlpd; }; 271284B61CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6D81CC039DE0092477B; remoteInfo = testnotify; }; 271284B81CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5CF1CC037F00092477B; remoteInfo = testoptions; }; 271284BA1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5E31CC038040092477B; remoteInfo = testppd; }; 271284BC1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA5F71CC038190092477B; remoteInfo = testpwg; }; 271284BE1CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA60B1CC0382B0092477B; remoteInfo = testraster; }; 271284C01CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA61F1CC038410092477B; remoteInfo = testsnmp; }; 271284C21CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6331CC038560092477B; remoteInfo = testspeed; }; 271284C41CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6471CC0386E0092477B; remoteInfo = testsub; }; 271284C61CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6851CC038D90092477B; remoteInfo = testsupplies; }; 271284C81CC11FA500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA6BF1CC0395A0092477B; remoteInfo = testtemplate; }; 271284CA1CC122D000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7581CC03AF60092477B; remoteInfo = libcupscgi_static; }; 271284CC1CC122E400E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7201CC03AAF0092477B; remoteInfo = libcupsppdc_static; }; 271284CE1CC122ED00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7581CC03AF60092477B; remoteInfo = libcupscgi_static; }; 271284D31CC1232500E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7581CC03AF60092477B; remoteInfo = libcupscgi_static; }; 271284D51CC1234D00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7101CC03A990092477B; remoteInfo = libcupsmime_static; }; 271284E31CC1261900E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271284F01CC1264B00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 2712850A1CC1267A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285171CC1269700E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285241CC126AA00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285311CC1270B00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 2712853E1CC1271E00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 2712854B1CC1272D00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285581CC1274300E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285651CC1275200E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285721CC1276400E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 2712857D1CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271284E11CC1261900E517C7; remoteInfo = cancel; }; 2712857F1CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271284EE1CC1264B00E517C7; remoteInfo = cupsaccept; }; 271285831CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285081CC1267A00E517C7; remoteInfo = lp; }; 271285851CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285151CC1269700E517C7; remoteInfo = lpc; }; 271285871CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285221CC126AA00E517C7; remoteInfo = lpinfo; }; 271285891CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2712852F1CC1270B00E517C7; remoteInfo = lpmove; }; 2712858B1CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2712853C1CC1271E00E517C7; remoteInfo = lpoptions; }; 2712858D1CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285491CC1272D00E517C7; remoteInfo = lpq; }; 2712858F1CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285561CC1274300E517C7; remoteInfo = lpr; }; 271285911CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285631CC1275200E517C7; remoteInfo = lprm; }; 271285931CC1295A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285701CC1276400E517C7; remoteInfo = lpstat; }; 271285971CC12D1300E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285A51CC12D3A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285B31CC12D4E00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285C11CC12D5E00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285CF1CC12DBF00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285DC1CC12DDF00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285E91CC12E2D00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271285F71CC12EEB00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286091CC12F0B00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286191CC12F1A00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286341CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285951CC12D1300E517C7; remoteInfo = admin.cgi; }; 271286361CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285A31CC12D3A00E517C7; remoteInfo = classes.cgi; }; 271286381CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285CD1CC12DBF00E517C7; remoteInfo = commandtops; }; 2712863A1CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285DA1CC12DDF00E517C7; remoteInfo = gziptoany; }; 2712863C1CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285B11CC12D4E00E517C7; remoteInfo = jobs.cgi; }; 2712863E1CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285BF1CC12D5E00E517C7; remoteInfo = printers.cgi; }; 271286401CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285E71CC12E2D00E517C7; remoteInfo = pstops; }; 271286421CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271285F51CC12EEB00E517C7; remoteInfo = rastertoepson; }; 271286441CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286051CC12F0B00E517C7; remoteInfo = rastertohp; }; 271286461CC12F9000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286151CC12F1A00E517C7; remoteInfo = rastertolabel; }; 271286591CC1309000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 2712866F1CC1310E00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 271286891CC13DC000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 2712869A1CC13DF100E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 271286AB1CC13DFF00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 271286BC1CC13E2100E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286CD1CC13E5B00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286DB1CC13EF400E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286981CC13DF100E517C7; remoteInfo = po2strings; }; 271286DD1CC13EF400E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286A91CC13DFF00E517C7; remoteInfo = strings2po; }; 271286DF1CC13EF400E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286571CC1309000E517C7; remoteInfo = tlscheck; }; 271286E11CC13F0100E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286BA1CC13E2100E517C7; remoteInfo = bcp; }; 271286E31CC13F0100E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286CB1CC13E5B00E517C7; remoteInfo = tbcp; }; 271286E71CC13F2000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271286F71CC13F3F00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 271287051CC13F8F00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286E51CC13F2000E517C7; remoteInfo = mailto; }; 271287071CC13F8F00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271286F51CC13F3F00E517C7; remoteInfo = rss; }; 2712870B1CC13FAB00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 2712871B1CC13FFA00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 271287091CC13FAB00E517C7; remoteInfo = mantohtml; }; 2712872E1CC140DF00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 271287301CC140DF00E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724FA7201CC03AAF0092477B; remoteInfo = libcupsppdc_static; }; 271287351CC1411000E517C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2712871E1CC140BE00E517C7; remoteInfo = genstrings; }; 273B1EC1226B3F2600428143 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 273B1E9A226B3E4800428143; remoteInfo = ippevepcl; }; 273B1EC3226B3F2600428143 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 273B1EAB226B3E5200428143; remoteInfo = ippeveps; }; 273B1EC5226B41E600428143 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 273B1EC8226B420500428143 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 273B1ECB226B421700428143 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 273BF6C81333B5410022CAAB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 273BF6BC1333B5000022CAAB; remoteInfo = testcups; }; 274770D32345342B0089BC31 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 274770E32345347D0089BC31 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274770D12345342B0089BC31; remoteInfo = testthreads; }; 274FF5DB13332CF900317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF5E213332D4300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF5E413332D4300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220FAB13330B2200FCA411; remoteInfo = libcupsmime; }; 274FF5E613332D4300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220F5A13330A5A00FCA411; remoteInfo = cupsd; }; 274FF5E813332D4300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5CB13332B1F00317ECB; remoteInfo = "cups-driverd"; }; 274FF5F2133330FD00317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF61F1333316200317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 274FF621133331D300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 274FF6331333335200317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF6381333348400317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6281333333600317ECB; remoteInfo = "cups-deviced"; }; 274FF647133335A300317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF63D1333358B00317ECB; remoteInfo = "cups-exec"; }; 274FF659133339D900317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF65D13333A3400317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF64E133339C400317ECB; remoteInfo = "cups-lpd"; }; 274FF68113333B3C00317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 274FF68313333B3C00317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220FAB13330B2200FCA411; remoteInfo = libcupsmime; }; 274FF6E11333B33F00317ECB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF67713333B2F00317ECB; remoteInfo = cupsfilter; }; 276683651337A9D6000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 2766836A1337AA25000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2766835B1337A9B6000D33D0; remoteInfo = cupsctl; }; 276683AD1337ACF9000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683AF1337ACF9000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 276683B31337AD18000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683B51337AD18000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 276683BB1337AE49000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683BD1337AE49000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 276683BF1337B1AD000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683C11337B1AD000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 276683C51337B1BC000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683C71337B1BC000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF5ED133330C800317ECB; remoteInfo = libcupsppdc; }; 276683D61337B24A000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2766836F1337AC79000D33D0; remoteInfo = ppdc; }; 276683D81337B24A000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2766837C1337AC8C000D33D0; remoteInfo = ppdhtml; }; 276683DA1337B24A000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 276683891337AC97000D33D0; remoteInfo = ppdi; }; 276683DC1337B24A000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 276683961337ACA2000D33D0; remoteInfo = ppdmerge; }; 276683DE1337B24A000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 276683A31337ACAB000D33D0; remoteInfo = ppdpo; }; 276683E01337B299000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683E31337B2BA000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72F75A601336F9A3004BB496; remoteInfo = libcupsimage; }; 276683FB1337F7B3000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 276683FE1337F7C5000D33D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 276683EF1337F78E000D33D0; remoteInfo = ipptool; }; 2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 2767FC5319267469000F61D3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 276683EF1337F78E000D33D0; remoteInfo = ipptool; }; 2767FC5519267469000F61D3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2767FC4619266A0D000F61D3; remoteInfo = testdest; }; 278C58D5136B641D00836530 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 278C58CA136B640300836530; remoteInfo = testhttp; }; 278C58D7136B642F00836530 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 27A034831A8BDC4A00650675 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 27A034861A8BDC6900650675 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 27A0347A1A8BDB1200650675; remoteInfo = lpadmin; }; 720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 720DD6D01358FDBE0064AA82 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 720DD6C11358FD5F0064AA82; remoteInfo = snmp; }; 72220F6413330A6500FCA411 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 72220FBB13330C0500FCA411 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 72220FBD13330C0B00FCA411 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220FAB13330B2200FCA411; remoteInfo = libcupsmime; }; 724379061333E49B009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 724379101333E4EA009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724378FC1333E43E009631B9; remoteInfo = ipp; }; 724379251333E932009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 7243792A1333E962009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724379171333E532009631B9; remoteInfo = lpd; }; 724379391333FB95009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 7243793E1333FD23009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 7243792F1333FB85009631B9; remoteInfo = socket; }; 724379521333FECE009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 724379461333FEA9009631B9; remoteInfo = dnssd; }; 724379541333FEFE009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 724379641333FF2E009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 724379C21333FF7D009631B9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 7243795A1333FF1D009631B9; remoteInfo = usb; }; 724FA5261CC0370C0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5391CC037370092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA54C1CC037500092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA55F1CC037670092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5721CC037810092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5851CC037980092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5981CC037AA0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5AB1CC037C60092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5BE1CC037D90092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5D11CC037F00092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5E51CC038040092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA5F91CC038190092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA60D1CC0382B0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6211CC038410092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6351CC038560092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6491CC0386E0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6601CC038A50092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6741CC038BD0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6871CC038D90092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA69B1CC039200092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6AE1CC0393E0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6C11CC0395A0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6DA1CC039DE0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA6EF1CC03A210092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 724FA7431CC03ACC0092477B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 7258EAEE13459ADA009286F1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 7258EAE1134594C4009286F1; remoteInfo = rastertopwg; }; 7258EAF013459B67009286F1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 726AD703135E8AA1002C930D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 726AD6F6135E88F0002C930D; remoteInfo = ippserver; }; 729181B0201155C1005E7560 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 729181C02011560E005E7560 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 2712866B1CC1310E00E517C7; remoteInfo = rasterbench; }; 729181C22011560E005E7560 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 729181AC201155C1005E7560; remoteInfo = testclient; }; 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 726AD6F6135E88F0002C930D; remoteInfo = ippserver; }; 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72CF95E618A19134000FCAE4; remoteInfo = ippfind; }; 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; 72CF95E818A19134000FCAE4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 72F75A651336FA30004BB496 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72220EAD1333047D00FCA411; remoteInfo = libcups; }; 72F75A701336FACD004BB496 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72F75A601336F9A3004BB496; remoteInfo = libcupsimage; }; 72F75A721336FACD004BB496 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; proxyType = 1; remoteGlobalIDString = 72F75A511336F950004BB496; remoteInfo = cupstestppd; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 270CCDA5135E3C9E00007BE2 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 270D02201D707E0200EA9403 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271284E81CC1261900E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271284F51CC1264B00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712850F1CC1267A00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712851C1CC1269700E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285291CC126AA00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285361CC1270B00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285431CC1271E00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285501CC1272D00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712855D1CC1274300E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712856A1CC1275200E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285771CC1276400E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712859C1CC12D1300E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285AB1CC12D3A00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285B91CC12D4E00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285C71CC12D5E00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285D41CC12DBF00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285E11CC12DDF00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285EE1CC12E2D00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271285FC1CC12EEB00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712860F1CC12F0B00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2712861F1CC12F1A00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286631CC1309000E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286791CC1310E00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286921CC13DC000E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286A31CC13DF100E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286B41CC13DFF00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286C51CC13E2100E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286D51CC13E5B00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286EF1CC13F2000E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271286FF1CC13F3F00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271287141CC13FAB00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 271287281CC140BE00E517C7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 273B1EA6226B3E4800428143 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 273B1EB7226B3E5200428143 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 273BF6BB1333B5000022CAAB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274770DC2345342B0089BC31 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274FF5CA13332B1F00317ECB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274FF6271333333600317ECB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274FF63C1333358B00317ECB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274FF64D133339C400317ECB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 274FF67613333B2F00317ECB /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2766835A1337A9B6000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2766836E1337AC79000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2766837B1337AC8C000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 276683881337AC97000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 276683951337ACA2000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 276683A21337ACAB000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 276683EE1337F78E000D33D0 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 2767FC4C19266A0D000F61D3 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 278C58C9136B640300836530 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 27A034791A8BDB1200650675 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 720DD6C01358FD5F0064AA82 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 72220F5913330A5A00FCA411 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724378FB1333E43E009631B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724379161333E532009631B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 7243792E1333FB85009631B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724379451333FEA9009631B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724379591333FF1D009631B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5311CC0370C0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5441CC037370092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5571CC037500092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA56A1CC037670092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA57D1CC037810092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5901CC037980092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5A31CC037AA0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5B61CC037C60092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5C91CC037D90092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5DD1CC037F00092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA5F11CC038040092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6051CC038190092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6191CC0382B0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA62D1CC038410092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6411CC038560092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6551CC0386E0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA66C1CC038A50092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA67F1CC038BD0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6931CC038D90092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6A61CC039200092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6B91CC0393E0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6CD1CC0395A0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6E61CC039DE0092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 724FA6FB1CC03A210092477B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 7258EAE0134594C4009286F1 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 726AD6F5135E88F0002C930D /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 729181BA201155C1005E7560 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 72CF95ED18A19134000FCAE4 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 72F75A501336F950004BB496 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2706965A1CADF3E200FFE5FB /* libcups_ios.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; 270B267D17F5C06700C8A3A9 /* tls-darwin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../cups/tls-darwin.c"; sourceTree = ""; }; 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../cups/tls-gnutls.c"; sourceTree = ""; }; 270B268117F5C5D600C8A3A9 /* tls-sspi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-sspi.c"; path = "../cups/tls-sspi.c"; sourceTree = ""; }; 270CCDA7135E3C9E00007BE2 /* testmime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testmime; sourceTree = BUILT_PRODUCTS_DIR; }; 270CCDBB135E3D3E00007BE2 /* testmime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testmime.c; path = ../scheduler/testmime.c; sourceTree = ""; }; 270D02241D707E0200EA9403 /* testcreds */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcreds; sourceTree = BUILT_PRODUCTS_DIR; }; 270D02251D707E3700EA9403 /* testcreds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcreds.c; path = ../cups/testcreds.c; sourceTree = ""; }; 271284DD1CC125FC00E517C7 /* lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lpc.c; path = ../berkeley/lpc.c; sourceTree = ""; }; 271284DE1CC125FC00E517C7 /* lpq.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lpq.c; path = ../berkeley/lpq.c; sourceTree = ""; }; 271284DF1CC125FC00E517C7 /* lpr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lpr.c; path = ../berkeley/lpr.c; sourceTree = ""; }; 271284E01CC125FC00E517C7 /* lprm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lprm.c; path = ../berkeley/lprm.c; sourceTree = ""; }; 271284EC1CC1261900E517C7 /* cancel */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cancel; sourceTree = BUILT_PRODUCTS_DIR; }; 271284F91CC1264B00E517C7 /* cupsaccept */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaccept; sourceTree = BUILT_PRODUCTS_DIR; }; 271285131CC1267A00E517C7 /* lp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lp; sourceTree = BUILT_PRODUCTS_DIR; }; 271285201CC1269700E517C7 /* lpc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpc; sourceTree = BUILT_PRODUCTS_DIR; }; 2712852D1CC126AA00E517C7 /* lpinfo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpinfo; sourceTree = BUILT_PRODUCTS_DIR; }; 2712853A1CC1270B00E517C7 /* lpmove */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpmove; sourceTree = BUILT_PRODUCTS_DIR; }; 271285471CC1271E00E517C7 /* lpoptions */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpoptions; sourceTree = BUILT_PRODUCTS_DIR; }; 271285541CC1272D00E517C7 /* lpq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpq; sourceTree = BUILT_PRODUCTS_DIR; }; 271285611CC1274300E517C7 /* lpr */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpr; sourceTree = BUILT_PRODUCTS_DIR; }; 2712856E1CC1275200E517C7 /* lprm */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lprm; sourceTree = BUILT_PRODUCTS_DIR; }; 2712857B1CC1276400E517C7 /* lpstat */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpstat; sourceTree = BUILT_PRODUCTS_DIR; }; 271285A01CC12D1300E517C7 /* admin.cgi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = admin.cgi; sourceTree = BUILT_PRODUCTS_DIR; }; 271285AF1CC12D3A00E517C7 /* classes.cgi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = classes.cgi; sourceTree = BUILT_PRODUCTS_DIR; }; 271285BD1CC12D4E00E517C7 /* jobs.cgi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jobs.cgi; sourceTree = BUILT_PRODUCTS_DIR; }; 271285CB1CC12D5E00E517C7 /* printers.cgi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = printers.cgi; sourceTree = BUILT_PRODUCTS_DIR; }; 271285D81CC12DBF00E517C7 /* commandtops */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = commandtops; sourceTree = BUILT_PRODUCTS_DIR; }; 271285E51CC12DDF00E517C7 /* gziptoany */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gziptoany; sourceTree = BUILT_PRODUCTS_DIR; }; 271285F21CC12E2E00E517C7 /* pstops */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = pstops; sourceTree = BUILT_PRODUCTS_DIR; }; 271286001CC12EEB00E517C7 /* rastertoepson */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertoepson; sourceTree = BUILT_PRODUCTS_DIR; }; 271286131CC12F0B00E517C7 /* rastertohp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertohp; sourceTree = BUILT_PRODUCTS_DIR; }; 271286231CC12F1A00E517C7 /* rastertolabel */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertolabel; sourceTree = BUILT_PRODUCTS_DIR; }; 271286671CC1309000E517C7 /* tlscheck */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tlscheck; sourceTree = BUILT_PRODUCTS_DIR; }; 271286681CC130BD00E517C7 /* tlscheck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tlscheck.c; path = ../cups/tlscheck.c; sourceTree = ""; }; 2712866A1CC130FF00E517C7 /* rasterbench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rasterbench.c; path = ../cups/rasterbench.c; sourceTree = ""; }; 2712867D1CC1310E00E517C7 /* rasterbench */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rasterbench; sourceTree = BUILT_PRODUCTS_DIR; }; 271286801CC1396100E517C7 /* bcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bcp.c; path = ../monitor/bcp.c; sourceTree = ""; }; 271286811CC1396100E517C7 /* tbcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tbcp.c; path = ../monitor/tbcp.c; sourceTree = ""; }; 271286831CC13D9600E517C7 /* checkpo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = checkpo.c; path = ../locale/checkpo.c; sourceTree = ""; }; 271286841CC13D9600E517C7 /* cups.pot */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = cups.pot; path = ../locale/cups.pot; sourceTree = ""; }; 271286851CC13D9600E517C7 /* po2strings.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = po2strings.c; path = ../locale/po2strings.c; sourceTree = ""; }; 271286861CC13D9600E517C7 /* strings2po.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = strings2po.c; path = ../locale/strings2po.c; sourceTree = ""; }; 271286961CC13DC000E517C7 /* checkpo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = checkpo; sourceTree = BUILT_PRODUCTS_DIR; }; 271286A71CC13DF100E517C7 /* po2strings */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = po2strings; sourceTree = BUILT_PRODUCTS_DIR; }; 271286B81CC13DFF00E517C7 /* strings2po */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = strings2po; sourceTree = BUILT_PRODUCTS_DIR; }; 271286C91CC13E2100E517C7 /* bcp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = bcp; sourceTree = BUILT_PRODUCTS_DIR; }; 271286D91CC13E5B00E517C7 /* tbcp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tbcp; sourceTree = BUILT_PRODUCTS_DIR; }; 271286F31CC13F2000E517C7 /* mailto */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mailto; sourceTree = BUILT_PRODUCTS_DIR; }; 271287031CC13F3F00E517C7 /* rss */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rss; sourceTree = BUILT_PRODUCTS_DIR; }; 271287181CC13FAB00E517C7 /* mantohtml */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mantohtml; sourceTree = BUILT_PRODUCTS_DIR; }; 271287191CC13FDB00E517C7 /* mantohtml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mantohtml.c; path = ../man/mantohtml.c; sourceTree = ""; }; 2712871D1CC140B400E517C7 /* genstrings.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = genstrings.cxx; path = ../ppdc/genstrings.cxx; sourceTree = ""; }; 2712872C1CC140BE00E517C7 /* genstrings */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = genstrings; sourceTree = BUILT_PRODUCTS_DIR; }; 2732E089137A3F5200FAFEF6 /* cancel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cancel.c; path = ../systemv/cancel.c; sourceTree = ""; }; 2732E08A137A3F5200FAFEF6 /* cupsaccept.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cupsaccept.c; path = ../systemv/cupsaccept.c; sourceTree = ""; }; 2732E08C137A3F5200FAFEF6 /* lp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lp.c; path = ../systemv/lp.c; sourceTree = ""; }; 2732E08D137A3F5200FAFEF6 /* lpadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpadmin.c; path = ../systemv/lpadmin.c; sourceTree = ""; }; 2732E08E137A3F5200FAFEF6 /* lpinfo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpinfo.c; path = ../systemv/lpinfo.c; sourceTree = ""; }; 2732E08F137A3F5200FAFEF6 /* lpmove.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpmove.c; path = ../systemv/lpmove.c; sourceTree = ""; }; 2732E090137A3F5200FAFEF6 /* lpoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpoptions.c; path = ../systemv/lpoptions.c; sourceTree = ""; }; 2732E092137A3F5200FAFEF6 /* lpstat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpstat.c; path = ../systemv/lpstat.c; sourceTree = ""; }; 273B1EAA226B3E4800428143 /* ippevepcl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippevepcl; sourceTree = BUILT_PRODUCTS_DIR; }; 273B1EBB226B3E5200428143 /* ippeveps */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippeveps; sourceTree = BUILT_PRODUCTS_DIR; }; 273B1EBC226B3EE300428143 /* ippeveps.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ippeveps.c; path = ../tools/ippeveps.c; sourceTree = ""; }; 273B1EBD226B3EE300428143 /* ippevecommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ippevecommon.h; path = ../tools/ippevecommon.h; sourceTree = ""; }; 273B1EBE226B3EE300428143 /* ippevepcl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ippevepcl.c; path = ../tools/ippevepcl.c; sourceTree = ""; }; 273BF6BD1333B5000022CAAB /* testcups */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcups; sourceTree = BUILT_PRODUCTS_DIR; }; 273BF6C61333B5370022CAAB /* testcups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcups.c; path = ../cups/testcups.c; sourceTree = ""; }; 274561471F545B2E000378E4 /* cupspm.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = cupspm.md; path = ../cups/cupspm.md; sourceTree = ""; }; 274561481F545B2E000378E4 /* api-admin.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-admin.header"; path = "../cups/api-admin.header"; sourceTree = ""; }; 274561491F545B2E000378E4 /* api-admin.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-admin.shtml"; path = "../cups/api-admin.shtml"; sourceTree = ""; }; 274770E02345342B0089BC31 /* testthreads */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testthreads; sourceTree = BUILT_PRODUCTS_DIR; }; 274770E1234534660089BC31 /* testthreads.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testthreads.c; path = ../cups/testthreads.c; sourceTree = ""; }; 274FF5CC13332B1F00317ECB /* cups-driverd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-driverd"; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF5D613332CC700317ECB /* cups-driverd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "cups-driverd.cxx"; path = "../scheduler/cups-driverd.cxx"; sourceTree = ""; }; 274FF5D713332CC700317ECB /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../scheduler/util.c; sourceTree = ""; }; 274FF5D813332CC700317ECB /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = util.h; path = ../scheduler/util.h; sourceTree = ""; }; 274FF5EE133330C800317ECB /* libcupsppdc.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsppdc.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF5F51333315100317ECB /* ppdc-array.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-array.cxx"; path = "../ppdc/ppdc-array.cxx"; sourceTree = ""; }; 274FF5F61333315100317ECB /* ppdc-attr.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-attr.cxx"; path = "../ppdc/ppdc-attr.cxx"; sourceTree = ""; }; 274FF5F71333315100317ECB /* ppdc-catalog.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-catalog.cxx"; path = "../ppdc/ppdc-catalog.cxx"; sourceTree = ""; }; 274FF5F81333315100317ECB /* ppdc-choice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-choice.cxx"; path = "../ppdc/ppdc-choice.cxx"; sourceTree = ""; }; 274FF5F91333315100317ECB /* ppdc-constraint.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-constraint.cxx"; path = "../ppdc/ppdc-constraint.cxx"; sourceTree = ""; }; 274FF5FA1333315100317ECB /* ppdc-driver.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-driver.cxx"; path = "../ppdc/ppdc-driver.cxx"; sourceTree = ""; }; 274FF5FB1333315100317ECB /* ppdc-file.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-file.cxx"; path = "../ppdc/ppdc-file.cxx"; sourceTree = ""; }; 274FF5FC1333315100317ECB /* ppdc-filter.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-filter.cxx"; path = "../ppdc/ppdc-filter.cxx"; sourceTree = ""; }; 274FF5FD1333315100317ECB /* ppdc-font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-font.cxx"; path = "../ppdc/ppdc-font.cxx"; sourceTree = ""; }; 274FF5FE1333315100317ECB /* ppdc-group.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-group.cxx"; path = "../ppdc/ppdc-group.cxx"; sourceTree = ""; }; 274FF5FF1333315100317ECB /* ppdc-import.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-import.cxx"; path = "../ppdc/ppdc-import.cxx"; sourceTree = ""; }; 274FF6001333315100317ECB /* ppdc-mediasize.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-mediasize.cxx"; path = "../ppdc/ppdc-mediasize.cxx"; sourceTree = ""; }; 274FF6011333315100317ECB /* ppdc-message.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-message.cxx"; path = "../ppdc/ppdc-message.cxx"; sourceTree = ""; }; 274FF6021333315100317ECB /* ppdc-option.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-option.cxx"; path = "../ppdc/ppdc-option.cxx"; sourceTree = ""; }; 274FF6031333315100317ECB /* ppdc-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ppdc-private.h"; path = "../ppdc/ppdc-private.h"; sourceTree = ""; }; 274FF6041333315100317ECB /* ppdc-profile.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-profile.cxx"; path = "../ppdc/ppdc-profile.cxx"; sourceTree = ""; }; 274FF6051333315100317ECB /* ppdc-shared.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-shared.cxx"; path = "../ppdc/ppdc-shared.cxx"; sourceTree = ""; }; 274FF6061333315100317ECB /* ppdc-source.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-source.cxx"; path = "../ppdc/ppdc-source.cxx"; sourceTree = ""; }; 274FF6071333315100317ECB /* ppdc-string.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-string.cxx"; path = "../ppdc/ppdc-string.cxx"; sourceTree = ""; }; 274FF6081333315100317ECB /* ppdc-variable.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-variable.cxx"; path = "../ppdc/ppdc-variable.cxx"; sourceTree = ""; }; 274FF6091333315100317ECB /* ppdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ppdc.h; path = ../ppdc/ppdc.h; sourceTree = ""; }; 274FF6291333333600317ECB /* cups-deviced */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-deviced"; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF6351333344400317ECB /* cups-deviced.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-deviced.c"; path = "../scheduler/cups-deviced.c"; sourceTree = ""; }; 274FF63E1333358B00317ECB /* cups-exec */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-exec"; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF6491333398D00317ECB /* cups-exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-exec.c"; path = "../scheduler/cups-exec.c"; sourceTree = ""; }; 274FF64F133339C400317ECB /* cups-lpd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-lpd"; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF65B133339FC00317ECB /* cups-lpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-lpd.c"; path = "../scheduler/cups-lpd.c"; sourceTree = ""; }; 274FF67813333B2F00317ECB /* cupsfilter */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsfilter; sourceTree = BUILT_PRODUCTS_DIR; }; 274FF68713333B6E00317ECB /* cupsfilter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsfilter.c; path = ../scheduler/cupsfilter.c; sourceTree = ""; }; 276683561337A8C5000D33D0 /* cups.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = cups.strings; path = ../locale/cups.strings; sourceTree = ""; }; 2766835C1337A9B6000D33D0 /* cupsctl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsctl; sourceTree = BUILT_PRODUCTS_DIR; }; 276683681337AA00000D33D0 /* cupsctl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsctl.c; path = ../systemv/cupsctl.c; sourceTree = ""; }; 276683701337AC79000D33D0 /* ppdc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdc; sourceTree = BUILT_PRODUCTS_DIR; }; 2766837D1337AC8C000D33D0 /* ppdhtml */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdhtml; sourceTree = BUILT_PRODUCTS_DIR; }; 2766838A1337AC97000D33D0 /* ppdi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdi; sourceTree = BUILT_PRODUCTS_DIR; }; 276683971337ACA2000D33D0 /* ppdmerge */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdmerge; sourceTree = BUILT_PRODUCTS_DIR; }; 276683A41337ACAB000D33D0 /* ppdpo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdpo; sourceTree = BUILT_PRODUCTS_DIR; }; 276683CC1337B201000D33D0 /* ppdc.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdc.cxx; path = ../ppdc/ppdc.cxx; sourceTree = ""; }; 276683CE1337B20D000D33D0 /* ppdhtml.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdhtml.cxx; path = ../ppdc/ppdhtml.cxx; sourceTree = ""; }; 276683D01337B21A000D33D0 /* ppdi.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdi.cxx; path = ../ppdc/ppdi.cxx; sourceTree = ""; }; 276683D21337B228000D33D0 /* ppdmerge.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdmerge.cxx; path = ../ppdc/ppdmerge.cxx; sourceTree = ""; }; 276683D41337B237000D33D0 /* ppdpo.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdpo.cxx; path = ../ppdc/ppdpo.cxx; sourceTree = ""; }; 276683F01337F78E000D33D0 /* ipptool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipptool; sourceTree = BUILT_PRODUCTS_DIR; }; 276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../tools/ipptool.c; sourceTree = ""; }; 2767FC5019266A0D000F61D3 /* testdest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testdest; sourceTree = BUILT_PRODUCTS_DIR; }; 2767FC5119266A36000F61D3 /* testdest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testdest.c; path = ../cups/testdest.c; sourceTree = ""; }; 2767FC591926750C000F61D3 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 2767FC5A1926750C000F61D3 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; 2767FC5B1926750C000F61D3 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; 2767FC5C1926750C000F61D3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 2767FC5D1926750C000F61D3 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 2767FC7519269687000F61D3 /* pwg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pwg.h; path = ../cups/pwg.h; sourceTree = ""; }; 2767FC76192696A0000F61D3 /* raster-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "raster-private.h"; path = "../cups/raster-private.h"; sourceTree = ""; }; 278C58CB136B640300836530 /* testhttp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhttp; sourceTree = BUILT_PRODUCTS_DIR; }; 278C58E2136B647200836530 /* testhttp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhttp.c; path = ../cups/testhttp.c; sourceTree = ""; }; 278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 278C58E6136B64B000836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = /System/Library/Frameworks/Kerberos.framework; sourceTree = ""; }; 278C58E7136B64B000836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; 278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; 279AE6F42395B80F004DD600 /* libpam.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpam.tbd; path = usr/lib/libpam.tbd; sourceTree = SDKROOT; }; 27A0347B1A8BDB1300650675 /* lpadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpadmin; sourceTree = BUILT_PRODUCTS_DIR; }; 27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = ""; }; 27F89DA21B3AC43B00E5A4B7 /* testraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testraster.c; path = ../cups/testraster.c; sourceTree = ""; }; 720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; }; 720DD6D21358FDDE0064AA82 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../backend/snmp.c; sourceTree = ""; }; 720E854120164E7A00C6C411 /* ipp-file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-file.c"; path = "../cups/ipp-file.c"; sourceTree = ""; }; 720E854220164E7A00C6C411 /* ipp-vars.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-vars.c"; path = "../cups/ipp-vars.c"; sourceTree = ""; }; 72220EAE1333047D00FCA411 /* libcups.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 72220EB51333052D00FCA411 /* adminutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adminutil.c; path = ../cups/adminutil.c; sourceTree = ""; }; 72220EB71333056300FCA411 /* adminutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adminutil.h; path = ../cups/adminutil.h; sourceTree = ""; }; 72220EB81333056300FCA411 /* array.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = array.c; path = ../cups/array.c; sourceTree = ""; }; 72220EB91333056300FCA411 /* array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = array.h; path = ../cups/array.h; sourceTree = ""; }; 72220EBA1333056300FCA411 /* ppd-attr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-attr.c"; path = "../cups/ppd-attr.c"; sourceTree = ""; }; 72220EBB1333056300FCA411 /* auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = auth.c; path = ../cups/auth.c; sourceTree = ""; }; 72220EBC1333056300FCA411 /* backchannel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = backchannel.c; path = ../cups/backchannel.c; sourceTree = ""; }; 72220EBD1333056300FCA411 /* backend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = backend.c; path = ../cups/backend.c; sourceTree = ""; }; 72220EBE1333056300FCA411 /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = backend.h; path = ../cups/backend.h; sourceTree = ""; }; 72220EBF1333056300FCA411 /* ppd-conflicts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-conflicts.c"; path = "../cups/ppd-conflicts.c"; sourceTree = ""; }; 72220EC01333056300FCA411 /* cups-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cups-private.h"; path = "../cups/cups-private.h"; sourceTree = ""; }; 72220EC11333056300FCA411 /* cups.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cups.h; path = ../cups/cups.h; sourceTree = ""; }; 72220EC21333056300FCA411 /* ppd-custom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-custom.c"; path = "../cups/ppd-custom.c"; sourceTree = ""; }; 72220ED1133305BB00FCA411 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug.c; path = ../cups/debug.c; sourceTree = ""; }; 72220ED2133305BB00FCA411 /* dest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dest.c; path = ../cups/dest.c; sourceTree = ""; }; 72220ED3133305BB00FCA411 /* dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dir.c; path = ../cups/dir.c; sourceTree = ""; }; 72220ED4133305BB00FCA411 /* dir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dir.h; path = ../cups/dir.h; sourceTree = ""; }; 72220ED5133305BB00FCA411 /* ppd-emit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-emit.c"; path = "../cups/ppd-emit.c"; sourceTree = ""; }; 72220ED6133305BB00FCA411 /* encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encode.c; path = ../cups/encode.c; sourceTree = ""; }; 72220ED7133305BB00FCA411 /* file-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "file-private.h"; path = "../cups/file-private.h"; sourceTree = ""; }; 72220ED8133305BB00FCA411 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../cups/file.c; sourceTree = ""; }; 72220ED9133305BB00FCA411 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file.h; path = ../cups/file.h; sourceTree = ""; }; 72220EDA133305BB00FCA411 /* getdevices.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getdevices.c; path = ../cups/getdevices.c; sourceTree = ""; }; 72220EDB133305BB00FCA411 /* getifaddrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getifaddrs.c; path = ../cups/getifaddrs.c; sourceTree = ""; }; 72220EDC133305BB00FCA411 /* getputfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getputfile.c; path = ../cups/getputfile.c; sourceTree = ""; }; 72220EDD133305BB00FCA411 /* globals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = globals.c; path = ../cups/globals.c; sourceTree = ""; }; 72220EDE133305BB00FCA411 /* http-addr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-addr.c"; path = "../cups/http-addr.c"; sourceTree = ""; }; 72220EDF133305BB00FCA411 /* http-addrlist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-addrlist.c"; path = "../cups/http-addrlist.c"; sourceTree = ""; }; 72220EE0133305BB00FCA411 /* http-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "http-private.h"; path = "../cups/http-private.h"; sourceTree = ""; }; 72220EE1133305BB00FCA411 /* http-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-support.c"; path = "../cups/http-support.c"; sourceTree = ""; }; 72220EE2133305BB00FCA411 /* http.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = http.c; path = ../cups/http.c; sourceTree = ""; }; 72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = ""; wrapsLines = 1; }; 72220EE4133305BB00FCA411 /* ipp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ipp-private.h"; path = "../cups/ipp-private.h"; sourceTree = ""; }; 72220EE5133305BB00FCA411 /* ipp-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-support.c"; path = "../cups/ipp-support.c"; sourceTree = ""; }; 72220EE6133305BB00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../cups/ipp.c; sourceTree = ""; }; 72220EE7133305BB00FCA411 /* ipp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ipp.h; path = ../cups/ipp.h; sourceTree = ""; }; 72220EE8133305BB00FCA411 /* langprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = langprintf.c; path = ../cups/langprintf.c; sourceTree = ""; }; 72220EE9133305BB00FCA411 /* language-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "language-private.h"; path = "../cups/language-private.h"; sourceTree = ""; }; 72220EEA133305BB00FCA411 /* language.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = language.c; path = ../cups/language.c; sourceTree = ""; }; 72220EEB133305BB00FCA411 /* language.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = language.h; path = ../cups/language.h; sourceTree = ""; }; 72220EEC133305BB00FCA411 /* ppd-localize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-localize.c"; path = "../cups/ppd-localize.c"; sourceTree = ""; }; 72220EED133305BB00FCA411 /* ppd-mark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-mark.c"; path = "../cups/ppd-mark.c"; sourceTree = ""; }; 72220EEE133305BB00FCA411 /* md5-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "md5-internal.h"; path = "../cups/md5-internal.h"; sourceTree = ""; }; 72220EEF133305BB00FCA411 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../cups/md5.c; sourceTree = ""; }; 72220EF0133305BB00FCA411 /* md5passwd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5passwd.c; path = ../cups/md5passwd.c; sourceTree = ""; }; 72220EF1133305BB00FCA411 /* notify.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = notify.c; path = ../cups/notify.c; sourceTree = ""; }; 72220EF2133305BB00FCA411 /* options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = options.c; path = ../cups/options.c; sourceTree = ""; }; 72220EF3133305BB00FCA411 /* ppd-page.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-page.c"; path = "../cups/ppd-page.c"; sourceTree = ""; }; 72220EF4133305BB00FCA411 /* ppd-cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-cache.c"; path = "../cups/ppd-cache.c"; sourceTree = ""; }; 72220EF5133305BB00FCA411 /* ppd-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ppd-private.h"; path = "../cups/ppd-private.h"; sourceTree = ""; }; 72220EF6133305BB00FCA411 /* ppd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ppd.c; path = ../cups/ppd.c; sourceTree = ""; }; 72220EF7133305BB00FCA411 /* ppd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ppd.h; path = ../cups/ppd.h; sourceTree = ""; }; 72220EF8133305BB00FCA411 /* pwg-media.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "pwg-media.c"; path = "../cups/pwg-media.c"; sourceTree = ""; }; 72220EF9133305BB00FCA411 /* pwg-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "pwg-private.h"; path = "../cups/pwg-private.h"; sourceTree = ""; }; 72220EFA133305BB00FCA411 /* raster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = raster.h; path = ../cups/raster.h; sourceTree = ""; }; 72220EFB133305BB00FCA411 /* request.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = request.c; path = ../cups/request.c; sourceTree = ""; }; 72220EFC133305BB00FCA411 /* sidechannel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sidechannel.c; path = ../cups/sidechannel.c; sourceTree = ""; }; 72220EFD133305BB00FCA411 /* sidechannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sidechannel.h; path = ../cups/sidechannel.h; sourceTree = ""; }; 72220EFE133305BB00FCA411 /* snmp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "snmp-private.h"; path = "../cups/snmp-private.h"; sourceTree = ""; }; 72220EFF133305BB00FCA411 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../cups/snmp.c; sourceTree = ""; }; 72220F00133305BB00FCA411 /* snprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snprintf.c; path = ../cups/snprintf.c; sourceTree = ""; }; 72220F01133305BB00FCA411 /* string-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "string-private.h"; path = "../cups/string-private.h"; sourceTree = ""; }; 72220F02133305BB00FCA411 /* string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = string.c; path = ../cups/string.c; sourceTree = ""; }; 72220F03133305BB00FCA411 /* tempfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tempfile.c; path = ../cups/tempfile.c; sourceTree = ""; }; 72220F04133305BB00FCA411 /* thread-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "thread-private.h"; path = "../cups/thread-private.h"; sourceTree = ""; }; 72220F05133305BB00FCA411 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../cups/thread.c; sourceTree = ""; }; 72220F06133305BB00FCA411 /* transcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transcode.c; path = ../cups/transcode.c; sourceTree = ""; }; 72220F07133305BB00FCA411 /* transcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transcode.h; path = ../cups/transcode.h; sourceTree = ""; }; 72220F08133305BB00FCA411 /* usersys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usersys.c; path = ../cups/usersys.c; sourceTree = ""; }; 72220F09133305BB00FCA411 /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../cups/util.c; sourceTree = ""; }; 72220F0A133305BB00FCA411 /* versioning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = versioning.h; path = ../cups/versioning.h; sourceTree = ""; }; 72220F471333063D00FCA411 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 72220F5B13330A5A00FCA411 /* cupsd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsd; sourceTree = BUILT_PRODUCTS_DIR; }; 72220F6913330B0C00FCA411 /* auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = auth.c; path = ../scheduler/auth.c; sourceTree = SOURCE_ROOT; }; 72220F6A13330B0C00FCA411 /* auth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = auth.h; path = ../scheduler/auth.h; sourceTree = SOURCE_ROOT; }; 72220F6B13330B0C00FCA411 /* banners.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = banners.c; path = ../scheduler/banners.c; sourceTree = SOURCE_ROOT; }; 72220F6C13330B0C00FCA411 /* banners.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = banners.h; path = ../scheduler/banners.h; sourceTree = SOURCE_ROOT; }; 72220F6D13330B0C00FCA411 /* cert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cert.c; path = ../scheduler/cert.c; sourceTree = SOURCE_ROOT; }; 72220F6E13330B0C00FCA411 /* cert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cert.h; path = ../scheduler/cert.h; sourceTree = SOURCE_ROOT; }; 72220F6F13330B0C00FCA411 /* classes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = classes.c; path = ../scheduler/classes.c; sourceTree = SOURCE_ROOT; }; 72220F7013330B0C00FCA411 /* classes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = classes.h; path = ../scheduler/classes.h; sourceTree = SOURCE_ROOT; }; 72220F7113330B0C00FCA411 /* client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = client.c; path = ../scheduler/client.c; sourceTree = SOURCE_ROOT; }; 72220F7213330B0C00FCA411 /* client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client.h; path = ../scheduler/client.h; sourceTree = SOURCE_ROOT; }; 72220F7313330B0C00FCA411 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = conf.c; path = ../scheduler/conf.c; sourceTree = SOURCE_ROOT; }; 72220F7413330B0C00FCA411 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = conf.h; path = ../scheduler/conf.h; sourceTree = SOURCE_ROOT; }; 72220F7513330B0C00FCA411 /* cupsd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cupsd.h; path = ../scheduler/cupsd.h; sourceTree = SOURCE_ROOT; }; 72220F7613330B0C00FCA411 /* dirsvc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dirsvc.c; path = ../scheduler/dirsvc.c; sourceTree = SOURCE_ROOT; }; 72220F7713330B0C00FCA411 /* dirsvc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dirsvc.h; path = ../scheduler/dirsvc.h; sourceTree = SOURCE_ROOT; }; 72220F7813330B0C00FCA411 /* env.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = env.c; path = ../scheduler/env.c; sourceTree = SOURCE_ROOT; }; 72220F7913330B0C00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../scheduler/ipp.c; sourceTree = SOURCE_ROOT; }; 72220F7A13330B0C00FCA411 /* job.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = job.c; path = ../scheduler/job.c; sourceTree = SOURCE_ROOT; }; 72220F7B13330B0C00FCA411 /* job.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = job.h; path = ../scheduler/job.h; sourceTree = SOURCE_ROOT; }; 72220F7C13330B0C00FCA411 /* listen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = listen.c; path = ../scheduler/listen.c; sourceTree = SOURCE_ROOT; }; 72220F7D13330B0C00FCA411 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = log.c; path = ../scheduler/log.c; sourceTree = SOURCE_ROOT; }; 72220F7E13330B0C00FCA411 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = ../scheduler/main.c; sourceTree = SOURCE_ROOT; }; 72220F7F13330B0C00FCA411 /* network.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = network.c; path = ../scheduler/network.c; sourceTree = SOURCE_ROOT; }; 72220F8013330B0C00FCA411 /* network.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = network.h; path = ../scheduler/network.h; sourceTree = SOURCE_ROOT; }; 72220F8113330B0C00FCA411 /* policy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = policy.c; path = ../scheduler/policy.c; sourceTree = SOURCE_ROOT; }; 72220F8213330B0C00FCA411 /* policy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = policy.h; path = ../scheduler/policy.h; sourceTree = SOURCE_ROOT; }; 72220F8313330B0C00FCA411 /* printers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = printers.c; path = ../scheduler/printers.c; sourceTree = SOURCE_ROOT; }; 72220F8413330B0C00FCA411 /* printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = printers.h; path = ../scheduler/printers.h; sourceTree = SOURCE_ROOT; }; 72220F8513330B0C00FCA411 /* process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = process.c; path = ../scheduler/process.c; sourceTree = SOURCE_ROOT; }; 72220F8613330B0C00FCA411 /* quotas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quotas.c; path = ../scheduler/quotas.c; sourceTree = SOURCE_ROOT; }; 72220F8813330B0C00FCA411 /* select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = select.c; path = ../scheduler/select.c; sourceTree = SOURCE_ROOT; }; 72220F8913330B0C00FCA411 /* server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = server.c; path = ../scheduler/server.c; sourceTree = SOURCE_ROOT; }; 72220F8A13330B0C00FCA411 /* statbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = statbuf.c; path = ../scheduler/statbuf.c; sourceTree = SOURCE_ROOT; }; 72220F8B13330B0C00FCA411 /* statbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = statbuf.h; path = ../scheduler/statbuf.h; sourceTree = SOURCE_ROOT; }; 72220F8C13330B0C00FCA411 /* subscriptions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = subscriptions.c; path = ../scheduler/subscriptions.c; sourceTree = SOURCE_ROOT; }; 72220F8D13330B0C00FCA411 /* subscriptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = subscriptions.h; path = ../scheduler/subscriptions.h; sourceTree = SOURCE_ROOT; }; 72220F8E13330B0C00FCA411 /* sysman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysman.c; path = ../scheduler/sysman.c; sourceTree = SOURCE_ROOT; }; 72220F8F13330B0C00FCA411 /* sysman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sysman.h; path = ../scheduler/sysman.h; sourceTree = SOURCE_ROOT; }; 72220FAC13330B2200FCA411 /* libcupsmime.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsmime.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 72220FB213330BCE00FCA411 /* filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = filter.c; path = ../scheduler/filter.c; sourceTree = ""; }; 72220FB313330BCE00FCA411 /* mime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mime.c; path = ../scheduler/mime.c; sourceTree = ""; }; 72220FB413330BCE00FCA411 /* mime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mime.h; path = ../scheduler/mime.h; sourceTree = ""; }; 72220FB513330BCE00FCA411 /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../scheduler/type.c; sourceTree = ""; }; 7226369B18AE6D19004ED309 /* org.cups.cups-lpd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "org.cups.cups-lpd.plist"; path = "../scheduler/org.cups.cups-lpd.plist"; sourceTree = SOURCE_ROOT; }; 7226369C18AE6D19004ED309 /* org.cups.cupsd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = org.cups.cupsd.plist; path = ../scheduler/org.cups.cupsd.plist; sourceTree = SOURCE_ROOT; }; 7226369D18AE73BB004ED309 /* config.h.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.h.in; path = ../config.h.in; sourceTree = ""; }; 722A24EE2178D00C000CAB20 /* debug-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "debug-internal.h"; path = "../cups/debug-internal.h"; sourceTree = ""; }; 722A24F22178D090000CAB20 /* debug-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "debug-private.h"; path = "../cups/debug-private.h"; sourceTree = ""; }; 7234F41F1378A16F00D3E9C9 /* array-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "array-private.h"; path = "../cups/array-private.h"; sourceTree = ""; }; 724378FD1333E43E009631B9 /* ipp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipp; sourceTree = BUILT_PRODUCTS_DIR; }; 724379091333E4E3009631B9 /* backend-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "backend-private.h"; path = "../backend/backend-private.h"; sourceTree = ""; }; 7243790A1333E4E3009631B9 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../backend/ipp.c; sourceTree = ""; }; 7243790B1333E4E3009631B9 /* network.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = network.c; path = ../backend/network.c; sourceTree = ""; }; 7243790C1333E4E3009631B9 /* snmp-supplies.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "snmp-supplies.c"; path = "../backend/snmp-supplies.c"; sourceTree = ""; }; 724379121333E516009631B9 /* runloop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = runloop.c; path = ../backend/runloop.c; sourceTree = ""; }; 724379181333E532009631B9 /* lpd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpd; sourceTree = BUILT_PRODUCTS_DIR; }; 724379281333E952009631B9 /* lpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lpd.c; path = ../backend/lpd.c; sourceTree = ""; }; 724379301333FB85009631B9 /* socket */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = socket; sourceTree = BUILT_PRODUCTS_DIR; }; 7243793C1333FD19009631B9 /* socket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = socket.c; path = ../backend/socket.c; sourceTree = ""; }; 724379471333FEA9009631B9 /* dnssd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dnssd; sourceTree = BUILT_PRODUCTS_DIR; }; 724379501333FEBB009631B9 /* dnssd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dnssd.c; path = ../backend/dnssd.c; sourceTree = ""; }; 7243795B1333FF1D009631B9 /* usb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = usb; sourceTree = BUILT_PRODUCTS_DIR; }; 724379C41333FFC7009631B9 /* usb-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "usb-darwin.c"; path = "../backend/usb-darwin.c"; sourceTree = ""; }; 724379C51333FFC7009631B9 /* usb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usb.c; path = ../backend/usb.c; sourceTree = ""; }; 724379CA1334000E009631B9 /* ieee1284.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ieee1284.c; path = ../backend/ieee1284.c; sourceTree = ""; }; 72496E161A13A03B0051899C /* org.cups.cups-lpd.socket */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.cups-lpd.socket"; path = "../scheduler/org.cups.cups-lpd.socket"; sourceTree = SOURCE_ROOT; }; 72496E171A13A03B0051899C /* org.cups.cups-lpdAT.service.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.cups-lpdAT.service.in"; path = "../scheduler/org.cups.cups-lpdAT.service.in"; sourceTree = SOURCE_ROOT; }; 724FA5351CC0370C0092477B /* testadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testadmin; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5481CC037370092477B /* testarray */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testarray; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA55B1CC037500092477B /* testcache */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcache; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA56E1CC037670092477B /* testconflicts */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testconflicts; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5811CC037810092477B /* testfile */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testfile; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5941CC037980092477B /* testi18n */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testi18n; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5A71CC037AA0092477B /* testipp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testipp; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5BA1CC037C60092477B /* testlang */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testlang; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5CD1CC037D90092477B /* testlpd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testlpd; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5E11CC037F00092477B /* testoptions */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testoptions; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5F51CC038040092477B /* testppd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testppd; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6091CC038190092477B /* testpwg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testpwg; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA61D1CC0382B0092477B /* testraster */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testraster; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6311CC038410092477B /* testsnmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testsnmp; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6451CC038560092477B /* testspeed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testspeed; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6591CC0386E0092477B /* testsub */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testsub; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA65B1CC0389F0092477B /* test1284.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = test1284.c; path = ../backend/test1284.c; sourceTree = ""; }; 724FA65C1CC0389F0092477B /* testbackend.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testbackend.c; path = ../backend/testbackend.c; sourceTree = ""; }; 724FA65D1CC0389F0092477B /* testsupplies.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsupplies.c; path = ../backend/testsupplies.c; sourceTree = ""; }; 724FA6701CC038A50092477B /* test1284 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test1284; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6831CC038BD0092477B /* testbackend */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbackend; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6971CC038D90092477B /* testsupplies */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testsupplies; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6AA1CC039200092477B /* testcgi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcgi; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6BD1CC0393E0092477B /* testhi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhi; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6D11CC0395A0092477B /* testtemplate */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testtemplate; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6D41CC039D00092477B /* dbus.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = dbus.c; path = ../notifier/dbus.c; sourceTree = ""; }; 724FA6D51CC039D00092477B /* mailto.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mailto.c; path = ../notifier/mailto.c; sourceTree = ""; }; 724FA6D61CC039D00092477B /* rss.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rss.c; path = ../notifier/rss.c; sourceTree = ""; }; 724FA6D71CC039D00092477B /* testnotify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testnotify.c; path = ../notifier/testnotify.c; sourceTree = ""; }; 724FA6EA1CC039DE0092477B /* testnotify */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testnotify; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA6EC1CC03A1D0092477B /* testcatalog.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = testcatalog.cxx; path = ../ppdc/testcatalog.cxx; sourceTree = ""; }; 724FA6FF1CC03A210092477B /* testcatalog */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcatalog; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA70F1CC03A490092477B /* libcupsimage_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsimage_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA71F1CC03A990092477B /* libcupsmime_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsmime_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA7401CC03AAF0092477B /* libcupsppdc_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsppdc_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupscgi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA76B1CC03AF60092477B /* libcupscgi_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupscgi_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; 7253C45C216ED51400494ADD /* raster-interstub.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raster-interstub.c"; path = "../cups/raster-interstub.c"; sourceTree = ""; }; 7253C45D216ED51500494ADD /* raster-stubs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raster-stubs.c"; path = "../cups/raster-stubs.c"; sourceTree = ""; }; 7258EAE2134594C4009286F1 /* rastertopwg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertopwg; sourceTree = BUILT_PRODUCTS_DIR; }; 7258EAEC134594EB009286F1 /* rastertopwg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rastertopwg.c; path = ../filter/rastertopwg.c; sourceTree = ""; }; 72646E58203D0FCA00231A77 /* NOTICE */ = {isa = PBXFileReference; lastKnownFileType = text; name = NOTICE; path = ../NOTICE; sourceTree = ""; }; 726AD6F7135E88F0002C930D /* ippeveprinter */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippeveprinter; sourceTree = BUILT_PRODUCTS_DIR; }; 726AD701135E8A90002C930D /* ippeveprinter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippeveprinter.c; path = ../tools/ippeveprinter.c; sourceTree = ""; }; 7271881713746EA8001A2036 /* commandtops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = commandtops.c; path = ../filter/commandtops.c; sourceTree = ""; }; 7271881813746EA8001A2036 /* common.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = common.c; path = ../filter/common.c; sourceTree = ""; }; 7271881913746EA8001A2036 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../filter/common.h; sourceTree = ""; }; 7271881A13746EA8001A2036 /* gziptoany.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gziptoany.c; path = ../filter/gziptoany.c; sourceTree = ""; }; 7271882013746EA8001A2036 /* pstops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pstops.c; path = ../filter/pstops.c; sourceTree = ""; }; 7271882113746EA8001A2036 /* rastertoepson.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertoepson.c; path = ../filter/rastertoepson.c; sourceTree = ""; }; 7271882213746EA8001A2036 /* rastertohp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertohp.c; path = ../filter/rastertohp.c; sourceTree = ""; }; 7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = ""; }; 7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = ""; }; 727AD5B619100A58009F6862 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../cups/tls.c; sourceTree = ""; }; 727EF02F192E3498001EF690 /* admin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = admin.c; path = "../cgi-bin/admin.c"; sourceTree = ""; wrapsLines = 1; }; 727EF030192E3498001EF690 /* cgi-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "cgi-private.h"; path = "../cgi-bin/cgi-private.h"; sourceTree = ""; }; 727EF031192E3498001EF690 /* cgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cgi.h; path = "../cgi-bin/cgi.h"; sourceTree = ""; }; 727EF032192E3498001EF690 /* classes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = classes.c; path = "../cgi-bin/classes.c"; sourceTree = ""; }; 727EF033192E3498001EF690 /* help-index.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "help-index.c"; path = "../cgi-bin/help-index.c"; sourceTree = ""; }; 727EF034192E3498001EF690 /* help-index.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "help-index.h"; path = "../cgi-bin/help-index.h"; sourceTree = ""; }; 727EF035192E3498001EF690 /* help.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = help.c; path = "../cgi-bin/help.c"; sourceTree = ""; }; 727EF036192E3498001EF690 /* html.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = html.c; path = "../cgi-bin/html.c"; sourceTree = ""; }; 727EF037192E3498001EF690 /* ipp-var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "ipp-var.c"; path = "../cgi-bin/ipp-var.c"; sourceTree = ""; }; 727EF038192E3498001EF690 /* jobs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jobs.c; path = "../cgi-bin/jobs.c"; sourceTree = ""; }; 727EF039192E3498001EF690 /* makedocset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = makedocset.c; path = "../cgi-bin/makedocset.c"; sourceTree = ""; }; 727EF03A192E3498001EF690 /* printers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printers.c; path = "../cgi-bin/printers.c"; sourceTree = ""; }; 727EF03B192E3498001EF690 /* search.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = search.c; path = "../cgi-bin/search.c"; sourceTree = ""; }; 727EF03C192E3498001EF690 /* template.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = template.c; path = "../cgi-bin/template.c"; sourceTree = ""; }; 727EF03D192E3498001EF690 /* testcgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcgi.c; path = "../cgi-bin/testcgi.c"; sourceTree = ""; }; 727EF03E192E3498001EF690 /* testhi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testhi.c; path = "../cgi-bin/testhi.c"; sourceTree = ""; }; 727EF03F192E3498001EF690 /* testtemplate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testtemplate.c; path = "../cgi-bin/testtemplate.c"; sourceTree = ""; }; 727EF040192E3498001EF690 /* var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = var.c; path = "../cgi-bin/var.c"; sourceTree = ""; }; 727EF041192E3544001EF690 /* testadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testadmin.c; path = ../cups/testadmin.c; sourceTree = ""; }; 727EF042192E3544001EF690 /* testarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testarray.c; path = ../cups/testarray.c; sourceTree = ""; }; 727EF043192E3544001EF690 /* testcache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcache.c; path = ../cups/testcache.c; sourceTree = ""; }; 727EF044192E3544001EF690 /* testconflicts.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testconflicts.c; path = ../cups/testconflicts.c; sourceTree = ""; }; 727EF045192E3544001EF690 /* testfile.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testfile.c; path = ../cups/testfile.c; sourceTree = ""; }; 727EF046192E3544001EF690 /* testi18n.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testi18n.c; path = ../cups/testi18n.c; sourceTree = ""; }; 727EF047192E3544001EF690 /* testipp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testipp.c; path = ../cups/testipp.c; sourceTree = ""; }; 727EF048192E3544001EF690 /* testlang.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlang.c; path = ../cups/testlang.c; sourceTree = ""; }; 727EF049192E3544001EF690 /* testoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testoptions.c; path = ../cups/testoptions.c; sourceTree = ""; }; 727EF04A192E3544001EF690 /* testppd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testppd.c; path = ../cups/testppd.c; sourceTree = ""; }; 727EF04B192E3544001EF690 /* testpwg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testpwg.c; path = ../cups/testpwg.c; sourceTree = ""; }; 727EF04C192E3544001EF690 /* testsnmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsnmp.c; path = ../cups/testsnmp.c; sourceTree = ""; }; 727EF04D192E3602001EF690 /* testlpd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlpd.c; path = ../scheduler/testlpd.c; sourceTree = ""; }; 727EF04E192E3602001EF690 /* testspeed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testspeed.c; path = ../scheduler/testspeed.c; sourceTree = ""; }; 727EF04F192E3602001EF690 /* testsub.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsub.c; path = ../scheduler/testsub.c; sourceTree = ""; }; 7284F9EF1BFCCD940026F886 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hash.c; path = ../cups/hash.c; sourceTree = ""; }; 728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = ""; }; 728FB7EF1536167A005426E1 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = /usr/lib/libiconv.dylib; sourceTree = ""; }; 728FB7F01536167A005426E1 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = /usr/lib/libresolv.dylib; sourceTree = ""; }; 729181AB20115597005E7560 /* testclient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testclient.c; path = ../cups/testclient.c; sourceTree = ""; }; 729181BE201155C1005E7560 /* testclient */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testclient; sourceTree = BUILT_PRODUCTS_DIR; }; 72A4332F155844CF002E172D /* libcups_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; 72A8B3D61C188BDE00A1A547 /* ppd-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-util.c"; path = "../cups/ppd-util.c"; sourceTree = ""; }; 72C16CB8137B195D007E4BF4 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../scheduler/file.c; sourceTree = SOURCE_ROOT; }; 72CF95E018A13543000FCAE4 /* dest-job.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-job.c"; path = "../cups/dest-job.c"; sourceTree = ""; }; 72CF95E118A13543000FCAE4 /* dest-localization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-localization.c"; path = "../cups/dest-localization.c"; sourceTree = ""; }; 72CF95E218A13543000FCAE4 /* dest-options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-options.c"; path = "../cups/dest-options.c"; sourceTree = ""; }; 72CF95F118A19134000FCAE4 /* ipptool copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ipptool copy"; sourceTree = BUILT_PRODUCTS_DIR; }; 72CF95F218A19165000FCAE4 /* ippfind.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippfind.c; path = ../tools/ippfind.c; sourceTree = ""; }; 72D53A2915B49110003F877F /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = /System/Library/Frameworks/GSS.framework; sourceTree = ""; }; 72D53A2C15B4913D003F877F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 72D53A3315B4925B003F877F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; 72D53A3615B4929D003F877F /* colorman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colorman.c; path = ../scheduler/colorman.c; sourceTree = ""; }; 72D53A3715B4929D003F877F /* colorman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colorman.h; path = ../scheduler/colorman.h; sourceTree = ""; }; 72D53A3915B492FA003F877F /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = /usr/lib/libpam.dylib; sourceTree = ""; }; 72E65BA318DC797E00097E89 /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; name = configure.ac; path = ../configure.ac; sourceTree = ""; }; 72E65BA418DC799B00097E89 /* cups-common.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-common.m4"; path = "../config-scripts/cups-common.m4"; sourceTree = ""; }; 72E65BA518DC799B00097E89 /* cups-compiler.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-compiler.m4"; path = "../config-scripts/cups-compiler.m4"; sourceTree = ""; }; 72E65BA618DC799B00097E89 /* cups-defaults.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-defaults.m4"; path = "../config-scripts/cups-defaults.m4"; sourceTree = ""; }; 72E65BA718DC799B00097E89 /* cups-directories.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-directories.m4"; path = "../config-scripts/cups-directories.m4"; sourceTree = ""; }; 72E65BA818DC799B00097E89 /* cups-dnssd.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-dnssd.m4"; path = "../config-scripts/cups-dnssd.m4"; sourceTree = ""; }; 72E65BA918DC799B00097E89 /* cups-gssapi.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-gssapi.m4"; path = "../config-scripts/cups-gssapi.m4"; sourceTree = ""; }; 72E65BAA18DC799B00097E89 /* cups-largefile.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-largefile.m4"; path = "../config-scripts/cups-largefile.m4"; sourceTree = ""; }; 72E65BAB18DC799B00097E89 /* cups-startup.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-startup.m4"; path = "../config-scripts/cups-startup.m4"; sourceTree = ""; }; 72E65BAC18DC799B00097E89 /* cups-libtool.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-libtool.m4"; path = "../config-scripts/cups-libtool.m4"; sourceTree = ""; }; 72E65BAD18DC799B00097E89 /* cups-manpages.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-manpages.m4"; path = "../config-scripts/cups-manpages.m4"; sourceTree = ""; }; 72E65BAE18DC799B00097E89 /* cups-network.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-network.m4"; path = "../config-scripts/cups-network.m4"; sourceTree = ""; }; 72E65BAF18DC799B00097E89 /* cups-opsys.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-opsys.m4"; path = "../config-scripts/cups-opsys.m4"; sourceTree = ""; }; 72E65BB018DC799B00097E89 /* cups-pam.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-pam.m4"; path = "../config-scripts/cups-pam.m4"; sourceTree = ""; }; 72E65BB118DC799B00097E89 /* cups-poll.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-poll.m4"; path = "../config-scripts/cups-poll.m4"; sourceTree = ""; }; 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-sharedlibs.m4"; path = "../config-scripts/cups-sharedlibs.m4"; sourceTree = ""; }; 72E65BB418DC799B00097E89 /* cups-ssl.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-ssl.m4"; path = "../config-scripts/cups-ssl.m4"; sourceTree = ""; }; 72E65BB518DC799B00097E89 /* cups-threads.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-threads.m4"; path = "../config-scripts/cups-threads.m4"; sourceTree = ""; }; 72E65BB618DC79CC00097E89 /* cups-config.in */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "cups-config.in"; path = "../cups-config.in"; sourceTree = ""; }; 72E65BB718DC79CC00097E89 /* Makedefs.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makedefs.in; path = ../Makedefs.in; sourceTree = ""; }; 72E65BB918DC7A3600097E89 /* doc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = doc; path = ../doc; sourceTree = ""; }; 72E65BBA18DC7A3600097E89 /* man */ = {isa = PBXFileReference; lastKnownFileType = folder; name = man; path = ../man; sourceTree = ""; }; 72E65BC118DC7A6B00097E89 /* api-filter.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-filter.header"; path = "../cups/api-filter.header"; sourceTree = ""; }; 72E65BC218DC7A6B00097E89 /* api-filter.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-filter.shtml"; path = "../cups/api-filter.shtml"; sourceTree = ""; }; 72E65BC718DC7A6B00097E89 /* api-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-ppd.header"; path = "../cups/api-ppd.header"; sourceTree = ""; }; 72E65BC818DC7A6B00097E89 /* api-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-ppd.shtml"; path = "../cups/api-ppd.shtml"; sourceTree = ""; }; 72E65BCB18DC7A9800097E89 /* api-raster.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-raster.header"; path = "../cups/api-raster.header"; sourceTree = ""; }; 72E65BCC18DC7A9800097E89 /* api-raster.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-raster.shtml"; path = "../cups/api-raster.shtml"; sourceTree = ""; }; 72E65BCD18DC7A9800097E89 /* postscript-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "postscript-driver.header"; path = "../filter/postscript-driver.header"; sourceTree = ""; }; 72E65BCE18DC7A9800097E89 /* postscript-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "postscript-driver.shtml"; path = "../filter/postscript-driver.shtml"; sourceTree = ""; }; 72E65BCF18DC7A9800097E89 /* ppd-compiler.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "ppd-compiler.header"; path = "../filter/ppd-compiler.header"; sourceTree = ""; }; 72E65BD018DC7A9800097E89 /* ppd-compiler.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "ppd-compiler.shtml"; path = "../filter/ppd-compiler.shtml"; sourceTree = ""; }; 72E65BD118DC7A9800097E89 /* raster-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "raster-driver.header"; path = "../filter/raster-driver.header"; sourceTree = ""; }; 72E65BD218DC7A9800097E89 /* raster-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "raster-driver.shtml"; path = "../filter/raster-driver.shtml"; sourceTree = ""; }; 72E65BD318DC7A9800097E89 /* spec-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "spec-ppd.header"; path = "../filter/spec-ppd.header"; sourceTree = ""; }; 72E65BD418DC7A9800097E89 /* spec-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "spec-ppd.shtml"; path = "../filter/spec-ppd.shtml"; sourceTree = ""; }; 72E65BD518DC818400097E89 /* org.cups.cups-lpd.plist.in */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "org.cups.cups-lpd.plist.in"; path = "../scheduler/org.cups.cups-lpd.plist.in"; sourceTree = SOURCE_ROOT; }; 72E65BD618DC818400097E89 /* org.cups.cupsd.path.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.path.in; path = ../scheduler/org.cups.cupsd.path.in; sourceTree = SOURCE_ROOT; }; 72E65BD718DC818400097E89 /* org.cups.cupsd.service.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.service.in; path = ../scheduler/org.cups.cupsd.service.in; sourceTree = SOURCE_ROOT; }; 72E65BD818DC818400097E89 /* org.cups.cupsd.socket.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = org.cups.cupsd.socket.in; path = ../scheduler/org.cups.cupsd.socket.in; sourceTree = SOURCE_ROOT; }; 72E65BD918DC850A00097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../Makefile; sourceTree = ""; }; 72E65BDC18DC852700097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../scheduler/Makefile; sourceTree = SOURCE_ROOT; }; 72E65BDE18DCA35700097E89 /* CHANGES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGES.md; path = ../CHANGES.md; sourceTree = ""; xcLanguageSpecificationIdentifier = ""; }; 72E65BDF18DCA35700097E89 /* CREDITS.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CREDITS.md; path = ../CREDITS.md; sourceTree = ""; }; 72E65BE018DCA35700097E89 /* INSTALL.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = INSTALL.md; path = ../INSTALL.md; sourceTree = ""; }; 72E65BE218DCA35700097E89 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 72E65BE318DCA35700097E89 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 72F75A521336F950004BB496 /* cupstestppd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupstestppd; sourceTree = BUILT_PRODUCTS_DIR; }; 72F75A5B1336F988004BB496 /* cupstestppd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupstestppd.c; path = ../systemv/cupstestppd.c; sourceTree = ""; }; 72F75A611336F9A3004BB496 /* libcupsimage.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsimage.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 72F75A691336FA8A004BB496 /* raster-error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raster-error.c"; path = "../cups/raster-error.c"; sourceTree = ""; }; 72F75A6A1336FA8A004BB496 /* raster-interpret.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raster-interpret.c"; path = "../cups/raster-interpret.c"; sourceTree = ""; }; 72F75A6B1336FA8A004BB496 /* raster-stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raster-stream.c"; path = "../cups/raster-stream.c"; sourceTree = ""; }; 72F7F1D719D1C0CC00870B09 /* org.cups.usb-quirks */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.usb-quirks"; path = "../backend/org.cups.usb-quirks"; sourceTree = ""; }; 72FC29CF1A37A1CA00BDF935 /* usb-libusb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-libusb.c"; path = "../backend/usb-libusb.c"; sourceTree = ""; }; 72FC29D01A37A1CA00BDF935 /* usb-unix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-unix.c"; path = "../backend/usb-unix.c"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 270696331CADF3E200FFE5FB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 270696341CADF3E200FFE5FB /* SystemConfiguration.framework in Frameworks */, 270696351CADF3E200FFE5FB /* CoreFoundation.framework in Frameworks */, 270696381CADF3E200FFE5FB /* libiconv.dylib in Frameworks */, 270696391CADF3E200FFE5FB /* libresolv.dylib in Frameworks */, 2706963A1CADF3E200FFE5FB /* libz.dylib in Frameworks */, 2706963B1CADF3E200FFE5FB /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 270CCDA4135E3C9E00007BE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284DC1CC1254C00E517C7 /* libcupsmime_static.a in Frameworks */, 2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */, 278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */, 278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */, 278C58EB136B64B000836530 /* Security.framework in Frameworks */, 278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 270D02181D707E0200EA9403 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 270D02191D707E0200EA9403 /* libcups_static.a in Frameworks */, 270D021A1D707E0200EA9403 /* CoreFoundation.framework in Frameworks */, 270D021B1D707E0200EA9403 /* Kerberos.framework in Frameworks */, 270D021C1D707E0200EA9403 /* libiconv.dylib in Frameworks */, 270D021D1D707E0200EA9403 /* libresolv.dylib in Frameworks */, 270D021E1D707E0200EA9403 /* libz.dylib in Frameworks */, 270D021F1D707E0200EA9403 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271284E61CC1261900E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284E71CC1261900E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271284F31CC1264B00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284F41CC1264B00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712850D1CC1267A00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712850E1CC1267A00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712851A1CC1269700E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712851B1CC1269700E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285271CC126AA00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285281CC126AA00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285341CC1270B00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285351CC1270B00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285411CC1271E00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285421CC1271E00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712854E1CC1272D00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712854F1CC1272D00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712855B1CC1274300E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712855C1CC1274300E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285681CC1275200E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285691CC1275200E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285751CC1276400E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285761CC1276400E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712859A1CC12D1300E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285A21CC12D2900E517C7 /* libcupscgi.dylib in Frameworks */, 2712859B1CC12D1300E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285A81CC12D3A00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285A91CC12D3A00E517C7 /* libcupscgi.dylib in Frameworks */, 271285AA1CC12D3A00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285B61CC12D4E00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285B71CC12D4E00E517C7 /* libcupscgi.dylib in Frameworks */, 271285B81CC12D4E00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285C41CC12D5E00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285C51CC12D5E00E517C7 /* libcupscgi.dylib in Frameworks */, 271285C61CC12D5E00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285D21CC12DBF00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285D31CC12DBF00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285DF1CC12DDF00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285E01CC12DDF00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285EC1CC12E2D00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271285ED1CC12E2D00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285FA1CC12EEB00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286041CC12F0800E517C7 /* libcupsimage.dylib in Frameworks */, 271285FB1CC12EEB00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712860C1CC12F0B00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712860D1CC12F0B00E517C7 /* libcupsimage.dylib in Frameworks */, 2712860E1CC12F0B00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712861C1CC12F1A00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712861D1CC12F1A00E517C7 /* libcupsimage.dylib in Frameworks */, 2712861E1CC12F1A00E517C7 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712865C1CC1309000E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712865D1CC1309000E517C7 /* libcups_static.a in Frameworks */, 2712865E1CC1309000E517C7 /* CoreFoundation.framework in Frameworks */, 2712865F1CC1309000E517C7 /* libresolv.dylib in Frameworks */, 271286601CC1309000E517C7 /* libz.dylib in Frameworks */, 271286611CC1309000E517C7 /* Security.framework in Frameworks */, 271286621CC1309000E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286721CC1310E00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286731CC1310E00E517C7 /* libcupsimage_static.a in Frameworks */, 271286741CC1310E00E517C7 /* libcups_static.a in Frameworks */, 271286751CC1310E00E517C7 /* CoreFoundation.framework in Frameworks */, 271286761CC1310E00E517C7 /* Kerberos.framework in Frameworks */, 271286771CC1310E00E517C7 /* Security.framework in Frameworks */, 271286781CC1310E00E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712868C1CC13DC000E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712868D1CC13DC000E517C7 /* libcups_static.a in Frameworks */, 2712868E1CC13DC000E517C7 /* CoreFoundation.framework in Frameworks */, 2712868F1CC13DC000E517C7 /* Kerberos.framework in Frameworks */, 271286901CC13DC000E517C7 /* Security.framework in Frameworks */, 271286911CC13DC000E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712869D1CC13DF100E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712869E1CC13DF100E517C7 /* libcups_static.a in Frameworks */, 2712869F1CC13DF100E517C7 /* CoreFoundation.framework in Frameworks */, 271286A01CC13DF100E517C7 /* Kerberos.framework in Frameworks */, 271286A11CC13DF100E517C7 /* Security.framework in Frameworks */, 271286A21CC13DF100E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286AE1CC13DFF00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286AF1CC13DFF00E517C7 /* libcups_static.a in Frameworks */, 271286B01CC13DFF00E517C7 /* CoreFoundation.framework in Frameworks */, 271286B11CC13DFF00E517C7 /* Kerberos.framework in Frameworks */, 271286B21CC13DFF00E517C7 /* Security.framework in Frameworks */, 271286B31CC13DFF00E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286C01CC13E2100E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286C11CC13E2100E517C7 /* libcups.dylib in Frameworks */, 271286C21CC13E2100E517C7 /* CoreFoundation.framework in Frameworks */, 271286C31CC13E2100E517C7 /* IOKit.framework in Frameworks */, 271286C41CC13E2100E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286D01CC13E5B00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286D11CC13E5B00E517C7 /* libcups.dylib in Frameworks */, 271286D21CC13E5B00E517C7 /* CoreFoundation.framework in Frameworks */, 271286D31CC13E5B00E517C7 /* IOKit.framework in Frameworks */, 271286D41CC13E5B00E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286EA1CC13F2000E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286EB1CC13F2000E517C7 /* libcups.dylib in Frameworks */, 271286EC1CC13F2000E517C7 /* CoreFoundation.framework in Frameworks */, 271286ED1CC13F2000E517C7 /* IOKit.framework in Frameworks */, 271286EE1CC13F2000E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286FA1CC13F3F00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271286FB1CC13F3F00E517C7 /* libcups.dylib in Frameworks */, 271286FC1CC13F3F00E517C7 /* CoreFoundation.framework in Frameworks */, 271286FD1CC13F3F00E517C7 /* IOKit.framework in Frameworks */, 271286FE1CC13F3F00E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712870E1CC13FAB00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2712870F1CC13FAB00E517C7 /* libcups_static.a in Frameworks */, 271287101CC13FAB00E517C7 /* CoreFoundation.framework in Frameworks */, 271287111CC13FAB00E517C7 /* Kerberos.framework in Frameworks */, 271287121CC13FAB00E517C7 /* Security.framework in Frameworks */, 271287131CC13FAB00E517C7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 271287251CC140BE00E517C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271287341CC140F500E517C7 /* CoreFoundation.framework in Frameworks */, 271287321CC140EB00E517C7 /* libcups_static.a in Frameworks */, 271287331CC140EB00E517C7 /* libcupsppdc_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 273B1E9F226B3E4800428143 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 273B1EC7226B41F700428143 /* libcups.dylib in Frameworks */, 273B1EA1226B3E4800428143 /* CoreFoundation.framework in Frameworks */, 273B1EA2226B3E4800428143 /* libresolv.dylib in Frameworks */, 273B1EA3226B3E4800428143 /* libz.dylib in Frameworks */, 273B1EA4226B3E4800428143 /* Security.framework in Frameworks */, 273B1EA5226B3E4800428143 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 273B1EB0226B3E5200428143 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 273B1ECD226B421E00428143 /* libcups.dylib in Frameworks */, 273B1EB2226B3E5200428143 /* CoreFoundation.framework in Frameworks */, 273B1EB3226B3E5200428143 /* libresolv.dylib in Frameworks */, 273B1EB4226B3E5200428143 /* libz.dylib in Frameworks */, 273B1EB5226B3E5200428143 /* Security.framework in Frameworks */, 273B1EB6226B3E5200428143 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 273BF6BA1333B5000022CAAB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2767FC5F1926750C000F61D3 /* CoreFoundation.framework in Frameworks */, 2767FC601926750C000F61D3 /* libiconv.dylib in Frameworks */, 2767FC611926750C000F61D3 /* libresolv.dylib in Frameworks */, 2767FC621926750C000F61D3 /* libz.dylib in Frameworks */, 2767FC631926750C000F61D3 /* Security.framework in Frameworks */, 2767FC641926750C000F61D3 /* SystemConfiguration.framework in Frameworks */, 2767FC58192674E0000F61D3 /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274770D62345342B0089BC31 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 274770D72345342B0089BC31 /* libcups_static.a in Frameworks */, 274770D82345342B0089BC31 /* CoreFoundation.framework in Frameworks */, 274770D92345342B0089BC31 /* Kerberos.framework in Frameworks */, 274770DA2345342B0089BC31 /* Security.framework in Frameworks */, 274770DB2345342B0089BC31 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF5C913332B1F00317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 274FF5DD13332D0600317ECB /* libcups.dylib in Frameworks */, 274FF6241333323B00317ECB /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF5EB133330C800317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */, 274FF6231333321400317ECB /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF6261333333600317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 274FF6321333334A00317ECB /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF63B1333358B00317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72CEF95618A966E000FA9B81 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF64C133339C400317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 274FF658133339D300317ECB /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF67513333B2F00317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 274FF68513333B4300317ECB /* libcups.dylib in Frameworks */, 274FF68613333B4300317ECB /* libcupsmime.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF6B91333B1C400317ECB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72BFD609191AF14C0005DA37 /* SystemConfiguration.framework in Frameworks */, 72BFD602191AF1270005DA37 /* CoreFoundation.framework in Frameworks */, 72BFD603191AF1270005DA37 /* GSS.framework in Frameworks */, 72BFD604191AF1270005DA37 /* Kerberos.framework in Frameworks */, 72BFD605191AF1270005DA37 /* libiconv.dylib in Frameworks */, 72BFD606191AF1270005DA37 /* libresolv.dylib in Frameworks */, 72BFD607191AF1270005DA37 /* libz.dylib in Frameworks */, 72BFD608191AF1270005DA37 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683591337A9B6000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683671337A9E0000D33D0 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2766836D1337AC79000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683B11337AD06000D33D0 /* libcups.dylib in Frameworks */, 276683B21337AD06000D33D0 /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2766837A1337AC8C000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683B71337AD23000D33D0 /* libcups.dylib in Frameworks */, 276683B81337AD23000D33D0 /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683871337AC97000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683B91337AD31000D33D0 /* libcups.dylib in Frameworks */, 276683BA1337AD31000D33D0 /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683941337ACA2000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683C31337B1B3000D33D0 /* libcups.dylib in Frameworks */, 276683C41337B1B3000D33D0 /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683A11337ACAB000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683C91337B1C1000D33D0 /* libcups.dylib in Frameworks */, 276683CA1337B1C1000D33D0 /* libcupsppdc.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683ED1337F78E000D33D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2767FC4B19266A0D000F61D3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2767FC6B192685E6000F61D3 /* libcups_static.a in Frameworks */, 2767FC6C192685E6000F61D3 /* CoreFoundation.framework in Frameworks */, 2767FC6D192685E6000F61D3 /* libiconv.dylib in Frameworks */, 2767FC6E192685E6000F61D3 /* libresolv.dylib in Frameworks */, 2767FC6F192685E6000F61D3 /* libz.dylib in Frameworks */, 2767FC70192685E6000F61D3 /* Security.framework in Frameworks */, 2767FC71192685E6000F61D3 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 278C58C8136B640300836530 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72BFD5FB191AF0A30005DA37 /* libcups_static.a in Frameworks */, 72BFD5FC191AF0A30005DA37 /* CoreFoundation.framework in Frameworks */, 72BFD5FD191AF0A30005DA37 /* Kerberos.framework in Frameworks */, 72BFD5FE191AF0A30005DA37 /* libiconv.dylib in Frameworks */, 72BFD5FF191AF0A30005DA37 /* libresolv.dylib in Frameworks */, 72BFD600191AF0A30005DA37 /* libz.dylib in Frameworks */, 72BFD601191AF0A30005DA37 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 27A034781A8BDB1200650675 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 27A034851A8BDC5C00650675 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 720DD6BF1358FD5F0064AA82 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220EAB1333047D00FCA411 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 728FB7F11536167A005426E1 /* libiconv.dylib in Frameworks */, 728FB7F21536167A005426E1 /* libresolv.dylib in Frameworks */, 728FB7ED1536161C005426E1 /* libz.dylib in Frameworks */, 728FB7E91536161C005426E1 /* CoreFoundation.framework in Frameworks */, 72D53A2A15B49110003F877F /* GSS.framework in Frameworks */, 728FB7EA1536161C005426E1 /* Kerberos.framework in Frameworks */, 728FB7EB1536161C005426E1 /* Security.framework in Frameworks */, 728FB7EE15361642005426E1 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220F5813330A5A00FCA411 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72D53A3A15B492FA003F877F /* libpam.dylib in Frameworks */, 72220F6613330A7000FCA411 /* libcups.dylib in Frameworks */, 72220FBF13330C1000FCA411 /* libcupsmime.dylib in Frameworks */, 72D53A3415B4925B003F877F /* ApplicationServices.framework in Frameworks */, 72D53A3015B4923F003F877F /* CoreFoundation.framework in Frameworks */, 72D53A3B15B4930A003F877F /* GSS.framework in Frameworks */, 72D53A3515B49270003F877F /* IOKit.framework in Frameworks */, 72D53A3C15B4930A003F877F /* Kerberos.framework in Frameworks */, 72D53A3115B4923F003F877F /* Security.framework in Frameworks */, 72D53A3215B4923F003F877F /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220FA913330B2200FCA411 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72220FBA13330BEE00FCA411 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724378FA1333E43E009631B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724379081333E4A5009631B9 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379151333E532009631B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724379271333E93D009631B9 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 7243792D1333FB85009631B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7243793B1333FB9D009631B9 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379441333FEA9009631B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724379561333FF04009631B9 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379581333FF1D009631B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724379661333FF3B009631B9 /* libcups.dylib in Frameworks */, 72D53A2F15B49174003F877F /* CoreFoundation.framework in Frameworks */, 72D53A2D15B4913D003F877F /* IOKit.framework in Frameworks */, 72D53A2E15B4915B003F877F /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5291CC0370C0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA52A1CC0370C0092477B /* CoreFoundation.framework in Frameworks */, 724FA52B1CC0370C0092477B /* libiconv.dylib in Frameworks */, 724FA52C1CC0370C0092477B /* libresolv.dylib in Frameworks */, 724FA52D1CC0370C0092477B /* libz.dylib in Frameworks */, 724FA52E1CC0370C0092477B /* Security.framework in Frameworks */, 724FA52F1CC0370C0092477B /* SystemConfiguration.framework in Frameworks */, 724FA5301CC0370C0092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA53C1CC037370092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA53D1CC037370092477B /* CoreFoundation.framework in Frameworks */, 724FA53E1CC037370092477B /* libiconv.dylib in Frameworks */, 724FA53F1CC037370092477B /* libresolv.dylib in Frameworks */, 724FA5401CC037370092477B /* libz.dylib in Frameworks */, 724FA5411CC037370092477B /* Security.framework in Frameworks */, 724FA5421CC037370092477B /* SystemConfiguration.framework in Frameworks */, 724FA5431CC037370092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA54F1CC037500092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5501CC037500092477B /* CoreFoundation.framework in Frameworks */, 724FA5511CC037500092477B /* libiconv.dylib in Frameworks */, 724FA5521CC037500092477B /* libresolv.dylib in Frameworks */, 724FA5531CC037500092477B /* libz.dylib in Frameworks */, 724FA5541CC037500092477B /* Security.framework in Frameworks */, 724FA5551CC037500092477B /* SystemConfiguration.framework in Frameworks */, 724FA5561CC037500092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5621CC037670092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5631CC037670092477B /* CoreFoundation.framework in Frameworks */, 724FA5641CC037670092477B /* libiconv.dylib in Frameworks */, 724FA5651CC037670092477B /* libresolv.dylib in Frameworks */, 724FA5661CC037670092477B /* libz.dylib in Frameworks */, 724FA5671CC037670092477B /* Security.framework in Frameworks */, 724FA5681CC037670092477B /* SystemConfiguration.framework in Frameworks */, 724FA5691CC037670092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5751CC037810092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5761CC037810092477B /* libcups_static.a in Frameworks */, 724FA5771CC037810092477B /* CoreFoundation.framework in Frameworks */, 724FA5781CC037810092477B /* libiconv.dylib in Frameworks */, 724FA5791CC037810092477B /* libresolv.dylib in Frameworks */, 724FA57A1CC037810092477B /* libz.dylib in Frameworks */, 724FA57B1CC037810092477B /* Security.framework in Frameworks */, 724FA57C1CC037810092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5881CC037980092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5891CC037980092477B /* libcups_static.a in Frameworks */, 724FA58A1CC037980092477B /* CoreFoundation.framework in Frameworks */, 724FA58B1CC037980092477B /* Kerberos.framework in Frameworks */, 724FA58C1CC037980092477B /* libiconv.dylib in Frameworks */, 724FA58D1CC037980092477B /* libresolv.dylib in Frameworks */, 724FA58E1CC037980092477B /* libz.dylib in Frameworks */, 724FA58F1CC037980092477B /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA59B1CC037AA0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA59C1CC037AA0092477B /* libcups_static.a in Frameworks */, 724FA59D1CC037AA0092477B /* CoreFoundation.framework in Frameworks */, 724FA59E1CC037AA0092477B /* Kerberos.framework in Frameworks */, 724FA59F1CC037AA0092477B /* libiconv.dylib in Frameworks */, 724FA5A01CC037AA0092477B /* libresolv.dylib in Frameworks */, 724FA5A11CC037AA0092477B /* libz.dylib in Frameworks */, 724FA5A21CC037AA0092477B /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5AE1CC037C60092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5AF1CC037C60092477B /* libcups_static.a in Frameworks */, 724FA5B01CC037C60092477B /* CoreFoundation.framework in Frameworks */, 724FA5B11CC037C60092477B /* Kerberos.framework in Frameworks */, 724FA5B21CC037C60092477B /* libiconv.dylib in Frameworks */, 724FA5B31CC037C60092477B /* libresolv.dylib in Frameworks */, 724FA5B41CC037C60092477B /* libz.dylib in Frameworks */, 724FA5B51CC037C60092477B /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5C11CC037D90092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5C21CC037D90092477B /* libcups_static.a in Frameworks */, 724FA5C31CC037D90092477B /* CoreFoundation.framework in Frameworks */, 724FA5C41CC037D90092477B /* Kerberos.framework in Frameworks */, 724FA5C51CC037D90092477B /* libiconv.dylib in Frameworks */, 724FA5C61CC037D90092477B /* libresolv.dylib in Frameworks */, 724FA5C71CC037D90092477B /* libz.dylib in Frameworks */, 724FA5C81CC037D90092477B /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5D61CC037F00092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5D71CC037F00092477B /* libcups_static.a in Frameworks */, 724FA5D81CC037F00092477B /* CoreFoundation.framework in Frameworks */, 724FA5D91CC037F00092477B /* Kerberos.framework in Frameworks */, 724FA5DA1CC037F00092477B /* Security.framework in Frameworks */, 724FA5DB1CC037F00092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5EA1CC038040092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5EB1CC038040092477B /* libcups_static.a in Frameworks */, 724FA5EC1CC038040092477B /* CoreFoundation.framework in Frameworks */, 724FA5ED1CC038040092477B /* Kerberos.framework in Frameworks */, 724FA5EE1CC038040092477B /* Security.framework in Frameworks */, 724FA5EF1CC038040092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5FE1CC038190092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA5FF1CC038190092477B /* libcups_static.a in Frameworks */, 724FA6001CC038190092477B /* CoreFoundation.framework in Frameworks */, 724FA6011CC038190092477B /* Kerberos.framework in Frameworks */, 724FA6021CC038190092477B /* Security.framework in Frameworks */, 724FA6031CC038190092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6121CC0382B0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284DA1CC1251400E517C7 /* libcupsimage_static.a in Frameworks */, 724FA6131CC0382B0092477B /* libcups_static.a in Frameworks */, 724FA6141CC0382B0092477B /* CoreFoundation.framework in Frameworks */, 724FA6151CC0382B0092477B /* Kerberos.framework in Frameworks */, 724FA6161CC0382B0092477B /* Security.framework in Frameworks */, 724FA6171CC0382B0092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6261CC038410092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA6271CC038410092477B /* libcups_static.a in Frameworks */, 724FA6281CC038410092477B /* CoreFoundation.framework in Frameworks */, 724FA6291CC038410092477B /* Kerberos.framework in Frameworks */, 724FA62A1CC038410092477B /* Security.framework in Frameworks */, 724FA62B1CC038410092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA63A1CC038560092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA63B1CC038560092477B /* libcups_static.a in Frameworks */, 724FA63C1CC038560092477B /* CoreFoundation.framework in Frameworks */, 724FA63D1CC038560092477B /* Kerberos.framework in Frameworks */, 724FA63E1CC038560092477B /* Security.framework in Frameworks */, 724FA63F1CC038560092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA64E1CC0386E0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA64F1CC0386E0092477B /* libcups_static.a in Frameworks */, 724FA6501CC0386E0092477B /* CoreFoundation.framework in Frameworks */, 724FA6511CC0386E0092477B /* Kerberos.framework in Frameworks */, 724FA6521CC0386E0092477B /* Security.framework in Frameworks */, 724FA6531CC0386E0092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6651CC038A50092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA6661CC038A50092477B /* libcups_static.a in Frameworks */, 724FA6671CC038A50092477B /* CoreFoundation.framework in Frameworks */, 724FA6681CC038A50092477B /* Kerberos.framework in Frameworks */, 724FA6691CC038A50092477B /* Security.framework in Frameworks */, 724FA66A1CC038A50092477B /* SystemConfiguration.framework in Frameworks */, 724FA66B1CC038A50092477B /* libcupsmime.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6771CC038BD0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA6781CC038BD0092477B /* CoreFoundation.framework in Frameworks */, 724FA6791CC038BD0092477B /* libiconv.dylib in Frameworks */, 724FA67A1CC038BD0092477B /* libresolv.dylib in Frameworks */, 724FA67B1CC038BD0092477B /* libz.dylib in Frameworks */, 724FA67C1CC038BD0092477B /* Security.framework in Frameworks */, 724FA67D1CC038BD0092477B /* SystemConfiguration.framework in Frameworks */, 724FA67E1CC038BD0092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA68C1CC038D90092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA68D1CC038D90092477B /* libcups_static.a in Frameworks */, 724FA68E1CC038D90092477B /* CoreFoundation.framework in Frameworks */, 724FA68F1CC038D90092477B /* Kerberos.framework in Frameworks */, 724FA6901CC038D90092477B /* Security.framework in Frameworks */, 724FA6911CC038D90092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA69E1CC039200092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284D71CC124D700E517C7 /* libcupscgi_static.a in Frameworks */, 724FA69F1CC039200092477B /* CoreFoundation.framework in Frameworks */, 724FA6A01CC039200092477B /* libiconv.dylib in Frameworks */, 724FA6A11CC039200092477B /* libresolv.dylib in Frameworks */, 724FA6A21CC039200092477B /* libz.dylib in Frameworks */, 724FA6A31CC039200092477B /* Security.framework in Frameworks */, 724FA6A41CC039200092477B /* SystemConfiguration.framework in Frameworks */, 724FA6A51CC039200092477B /* libcups_static.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6B11CC0393E0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284D81CC124E300E517C7 /* libcupscgi_static.a in Frameworks */, 724FA6B21CC0393E0092477B /* libcups_static.a in Frameworks */, 724FA6B31CC0393E0092477B /* CoreFoundation.framework in Frameworks */, 724FA6B41CC0393E0092477B /* Kerberos.framework in Frameworks */, 724FA6B51CC0393E0092477B /* libiconv.dylib in Frameworks */, 724FA6B61CC0393E0092477B /* libresolv.dylib in Frameworks */, 724FA6B71CC0393E0092477B /* libz.dylib in Frameworks */, 724FA6B81CC0393E0092477B /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6C61CC0395A0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284DB1CC1251F00E517C7 /* libcupscgi_static.a in Frameworks */, 724FA6C71CC0395A0092477B /* libcups_static.a in Frameworks */, 724FA6C81CC0395A0092477B /* CoreFoundation.framework in Frameworks */, 724FA6C91CC0395A0092477B /* Kerberos.framework in Frameworks */, 724FA6CA1CC0395A0092477B /* Security.framework in Frameworks */, 724FA6CB1CC0395A0092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6DF1CC039DE0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA6E01CC039DE0092477B /* libcups_static.a in Frameworks */, 724FA6E11CC039DE0092477B /* CoreFoundation.framework in Frameworks */, 724FA6E21CC039DE0092477B /* Kerberos.framework in Frameworks */, 724FA6E31CC039DE0092477B /* Security.framework in Frameworks */, 724FA6E41CC039DE0092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6F41CC03A210092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 271284D91CC124F000E517C7 /* libcupsppdc_static.a in Frameworks */, 724FA6F51CC03A210092477B /* libcups_static.a in Frameworks */, 724FA6F61CC03A210092477B /* CoreFoundation.framework in Frameworks */, 724FA6F71CC03A210092477B /* Kerberos.framework in Frameworks */, 724FA6F81CC03A210092477B /* Security.framework in Frameworks */, 724FA6F91CC03A210092477B /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7081CC03A490092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7171CC03A990092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7371CC03AAF0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7481CC03ACC0092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 724FA7491CC03ACC0092477B /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7641CC03AF60092477B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 7258EADF134594C4009286F1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7258EAF413459B6D009286F1 /* libcups.dylib in Frameworks */, 7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 726AD6F4135E88F0002C930D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 279AE6F52395B80F004DD600 /* libpam.tbd in Frameworks */, 273B1ECA226B420C00428143 /* libcups.dylib in Frameworks */, 2767FC6619267538000F61D3 /* CoreFoundation.framework in Frameworks */, 2767FC6719267538000F61D3 /* libresolv.dylib in Frameworks */, 2767FC6819267538000F61D3 /* libz.dylib in Frameworks */, 2767FC6919267538000F61D3 /* Security.framework in Frameworks */, 2767FC6A19267538000F61D3 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 729181B3201155C1005E7560 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 729181B4201155C1005E7560 /* libcupsimage_static.a in Frameworks */, 729181B5201155C1005E7560 /* libcups_static.a in Frameworks */, 729181B6201155C1005E7560 /* CoreFoundation.framework in Frameworks */, 729181B7201155C1005E7560 /* Kerberos.framework in Frameworks */, 729181B8201155C1005E7560 /* Security.framework in Frameworks */, 729181B9201155C1005E7560 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72CF95EB18A19134000FCAE4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72CF95EC18A19134000FCAE4 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72F75A4F1336F950004BB496 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 276683E51337B2BE000D33D0 /* libcupsimage.dylib in Frameworks */, 276683E21337B29C000D33D0 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72F75A5E1336F9A3004BB496 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72F75A671336FA38004BB496 /* libcups.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 2712867F1CC1394100E517C7 /* monitors */ = { isa = PBXGroup; children = ( 271286801CC1396100E517C7 /* bcp.c */, 271286811CC1396100E517C7 /* tbcp.c */, ); name = monitors; sourceTree = ""; }; 271286821CC13D7600E517C7 /* tools */ = { isa = PBXGroup; children = ( 2712871D1CC140B400E517C7 /* genstrings.cxx */, 271286831CC13D9600E517C7 /* checkpo.c */, 271286841CC13D9600E517C7 /* cups.pot */, 271287191CC13FDB00E517C7 /* mantohtml.c */, 271286851CC13D9600E517C7 /* po2strings.c */, 271286861CC13D9600E517C7 /* strings2po.c */, ); name = tools; sourceTree = ""; }; 273BF6B81333B4A90022CAAB /* tests */ = { isa = PBXGroup; children = ( 2712866A1CC130FF00E517C7 /* rasterbench.c */, 724FA65B1CC0389F0092477B /* test1284.c */, 727EF041192E3544001EF690 /* testadmin.c */, 727EF042192E3544001EF690 /* testarray.c */, 724FA65C1CC0389F0092477B /* testbackend.c */, 727EF043192E3544001EF690 /* testcache.c */, 724FA6EC1CC03A1D0092477B /* testcatalog.cxx */, 727EF03D192E3498001EF690 /* testcgi.c */, 729181AB20115597005E7560 /* testclient.c */, 727EF044192E3544001EF690 /* testconflicts.c */, 270D02251D707E3700EA9403 /* testcreds.c */, 273BF6C61333B5370022CAAB /* testcups.c */, 2767FC5119266A36000F61D3 /* testdest.c */, 727EF045192E3544001EF690 /* testfile.c */, 727EF03E192E3498001EF690 /* testhi.c */, 278C58E2136B647200836530 /* testhttp.c */, 727EF046192E3544001EF690 /* testi18n.c */, 727EF047192E3544001EF690 /* testipp.c */, 727EF048192E3544001EF690 /* testlang.c */, 727EF04D192E3602001EF690 /* testlpd.c */, 270CCDBB135E3D3E00007BE2 /* testmime.c */, 724FA6D71CC039D00092477B /* testnotify.c */, 727EF049192E3544001EF690 /* testoptions.c */, 727EF04A192E3544001EF690 /* testppd.c */, 727EF04B192E3544001EF690 /* testpwg.c */, 27F89DA21B3AC43B00E5A4B7 /* testraster.c */, 727EF04C192E3544001EF690 /* testsnmp.c */, 727EF04E192E3602001EF690 /* testspeed.c */, 727EF04F192E3602001EF690 /* testsub.c */, 724FA65D1CC0389F0092477B /* testsupplies.c */, 727EF03F192E3498001EF690 /* testtemplate.c */, 274770E1234534660089BC31 /* testthreads.c */, 271286681CC130BD00E517C7 /* tlscheck.c */, ); name = tests; sourceTree = ""; wrapsLines = 1; }; 274FF5D513332C2C00317ECB /* daemon */ = { isa = PBXGroup; children = ( 274FF6351333344400317ECB /* cups-deviced.c */, 274FF5D613332CC700317ECB /* cups-driverd.cxx */, 274FF6491333398D00317ECB /* cups-exec.c */, 274FF65B133339FC00317ECB /* cups-lpd.c */, 274FF5D713332CC700317ECB /* util.c */, 274FF5D813332CC700317ECB /* util.h */, ); name = daemon; sourceTree = ""; wrapsLines = 1; }; 274FF5F41333310400317ECB /* libcupsppdc */ = { isa = PBXGroup; children = ( 274FF6091333315100317ECB /* ppdc.h */, 274FF5F51333315100317ECB /* ppdc-array.cxx */, 274FF5F61333315100317ECB /* ppdc-attr.cxx */, 274FF5F71333315100317ECB /* ppdc-catalog.cxx */, 274FF5F81333315100317ECB /* ppdc-choice.cxx */, 274FF5F91333315100317ECB /* ppdc-constraint.cxx */, 274FF5FA1333315100317ECB /* ppdc-driver.cxx */, 274FF5FB1333315100317ECB /* ppdc-file.cxx */, 274FF5FC1333315100317ECB /* ppdc-filter.cxx */, 274FF5FD1333315100317ECB /* ppdc-font.cxx */, 274FF5FE1333315100317ECB /* ppdc-group.cxx */, 274FF5FF1333315100317ECB /* ppdc-import.cxx */, 274FF6001333315100317ECB /* ppdc-mediasize.cxx */, 274FF6011333315100317ECB /* ppdc-message.cxx */, 274FF6021333315100317ECB /* ppdc-option.cxx */, 274FF6031333315100317ECB /* ppdc-private.h */, 274FF6041333315100317ECB /* ppdc-profile.cxx */, 274FF6051333315100317ECB /* ppdc-shared.cxx */, 274FF6061333315100317ECB /* ppdc-source.cxx */, 274FF6071333315100317ECB /* ppdc-string.cxx */, 274FF6081333315100317ECB /* ppdc-variable.cxx */, ); name = libcupsppdc; sourceTree = ""; wrapsLines = 1; }; 274FF67313333B0A00317ECB /* commands */ = { isa = PBXGroup; children = ( 2732E089137A3F5200FAFEF6 /* cancel.c */, 2732E08A137A3F5200FAFEF6 /* cupsaccept.c */, 276683681337AA00000D33D0 /* cupsctl.c */, 274FF68713333B6E00317ECB /* cupsfilter.c */, 72F75A5B1336F988004BB496 /* cupstestppd.c */, 273B1EBD226B3EE300428143 /* ippevecommon.h */, 273B1EBE226B3EE300428143 /* ippevepcl.c */, 726AD701135E8A90002C930D /* ippeveprinter.c */, 273B1EBC226B3EE300428143 /* ippeveps.c */, 72CF95F218A19165000FCAE4 /* ippfind.c */, 276683F91337F7A9000D33D0 /* ipptool.c */, 2732E08C137A3F5200FAFEF6 /* lp.c */, 2732E08D137A3F5200FAFEF6 /* lpadmin.c */, 271284DD1CC125FC00E517C7 /* lpc.c */, 2732E08E137A3F5200FAFEF6 /* lpinfo.c */, 2732E08F137A3F5200FAFEF6 /* lpmove.c */, 2732E090137A3F5200FAFEF6 /* lpoptions.c */, 271284DE1CC125FC00E517C7 /* lpq.c */, 271284DF1CC125FC00E517C7 /* lpr.c */, 271284E01CC125FC00E517C7 /* lprm.c */, 2732E092137A3F5200FAFEF6 /* lpstat.c */, ); name = commands; sourceTree = ""; wrapsLines = 1; }; 276683CB1337B1CC000D33D0 /* ppdc tools */ = { isa = PBXGroup; children = ( 276683CC1337B201000D33D0 /* ppdc.cxx */, 276683CE1337B20D000D33D0 /* ppdhtml.cxx */, 276683D01337B21A000D33D0 /* ppdi.cxx */, 276683D21337B228000D33D0 /* ppdmerge.cxx */, 276683D41337B237000D33D0 /* ppdpo.cxx */, ); name = "ppdc tools"; sourceTree = ""; wrapsLines = 1; }; 72220EAF1333047D00FCA411 /* Products */ = { isa = PBXGroup; children = ( 72220F5B13330A5A00FCA411 /* cupsd */, 274FF5CC13332B1F00317ECB /* cups-driverd */, 274FF6291333333600317ECB /* cups-deviced */, 274FF63E1333358B00317ECB /* cups-exec */, 274FF64F133339C400317ECB /* cups-lpd */, 274FF67813333B2F00317ECB /* cupsfilter */, 273BF6BD1333B5000022CAAB /* testcups */, 724378FD1333E43E009631B9 /* ipp */, 724379181333E532009631B9 /* lpd */, 724379301333FB85009631B9 /* socket */, 724379471333FEA9009631B9 /* dnssd */, 7243795B1333FF1D009631B9 /* usb */, 72F75A521336F950004BB496 /* cupstestppd */, 2766835C1337A9B6000D33D0 /* cupsctl */, 276683701337AC79000D33D0 /* ppdc */, 2766837D1337AC8C000D33D0 /* ppdhtml */, 2766838A1337AC97000D33D0 /* ppdi */, 276683971337ACA2000D33D0 /* ppdmerge */, 276683A41337ACAB000D33D0 /* ppdpo */, 276683F01337F78E000D33D0 /* ipptool */, 7258EAE2134594C4009286F1 /* rastertopwg */, 720DD6C21358FD5F0064AA82 /* snmp */, 270CCDA7135E3C9E00007BE2 /* testmime */, 726AD6F7135E88F0002C930D /* ippeveprinter */, 278C58CB136B640300836530 /* testhttp */, 72A4332F155844CF002E172D /* libcups_static.a */, 72CF95F118A19134000FCAE4 /* ipptool copy */, 2767FC5019266A0D000F61D3 /* testdest */, 27A0347B1A8BDB1300650675 /* lpadmin */, 2706965A1CADF3E200FFE5FB /* libcups_ios.a */, 724FA5351CC0370C0092477B /* testadmin */, 724FA5481CC037370092477B /* testarray */, 724FA55B1CC037500092477B /* testcache */, 724FA56E1CC037670092477B /* testconflicts */, 724FA5811CC037810092477B /* testfile */, 724FA5941CC037980092477B /* testi18n */, 724FA5A71CC037AA0092477B /* testipp */, 724FA5BA1CC037C60092477B /* testlang */, 724FA5CD1CC037D90092477B /* testlpd */, 724FA5E11CC037F00092477B /* testoptions */, 724FA5F51CC038040092477B /* testppd */, 724FA6091CC038190092477B /* testpwg */, 724FA61D1CC0382B0092477B /* testraster */, 724FA6311CC038410092477B /* testsnmp */, 724FA6451CC038560092477B /* testspeed */, 724FA6591CC0386E0092477B /* testsub */, 724FA6701CC038A50092477B /* test1284 */, 724FA6831CC038BD0092477B /* testbackend */, 724FA6971CC038D90092477B /* testsupplies */, 724FA6AA1CC039200092477B /* testcgi */, 724FA6BD1CC0393E0092477B /* testhi */, 724FA6D11CC0395A0092477B /* testtemplate */, 724FA6EA1CC039DE0092477B /* testnotify */, 724FA6FF1CC03A210092477B /* testcatalog */, 724FA70F1CC03A490092477B /* libcupsimage_static.a */, 724FA71F1CC03A990092477B /* libcupsmime_static.a */, 724FA7401CC03AAF0092477B /* libcupsppdc_static.a */, 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */, 724FA76B1CC03AF60092477B /* libcupscgi_static.a */, 271284EC1CC1261900E517C7 /* cancel */, 271284F91CC1264B00E517C7 /* cupsaccept */, 271285131CC1267A00E517C7 /* lp */, 271285201CC1269700E517C7 /* lpc */, 2712852D1CC126AA00E517C7 /* lpinfo */, 2712853A1CC1270B00E517C7 /* lpmove */, 271285471CC1271E00E517C7 /* lpoptions */, 271285541CC1272D00E517C7 /* lpq */, 271285611CC1274300E517C7 /* lpr */, 2712856E1CC1275200E517C7 /* lprm */, 2712857B1CC1276400E517C7 /* lpstat */, 271285A01CC12D1300E517C7 /* admin.cgi */, 271285AF1CC12D3A00E517C7 /* classes.cgi */, 271285BD1CC12D4E00E517C7 /* jobs.cgi */, 271285CB1CC12D5E00E517C7 /* printers.cgi */, 271285D81CC12DBF00E517C7 /* commandtops */, 271285E51CC12DDF00E517C7 /* gziptoany */, 271285F21CC12E2E00E517C7 /* pstops */, 271286001CC12EEB00E517C7 /* rastertoepson */, 271286131CC12F0B00E517C7 /* rastertohp */, 271286231CC12F1A00E517C7 /* rastertolabel */, 271286671CC1309000E517C7 /* tlscheck */, 2712867D1CC1310E00E517C7 /* rasterbench */, 271286961CC13DC000E517C7 /* checkpo */, 271286A71CC13DF100E517C7 /* po2strings */, 271286B81CC13DFF00E517C7 /* strings2po */, 271286C91CC13E2100E517C7 /* bcp */, 271286D91CC13E5B00E517C7 /* tbcp */, 271286F31CC13F2000E517C7 /* mailto */, 271287031CC13F3F00E517C7 /* rss */, 271287181CC13FAB00E517C7 /* mantohtml */, 2712872C1CC140BE00E517C7 /* genstrings */, 270D02241D707E0200EA9403 /* testcreds */, 729181BE201155C1005E7560 /* testclient */, 273B1EAA226B3E4800428143 /* ippevepcl */, 273B1EBB226B3E5200428143 /* ippeveps */, 274770E02345342B0089BC31 /* testthreads */, ); name = Products; sourceTree = ""; }; 72220EB41333050100FCA411 /* libcups */ = { isa = PBXGroup; children = ( 72220EB51333052D00FCA411 /* adminutil.c */, 72220EB81333056300FCA411 /* array.c */, 72220EBB1333056300FCA411 /* auth.c */, 72220EBC1333056300FCA411 /* backchannel.c */, 72220EBD1333056300FCA411 /* backend.c */, 276683561337A8C5000D33D0 /* cups.strings */, 722A24EE2178D00C000CAB20 /* debug-internal.h */, 72220ED1133305BB00FCA411 /* debug.c */, 72CF95E018A13543000FCAE4 /* dest-job.c */, 72CF95E118A13543000FCAE4 /* dest-localization.c */, 72CF95E218A13543000FCAE4 /* dest-options.c */, 72220ED2133305BB00FCA411 /* dest.c */, 72220ED3133305BB00FCA411 /* dir.c */, 72220ED4133305BB00FCA411 /* dir.h */, 72220ED6133305BB00FCA411 /* encode.c */, 72220ED8133305BB00FCA411 /* file.c */, 72220EDA133305BB00FCA411 /* getdevices.c */, 72220EDB133305BB00FCA411 /* getifaddrs.c */, 72220EDC133305BB00FCA411 /* getputfile.c */, 72220EDD133305BB00FCA411 /* globals.c */, 7284F9EF1BFCCD940026F886 /* hash.c */, 72220EDE133305BB00FCA411 /* http-addr.c */, 72220EDF133305BB00FCA411 /* http-addrlist.c */, 72220EE1133305BB00FCA411 /* http-support.c */, 72220EE2133305BB00FCA411 /* http.c */, 720E854120164E7A00C6C411 /* ipp-file.c */, 72220EE5133305BB00FCA411 /* ipp-support.c */, 720E854220164E7A00C6C411 /* ipp-vars.c */, 72220EE6133305BB00FCA411 /* ipp.c */, 72220EE8133305BB00FCA411 /* langprintf.c */, 72220EEA133305BB00FCA411 /* language.c */, 27D3037D134148CB00F022B1 /* libcups2.def */, 72220EEE133305BB00FCA411 /* md5-internal.h */, 72220EEF133305BB00FCA411 /* md5.c */, 72220EF0133305BB00FCA411 /* md5passwd.c */, 72220EF1133305BB00FCA411 /* notify.c */, 72220EF2133305BB00FCA411 /* options.c */, 72220EBA1333056300FCA411 /* ppd-attr.c */, 72220EF4133305BB00FCA411 /* ppd-cache.c */, 72220EBF1333056300FCA411 /* ppd-conflicts.c */, 72220EC21333056300FCA411 /* ppd-custom.c */, 72220ED5133305BB00FCA411 /* ppd-emit.c */, 72220EEC133305BB00FCA411 /* ppd-localize.c */, 72220EED133305BB00FCA411 /* ppd-mark.c */, 72220EF3133305BB00FCA411 /* ppd-page.c */, 72A8B3D61C188BDE00A1A547 /* ppd-util.c */, 72220EF6133305BB00FCA411 /* ppd.c */, 72220EF8133305BB00FCA411 /* pwg-media.c */, 72F75A691336FA8A004BB496 /* raster-error.c */, 72F75A6A1336FA8A004BB496 /* raster-interpret.c */, 72F75A6B1336FA8A004BB496 /* raster-stream.c */, 72220EFB133305BB00FCA411 /* request.c */, 72220EFC133305BB00FCA411 /* sidechannel.c */, 72220EFF133305BB00FCA411 /* snmp.c */, 72220F00133305BB00FCA411 /* snprintf.c */, 72220F02133305BB00FCA411 /* string.c */, 72220F03133305BB00FCA411 /* tempfile.c */, 72220F05133305BB00FCA411 /* thread.c */, 270B267D17F5C06700C8A3A9 /* tls-darwin.c */, 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */, 270B268117F5C5D600C8A3A9 /* tls-sspi.c */, 727AD5B619100A58009F6862 /* tls.c */, 72220F06133305BB00FCA411 /* transcode.c */, 72220F08133305BB00FCA411 /* usersys.c */, 72220F09133305BB00FCA411 /* util.c */, ); name = libcups; sourceTree = ""; wrapsLines = 1; }; 72220F45133305D000FCA411 /* Public Headers */ = { isa = PBXGroup; children = ( 72220EB71333056300FCA411 /* adminutil.h */, 72220EB91333056300FCA411 /* array.h */, 72220EBE1333056300FCA411 /* backend.h */, 72220EC11333056300FCA411 /* cups.h */, 72220ED9133305BB00FCA411 /* file.h */, 72220EE3133305BB00FCA411 /* http.h */, 72220EE7133305BB00FCA411 /* ipp.h */, 72220EEB133305BB00FCA411 /* language.h */, 72220EF7133305BB00FCA411 /* ppd.h */, 2767FC7519269687000F61D3 /* pwg.h */, 72220EFA133305BB00FCA411 /* raster.h */, 72220EFD133305BB00FCA411 /* sidechannel.h */, 72220F07133305BB00FCA411 /* transcode.h */, 72220F0A133305BB00FCA411 /* versioning.h */, ); name = "Public Headers"; sourceTree = ""; wrapsLines = 1; }; 72220F461333060C00FCA411 /* Private Headers */ = { isa = PBXGroup; children = ( 7234F41F1378A16F00D3E9C9 /* array-private.h */, 72220F471333063D00FCA411 /* config.h */, 72220EC01333056300FCA411 /* cups-private.h */, 722A24F22178D090000CAB20 /* debug-private.h */, 72220ED7133305BB00FCA411 /* file-private.h */, 72220EE0133305BB00FCA411 /* http-private.h */, 72220EE4133305BB00FCA411 /* ipp-private.h */, 72220EE9133305BB00FCA411 /* language-private.h */, 72220EF5133305BB00FCA411 /* ppd-private.h */, 72220EF9133305BB00FCA411 /* pwg-private.h */, 2767FC76192696A0000F61D3 /* raster-private.h */, 72220EFE133305BB00FCA411 /* snmp-private.h */, 72220F01133305BB00FCA411 /* string-private.h */, 72220F04133305BB00FCA411 /* thread-private.h */, ); name = "Private Headers"; sourceTree = ""; wrapsLines = 1; }; 72220F5D13330A5A00FCA411 /* cupsd */ = { isa = PBXGroup; children = ( 72E65BDC18DC852700097E89 /* Makefile */, 7226369B18AE6D19004ED309 /* org.cups.cups-lpd.plist */, 72E65BD518DC818400097E89 /* org.cups.cups-lpd.plist.in */, 72496E171A13A03B0051899C /* org.cups.cups-lpdAT.service.in */, 72496E161A13A03B0051899C /* org.cups.cups-lpd.socket */, 72E65BD618DC818400097E89 /* org.cups.cupsd.path.in */, 7226369C18AE6D19004ED309 /* org.cups.cupsd.plist */, 72E65BD718DC818400097E89 /* org.cups.cupsd.service.in */, 72E65BD818DC818400097E89 /* org.cups.cupsd.socket.in */, 72220F6913330B0C00FCA411 /* auth.c */, 72220F6A13330B0C00FCA411 /* auth.h */, 72220F6B13330B0C00FCA411 /* banners.c */, 72220F6C13330B0C00FCA411 /* banners.h */, 72220F6D13330B0C00FCA411 /* cert.c */, 72220F6E13330B0C00FCA411 /* cert.h */, 72220F6F13330B0C00FCA411 /* classes.c */, 72220F7013330B0C00FCA411 /* classes.h */, 72220F7113330B0C00FCA411 /* client.c */, 72220F7213330B0C00FCA411 /* client.h */, 72D53A3615B4929D003F877F /* colorman.c */, 72D53A3715B4929D003F877F /* colorman.h */, 72220F7313330B0C00FCA411 /* conf.c */, 72220F7413330B0C00FCA411 /* conf.h */, 72220F7513330B0C00FCA411 /* cupsd.h */, 72220F7613330B0C00FCA411 /* dirsvc.c */, 72220F7713330B0C00FCA411 /* dirsvc.h */, 72220F7813330B0C00FCA411 /* env.c */, 72C16CB8137B195D007E4BF4 /* file.c */, 72220F7913330B0C00FCA411 /* ipp.c */, 72220F7A13330B0C00FCA411 /* job.c */, 72220F7B13330B0C00FCA411 /* job.h */, 72220F7C13330B0C00FCA411 /* listen.c */, 72220F7D13330B0C00FCA411 /* log.c */, 72220F7E13330B0C00FCA411 /* main.c */, 72220F7F13330B0C00FCA411 /* network.c */, 72220F8013330B0C00FCA411 /* network.h */, 72220F8113330B0C00FCA411 /* policy.c */, 72220F8213330B0C00FCA411 /* policy.h */, 72220F8313330B0C00FCA411 /* printers.c */, 72220F8413330B0C00FCA411 /* printers.h */, 72220F8513330B0C00FCA411 /* process.c */, 72220F8613330B0C00FCA411 /* quotas.c */, 72220F8813330B0C00FCA411 /* select.c */, 72220F8913330B0C00FCA411 /* server.c */, 72220F8A13330B0C00FCA411 /* statbuf.c */, 72220F8B13330B0C00FCA411 /* statbuf.h */, 72220F8C13330B0C00FCA411 /* subscriptions.c */, 72220F8D13330B0C00FCA411 /* subscriptions.h */, 72220F8E13330B0C00FCA411 /* sysman.c */, 72220F8F13330B0C00FCA411 /* sysman.h */, ); name = cupsd; path = .; sourceTree = ""; wrapsLines = 1; }; 72220FB013330B3400FCA411 /* libcupsmime */ = { isa = PBXGroup; children = ( 72220FB413330BCE00FCA411 /* mime.h */, 7271883C1374AB14001A2036 /* mime-private.h */, 72220FB213330BCE00FCA411 /* filter.c */, 72220FB313330BCE00FCA411 /* mime.c */, 72220FB513330BCE00FCA411 /* type.c */, ); name = libcupsmime; sourceTree = ""; wrapsLines = 1; }; 72220FB113330B4A00FCA411 /* Frameworks */ = { isa = PBXGroup; children = ( 279AE6F42395B80F004DD600 /* libpam.tbd */, 2767FC591926750C000F61D3 /* CoreFoundation.framework */, 2767FC5A1926750C000F61D3 /* libiconv.dylib */, 2767FC5B1926750C000F61D3 /* libresolv.dylib */, 2767FC5C1926750C000F61D3 /* libz.dylib */, 2767FC5D1926750C000F61D3 /* Security.framework */, 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */, 72D53A3915B492FA003F877F /* libpam.dylib */, 72D53A3315B4925B003F877F /* ApplicationServices.framework */, 72D53A2C15B4913D003F877F /* IOKit.framework */, 72D53A2915B49110003F877F /* GSS.framework */, 728FB7EF1536167A005426E1 /* libiconv.dylib */, 728FB7F01536167A005426E1 /* libresolv.dylib */, 728FB7EC1536161C005426E1 /* libz.dylib */, 278C58E5136B64AF00836530 /* CoreFoundation.framework */, 278C58E6136B64B000836530 /* Kerberos.framework */, 278C58E7136B64B000836530 /* Security.framework */, 278C58E8136B64B000836530 /* SystemConfiguration.framework */, 72220EAE1333047D00FCA411 /* libcups.dylib */, 72F75A611336F9A3004BB496 /* libcupsimage.dylib */, 72220FAC13330B2200FCA411 /* libcupsmime.dylib */, 274FF5EE133330C800317ECB /* libcupsppdc.dylib */, ); name = Frameworks; sourceTree = ""; }; 724378F71333E3CE009631B9 /* backends */ = { isa = PBXGroup; children = ( 724379091333E4E3009631B9 /* backend-private.h */, 724379501333FEBB009631B9 /* dnssd.c */, 724379CA1334000E009631B9 /* ieee1284.c */, 7243790A1333E4E3009631B9 /* ipp.c */, 724379281333E952009631B9 /* lpd.c */, 7243790B1333E4E3009631B9 /* network.c */, 724379121333E516009631B9 /* runloop.c */, 7243790C1333E4E3009631B9 /* snmp-supplies.c */, 720DD6D21358FDDE0064AA82 /* snmp.c */, 7243793C1333FD19009631B9 /* socket.c */, 724379C51333FFC7009631B9 /* usb.c */, 724379C41333FFC7009631B9 /* usb-darwin.c */, 72FC29CF1A37A1CA00BDF935 /* usb-libusb.c */, 72FC29D01A37A1CA00BDF935 /* usb-unix.c */, 72F7F1D719D1C0CC00870B09 /* org.cups.usb-quirks */, ); name = backends; sourceTree = ""; wrapsLines = 1; }; 724FA6D31CC0399D0092477B /* notifiers */ = { isa = PBXGroup; children = ( 724FA6D41CC039D00092477B /* dbus.c */, 724FA6D51CC039D00092477B /* mailto.c */, 724FA6D61CC039D00092477B /* rss.c */, ); name = notifiers; sourceTree = ""; }; 7258EADC134594A8009286F1 /* filters */ = { isa = PBXGroup; children = ( 7271881713746EA8001A2036 /* commandtops.c */, 7271881813746EA8001A2036 /* common.c */, 7271881913746EA8001A2036 /* common.h */, 7271881A13746EA8001A2036 /* gziptoany.c */, 7271882013746EA8001A2036 /* pstops.c */, 7271882113746EA8001A2036 /* rastertoepson.c */, 7271882213746EA8001A2036 /* rastertohp.c */, 7271882313746EA8001A2036 /* rastertolabel.c */, 7258EAEC134594EB009286F1 /* rastertopwg.c */, ); name = filters; sourceTree = ""; wrapsLines = 1; }; 727EF02E192E3461001EF690 /* cgi-bin */ = { isa = PBXGroup; children = ( 727EF02F192E3498001EF690 /* admin.c */, 727EF030192E3498001EF690 /* cgi-private.h */, 727EF031192E3498001EF690 /* cgi.h */, 727EF032192E3498001EF690 /* classes.c */, 727EF033192E3498001EF690 /* help-index.c */, 727EF034192E3498001EF690 /* help-index.h */, 727EF035192E3498001EF690 /* help.c */, 727EF036192E3498001EF690 /* html.c */, 727EF037192E3498001EF690 /* ipp-var.c */, 727EF038192E3498001EF690 /* jobs.c */, 727EF039192E3498001EF690 /* makedocset.c */, 727EF03A192E3498001EF690 /* printers.c */, 727EF03B192E3498001EF690 /* search.c */, 727EF03C192E3498001EF690 /* template.c */, 727EF040192E3498001EF690 /* var.c */, ); name = "cgi-bin"; sourceTree = ""; }; 72BF96351333042100B1EAD7 = { isa = PBXGroup; children = ( 72E65BA218DC796500097E89 /* Autoconf Files */, 72E65BB818DC79F800097E89 /* Documentation */, 72220F45133305D000FCA411 /* Public Headers */, 72220F461333060C00FCA411 /* Private Headers */, 72220EB41333050100FCA411 /* libcups */, 72F75A681336FA42004BB496 /* libcupsimage */, 72220FB013330B3400FCA411 /* libcupsmime */, 274FF5F41333310400317ECB /* libcupsppdc */, 724378F71333E3CE009631B9 /* backends */, 727EF02E192E3461001EF690 /* cgi-bin */, 274FF67313333B0A00317ECB /* commands */, 72220F5D13330A5A00FCA411 /* cupsd */, 274FF5D513332C2C00317ECB /* daemon */, 7258EADC134594A8009286F1 /* filters */, 2712867F1CC1394100E517C7 /* monitors */, 724FA6D31CC0399D0092477B /* notifiers */, 276683CB1337B1CC000D33D0 /* ppdc tools */, 273BF6B81333B4A90022CAAB /* tests */, 271286821CC13D7600E517C7 /* tools */, 72220FB113330B4A00FCA411 /* Frameworks */, 72220EAF1333047D00FCA411 /* Products */, ); indentWidth = 2; sourceTree = ""; tabWidth = 8; wrapsLines = 1; }; 72E65BA218DC796500097E89 /* Autoconf Files */ = { isa = PBXGroup; children = ( 72E65BD918DC850A00097E89 /* Makefile */, 72E65BB718DC79CC00097E89 /* Makedefs.in */, 72E65BA318DC797E00097E89 /* configure.ac */, 7226369D18AE73BB004ED309 /* config.h.in */, 72E65BB618DC79CC00097E89 /* cups-config.in */, 72E65BA418DC799B00097E89 /* cups-common.m4 */, 72E65BA518DC799B00097E89 /* cups-compiler.m4 */, 72E65BA618DC799B00097E89 /* cups-defaults.m4 */, 72E65BA718DC799B00097E89 /* cups-directories.m4 */, 72E65BA818DC799B00097E89 /* cups-dnssd.m4 */, 72E65BA918DC799B00097E89 /* cups-gssapi.m4 */, 72E65BAA18DC799B00097E89 /* cups-largefile.m4 */, 72E65BAB18DC799B00097E89 /* cups-startup.m4 */, 72E65BAC18DC799B00097E89 /* cups-libtool.m4 */, 72E65BAD18DC799B00097E89 /* cups-manpages.m4 */, 72E65BAE18DC799B00097E89 /* cups-network.m4 */, 72E65BAF18DC799B00097E89 /* cups-opsys.m4 */, 72E65BB018DC799B00097E89 /* cups-pam.m4 */, 72E65BB118DC799B00097E89 /* cups-poll.m4 */, 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */, 72E65BB418DC799B00097E89 /* cups-ssl.m4 */, 72E65BB518DC799B00097E89 /* cups-threads.m4 */, ); name = "Autoconf Files"; sourceTree = ""; }; 72E65BB818DC79F800097E89 /* Documentation */ = { isa = PBXGroup; children = ( 274561481F545B2E000378E4 /* api-admin.header */, 274561491F545B2E000378E4 /* api-admin.shtml */, 72E65BC118DC7A6B00097E89 /* api-filter.header */, 72E65BC218DC7A6B00097E89 /* api-filter.shtml */, 72E65BC718DC7A6B00097E89 /* api-ppd.header */, 72E65BC818DC7A6B00097E89 /* api-ppd.shtml */, 72E65BCB18DC7A9800097E89 /* api-raster.header */, 72E65BCC18DC7A9800097E89 /* api-raster.shtml */, 72E65BDE18DCA35700097E89 /* CHANGES.md */, 72E65BDF18DCA35700097E89 /* CREDITS.md */, 274561471F545B2E000378E4 /* cupspm.md */, 72E65BB918DC7A3600097E89 /* doc */, 72E65BE018DCA35700097E89 /* INSTALL.md */, 72E65BE218DCA35700097E89 /* LICENSE */, 72E65BBA18DC7A3600097E89 /* man */, 72646E58203D0FCA00231A77 /* NOTICE */, 72E65BCD18DC7A9800097E89 /* postscript-driver.header */, 72E65BCE18DC7A9800097E89 /* postscript-driver.shtml */, 72E65BCF18DC7A9800097E89 /* ppd-compiler.header */, 72E65BD018DC7A9800097E89 /* ppd-compiler.shtml */, 72E65BD118DC7A9800097E89 /* raster-driver.header */, 72E65BD218DC7A9800097E89 /* raster-driver.shtml */, 72E65BE318DCA35700097E89 /* README.md */, 72E65BD318DC7A9800097E89 /* spec-ppd.header */, 72E65BD418DC7A9800097E89 /* spec-ppd.shtml */, ); name = Documentation; sourceTree = ""; }; 72F75A681336FA42004BB496 /* libcupsimage */ = { isa = PBXGroup; children = ( 7253C45C216ED51400494ADD /* raster-interstub.c */, 7253C45D216ED51500494ADD /* raster-stubs.c */, ); name = libcupsimage; sourceTree = ""; wrapsLines = 1; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 2706963C1CADF3E200FFE5FB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 2706963E1CADF3E200FFE5FB /* array.h in Headers */, 7253C469216ED5D400494ADD /* raster.h in Headers */, 722A24F42178D091000CAB20 /* debug-private.h in Headers */, 270696401CADF3E200FFE5FB /* cups-private.h in Headers */, 7253C471216ED6C400494ADD /* array-private.h in Headers */, 270696421CADF3E200FFE5FB /* file-private.h in Headers */, 270696431CADF3E200FFE5FB /* http-private.h in Headers */, 270696441CADF3E200FFE5FB /* ipp-private.h in Headers */, 270696451CADF3E200FFE5FB /* language-private.h in Headers */, 270696461CADF3E200FFE5FB /* md5-internal.h in Headers */, 270696481CADF3E200FFE5FB /* pwg-private.h in Headers */, 2706964A1CADF3E200FFE5FB /* string-private.h in Headers */, 7253C46C216ED5E500494ADD /* raster-private.h in Headers */, 2706964B1CADF3E200FFE5FB /* thread-private.h in Headers */, 2706964C1CADF3E200FFE5FB /* config.h in Headers */, 2706964D1CADF3E200FFE5FB /* cups.h in Headers */, 722A24F02178D00D000CAB20 /* debug-internal.h in Headers */, 2706964E1CADF3E200FFE5FB /* dir.h in Headers */, 2706964F1CADF3E200FFE5FB /* file.h in Headers */, 270696501CADF3E200FFE5FB /* http.h in Headers */, 270696511CADF3E200FFE5FB /* ipp.h in Headers */, 270696521CADF3E200FFE5FB /* language.h in Headers */, 7253C470216ED69400494ADD /* pwg.h in Headers */, 270696551CADF3E200FFE5FB /* transcode.h in Headers */, 270696561CADF3E200FFE5FB /* versioning.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF5EC133330C800317ECB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 274FF61E1333315100317ECB /* ppdc.h in Headers */, 274FF6181333315100317ECB /* ppdc-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF6C11333B1C400317ECB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 722A24F52178D091000CAB20 /* debug-private.h in Headers */, 274FF6C61333B1C400317ECB /* dir.h in Headers */, 722A24F12178D00D000CAB20 /* debug-internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220EAC1333047D00FCA411 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 72220EC41333056300FCA411 /* adminutil.h in Headers */, 72220EC61333056300FCA411 /* array.h in Headers */, 72220ECB1333056300FCA411 /* backend.h in Headers */, 72220ECE1333056300FCA411 /* cups.h in Headers */, 7253C46B216ED5E400494ADD /* raster-private.h in Headers */, 72220F0E133305BB00FCA411 /* dir.h in Headers */, 72220F13133305BB00FCA411 /* file.h in Headers */, 72220F1D133305BB00FCA411 /* http.h in Headers */, 72220F21133305BB00FCA411 /* ipp.h in Headers */, 72220F25133305BB00FCA411 /* language.h in Headers */, 72220F31133305BB00FCA411 /* ppd.h in Headers */, 722A24F32178D091000CAB20 /* debug-private.h in Headers */, 72220F37133305BB00FCA411 /* sidechannel.h in Headers */, 72220F41133305BB00FCA411 /* transcode.h in Headers */, 72220F44133305BB00FCA411 /* versioning.h in Headers */, 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */, 72220ECD1333056300FCA411 /* cups-private.h in Headers */, 72220F11133305BB00FCA411 /* file-private.h in Headers */, 72220F1A133305BB00FCA411 /* http-private.h in Headers */, 72220F1E133305BB00FCA411 /* ipp-private.h in Headers */, 72220F23133305BB00FCA411 /* language-private.h in Headers */, 7253C46F216ED69200494ADD /* pwg.h in Headers */, 72220F28133305BB00FCA411 /* md5-internal.h in Headers */, 72220F2F133305BB00FCA411 /* ppd-private.h in Headers */, 72220F33133305BB00FCA411 /* pwg-private.h in Headers */, 72220F38133305BB00FCA411 /* snmp-private.h in Headers */, 72220F3B133305BB00FCA411 /* string-private.h in Headers */, 72220F3E133305BB00FCA411 /* thread-private.h in Headers */, 722A24EF2178D00D000CAB20 /* debug-internal.h in Headers */, 72220F481333063D00FCA411 /* config.h in Headers */, 7253C468216ED5D300494ADD /* raster.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220FAA13330B2200FCA411 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 72220FB813330BCE00FCA411 /* mime.h in Headers */, 7271883D1374AB14001A2036 /* mime-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA70A1CC03A490092477B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7191CC03A990092477B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 724FA71A1CC03A990092477B /* mime.h in Headers */, 724FA71B1CC03A990092477B /* mime-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA73A1CC03AAF0092477B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 724FA73C1CC03AAF0092477B /* ppdc-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA74A1CC03ACC0092477B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 724FA76D1CC03B4D0092477B /* cgi.h in Headers */, 724FA76C1CC03B4D0092477B /* cgi-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7661CC03AF60092477B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 724FA7701CC03B820092477B /* cgi.h in Headers */, 724FA76F1CC03B820092477B /* cgi-private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 72F75A5F1336F9A3004BB496 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 270695FD1CADF3E200FFE5FB /* libcups_ios */ = { isa = PBXNativeTarget; buildConfigurationList = 270696571CADF3E200FFE5FB /* Build configuration list for PBXNativeTarget "libcups_ios" */; buildPhases = ( 270695FE1CADF3E200FFE5FB /* Sources */, 270696331CADF3E200FFE5FB /* Frameworks */, 2706963C1CADF3E200FFE5FB /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcups_ios; productName = libcups; productReference = 2706965A1CADF3E200FFE5FB /* libcups_ios.a */; productType = "com.apple.product-type.library.dynamic"; }; 270CCDA6135E3C9E00007BE2 /* testmime */ = { isa = PBXNativeTarget; buildConfigurationList = 270CCDAF135E3C9E00007BE2 /* Build configuration list for PBXNativeTarget "testmime" */; buildPhases = ( 270CCDA3135E3C9E00007BE2 /* Sources */, 270CCDA4135E3C9E00007BE2 /* Frameworks */, 270CCDA5135E3C9E00007BE2 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284D61CC1234D00E517C7 /* PBXTargetDependency */, 270CCDB8135E3CFD00007BE2 /* PBXTargetDependency */, ); name = testmime; productName = testmime; productReference = 270CCDA7135E3C9E00007BE2 /* testmime */; productType = "com.apple.product-type.tool"; }; 270D02131D707E0200EA9403 /* testcreds */ = { isa = PBXNativeTarget; buildConfigurationList = 270D02211D707E0200EA9403 /* Build configuration list for PBXNativeTarget "testcreds" */; buildPhases = ( 270D02161D707E0200EA9403 /* Sources */, 270D02181D707E0200EA9403 /* Frameworks */, 270D02201D707E0200EA9403 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 270D02141D707E0200EA9403 /* PBXTargetDependency */, ); name = testcreds; productName = testhttp; productReference = 270D02241D707E0200EA9403 /* testcreds */; productType = "com.apple.product-type.tool"; }; 271284E11CC1261900E517C7 /* cancel */ = { isa = PBXNativeTarget; buildConfigurationList = 271284E91CC1261900E517C7 /* Build configuration list for PBXNativeTarget "cancel" */; buildPhases = ( 271284E41CC1261900E517C7 /* Sources */, 271284E61CC1261900E517C7 /* Frameworks */, 271284E81CC1261900E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284E21CC1261900E517C7 /* PBXTargetDependency */, ); name = cancel; productName = cupsaddsmb; productReference = 271284EC1CC1261900E517C7 /* cancel */; productType = "com.apple.product-type.tool"; }; 271284EE1CC1264B00E517C7 /* cupsaccept */ = { isa = PBXNativeTarget; buildConfigurationList = 271284F61CC1264B00E517C7 /* Build configuration list for PBXNativeTarget "cupsaccept" */; buildPhases = ( 271284F11CC1264B00E517C7 /* Sources */, 271284F31CC1264B00E517C7 /* Frameworks */, 271284F51CC1264B00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284EF1CC1264B00E517C7 /* PBXTargetDependency */, ); name = cupsaccept; productName = cupsaddsmb; productReference = 271284F91CC1264B00E517C7 /* cupsaccept */; productType = "com.apple.product-type.tool"; }; 271285081CC1267A00E517C7 /* lp */ = { isa = PBXNativeTarget; buildConfigurationList = 271285101CC1267A00E517C7 /* Build configuration list for PBXNativeTarget "lp" */; buildPhases = ( 2712850B1CC1267A00E517C7 /* Sources */, 2712850D1CC1267A00E517C7 /* Frameworks */, 2712850F1CC1267A00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285091CC1267A00E517C7 /* PBXTargetDependency */, ); name = lp; productName = cupsaddsmb; productReference = 271285131CC1267A00E517C7 /* lp */; productType = "com.apple.product-type.tool"; }; 271285151CC1269700E517C7 /* lpc */ = { isa = PBXNativeTarget; buildConfigurationList = 2712851D1CC1269700E517C7 /* Build configuration list for PBXNativeTarget "lpc" */; buildPhases = ( 271285181CC1269700E517C7 /* Sources */, 2712851A1CC1269700E517C7 /* Frameworks */, 2712851C1CC1269700E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285161CC1269700E517C7 /* PBXTargetDependency */, ); name = lpc; productName = cupsaddsmb; productReference = 271285201CC1269700E517C7 /* lpc */; productType = "com.apple.product-type.tool"; }; 271285221CC126AA00E517C7 /* lpinfo */ = { isa = PBXNativeTarget; buildConfigurationList = 2712852A1CC126AA00E517C7 /* Build configuration list for PBXNativeTarget "lpinfo" */; buildPhases = ( 271285251CC126AA00E517C7 /* Sources */, 271285271CC126AA00E517C7 /* Frameworks */, 271285291CC126AA00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285231CC126AA00E517C7 /* PBXTargetDependency */, ); name = lpinfo; productName = cupsaddsmb; productReference = 2712852D1CC126AA00E517C7 /* lpinfo */; productType = "com.apple.product-type.tool"; }; 2712852F1CC1270B00E517C7 /* lpmove */ = { isa = PBXNativeTarget; buildConfigurationList = 271285371CC1270B00E517C7 /* Build configuration list for PBXNativeTarget "lpmove" */; buildPhases = ( 271285321CC1270B00E517C7 /* Sources */, 271285341CC1270B00E517C7 /* Frameworks */, 271285361CC1270B00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285301CC1270B00E517C7 /* PBXTargetDependency */, ); name = lpmove; productName = cupsaddsmb; productReference = 2712853A1CC1270B00E517C7 /* lpmove */; productType = "com.apple.product-type.tool"; }; 2712853C1CC1271E00E517C7 /* lpoptions */ = { isa = PBXNativeTarget; buildConfigurationList = 271285441CC1271E00E517C7 /* Build configuration list for PBXNativeTarget "lpoptions" */; buildPhases = ( 2712853F1CC1271E00E517C7 /* Sources */, 271285411CC1271E00E517C7 /* Frameworks */, 271285431CC1271E00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2712853D1CC1271E00E517C7 /* PBXTargetDependency */, ); name = lpoptions; productName = cupsaddsmb; productReference = 271285471CC1271E00E517C7 /* lpoptions */; productType = "com.apple.product-type.tool"; }; 271285491CC1272D00E517C7 /* lpq */ = { isa = PBXNativeTarget; buildConfigurationList = 271285511CC1272D00E517C7 /* Build configuration list for PBXNativeTarget "lpq" */; buildPhases = ( 2712854C1CC1272D00E517C7 /* Sources */, 2712854E1CC1272D00E517C7 /* Frameworks */, 271285501CC1272D00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2712854A1CC1272D00E517C7 /* PBXTargetDependency */, ); name = lpq; productName = cupsaddsmb; productReference = 271285541CC1272D00E517C7 /* lpq */; productType = "com.apple.product-type.tool"; }; 271285561CC1274300E517C7 /* lpr */ = { isa = PBXNativeTarget; buildConfigurationList = 2712855E1CC1274300E517C7 /* Build configuration list for PBXNativeTarget "lpr" */; buildPhases = ( 271285591CC1274300E517C7 /* Sources */, 2712855B1CC1274300E517C7 /* Frameworks */, 2712855D1CC1274300E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285571CC1274300E517C7 /* PBXTargetDependency */, ); name = lpr; productName = cupsaddsmb; productReference = 271285611CC1274300E517C7 /* lpr */; productType = "com.apple.product-type.tool"; }; 271285631CC1275200E517C7 /* lprm */ = { isa = PBXNativeTarget; buildConfigurationList = 2712856B1CC1275200E517C7 /* Build configuration list for PBXNativeTarget "lprm" */; buildPhases = ( 271285661CC1275200E517C7 /* Sources */, 271285681CC1275200E517C7 /* Frameworks */, 2712856A1CC1275200E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285641CC1275200E517C7 /* PBXTargetDependency */, ); name = lprm; productName = cupsaddsmb; productReference = 2712856E1CC1275200E517C7 /* lprm */; productType = "com.apple.product-type.tool"; }; 271285701CC1276400E517C7 /* lpstat */ = { isa = PBXNativeTarget; buildConfigurationList = 271285781CC1276400E517C7 /* Build configuration list for PBXNativeTarget "lpstat" */; buildPhases = ( 271285731CC1276400E517C7 /* Sources */, 271285751CC1276400E517C7 /* Frameworks */, 271285771CC1276400E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285711CC1276400E517C7 /* PBXTargetDependency */, ); name = lpstat; productName = cupsaddsmb; productReference = 2712857B1CC1276400E517C7 /* lpstat */; productType = "com.apple.product-type.tool"; }; 271285951CC12D1300E517C7 /* admin.cgi */ = { isa = PBXNativeTarget; buildConfigurationList = 2712859D1CC12D1300E517C7 /* Build configuration list for PBXNativeTarget "admin.cgi" */; buildPhases = ( 271285981CC12D1300E517C7 /* Sources */, 2712859A1CC12D1300E517C7 /* Frameworks */, 2712859C1CC12D1300E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285961CC12D1300E517C7 /* PBXTargetDependency */, ); name = admin.cgi; productName = cupsaddsmb; productReference = 271285A01CC12D1300E517C7 /* admin.cgi */; productType = "com.apple.product-type.tool"; }; 271285A31CC12D3A00E517C7 /* classes.cgi */ = { isa = PBXNativeTarget; buildConfigurationList = 271285AC1CC12D3A00E517C7 /* Build configuration list for PBXNativeTarget "classes.cgi" */; buildPhases = ( 271285A61CC12D3A00E517C7 /* Sources */, 271285A81CC12D3A00E517C7 /* Frameworks */, 271285AB1CC12D3A00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285A41CC12D3A00E517C7 /* PBXTargetDependency */, ); name = classes.cgi; productName = cupsaddsmb; productReference = 271285AF1CC12D3A00E517C7 /* classes.cgi */; productType = "com.apple.product-type.tool"; }; 271285B11CC12D4E00E517C7 /* jobs.cgi */ = { isa = PBXNativeTarget; buildConfigurationList = 271285BA1CC12D4E00E517C7 /* Build configuration list for PBXNativeTarget "jobs.cgi" */; buildPhases = ( 271285B41CC12D4E00E517C7 /* Sources */, 271285B61CC12D4E00E517C7 /* Frameworks */, 271285B91CC12D4E00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285B21CC12D4E00E517C7 /* PBXTargetDependency */, ); name = jobs.cgi; productName = cupsaddsmb; productReference = 271285BD1CC12D4E00E517C7 /* jobs.cgi */; productType = "com.apple.product-type.tool"; }; 271285BF1CC12D5E00E517C7 /* printers.cgi */ = { isa = PBXNativeTarget; buildConfigurationList = 271285C81CC12D5E00E517C7 /* Build configuration list for PBXNativeTarget "printers.cgi" */; buildPhases = ( 271285C21CC12D5E00E517C7 /* Sources */, 271285C41CC12D5E00E517C7 /* Frameworks */, 271285C71CC12D5E00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285C01CC12D5E00E517C7 /* PBXTargetDependency */, ); name = printers.cgi; productName = cupsaddsmb; productReference = 271285CB1CC12D5E00E517C7 /* printers.cgi */; productType = "com.apple.product-type.tool"; }; 271285CD1CC12DBF00E517C7 /* commandtops */ = { isa = PBXNativeTarget; buildConfigurationList = 271285D51CC12DBF00E517C7 /* Build configuration list for PBXNativeTarget "commandtops" */; buildPhases = ( 271285D01CC12DBF00E517C7 /* Sources */, 271285D21CC12DBF00E517C7 /* Frameworks */, 271285D41CC12DBF00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285CE1CC12DBF00E517C7 /* PBXTargetDependency */, ); name = commandtops; productName = cupsaddsmb; productReference = 271285D81CC12DBF00E517C7 /* commandtops */; productType = "com.apple.product-type.tool"; }; 271285DA1CC12DDF00E517C7 /* gziptoany */ = { isa = PBXNativeTarget; buildConfigurationList = 271285E21CC12DDF00E517C7 /* Build configuration list for PBXNativeTarget "gziptoany" */; buildPhases = ( 271285DD1CC12DDF00E517C7 /* Sources */, 271285DF1CC12DDF00E517C7 /* Frameworks */, 271285E11CC12DDF00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285DB1CC12DDF00E517C7 /* PBXTargetDependency */, ); name = gziptoany; productName = cupsaddsmb; productReference = 271285E51CC12DDF00E517C7 /* gziptoany */; productType = "com.apple.product-type.tool"; }; 271285E71CC12E2D00E517C7 /* pstops */ = { isa = PBXNativeTarget; buildConfigurationList = 271285EF1CC12E2D00E517C7 /* Build configuration list for PBXNativeTarget "pstops" */; buildPhases = ( 271285EA1CC12E2D00E517C7 /* Sources */, 271285EC1CC12E2D00E517C7 /* Frameworks */, 271285EE1CC12E2D00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285E81CC12E2D00E517C7 /* PBXTargetDependency */, ); name = pstops; productName = cupsaddsmb; productReference = 271285F21CC12E2E00E517C7 /* pstops */; productType = "com.apple.product-type.tool"; }; 271285F51CC12EEB00E517C7 /* rastertoepson */ = { isa = PBXNativeTarget; buildConfigurationList = 271285FD1CC12EEB00E517C7 /* Build configuration list for PBXNativeTarget "rastertoepson" */; buildPhases = ( 271285F81CC12EEB00E517C7 /* Sources */, 271285FA1CC12EEB00E517C7 /* Frameworks */, 271285FC1CC12EEB00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271285F61CC12EEB00E517C7 /* PBXTargetDependency */, ); name = rastertoepson; productName = cupsaddsmb; productReference = 271286001CC12EEB00E517C7 /* rastertoepson */; productType = "com.apple.product-type.tool"; }; 271286051CC12F0B00E517C7 /* rastertohp */ = { isa = PBXNativeTarget; buildConfigurationList = 271286101CC12F0B00E517C7 /* Build configuration list for PBXNativeTarget "rastertohp" */; buildPhases = ( 2712860A1CC12F0B00E517C7 /* Sources */, 2712860C1CC12F0B00E517C7 /* Frameworks */, 2712860F1CC12F0B00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286081CC12F0B00E517C7 /* PBXTargetDependency */, ); name = rastertohp; productName = cupsaddsmb; productReference = 271286131CC12F0B00E517C7 /* rastertohp */; productType = "com.apple.product-type.tool"; }; 271286151CC12F1A00E517C7 /* rastertolabel */ = { isa = PBXNativeTarget; buildConfigurationList = 271286201CC12F1A00E517C7 /* Build configuration list for PBXNativeTarget "rastertolabel" */; buildPhases = ( 2712861A1CC12F1A00E517C7 /* Sources */, 2712861C1CC12F1A00E517C7 /* Frameworks */, 2712861F1CC12F1A00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286181CC12F1A00E517C7 /* PBXTargetDependency */, ); name = rastertolabel; productName = cupsaddsmb; productReference = 271286231CC12F1A00E517C7 /* rastertolabel */; productType = "com.apple.product-type.tool"; }; 271286571CC1309000E517C7 /* tlscheck */ = { isa = PBXNativeTarget; buildConfigurationList = 271286641CC1309000E517C7 /* Build configuration list for PBXNativeTarget "tlscheck" */; buildPhases = ( 2712865A1CC1309000E517C7 /* Sources */, 2712865C1CC1309000E517C7 /* Frameworks */, 271286631CC1309000E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286581CC1309000E517C7 /* PBXTargetDependency */, ); name = tlscheck; productName = ippserver; productReference = 271286671CC1309000E517C7 /* tlscheck */; productType = "com.apple.product-type.tool"; }; 2712866B1CC1310E00E517C7 /* rasterbench */ = { isa = PBXNativeTarget; buildConfigurationList = 2712867A1CC1310E00E517C7 /* Build configuration list for PBXNativeTarget "rasterbench" */; buildPhases = ( 271286701CC1310E00E517C7 /* Sources */, 271286721CC1310E00E517C7 /* Frameworks */, 271286791CC1310E00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2712866E1CC1310E00E517C7 /* PBXTargetDependency */, ); name = rasterbench; productName = testmime; productReference = 2712867D1CC1310E00E517C7 /* rasterbench */; productType = "com.apple.product-type.tool"; }; 271286871CC13DC000E517C7 /* checkpo */ = { isa = PBXNativeTarget; buildConfigurationList = 271286931CC13DC000E517C7 /* Build configuration list for PBXNativeTarget "checkpo" */; buildPhases = ( 2712868A1CC13DC000E517C7 /* Sources */, 2712868C1CC13DC000E517C7 /* Frameworks */, 271286921CC13DC000E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286881CC13DC000E517C7 /* PBXTargetDependency */, ); name = checkpo; productName = testmime; productReference = 271286961CC13DC000E517C7 /* checkpo */; productType = "com.apple.product-type.tool"; }; 271286981CC13DF100E517C7 /* po2strings */ = { isa = PBXNativeTarget; buildConfigurationList = 271286A41CC13DF100E517C7 /* Build configuration list for PBXNativeTarget "po2strings" */; buildPhases = ( 2712869B1CC13DF100E517C7 /* Sources */, 2712869D1CC13DF100E517C7 /* Frameworks */, 271286A31CC13DF100E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286991CC13DF100E517C7 /* PBXTargetDependency */, ); name = po2strings; productName = testmime; productReference = 271286A71CC13DF100E517C7 /* po2strings */; productType = "com.apple.product-type.tool"; }; 271286A91CC13DFF00E517C7 /* strings2po */ = { isa = PBXNativeTarget; buildConfigurationList = 271286B51CC13DFF00E517C7 /* Build configuration list for PBXNativeTarget "strings2po" */; buildPhases = ( 271286AC1CC13DFF00E517C7 /* Sources */, 271286AE1CC13DFF00E517C7 /* Frameworks */, 271286B41CC13DFF00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286AA1CC13DFF00E517C7 /* PBXTargetDependency */, ); name = strings2po; productName = testmime; productReference = 271286B81CC13DFF00E517C7 /* strings2po */; productType = "com.apple.product-type.tool"; }; 271286BA1CC13E2100E517C7 /* bcp */ = { isa = PBXNativeTarget; buildConfigurationList = 271286C61CC13E2100E517C7 /* Build configuration list for PBXNativeTarget "bcp" */; buildPhases = ( 271286BD1CC13E2100E517C7 /* Sources */, 271286C01CC13E2100E517C7 /* Frameworks */, 271286C51CC13E2100E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286BB1CC13E2100E517C7 /* PBXTargetDependency */, ); name = bcp; productName = usb; productReference = 271286C91CC13E2100E517C7 /* bcp */; productType = "com.apple.product-type.tool"; }; 271286CB1CC13E5B00E517C7 /* tbcp */ = { isa = PBXNativeTarget; buildConfigurationList = 271286D61CC13E5B00E517C7 /* Build configuration list for PBXNativeTarget "tbcp" */; buildPhases = ( 271286CE1CC13E5B00E517C7 /* Sources */, 271286D01CC13E5B00E517C7 /* Frameworks */, 271286D51CC13E5B00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286CC1CC13E5B00E517C7 /* PBXTargetDependency */, ); name = tbcp; productName = usb; productReference = 271286D91CC13E5B00E517C7 /* tbcp */; productType = "com.apple.product-type.tool"; }; 271286E51CC13F2000E517C7 /* mailto */ = { isa = PBXNativeTarget; buildConfigurationList = 271286F01CC13F2000E517C7 /* Build configuration list for PBXNativeTarget "mailto" */; buildPhases = ( 271286E81CC13F2000E517C7 /* Sources */, 271286EA1CC13F2000E517C7 /* Frameworks */, 271286EF1CC13F2000E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286E61CC13F2000E517C7 /* PBXTargetDependency */, ); name = mailto; productName = usb; productReference = 271286F31CC13F2000E517C7 /* mailto */; productType = "com.apple.product-type.tool"; }; 271286F51CC13F3F00E517C7 /* rss */ = { isa = PBXNativeTarget; buildConfigurationList = 271287001CC13F3F00E517C7 /* Build configuration list for PBXNativeTarget "rss" */; buildPhases = ( 271286F81CC13F3F00E517C7 /* Sources */, 271286FA1CC13F3F00E517C7 /* Frameworks */, 271286FF1CC13F3F00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271286F61CC13F3F00E517C7 /* PBXTargetDependency */, ); name = rss; productName = usb; productReference = 271287031CC13F3F00E517C7 /* rss */; productType = "com.apple.product-type.tool"; }; 271287091CC13FAB00E517C7 /* mantohtml */ = { isa = PBXNativeTarget; buildConfigurationList = 271287151CC13FAB00E517C7 /* Build configuration list for PBXNativeTarget "mantohtml" */; buildPhases = ( 2712870C1CC13FAB00E517C7 /* Sources */, 2712870E1CC13FAB00E517C7 /* Frameworks */, 271287141CC13FAB00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2712870A1CC13FAB00E517C7 /* PBXTargetDependency */, ); name = mantohtml; productName = testmime; productReference = 271287181CC13FAB00E517C7 /* mantohtml */; productType = "com.apple.product-type.tool"; }; 2712871E1CC140BE00E517C7 /* genstrings */ = { isa = PBXNativeTarget; buildConfigurationList = 271287291CC140BE00E517C7 /* Build configuration list for PBXNativeTarget "genstrings" */; buildPhases = ( 271287231CC140BE00E517C7 /* Sources */, 271287251CC140BE00E517C7 /* Frameworks */, 271287281CC140BE00E517C7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2712872F1CC140DF00E517C7 /* PBXTargetDependency */, 271287311CC140DF00E517C7 /* PBXTargetDependency */, ); name = genstrings; productName = ppdc; productReference = 2712872C1CC140BE00E517C7 /* genstrings */; productType = "com.apple.product-type.tool"; }; 273B1E9A226B3E4800428143 /* ippevepcl */ = { isa = PBXNativeTarget; buildConfigurationList = 273B1EA7226B3E4800428143 /* Build configuration list for PBXNativeTarget "ippevepcl" */; buildPhases = ( 273B1E9D226B3E4800428143 /* Sources */, 273B1E9F226B3E4800428143 /* Frameworks */, 273B1EA6226B3E4800428143 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 273B1EC6226B41E600428143 /* PBXTargetDependency */, ); name = ippevepcl; productName = ippserver; productReference = 273B1EAA226B3E4800428143 /* ippevepcl */; productType = "com.apple.product-type.tool"; }; 273B1EAB226B3E5200428143 /* ippeveps */ = { isa = PBXNativeTarget; buildConfigurationList = 273B1EB8226B3E5200428143 /* Build configuration list for PBXNativeTarget "ippeveps" */; buildPhases = ( 273B1EAE226B3E5200428143 /* Sources */, 273B1EB0226B3E5200428143 /* Frameworks */, 273B1EB7226B3E5200428143 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 273B1ECC226B421700428143 /* PBXTargetDependency */, ); name = ippeveps; productName = ippserver; productReference = 273B1EBB226B3E5200428143 /* ippeveps */; productType = "com.apple.product-type.tool"; }; 273BF6BC1333B5000022CAAB /* testcups */ = { isa = PBXNativeTarget; buildConfigurationList = 273BF6C31333B5000022CAAB /* Build configuration list for PBXNativeTarget "testcups" */; buildPhases = ( 273BF6B91333B5000022CAAB /* Sources */, 273BF6BA1333B5000022CAAB /* Frameworks */, 273BF6BB1333B5000022CAAB /* CopyFiles */, ); buildRules = ( ); dependencies = ( 273BF6C91333B5410022CAAB /* PBXTargetDependency */, ); name = testcups; productName = testcups; productReference = 273BF6BD1333B5000022CAAB /* testcups */; productType = "com.apple.product-type.tool"; }; 274770D12345342B0089BC31 /* testthreads */ = { isa = PBXNativeTarget; buildConfigurationList = 274770DD2345342B0089BC31 /* Build configuration list for PBXNativeTarget "testthreads" */; buildPhases = ( 274770D42345342B0089BC31 /* Sources */, 274770D62345342B0089BC31 /* Frameworks */, 274770DC2345342B0089BC31 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 274770D22345342B0089BC31 /* PBXTargetDependency */, ); name = testthreads; productName = testmime; productReference = 274770E02345342B0089BC31 /* testthreads */; productType = "com.apple.product-type.tool"; }; 274FF5CB13332B1F00317ECB /* cups-driverd */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */; buildPhases = ( 274FF5C813332B1F00317ECB /* Sources */, 274FF5C913332B1F00317ECB /* Frameworks */, 274FF5CA13332B1F00317ECB /* CopyFiles */, ); buildRules = ( ); dependencies = ( 274FF5DC13332CF900317ECB /* PBXTargetDependency */, 274FF6201333316200317ECB /* PBXTargetDependency */, ); name = "cups-driverd"; productName = "cups-driverd"; productReference = 274FF5CC13332B1F00317ECB /* cups-driverd */; productType = "com.apple.product-type.tool"; }; 274FF5ED133330C800317ECB /* libcupsppdc */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF5EF133330C800317ECB /* Build configuration list for PBXNativeTarget "libcupsppdc" */; buildPhases = ( 274FF5EA133330C800317ECB /* Sources */, 274FF5EB133330C800317ECB /* Frameworks */, 274FF5EC133330C800317ECB /* Headers */, ); buildRules = ( ); dependencies = ( 274FF5F3133330FD00317ECB /* PBXTargetDependency */, ); name = libcupsppdc; productName = libcupsppdc; productReference = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; productType = "com.apple.product-type.library.dynamic"; }; 274FF6281333333600317ECB /* cups-deviced */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF62F1333333600317ECB /* Build configuration list for PBXNativeTarget "cups-deviced" */; buildPhases = ( 274FF6251333333600317ECB /* Sources */, 274FF6261333333600317ECB /* Frameworks */, 274FF6271333333600317ECB /* CopyFiles */, ); buildRules = ( ); dependencies = ( 274FF6341333335200317ECB /* PBXTargetDependency */, ); name = "cups-deviced"; productName = "cups-deviced"; productReference = 274FF6291333333600317ECB /* cups-deviced */; productType = "com.apple.product-type.tool"; }; 274FF63D1333358B00317ECB /* cups-exec */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF6441333358C00317ECB /* Build configuration list for PBXNativeTarget "cups-exec" */; buildPhases = ( 274FF63A1333358B00317ECB /* Sources */, 274FF63B1333358B00317ECB /* Frameworks */, 274FF63C1333358B00317ECB /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = "cups-exec"; productName = "cups-exec"; productReference = 274FF63E1333358B00317ECB /* cups-exec */; productType = "com.apple.product-type.tool"; }; 274FF64E133339C400317ECB /* cups-lpd */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF655133339C400317ECB /* Build configuration list for PBXNativeTarget "cups-lpd" */; buildPhases = ( 274FF64B133339C400317ECB /* Sources */, 274FF64C133339C400317ECB /* Frameworks */, 274FF64D133339C400317ECB /* CopyFiles */, ); buildRules = ( ); dependencies = ( 274FF65A133339D900317ECB /* PBXTargetDependency */, ); name = "cups-lpd"; productName = "cups-lpd"; productReference = 274FF64F133339C400317ECB /* cups-lpd */; productType = "com.apple.product-type.tool"; }; 274FF67713333B2F00317ECB /* cupsfilter */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF67E13333B2F00317ECB /* Build configuration list for PBXNativeTarget "cupsfilter" */; buildPhases = ( 274FF67413333B2F00317ECB /* Sources */, 274FF67513333B2F00317ECB /* Frameworks */, 274FF67613333B2F00317ECB /* CopyFiles */, ); buildRules = ( ); dependencies = ( 274FF68213333B3C00317ECB /* PBXTargetDependency */, 274FF68413333B3C00317ECB /* PBXTargetDependency */, ); name = cupsfilter; productName = cupsfilter; productReference = 274FF67813333B2F00317ECB /* cupsfilter */; productType = "com.apple.product-type.tool"; }; 274FF6891333B1C400317ECB /* libcups_static */ = { isa = PBXNativeTarget; buildConfigurationList = 274FF6DD1333B1C400317ECB /* Build configuration list for PBXNativeTarget "libcups_static" */; buildPhases = ( 274FF68A1333B1C400317ECB /* Sources */, 274FF6B91333B1C400317ECB /* Frameworks */, 274FF6C11333B1C400317ECB /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcups_static; productName = libcups; productReference = 72A4332F155844CF002E172D /* libcups_static.a */; productType = "com.apple.product-type.library.dynamic"; }; 2766835B1337A9B6000D33D0 /* cupsctl */ = { isa = PBXNativeTarget; buildConfigurationList = 276683621337A9B6000D33D0 /* Build configuration list for PBXNativeTarget "cupsctl" */; buildPhases = ( 276683581337A9B6000D33D0 /* Sources */, 276683591337A9B6000D33D0 /* Frameworks */, 2766835A1337A9B6000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683661337A9D6000D33D0 /* PBXTargetDependency */, ); name = cupsctl; productName = cupsctl; productReference = 2766835C1337A9B6000D33D0 /* cupsctl */; productType = "com.apple.product-type.tool"; }; 2766836F1337AC79000D33D0 /* ppdc */ = { isa = PBXNativeTarget; buildConfigurationList = 276683761337AC79000D33D0 /* Build configuration list for PBXNativeTarget "ppdc" */; buildPhases = ( 2766836C1337AC79000D33D0 /* Sources */, 2766836D1337AC79000D33D0 /* Frameworks */, 2766836E1337AC79000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683AE1337ACF9000D33D0 /* PBXTargetDependency */, 276683B01337ACF9000D33D0 /* PBXTargetDependency */, ); name = ppdc; productName = ppdc; productReference = 276683701337AC79000D33D0 /* ppdc */; productType = "com.apple.product-type.tool"; }; 2766837C1337AC8C000D33D0 /* ppdhtml */ = { isa = PBXNativeTarget; buildConfigurationList = 276683831337AC8C000D33D0 /* Build configuration list for PBXNativeTarget "ppdhtml" */; buildPhases = ( 276683791337AC8C000D33D0 /* Sources */, 2766837A1337AC8C000D33D0 /* Frameworks */, 2766837B1337AC8C000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683B41337AD18000D33D0 /* PBXTargetDependency */, 276683B61337AD18000D33D0 /* PBXTargetDependency */, ); name = ppdhtml; productName = ppdhtml; productReference = 2766837D1337AC8C000D33D0 /* ppdhtml */; productType = "com.apple.product-type.tool"; }; 276683891337AC97000D33D0 /* ppdi */ = { isa = PBXNativeTarget; buildConfigurationList = 276683901337AC97000D33D0 /* Build configuration list for PBXNativeTarget "ppdi" */; buildPhases = ( 276683861337AC97000D33D0 /* Sources */, 276683871337AC97000D33D0 /* Frameworks */, 276683881337AC97000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683BC1337AE49000D33D0 /* PBXTargetDependency */, 276683BE1337AE49000D33D0 /* PBXTargetDependency */, ); name = ppdi; productName = ppdi; productReference = 2766838A1337AC97000D33D0 /* ppdi */; productType = "com.apple.product-type.tool"; }; 276683961337ACA2000D33D0 /* ppdmerge */ = { isa = PBXNativeTarget; buildConfigurationList = 2766839D1337ACA2000D33D0 /* Build configuration list for PBXNativeTarget "ppdmerge" */; buildPhases = ( 276683931337ACA2000D33D0 /* Sources */, 276683941337ACA2000D33D0 /* Frameworks */, 276683951337ACA2000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683C01337B1AD000D33D0 /* PBXTargetDependency */, 276683C21337B1AD000D33D0 /* PBXTargetDependency */, ); name = ppdmerge; productName = ppdmerge; productReference = 276683971337ACA2000D33D0 /* ppdmerge */; productType = "com.apple.product-type.tool"; }; 276683A31337ACAB000D33D0 /* ppdpo */ = { isa = PBXNativeTarget; buildConfigurationList = 276683AA1337ACAB000D33D0 /* Build configuration list for PBXNativeTarget "ppdpo" */; buildPhases = ( 276683A01337ACAB000D33D0 /* Sources */, 276683A11337ACAB000D33D0 /* Frameworks */, 276683A21337ACAB000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683C61337B1BC000D33D0 /* PBXTargetDependency */, 276683C81337B1BC000D33D0 /* PBXTargetDependency */, ); name = ppdpo; productName = ppdpo; productReference = 276683A41337ACAB000D33D0 /* ppdpo */; productType = "com.apple.product-type.tool"; }; 276683EF1337F78E000D33D0 /* ipptool */ = { isa = PBXNativeTarget; buildConfigurationList = 276683F61337F78F000D33D0 /* Build configuration list for PBXNativeTarget "ipptool" */; buildPhases = ( 276683EC1337F78E000D33D0 /* Sources */, 276683ED1337F78E000D33D0 /* Frameworks */, 276683EE1337F78E000D33D0 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683FC1337F7B3000D33D0 /* PBXTargetDependency */, ); name = ipptool; productName = ipptool; productReference = 276683F01337F78E000D33D0 /* ipptool */; productType = "com.apple.product-type.tool"; }; 2767FC4619266A0D000F61D3 /* testdest */ = { isa = PBXNativeTarget; buildConfigurationList = 2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */; buildPhases = ( 2767FC4919266A0D000F61D3 /* Sources */, 2767FC4B19266A0D000F61D3 /* Frameworks */, 2767FC4C19266A0D000F61D3 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 2767FC4719266A0D000F61D3 /* PBXTargetDependency */, ); name = testdest; productName = testcups; productReference = 2767FC5019266A0D000F61D3 /* testdest */; productType = "com.apple.product-type.tool"; }; 278C58CA136B640300836530 /* testhttp */ = { isa = PBXNativeTarget; buildConfigurationList = 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */; buildPhases = ( 278C58C7136B640300836530 /* Sources */, 278C58C8136B640300836530 /* Frameworks */, 278C58C9136B640300836530 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 278C58D8136B642F00836530 /* PBXTargetDependency */, ); name = testhttp; productName = testhttp; productReference = 278C58CB136B640300836530 /* testhttp */; productType = "com.apple.product-type.tool"; }; 27A0347A1A8BDB1200650675 /* lpadmin */ = { isa = PBXNativeTarget; buildConfigurationList = 27A034811A8BDB1300650675 /* Build configuration list for PBXNativeTarget "lpadmin" */; buildPhases = ( 27A034771A8BDB1200650675 /* Sources */, 27A034781A8BDB1200650675 /* Frameworks */, 27A034791A8BDB1200650675 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 27A034841A8BDC4A00650675 /* PBXTargetDependency */, ); name = lpadmin; productName = lpadmin; productReference = 27A0347B1A8BDB1300650675 /* lpadmin */; productType = "com.apple.product-type.tool"; }; 720DD6C11358FD5F0064AA82 /* snmp */ = { isa = PBXNativeTarget; buildConfigurationList = 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */; buildPhases = ( 720DD6BE1358FD5F0064AA82 /* Sources */, 720DD6BF1358FD5F0064AA82 /* Frameworks */, 720DD6C01358FD5F0064AA82 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 720DD6CF1358FD790064AA82 /* PBXTargetDependency */, ); name = snmp; productName = snmp; productReference = 720DD6C21358FD5F0064AA82 /* snmp */; productType = "com.apple.product-type.tool"; }; 72220EAD1333047D00FCA411 /* libcups */ = { isa = PBXNativeTarget; buildConfigurationList = 72220EB21333047D00FCA411 /* Build configuration list for PBXNativeTarget "libcups" */; buildPhases = ( 72220EAA1333047D00FCA411 /* Sources */, 72220EAB1333047D00FCA411 /* Frameworks */, 72220EAC1333047D00FCA411 /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcups; productName = libcups; productReference = 72220EAE1333047D00FCA411 /* libcups.dylib */; productType = "com.apple.product-type.library.dynamic"; }; 72220F5A13330A5A00FCA411 /* cupsd */ = { isa = PBXNativeTarget; buildConfigurationList = 72220F6113330A5A00FCA411 /* Build configuration list for PBXNativeTarget "cupsd" */; buildPhases = ( 72220F5713330A5A00FCA411 /* Sources */, 72220F5813330A5A00FCA411 /* Frameworks */, 72220F5913330A5A00FCA411 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 72220FBE13330C0B00FCA411 /* PBXTargetDependency */, 72220F6513330A6500FCA411 /* PBXTargetDependency */, ); name = cupsd; productName = cupsd; productReference = 72220F5B13330A5A00FCA411 /* cupsd */; productType = "com.apple.product-type.tool"; }; 72220FAB13330B2200FCA411 /* libcupsmime */ = { isa = PBXNativeTarget; buildConfigurationList = 72220FAD13330B2300FCA411 /* Build configuration list for PBXNativeTarget "libcupsmime" */; buildPhases = ( 72220FA813330B2200FCA411 /* Sources */, 72220FA913330B2200FCA411 /* Frameworks */, 72220FAA13330B2200FCA411 /* Headers */, ); buildRules = ( ); dependencies = ( 72220FBC13330C0500FCA411 /* PBXTargetDependency */, ); name = libcupsmime; productName = libcupsmime; productReference = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; productType = "com.apple.product-type.library.dynamic"; }; 724378FC1333E43E009631B9 /* ipp */ = { isa = PBXNativeTarget; buildConfigurationList = 724379031333E43E009631B9 /* Build configuration list for PBXNativeTarget "ipp" */; buildPhases = ( 724378F91333E43E009631B9 /* Sources */, 724378FA1333E43E009631B9 /* Frameworks */, 724378FB1333E43E009631B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724379071333E49B009631B9 /* PBXTargetDependency */, ); name = ipp; productName = ipp; productReference = 724378FD1333E43E009631B9 /* ipp */; productType = "com.apple.product-type.tool"; }; 724379171333E532009631B9 /* lpd */ = { isa = PBXNativeTarget; buildConfigurationList = 7243791E1333E532009631B9 /* Build configuration list for PBXNativeTarget "lpd" */; buildPhases = ( 724379141333E532009631B9 /* Sources */, 724379151333E532009631B9 /* Frameworks */, 724379161333E532009631B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724379261333E932009631B9 /* PBXTargetDependency */, ); name = lpd; productName = lpd; productReference = 724379181333E532009631B9 /* lpd */; productType = "com.apple.product-type.tool"; }; 7243792F1333FB85009631B9 /* socket */ = { isa = PBXNativeTarget; buildConfigurationList = 724379361333FB85009631B9 /* Build configuration list for PBXNativeTarget "socket" */; buildPhases = ( 7243792C1333FB85009631B9 /* Sources */, 7243792D1333FB85009631B9 /* Frameworks */, 7243792E1333FB85009631B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 7243793A1333FB95009631B9 /* PBXTargetDependency */, ); name = socket; productName = socket; productReference = 724379301333FB85009631B9 /* socket */; productType = "com.apple.product-type.tool"; }; 724379461333FEA9009631B9 /* dnssd */ = { isa = PBXNativeTarget; buildConfigurationList = 7243794D1333FEA9009631B9 /* Build configuration list for PBXNativeTarget "dnssd" */; buildPhases = ( 724379431333FEA9009631B9 /* Sources */, 724379441333FEA9009631B9 /* Frameworks */, 724379451333FEA9009631B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724379551333FEFE009631B9 /* PBXTargetDependency */, ); name = dnssd; productName = dnssd; productReference = 724379471333FEA9009631B9 /* dnssd */; productType = "com.apple.product-type.tool"; }; 7243795A1333FF1D009631B9 /* usb */ = { isa = PBXNativeTarget; buildConfigurationList = 724379611333FF1D009631B9 /* Build configuration list for PBXNativeTarget "usb" */; buildPhases = ( 724379571333FF1D009631B9 /* Sources */, 724379581333FF1D009631B9 /* Frameworks */, 724379591333FF1D009631B9 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724379651333FF2E009631B9 /* PBXTargetDependency */, ); name = usb; productName = usb; productReference = 7243795B1333FF1D009631B9 /* usb */; productType = "com.apple.product-type.tool"; }; 724FA5241CC0370C0092477B /* testadmin */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5321CC0370C0092477B /* Build configuration list for PBXNativeTarget "testadmin" */; buildPhases = ( 724FA5271CC0370C0092477B /* Sources */, 724FA5291CC0370C0092477B /* Frameworks */, 724FA5311CC0370C0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5251CC0370C0092477B /* PBXTargetDependency */, ); name = testadmin; productName = testcups; productReference = 724FA5351CC0370C0092477B /* testadmin */; productType = "com.apple.product-type.tool"; }; 724FA5371CC037370092477B /* testarray */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5451CC037370092477B /* Build configuration list for PBXNativeTarget "testarray" */; buildPhases = ( 724FA53A1CC037370092477B /* Sources */, 724FA53C1CC037370092477B /* Frameworks */, 724FA5441CC037370092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5381CC037370092477B /* PBXTargetDependency */, ); name = testarray; productName = testcups; productReference = 724FA5481CC037370092477B /* testarray */; productType = "com.apple.product-type.tool"; }; 724FA54A1CC037500092477B /* testcache */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5581CC037500092477B /* Build configuration list for PBXNativeTarget "testcache" */; buildPhases = ( 724FA54D1CC037500092477B /* Sources */, 724FA54F1CC037500092477B /* Frameworks */, 724FA5571CC037500092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA54B1CC037500092477B /* PBXTargetDependency */, ); name = testcache; productName = testcups; productReference = 724FA55B1CC037500092477B /* testcache */; productType = "com.apple.product-type.tool"; }; 724FA55D1CC037670092477B /* testconflicts */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA56B1CC037670092477B /* Build configuration list for PBXNativeTarget "testconflicts" */; buildPhases = ( 724FA5601CC037670092477B /* Sources */, 724FA5621CC037670092477B /* Frameworks */, 724FA56A1CC037670092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA55E1CC037670092477B /* PBXTargetDependency */, ); name = testconflicts; productName = testcups; productReference = 724FA56E1CC037670092477B /* testconflicts */; productType = "com.apple.product-type.tool"; }; 724FA5701CC037810092477B /* testfile */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA57E1CC037810092477B /* Build configuration list for PBXNativeTarget "testfile" */; buildPhases = ( 724FA5731CC037810092477B /* Sources */, 724FA5751CC037810092477B /* Frameworks */, 724FA57D1CC037810092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5711CC037810092477B /* PBXTargetDependency */, ); name = testfile; productName = testcups; productReference = 724FA5811CC037810092477B /* testfile */; productType = "com.apple.product-type.tool"; }; 724FA5831CC037980092477B /* testi18n */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5911CC037980092477B /* Build configuration list for PBXNativeTarget "testi18n" */; buildPhases = ( 724FA5861CC037980092477B /* Sources */, 724FA5881CC037980092477B /* Frameworks */, 724FA5901CC037980092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5841CC037980092477B /* PBXTargetDependency */, ); name = testi18n; productName = testhttp; productReference = 724FA5941CC037980092477B /* testi18n */; productType = "com.apple.product-type.tool"; }; 724FA5961CC037AA0092477B /* testipp */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5A41CC037AA0092477B /* Build configuration list for PBXNativeTarget "testipp" */; buildPhases = ( 724FA5991CC037AA0092477B /* Sources */, 724FA59B1CC037AA0092477B /* Frameworks */, 724FA5A31CC037AA0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5971CC037AA0092477B /* PBXTargetDependency */, ); name = testipp; productName = testhttp; productReference = 724FA5A71CC037AA0092477B /* testipp */; productType = "com.apple.product-type.tool"; }; 724FA5A91CC037C60092477B /* testlang */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5B71CC037C60092477B /* Build configuration list for PBXNativeTarget "testlang" */; buildPhases = ( 724FA5AC1CC037C60092477B /* Sources */, 724FA5AE1CC037C60092477B /* Frameworks */, 724FA5B61CC037C60092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5AA1CC037C60092477B /* PBXTargetDependency */, ); name = testlang; productName = testhttp; productReference = 724FA5BA1CC037C60092477B /* testlang */; productType = "com.apple.product-type.tool"; }; 724FA5BC1CC037D90092477B /* testlpd */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5CA1CC037D90092477B /* Build configuration list for PBXNativeTarget "testlpd" */; buildPhases = ( 724FA5BF1CC037D90092477B /* Sources */, 724FA5C11CC037D90092477B /* Frameworks */, 724FA5C91CC037D90092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5BD1CC037D90092477B /* PBXTargetDependency */, ); name = testlpd; productName = testhttp; productReference = 724FA5CD1CC037D90092477B /* testlpd */; productType = "com.apple.product-type.tool"; }; 724FA5CF1CC037F00092477B /* testoptions */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5DE1CC037F00092477B /* Build configuration list for PBXNativeTarget "testoptions" */; buildPhases = ( 724FA5D41CC037F00092477B /* Sources */, 724FA5D61CC037F00092477B /* Frameworks */, 724FA5DD1CC037F00092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5D01CC037F00092477B /* PBXTargetDependency */, ); name = testoptions; productName = testmime; productReference = 724FA5E11CC037F00092477B /* testoptions */; productType = "com.apple.product-type.tool"; }; 724FA5E31CC038040092477B /* testppd */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA5F21CC038040092477B /* Build configuration list for PBXNativeTarget "testppd" */; buildPhases = ( 724FA5E81CC038040092477B /* Sources */, 724FA5EA1CC038040092477B /* Frameworks */, 724FA5F11CC038040092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5E41CC038040092477B /* PBXTargetDependency */, ); name = testppd; productName = testmime; productReference = 724FA5F51CC038040092477B /* testppd */; productType = "com.apple.product-type.tool"; }; 724FA5F71CC038190092477B /* testpwg */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6061CC038190092477B /* Build configuration list for PBXNativeTarget "testpwg" */; buildPhases = ( 724FA5FC1CC038190092477B /* Sources */, 724FA5FE1CC038190092477B /* Frameworks */, 724FA6051CC038190092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA5F81CC038190092477B /* PBXTargetDependency */, ); name = testpwg; productName = testmime; productReference = 724FA6091CC038190092477B /* testpwg */; productType = "com.apple.product-type.tool"; }; 724FA60B1CC0382B0092477B /* testraster */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA61A1CC0382B0092477B /* Build configuration list for PBXNativeTarget "testraster" */; buildPhases = ( 724FA6101CC0382B0092477B /* Sources */, 724FA6121CC0382B0092477B /* Frameworks */, 724FA6191CC0382B0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA60C1CC0382B0092477B /* PBXTargetDependency */, ); name = testraster; productName = testmime; productReference = 724FA61D1CC0382B0092477B /* testraster */; productType = "com.apple.product-type.tool"; }; 724FA61F1CC038410092477B /* testsnmp */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA62E1CC038410092477B /* Build configuration list for PBXNativeTarget "testsnmp" */; buildPhases = ( 724FA6241CC038410092477B /* Sources */, 724FA6261CC038410092477B /* Frameworks */, 724FA62D1CC038410092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6201CC038410092477B /* PBXTargetDependency */, ); name = testsnmp; productName = testmime; productReference = 724FA6311CC038410092477B /* testsnmp */; productType = "com.apple.product-type.tool"; }; 724FA6331CC038560092477B /* testspeed */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6421CC038560092477B /* Build configuration list for PBXNativeTarget "testspeed" */; buildPhases = ( 724FA6381CC038560092477B /* Sources */, 724FA63A1CC038560092477B /* Frameworks */, 724FA6411CC038560092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6341CC038560092477B /* PBXTargetDependency */, ); name = testspeed; productName = testmime; productReference = 724FA6451CC038560092477B /* testspeed */; productType = "com.apple.product-type.tool"; }; 724FA6471CC0386E0092477B /* testsub */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6561CC0386E0092477B /* Build configuration list for PBXNativeTarget "testsub" */; buildPhases = ( 724FA64C1CC0386E0092477B /* Sources */, 724FA64E1CC0386E0092477B /* Frameworks */, 724FA6551CC0386E0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6481CC0386E0092477B /* PBXTargetDependency */, ); name = testsub; productName = testmime; productReference = 724FA6591CC0386E0092477B /* testsub */; productType = "com.apple.product-type.tool"; }; 724FA65E1CC038A50092477B /* test1284 */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA66D1CC038A50092477B /* Build configuration list for PBXNativeTarget "test1284" */; buildPhases = ( 724FA6631CC038A50092477B /* Sources */, 724FA6651CC038A50092477B /* Frameworks */, 724FA66C1CC038A50092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA65F1CC038A50092477B /* PBXTargetDependency */, ); name = test1284; productName = testmime; productReference = 724FA6701CC038A50092477B /* test1284 */; productType = "com.apple.product-type.tool"; }; 724FA6721CC038BD0092477B /* testbackend */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6801CC038BD0092477B /* Build configuration list for PBXNativeTarget "testbackend" */; buildPhases = ( 724FA6751CC038BD0092477B /* Sources */, 724FA6771CC038BD0092477B /* Frameworks */, 724FA67F1CC038BD0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6731CC038BD0092477B /* PBXTargetDependency */, ); name = testbackend; productName = testcups; productReference = 724FA6831CC038BD0092477B /* testbackend */; productType = "com.apple.product-type.tool"; }; 724FA6851CC038D90092477B /* testsupplies */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6941CC038D90092477B /* Build configuration list for PBXNativeTarget "testsupplies" */; buildPhases = ( 724FA68A1CC038D90092477B /* Sources */, 724FA68C1CC038D90092477B /* Frameworks */, 724FA6931CC038D90092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6861CC038D90092477B /* PBXTargetDependency */, ); name = testsupplies; productName = testmime; productReference = 724FA6971CC038D90092477B /* testsupplies */; productType = "com.apple.product-type.tool"; }; 724FA6991CC039200092477B /* testcgi */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6A71CC039200092477B /* Build configuration list for PBXNativeTarget "testcgi" */; buildPhases = ( 724FA69C1CC039200092477B /* Sources */, 724FA69E1CC039200092477B /* Frameworks */, 724FA6A61CC039200092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284CB1CC122D000E517C7 /* PBXTargetDependency */, 724FA69A1CC039200092477B /* PBXTargetDependency */, ); name = testcgi; productName = testcups; productReference = 724FA6AA1CC039200092477B /* testcgi */; productType = "com.apple.product-type.tool"; }; 724FA6AC1CC0393E0092477B /* testhi */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6BA1CC0393E0092477B /* Build configuration list for PBXNativeTarget "testhi" */; buildPhases = ( 724FA6AF1CC0393E0092477B /* Sources */, 724FA6B11CC0393E0092477B /* Frameworks */, 724FA6B91CC0393E0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284CF1CC122ED00E517C7 /* PBXTargetDependency */, 724FA6AD1CC0393E0092477B /* PBXTargetDependency */, ); name = testhi; productName = testhttp; productReference = 724FA6BD1CC0393E0092477B /* testhi */; productType = "com.apple.product-type.tool"; }; 724FA6BF1CC0395A0092477B /* testtemplate */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6CE1CC0395A0092477B /* Build configuration list for PBXNativeTarget "testtemplate" */; buildPhases = ( 724FA6C41CC0395A0092477B /* Sources */, 724FA6C61CC0395A0092477B /* Frameworks */, 724FA6CD1CC0395A0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284D41CC1232500E517C7 /* PBXTargetDependency */, 724FA6C01CC0395A0092477B /* PBXTargetDependency */, ); name = testtemplate; productName = testmime; productReference = 724FA6D11CC0395A0092477B /* testtemplate */; productType = "com.apple.product-type.tool"; }; 724FA6D81CC039DE0092477B /* testnotify */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6E71CC039DE0092477B /* Build configuration list for PBXNativeTarget "testnotify" */; buildPhases = ( 724FA6DD1CC039DE0092477B /* Sources */, 724FA6DF1CC039DE0092477B /* Frameworks */, 724FA6E61CC039DE0092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 724FA6D91CC039DE0092477B /* PBXTargetDependency */, ); name = testnotify; productName = testmime; productReference = 724FA6EA1CC039DE0092477B /* testnotify */; productType = "com.apple.product-type.tool"; }; 724FA6ED1CC03A210092477B /* testcatalog */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA6FC1CC03A210092477B /* Build configuration list for PBXNativeTarget "testcatalog" */; buildPhases = ( 724FA6F21CC03A210092477B /* Sources */, 724FA6F41CC03A210092477B /* Frameworks */, 724FA6FB1CC03A210092477B /* CopyFiles */, ); buildRules = ( ); dependencies = ( 271284CD1CC122E400E517C7 /* PBXTargetDependency */, 724FA6EE1CC03A210092477B /* PBXTargetDependency */, ); name = testcatalog; productName = testmime; productReference = 724FA6FF1CC03A210092477B /* testcatalog */; productType = "com.apple.product-type.tool"; }; 724FA7011CC03A490092477B /* libcupsimage_static */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA70C1CC03A490092477B /* Build configuration list for PBXNativeTarget "libcupsimage_static" */; buildPhases = ( 724FA7041CC03A490092477B /* Sources */, 724FA7081CC03A490092477B /* Frameworks */, 724FA70A1CC03A490092477B /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcupsimage_static; productName = libcupsimage; productReference = 724FA70F1CC03A490092477B /* libcupsimage_static.a */; productType = "com.apple.product-type.library.dynamic"; }; 724FA7101CC03A990092477B /* libcupsmime_static */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA71C1CC03A990092477B /* Build configuration list for PBXNativeTarget "libcupsmime_static" */; buildPhases = ( 724FA7131CC03A990092477B /* Sources */, 724FA7171CC03A990092477B /* Frameworks */, 724FA7191CC03A990092477B /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcupsmime_static; productName = libcupsmime; productReference = 724FA71F1CC03A990092477B /* libcupsmime_static.a */; productType = "com.apple.product-type.library.dynamic"; }; 724FA7201CC03AAF0092477B /* libcupsppdc_static */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA73D1CC03AAF0092477B /* Build configuration list for PBXNativeTarget "libcupsppdc_static" */; buildPhases = ( 724FA7231CC03AAF0092477B /* Sources */, 724FA7371CC03AAF0092477B /* Frameworks */, 724FA73A1CC03AAF0092477B /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcupsppdc_static; productName = libcupsppdc; productReference = 724FA7401CC03AAF0092477B /* libcupsppdc_static.a */; productType = "com.apple.product-type.library.dynamic"; }; 724FA7411CC03ACC0092477B /* libcupscgi */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA74C1CC03ACC0092477B /* Build configuration list for PBXNativeTarget "libcupscgi" */; buildPhases = ( 724FA7441CC03ACC0092477B /* Sources */, 724FA7481CC03ACC0092477B /* Frameworks */, 724FA74A1CC03ACC0092477B /* Headers */, ); buildRules = ( ); dependencies = ( 724FA7421CC03ACC0092477B /* PBXTargetDependency */, ); name = libcupscgi; productName = libcupsimage; productReference = 724FA74F1CC03ACC0092477B /* libcupscgi.dylib */; productType = "com.apple.product-type.library.dynamic"; }; 724FA7581CC03AF60092477B /* libcupscgi_static */ = { isa = PBXNativeTarget; buildConfigurationList = 724FA7681CC03AF60092477B /* Build configuration list for PBXNativeTarget "libcupscgi_static" */; buildPhases = ( 724FA75B1CC03AF60092477B /* Sources */, 724FA7641CC03AF60092477B /* Frameworks */, 724FA7661CC03AF60092477B /* Headers */, ); buildRules = ( ); dependencies = ( ); name = libcupscgi_static; productName = libcupsimage; productReference = 724FA76B1CC03AF60092477B /* libcupscgi_static.a */; productType = "com.apple.product-type.library.dynamic"; }; 7258EAE1134594C4009286F1 /* rastertopwg */ = { isa = PBXNativeTarget; buildConfigurationList = 7258EAE9134594C4009286F1 /* Build configuration list for PBXNativeTarget "rastertopwg" */; buildPhases = ( 7258EADE134594C4009286F1 /* Sources */, 7258EADF134594C4009286F1 /* Frameworks */, 7258EAE0134594C4009286F1 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 7258EAF113459B67009286F1 /* PBXTargetDependency */, ); name = rastertopwg; productName = rastertopwg; productReference = 7258EAE2134594C4009286F1 /* rastertopwg */; productType = "com.apple.product-type.tool"; }; 726AD6F6135E88F0002C930D /* ippeveprinter */ = { isa = PBXNativeTarget; buildConfigurationList = 726AD6FE135E88F1002C930D /* Build configuration list for PBXNativeTarget "ippeveprinter" */; buildPhases = ( 726AD6F3135E88F0002C930D /* Sources */, 726AD6F4135E88F0002C930D /* Frameworks */, 726AD6F5135E88F0002C930D /* CopyFiles */, ); buildRules = ( ); dependencies = ( 273B1EC9226B420500428143 /* PBXTargetDependency */, ); name = ippeveprinter; productName = ippserver; productReference = 726AD6F7135E88F0002C930D /* ippeveprinter */; productType = "com.apple.product-type.tool"; }; 729181AC201155C1005E7560 /* testclient */ = { isa = PBXNativeTarget; buildConfigurationList = 729181BB201155C1005E7560 /* Build configuration list for PBXNativeTarget "testclient" */; buildPhases = ( 729181B1201155C1005E7560 /* Sources */, 729181B3201155C1005E7560 /* Frameworks */, 729181BA201155C1005E7560 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 729181AF201155C1005E7560 /* PBXTargetDependency */, ); name = testclient; productName = testmime; productReference = 729181BE201155C1005E7560 /* testclient */; productType = "com.apple.product-type.tool"; }; 72CF95E618A19134000FCAE4 /* ippfind */ = { isa = PBXNativeTarget; buildConfigurationList = 72CF95EE18A19134000FCAE4 /* Build configuration list for PBXNativeTarget "ippfind" */; buildPhases = ( 72CF95E918A19134000FCAE4 /* Sources */, 72CF95EB18A19134000FCAE4 /* Frameworks */, 72CF95ED18A19134000FCAE4 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 72CF95E718A19134000FCAE4 /* PBXTargetDependency */, ); name = ippfind; productName = ipptool; productReference = 72CF95F118A19134000FCAE4 /* ipptool copy */; productType = "com.apple.product-type.tool"; }; 72F75A511336F950004BB496 /* cupstestppd */ = { isa = PBXNativeTarget; buildConfigurationList = 72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */; buildPhases = ( 72F75A4E1336F950004BB496 /* Sources */, 72F75A4F1336F950004BB496 /* Frameworks */, 72F75A501336F950004BB496 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 276683E41337B2BA000D33D0 /* PBXTargetDependency */, 276683E11337B299000D33D0 /* PBXTargetDependency */, ); name = cupstestppd; productName = cupstestppd; productReference = 72F75A521336F950004BB496 /* cupstestppd */; productType = "com.apple.product-type.tool"; }; 72F75A601336F9A3004BB496 /* libcupsimage */ = { isa = PBXNativeTarget; buildConfigurationList = 72F75A621336F9A3004BB496 /* Build configuration list for PBXNativeTarget "libcupsimage" */; buildPhases = ( 72F75A5D1336F9A3004BB496 /* Sources */, 72F75A5E1336F9A3004BB496 /* Frameworks */, 72F75A5F1336F9A3004BB496 /* Headers */, ); buildRules = ( ); dependencies = ( 72F75A661336FA30004BB496 /* PBXTargetDependency */, ); name = libcupsimage; productName = libcupsimage; productReference = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; productType = "com.apple.product-type.library.dynamic"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 72BF96371333042100B1EAD7 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1100; ORGANIZATIONNAME = "Apple Inc."; TargetAttributes = { 270695FD1CADF3E200FFE5FB = { DevelopmentTeam = RU58A2256H; }; 27A0347A1A8BDB1200650675 = { CreatedOnToolsVersion = 6.1.1; }; }; }; buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 72BF96351333042100B1EAD7; productRefGroup = 72220EAF1333047D00FCA411 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 274FF5DE13332D3000317ECB /* All */, 273BF6D91333B6260022CAAB /* Tests */, 72220EAD1333047D00FCA411 /* libcups */, 270695FD1CADF3E200FFE5FB /* libcups_ios */, 274FF6891333B1C400317ECB /* libcups_static */, 724FA7411CC03ACC0092477B /* libcupscgi */, 724FA7581CC03AF60092477B /* libcupscgi_static */, 72F75A601336F9A3004BB496 /* libcupsimage */, 724FA7011CC03A490092477B /* libcupsimage_static */, 72220FAB13330B2200FCA411 /* libcupsmime */, 724FA7101CC03A990092477B /* libcupsmime_static */, 274FF5ED133330C800317ECB /* libcupsppdc */, 724FA7201CC03AAF0092477B /* libcupsppdc_static */, 271285951CC12D1300E517C7 /* admin.cgi */, 271286BA1CC13E2100E517C7 /* bcp */, 271284E11CC1261900E517C7 /* cancel */, 271286871CC13DC000E517C7 /* checkpo */, 271285A31CC12D3A00E517C7 /* classes.cgi */, 271285CD1CC12DBF00E517C7 /* commandtops */, 271284EE1CC1264B00E517C7 /* cupsaccept */, 2766835B1337A9B6000D33D0 /* cupsctl */, 72220F5A13330A5A00FCA411 /* cupsd */, 274FF5CB13332B1F00317ECB /* cups-driverd */, 274FF6281333333600317ECB /* cups-deviced */, 274FF63D1333358B00317ECB /* cups-exec */, 274FF64E133339C400317ECB /* cups-lpd */, 274FF67713333B2F00317ECB /* cupsfilter */, 72F75A511336F950004BB496 /* cupstestppd */, 724379461333FEA9009631B9 /* dnssd */, 2712871E1CC140BE00E517C7 /* genstrings */, 271285DA1CC12DDF00E517C7 /* gziptoany */, 724378FC1333E43E009631B9 /* ipp */, 273B1E9A226B3E4800428143 /* ippevepcl */, 726AD6F6135E88F0002C930D /* ippeveprinter */, 273B1EAB226B3E5200428143 /* ippeveps */, 72CF95E618A19134000FCAE4 /* ippfind */, 276683EF1337F78E000D33D0 /* ipptool */, 271285B11CC12D4E00E517C7 /* jobs.cgi */, 271285081CC1267A00E517C7 /* lp */, 27A0347A1A8BDB1200650675 /* lpadmin */, 271285151CC1269700E517C7 /* lpc */, 724379171333E532009631B9 /* lpd */, 271285221CC126AA00E517C7 /* lpinfo */, 2712852F1CC1270B00E517C7 /* lpmove */, 2712853C1CC1271E00E517C7 /* lpoptions */, 271285491CC1272D00E517C7 /* lpq */, 271285561CC1274300E517C7 /* lpr */, 271285631CC1275200E517C7 /* lprm */, 271285701CC1276400E517C7 /* lpstat */, 271286E51CC13F2000E517C7 /* mailto */, 271287091CC13FAB00E517C7 /* mantohtml */, 271286981CC13DF100E517C7 /* po2strings */, 2766836F1337AC79000D33D0 /* ppdc */, 2766837C1337AC8C000D33D0 /* ppdhtml */, 276683891337AC97000D33D0 /* ppdi */, 276683961337ACA2000D33D0 /* ppdmerge */, 276683A31337ACAB000D33D0 /* ppdpo */, 271285BF1CC12D5E00E517C7 /* printers.cgi */, 271285E71CC12E2D00E517C7 /* pstops */, 2712866B1CC1310E00E517C7 /* rasterbench */, 271285F51CC12EEB00E517C7 /* rastertoepson */, 271286051CC12F0B00E517C7 /* rastertohp */, 271286151CC12F1A00E517C7 /* rastertolabel */, 7258EAE1134594C4009286F1 /* rastertopwg */, 271286F51CC13F3F00E517C7 /* rss */, 720DD6C11358FD5F0064AA82 /* snmp */, 7243792F1333FB85009631B9 /* socket */, 271286A91CC13DFF00E517C7 /* strings2po */, 271286CB1CC13E5B00E517C7 /* tbcp */, 724FA65E1CC038A50092477B /* test1284 */, 724FA5241CC0370C0092477B /* testadmin */, 724FA5371CC037370092477B /* testarray */, 724FA6721CC038BD0092477B /* testbackend */, 724FA54A1CC037500092477B /* testcache */, 724FA6ED1CC03A210092477B /* testcatalog */, 724FA6991CC039200092477B /* testcgi */, 729181AC201155C1005E7560 /* testclient */, 724FA55D1CC037670092477B /* testconflicts */, 270D02131D707E0200EA9403 /* testcreds */, 273BF6BC1333B5000022CAAB /* testcups */, 2767FC4619266A0D000F61D3 /* testdest */, 724FA5701CC037810092477B /* testfile */, 724FA6AC1CC0393E0092477B /* testhi */, 278C58CA136B640300836530 /* testhttp */, 724FA5831CC037980092477B /* testi18n */, 724FA5961CC037AA0092477B /* testipp */, 724FA5A91CC037C60092477B /* testlang */, 724FA5BC1CC037D90092477B /* testlpd */, 270CCDA6135E3C9E00007BE2 /* testmime */, 724FA6D81CC039DE0092477B /* testnotify */, 724FA5CF1CC037F00092477B /* testoptions */, 724FA5E31CC038040092477B /* testppd */, 724FA5F71CC038190092477B /* testpwg */, 724FA60B1CC0382B0092477B /* testraster */, 724FA61F1CC038410092477B /* testsnmp */, 724FA6331CC038560092477B /* testspeed */, 724FA6471CC0386E0092477B /* testsub */, 724FA6851CC038D90092477B /* testsupplies */, 724FA6BF1CC0395A0092477B /* testtemplate */, 271286571CC1309000E517C7 /* tlscheck */, 7243795A1333FF1D009631B9 /* usb */, 274770D12345342B0089BC31 /* testthreads */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 270695FE1CADF3E200FFE5FB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 270696001CADF3E200FFE5FB /* array.c in Sources */, 270696021CADF3E200FFE5FB /* auth.c in Sources */, 270696071CADF3E200FFE5FB /* debug.c in Sources */, 270696081CADF3E200FFE5FB /* dest.c in Sources */, 270696091CADF3E200FFE5FB /* dir.c in Sources */, 2706960B1CADF3E200FFE5FB /* encode.c in Sources */, 2706960C1CADF3E200FFE5FB /* file.c in Sources */, 2706960F1CADF3E200FFE5FB /* getputfile.c in Sources */, 270696101CADF3E200FFE5FB /* globals.c in Sources */, 270696111CADF3E200FFE5FB /* http-addr.c in Sources */, 270696121CADF3E200FFE5FB /* http-addrlist.c in Sources */, 270696131CADF3E200FFE5FB /* http-support.c in Sources */, 7253C464216ED51500494ADD /* raster-stubs.c in Sources */, 270696141CADF3E200FFE5FB /* http.c in Sources */, 7253C458216E981200494ADD /* raster-stream.c in Sources */, 270696161CADF3E200FFE5FB /* dest-options.c in Sources */, 270696171CADF3E200FFE5FB /* ipp-support.c in Sources */, 270696181CADF3E200FFE5FB /* ipp.c in Sources */, 270696191CADF3E200FFE5FB /* langprintf.c in Sources */, 2706961A1CADF3E200FFE5FB /* language.c in Sources */, 2706961D1CADF3E200FFE5FB /* md5.c in Sources */, 2706961E1CADF3E200FFE5FB /* md5passwd.c in Sources */, 2706961F1CADF3E200FFE5FB /* hash.c in Sources */, 270696201CADF3E200FFE5FB /* notify.c in Sources */, 270696211CADF3E200FFE5FB /* options.c in Sources */, 270696221CADF3E200FFE5FB /* tls.c in Sources */, 270696251CADF3E200FFE5FB /* dest-job.c in Sources */, 270696271CADF3E200FFE5FB /* pwg-media.c in Sources */, 270696281CADF3E200FFE5FB /* dest-localization.c in Sources */, 270696291CADF3E200FFE5FB /* request.c in Sources */, 2706962C1CADF3E200FFE5FB /* snprintf.c in Sources */, 2706962D1CADF3E200FFE5FB /* string.c in Sources */, 7253C455216E980000494ADD /* raster-error.c in Sources */, 2706965B1CAE1A9A00FFE5FB /* util.c in Sources */, 2706962E1CADF3E200FFE5FB /* tempfile.c in Sources */, 2706962F1CADF3E200FFE5FB /* thread.c in Sources */, 270696301CADF3E200FFE5FB /* transcode.c in Sources */, 270696311CADF3E200FFE5FB /* usersys.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 270CCDA3135E3C9E00007BE2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 270D02161D707E0200EA9403 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 270D02261D707E3700EA9403 /* testcreds.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271284E41CC1261900E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271284ED1CC1262C00E517C7 /* cancel.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271284F11CC1264B00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271284FA1CC1265800E517C7 /* cupsaccept.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712850B1CC1267A00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285141CC1269400E517C7 /* lp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285181CC1269700E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285211CC126A700E517C7 /* lpc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285251CC126AA00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712852E1CC126BC00E517C7 /* lpinfo.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285321CC1270B00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712853B1CC1271B00E517C7 /* lpmove.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712853F1CC1271E00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285481CC1272900E517C7 /* lpoptions.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712854C1CC1272D00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285551CC1273C00E517C7 /* lpq.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285591CC1274300E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285621CC1274F00E517C7 /* lpr.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285661CC1275200E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712856F1CC1276000E517C7 /* lprm.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285731CC1276400E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712857C1CC1277000E517C7 /* lpstat.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285981CC12D1300E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285A11CC12D2100E517C7 /* admin.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285A61CC12D3A00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285B01CC12D4A00E517C7 /* classes.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285B41CC12D4E00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285BE1CC12D5C00E517C7 /* jobs.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285C21CC12D5E00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285CC1CC12D6D00E517C7 /* printers.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285D01CC12DBF00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285D91CC12DD000E517C7 /* commandtops.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285DD1CC12DDF00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285E61CC12DEF00E517C7 /* gziptoany.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285EA1CC12E2D00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271285F41CC12E4200E517C7 /* common.c in Sources */, 271285F31CC12E3C00E517C7 /* pstops.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271285F81CC12EEB00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286011CC12EFA00E517C7 /* rastertoepson.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712860A1CC12F0B00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286141CC12F1800E517C7 /* rastertohp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712861A1CC12F1A00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286241CC12F2600E517C7 /* rastertolabel.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712865A1CC1309000E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286691CC130C700E517C7 /* tlscheck.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286701CC1310E00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712867E1CC1311D00E517C7 /* rasterbench.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712868A1CC13DC000E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286971CC13DEA00E517C7 /* checkpo.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712869B1CC13DF100E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286A81CC13DFD00E517C7 /* po2strings.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286AC1CC13DFF00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286B91CC13E1000E517C7 /* strings2po.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286BD1CC13E2100E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286CA1CC13E2E00E517C7 /* bcp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286CE1CC13E5B00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286DA1CC13E6A00E517C7 /* tbcp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286E81CC13F2000E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271286F41CC13F2F00E517C7 /* mailto.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271286F81CC13F3F00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271287041CC13F4C00E517C7 /* rss.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2712870C1CC13FAB00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712871A1CC13FE800E517C7 /* mantohtml.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 271287231CC140BE00E517C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2712872D1CC140D200E517C7 /* genstrings.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 273B1E9D226B3E4800428143 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 273B1EBF226B3EF300428143 /* ippevepcl.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 273B1EAE226B3E5200428143 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 273B1EC0226B3EFF00428143 /* ippeveps.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 273BF6B91333B5000022CAAB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 273BF6C71333B5370022CAAB /* testcups.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274770D42345342B0089BC31 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274770E2234534660089BC31 /* testthreads.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF5C813332B1F00317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF5D913332CC700317ECB /* cups-driverd.cxx in Sources */, 274FF5DA13332CC700317ECB /* util.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF5EA133330C800317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF60A1333315100317ECB /* ppdc-array.cxx in Sources */, 274FF60B1333315100317ECB /* ppdc-attr.cxx in Sources */, 274FF60C1333315100317ECB /* ppdc-catalog.cxx in Sources */, 274FF60D1333315100317ECB /* ppdc-choice.cxx in Sources */, 274FF60E1333315100317ECB /* ppdc-constraint.cxx in Sources */, 274FF60F1333315100317ECB /* ppdc-driver.cxx in Sources */, 274FF6101333315100317ECB /* ppdc-file.cxx in Sources */, 274FF6111333315100317ECB /* ppdc-filter.cxx in Sources */, 274FF6121333315100317ECB /* ppdc-font.cxx in Sources */, 274FF6131333315100317ECB /* ppdc-group.cxx in Sources */, 274FF6141333315100317ECB /* ppdc-import.cxx in Sources */, 274FF6151333315100317ECB /* ppdc-mediasize.cxx in Sources */, 274FF6161333315100317ECB /* ppdc-message.cxx in Sources */, 274FF6171333315100317ECB /* ppdc-option.cxx in Sources */, 274FF6191333315100317ECB /* ppdc-profile.cxx in Sources */, 274FF61A1333315100317ECB /* ppdc-shared.cxx in Sources */, 274FF61B1333315100317ECB /* ppdc-source.cxx in Sources */, 274FF61C1333315100317ECB /* ppdc-string.cxx in Sources */, 274FF61D1333315100317ECB /* ppdc-variable.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF6251333333600317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF6361333344400317ECB /* cups-deviced.c in Sources */, 274FF6371333345900317ECB /* util.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF63A1333358B00317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF64A1333398D00317ECB /* cups-exec.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF64B133339C400317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF65C133339FC00317ECB /* cups-lpd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF67413333B2F00317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF68813333B6E00317ECB /* cupsfilter.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 274FF68A1333B1C400317ECB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 274FF68B1333B1C400317ECB /* adminutil.c in Sources */, 274FF68C1333B1C400317ECB /* array.c in Sources */, 7253C459216E981200494ADD /* raster-stream.c in Sources */, 274FF68D1333B1C400317ECB /* ppd-attr.c in Sources */, 274FF68E1333B1C400317ECB /* auth.c in Sources */, 274FF68F1333B1C400317ECB /* backchannel.c in Sources */, 720E854620164E7B00C6C411 /* ipp-vars.c in Sources */, 274FF6901333B1C400317ECB /* backend.c in Sources */, 274FF6911333B1C400317ECB /* ppd-conflicts.c in Sources */, 274FF6921333B1C400317ECB /* ppd-custom.c in Sources */, 274FF6931333B1C400317ECB /* debug.c in Sources */, 274FF6941333B1C400317ECB /* dest.c in Sources */, 274FF6951333B1C400317ECB /* dir.c in Sources */, 274FF6961333B1C400317ECB /* ppd-emit.c in Sources */, 274FF6971333B1C400317ECB /* encode.c in Sources */, 274FF6981333B1C400317ECB /* file.c in Sources */, 274FF6991333B1C400317ECB /* getdevices.c in Sources */, 720E854420164E7B00C6C411 /* ipp-file.c in Sources */, 274FF69A1333B1C400317ECB /* getifaddrs.c in Sources */, 274FF69B1333B1C400317ECB /* getputfile.c in Sources */, 274FF69C1333B1C400317ECB /* globals.c in Sources */, 274FF69D1333B1C400317ECB /* http-addr.c in Sources */, 274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */, 274FF69F1333B1C400317ECB /* http-support.c in Sources */, 274FF6A01333B1C400317ECB /* http.c in Sources */, 7253C45B216E981A00494ADD /* raster-interpret.c in Sources */, 72A8B3D81C188CB900A1A547 /* ppd-util.c in Sources */, 2767FC7419268F0C000F61D3 /* dest-options.c in Sources */, 274FF6A11333B1C400317ECB /* ipp-support.c in Sources */, 274FF6A21333B1C400317ECB /* ipp.c in Sources */, 274FF6A31333B1C400317ECB /* langprintf.c in Sources */, 274FF6A41333B1C400317ECB /* language.c in Sources */, 274FF6A51333B1C400317ECB /* ppd-localize.c in Sources */, 274FF6A61333B1C400317ECB /* ppd-mark.c in Sources */, 274FF6A71333B1C400317ECB /* md5.c in Sources */, 274FF6A81333B1C400317ECB /* md5passwd.c in Sources */, 7284F9F11BFCCDB20026F886 /* hash.c in Sources */, 274FF6A91333B1C400317ECB /* notify.c in Sources */, 274FF6AA1333B1C400317ECB /* options.c in Sources */, 727AD5B819100A58009F6862 /* tls.c in Sources */, 7253C465216ED51500494ADD /* raster-stubs.c in Sources */, 274FF6AB1333B1C400317ECB /* ppd-page.c in Sources */, 7253C456216E980200494ADD /* raster-error.c in Sources */, 274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */, 2767FC7219268F06000F61D3 /* dest-job.c in Sources */, 274FF6AD1333B1C400317ECB /* ppd.c in Sources */, 274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */, 2767FC7319268F09000F61D3 /* dest-localization.c in Sources */, 7253C460216ED51500494ADD /* raster-interstub.c in Sources */, 274FF6AF1333B1C400317ECB /* request.c in Sources */, 274FF6B01333B1C400317ECB /* sidechannel.c in Sources */, 274FF6B11333B1C400317ECB /* snmp.c in Sources */, 274FF6B21333B1C400317ECB /* snprintf.c in Sources */, 274FF6B31333B1C400317ECB /* string.c in Sources */, 274FF6B41333B1C400317ECB /* tempfile.c in Sources */, 274FF6B51333B1C400317ECB /* thread.c in Sources */, 274FF6B61333B1C400317ECB /* transcode.c in Sources */, 274FF6B71333B1C400317ECB /* usersys.c in Sources */, 274FF6B81333B1C400317ECB /* util.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683581337A9B6000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683691337AA00000D33D0 /* cupsctl.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2766836C1337AC79000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683CD1337B201000D33D0 /* ppdc.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683791337AC8C000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683CF1337B20D000D33D0 /* ppdhtml.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683861337AC97000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683D11337B21A000D33D0 /* ppdi.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683931337ACA2000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683D31337B228000D33D0 /* ppdmerge.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683A01337ACAB000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683D51337B237000D33D0 /* ppdpo.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 276683EC1337F78E000D33D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 276683FA1337F7A9000D33D0 /* ipptool.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2767FC4919266A0D000F61D3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2767FC5219266A36000F61D3 /* testdest.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 278C58C7136B640300836530 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 278C58E3136B647200836530 /* testhttp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 27A034771A8BDB1200650675 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 27A034821A8BDC3A00650675 /* lpadmin.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 720DD6BE1358FD5F0064AA82 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 720DD6D413590AB90064AA82 /* ieee1284.c in Sources */, 720DD6D31358FDDE0064AA82 /* snmp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220EAA1333047D00FCA411 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72220EB61333052D00FCA411 /* adminutil.c in Sources */, 72220EC51333056300FCA411 /* array.c in Sources */, 7253C457216E981000494ADD /* raster-stream.c in Sources */, 72220EC71333056300FCA411 /* ppd-attr.c in Sources */, 727AD5B719100A58009F6862 /* tls.c in Sources */, 72220EC81333056300FCA411 /* auth.c in Sources */, 720E854520164E7B00C6C411 /* ipp-vars.c in Sources */, 72220EC91333056300FCA411 /* backchannel.c in Sources */, 72220ECA1333056300FCA411 /* backend.c in Sources */, 72220ECC1333056300FCA411 /* ppd-conflicts.c in Sources */, 72220ECF1333056300FCA411 /* ppd-custom.c in Sources */, 72220F0B133305BB00FCA411 /* debug.c in Sources */, 72220F0C133305BB00FCA411 /* dest.c in Sources */, 72220F0D133305BB00FCA411 /* dir.c in Sources */, 72220F0F133305BB00FCA411 /* ppd-emit.c in Sources */, 72220F10133305BB00FCA411 /* encode.c in Sources */, 72220F12133305BB00FCA411 /* file.c in Sources */, 720E854320164E7B00C6C411 /* ipp-file.c in Sources */, 72220F14133305BB00FCA411 /* getdevices.c in Sources */, 72220F15133305BB00FCA411 /* getifaddrs.c in Sources */, 72220F16133305BB00FCA411 /* getputfile.c in Sources */, 72220F17133305BB00FCA411 /* globals.c in Sources */, 72220F18133305BB00FCA411 /* http-addr.c in Sources */, 72220F19133305BB00FCA411 /* http-addrlist.c in Sources */, 72220F1B133305BB00FCA411 /* http-support.c in Sources */, 7253C45A216E981900494ADD /* raster-interpret.c in Sources */, 72A8B3D71C188CB800A1A547 /* ppd-util.c in Sources */, 72220F1C133305BB00FCA411 /* http.c in Sources */, 72CF95E518A13543000FCAE4 /* dest-options.c in Sources */, 72220F1F133305BB00FCA411 /* ipp-support.c in Sources */, 72220F20133305BB00FCA411 /* ipp.c in Sources */, 72220F22133305BB00FCA411 /* langprintf.c in Sources */, 72220F24133305BB00FCA411 /* language.c in Sources */, 72220F26133305BB00FCA411 /* ppd-localize.c in Sources */, 72220F27133305BB00FCA411 /* ppd-mark.c in Sources */, 72220F29133305BB00FCA411 /* md5.c in Sources */, 7284F9F01BFCCDB10026F886 /* hash.c in Sources */, 72220F2A133305BB00FCA411 /* md5passwd.c in Sources */, 72220F2B133305BB00FCA411 /* notify.c in Sources */, 72220F2C133305BB00FCA411 /* options.c in Sources */, 7253C463216ED51500494ADD /* raster-stubs.c in Sources */, 72220F2D133305BB00FCA411 /* ppd-page.c in Sources */, 7253C454216E97FF00494ADD /* raster-error.c in Sources */, 72220F2E133305BB00FCA411 /* ppd-cache.c in Sources */, 72220F30133305BB00FCA411 /* ppd.c in Sources */, 72220F32133305BB00FCA411 /* pwg-media.c in Sources */, 72220F35133305BB00FCA411 /* request.c in Sources */, 72220F36133305BB00FCA411 /* sidechannel.c in Sources */, 7253C45E216ED51500494ADD /* raster-interstub.c in Sources */, 72220F39133305BB00FCA411 /* snmp.c in Sources */, 72220F3A133305BB00FCA411 /* snprintf.c in Sources */, 72220F3C133305BB00FCA411 /* string.c in Sources */, 72220F3D133305BB00FCA411 /* tempfile.c in Sources */, 72CF95E418A13543000FCAE4 /* dest-localization.c in Sources */, 72220F3F133305BB00FCA411 /* thread.c in Sources */, 72220F40133305BB00FCA411 /* transcode.c in Sources */, 72220F42133305BB00FCA411 /* usersys.c in Sources */, 72220F43133305BB00FCA411 /* util.c in Sources */, 72CF95E318A13543000FCAE4 /* dest-job.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220F5713330A5A00FCA411 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72220F9013330B0C00FCA411 /* auth.c in Sources */, 72220F9113330B0C00FCA411 /* banners.c in Sources */, 72220F9213330B0C00FCA411 /* cert.c in Sources */, 72220F9313330B0C00FCA411 /* classes.c in Sources */, 72220F9413330B0C00FCA411 /* client.c in Sources */, 72220F9513330B0C00FCA411 /* conf.c in Sources */, 72220F9613330B0C00FCA411 /* dirsvc.c in Sources */, 72220F9713330B0C00FCA411 /* env.c in Sources */, 72220F9813330B0C00FCA411 /* ipp.c in Sources */, 72220F9913330B0C00FCA411 /* job.c in Sources */, 72220F9A13330B0C00FCA411 /* listen.c in Sources */, 72220F9B13330B0C00FCA411 /* log.c in Sources */, 72220F9C13330B0C00FCA411 /* main.c in Sources */, 72220F9D13330B0C00FCA411 /* network.c in Sources */, 72220F9E13330B0C00FCA411 /* policy.c in Sources */, 72220F9F13330B0C00FCA411 /* printers.c in Sources */, 72220FA013330B0C00FCA411 /* process.c in Sources */, 72220FA113330B0C00FCA411 /* quotas.c in Sources */, 72220FA313330B0C00FCA411 /* select.c in Sources */, 72220FA413330B0C00FCA411 /* server.c in Sources */, 72220FA513330B0C00FCA411 /* statbuf.c in Sources */, 72220FA613330B0C00FCA411 /* subscriptions.c in Sources */, 72220FA713330B0C00FCA411 /* sysman.c in Sources */, 72C16CB9137B195D007E4BF4 /* file.c in Sources */, 72D53A3815B4929D003F877F /* colorman.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72220FA813330B2200FCA411 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72220FB613330BCE00FCA411 /* filter.c in Sources */, 72220FB713330BCE00FCA411 /* mime.c in Sources */, 72220FB913330BCE00FCA411 /* type.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724378F91333E43E009631B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7243790D1333E4E3009631B9 /* ipp.c in Sources */, 7243790E1333E4E3009631B9 /* network.c in Sources */, 7243790F1333E4E3009631B9 /* snmp-supplies.c in Sources */, 724379131333E516009631B9 /* runloop.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379141333E532009631B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724379221333E928009631B9 /* network.c in Sources */, 724379231333E928009631B9 /* runloop.c in Sources */, 724379241333E928009631B9 /* snmp-supplies.c in Sources */, 724379291333E952009631B9 /* lpd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 7243792C1333FB85009631B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724379401333FD4B009631B9 /* network.c in Sources */, 724379411333FD4B009631B9 /* runloop.c in Sources */, 724379421333FD4B009631B9 /* snmp-supplies.c in Sources */, 7243793D1333FD19009631B9 /* socket.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379431333FEA9009631B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724379511333FEBB009631B9 /* dnssd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724379571333FF1D009631B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724379C71333FFC7009631B9 /* usb.c in Sources */, 724379CB1334000E009631B9 /* ieee1284.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5271CC0370C0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5361CC0372F0092477B /* testadmin.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA53A1CC037370092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5491CC037460092477B /* testarray.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA54D1CC037500092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA55C1CC0375F0092477B /* testcache.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5601CC037670092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA56F1CC037760092477B /* testconflicts.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5731CC037810092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5821CC0378E0092477B /* testfile.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5861CC037980092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5951CC037A50092477B /* testi18n.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5991CC037AA0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5A81CC037B70092477B /* testipp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5AC1CC037C60092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5BB1CC037D30092477B /* testlang.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5BF1CC037D90092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5CE1CC037E50092477B /* testlpd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5D41CC037F00092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5E21CC037FD0092477B /* testoptions.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5E81CC038040092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA5F61CC0380F0092477B /* testppd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA5FC1CC038190092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA60A1CC038250092477B /* testpwg.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6101CC0382B0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA61E1CC0383B0092477B /* testraster.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6241CC038410092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6321CC038510092477B /* testsnmp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6381CC038560092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6461CC038650092477B /* testspeed.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA64C1CC0386E0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA65A1CC038790092477B /* testsub.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6631CC038A50092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6711CC038B30092477B /* test1284.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6751CC038BD0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6841CC038CA0092477B /* testbackend.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA68A1CC038D90092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271284D21CC1231300E517C7 /* snmp-supplies.c in Sources */, 724FA6981CC038E70092477B /* testsupplies.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA69C1CC039200092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6AB1CC0392E0092477B /* testcgi.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6AF1CC0393E0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6BE1CC0394C0092477B /* testhi.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6C41CC0395A0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6D21CC039680092477B /* testtemplate.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6DD1CC039DE0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA6EB1CC039EB0092477B /* testnotify.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA6F21CC03A210092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA7001CC03A2F0092477B /* testcatalog.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7041CC03A490092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7253C467216ED51500494ADD /* raster-stubs.c in Sources */, 7253C462216ED51500494ADD /* raster-interstub.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7131CC03A990092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA7141CC03A990092477B /* filter.c in Sources */, 724FA7151CC03A990092477B /* mime.c in Sources */, 724FA7161CC03A990092477B /* type.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7231CC03AAF0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA7241CC03AAF0092477B /* ppdc-array.cxx in Sources */, 724FA7251CC03AAF0092477B /* ppdc-attr.cxx in Sources */, 724FA7261CC03AAF0092477B /* ppdc-catalog.cxx in Sources */, 724FA7271CC03AAF0092477B /* ppdc-choice.cxx in Sources */, 724FA7281CC03AAF0092477B /* ppdc-constraint.cxx in Sources */, 724FA7291CC03AAF0092477B /* ppdc-driver.cxx in Sources */, 724FA72A1CC03AAF0092477B /* ppdc-file.cxx in Sources */, 724FA72B1CC03AAF0092477B /* ppdc-filter.cxx in Sources */, 724FA72C1CC03AAF0092477B /* ppdc-font.cxx in Sources */, 724FA72D1CC03AAF0092477B /* ppdc-group.cxx in Sources */, 724FA72E1CC03AAF0092477B /* ppdc-import.cxx in Sources */, 724FA72F1CC03AAF0092477B /* ppdc-mediasize.cxx in Sources */, 724FA7301CC03AAF0092477B /* ppdc-message.cxx in Sources */, 724FA7311CC03AAF0092477B /* ppdc-option.cxx in Sources */, 724FA7321CC03AAF0092477B /* ppdc-profile.cxx in Sources */, 724FA7331CC03AAF0092477B /* ppdc-shared.cxx in Sources */, 724FA7341CC03AAF0092477B /* ppdc-source.cxx in Sources */, 724FA7351CC03AAF0092477B /* ppdc-string.cxx in Sources */, 724FA7361CC03AAF0092477B /* ppdc-variable.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA7441CC03ACC0092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA7511CC03AF20092477B /* help-index.c in Sources */, 724FA7521CC03AF20092477B /* help.c in Sources */, 724FA7531CC03AF20092477B /* html.c in Sources */, 724FA7541CC03AF20092477B /* ipp-var.c in Sources */, 724FA7551CC03AF20092477B /* search.c in Sources */, 724FA7561CC03AF20092477B /* template.c in Sources */, 724FA7571CC03AF20092477B /* var.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 724FA75B1CC03AF60092477B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 724FA75D1CC03AF60092477B /* help-index.c in Sources */, 724FA75E1CC03AF60092477B /* help.c in Sources */, 724FA75F1CC03AF60092477B /* html.c in Sources */, 724FA7601CC03AF60092477B /* ipp-var.c in Sources */, 724FA7611CC03AF60092477B /* search.c in Sources */, 724FA7621CC03AF60092477B /* template.c in Sources */, 724FA7631CC03AF60092477B /* var.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 7258EADE134594C4009286F1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7258EAED134594EB009286F1 /* rastertopwg.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 726AD6F3135E88F0002C930D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 726AD702135E8A90002C930D /* ippeveprinter.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 729181B1201155C1005E7560 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 729181BF201155F1005E7560 /* testclient.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72CF95E918A19134000FCAE4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72CF95F318A19165000FCAE4 /* ippfind.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72F75A4E1336F950004BB496 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72F75A5C1336F988004BB496 /* cupstestppd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72F75A5D1336F9A3004BB496 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7253C466216ED51500494ADD /* raster-stubs.c in Sources */, 7253C461216ED51500494ADD /* raster-interstub.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 270CCDA6135E3C9E00007BE2 /* testmime */; targetProxy = 270CCDB1135E3CDE00007BE2 /* PBXContainerItemProxy */; }; 270CCDB8135E3CFD00007BE2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 270CCDB7135E3CFD00007BE2 /* PBXContainerItemProxy */; }; 270D02141D707E0200EA9403 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 270D02151D707E0200EA9403 /* PBXContainerItemProxy */; }; 270D02281D707E5100EA9403 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 270D02131D707E0200EA9403 /* testcreds */; targetProxy = 270D02271D707E5100EA9403 /* PBXContainerItemProxy */; }; 271284911CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 271284901CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284931CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7581CC03AF60092477B /* libcupscgi_static */; targetProxy = 271284921CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284951CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7011CC03A490092477B /* libcupsimage_static */; targetProxy = 271284941CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284971CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7101CC03A990092477B /* libcupsmime_static */; targetProxy = 271284961CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284991CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7201CC03AAF0092477B /* libcupsppdc_static */; targetProxy = 271284981CC11FA500E517C7 /* PBXContainerItemProxy */; }; 2712849B1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA65E1CC038A50092477B /* test1284 */; targetProxy = 2712849A1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 2712849D1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5241CC0370C0092477B /* testadmin */; targetProxy = 2712849C1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 2712849F1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5371CC037370092477B /* testarray */; targetProxy = 2712849E1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284A11CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6721CC038BD0092477B /* testbackend */; targetProxy = 271284A01CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284A31CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA54A1CC037500092477B /* testcache */; targetProxy = 271284A21CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284A51CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6ED1CC03A210092477B /* testcatalog */; targetProxy = 271284A41CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284A71CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6991CC039200092477B /* testcgi */; targetProxy = 271284A61CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284A91CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA55D1CC037670092477B /* testconflicts */; targetProxy = 271284A81CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284AB1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5701CC037810092477B /* testfile */; targetProxy = 271284AA1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284AD1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6AC1CC0393E0092477B /* testhi */; targetProxy = 271284AC1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284AF1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5831CC037980092477B /* testi18n */; targetProxy = 271284AE1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284B11CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5961CC037AA0092477B /* testipp */; targetProxy = 271284B01CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284B31CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5A91CC037C60092477B /* testlang */; targetProxy = 271284B21CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284B51CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5BC1CC037D90092477B /* testlpd */; targetProxy = 271284B41CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284B71CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6D81CC039DE0092477B /* testnotify */; targetProxy = 271284B61CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284B91CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5CF1CC037F00092477B /* testoptions */; targetProxy = 271284B81CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284BB1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5E31CC038040092477B /* testppd */; targetProxy = 271284BA1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284BD1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA5F71CC038190092477B /* testpwg */; targetProxy = 271284BC1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284BF1CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA60B1CC0382B0092477B /* testraster */; targetProxy = 271284BE1CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284C11CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA61F1CC038410092477B /* testsnmp */; targetProxy = 271284C01CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284C31CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6331CC038560092477B /* testspeed */; targetProxy = 271284C21CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284C51CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6471CC0386E0092477B /* testsub */; targetProxy = 271284C41CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284C71CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6851CC038D90092477B /* testsupplies */; targetProxy = 271284C61CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284C91CC11FA500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA6BF1CC0395A0092477B /* testtemplate */; targetProxy = 271284C81CC11FA500E517C7 /* PBXContainerItemProxy */; }; 271284CB1CC122D000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7581CC03AF60092477B /* libcupscgi_static */; targetProxy = 271284CA1CC122D000E517C7 /* PBXContainerItemProxy */; }; 271284CD1CC122E400E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7201CC03AAF0092477B /* libcupsppdc_static */; targetProxy = 271284CC1CC122E400E517C7 /* PBXContainerItemProxy */; }; 271284CF1CC122ED00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7581CC03AF60092477B /* libcupscgi_static */; targetProxy = 271284CE1CC122ED00E517C7 /* PBXContainerItemProxy */; }; 271284D41CC1232500E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7581CC03AF60092477B /* libcupscgi_static */; targetProxy = 271284D31CC1232500E517C7 /* PBXContainerItemProxy */; }; 271284D61CC1234D00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7101CC03A990092477B /* libcupsmime_static */; targetProxy = 271284D51CC1234D00E517C7 /* PBXContainerItemProxy */; }; 271284E21CC1261900E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271284E31CC1261900E517C7 /* PBXContainerItemProxy */; }; 271284EF1CC1264B00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271284F01CC1264B00E517C7 /* PBXContainerItemProxy */; }; 271285091CC1267A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 2712850A1CC1267A00E517C7 /* PBXContainerItemProxy */; }; 271285161CC1269700E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285171CC1269700E517C7 /* PBXContainerItemProxy */; }; 271285231CC126AA00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285241CC126AA00E517C7 /* PBXContainerItemProxy */; }; 271285301CC1270B00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285311CC1270B00E517C7 /* PBXContainerItemProxy */; }; 2712853D1CC1271E00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 2712853E1CC1271E00E517C7 /* PBXContainerItemProxy */; }; 2712854A1CC1272D00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 2712854B1CC1272D00E517C7 /* PBXContainerItemProxy */; }; 271285571CC1274300E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285581CC1274300E517C7 /* PBXContainerItemProxy */; }; 271285641CC1275200E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285651CC1275200E517C7 /* PBXContainerItemProxy */; }; 271285711CC1276400E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285721CC1276400E517C7 /* PBXContainerItemProxy */; }; 2712857E1CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271284E11CC1261900E517C7 /* cancel */; targetProxy = 2712857D1CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285801CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271284EE1CC1264B00E517C7 /* cupsaccept */; targetProxy = 2712857F1CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285841CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285081CC1267A00E517C7 /* lp */; targetProxy = 271285831CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285861CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285151CC1269700E517C7 /* lpc */; targetProxy = 271285851CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285881CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285221CC126AA00E517C7 /* lpinfo */; targetProxy = 271285871CC1295A00E517C7 /* PBXContainerItemProxy */; }; 2712858A1CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2712852F1CC1270B00E517C7 /* lpmove */; targetProxy = 271285891CC1295A00E517C7 /* PBXContainerItemProxy */; }; 2712858C1CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2712853C1CC1271E00E517C7 /* lpoptions */; targetProxy = 2712858B1CC1295A00E517C7 /* PBXContainerItemProxy */; }; 2712858E1CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285491CC1272D00E517C7 /* lpq */; targetProxy = 2712858D1CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285901CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285561CC1274300E517C7 /* lpr */; targetProxy = 2712858F1CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285921CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285631CC1275200E517C7 /* lprm */; targetProxy = 271285911CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285941CC1295A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285701CC1276400E517C7 /* lpstat */; targetProxy = 271285931CC1295A00E517C7 /* PBXContainerItemProxy */; }; 271285961CC12D1300E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285971CC12D1300E517C7 /* PBXContainerItemProxy */; }; 271285A41CC12D3A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285A51CC12D3A00E517C7 /* PBXContainerItemProxy */; }; 271285B21CC12D4E00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285B31CC12D4E00E517C7 /* PBXContainerItemProxy */; }; 271285C01CC12D5E00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285C11CC12D5E00E517C7 /* PBXContainerItemProxy */; }; 271285CE1CC12DBF00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285CF1CC12DBF00E517C7 /* PBXContainerItemProxy */; }; 271285DB1CC12DDF00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285DC1CC12DDF00E517C7 /* PBXContainerItemProxy */; }; 271285E81CC12E2D00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285E91CC12E2D00E517C7 /* PBXContainerItemProxy */; }; 271285F61CC12EEB00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271285F71CC12EEB00E517C7 /* PBXContainerItemProxy */; }; 271286081CC12F0B00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286091CC12F0B00E517C7 /* PBXContainerItemProxy */; }; 271286181CC12F1A00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286191CC12F1A00E517C7 /* PBXContainerItemProxy */; }; 271286351CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285951CC12D1300E517C7 /* admin.cgi */; targetProxy = 271286341CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286371CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285A31CC12D3A00E517C7 /* classes.cgi */; targetProxy = 271286361CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286391CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285CD1CC12DBF00E517C7 /* commandtops */; targetProxy = 271286381CC12F9000E517C7 /* PBXContainerItemProxy */; }; 2712863B1CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285DA1CC12DDF00E517C7 /* gziptoany */; targetProxy = 2712863A1CC12F9000E517C7 /* PBXContainerItemProxy */; }; 2712863D1CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285B11CC12D4E00E517C7 /* jobs.cgi */; targetProxy = 2712863C1CC12F9000E517C7 /* PBXContainerItemProxy */; }; 2712863F1CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285BF1CC12D5E00E517C7 /* printers.cgi */; targetProxy = 2712863E1CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286411CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285E71CC12E2D00E517C7 /* pstops */; targetProxy = 271286401CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286431CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271285F51CC12EEB00E517C7 /* rastertoepson */; targetProxy = 271286421CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286451CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286051CC12F0B00E517C7 /* rastertohp */; targetProxy = 271286441CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286471CC12F9000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286151CC12F1A00E517C7 /* rastertolabel */; targetProxy = 271286461CC12F9000E517C7 /* PBXContainerItemProxy */; }; 271286581CC1309000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 271286591CC1309000E517C7 /* PBXContainerItemProxy */; }; 2712866E1CC1310E00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 2712866F1CC1310E00E517C7 /* PBXContainerItemProxy */; }; 271286881CC13DC000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 271286891CC13DC000E517C7 /* PBXContainerItemProxy */; }; 271286991CC13DF100E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 2712869A1CC13DF100E517C7 /* PBXContainerItemProxy */; }; 271286AA1CC13DFF00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 271286AB1CC13DFF00E517C7 /* PBXContainerItemProxy */; }; 271286BB1CC13E2100E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286BC1CC13E2100E517C7 /* PBXContainerItemProxy */; }; 271286CC1CC13E5B00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286CD1CC13E5B00E517C7 /* PBXContainerItemProxy */; }; 271286DC1CC13EF400E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286981CC13DF100E517C7 /* po2strings */; targetProxy = 271286DB1CC13EF400E517C7 /* PBXContainerItemProxy */; }; 271286DE1CC13EF400E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286A91CC13DFF00E517C7 /* strings2po */; targetProxy = 271286DD1CC13EF400E517C7 /* PBXContainerItemProxy */; }; 271286E01CC13EF400E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286571CC1309000E517C7 /* tlscheck */; targetProxy = 271286DF1CC13EF400E517C7 /* PBXContainerItemProxy */; }; 271286E21CC13F0100E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286BA1CC13E2100E517C7 /* bcp */; targetProxy = 271286E11CC13F0100E517C7 /* PBXContainerItemProxy */; }; 271286E41CC13F0100E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286CB1CC13E5B00E517C7 /* tbcp */; targetProxy = 271286E31CC13F0100E517C7 /* PBXContainerItemProxy */; }; 271286E61CC13F2000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286E71CC13F2000E517C7 /* PBXContainerItemProxy */; }; 271286F61CC13F3F00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 271286F71CC13F3F00E517C7 /* PBXContainerItemProxy */; }; 271287061CC13F8F00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286E51CC13F2000E517C7 /* mailto */; targetProxy = 271287051CC13F8F00E517C7 /* PBXContainerItemProxy */; }; 271287081CC13F8F00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271286F51CC13F3F00E517C7 /* rss */; targetProxy = 271287071CC13F8F00E517C7 /* PBXContainerItemProxy */; }; 2712870A1CC13FAB00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 2712870B1CC13FAB00E517C7 /* PBXContainerItemProxy */; }; 2712871C1CC13FFA00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 271287091CC13FAB00E517C7 /* mantohtml */; targetProxy = 2712871B1CC13FFA00E517C7 /* PBXContainerItemProxy */; }; 2712872F1CC140DF00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 2712872E1CC140DF00E517C7 /* PBXContainerItemProxy */; }; 271287311CC140DF00E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724FA7201CC03AAF0092477B /* libcupsppdc_static */; targetProxy = 271287301CC140DF00E517C7 /* PBXContainerItemProxy */; }; 271287361CC1411000E517C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2712871E1CC140BE00E517C7 /* genstrings */; targetProxy = 271287351CC1411000E517C7 /* PBXContainerItemProxy */; }; 273B1EC2226B3F2600428143 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 273B1E9A226B3E4800428143 /* ippevepcl */; targetProxy = 273B1EC1226B3F2600428143 /* PBXContainerItemProxy */; }; 273B1EC4226B3F2600428143 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 273B1EAB226B3E5200428143 /* ippeveps */; targetProxy = 273B1EC3226B3F2600428143 /* PBXContainerItemProxy */; }; 273B1EC6226B41E600428143 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 273B1EC5226B41E600428143 /* PBXContainerItemProxy */; }; 273B1EC9226B420500428143 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 273B1EC8226B420500428143 /* PBXContainerItemProxy */; }; 273B1ECC226B421700428143 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 273B1ECB226B421700428143 /* PBXContainerItemProxy */; }; 273BF6C91333B5410022CAAB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 273BF6C81333B5410022CAAB /* PBXContainerItemProxy */; }; 273BF6DE1333B6370022CAAB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 273BF6BC1333B5000022CAAB /* testcups */; targetProxy = 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */; }; 274770D22345342B0089BC31 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 274770D32345342B0089BC31 /* PBXContainerItemProxy */; }; 274770E42345347D0089BC31 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274770D12345342B0089BC31 /* testthreads */; targetProxy = 274770E32345347D0089BC31 /* PBXContainerItemProxy */; }; 274FF5DC13332CF900317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF5DB13332CF900317ECB /* PBXContainerItemProxy */; }; 274FF5E313332D4300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF5E213332D4300317ECB /* PBXContainerItemProxy */; }; 274FF5E513332D4300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220FAB13330B2200FCA411 /* libcupsmime */; targetProxy = 274FF5E413332D4300317ECB /* PBXContainerItemProxy */; }; 274FF5E713332D4300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220F5A13330A5A00FCA411 /* cupsd */; targetProxy = 274FF5E613332D4300317ECB /* PBXContainerItemProxy */; }; 274FF5E913332D4300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5CB13332B1F00317ECB /* cups-driverd */; targetProxy = 274FF5E813332D4300317ECB /* PBXContainerItemProxy */; }; 274FF5F3133330FD00317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF5F2133330FD00317ECB /* PBXContainerItemProxy */; }; 274FF6201333316200317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 274FF61F1333316200317ECB /* PBXContainerItemProxy */; }; 274FF622133331D300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 274FF621133331D300317ECB /* PBXContainerItemProxy */; }; 274FF6341333335200317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF6331333335200317ECB /* PBXContainerItemProxy */; }; 274FF6391333348400317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6281333333600317ECB /* cups-deviced */; targetProxy = 274FF6381333348400317ECB /* PBXContainerItemProxy */; }; 274FF648133335A300317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF63D1333358B00317ECB /* cups-exec */; targetProxy = 274FF647133335A300317ECB /* PBXContainerItemProxy */; }; 274FF65A133339D900317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF659133339D900317ECB /* PBXContainerItemProxy */; }; 274FF65E13333A3400317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF64E133339C400317ECB /* cups-lpd */; targetProxy = 274FF65D13333A3400317ECB /* PBXContainerItemProxy */; }; 274FF68213333B3C00317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 274FF68113333B3C00317ECB /* PBXContainerItemProxy */; }; 274FF68413333B3C00317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220FAB13330B2200FCA411 /* libcupsmime */; targetProxy = 274FF68313333B3C00317ECB /* PBXContainerItemProxy */; }; 274FF6E21333B33F00317ECB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF67713333B2F00317ECB /* cupsfilter */; targetProxy = 274FF6E11333B33F00317ECB /* PBXContainerItemProxy */; }; 276683661337A9D6000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683651337A9D6000D33D0 /* PBXContainerItemProxy */; }; 2766836B1337AA25000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2766835B1337A9B6000D33D0 /* cupsctl */; targetProxy = 2766836A1337AA25000D33D0 /* PBXContainerItemProxy */; }; 276683AE1337ACF9000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683AD1337ACF9000D33D0 /* PBXContainerItemProxy */; }; 276683B01337ACF9000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 276683AF1337ACF9000D33D0 /* PBXContainerItemProxy */; }; 276683B41337AD18000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683B31337AD18000D33D0 /* PBXContainerItemProxy */; }; 276683B61337AD18000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 276683B51337AD18000D33D0 /* PBXContainerItemProxy */; }; 276683BC1337AE49000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683BB1337AE49000D33D0 /* PBXContainerItemProxy */; }; 276683BE1337AE49000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 276683BD1337AE49000D33D0 /* PBXContainerItemProxy */; }; 276683C01337B1AD000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683BF1337B1AD000D33D0 /* PBXContainerItemProxy */; }; 276683C21337B1AD000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 276683C11337B1AD000D33D0 /* PBXContainerItemProxy */; }; 276683C61337B1BC000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683C51337B1BC000D33D0 /* PBXContainerItemProxy */; }; 276683C81337B1BC000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF5ED133330C800317ECB /* libcupsppdc */; targetProxy = 276683C71337B1BC000D33D0 /* PBXContainerItemProxy */; }; 276683D71337B24A000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2766836F1337AC79000D33D0 /* ppdc */; targetProxy = 276683D61337B24A000D33D0 /* PBXContainerItemProxy */; }; 276683D91337B24A000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2766837C1337AC8C000D33D0 /* ppdhtml */; targetProxy = 276683D81337B24A000D33D0 /* PBXContainerItemProxy */; }; 276683DB1337B24A000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 276683891337AC97000D33D0 /* ppdi */; targetProxy = 276683DA1337B24A000D33D0 /* PBXContainerItemProxy */; }; 276683DD1337B24A000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 276683961337ACA2000D33D0 /* ppdmerge */; targetProxy = 276683DC1337B24A000D33D0 /* PBXContainerItemProxy */; }; 276683DF1337B24A000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 276683A31337ACAB000D33D0 /* ppdpo */; targetProxy = 276683DE1337B24A000D33D0 /* PBXContainerItemProxy */; }; 276683E11337B299000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683E01337B299000D33D0 /* PBXContainerItemProxy */; }; 276683E41337B2BA000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72F75A601336F9A3004BB496 /* libcupsimage */; targetProxy = 276683E31337B2BA000D33D0 /* PBXContainerItemProxy */; }; 276683FC1337F7B3000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 276683FB1337F7B3000D33D0 /* PBXContainerItemProxy */; }; 276683FF1337F7C5000D33D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 276683EF1337F78E000D33D0 /* ipptool */; targetProxy = 276683FE1337F7C5000D33D0 /* PBXContainerItemProxy */; }; 2767FC4719266A0D000F61D3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 2767FC4819266A0D000F61D3 /* PBXContainerItemProxy */; }; 2767FC5419267469000F61D3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 276683EF1337F78E000D33D0 /* ipptool */; targetProxy = 2767FC5319267469000F61D3 /* PBXContainerItemProxy */; }; 2767FC5619267469000F61D3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2767FC4619266A0D000F61D3 /* testdest */; targetProxy = 2767FC5519267469000F61D3 /* PBXContainerItemProxy */; }; 278C58D6136B641D00836530 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 278C58CA136B640300836530 /* testhttp */; targetProxy = 278C58D5136B641D00836530 /* PBXContainerItemProxy */; }; 278C58D8136B642F00836530 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 278C58D7136B642F00836530 /* PBXContainerItemProxy */; }; 27A034841A8BDC4A00650675 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 27A034831A8BDC4A00650675 /* PBXContainerItemProxy */; }; 27A034871A8BDC6900650675 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 27A0347A1A8BDB1200650675 /* lpadmin */; targetProxy = 27A034861A8BDC6900650675 /* PBXContainerItemProxy */; }; 720DD6CF1358FD790064AA82 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */; }; 720DD6D11358FDBE0064AA82 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 720DD6C11358FD5F0064AA82 /* snmp */; targetProxy = 720DD6D01358FDBE0064AA82 /* PBXContainerItemProxy */; }; 72220F6513330A6500FCA411 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 72220F6413330A6500FCA411 /* PBXContainerItemProxy */; }; 72220FBC13330C0500FCA411 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 72220FBB13330C0500FCA411 /* PBXContainerItemProxy */; }; 72220FBE13330C0B00FCA411 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220FAB13330B2200FCA411 /* libcupsmime */; targetProxy = 72220FBD13330C0B00FCA411 /* PBXContainerItemProxy */; }; 724379071333E49B009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724379061333E49B009631B9 /* PBXContainerItemProxy */; }; 724379111333E4EA009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724378FC1333E43E009631B9 /* ipp */; targetProxy = 724379101333E4EA009631B9 /* PBXContainerItemProxy */; }; 724379261333E932009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724379251333E932009631B9 /* PBXContainerItemProxy */; }; 7243792B1333E962009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724379171333E532009631B9 /* lpd */; targetProxy = 7243792A1333E962009631B9 /* PBXContainerItemProxy */; }; 7243793A1333FB95009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724379391333FB95009631B9 /* PBXContainerItemProxy */; }; 7243793F1333FD23009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 7243792F1333FB85009631B9 /* socket */; targetProxy = 7243793E1333FD23009631B9 /* PBXContainerItemProxy */; }; 724379531333FECE009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 724379461333FEA9009631B9 /* dnssd */; targetProxy = 724379521333FECE009631B9 /* PBXContainerItemProxy */; }; 724379551333FEFE009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724379541333FEFE009631B9 /* PBXContainerItemProxy */; }; 724379651333FF2E009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724379641333FF2E009631B9 /* PBXContainerItemProxy */; }; 724379C31333FF7D009631B9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 7243795A1333FF1D009631B9 /* usb */; targetProxy = 724379C21333FF7D009631B9 /* PBXContainerItemProxy */; }; 724FA5251CC0370C0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5261CC0370C0092477B /* PBXContainerItemProxy */; }; 724FA5381CC037370092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5391CC037370092477B /* PBXContainerItemProxy */; }; 724FA54B1CC037500092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA54C1CC037500092477B /* PBXContainerItemProxy */; }; 724FA55E1CC037670092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA55F1CC037670092477B /* PBXContainerItemProxy */; }; 724FA5711CC037810092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5721CC037810092477B /* PBXContainerItemProxy */; }; 724FA5841CC037980092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5851CC037980092477B /* PBXContainerItemProxy */; }; 724FA5971CC037AA0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5981CC037AA0092477B /* PBXContainerItemProxy */; }; 724FA5AA1CC037C60092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5AB1CC037C60092477B /* PBXContainerItemProxy */; }; 724FA5BD1CC037D90092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5BE1CC037D90092477B /* PBXContainerItemProxy */; }; 724FA5D01CC037F00092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5D11CC037F00092477B /* PBXContainerItemProxy */; }; 724FA5E41CC038040092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5E51CC038040092477B /* PBXContainerItemProxy */; }; 724FA5F81CC038190092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA5F91CC038190092477B /* PBXContainerItemProxy */; }; 724FA60C1CC0382B0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA60D1CC0382B0092477B /* PBXContainerItemProxy */; }; 724FA6201CC038410092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6211CC038410092477B /* PBXContainerItemProxy */; }; 724FA6341CC038560092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6351CC038560092477B /* PBXContainerItemProxy */; }; 724FA6481CC0386E0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6491CC0386E0092477B /* PBXContainerItemProxy */; }; 724FA65F1CC038A50092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6601CC038A50092477B /* PBXContainerItemProxy */; }; 724FA6731CC038BD0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6741CC038BD0092477B /* PBXContainerItemProxy */; }; 724FA6861CC038D90092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6871CC038D90092477B /* PBXContainerItemProxy */; }; 724FA69A1CC039200092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA69B1CC039200092477B /* PBXContainerItemProxy */; }; 724FA6AD1CC0393E0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6AE1CC0393E0092477B /* PBXContainerItemProxy */; }; 724FA6C01CC0395A0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6C11CC0395A0092477B /* PBXContainerItemProxy */; }; 724FA6D91CC039DE0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6DA1CC039DE0092477B /* PBXContainerItemProxy */; }; 724FA6EE1CC03A210092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 724FA6EF1CC03A210092477B /* PBXContainerItemProxy */; }; 724FA7421CC03ACC0092477B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 724FA7431CC03ACC0092477B /* PBXContainerItemProxy */; }; 7258EAEF13459ADA009286F1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 7258EAE1134594C4009286F1 /* rastertopwg */; targetProxy = 7258EAEE13459ADA009286F1 /* PBXContainerItemProxy */; }; 7258EAF113459B67009286F1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 7258EAF013459B67009286F1 /* PBXContainerItemProxy */; }; 726AD704135E8AA1002C930D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 726AD6F6135E88F0002C930D /* ippeveprinter */; targetProxy = 726AD703135E8AA1002C930D /* PBXContainerItemProxy */; }; 729181AF201155C1005E7560 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 729181B0201155C1005E7560 /* PBXContainerItemProxy */; }; 729181C12011560E005E7560 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2712866B1CC1310E00E517C7 /* rasterbench */; targetProxy = 729181C02011560E005E7560 /* PBXContainerItemProxy */; }; 729181C32011560E005E7560 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 729181AC201155C1005E7560 /* testclient */; targetProxy = 729181C22011560E005E7560 /* PBXContainerItemProxy */; }; 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 726AD6F6135E88F0002C930D /* ippeveprinter */; targetProxy = 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */; }; 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72CF95E618A19134000FCAE4 /* ippfind */; targetProxy = 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */; }; 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */; }; 72CF95E718A19134000FCAE4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 72CF95E818A19134000FCAE4 /* PBXContainerItemProxy */; }; 72F75A661336FA30004BB496 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; targetProxy = 72F75A651336FA30004BB496 /* PBXContainerItemProxy */; }; 72F75A711336FACD004BB496 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72F75A601336F9A3004BB496 /* libcupsimage */; targetProxy = 72F75A701336FACD004BB496 /* PBXContainerItemProxy */; }; 72F75A731336FACD004BB496 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72F75A511336F950004BB496 /* cupstestppd */; targetProxy = 72F75A721336FACD004BB496 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 270696581CADF3E200FFE5FB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; SDKROOT = iphoneos; SKIP_INSTALL = YES; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; }; name = Debug; }; 270696591CADF3E200FFE5FB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; SDKROOT = iphoneos; SKIP_INSTALL = YES; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; }; name = Release; }; 270CCDAD135E3C9E00007BE2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 270CCDAE135E3C9E00007BE2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 270D02221D707E0200EA9403 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 270D02231D707E0200EA9403 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271284EA1CC1261900E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271284EB1CC1261900E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271284F71CC1264B00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271284F81CC1264B00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285111CC1267A00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285121CC1267A00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712851E1CC1269700E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712851F1CC1269700E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712852B1CC126AA00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712852C1CC126AA00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285381CC1270B00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285391CC1270B00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285451CC1271E00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285461CC1271E00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285521CC1272D00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285531CC1272D00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712855F1CC1274300E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285601CC1274300E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712856C1CC1275200E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712856D1CC1275200E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285791CC1276400E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712857A1CC1276400E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712859E1CC12D1300E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712859F1CC12D1300E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285AD1CC12D3A00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285AE1CC12D3A00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285BB1CC12D4E00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285BC1CC12D4E00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285C91CC12D5E00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285CA1CC12D5E00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = "/usr/libexec/cups/cgi-bin"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285D61CC12DBF00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285D71CC12DBF00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285E31CC12DDF00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285E41CC12DDF00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285F01CC12E2D00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285F11CC12E2D00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271285FE1CC12EEB00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271285FF1CC12EEB00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286111CC12F0B00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286121CC12F0B00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286211CC12F1A00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286221CC12F1A00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286651CC1309000E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286661CC1309000E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712867B1CC1310E00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712867C1CC1310E00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286941CC13DC000E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286951CC13DC000E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286A51CC13DF100E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286A61CC13DF100E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286B61CC13DFF00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286B71CC13DFF00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286C71CC13E2100E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/monitor; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286C81CC13E2100E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/monitor; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286D71CC13E5B00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/monitor; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286D81CC13E5B00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/monitor; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271286F11CC13F2000E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/notifier; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271286F21CC13F2000E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/notifier; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271287011CC13F3F00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/notifier; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271287021CC13F3F00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/notifier; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 271287161CC13FAB00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 271287171CC13FAB00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2712872A1CC140BE00E517C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2712872B1CC140BE00E517C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 273B1EA8226B3E4800428143 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/ippeveprinter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 273B1EA9226B3E4800428143 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/ippeveprinter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 273B1EB9226B3E5200428143 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/ippeveprinter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 273B1EBA226B3E5200428143 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/ippeveprinter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 273BF6C41333B5000022CAAB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 273BF6C51333B5000022CAAB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 273BF6DB1333B6270022CAAB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 273BF6DC1333B6270022CAAB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274770DE2345342B0089BC31 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274770DF2345342B0089BC31 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF5D313332B1F00317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274FF5D413332B1F00317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF5E013332D3100317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Debug; }; 274FF5E113332D3100317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Release; }; 274FF5F0133330C800317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Debug; }; 274FF5F1133330C800317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Release; }; 274FF6301333333600317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274FF6311333333600317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF6451333358C00317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274FF6461333358C00317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF656133339C400317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274FF657133339C400317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/daemon; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF67F13333B2F00317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 274FF68013333B2F00317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 274FF6DE1333B1C400317ECB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/local/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = libcups_static; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; }; name = Debug; }; 274FF6DF1333B1C400317ECB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/local/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = libcups_static; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; }; name = Release; }; 276683631337A9B6000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683641337A9B6000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 276683771337AC79000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683781337AC79000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 276683841337AC8C000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683851337AC8C000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 276683911337AC97000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683921337AC97000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2766839E1337ACA2000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2766839F1337ACA2000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 276683AB1337ACAB000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683AC1337ACAB000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 276683F71337F78F000D33D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 276683F81337F78F000D33D0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 2767FC4E19266A0D000F61D3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = testdest; }; name = Debug; }; 2767FC4F19266A0D000F61D3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = testdest; }; name = Release; }; 278C58D1136B640300836530 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 278C58D2136B640300836530 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 27A0347F1A8BDB1300650675 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = /usr/sbin; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Debug; }; 27A034801A8BDB1300650675 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = /usr/sbin; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Release; }; 720DD6C91358FD5F0064AA82 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 720DD6CA1358FD5F0064AA82 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 72220EB01333047D00FCA411 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; DYLIB_COMPATIBILITY_VERSION = 2.0.0; DYLIB_CURRENT_VERSION = 2.12.0; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Debug; }; 72220EB11333047D00FCA411 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; DYLIB_COMPATIBILITY_VERSION = 2.0.0; DYLIB_CURRENT_VERSION = 2.12.0; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Release; }; 72220F6213330A5A00FCA411 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 72220F6313330A5A00FCA411 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/sbin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 72220FAE13330B2300FCA411 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 72220FAF13330B2300FCA411 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724379041333E43E009631B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_MODE_FLAG = "u+rwX,go-rwX"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724379051333E43E009631B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_MODE_FLAG = "u+rwX,go-rwX"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 7243791F1333E532009631B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724379201333E532009631B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724379371333FB85009631B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724379381333FB85009631B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 7243794E1333FEA9009631B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 7243794F1333FEA9009631B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724379621333FF1D009631B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724379631333FF1D009631B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/backend; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5331CC0370C0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5341CC0370C0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5461CC037370092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5471CC037370092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5591CC037500092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA55A1CC037500092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA56C1CC037670092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA56D1CC037670092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA57F1CC037810092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5801CC037810092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5921CC037980092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5931CC037980092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5A51CC037AA0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5A61CC037AA0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5B81CC037C60092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5B91CC037C60092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5CB1CC037D90092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5CC1CC037D90092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5DF1CC037F00092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5E01CC037F00092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA5F31CC038040092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA5F41CC038040092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6071CC038190092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6081CC038190092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA61B1CC0382B0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA61C1CC0382B0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA62F1CC038410092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6301CC038410092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6431CC038560092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6441CC038560092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6571CC0386E0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6581CC0386E0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA66E1CC038A50092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA66F1CC038A50092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6811CC038BD0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6821CC038BD0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6951CC038D90092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6961CC038D90092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6A81CC039200092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6A91CC039200092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6BB1CC0393E0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6BC1CC0393E0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6CF1CC0395A0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6D01CC0395A0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6E81CC039DE0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6E91CC039DE0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA6FD1CC03A210092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA6FE1CC03A210092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA70D1CC03A490092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA70E1CC03A490092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA71D1CC03A990092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA71E1CC03A990092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA73E1CC03AAF0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Debug; }; 724FA73F1CC03AAF0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; }; name = Release; }; 724FA74D1CC03ACC0092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA74E1CC03ACC0092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 724FA7691CC03AF60092477B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 724FA76A1CC03AF60092477B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_EXTENSION = a; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; MACH_O_TYPE = staticlib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 7258EAEA134594C4009286F1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 7258EAEB134594C4009286F1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/libexec/cups/filter; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 726AD6FF135E88F1002C930D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 726AD700135E88F1002C930D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 729181BC201155C1005E7560 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 729181BD201155C1005E7560 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 72BF963C1333042100B1EAD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPRESSION = lossless; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ., .., ); ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "-D_CUPS_SOURCE", "-Wno-shorten-64-to-32", ); USE_HEADERMAP = NO; }; name = Debug; }; 72BF963D1333042100B1EAD7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPRESSION = "respect-asset-catalog"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ., .., ); OTHER_CFLAGS = ( "-D_CUPS_SOURCE", "-Wno-shorten-64-to-32", ); USE_HEADERMAP = NO; }; name = Release; }; 72CF95EF18A19134000FCAE4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "ipptool copy"; }; name = Debug; }; 72CF95F018A19134000FCAE4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "ipptool copy"; }; name = Release; }; 72F75A591336F951004BB496 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 72F75A5A1336F951004BB496 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "-"; INSTALL_PATH = /usr/bin; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 72F75A631336F9A3004BB496 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 72F75A641336F9A3004BB496 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; EXECUTABLE_PREFIX = ""; INSTALL_PATH = /usr/lib; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 270696571CADF3E200FFE5FB /* Build configuration list for PBXNativeTarget "libcups_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( 270696581CADF3E200FFE5FB /* Debug */, 270696591CADF3E200FFE5FB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 270CCDAF135E3C9E00007BE2 /* Build configuration list for PBXNativeTarget "testmime" */ = { isa = XCConfigurationList; buildConfigurations = ( 270CCDAD135E3C9E00007BE2 /* Debug */, 270CCDAE135E3C9E00007BE2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 270D02211D707E0200EA9403 /* Build configuration list for PBXNativeTarget "testcreds" */ = { isa = XCConfigurationList; buildConfigurations = ( 270D02221D707E0200EA9403 /* Debug */, 270D02231D707E0200EA9403 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271284E91CC1261900E517C7 /* Build configuration list for PBXNativeTarget "cancel" */ = { isa = XCConfigurationList; buildConfigurations = ( 271284EA1CC1261900E517C7 /* Debug */, 271284EB1CC1261900E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271284F61CC1264B00E517C7 /* Build configuration list for PBXNativeTarget "cupsaccept" */ = { isa = XCConfigurationList; buildConfigurations = ( 271284F71CC1264B00E517C7 /* Debug */, 271284F81CC1264B00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285101CC1267A00E517C7 /* Build configuration list for PBXNativeTarget "lp" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285111CC1267A00E517C7 /* Debug */, 271285121CC1267A00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712851D1CC1269700E517C7 /* Build configuration list for PBXNativeTarget "lpc" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712851E1CC1269700E517C7 /* Debug */, 2712851F1CC1269700E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712852A1CC126AA00E517C7 /* Build configuration list for PBXNativeTarget "lpinfo" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712852B1CC126AA00E517C7 /* Debug */, 2712852C1CC126AA00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285371CC1270B00E517C7 /* Build configuration list for PBXNativeTarget "lpmove" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285381CC1270B00E517C7 /* Debug */, 271285391CC1270B00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285441CC1271E00E517C7 /* Build configuration list for PBXNativeTarget "lpoptions" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285451CC1271E00E517C7 /* Debug */, 271285461CC1271E00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285511CC1272D00E517C7 /* Build configuration list for PBXNativeTarget "lpq" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285521CC1272D00E517C7 /* Debug */, 271285531CC1272D00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712855E1CC1274300E517C7 /* Build configuration list for PBXNativeTarget "lpr" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712855F1CC1274300E517C7 /* Debug */, 271285601CC1274300E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712856B1CC1275200E517C7 /* Build configuration list for PBXNativeTarget "lprm" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712856C1CC1275200E517C7 /* Debug */, 2712856D1CC1275200E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285781CC1276400E517C7 /* Build configuration list for PBXNativeTarget "lpstat" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285791CC1276400E517C7 /* Debug */, 2712857A1CC1276400E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712859D1CC12D1300E517C7 /* Build configuration list for PBXNativeTarget "admin.cgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712859E1CC12D1300E517C7 /* Debug */, 2712859F1CC12D1300E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285AC1CC12D3A00E517C7 /* Build configuration list for PBXNativeTarget "classes.cgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285AD1CC12D3A00E517C7 /* Debug */, 271285AE1CC12D3A00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285BA1CC12D4E00E517C7 /* Build configuration list for PBXNativeTarget "jobs.cgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285BB1CC12D4E00E517C7 /* Debug */, 271285BC1CC12D4E00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285C81CC12D5E00E517C7 /* Build configuration list for PBXNativeTarget "printers.cgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285C91CC12D5E00E517C7 /* Debug */, 271285CA1CC12D5E00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285D51CC12DBF00E517C7 /* Build configuration list for PBXNativeTarget "commandtops" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285D61CC12DBF00E517C7 /* Debug */, 271285D71CC12DBF00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285E21CC12DDF00E517C7 /* Build configuration list for PBXNativeTarget "gziptoany" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285E31CC12DDF00E517C7 /* Debug */, 271285E41CC12DDF00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285EF1CC12E2D00E517C7 /* Build configuration list for PBXNativeTarget "pstops" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285F01CC12E2D00E517C7 /* Debug */, 271285F11CC12E2D00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271285FD1CC12EEB00E517C7 /* Build configuration list for PBXNativeTarget "rastertoepson" */ = { isa = XCConfigurationList; buildConfigurations = ( 271285FE1CC12EEB00E517C7 /* Debug */, 271285FF1CC12EEB00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286101CC12F0B00E517C7 /* Build configuration list for PBXNativeTarget "rastertohp" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286111CC12F0B00E517C7 /* Debug */, 271286121CC12F0B00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286201CC12F1A00E517C7 /* Build configuration list for PBXNativeTarget "rastertolabel" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286211CC12F1A00E517C7 /* Debug */, 271286221CC12F1A00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286641CC1309000E517C7 /* Build configuration list for PBXNativeTarget "tlscheck" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286651CC1309000E517C7 /* Debug */, 271286661CC1309000E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2712867A1CC1310E00E517C7 /* Build configuration list for PBXNativeTarget "rasterbench" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712867B1CC1310E00E517C7 /* Debug */, 2712867C1CC1310E00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286931CC13DC000E517C7 /* Build configuration list for PBXNativeTarget "checkpo" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286941CC13DC000E517C7 /* Debug */, 271286951CC13DC000E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286A41CC13DF100E517C7 /* Build configuration list for PBXNativeTarget "po2strings" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286A51CC13DF100E517C7 /* Debug */, 271286A61CC13DF100E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286B51CC13DFF00E517C7 /* Build configuration list for PBXNativeTarget "strings2po" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286B61CC13DFF00E517C7 /* Debug */, 271286B71CC13DFF00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286C61CC13E2100E517C7 /* Build configuration list for PBXNativeTarget "bcp" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286C71CC13E2100E517C7 /* Debug */, 271286C81CC13E2100E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286D61CC13E5B00E517C7 /* Build configuration list for PBXNativeTarget "tbcp" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286D71CC13E5B00E517C7 /* Debug */, 271286D81CC13E5B00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271286F01CC13F2000E517C7 /* Build configuration list for PBXNativeTarget "mailto" */ = { isa = XCConfigurationList; buildConfigurations = ( 271286F11CC13F2000E517C7 /* Debug */, 271286F21CC13F2000E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271287001CC13F3F00E517C7 /* Build configuration list for PBXNativeTarget "rss" */ = { isa = XCConfigurationList; buildConfigurations = ( 271287011CC13F3F00E517C7 /* Debug */, 271287021CC13F3F00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271287151CC13FAB00E517C7 /* Build configuration list for PBXNativeTarget "mantohtml" */ = { isa = XCConfigurationList; buildConfigurations = ( 271287161CC13FAB00E517C7 /* Debug */, 271287171CC13FAB00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 271287291CC140BE00E517C7 /* Build configuration list for PBXNativeTarget "genstrings" */ = { isa = XCConfigurationList; buildConfigurations = ( 2712872A1CC140BE00E517C7 /* Debug */, 2712872B1CC140BE00E517C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 273B1EA7226B3E4800428143 /* Build configuration list for PBXNativeTarget "ippevepcl" */ = { isa = XCConfigurationList; buildConfigurations = ( 273B1EA8226B3E4800428143 /* Debug */, 273B1EA9226B3E4800428143 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 273B1EB8226B3E5200428143 /* Build configuration list for PBXNativeTarget "ippeveps" */ = { isa = XCConfigurationList; buildConfigurations = ( 273B1EB9226B3E5200428143 /* Debug */, 273B1EBA226B3E5200428143 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 273BF6C31333B5000022CAAB /* Build configuration list for PBXNativeTarget "testcups" */ = { isa = XCConfigurationList; buildConfigurations = ( 273BF6C41333B5000022CAAB /* Debug */, 273BF6C51333B5000022CAAB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 273BF6DA1333B6270022CAAB /* Build configuration list for PBXAggregateTarget "Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( 273BF6DB1333B6270022CAAB /* Debug */, 273BF6DC1333B6270022CAAB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274770DD2345342B0089BC31 /* Build configuration list for PBXNativeTarget "testthreads" */ = { isa = XCConfigurationList; buildConfigurations = ( 274770DE2345342B0089BC31 /* Debug */, 274770DF2345342B0089BC31 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF5D313332B1F00317ECB /* Debug */, 274FF5D413332B1F00317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF5DF13332D3100317ECB /* Build configuration list for PBXAggregateTarget "All" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF5E013332D3100317ECB /* Debug */, 274FF5E113332D3100317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF5EF133330C800317ECB /* Build configuration list for PBXNativeTarget "libcupsppdc" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF5F0133330C800317ECB /* Debug */, 274FF5F1133330C800317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF62F1333333600317ECB /* Build configuration list for PBXNativeTarget "cups-deviced" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF6301333333600317ECB /* Debug */, 274FF6311333333600317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF6441333358C00317ECB /* Build configuration list for PBXNativeTarget "cups-exec" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF6451333358C00317ECB /* Debug */, 274FF6461333358C00317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF655133339C400317ECB /* Build configuration list for PBXNativeTarget "cups-lpd" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF656133339C400317ECB /* Debug */, 274FF657133339C400317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF67E13333B2F00317ECB /* Build configuration list for PBXNativeTarget "cupsfilter" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF67F13333B2F00317ECB /* Debug */, 274FF68013333B2F00317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 274FF6DD1333B1C400317ECB /* Build configuration list for PBXNativeTarget "libcups_static" */ = { isa = XCConfigurationList; buildConfigurations = ( 274FF6DE1333B1C400317ECB /* Debug */, 274FF6DF1333B1C400317ECB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683621337A9B6000D33D0 /* Build configuration list for PBXNativeTarget "cupsctl" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683631337A9B6000D33D0 /* Debug */, 276683641337A9B6000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683761337AC79000D33D0 /* Build configuration list for PBXNativeTarget "ppdc" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683771337AC79000D33D0 /* Debug */, 276683781337AC79000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683831337AC8C000D33D0 /* Build configuration list for PBXNativeTarget "ppdhtml" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683841337AC8C000D33D0 /* Debug */, 276683851337AC8C000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683901337AC97000D33D0 /* Build configuration list for PBXNativeTarget "ppdi" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683911337AC97000D33D0 /* Debug */, 276683921337AC97000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2766839D1337ACA2000D33D0 /* Build configuration list for PBXNativeTarget "ppdmerge" */ = { isa = XCConfigurationList; buildConfigurations = ( 2766839E1337ACA2000D33D0 /* Debug */, 2766839F1337ACA2000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683AA1337ACAB000D33D0 /* Build configuration list for PBXNativeTarget "ppdpo" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683AB1337ACAB000D33D0 /* Debug */, 276683AC1337ACAB000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 276683F61337F78F000D33D0 /* Build configuration list for PBXNativeTarget "ipptool" */ = { isa = XCConfigurationList; buildConfigurations = ( 276683F71337F78F000D33D0 /* Debug */, 276683F81337F78F000D33D0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2767FC4D19266A0D000F61D3 /* Build configuration list for PBXNativeTarget "testdest" */ = { isa = XCConfigurationList; buildConfigurations = ( 2767FC4E19266A0D000F61D3 /* Debug */, 2767FC4F19266A0D000F61D3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */ = { isa = XCConfigurationList; buildConfigurations = ( 278C58D1136B640300836530 /* Debug */, 278C58D2136B640300836530 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 27A034811A8BDB1300650675 /* Build configuration list for PBXNativeTarget "lpadmin" */ = { isa = XCConfigurationList; buildConfigurations = ( 27A0347F1A8BDB1300650675 /* Debug */, 27A034801A8BDB1300650675 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */ = { isa = XCConfigurationList; buildConfigurations = ( 720DD6C91358FD5F0064AA82 /* Debug */, 720DD6CA1358FD5F0064AA82 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72220EB21333047D00FCA411 /* Build configuration list for PBXNativeTarget "libcups" */ = { isa = XCConfigurationList; buildConfigurations = ( 72220EB01333047D00FCA411 /* Debug */, 72220EB11333047D00FCA411 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72220F6113330A5A00FCA411 /* Build configuration list for PBXNativeTarget "cupsd" */ = { isa = XCConfigurationList; buildConfigurations = ( 72220F6213330A5A00FCA411 /* Debug */, 72220F6313330A5A00FCA411 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72220FAD13330B2300FCA411 /* Build configuration list for PBXNativeTarget "libcupsmime" */ = { isa = XCConfigurationList; buildConfigurations = ( 72220FAE13330B2300FCA411 /* Debug */, 72220FAF13330B2300FCA411 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724379031333E43E009631B9 /* Build configuration list for PBXNativeTarget "ipp" */ = { isa = XCConfigurationList; buildConfigurations = ( 724379041333E43E009631B9 /* Debug */, 724379051333E43E009631B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7243791E1333E532009631B9 /* Build configuration list for PBXNativeTarget "lpd" */ = { isa = XCConfigurationList; buildConfigurations = ( 7243791F1333E532009631B9 /* Debug */, 724379201333E532009631B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724379361333FB85009631B9 /* Build configuration list for PBXNativeTarget "socket" */ = { isa = XCConfigurationList; buildConfigurations = ( 724379371333FB85009631B9 /* Debug */, 724379381333FB85009631B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7243794D1333FEA9009631B9 /* Build configuration list for PBXNativeTarget "dnssd" */ = { isa = XCConfigurationList; buildConfigurations = ( 7243794E1333FEA9009631B9 /* Debug */, 7243794F1333FEA9009631B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724379611333FF1D009631B9 /* Build configuration list for PBXNativeTarget "usb" */ = { isa = XCConfigurationList; buildConfigurations = ( 724379621333FF1D009631B9 /* Debug */, 724379631333FF1D009631B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5321CC0370C0092477B /* Build configuration list for PBXNativeTarget "testadmin" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5331CC0370C0092477B /* Debug */, 724FA5341CC0370C0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5451CC037370092477B /* Build configuration list for PBXNativeTarget "testarray" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5461CC037370092477B /* Debug */, 724FA5471CC037370092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5581CC037500092477B /* Build configuration list for PBXNativeTarget "testcache" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5591CC037500092477B /* Debug */, 724FA55A1CC037500092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA56B1CC037670092477B /* Build configuration list for PBXNativeTarget "testconflicts" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA56C1CC037670092477B /* Debug */, 724FA56D1CC037670092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA57E1CC037810092477B /* Build configuration list for PBXNativeTarget "testfile" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA57F1CC037810092477B /* Debug */, 724FA5801CC037810092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5911CC037980092477B /* Build configuration list for PBXNativeTarget "testi18n" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5921CC037980092477B /* Debug */, 724FA5931CC037980092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5A41CC037AA0092477B /* Build configuration list for PBXNativeTarget "testipp" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5A51CC037AA0092477B /* Debug */, 724FA5A61CC037AA0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5B71CC037C60092477B /* Build configuration list for PBXNativeTarget "testlang" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5B81CC037C60092477B /* Debug */, 724FA5B91CC037C60092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5CA1CC037D90092477B /* Build configuration list for PBXNativeTarget "testlpd" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5CB1CC037D90092477B /* Debug */, 724FA5CC1CC037D90092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5DE1CC037F00092477B /* Build configuration list for PBXNativeTarget "testoptions" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5DF1CC037F00092477B /* Debug */, 724FA5E01CC037F00092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA5F21CC038040092477B /* Build configuration list for PBXNativeTarget "testppd" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA5F31CC038040092477B /* Debug */, 724FA5F41CC038040092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6061CC038190092477B /* Build configuration list for PBXNativeTarget "testpwg" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6071CC038190092477B /* Debug */, 724FA6081CC038190092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA61A1CC0382B0092477B /* Build configuration list for PBXNativeTarget "testraster" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA61B1CC0382B0092477B /* Debug */, 724FA61C1CC0382B0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA62E1CC038410092477B /* Build configuration list for PBXNativeTarget "testsnmp" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA62F1CC038410092477B /* Debug */, 724FA6301CC038410092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6421CC038560092477B /* Build configuration list for PBXNativeTarget "testspeed" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6431CC038560092477B /* Debug */, 724FA6441CC038560092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6561CC0386E0092477B /* Build configuration list for PBXNativeTarget "testsub" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6571CC0386E0092477B /* Debug */, 724FA6581CC0386E0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA66D1CC038A50092477B /* Build configuration list for PBXNativeTarget "test1284" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA66E1CC038A50092477B /* Debug */, 724FA66F1CC038A50092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6801CC038BD0092477B /* Build configuration list for PBXNativeTarget "testbackend" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6811CC038BD0092477B /* Debug */, 724FA6821CC038BD0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6941CC038D90092477B /* Build configuration list for PBXNativeTarget "testsupplies" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6951CC038D90092477B /* Debug */, 724FA6961CC038D90092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6A71CC039200092477B /* Build configuration list for PBXNativeTarget "testcgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6A81CC039200092477B /* Debug */, 724FA6A91CC039200092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6BA1CC0393E0092477B /* Build configuration list for PBXNativeTarget "testhi" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6BB1CC0393E0092477B /* Debug */, 724FA6BC1CC0393E0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6CE1CC0395A0092477B /* Build configuration list for PBXNativeTarget "testtemplate" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6CF1CC0395A0092477B /* Debug */, 724FA6D01CC0395A0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6E71CC039DE0092477B /* Build configuration list for PBXNativeTarget "testnotify" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6E81CC039DE0092477B /* Debug */, 724FA6E91CC039DE0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA6FC1CC03A210092477B /* Build configuration list for PBXNativeTarget "testcatalog" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA6FD1CC03A210092477B /* Debug */, 724FA6FE1CC03A210092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA70C1CC03A490092477B /* Build configuration list for PBXNativeTarget "libcupsimage_static" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA70D1CC03A490092477B /* Debug */, 724FA70E1CC03A490092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA71C1CC03A990092477B /* Build configuration list for PBXNativeTarget "libcupsmime_static" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA71D1CC03A990092477B /* Debug */, 724FA71E1CC03A990092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA73D1CC03AAF0092477B /* Build configuration list for PBXNativeTarget "libcupsppdc_static" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA73E1CC03AAF0092477B /* Debug */, 724FA73F1CC03AAF0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA74C1CC03ACC0092477B /* Build configuration list for PBXNativeTarget "libcupscgi" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA74D1CC03ACC0092477B /* Debug */, 724FA74E1CC03ACC0092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 724FA7681CC03AF60092477B /* Build configuration list for PBXNativeTarget "libcupscgi_static" */ = { isa = XCConfigurationList; buildConfigurations = ( 724FA7691CC03AF60092477B /* Debug */, 724FA76A1CC03AF60092477B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7258EAE9134594C4009286F1 /* Build configuration list for PBXNativeTarget "rastertopwg" */ = { isa = XCConfigurationList; buildConfigurations = ( 7258EAEA134594C4009286F1 /* Debug */, 7258EAEB134594C4009286F1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 726AD6FE135E88F1002C930D /* Build configuration list for PBXNativeTarget "ippeveprinter" */ = { isa = XCConfigurationList; buildConfigurations = ( 726AD6FF135E88F1002C930D /* Debug */, 726AD700135E88F1002C930D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 729181BB201155C1005E7560 /* Build configuration list for PBXNativeTarget "testclient" */ = { isa = XCConfigurationList; buildConfigurations = ( 729181BC201155C1005E7560 /* Debug */, 729181BD201155C1005E7560 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */ = { isa = XCConfigurationList; buildConfigurations = ( 72BF963C1333042100B1EAD7 /* Debug */, 72BF963D1333042100B1EAD7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72CF95EE18A19134000FCAE4 /* Build configuration list for PBXNativeTarget "ippfind" */ = { isa = XCConfigurationList; buildConfigurations = ( 72CF95EF18A19134000FCAE4 /* Debug */, 72CF95F018A19134000FCAE4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */ = { isa = XCConfigurationList; buildConfigurations = ( 72F75A591336F951004BB496 /* Debug */, 72F75A5A1336F951004BB496 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72F75A621336F9A3004BB496 /* Build configuration list for PBXNativeTarget "libcupsimage" */ = { isa = XCConfigurationList; buildConfigurations = ( 72F75A631336F9A3004BB496 /* Debug */, 72F75A641336F9A3004BB496 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 72BF96371333042100B1EAD7 /* Project object */; }
  • {title}

    cups-2.3.1/templates/da/class-confirm.tmpl000664 000765 000024 00000000670 13574721672 020622 0ustar00mikestaff000000 000000

    Slet klassen {printer_name}

    Advarsel: Er du sikker på, at du vil slette klassen {printer_name}?

    cups-2.3.1/templates/da/search.tmpl000664 000765 000024 00000001013 13574721672 017317 0ustar00mikestaff000000 000000
    {WHICH_JOBS?:} {ORDER?:}

    Søg i {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?klasser:{SECTION=jobs?jobs:printere}}}:

    cups-2.3.1/templates/da/option-boolean.tmpl000664 000765 000024 00000000432 13574721672 021003 0ustar00mikestaff000000 000000 {keytext}: {[choices]} cups-2.3.1/templates/da/set-printer-options-header.tmpl000664 000765 000024 00000001506 13574721672 023254 0ustar00mikestaff000000 000000

    Indstil standardtilvalg for {printer_name}

    {HAVE_AUTOCONFIGURE?:}

    {[group_id] {group}     }

    cups-2.3.1/templates/da/job-restart.tmpl000664 000765 000024 00000000171 13574721672 020312 0ustar00mikestaff000000 000000

    Udskriv jobbet {job_id} igen

    Jobbet {job_id} blev genstartet. cups-2.3.1/templates/da/printer-configured.tmpl000664 000765 000024 00000000346 13574721672 021670 0ustar00mikestaff000000 000000

    Indstil standardtilvalg for {printer_name}

    {OP=set-class-options?Klasse :Printer }{printer_name} standardtilvalg blev indstillet. cups-2.3.1/templates/da/class-modified.tmpl000664 000765 000024 00000000205 13574721672 020737 0ustar00mikestaff000000 000000

    Rediger klassen {printer_name}

    Klassen {printer_name} blev ændret. cups-2.3.1/templates/da/help-trailer.tmpl000664 000765 000024 00000000000 13574721672 020435 0ustar00mikestaff000000 000000 cups-2.3.1/templates/da/error-op.tmpl000664 000765 000024 00000000171 13574721672 017623 0ustar00mikestaff000000 000000

    Fejl ved {?title} {?printer_name}

    Fejl:

    Ukendt handling "{op}"!
    cups-2.3.1/templates/da/printers-header.tmpl000664 000765 000024 00000000145 13574721672 021153 0ustar00mikestaff000000 000000

    {total=0?Ingen printere:Viser {#printer_name} af {total} printer{total=1?:e}}.

    cups-2.3.1/templates/da/jobs-header.tmpl000664 000765 000024 00000001370 13574721672 020243 0ustar00mikestaff000000 000000 {?which_jobs=?:} {?which_jobs=completed?:
    } {?which_jobs=all?:
    }

    {?which_jobs=?Jobs oplistet i udskrivningsrækkefølge - tilbageholdte jobs vises først.:{which_jobs=Jobs oplistes i stigende rækkefølge.?:Jobs oplistes i faldende rækkefølge.}}

    cups-2.3.1/templates/da/printer.tmpl000664 000765 000024 00000005035 13574721672 017545 0ustar00mikestaff000000 000000

    {printer_name} ({printer_state=3?Inaktiv:{printer_state=4?Behandler:Sat på pause}}, {printer_is_accepting_jobs=0?Afviser jobs:Accepterer jobs}, {server_is_sharing_printers=0?Ikke:{printer_is_shared=0?Ikke:}} Delt{default_name={printer_name}?, Server Default:})

    Beskrivelse:{printer_info}
    Placering:{printer_location}
    Driver:{printer_make_and_model} ({color_supported=1?farve:gråtone}{sides_supported=one-sided?:, tosidet udskrivning})
    Forbindelse:{device_uri}
    Standarder:job-sheets={job_sheets_default} media={media_default?{media_default}:ukendt} {sides_default?sides={sides_default}:}
    cups-2.3.1/templates/da/error.tmpl000664 000765 000024 00000000176 13574721672 017214 0ustar00mikestaff000000 000000

    Fejl ved {?title} {?printer_name}

    {?message?{message}:Fejl}:

    {error}
    cups-2.3.1/templates/da/job-release.tmpl000664 000765 000024 00000000201 13574721672 020240 0ustar00mikestaff000000 000000

    Frigiv jobbet {job_id}

    Jobbet {job_id} blev frigivet til udskrivning. cups-2.3.1/templates/da/choose-serial.tmpl000664 000765 000024 00000002600 13574721672 020612 0ustar00mikestaff000000 000000

    {op=modify-printer?Rediger {printer_name}:Tilføj printer}

    {printer_name?:}
    Forbindelse: {device_uri}
    Baudhastighed:
    Parity:
    Databit:
    Flowstyring:
    cups-2.3.1/templates/da/printer-deleted.tmpl000664 000765 000024 00000000140 13574721672 021141 0ustar00mikestaff000000 000000

    Slet printeren {printer_name}

    Printeren {printer_name} blev slettet. cups-2.3.1/templates/da/printer-accept.tmpl000664 000765 000024 00000000327 13574721672 021001 0ustar00mikestaff000000 000000

    Accepter jobs på {is_class?klassen:printeren} {printer_name}

    {is_class?Klassen:Printeren} {printer_name} accepterer nu jobs.

    cups-2.3.1/templates/da/norestart.tmpl000664 000765 000024 00000000225 13574721672 020077 0ustar00mikestaff000000 000000

    Skift indstillinger

    Serveren blev ikke genstartet fordi der ikke blev foretaget nogen ændringer i konfigurationen...

    cups-2.3.1/templates/da/printer-modified.tmpl000664 000765 000024 00000000212 13574721672 021313 0ustar00mikestaff000000 000000

    Rediger printeren {printer_name}

    Printeren {printer_name} blev ændret. cups-2.3.1/templates/da/printer-default.tmpl000664 000765 000024 00000000614 13574721672 021165 0ustar00mikestaff000000 000000

    Indstil {is_class?klassen:printeren} {printer_name} som standard

    {is_class?Klassen:Printeren} {printer_name} blev gjort til standardprinteren på serveren.

    Bemærk: Brugerstandarder som blev indstillet via lpoptions-kommandoen tilsidesætter standardindstillingen.
    cups-2.3.1/templates/da/add-printer.tmpl000664 000765 000024 00000003304 13574721672 020270 0ustar00mikestaff000000 000000

    Tilføj printer

    {?current_make!?:} {?current_make_and_model!?:}
    Navn:
    (må indeholde alle tegn der kan udskrives, undtagen "/", "#" og mellemrum)
    Beskrivelse:
    (beskrivelse der kan læses af mennesker, såsom "HP LaserJet med Duplexer")
    Placering:
    (placering der kan læses af mennesker, såsom "Rum 1")
    Forbindelse: {device_uri}
    Deling:
    cups-2.3.1/templates/da/class-deleted.tmpl000664 000765 000024 00000000134 13574721672 020566 0ustar00mikestaff000000 000000

    Slet klassen {printer_name}

    Klassen {printer_name} blev slettet. cups-2.3.1/templates/da/users.tmpl000664 000765 000024 00000002072 13574721672 017221 0ustar00mikestaff000000 000000

    {IS_CLASS?:}

    Tilladte brugere for {printer_name}

    Brugere:
    cups-2.3.1/templates/da/modify-printer.tmpl000664 000765 000024 00000002542 13574721672 021032 0ustar00mikestaff000000 000000

    Rediger {printer_name}

    Beskrivelse:
    (beskrivelse der kan læses af mennesker, såsom "HP LaserJet med Duplexer")
    Placering:
    (placering der kan læses af mennesker, såsom "Rum 1")
    Forbindelse: {device_uri}
    Deling:
    cups-2.3.1/templates/da/classes-header.tmpl000664 000765 000024 00000000143 13574721672 020740 0ustar00mikestaff000000 000000

    {total=0?Ingen klasser:Viser {#printer_name} af {total} klasse{total=1?:r}}.

    cups-2.3.1/templates/da/set-printer-options-trailer.tmpl000664 000765 000024 00000000701 13574721672 023462 0ustar00mikestaff000000 000000
    cups-2.3.1/templates/da/edit-config.tmpl000664 000765 000024 00000001114 13574721672 020244 0ustar00mikestaff000000 000000

    Rediger konfigurationsfil

    cups-2.3.1/templates/da/printer-confirm.tmpl000664 000765 000024 00000000677 13574721672 021207 0ustar00mikestaff000000 000000

    Slet printeren {printer_name}

    Advarsel: Er du sikker på, at du vil slette printeren {printer_name}?

    cups-2.3.1/templates/da/job-hold.tmpl000664 000765 000024 00000000212 13574721672 017550 0ustar00mikestaff000000 000000

    Tilbagehold jobbet {job_id}

    Jobbet {job_id} blev tilbageholdt fra udskrivning. cups-2.3.1/templates/da/class-added.tmpl000664 000765 000024 00000000167 13574721672 020227 0ustar00mikestaff000000 000000

    Tilføj klasse

    Klassen {printer_name} blev tilføjet. cups-2.3.1/templates/da/classes.tmpl000664 000765 000024 00000001011 13574721672 017505 0ustar00mikestaff000000 000000 {#printer_name=0?: {[printer_name] }
    KønavnBeskrivelsePlaceringMedlemmerStatus
    {printer_name}{printer_info}{printer_location}{?member_uris=?Ingen:{member_uris}}{printer_state=3?Inaktiv:{printer_state=4?Behandler:Sat på pause}}{printer_state_message? - "{printer_state_message}":}

    } cups-2.3.1/templates/da/test-page.tmpl000664 000765 000024 00000000243 13574721672 017747 0ustar00mikestaff000000 000000

    Udskriv testside på {printer_name}

    Testside sendt - job-ID'et er {printer_name}-{job_id}.

    cups-2.3.1/templates/da/printer-jobs-header.tmpl000664 000765 000024 00000000034 13574721672 021720 0ustar00mikestaff000000 000000

    Jobs

    cups-2.3.1/templates/da/job-moved.tmpl000664 000765 000024 00000000352 13574721672 017741 0ustar00mikestaff000000 000000

    {job_id?Flyt jobbet {job_id}:Flyt alle jobs}

    {job_id?Jobbet {job_id}:Alle jobs} flyttet til {job_printer_name}.

    cups-2.3.1/templates/da/add-class.tmpl000664 000765 000024 00000002124 13574721672 017711 0ustar00mikestaff000000 000000

    Tilføj klasse

    Navn:
    (må indeholde alle tegn der kan udskrives, undtagen "/", "#" og mellemrum)
    Beskrivelse:
    (beskrivelse der kan læses af mennesker, såsom "HP LaserJet med Duplexer")
    Placering:
    (placering der kan læses af mennesker, såsom "Rum 1")
    Medlemmer:
    cups-2.3.1/cgi-bin/testtemplate.c000664 000765 000024 00000003017 13574721672 016767 0ustar00mikestaff000000 000000 /* * CGI template test program for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi.h" /* * 'main()' - Test the template code. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ char *value; /* Value in name=value */ FILE *out; /* Where to send output */ /* * Don't buffer stdout or stderr so that the mixed output is sane... */ setbuf(stdout, NULL); setbuf(stderr, NULL); /* * Loop through the command-line, assigning variables for any args with * "name=value"... */ out = stdout; for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "-o")) { i ++; if (i < argc) { out = fopen(argv[i], "w"); if (!out) { perror(argv[i]); return (1); } } } else if (!strcmp(argv[i], "-e")) { i ++; if (i < argc) { if (!freopen(argv[i], "w", stderr)) { perror(argv[i]); return (1); } } } else if (!strcmp(argv[i], "-q")) freopen("/dev/null", "w", stderr); else if ((value = strchr(argv[i], '=')) != NULL) { *value++ = '\0'; cgiSetVariable(argv[i], value); } else cgiCopyTemplateFile(out, argv[i]); } /* * Return with no errors... */ return (0); } cups-2.3.1/cgi-bin/multipart.dat000664 000765 000024 00000142353 13574721672 016632 0ustar00mikestaff000000 000000 -----------------------------1977426492562745908748943111 Content-Disposition: form-data; name="MAX_FILE_SIZE" 10485760 -----------------------------1977426492562745908748943111 Content-Disposition: form-data; name="filenamefield"; filename="overview.pdf" Content-Type: application/pdf %PDF-1.2 % 1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>endobj 4 0 obj<>endobj 5 0 obj<>endobj 6 0 obj<>endobj 7 0 obj<>endobj 8 0 obj<>endobj 9 0 obj<]/Interpolate true/Filter/FlateDecode/Width 941/Height 341/BitsPerComponent 4/Length 5709 >>stream xOhYlUю l$30ѲfCj/1 sQ06 ;ILg9F_}XKCmuE B_’~c^ϲ>z~,[N l̰?%oq~ϿC)tǭ/ub֍~y؛ros{x8Y*i]~CVX?iuy?UtowtG5_~T*ɦAx`(v\G`1f^w* VkY/wES' vv~/t5XmdySRDW&zY;ŒY_wyʰ>td]FDU?^*KyJk`YEe!b/X}'2][&+cX=ow٤?ߍ55tJ]O)éۤdYO]%~O":&Y.Xu7;/::3y&w =@D[TLuJ٣K $~Svuo5PXX?=;+}|N7z#Yo)cʓzYEnwSRO^԰g_77dY:tc͝fI/6|!<YK28kqYĺxpGtǽBGV]c獄4aeg",ZZ1VǺ5ìj5 Vx\,*MW|z[ ~zͯ@Ygg}kyYÑpɰ8>udԔq  VpYF'g'2oYhKϚtK孷vIYXR'JX9]W&u/Ǭʔiֵ,6]"rw=ֳ?nd%DQOI㌳WX&kzI5!XmbVXw1Evo"V{rXmb݉=ZZ)q@Vvn8Z~FVZUh'BVj't\vtK}7XdT6gf$V+YeP;BwŲ.w%'5W(]OgKYZ_ .Ռ/<;j5% 8Hl㿡tomnM94μ`+X V`+X V`+X V`+X lF_ ש|TES>Պ*-ζWG#fUCX_]峖U{o\?j0r&ئW{wzg=p;y>İr8'kOָ&V/!So.:aN*Y,kW]Ҭ. ӺTSʽqic%ʏь!&|Q#K=kX9?Xj"afU5fuǔ#^[9k Y+~$d0Xfåu?o J`M#+dO,LkWXwVj9MkelM~h9Ymיq%ߟyăV_oD+Y%+Sc%^9RYꊦZ g7yy`0܀S>+Ԛ]'bu)Zwy2XG^VƓzaVfxu>b/kfUph kcDLXSDÝpNܯWV<2gmd:BxCY25}&G<`n+g[eyʼf4vzy`V p5 !hVIw`Pӕ'̕DVN[+ l`5ro\N3gaޚ7Q^QU4{Ǯch(3nTjS4UG"ޱA\?07k]f71zkHIm/GMNSeTdXM2wM'|Z&LѡnxWbYy-Yq\kV9fU7-K[cOkJuʫ gW0? 8`+X V`+X Vu٬a&YS|u[lY]T`/Vr!~m|G[AmZ 7&]way?Ųuc ׃,G4qpV~༧~)Z?ͥA*Ioh%uLo?KW`Z^5Bjm:0Jk:X#&7)m4q V[(CFJ[-M\_5RjizHiV+j^%T]`̓u´SALMcq*QL 6?y2ָY{2c*QJĥs#>cC&*tvwd-n-k~tczXJp >t]G2uU,dFSwB9q}Z䆻^w'*6X?'fջ/!9ֲp.kJ_J?k@ vҌ]Wխ!Sq5Z+X]TϧY2V܈]j־[VUWj&&*ZW݈3kA;jpQ DsׄWŽa]H?AUѬ_rqϕcV~rD&EI'uµ~-%"^ɷSycKwn;*$+{杦a29*vȍUsSX;ԛgIE{oɗKkqƑTec9yʕ}sxt8~VQ/$pإ+J'Ty?#9j_xJ;vE[Ulݢa5OLDﳶqhuTEW`lԟ<|ŪvsΎt;& o$k|VO]$N5/z^4 y6αf >>U!Va2'0N__#sKq*n1DHpU#C8KX2b> Pa=A)>P-2_pԫ;\ɪǭi)GL[hYbQ)FTVUlWG*dRO M *.f-C&yGWU^RMbZ AS!T:Ց%*߬EWX>@[M<%>]1c?fl{ѰLEY^[OY9򟌅5a\vuMxT$ .UcwJIVy1-ࠗEZG2aK [gXzNI{$XeROE2Ͳ `MUxpNT#Ԅ_\5;h6>0dWAЈG $k5/WNU~5Bс5cKSZOF\i pX V`+X b=ĥ,G..V\xvkx?$Y7OЉ&޾:27k?[`+X V`+X V`+X V`+X V`+X VdS#˫$77I~u<\8gRM98K=緎gvt V`+X V`+Xd=':<ބPal{zcb5ŅUiTJغqASfySd<73̬uuYư̌>g`~P=k/5֎ͬFS{vyV5ɧ?lUzn6|ewt÷xU~ՙ69Oz[ zrkͲq!VHɹs ROF2Zҁp ^23QOFw EjbrBۤ0z2Xu rӣ %p !rfm;Jϣ-'ɯ'kvF;N[IvN:4zSs-6R^rOb(.YRNMͳ5m7bbG-VNzbʹq#zj6ǚ[L}- ʎ|ewX[~cI\ؑ1S9C[oxؓ]l`x-y=V K>z㈄^ꄹU+Il;Κje+ə*ҡkXeXXlfWҰ|~uU cA^7qLPnq!6ĪFFXԬN78fY[xXlaqjg#efA%Dϔ#&zTѬř4.хLSk5]IdI <2dtPGѬI7fUo z3w\ZCl? }6Y眻Q5&kiF6XeMܬN\z3wlR#K` [zcKo#VK5Pm,Lz)LW$|HTr^&|CH8UMxX ;t9& V"z%eWmY,gO,.iUkY-; qv(>X V`+X V`+X Va/e9?kz/ey(X3~YӼe Hendstream endobj 10 0 obj<]/Interpolate true/Filter/FlateDecode/Width 431/Height 511/BitsPerComponent 4/Length 5955 >>stream x_{,՘sgsnyv͹*o (}s=B-oL7Sӹ|ڹHt}\IYmc,ϯZP7?kz{I%בs+^y>EK!;fĽWGս$^J[Np2Y^#r CK$KsqHB*Y$ׯ$XIOqyAO`7G($F0RcvYX`,QK_<`XIr+rsl>9%o@jEʏ\] A!~giA + suɢX 9``,D.ء-]IrqC zznZ2L.pҩ9C3X<71d) *7+H=pI{$\lSyӹ`),+rLs-EPc5\ qu^<$praoZZ'Cog,8Ç'Hk\x.of.Xtr]_!J*%\ɰrUK9d(gX.n"a8+hu =q\h!M:RWGf( ÅWü^ppqE3W̖U";عH4ԟ5\ˬ\UdÅalOzgqɴ.&Elvn& Or!U> eE$WQdHT).ό .ss$ʟfBf+5!ff6FG ZmEF2R%bU ߘZZhzOc=ܞirG|ǀDP\;#Pn5Jt\#cd8 ^9+1s^>,іu@r\|kY빀輦r# d>sD5͕Z!(3Fpxr}- 1J_:j e"XQJC+sm\#*(+@^k++1sQ1QrWA4C+uW-;m4\jVu3TTRʕN\HAW\{m-8;^9\S\HQV%Ξ*;p݆\=$vfx:!6 &0s?i#Ѱ|UiĽG! ]!:4D.\Wn/Bff~/Y3G~juk[x>BbI}K{p%1WSQ*!rxhS=4\޴E๎,ĦslU* K^"q,N=ͺXR32*6(uN!sUa7R-&?{-quR54} )agN|گVUr(*zE%\0bQcja\WWŎ:èʯ&7ፋ5.d~9rBE rѼ~[I2/y>~<*~u>mmkdd[> 6YkvKI?\%} 3õru3t1p%ZRߴ۫)7uj*(a69\?F\W5 q1קhOs4Aϕ긆P\;w9?f68$DVu,kuEj;`[/'~yu>׸Qu E{έu>׸QuD(-Gi!ƍ\'Jo=A\Fv.yr·52r50J+u:kHDשw\]]pF1쪎xmװWuMkCP\FF#I?|(a##בz3l8·6*iwWZPU:kЈϕ!҃ۛ_m{]\q b+\.)P7|8AQ`Nu\4]6KmtFDՍ+ Nq\;rXWgAeIR5éR\D`.aš·R kOrKi$yWR+o\C@.:KmTi?e*Ҩy*?6yj9\J#!.J\å6*_WK·R5h .28\j#ueN.V.F.FU&VSʋf ]aVx%\kɁAo.U~s}skEur\\\\\877Wxĝc僾WJ,׿;WLw)uz^_S_6$aNSW?J4s*Gj|<5:W4˼a_̍*+A}aDI}asGV\[Zo 225p2A 2rRpuOOr]յzm]W|t~P(~I*I#B[Ն䪤ûH.|nzӄ*%Y@̆4~|1`\ Wa*L83N)&Rw\;S0k$x2č2uI\MΖ^㺝u>%S΍uI\~M`\}?/6r;/mW8.)d}.ݸz{q.xvˎ\S簕8u)\"};t,(\Yi=QuuKzіJ9S] 1"(Jl:Yuu5_5 .lo/EMcX^rxGo7PꄪK:[S2㤙K:[v¾[.Ŷsq=\c$K>U2R>L0AT NS] ׇd1:rոC T] y`\b[$. aS˽RrRR͚̝0됍k.}8`\< :;U=V\.m?Ck%W޶%SAqi^,NեpI UMՆ\uI\%^v7Qu5QUsmq6뒸opufqu(Oe^̏~\ez?_.X}4FƃN=Bzy=Kb}se:[z\ *\\s9-,W͵]%We_m(WN ͵ 9 (WD5[^sFH5~ lRW;~/RBq 8l{oc 8J}!8¦-HP\CX-# 8Z꾏`3X `5:|`%:VZ`Atcs`Pj(}leP 2; (lvG}##s`]'q =stQ }-lTB"p "H\ըBtCЗT)/KHF v5rxb1 " pc>Y2WADh$BPhW"[ ! zG"GZ=cDRV!%@|\V!ʅغIW!W(p*E!pH/ 1G#A`3۪!B# )zF\ &.(C"w'  I±?~dKO#z@Oe'>rsXxb'H*pH8( N0!y5  .Aj\P;$H/i6]NKJ׀ uj.f["mzEjr,d!64C g!C<Ҟ7ЭxCKe !>nl$N9, pLW%U͠gM,[5fvaynkgVAZܞ;(38#3-À7Ig#c(w +4oX:ۀzEp!~+Xjc X L/A)㸎XCõAr (A8N8eB *z7C p|j=\xC (@jik 6%MfhҖ9IΆHK' Γ6wF[~g gm9Z 8 SL>ߋ#|pOjHS;(D('1r`<Tycp>7N:awA wUDz# ɝ2K`?gR`MAƚ<:x\}~9̉հu?ظ$u^Y[_:Vq%~yFYc'.;ϳW91,;ˀ]w;G.2Lkqoq\]<=m)Ιǀy/G kM.W|v݀ٷp\bmÅ"QzH䏫]pX;4Eõ}rE <(֢4.AB:.+qE`C█:qu+B*/ȵ%Rr_\Kzgk4GZl^\ M1bbk)Flߐe>^3X>< 󩏍e𧯾Vߨ^/Cz5"u{I.._\矾" Gyeǧ||0˨Y iCr]I?N!?74u7/O߿Y(?endstream endobj 11 0 obj<
    >endobj 12 0 obj<>endobj 13 0 obj<
    >endobj 14 0 obj<>endobj 15 0 obj[12 0 R 14 0 R]endobj 16 0 obj<>endobj 17 0 obj<>endobj 18 0 obj<>endobj 19 0 obj<>endobj 20 0 obj<>endobj 21 0 obj<>endobj 22 0 obj<>endobj 23 0 obj<>endobj 24 0 obj<>endobj 25 0 obj<>endobj 26 0 obj<>endobj 27 0 obj<>endobj 28 0 obj<>endobj 29 0 obj[16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R]endobj 30 0 obj<>endobj 31 0 obj<>endobj 32 0 obj<>endobj 33 0 obj<>endobj 34 0 obj<>endobj 35 0 obj<>endobj 36 0 obj<>endobj 37 0 obj<>endobj 38 0 obj<>endobj 39 0 obj<>endobj 40 0 obj[31 0 R 33 0 R 35 0 R 37 0 R 39 0 R]endobj 41 0 obj<>endobj 42 0 obj<>endobj 43 0 obj<>endobj 44 0 obj<>endobj 45 0 obj<>endobj 46 0 obj<>endobj 47 0 obj<>endobj 48 0 obj<>endobj 49 0 obj<>endobj 50 0 obj<>endobj 51 0 obj<>endobj 52 0 obj<>endobj 53 0 obj[42 0 R 44 0 R 46 0 R 48 0 R 50 0 R 52 0 R]endobj 54 0 obj<>endobj 55 0 obj<>endobj 56 0 obj<>endobj 57 0 obj<>endobj 58 0 obj<>endobj 59 0 obj<>endobj 60 0 obj<>endobj 61 0 obj<>endobj 62 0 obj<>endobj 63 0 obj<>endobj 64 0 obj<>endobj 65 0 obj<>endobj 66 0 obj<>endobj 67 0 obj<>endobj 68 0 obj<>endobj 69 0 obj<>endobj 70 0 obj<>endobj 71 0 obj<>endobj 72 0 obj<>/XObject<>>>/Annots 15 0 R>>endobj 73 0 obj<>stream xڍ[s%+*0Ѣ~yEaHDMnuf4VOA&ĮqE~\@P(ﯺ 5K ss7pOjk^1XFB|Xm-Qm5kLXMmޅ0P 74-}x6}>5^x\5albo6d[Q~1FVQ[[~`wZxtR`Q9K8d^-pjӸm&y_m3n+0jS')Nja/0aaĨqр*jʏ̮Y!M,qU Ֆm 6ĎϵzӾ-HU6kcMU` 5AfE-cZ薶 SB6ѣQU?'hOZyZPHQxKɅڲqTuu5~=M [9zsű K MqF׵~H_`yޠT mMTX-)VQjO:]8PF*jC{=\剔BƠszL 2MՖնi ̯u㌅0ɩkj$W5|qMmYFm\D_p 櫅%[@-cu_-4Cj;ntGwj}lܴ4jẅ1zf m Ũ6A`MM0FFs}B>׭VxjC|I#Ksj0FM0)UsI'u5ŰZhrc5 ,Obzx;5ѼPnݩܺ'&j1^Bӊ_0 nڰřIWg ,J(c}TҔ{1nAfnm ̿RaK zd MԆeZ(V۴t]Q˘6lc0FVQ~@-cXmk+jjKRֹ*jy6ƭenXm#`%]6qHme16'raTԆ6@m/wmîͨeWӢ&Z]PUԶn[֡ J`Z4zC5^zU`kJU-cѬjsM9y+q)0JUS5Uh~|ʕ魷6R`~5c_e X`5 2MyXh*um@-c- a2e _zjƓxj}\;ZSXneWk5Z*j0>OFk+ƺ`5;5Tȭ nW:N<}{.PViEy]M8e@M0ׅ9yq^ڲjm<\1F+ qYشZW-i;m6k T/4s6Mv|(4<\W*jj+ְp)K3 0bR_2\t6$Be=T &OEꮊix<.dl D,{j&Ḧ́7c`8H1WCM͘llj&Ḧ́7c`8Ḧ́^~r[L޹7c~xoj&Ḧ́7c4Mg4q^f»~xӇ~Rfohڪ /R3X%Ûy91K0l*T ƅP,fʘo,f̢Ic6-an@0c,\jXŌYPc`,2V1 Y<7Q7+cf-h\0&fBʱfaLR 15K0lT3fcf%̽RcŒYSfB1 bj`,2V1 ƾ_.0+aYyO91 a.ԘԌYH͘0YX~i⾨2X?j` ( =E1! G>cC<`f[b`c.`%Gu3֣!֣BF\ӌUs'K%MvK*U W1^`x1foqS_ &л*V /X\ o*X%sR*fK# ›03 ˆܩqj›Jx3V \/Lx8=s70͘^p&7cf^9MsWɡϊ eKPތU›JxpxP+ . 榥bk.T+`8߉aU1^d8]ͬ)N;ܺY1:ܫѹG0y`6SlsY >sY~\.O [By; 0>*GcQznzTIJ̻t0V3/qMZլ [Ԍ3֣B'*01֣BSQ"\7c`^'>OvΓ۸\0a둚azT>cQznzT7~Qܗj9~dZt!u3V^1h=TS!B'(0k/cLupzUs81c0'f`zfGjXzTbj=ՍۗjKMk9zzu Y/k=|TbpNjGNUJG!֣ynz7c=䈜`x|>a5 GQjc*X 5CLGu#\q݌(nWZ7cO4 Y/^0l=*X 5gb=*X1XfGq3֣P>cs Oaj=,T#A U4Cf$C`r5VX~ 5Dv_H s_DʘHR0wݠ&DBDBI$i"D&*$4 $HL"z )aNP&2'RH1o*$DBNtRU3L"!5HDB9wX$TDK$>StL"-z| 1Z˻gH*" fiBM@L3b! X%Cv}VܣLd;dH*"!f2 Aj&C  ڰ"ΐ mW>1"{d`8C2$7PM3i@5IB$Cf`nAsI I$!d`8Cf2b!n&C  51i X%Cƭ`N5c AɐU2D07C ɪf2 f*TN6j&CfR3J|݇ X%C0! Au31Ti@L3dH*`6c4]>V1I-,$`n" m B5HH$R31M$TӀL"A5M$f)c06^<C(qHC1I  MD…J"UH,'!2dHF[";MvP=|J $*tZ|DBj&I$i"Bf i" iDJ-`ގmHX$I$T(m>NU5HH$R31M$T>L"A5M$Iyx"Z" I0l DBu3 50HDBu31M$TI$i"AL ;$aduH %`8ÉL"DBNܥR3L"!5HDBnX$TDB.h"um(HW0I$D 㕥1M$X&40&릉1I$X&$0W 'R?]p|`D&`8I$DʘJ3d*d4CP݌nzк\7!tZ@L3D0!HdLd?V2d*d4CPL  6nCyBexʨF18Q jT7!dTi Au:pL d:ij*Z3D0!Hdɐ'7I A fT7!O~0&};LwU2D1! j!n!IiB5C0&j{@3 IXŁ`!֓c5!n&CD gTi Auqca y Cv2R`pkz_@5!n&CT7!P! Au3&H5pP*! lDcr jk|xR0 Uᮚejlc|ZpF^,AK0jF`S K=R/0mDž ŵ5ʲ˃:.Ŧ.p{vTk!22sw̽wܩ0:r)1hٕlT T5]ۭI *% D1`@OF3>HO1Ӏd̟N߆8߫{D0tB.V֭*?H:wL04X% wj& m4 n>n0T1>D0W!59'c&n9 ~D+A#10U▱JD͍[:`n&p7d w]L~e̟i  MiT͋Vb0nӸI@*qxt*`۱|wf 4LxE W07S(LK4 ov&=-7aLÛJxE WqUpxf›V /= fڢo&68c^pxU * #v[V 0r›Zx!͘SWpxQ&"̄7oD" _ބ 1 o*5^T,V4Z > (~x ϻ7aBLÛ1 Be%)0A+j89n~N>}MX-f^QE cl姯"n~X% c&U5^X| j^i7M 57aBL+w츆W0^T /*Ԅa&9n~MX- +/*T> ÅtT g-{^ix Ë 7 /Lxs]VV&^ix j+zc˶vZ%01 櫥C~'w6q*\e-4j㺉Z|e7hǨjkƝRht1b2jY%nQQ˘[7U Ղ3CuK~[yjcfPZ(vE٫u[T0-lXGK]MZ{%0eةP`ZpB3-7(,r6nc_`5n5/jwdy)\Q 6BXE߰nZvj3p捑h>~j[q;T2m4[&jk]uwjnj%HgBoDw/2wqڭ~6KXEmlf/6 {5zQ`bln0ZSkh'k^N;o=a\5m@ϛjBZm:QY-ی*h*|樖g*MQV^dӜ~-ډbjüF,tt6s |6tKsNpGh7ay~Ш 3ǙL{Vj4qRoک qE`!Q(L[ƨ?h&(S24m:v^J-0/. #}5.%y;06N{5z*0/-y)nTGZ j˰\`^"Ϣ6p:;jt`1¶SWoy7}T 0l/hT`^"_Qmxp Ѩa4 WdG&?2-|Y<=z2&6:=QmGS9ƍoc ,}?BoW|h 0^a?y6Ӹ^-&4W[槯lnoNl/W]3n EۯnkB`ЄMh\y{<4sso]7_ѹ_Uhw?>>4o//oO/.IwwczP~ !5Ԣ'7zymMӇ*:T?|>|:i~Sח!F=>}y{!7o/͏uH+zAu7ґ%$Kܞ^nޝ^(` Mp2| tm΄auίo~mNr;=\=>U$4 2%:[Ϳއ{--ԕ$]w f9\>>O/|_԰|~l/෧O_?=eDXC.7weG}=5y?޲D(sռ}OŅ'k.|T?~ 7MSAOrz%?\rJ)s}{~ GwO)BxDw!ɞ|n^<9+_%`C=O?MC0!O?M!<&϶??ql~rM? zst>nzQya:/k]/kPXH2e5x}|9.^,ӛO:ߟ] {|k_~?޽~z|{y\ċpw|>$E0MC~r?/j=]UڽǛ{J̩X\2sWw27KhFE'Re~u?FJa{:F9(Xȍ#>_nkC_|Mr߅]~{53Uw/o ͯi?11 ?Oȷ6{cURok.ΨnGJ>=?Bmix㫽9\5!tWmtsszz;Cb])Dz.5fgO}|  &d˻S[|ygW!)!ߤ;0:O2iD./<^%ۗ~u~zʎh䟟O'+mBPimpz·0 7lүt9tgYp<JԤQjߞ~FwהAW- ܐoBʮN{E](W^#BK'H<^ͧ xK*$>/XObject<>>>>>endobj 75 0 obj<>stream xڥݓ6W򔩲e$Hbߒɤ6[C^dVz$ٿ~q MswgzC@|:Wڶӯosͦכn\+/ݐڶ#ChK6SKjj~AM0]mhPLUsnh V0]{CLW|0[T ]o(j} V0]-MoPLUkʭ`wFʭ`Zjo(jm V0] ʭ`oPn V0]-^S V0Uw~Zt;CLW.S:iZtur+7]*uu1 jƹT c4j5_wA-c@m`P˘gN! iQM۱k !SQMa !SQMPSƐi.=a@Stәn/1d*j)3SƐu-SiQM#ULCN3LEM5mǦEM7m]oӌ!SQM{W4cTt !SQSM[zCf 5ݴN3LEmթ/a.v3)cT#)i +V>ꦃLѠa3ڠaE7]h|Mfjc bELkCLmebPӰTllΠa35Tl6coPӰ6VSZ7xCLmGCXQ u b3wrSZߍrSZ蜡TLԚ4Z tl!4lF=v5zvﰚkP0y$hM\0@WRO\!SQSMf4EM7cLC_/25Ք2 0-ji!SQMo LEM5hf 5ݴ z}4cTt!SQSM=]iƀiQM3C72LEM5if 5ݴ mm0e nڏN3LEM7 C0iƐ`ӌӢ7iƐ馣:25tt1iƀiQM4cTtPcӌ!SQSMiŦEM7moӌ!SQM{7sP_> j-MiZM0e jMz4m0e n72LEM7q)cTTS⾳`g0e n/:25458l1`ZtӮu:25t=2)cTTS23iƀiQM+LCaK0d*j c\!SQSM=mcӌӢvaK0d*jKK[GT10яA1{è`H-Pjt2[Ɛo D!1hZ4* :-cHm 0@jCjb(!5?Ce aC0]-NqG@0F j!79A1vQMt01Bk {/1PnCj4dPc .VR'hPc ѽ͠RW֠PK2M멙,66cmPLUצCdjcPLWO#ѱF<BfjC5iLo !tlZ)7ϷnVՆuLWƺ jj#XW={TܲA-c@-͝A-c@- moPآZ?i;43eZ;N+\3f]SelYm짻-Lx_uj>-jjv՚iM\7-E3elY- :i%Tnm˓͖j40lPP)jnHJYUآPִv{a4c4c˦.}I:v@fTeѧ[:F0[70آiHi8~Ts6Kn3ӌ-:ݔnR-k׮ lZO}ݝ_7elt6(0ި|F/޻uSƐiƖM.-x`W`Mc0f[6j>]h0thWM3L[4WKuJbݺ)c+}ĖkC7eki@tݔ1dev nZyv St1lٔڦ]znزiQlq}lj"in2L3<.@ ].V_7e fltһ3h.sZDVGavlGYL hʿM'CĔ1d*آoxJ王…1e h<鶐Ͱz3L7\n/>c?M>#4^)cTf!S)cT3l]}-0U+ԥc#3StSZMLuSƐ`HSWM3L 08Ҍ!StSUj:m噙 Ҥưfڌ_`S5iƐ)M12LC32LCF`2e ҫ;Cf f Ҁ1d2`ӌ!SƀiæCm:2e RG`2e ҳ1d0M3L3LD !SƐا5d2e > :02PC!ӡs:2e goӌӌ!Sm0e 2L `2e 7 SƐ)cN4c4c׼n2e 3iƐ)ciש``Ȕ&fLC!xSƐ)cȔL42Li[4l1`1dE1d2]r !Sƀ)mG2bӌӌ!n"SƐ)ct SƐ :MiƀiƐiZCf 2Li<`2e 6iƐikC)4c4cȔALC!a1d0MyiƀiƐi1d21d2 0L'2e iw&WwCMkMuє1d2>O2횯g!SƀizCխ+W$:63pSƐӱa:Bz'\V05Ͳ ll4leЯdc eLϦal{C6P6lV71`j6eIll4l-^ -c(`z6 lt6+9`zeӱY6Zm&MfN-Cӳi,}q!c(`z6 +h {C{V05ͲnC6P6l6F CӳiXɖ62Lͦbl][P6l6O(c(`z6 e CӳiXFoo<Ζ1`j6e ll4lm!뒍1M0=liu:Ζ1`j6e`hoCӳi,$1 gӰv2MF G fjz6Zd&jz6Z\a&jz(c%c(c(҄K-c [@gNy#P11:=lllfױ1-c [QӳMCDM֏e ec e5=M11 -c [@gb%5Mz6P6Qӳg&jj຀T25=mlc&jz!c(c(iNl gL6SӳM1111-8C6P6P6QS2e d+jz6ڠem,c(c(نCCDM[bum%[@lEMH&jz6o&jz;#=cij3}w[[XZ2|7j꿐vJ][;Sc̏M!R5!5B9͎qs̏5{kEȺT}^։:c+jOoqje==wV[Qs}35}Un}{؊vL1>7oL#K>u鋞ndlY-oA3fmc+j}JH!nk!c+jJHsF׶@1wqIoWwq1Ѥ F435Vx/-^:E-cjy;FK׶1w4Jh4SclE7eJӬmT2J_VWo ﯾ{ǮǡOx]}8?_Wo\v8Zm\.Oq_]o/w?W~__՛tiõzFݻn$R%B?}ܞvvުۘ~Ǐ>_׵+>_Z}>>u%Y>ǨR=Ii{}}Ln1eeŃ?^Thjz~}^Ls>n=_S!1ToƩj޴1X*ÇSO˧:| }xbv8}"y2Oj{[bi^bT>pGGpM%"/hŸS+y<(|;ڝcOȧ}V_ܞp{RWH7Տx+W]??_SkmΗ&ΨtR%ijlC7oO "oB>fᰥ6&P@gVu:EWt;{3l軗賿~&Q:q{kC_OSui?ɟO1/ewrxU(U4<~w~??ncPtB?=_zx B8j]=mwԾW?.;5E[v.˙v_)yS Vt%gY/kp,M)rEE]m!SvSxr|?=/P!56ooCͮocߦfv¨dy~8ImSmog[^l!TvLwtN*S<_Gۋ6D.$o;7n_Csk(wB;6*&HMVy3Uh]Yxnݫ_U5endstream endobj 76 0 obj<>/XObject<<>>>>>>endobj 77 0 obj<>stream xڍWMS9+8*<-!@dC.Fi\4P[\ƣxu4! /WGgG/a4O.W0+aX C[~0m/ ,P%,Mݬotٷzwofů wd tڼW‚7P /l%F !'98BN+COĚ4~Z.TA:|Bү@D*b.V3/h~}YZ. u8||n?Tǁ-a^TlDWlfGD̩RygO*5āoࡇASH 6΋ J A:]#N^RQ;s(EYCke-oMf: p7VMϤvՂ˅[sD,hNE&DP*q(D7 ޷D_'s[L ^%4252QbZցȍmW xJ$vXbr?7mHښWI $Iu#Ï'0F =F<7;n> "J ªJvob9tۏS'OE,/Ϝua^jOŎЛ}n9|6U5<1Y`/K8?Eph6ϭYG*a{&,IJES21-;|*WjqM$BycVV\ 䛏I\84Ce(I%4N FW@=&'z7c70F7I*68K)]m}WC5GKtM3'IsZ:As * yu>3;;JM}rzA*s^wfe؇{c=(/k@٠58|02FiESfN#WnHhd)~XK֟OCL4~JjPpYvl>X\H0'ha84IrwFqX"퐩V3K"IqSʫ]^Ԝ!L%Jpf%@lRTQ-q7۱0j]f* F8U?L.9x1?ARn8$f7Do.˖oDLLBnc]o]g0Gqqq=*/4|b݈mҴxTIdm8\ kxXYC:87w~a7hendstream endobj 78 0 obj<>/XObject<<>>>>/Annots 29 0 R>>endobj 79 0 obj<>stream xڅWMs6Wlug$VdYMN2MV_ vHcI&r_o.W1'Ɍ&(K\MfшƳqtCΣy-䴮uE4nv:/#EG k)4a8F g:uD`8Z a+C;e5Z6^^U_ G.cI.zP):h? nqBgI$਽d \%w1;.8?lio Zp١Wڂ46|݇|5/=8Hn{?^Ɨ|[Z7T}a|dO8Ͼ@y9]?j de; TY#(^Wꐁϭ,Ew ȓvK[268ϊ/cޝKv2r Gx'nk"Ưc}}A-|oy d*j/Nbԅ_Wn@endstream endobj 80 0 obj<>/XObject<<>>>>>>endobj 81 0 obj<>stream xڕVMo8W |tv:1 ZzarEf#*I}CJm-r!3o{3'coLjByyr8yywA1-Vx3^B(FOskVz];E&(I(lIչ"- zs5ʺIl.IJPg$D q<ޯraC Ջŗ ǯs8.7<9ׅ!6kB.\hvK2d{}Pe֤ݛB?)뼗GZ`16w7Y'= tjNu <"hWTk,Om~еO-B# uA ?;fؠtn`; 4I2O*?mvHl$`ݞ }-$Ta(mz8_:cR"[R<Dbfa|gz|ǘQ]A:b L +up}p/ba~Z δSmp:i/$B éGlTƉ%@fT􏞗N` 9 ^3sfn?$ӈq#@.PD #Uƙ8;3*Nc&wPWg~cB&G0k}TaKƍ(5 ĺhq y?ÒvG>/XObject<<>>>>>>endobj 83 0 obj<>stream xڕVr6+dH,uƝ4QGrE6 JA!@+\ԃvtEqιv4t6託6&@NQ}*C79}~brUˌ:.c2aH)0PC+E憧dɮhcDž;irMPԬ)`؄Tb`x#%ɋ8l[r:&UV:`=CdQ9J/Ϡ6ZTW75(4lK?#-Z.ۮPA(o ]|ٲBTi7eWpKUē]2q́0j%cxҡoc> +y9-_;qn+c K)ƂXto0$ FHZ?Acʹ3Of\1](r yKRV|eƪX2eY>e;?r"FG[3ݦ<,@Oc@^1Z콕>K0Ml6T.2@6NRI > @`|u&9h roS[wrmN mX0,z"_8[ъm?]Uu Ea<]-fKe0 A-~#N%J6pR 8{~ӄlx+ ePl,x*醕 gwBm/OCTnWL ֛|pE't8QI Kح-b[ W"N >h]Hyr@ :e(0,$4"b*8]Rjl#y}TGtgB:ۂ/>07UP4%R[قd7z]i 6bVL!8e20{}ibfM8[Bkc2;?/i ͻ;Cpn9ȗdʫI[*me &(eV"{ 'F8]R=H½cqMe^km^IdPh\ިB^Sȓ.QYtCCvX\R2ETǷ#&.0lY5Ey<&Wc\'Q'.sC2z]CL9h?oƿ/:Kv'endstream endobj 84 0 obj<>/XObject<<>>>>/Annots 40 0 R>>endobj 85 0 obj<>stream xڥVMs8+cccLNK2d75_@fsE"hbK^IG2;*b#u{OӉ(_D>)U' B|G'N~dTQ%`VҬ] vX A"GDo$Em_-^;KfCܐ{fddW$yəᤖ4̋ZѣfJDzrnhŞ9LT\r<1K ^Mg yY4džZ<(mb0C?t8HKdA9p5xanBۇ clem}=5 jtΑ6nYǁ8Q=M5jLOQ.QzԫMHf67vgEY^&Mŵj )i)Jj.?*-XGnwy:[=B>9m/N4<iqz nde Jj-i2SQKF{^4mVځ؁6́έ:a6TQC:hA zh_jX^3͡8 0̇I?ʎG=$pk1 [7|{߃ X-JP;1Z/(愒њK[nE3m]U2.<Ѿ?+qxfepr:„>241ػڬ*7oZUqtVS_)T&#Y>>YZ@*3FеԂˢܴr+LxEuƯmiXcc f>Kw&H f2endstream endobj 86 0 obj<>/XObject<<>>>>/Annots 53 0 R>>endobj 87 0 obj<>stream xڅSMo@+H5Ƙޒ4HuF!=7]ww;kc+x>|=bч8ߢEaD4K鷆dfGCª MfaJqDq E)3$Sht\m5Nxruk>M1kNml1"/KynaLg (tJJ=Ӄv򒅬{޾x?qU`yǡ*P%48S"Tu#F儫AF@ 6ZK4ު§ Y@mR(CڃuXC;kX kEZYX(*uXlysbAW P}]]7Mgs,!ƍ$wj$$-r?C.ן`e%OGnko 8_;6I,vFX bEuӬҍ.~ɪ]>endobj xref 0 89 0000000000 65535 f 0000000015 00000 n 0000000235 00000 n 0000001801 00000 n 0000001875 00000 n 0000001953 00000 n 0000002032 00000 n 0000002108 00000 n 0000002189 00000 n 0000002247 00000 n 0000008244 00000 n 0000014427 00000 n 0000014479 00000 n 0000014564 00000 n 0000014614 00000 n 0000014699 00000 n 0000014729 00000 n 0000014829 00000 n 0000014929 00000 n 0000015029 00000 n 0000015129 00000 n 0000015229 00000 n 0000015329 00000 n 0000015429 00000 n 0000015529 00000 n 0000015629 00000 n 0000015729 00000 n 0000015829 00000 n 0000015929 00000 n 0000016029 00000 n 0000016136 00000 n 0000016194 00000 n 0000016279 00000 n 0000016349 00000 n 0000016434 00000 n 0000016494 00000 n 0000016579 00000 n 0000016640 00000 n 0000016725 00000 n 0000016781 00000 n 0000016866 00000 n 0000016917 00000 n 0000016981 00000 n 0000017064 00000 n 0000017127 00000 n 0000017210 00000 n 0000017288 00000 n 0000017371 00000 n 0000017437 00000 n 0000017520 00000 n 0000017586 00000 n 0000017669 00000 n 0000017735 00000 n 0000017818 00000 n 0000017876 00000 n 0000017908 00000 n 0000017940 00000 n 0000018194 00000 n 0000018235 00000 n 0000018276 00000 n 0000018317 00000 n 0000018358 00000 n 0000018399 00000 n 0000018440 00000 n 0000018481 00000 n 0000018522 00000 n 0000018563 00000 n 0000018604 00000 n 0000018645 00000 n 0000018686 00000 n 0000018727 00000 n 0000018768 00000 n 0000018869 00000 n 0000019086 00000 n 0000032986 00000 n 0000033187 00000 n 0000038775 00000 n 0000038955 00000 n 0000040549 00000 n 0000040734 00000 n 0000042384 00000 n 0000042555 00000 n 0000043995 00000 n 0000044166 00000 n 0000045740 00000 n 0000045934 00000 n 0000047156 00000 n 0000047341 00000 n 0000048038 00000 n trailer <<03967269ac91dfa8703134cd01b1bd67>]>> startxref 48122 %%EOF -----------------------------1977426492562745908748943111-- cups-2.3.1/cgi-bin/printers.c000664 000765 000024 00000031331 13574721672 016122 0ustar00mikestaff000000 000000 /* * Printer status CGI for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" #include /* * Local functions... */ static void do_printer_op(http_t *http, const char *printer, ipp_op_t op, const char *title); static void show_all_printers(http_t *http, const char *username); static void show_printer(http_t *http, const char *printer); /* * 'main()' - Main entry for CGI. */ int /* O - Exit status */ main(void) { const char *printer; /* Printer name */ const char *user; /* Username */ http_t *http; /* Connection to the server */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ const char *op; /* Operation to perform, if any */ static const char *def_attrs[] = /* Attributes for default printer */ { "printer-name", "printer-uri-supported" }; /* * Get any form variables... */ cgiInitialize(); op = cgiGetVariable("OP"); /* * Set the web interface section... */ cgiSetVariable("SECTION", "printers"); cgiSetVariable("REFRESH_PAGE", ""); /* * See if we are displaying a printer or all printers... */ if ((printer = getenv("PATH_INFO")) != NULL) { printer ++; if (!*printer) printer = NULL; if (printer) cgiSetVariable("PRINTER_NAME", printer); } /* * See who is logged in... */ user = getenv("REMOTE_USER"); /* * Connect to the HTTP server... */ http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); /* * Get the default printer... */ if (!op || !cgiIsPOST()) { /* * Get the default destination... */ request = ippNewRequest(CUPS_GET_DEFAULT); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs); if ((response = cupsDoRequest(http, request, "/")) != NULL) { if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL) cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text); if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) { char url[HTTP_MAX_URI]; /* New URL */ cgiSetVariable("DEFAULT_URI", cgiRewriteURL(attr->values[0].string.text, url, sizeof(url), NULL)); } ippDelete(response); } /* * See if we need to show a list of printers or the status of a * single printer... */ if (!printer) show_all_printers(http, user); else show_printer(http, printer); } else if (printer) { if (!*op) { const char *server_port = getenv("SERVER_PORT"); /* Port number string */ int port = atoi(server_port ? server_port : "0"); /* Port number */ char uri[1024]; /* URL */ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), getenv("HTTPS") ? "https" : "http", NULL, getenv("SERVER_NAME"), port, "/printers/%s", printer); printf("Location: %s\n\n", uri); } else if (!strcmp(op, "start-printer")) do_printer_op(http, printer, IPP_RESUME_PRINTER, cgiText(_("Resume Printer"))); else if (!strcmp(op, "stop-printer")) do_printer_op(http, printer, IPP_PAUSE_PRINTER, cgiText(_("Pause Printer"))); else if (!strcmp(op, "accept-jobs")) do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); else if (!strcmp(op, "reject-jobs")) do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); else if (!strcmp(op, "cancel-jobs")) do_printer_op(http, printer, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs"))); else if (!_cups_strcasecmp(op, "print-self-test-page")) cgiPrintCommand(http, printer, "PrintSelfTestPage", cgiText(_("Print Self-Test Page"))); else if (!_cups_strcasecmp(op, "clean-print-heads")) cgiPrintCommand(http, printer, "Clean all", cgiText(_("Clean Print Heads"))); else if (!_cups_strcasecmp(op, "print-test-page")) cgiPrintTestPage(http, printer); else if (!_cups_strcasecmp(op, "move-jobs")) cgiMoveJobs(http, printer, 0); else { /* * Unknown/bad operation... */ cgiStartHTML(printer); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } } else { /* * Unknown/bad operation... */ cgiStartHTML(cgiText(_("Printers"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } /* * Close the HTTP server connection... */ httpClose(http); /* * Return with no errors... */ return (0); } /* * 'do_printer_op()' - Do a printer operation. */ static void do_printer_op(http_t *http, /* I - HTTP connection */ const char *printer, /* I - Printer name */ ipp_op_t op, /* I - Operation to perform */ const char *title) /* I - Title of page */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI], /* Printer URI */ resource[HTTP_MAX_URI]; /* Path for request */ /* * Build a printer request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(op); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ snprintf(resource, sizeof(resource), "/printers/%s", printer); ippDelete(cupsDoRequest(http, request, resource)); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(_("Unable to do maintenance command")); } else { /* * Redirect successful updates back to the printer page... */ char url[1024], /* Printer/class URL */ refresh[1024]; /* Refresh URL */ cgiRewriteURL(uri, url, sizeof(url), NULL); cgiFormEncode(uri, url, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); if (op == IPP_PAUSE_PRINTER) cgiCopyTemplateLang("printer-stop.tmpl"); else if (op == IPP_RESUME_PRINTER) cgiCopyTemplateLang("printer-start.tmpl"); else if (op == CUPS_ACCEPT_JOBS) cgiCopyTemplateLang("printer-accept.tmpl"); else if (op == CUPS_REJECT_JOBS) cgiCopyTemplateLang("printer-reject.tmpl"); else if (op == IPP_OP_CANCEL_JOBS) cgiCopyTemplateLang("printer-cancel-jobs.tmpl"); } cgiEndHTML(); } /* * 'show_all_printers()' - Show all printers... */ static void show_all_printers(http_t *http, /* I - Connection to server */ const char *user) /* I - Username */ { int i; /* Looping var */ ipp_t *request, /* IPP request */ *response; /* IPP response */ cups_array_t *printers; /* Array of printer objects */ ipp_attribute_t *printer; /* Printer object */ int first, /* First printer to show */ count; /* Number of printers */ const char *var; /* Form variable */ void *search; /* Search data */ char val[1024]; /* Form variable */ fprintf(stderr, "DEBUG: show_all_printers(http=%p, user=\"%s\")\n", http, user ? user : "(null)"); /* * Show the standard header... */ cgiStartHTML(cgiText(_("Printers"))); /* * Build a CUPS_GET_PRINTERS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-type * printer-type-mask * requesting-user-name */ request = ippNewRequest(CUPS_GET_PRINTERS); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", 0); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", CUPS_PRINTER_CLASS); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); cgiGetAttributes(request, "printers.tmpl"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Get a list of matching job objects. */ if ((var = cgiGetVariable("QUERY")) != NULL && !cgiGetVariable("CLEAR")) search = cgiCompileSearch(var); else search = NULL; printers = cgiGetIPPObjects(response, search); count = cupsArrayCount(printers); if (search) cgiFreeSearch(search); /* * Figure out which printers to display... */ if ((var = cgiGetVariable("FIRST")) != NULL) first = atoi(var); else first = 0; if (first >= count) first = count - CUPS_PAGE_MAX; first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX; if (first < 0) first = 0; sprintf(val, "%d", count); cgiSetVariable("TOTAL", val); for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first); i < CUPS_PAGE_MAX && printer; i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers)) cgiSetIPPObjectVars(printer, NULL, i); /* * Save navigation URLs... */ cgiSetVariable("THISURL", "/printers/"); if (first > 0) { sprintf(val, "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { sprintf(val, "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } if (count > CUPS_PAGE_MAX) { snprintf(val, sizeof(val), "%d", CUPS_PAGE_MAX * (count / CUPS_PAGE_MAX)); cgiSetVariable("LAST", val); } /* * Then show everything... */ cgiCopyTemplateLang("search.tmpl"); cgiCopyTemplateLang("printers-header.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); cgiCopyTemplateLang("printers.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); /* * Delete the response... */ cupsArrayDelete(printers); ippDelete(response); } else { /* * Show the error... */ cgiShowIPPError(_("Unable to get printer list")); } cgiEndHTML(); } /* * 'show_printer()' - Show a single printer. */ static void show_printer(http_t *http, /* I - Connection to server */ const char *printer) /* I - Name of printer */ { ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ char uri[HTTP_MAX_URI]; /* Printer URI */ char refresh[1024]; /* Refresh URL */ fprintf(stderr, "DEBUG: show_printer(http=%p, printer=\"%s\")\n", http, printer ? printer : "(null)"); /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); cgiGetAttributes(request, "printer.tmpl"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Got the result; set the CGI variables and check the status of a * single-queue request... */ cgiSetIPPVars(response, NULL, NULL, NULL, 0); if (printer && (attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL && attr->values[0].integer == IPP_PRINTER_PROCESSING) { /* * Printer is processing - automatically refresh the page until we * are done printing... */ cgiFormEncode(uri, printer, sizeof(uri)); snprintf(refresh, sizeof(refresh), "10;URL=/printers/%s", uri); cgiSetVariable("refresh_page", refresh); } /* * Delete the response... */ ippDelete(response); /* * Show the standard header... */ cgiStartHTML(printer); /* * Show the printer status... */ cgiCopyTemplateLang("printer.tmpl"); /* * Show jobs for the specified printer... */ cgiCopyTemplateLang("printer-jobs-header.tmpl"); cgiShowJobs(http, printer); } else { /* * Show the IPP error... */ cgiStartHTML(printer); cgiShowIPPError(_("Unable to get printer status")); } cgiEndHTML(); } cups-2.3.1/cgi-bin/libcupscgi.exp000664 000765 000024 00000001231 13574721672 016746 0ustar00mikestaff000000 000000 _cgiCheckVariables _cgiClearVariables _cgiCompileSearch _cgiCopyTemplateFile _cgiCopyTemplateLang _cgiDoSearch _cgiEndHTML _cgiEndMultipart _cgiFormEncode _cgiFreeSearch _cgiGetArray _cgiGetAttributes _cgiGetCookie _cgiGetFile _cgiGetIPPObjects _cgiGetSize _cgiGetTemplateDir _cgiGetVariable _cgiInitialize _cgiIsPOST _cgiMoveJobs _cgiPrintCommand _cgiPrintTestPage _cgiRewriteURL _cgiSetArray _cgiSetIPPObjectVars _cgiSetIPPVars _cgiSetCookie _cgiSetServerVersion _cgiSetSize _cgiSetVariable _cgiShowIPPError _cgiShowJobs _cgiStartHTML _cgiStartMultipart _cgiSupportsMultipart _cgiText _helpDeleteIndex _helpFindNode _helpLoadIndex _helpSaveIndex _helpSearchIndex cups-2.3.1/cgi-bin/Makefile000664 000765 000024 00000007314 13574721672 015554 0ustar00mikestaff000000 000000 # # CGI makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2006 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs LIBOBJS = \ help-index.o \ html.o \ ipp-var.o \ search.o \ template.o \ var.o OBJS = \ $(LIBOBJS) \ admin.o \ classes.o \ help.o \ jobs.o \ makedocset.o \ printers.o \ testcgi.o \ testhi.o \ testtemplate.o CGIS = \ admin.cgi \ classes.cgi \ help.cgi \ jobs.cgi \ printers.cgi LIBTARGETS = \ libcupscgi.a UNITTARGETS = \ testcgi \ testhi \ testtemplate TARGETS = \ $(LIBTARGETS) \ $(CGIS) # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: $(UNITTARGETS) # # Clean all object files... # clean: $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) makedocset # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: $(INSTALL_DIR) -m 755 $(SERVERBIN)/cgi-bin for file in $(CGIS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \ done if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ for file in $(CGIS); do \ cp $$file $(SYMROOT); \ dsymutil $(SYMROOT)/$$file; \ done \ fi # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall all targets... # uninstall: for file in $(CGIS); do \ $(RM) $(SERVERBIN)/cgi-bin/$$file; \ done -$(RMDIR) $(SERVERBIN)/cgi-bin # # libcupscgi.a # libcupscgi.a: $(LIBOBJS) echo Archiving $@... $(RM) $@ $(AR) $(ARFLAGS) $@ $(LIBOBJS) $(RANLIB) $@ # # admin.cgi # admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) libcupscgi.a echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ admin.o libcupscgi.a $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # classes.cgi # classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) libcupscgi.a echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ classes.o libcupscgi.a $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # help.cgi # help.cgi: help.o ../Makedefs ../cups/$(LIBCUPS) libcupscgi.a echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ help.o libcupscgi.a $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # jobs.cgi # jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) libcupscgi.a echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ jobs.o libcupscgi.a $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # printers.cgi # printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) libcupscgi.a echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ printers.o libcupscgi.a $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # testcgi # testcgi: testcgi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testcgi.o libcupscgi.a \ $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Testing CGI API... ./testcgi # # testhi # testhi: testhi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ testhi.o libcupscgi.a \ $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ echo Testing help index API... ./testhi # # testtemplate # testtemplate: testtemplate.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ testtemplate.o libcupscgi.a $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Dependencies... # include Dependencies cups-2.3.1/cgi-bin/testhi.c000664 000765 000024 00000007154 13574721672 015562 0ustar00mikestaff000000 000000 /* * Help index test program for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi.h" /* * Local functions... */ static void list_nodes(const char *title, cups_array_t *nodes); static int usage(void); /* * 'main()' - Test the help index code. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ help_index_t *hi, /* Help index */ *search; /* Search index */ const char *opt, /* Current option character */ *dir = ".", /* Directory to index */ *q = NULL, /* Query string */ *section = NULL, /* Section string */ *filename = NULL; /* Filename string */ /* * Parse the command-line... */ for (i = 1; i < argc; i ++) { if (argv[i][0] == '-') { if (!strcmp(argv[i], "--help")) { usage(); return (0); } for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case 'd' : /* -d directory */ i ++; if (i < argc) { dir = argv[i]; } else { fputs("testhi: Missing directory for \"-d\" option.\n", stderr); return (usage()); } break; case 's' : /* -s section */ i ++; if (i < argc) { section = argv[i]; } else { fputs("testhi: Missing section name for \"-s\" option.\n", stderr); return (usage()); } break; default : fprintf(stderr, "testhi: Unknown option \"-%c\".\n", *opt); return (usage()); } } } else if (!q) q = argv[i]; else if (!filename) filename = argv[i]; else { fprintf(stderr, "testhi: Unknown argument \"%s\".\n", argv[i]); return (usage()); } } /* * Load the help index... */ hi = helpLoadIndex("testhi.index", dir); list_nodes("nodes", hi->nodes); list_nodes("sorted", hi->sorted); /* * Do any searches... */ if (q) { search = helpSearchIndex(hi, q, section, filename); if (search) { list_nodes(argv[1], search->sorted); helpDeleteIndex(search); } else printf("%s (0 nodes)\n", q); } helpDeleteIndex(hi); /* * Return with no errors... */ return (0); } /* * 'list_nodes()' - List nodes in an array... */ static void list_nodes(const char *title, /* I - Title string */ cups_array_t *nodes) /* I - Nodes */ { int i; /* Looping var */ help_node_t *node; /* Current node */ printf("%s (%d nodes):\n", title, cupsArrayCount(nodes)); for (i = 1, node = (help_node_t *)cupsArrayFirst(nodes); node; i ++, node = (help_node_t *)cupsArrayNext(nodes)) { if (node->anchor) printf(" %d: %s#%s \"%s\"", i, node->filename, node->anchor, node->text); else printf(" %d: %s \"%s\"", i, node->filename, node->text); printf(" (%d words)\n", cupsArrayCount(node->words)); } } /* * 'usage()' - Show program usage. */ static int /* O - Exit status */ usage(void) { puts("Usage: ./testhi [options] [\"query\"] [filename]"); puts("Options:"); puts("-d directory Specify index directory."); puts("-s section Specify search section."); return (1); } cups-2.3.1/cgi-bin/admin.c000664 000765 000024 00000304526 13574721672 015355 0ustar00mikestaff000000 000000 /* * Administration CGI for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include "cgi-private.h" #include #include #include #include #include #include #include #include #include /* * Local globals... */ static int current_device = 0; /* Current device shown */ /* * Local functions... */ static void choose_device_cb(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, const char *title); static void do_am_class(http_t *http, int modify); static void do_am_printer(http_t *http, int modify); static void do_config_server(http_t *http); static void do_delete_class(http_t *http); static void do_delete_printer(http_t *http); static void do_list_printers(http_t *http); static void do_menu(http_t *http); static void do_set_allowed_users(http_t *http); static void do_set_default(http_t *http); static void do_set_options(http_t *http, int is_class); static void do_set_sharing(http_t *http); static char *get_option_value(ppd_file_t *ppd, const char *name, char *buffer, size_t bufsize); static double get_points(double number, const char *uval); static char *get_printer_ppd(const char *uri, char *buffer, size_t bufsize); /* * 'main()' - Main entry for CGI. */ int /* O - Exit status */ main(void) { http_t *http; /* Connection to the server */ const char *op; /* Operation name */ /* * Connect to the HTTP server... */ fputs("DEBUG: admin.cgi started...\n", stderr); http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); if (!http) { perror("ERROR: Unable to connect to cupsd"); fprintf(stderr, "DEBUG: cupsServer()=\"%s\"\n", cupsServer() ? cupsServer() : "(null)"); fprintf(stderr, "DEBUG: ippPort()=%d\n", ippPort()); fprintf(stderr, "DEBUG: cupsEncryption()=%d\n", cupsEncryption()); exit(1); } fprintf(stderr, "DEBUG: http=%p\n", http); /* * Set the web interface section... */ cgiSetVariable("SECTION", "admin"); cgiSetVariable("REFRESH_PAGE", ""); /* * See if we have form data... */ if (!cgiInitialize() || !cgiGetVariable("OP")) { /* * Nope, send the administration menu... */ fputs("DEBUG: No form data, showing main menu...\n", stderr); do_menu(http); } else if ((op = cgiGetVariable("OP")) != NULL && cgiIsPOST()) { /* * Do the operation... */ fprintf(stderr, "DEBUG: op=\"%s\"...\n", op); if (!*op) { const char *printer = getenv("PRINTER_NAME"), /* Printer or class name */ *server_port = getenv("SERVER_PORT"); /* Port number string */ int port = atoi(server_port ? server_port : "0"); /* Port number */ char uri[1024]; /* URL */ if (printer) httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), getenv("HTTPS") ? "https" : "http", NULL, getenv("SERVER_NAME"), port, "/%s/%s", cgiGetVariable("IS_CLASS") ? "classes" : "printers", printer); else httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), getenv("HTTPS") ? "https" : "http", NULL, getenv("SERVER_NAME"), port, "/admin"); printf("Location: %s\n\n", uri); } else if (!strcmp(op, "set-allowed-users")) do_set_allowed_users(http); else if (!strcmp(op, "set-as-default")) do_set_default(http); else if (!strcmp(op, "set-sharing")) do_set_sharing(http); else if (!strcmp(op, "find-new-printers") || !strcmp(op, "list-available-printers")) do_list_printers(http); else if (!strcmp(op, "add-class")) do_am_class(http, 0); else if (!strcmp(op, "add-printer")) do_am_printer(http, 0); else if (!strcmp(op, "modify-class")) do_am_class(http, 1); else if (!strcmp(op, "modify-printer")) do_am_printer(http, 1); else if (!strcmp(op, "delete-class")) do_delete_class(http); else if (!strcmp(op, "delete-printer")) do_delete_printer(http); else if (!strcmp(op, "set-class-options")) do_set_options(http, 1); else if (!strcmp(op, "set-printer-options")) do_set_options(http, 0); else if (!strcmp(op, "config-server")) do_config_server(http); else { /* * Bad operation code - display an error... */ cgiStartHTML(cgiText(_("Administration"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } } else if (op && !strcmp(op, "redirect")) { const char *url; /* Redirection URL... */ char prefix[1024]; /* URL prefix */ if (getenv("HTTPS")) snprintf(prefix, sizeof(prefix), "https://%s:%s", getenv("SERVER_NAME"), getenv("SERVER_PORT")); else snprintf(prefix, sizeof(prefix), "http://%s:%s", getenv("SERVER_NAME"), getenv("SERVER_PORT")); fprintf(stderr, "DEBUG: redirecting with prefix %s!\n", prefix); if ((url = cgiGetVariable("URL")) != NULL) { char encoded[1024], /* Encoded URL string */ *ptr; /* Pointer into encoded string */ ptr = encoded; if (*url != '/') *ptr++ = '/'; for (; *url && ptr < (encoded + sizeof(encoded) - 4); url ++) { if (strchr("%@&+ <>#=", *url) || *url < ' ' || *url & 128) { /* * Percent-encode this character; safe because we have at least 4 * bytes left in the array... */ sprintf(ptr, "%%%02X", *url & 255); ptr += 3; } else *ptr++ = *url; } *ptr = '\0'; if (*url) { /* * URL was too long, just redirect to the admin page... */ printf("Location: %s/admin\n\n", prefix); } else { /* * URL is OK, redirect there... */ printf("Location: %s%s\n\n", prefix, encoded); } } else printf("Location: %s/admin\n\n", prefix); } else { /* * Form data but no operation code - display an error... */ cgiStartHTML(cgiText(_("Administration"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } /* * Close the HTTP server connection... */ httpClose(http); /* * Return with no errors... */ return (0); } /* * 'choose_device_cb()' - Add a device to the device selection page. */ static void choose_device_cb( const char *device_class, /* I - Class */ const char *device_id, /* I - 1284 device ID */ const char *device_info, /* I - Description */ const char *device_make_and_model, /* I - Make and model */ const char *device_uri, /* I - Device URI */ const char *device_location, /* I - Location */ const char *title) /* I - Page title */ { /* * For modern browsers, start a multi-part page so we can show that something * is happening. Non-modern browsers just get everything at the end... */ if (current_device == 0 && cgiSupportsMultipart()) { cgiStartMultipart(); cgiStartHTML(title); cgiCopyTemplateLang("choose-device.tmpl"); cgiEndHTML(); fflush(stdout); } /* * Add the device to the array... */ cgiSetArray("device_class", current_device, device_class); cgiSetArray("device_id", current_device, device_id); cgiSetArray("device_info", current_device, device_info); cgiSetArray("device_make_and_model", current_device, device_make_and_model); cgiSetArray("device_uri", current_device, device_uri); cgiSetArray("device_location", current_device, device_location); current_device ++; } /* * 'do_am_class()' - Add or modify a class. */ static void do_am_class(http_t *http, /* I - HTTP connection */ int modify) /* I - Modify the printer? */ { int i, j; /* Looping vars */ int element; /* Element number */ int num_printers; /* Number of printers */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* member-uris attribute */ char uri[HTTP_MAX_URI]; /* Device or printer URI */ const char *name, /* Pointer to class name */ *op, /* Operation name */ *ptr; /* Pointer to CGI variable */ const char *title; /* Title of page */ static const char * const pattrs[] = /* Requested printer attributes */ { "member-names", "printer-info", "printer-location" }; title = cgiText(modify ? _("Modify Class") : _("Add Class")); op = cgiGetVariable("OP"); name = cgiGetVariable("PRINTER_NAME"); if (cgiGetVariable("PRINTER_LOCATION") == NULL) { /* * Build a CUPS_GET_PRINTERS request, which requires the * following attributes: * * attributes-charset * attributes-natural-language */ request = ippNewRequest(CUPS_GET_PRINTERS); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", CUPS_PRINTER_LOCAL); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE); /* * Do the request and get back a response... */ cgiClearVariables(); if (op) cgiSetVariable("OP", op); if (name) cgiSetVariable("PRINTER_NAME", name); if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Create MEMBER_URIS and MEMBER_NAMES arrays... */ for (element = 0, attr = response->attrs; attr != NULL; attr = attr->next) if (attr->name && !strcmp(attr->name, "printer-uri-supported")) { if ((ptr = strrchr(attr->values[0].string.text, '/')) != NULL && (!name || _cups_strcasecmp(name, ptr + 1))) { /* * Don't show the current class... */ cgiSetArray("MEMBER_URIS", element, attr->values[0].string.text); element ++; } } for (element = 0, attr = response->attrs; attr != NULL; attr = attr->next) if (attr->name && !strcmp(attr->name, "printer-name")) { if (!name || _cups_strcasecmp(name, attr->values[0].string.text)) { /* * Don't show the current class... */ cgiSetArray("MEMBER_NAMES", element, attr->values[0].string.text); element ++; } } num_printers = cgiGetSize("MEMBER_URIS"); ippDelete(response); } else num_printers = 0; if (modify) { /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the * following attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", name); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { if ((attr = ippFindAttribute(response, "member-names", IPP_TAG_NAME)) != NULL) { /* * Mark any current members in the class... */ for (j = 0; j < num_printers; j ++) cgiSetArray("MEMBER_SELECTED", j, ""); for (i = 0; i < attr->num_values; i ++) { for (j = 0; j < num_printers; j ++) { if (!_cups_strcasecmp(attr->values[i].string.text, cgiGetArray("MEMBER_NAMES", j))) { cgiSetArray("MEMBER_SELECTED", j, "SELECTED"); break; } } } } if ((attr = ippFindAttribute(response, "printer-info", IPP_TAG_TEXT)) != NULL) cgiSetVariable("PRINTER_INFO", attr->values[0].string.text); if ((attr = ippFindAttribute(response, "printer-location", IPP_TAG_TEXT)) != NULL) cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text); ippDelete(response); } /* * Update the location and description of an existing printer... */ cgiStartHTML(title); cgiCopyTemplateLang("modify-class.tmpl"); } else { /* * Get the name, location, and description for a new printer... */ cgiStartHTML(title); cgiCopyTemplateLang("add-class.tmpl"); } cgiEndHTML(); return; } if (!name) { cgiStartHTML(title); cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } for (ptr = name; *ptr; ptr ++) if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '#') break; if (*ptr || ptr == name || strlen(name) > 127) { cgiSetVariable("ERROR", cgiText(_("The class name may only contain up to " "127 printable characters and may not " "contain spaces, slashes (/), or the " "pound sign (#)."))); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } /* * Build a CUPS_ADD_CLASS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * printer-location * printer-info * printer-is-accepting-jobs * printer-state * member-uris */ request = ippNewRequest(CUPS_ADD_CLASS); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", name); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, cgiGetVariable("PRINTER_LOCATION")); ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, cgiGetVariable("PRINTER_INFO")); ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE); if ((num_printers = cgiGetSize("MEMBER_URIS")) > 0) { attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", num_printers, NULL, NULL); for (i = 0; i < num_printers; i ++) ippSetString(request, &attr, i, cgiGetArray("MEMBER_URIS", i)); } /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/admin/")); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(modify ? _("Unable to modify class") : _("Unable to add class")); } else { /* * Redirect successful updates back to the class page... */ char refresh[1024]; /* Refresh URL */ cgiFormEncode(uri, name, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=/classes/%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); if (modify) cgiCopyTemplateLang("class-modified.tmpl"); else cgiCopyTemplateLang("class-added.tmpl"); } cgiEndHTML(); } /* * 'do_am_printer()' - Add or modify a printer. */ static void do_am_printer(http_t *http, /* I - HTTP connection */ int modify) /* I - Modify the printer? */ { int i; /* Looping var */ ipp_attribute_t *attr; /* Current attribute */ ipp_t *request, /* IPP request */ *response, /* IPP response */ *oldinfo; /* Old printer information */ const cgi_file_t *file; /* Uploaded file, if any */ const char *var; /* CGI variable */ char uri[HTTP_MAX_URI], /* Device or printer URI */ *uriptr, /* Pointer into URI */ evefile[1024] = ""; /* IPP Everywhere PPD file */ int maxrate; /* Maximum baud rate */ char baudrate[255]; /* Baud rate string */ const char *name, /* Pointer to class name */ *ptr; /* Pointer to CGI variable */ const char *title; /* Title of page */ static int baudrates[] = /* Baud rates */ { 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800 }; ptr = cgiGetVariable("DEVICE_URI"); fprintf(stderr, "DEBUG: do_am_printer: DEVICE_URI=\"%s\"\n", ptr ? ptr : "(null)"); title = cgiText(modify ? _("Modify Printer") : _("Add Printer")); if (modify) { /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the * following attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", cgiGetVariable("PRINTER_NAME")); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ oldinfo = cupsDoRequest(http, request, "/"); } else oldinfo = NULL; file = cgiGetFile(); if (file) { fprintf(stderr, "DEBUG: file->tempfile=%s\n", file->tempfile); fprintf(stderr, "DEBUG: file->name=%s\n", file->name); fprintf(stderr, "DEBUG: file->filename=%s\n", file->filename); fprintf(stderr, "DEBUG: file->mimetype=%s\n", file->mimetype); } if ((name = cgiGetVariable("PRINTER_NAME")) != NULL) { for (ptr = name; *ptr; ptr ++) if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '\\' || *ptr == '?' || *ptr == '\'' || *ptr == '\"' || *ptr == '#') break; if (*ptr || ptr == name || strlen(name) > 127) { cgiSetVariable("ERROR", cgiText(_("The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the pound sign (#)."))); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } } if ((var = cgiGetVariable("DEVICE_URI")) != NULL) { if ((uriptr = strrchr(var, '|')) != NULL) { /* * Extract make and make/model from device URI string... */ char make[1024], /* Make string */ *makeptr; /* Pointer into make */ *uriptr++ = '\0'; strlcpy(make, uriptr, sizeof(make)); if ((makeptr = strchr(make, ' ')) != NULL) *makeptr = '\0'; else if ((makeptr = strchr(make, '-')) != NULL) *makeptr = '\0'; else if (!_cups_strncasecmp(make, "laserjet", 8) || !_cups_strncasecmp(make, "deskjet", 7) || !_cups_strncasecmp(make, "designjet", 9)) strlcpy(make, "HP", sizeof(make)); else if (!_cups_strncasecmp(make, "phaser", 6)) strlcpy(make, "Xerox", sizeof(make)); else if (!_cups_strncasecmp(make, "stylus", 6)) strlcpy(make, "Epson", sizeof(make)); else strlcpy(make, "Generic", sizeof(make)); if (!cgiGetVariable("CURRENT_MAKE")) cgiSetVariable("CURRENT_MAKE", make); if (!cgiGetVariable("CURRENT_MAKE_AND_MODEL")) cgiSetVariable("CURRENT_MAKE_AND_MODEL", uriptr); if (!modify) { char template[128], /* Template name */ *tptr; /* Pointer into template name */ cgiSetVariable("PRINTER_INFO", uriptr); for (tptr = template; tptr < (template + sizeof(template) - 1) && *uriptr; uriptr ++) if (isalnum(*uriptr & 255) || *uriptr == '_' || *uriptr == '-' || *uriptr == '.') *tptr++ = *uriptr; else if ((*uriptr == ' ' || *uriptr == '/') && tptr > template && tptr[-1] != '_') *tptr++ = '_'; else if (*uriptr == '?' || *uriptr == '(') break; *tptr = '\0'; cgiSetVariable("TEMPLATE_NAME", template); } } } if (!var) { /* * Look for devices so the user can pick something... */ if ((attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL) { strlcpy(uri, attr->values[0].string.text, sizeof(uri)); if ((uriptr = strchr(uri, ':')) != NULL && strncmp(uriptr, "://", 3) == 0) *uriptr = '\0'; cgiSetVariable("CURRENT_DEVICE_URI", attr->values[0].string.text); cgiSetVariable("CURRENT_DEVICE_SCHEME", uri); } /* * Scan for devices for up to 30 seconds... */ fputs("DEBUG: Getting list of devices...\n", stderr); current_device = 0; if (cupsGetDevices(http, 5, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE, (cups_device_cb_t)choose_device_cb, (void *)title) == IPP_OK) { fputs("DEBUG: Got device list!\n", stderr); if (cgiSupportsMultipart()) cgiStartMultipart(); cgiSetVariable("CUPS_GET_DEVICES_DONE", "1"); cgiStartHTML(title); cgiCopyTemplateLang("choose-device.tmpl"); cgiEndHTML(); if (cgiSupportsMultipart()) cgiEndMultipart(); } else { fprintf(stderr, "ERROR: CUPS-Get-Devices request failed with status %x: %s\n", cupsLastError(), cupsLastErrorString()); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else { cgiStartHTML(title); cgiShowIPPError(modify ? _("Unable to modify printer") : _("Unable to add printer")); cgiEndHTML(); return; } } } else if (!strchr(var, '/') || (!strncmp(var, "lpd://", 6) && !strchr(var + 6, '/'))) { if ((attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL) { /* * Set the current device URI for the form to the old one... */ if (strncmp(attr->values[0].string.text, var, strlen(var)) == 0) cgiSetVariable("CURRENT_DEVICE_URI", attr->values[0].string.text); } /* * User needs to set the full URI... */ cgiStartHTML(title); cgiCopyTemplateLang("choose-uri.tmpl"); cgiEndHTML(); } else if (!strncmp(var, "serial:", 7) && !cgiGetVariable("BAUDRATE")) { /* * Need baud rate, parity, etc. */ if ((var = strchr(var, '?')) != NULL && strncmp(var, "?baud=", 6) == 0) maxrate = atoi(var + 6); else maxrate = 19200; for (i = 0; i < 10; i ++) if (baudrates[i] > maxrate) break; else { sprintf(baudrate, "%d", baudrates[i]); cgiSetArray("BAUDRATES", i, baudrate); } cgiStartHTML(title); cgiCopyTemplateLang("choose-serial.tmpl"); cgiEndHTML(); } else if (!name || !cgiGetVariable("PRINTER_LOCATION")) { cgiStartHTML(title); if (modify) { /* * Update the location and description of an existing printer... */ if (oldinfo) { if ((attr = ippFindAttribute(oldinfo, "printer-info", IPP_TAG_TEXT)) != NULL) cgiSetVariable("PRINTER_INFO", attr->values[0].string.text); if ((attr = ippFindAttribute(oldinfo, "printer-location", IPP_TAG_TEXT)) != NULL) cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text); if ((attr = ippFindAttribute(oldinfo, "printer-is-shared", IPP_TAG_BOOLEAN)) != NULL) cgiSetVariable("PRINTER_IS_SHARED", attr->values[0].boolean ? "1" : "0"); } cgiCopyTemplateLang("modify-printer.tmpl"); } else { /* * Get the name, location, and description for a new printer... */ #ifdef __APPLE__ if (!strncmp(var, "usb:", 4)) cgiSetVariable("printer_is_shared", "1"); else #endif /* __APPLE__ */ cgiSetVariable("printer_is_shared", "0"); cgiCopyTemplateLang("add-printer.tmpl"); } cgiEndHTML(); if (oldinfo) ippDelete(oldinfo); return; } else if (!file && (!cgiGetVariable("PPD_NAME") || cgiGetVariable("SELECT_MAKE"))) { int ipp_everywhere = !strncmp(var, "ipp://", 6) || !strncmp(var, "ipps://", 7) || (!strncmp(var, "dnssd://", 8) && (strstr(var, "_ipp._tcp") || strstr(var, "_ipps._tcp"))); if (modify && !cgiGetVariable("SELECT_MAKE")) { /* * Get the PPD file... */ int fd; /* PPD file */ char filename[1024]; /* PPD filename */ ppd_file_t *ppd; /* PPD information */ char buffer[1024]; /* Buffer */ ssize_t bytes; /* Number of bytes */ http_status_t get_status; /* Status of GET */ /* TODO: Use cupsGetFile() API... */ snprintf(uri, sizeof(uri), "/printers/%s.ppd", name); if (httpGet(http, uri)) httpGet(http, uri); while ((get_status = httpUpdate(http)) == HTTP_CONTINUE); if (get_status != HTTP_OK) { httpFlush(http); fprintf(stderr, "ERROR: Unable to get PPD file %s: %d - %s\n", uri, get_status, httpStatus(get_status)); } else if ((fd = cupsTempFd(filename, sizeof(filename))) >= 0) { while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) write(fd, buffer, (size_t)bytes); close(fd); if ((ppd = ppdOpenFile(filename)) != NULL) { if (ppd->manufacturer) cgiSetVariable("CURRENT_MAKE", ppd->manufacturer); if (ppd->nickname) cgiSetVariable("CURRENT_MAKE_AND_MODEL", ppd->nickname); ppdClose(ppd); unlink(filename); } else { int linenum; /* Line number */ fprintf(stderr, "ERROR: Unable to open PPD file %s: %s\n", filename, ppdErrorString(ppdLastError(&linenum))); } } else { httpFlush(http); fprintf(stderr, "ERROR: Unable to create temporary file for PPD file: %s\n", strerror(errno)); } } /* * Build a CUPS_GET_PPDS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(CUPS_GET_PPDS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/"); if ((var = cgiGetVariable("PPD_MAKE")) == NULL) var = cgiGetVariable("CURRENT_MAKE"); if (var && !cgiGetVariable("SELECT_MAKE")) { const char *make_model; /* Make and model */ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-make", NULL, var); if ((make_model = cgiGetVariable("CURRENT_MAKE_AND_MODEL")) != NULL) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-make-and-model", NULL, make_model); } else ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "ppd-make"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Got the list of PPDs, see if the user has selected a make... */ if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0 && !modify) { /* * No PPD files with this make, try again with all makes... */ ippDelete(response); request = ippNewRequest(CUPS_GET_PPDS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/"); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "ppd-make"); if ((response = cupsDoRequest(http, request, "/")) != NULL) cgiSetIPPVars(response, NULL, NULL, NULL, 0); cgiStartHTML(title); cgiCopyTemplateLang("choose-make.tmpl"); cgiEndHTML(); } else if (!var || cgiGetVariable("SELECT_MAKE")) { cgiStartHTML(title); cgiCopyTemplateLang("choose-make.tmpl"); cgiEndHTML(); } else { /* * Let the user choose a model... */ cgiStartHTML(title); if (!cgiGetVariable("PPD_MAKE")) cgiSetVariable("PPD_MAKE", cgiGetVariable("CURRENT_MAKE")); if (ipp_everywhere) cgiSetVariable("SHOW_IPP_EVERYWHERE", "1"); cgiCopyTemplateLang("choose-model.tmpl"); cgiEndHTML(); } ippDelete(response); } else { cgiStartHTML(title); cgiShowIPPError(_("Unable to get list of printer drivers")); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); } } else { /* * Build a CUPS_ADD_PRINTER request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * printer-location * printer-info * ppd-name * device-uri * printer-is-accepting-jobs * printer-is-shared * printer-state */ request = ippNewRequest(CUPS_ADD_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", cgiGetVariable("PRINTER_NAME")); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); if (!file) { var = cgiGetVariable("PPD_NAME"); if (!strcmp(var, "everywhere")) get_printer_ppd(cgiGetVariable("DEVICE_URI"), evefile, sizeof(evefile)); else if (strcmp(var, "__no_change__")) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL, var); } ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, cgiGetVariable("PRINTER_LOCATION")); ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, cgiGetVariable("PRINTER_INFO")); strlcpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri)); /* * Strip make and model from URI... */ if ((uriptr = strrchr(uri, '|')) != NULL) *uriptr = '\0'; if (!strncmp(uri, "serial:", 7)) { /* * Update serial port URI to include baud rate, etc. */ if ((uriptr = strchr(uri, '?')) == NULL) uriptr = uri + strlen(uri); snprintf(uriptr, sizeof(uri) - (size_t)(uriptr - uri), "?baud=%s+bits=%s+parity=%s+flow=%s", cgiGetVariable("BAUDRATE"), cgiGetVariable("BITS"), cgiGetVariable("PARITY"), cgiGetVariable("FLOW")); } ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL, uri); ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); var = cgiGetVariable("printer_is_shared"); ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-shared", var && (!strcmp(var, "1") || !strcmp(var, "on"))); ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE); /* * Do the request and get back a response... */ if (file) ippDelete(cupsDoFileRequest(http, request, "/admin/", file->tempfile)); else if (evefile[0]) { ippDelete(cupsDoFileRequest(http, request, "/admin/", evefile)); unlink(evefile); } else ippDelete(cupsDoRequest(http, request, "/admin/")); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(modify ? _("Unable to modify printer") : _("Unable to add printer")); } else if (modify) { /* * Redirect successful updates back to the printer page... */ char refresh[1024]; /* Refresh URL */ cgiFormEncode(uri, name, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;/admin/?OP=redirect&URL=/printers/%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); cgiCopyTemplateLang("printer-modified.tmpl"); } else { /* * Set the printer options... */ cgiSetVariable("OP", "set-printer-options"); do_set_options(http, 0); return; } cgiEndHTML(); } if (oldinfo) ippDelete(oldinfo); } /* * 'do_config_server()' - Configure server settings. */ static void do_config_server(http_t *http) /* I - HTTP connection */ { if (cgiGetVariable("CHANGESETTINGS")) { /* * Save basic setting changes... */ int num_settings; /* Number of server settings */ cups_option_t *settings; /* Server settings */ int advanced, /* Advanced settings shown? */ changed; /* Have settings changed? */ const char *debug_logging, /* DEBUG_LOGGING value */ *preserve_jobs = NULL, /* PRESERVE_JOBS value */ *remote_admin, /* REMOTE_ADMIN value */ *remote_any, /* REMOTE_ANY value */ *share_printers,/* SHARE_PRINTERS value */ *user_cancel_any, /* USER_CANCEL_ANY value */ *browse_web_if = NULL, /* BrowseWebIF value */ *preserve_job_history = NULL, /* PreserveJobHistory value */ *preserve_job_files = NULL, /* PreserveJobFiles value */ *max_clients = NULL, /* MaxClients value */ *max_jobs = NULL, /* MaxJobs value */ *max_log_size = NULL; /* MaxLogSize value */ const char *current_browse_web_if, /* BrowseWebIF value */ *current_preserve_job_history, /* PreserveJobHistory value */ *current_preserve_job_files, /* PreserveJobFiles value */ *current_max_clients, /* MaxClients value */ *current_max_jobs, /* MaxJobs value */ *current_max_log_size; /* MaxLogSize value */ #ifdef HAVE_GSSAPI char default_auth_type[255]; /* DefaultAuthType value */ const char *val; /* Setting value */ #endif /* HAVE_GSSAPI */ /* * Get the checkbox values from the form... */ debug_logging = cgiGetVariable("DEBUG_LOGGING") ? "1" : "0"; remote_admin = cgiGetVariable("REMOTE_ADMIN") ? "1" : "0"; remote_any = cgiGetVariable("REMOTE_ANY") ? "1" : "0"; share_printers = cgiGetVariable("SHARE_PRINTERS") ? "1" : "0"; user_cancel_any = cgiGetVariable("USER_CANCEL_ANY") ? "1" : "0"; advanced = cgiGetVariable("ADVANCEDSETTINGS") != NULL; if (advanced) { /* * Get advanced settings... */ browse_web_if = cgiGetVariable("BROWSE_WEB_IF") ? "Yes" : "No"; max_clients = cgiGetVariable("MAX_CLIENTS"); max_log_size = cgiGetVariable("MAX_LOG_SIZE"); preserve_jobs = cgiGetVariable("PRESERVE_JOBS"); if (preserve_jobs) { max_jobs = cgiGetVariable("MAX_JOBS"); preserve_job_history = cgiGetVariable("PRESERVE_JOB_HISTORY"); preserve_job_files = cgiGetVariable("PRESERVE_JOB_FILES"); if (!max_jobs || atoi(max_jobs) < 0) max_jobs = "500"; if (!preserve_job_history) preserve_job_history = "On"; if (!preserve_job_files) preserve_job_files = "1d"; } else { max_jobs = "0"; preserve_job_history = "No"; preserve_job_files = "No"; } if (!max_clients || atoi(max_clients) <= 0) max_clients = "100"; if (!max_log_size || atoi(max_log_size) <= 0.0) max_log_size = "1m"; } /* * Get the current server settings... */ if (!cupsAdminGetServerSettings(http, &num_settings, &settings)) { cgiStartHTML(cgiText(_("Change Settings"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to change server settings"))); cgiSetVariable("ERROR", cupsLastErrorString()); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } #ifdef HAVE_GSSAPI /* * Get authentication settings... */ if (cgiGetVariable("KERBEROS")) strlcpy(default_auth_type, "Negotiate", sizeof(default_auth_type)); else { val = cupsGetOption("DefaultAuthType", num_settings, settings); if (!val || !_cups_strcasecmp(val, "Negotiate")) strlcpy(default_auth_type, "Basic", sizeof(default_auth_type)); else strlcpy(default_auth_type, val, sizeof(default_auth_type)); } fprintf(stderr, "DEBUG: DefaultAuthType %s\n", default_auth_type); #endif /* HAVE_GSSAPI */ if ((current_browse_web_if = cupsGetOption("BrowseWebIF", num_settings, settings)) == NULL) current_browse_web_if = "No"; if ((current_preserve_job_history = cupsGetOption("PreserveJobHistory", num_settings, settings)) == NULL) current_preserve_job_history = "Yes"; if ((current_preserve_job_files = cupsGetOption("PreserveJobFiles", num_settings, settings)) == NULL) current_preserve_job_files = "1d"; if ((current_max_clients = cupsGetOption("MaxClients", num_settings, settings)) == NULL) current_max_clients = "100"; if ((current_max_jobs = cupsGetOption("MaxJobs", num_settings, settings)) == NULL) current_max_jobs = "500"; if ((current_max_log_size = cupsGetOption("MaxLogSize", num_settings, settings)) == NULL) current_max_log_size = "1m"; /* * See if the settings have changed... */ changed = strcmp(debug_logging, cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, settings)) || strcmp(remote_admin, cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, settings)) || strcmp(remote_any, cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, settings)) || strcmp(share_printers, cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, settings)) || #ifdef HAVE_GSSAPI !cupsGetOption("DefaultAuthType", num_settings, settings) || strcmp(default_auth_type, cupsGetOption("DefaultAuthType", num_settings, settings)) || #endif /* HAVE_GSSAPI */ strcmp(user_cancel_any, cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, settings)); if (advanced && !changed) changed = _cups_strcasecmp(browse_web_if, current_browse_web_if) || _cups_strcasecmp(preserve_job_history, current_preserve_job_history) || _cups_strcasecmp(preserve_job_files, current_preserve_job_files) || _cups_strcasecmp(max_clients, current_max_clients) || _cups_strcasecmp(max_jobs, current_max_jobs) || _cups_strcasecmp(max_log_size, current_max_log_size); if (changed) { /* * Settings *have* changed, so save the changes... */ cupsFreeOptions(num_settings, settings); num_settings = 0; num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, debug_logging, num_settings, &settings); num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, remote_admin, num_settings, &settings); num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, remote_any, num_settings, &settings); num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, share_printers, num_settings, &settings); num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, user_cancel_any, num_settings, &settings); #ifdef HAVE_GSSAPI num_settings = cupsAddOption("DefaultAuthType", default_auth_type, num_settings, &settings); #endif /* HAVE_GSSAPI */ if (advanced) { /* * Add advanced settings... */ if (_cups_strcasecmp(browse_web_if, current_browse_web_if)) num_settings = cupsAddOption("BrowseWebIF", browse_web_if, num_settings, &settings); if (_cups_strcasecmp(preserve_job_history, current_preserve_job_history)) num_settings = cupsAddOption("PreserveJobHistory", preserve_job_history, num_settings, &settings); if (_cups_strcasecmp(preserve_job_files, current_preserve_job_files)) num_settings = cupsAddOption("PreserveJobFiles", preserve_job_files, num_settings, &settings); if (_cups_strcasecmp(max_clients, current_max_clients)) num_settings = cupsAddOption("MaxClients", max_clients, num_settings, &settings); if (_cups_strcasecmp(max_jobs, current_max_jobs)) num_settings = cupsAddOption("MaxJobs", max_jobs, num_settings, &settings); if (_cups_strcasecmp(max_log_size, current_max_log_size)) num_settings = cupsAddOption("MaxLogSize", max_log_size, num_settings, &settings); } if (!cupsAdminSetServerSettings(http, num_settings, settings)) { if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } cgiStartHTML(cgiText(_("Change Settings"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to change server settings"))); cgiSetVariable("ERROR", cupsLastErrorString()); cgiCopyTemplateLang("error.tmpl"); } else { if (advanced) cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&" "URL=/admin/?ADVANCEDSETTINGS=YES"); else cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); cgiStartHTML(cgiText(_("Change Settings"))); cgiCopyTemplateLang("restart.tmpl"); } } else { /* * No changes... */ cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); cgiStartHTML(cgiText(_("Change Settings"))); cgiCopyTemplateLang("norestart.tmpl"); } cupsFreeOptions(num_settings, settings); cgiEndHTML(); } else if (cgiGetVariable("SAVECHANGES") && cgiGetVariable("CUPSDCONF")) { /* * Save hand-edited config file... */ http_status_t status; /* PUT status */ char tempfile[1024]; /* Temporary new cupsd.conf */ int tempfd; /* Temporary file descriptor */ cups_file_t *temp; /* Temporary file */ const char *start, /* Start of line */ *end; /* End of line */ /* * Create a temporary file for the new cupsd.conf file... */ if ((tempfd = cupsTempFd(tempfile, sizeof(tempfile))) < 0) { cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to create temporary file"))); cgiSetVariable("ERROR", strerror(errno)); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); perror(tempfile); return; } if ((temp = cupsFileOpenFd(tempfd, "w")) == NULL) { cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to create temporary file"))); cgiSetVariable("ERROR", strerror(errno)); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); perror(tempfile); close(tempfd); unlink(tempfile); return; } /* * Copy the cupsd.conf text from the form variable... */ start = cgiGetVariable("CUPSDCONF"); while (start) { if ((end = strstr(start, "\r\n")) == NULL) if ((end = strstr(start, "\n")) == NULL) end = start + strlen(start); cupsFileWrite(temp, start, (size_t)(end - start)); cupsFilePutChar(temp, '\n'); if (*end == '\r') start = end + 2; else if (*end == '\n') start = end + 1; else start = NULL; } cupsFileClose(temp); /* * Upload the configuration file to the server... */ status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile); if (status == HTTP_UNAUTHORIZED) { puts("Status: 401\n"); unlink(tempfile); exit(0); } else if (status != HTTP_CREATED) { cgiSetVariable("MESSAGE", cgiText(_("Unable to upload cupsd.conf file"))); cgiSetVariable("ERROR", httpStatus(status)); cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiCopyTemplateLang("error.tmpl"); } else { cgiSetVariable("refresh_page", "5;URL=/admin/"); cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiCopyTemplateLang("restart.tmpl"); } cgiEndHTML(); unlink(tempfile); } else { struct stat info; /* cupsd.conf information */ cups_file_t *cupsd; /* cupsd.conf file */ char *buffer, /* Buffer for entire file */ *bufptr, /* Pointer into buffer */ *bufend; /* End of buffer */ int ch; /* Character from file */ char filename[1024]; /* Filename */ const char *server_root; /* Location of config files */ /* * Locate the cupsd.conf file... */ if ((server_root = getenv("CUPS_SERVERROOT")) == NULL) server_root = CUPS_SERVERROOT; snprintf(filename, sizeof(filename), "%s/cupsd.conf", server_root); /* * Figure out the size... */ if (stat(filename, &info)) { cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to access cupsd.conf file"))); cgiSetVariable("ERROR", strerror(errno)); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); perror(filename); return; } if (info.st_size > (1024 * 1024)) { cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to access cupsd.conf file"))); cgiSetVariable("ERROR", cgiText(_("Unable to edit cupsd.conf files larger than " "1MB"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); fprintf(stderr, "ERROR: \"%s\" too large (%ld) to edit!\n", filename, (long)info.st_size); return; } /* * Open the cupsd.conf file... */ if ((cupsd = cupsFileOpen(filename, "r")) == NULL) { /* * Unable to open - log an error... */ cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiSetVariable("MESSAGE", cgiText(_("Unable to access cupsd.conf file"))); cgiSetVariable("ERROR", strerror(errno)); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); perror(filename); return; } /* * Allocate memory and load the file into a string buffer... */ if ((buffer = calloc(1, (size_t)info.st_size + 1)) != NULL) { cupsFileRead(cupsd, buffer, (size_t)info.st_size); cgiSetVariable("CUPSDCONF", buffer); free(buffer); } cupsFileClose(cupsd); /* * Then get the default cupsd.conf file and put that into a string as * well... */ strlcat(filename, ".default", sizeof(filename)); if (!stat(filename, &info) && info.st_size < (1024 * 1024) && (cupsd = cupsFileOpen(filename, "r")) != NULL) { if ((buffer = calloc(1, 2 * (size_t)info.st_size + 1)) != NULL) { bufend = buffer + 2 * info.st_size - 1; for (bufptr = buffer; bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;) { if (ch == '\\' || ch == '\"') { *bufptr++ = '\\'; *bufptr++ = (char)ch; } else if (ch == '\n') { *bufptr++ = '\\'; *bufptr++ = 'n'; } else if (ch == '\t') { *bufptr++ = '\\'; *bufptr++ = 't'; } else if (ch >= ' ') *bufptr++ = (char)ch; } *bufptr = '\0'; cgiSetVariable("CUPSDCONF_DEFAULT", buffer); free(buffer); } cupsFileClose(cupsd); } /* * Show the current config file... */ cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiCopyTemplateLang("edit-config.tmpl"); cgiEndHTML(); } } /* * 'do_delete_class()' - Delete a class. */ static void do_delete_class(http_t *http) /* I - HTTP connection */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* Job URI */ const char *pclass; /* Printer class name */ /* * Get form variables... */ if (cgiGetVariable("CONFIRM") == NULL) { cgiStartHTML(cgiText(_("Delete Class"))); cgiCopyTemplateLang("class-confirm.tmpl"); cgiEndHTML(); return; } if ((pclass = cgiGetVariable("PRINTER_NAME")) != NULL) httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", pclass); else { cgiStartHTML(cgiText(_("Delete Class"))); cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } /* * Build a CUPS_DELETE_CLASS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(CUPS_DELETE_CLASS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/admin/")); /* * Show the results... */ if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() <= IPP_OK_CONFLICT) { /* * Redirect successful updates back to the classes page... */ cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&URL=/classes"); } cgiStartHTML(cgiText(_("Delete Class"))); if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to delete class")); else cgiCopyTemplateLang("class-deleted.tmpl"); cgiEndHTML(); } /* * 'do_delete_printer()' - Delete a printer. */ static void do_delete_printer(http_t *http) /* I - HTTP connection */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* Job URI */ const char *printer; /* Printer printer name */ /* * Get form variables... */ if (cgiGetVariable("CONFIRM") == NULL) { cgiStartHTML(cgiText(_("Delete Printer"))); cgiCopyTemplateLang("printer-confirm.tmpl"); cgiEndHTML(); return; } if ((printer = cgiGetVariable("PRINTER_NAME")) != NULL) httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); else { cgiStartHTML(cgiText(_("Delete Printer"))); cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } /* * Build a CUPS_DELETE_PRINTER request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(CUPS_DELETE_PRINTER); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/admin/")); /* * Show the results... */ if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() <= IPP_OK_CONFLICT) { /* * Redirect successful updates back to the printers page... */ cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&URL=/printers"); } cgiStartHTML(cgiText(_("Delete Printer"))); if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to delete printer")); else cgiCopyTemplateLang("printer-deleted.tmpl"); cgiEndHTML(); } /* * 'do_list_printers()' - List available printers. */ static void do_list_printers(http_t *http) /* I - HTTP connection */ { ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ cgiStartHTML(cgiText(_("List Available Printers"))); fflush(stdout); /* * Get the list of printers and their devices... */ request = ippNewRequest(CUPS_GET_PRINTERS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "device-uri"); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", CUPS_PRINTER_LOCAL); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", CUPS_PRINTER_LOCAL); if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Got the printer list, now load the devices... */ int i; /* Looping var */ cups_array_t *printer_devices; /* Printer devices for local printers */ char *printer_device; /* Current printer device */ /* * Allocate an array and copy the device strings... */ printer_devices = cupsArrayNew((cups_array_func_t)strcmp, NULL); for (attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI); attr; attr = ippFindNextAttribute(response, "device-uri", IPP_TAG_URI)) { cupsArrayAdd(printer_devices, strdup(attr->values[0].string.text)); } /* * Free the printer list and get the device list... */ ippDelete(response); request = ippNewRequest(CUPS_GET_DEVICES); if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Got the device list, let's parse it... */ const char *device_uri, /* device-uri attribute value */ *device_make_and_model, /* device-make-and-model value */ *device_info; /* device-info value */ for (i = 0, attr = response->attrs; attr; attr = attr->next) { /* * Skip leading attributes until we hit a device... */ while (attr && attr->group_tag != IPP_TAG_PRINTER) attr = attr->next; if (!attr) break; /* * Pull the needed attributes from this device... */ device_info = NULL; device_make_and_model = NULL; device_uri = NULL; while (attr && attr->group_tag == IPP_TAG_PRINTER) { if (!strcmp(attr->name, "device-info") && attr->value_tag == IPP_TAG_TEXT) device_info = attr->values[0].string.text; if (!strcmp(attr->name, "device-make-and-model") && attr->value_tag == IPP_TAG_TEXT) device_make_and_model = attr->values[0].string.text; if (!strcmp(attr->name, "device-uri") && attr->value_tag == IPP_TAG_URI) device_uri = attr->values[0].string.text; attr = attr->next; } /* * See if we have everything needed... */ if (device_info && device_make_and_model && device_uri && _cups_strcasecmp(device_make_and_model, "unknown") && strchr(device_uri, ':')) { /* * Yes, now see if there is already a printer for this * device... */ if (!cupsArrayFind(printer_devices, (void *)device_uri)) { /* * Not found, so it must be a new printer... */ char option[1024], /* Form variables for this device */ *option_ptr; /* Pointer into string */ const char *ptr; /* Pointer into device string */ /* * Format the printer name variable for this device... * * We use the device-info string first, then device-uri, * and finally device-make-and-model to come up with a * suitable name. */ if (_cups_strncasecmp(device_info, "unknown", 7)) ptr = device_info; else if ((ptr = strstr(device_uri, "://")) != NULL) ptr += 3; else ptr = device_make_and_model; for (option_ptr = option; option_ptr < (option + sizeof(option) - 1) && *ptr; ptr ++) if (isalnum(*ptr & 255) || *ptr == '_' || *ptr == '-' || *ptr == '.') *option_ptr++ = *ptr; else if ((*ptr == ' ' || *ptr == '/') && option_ptr > option && option_ptr[-1] != '_') *option_ptr++ = '_'; else if (*ptr == '?' || *ptr == '(') break; *option_ptr = '\0'; cgiSetArray("TEMPLATE_NAME", i, option); /* * Finally, set the form variables for this printer... */ cgiSetArray("device_info", i, device_info); cgiSetArray("device_make_and_model", i, device_make_and_model); cgiSetArray("device_uri", i, device_uri); i ++; } } if (!attr) break; } ippDelete(response); /* * Free the device list... */ for (printer_device = (char *)cupsArrayFirst(printer_devices); printer_device; printer_device = (char *)cupsArrayNext(printer_devices)) free(printer_device); cupsArrayDelete(printer_devices); } } /* * Finally, show the printer list... */ cgiCopyTemplateLang("list-available-printers.tmpl"); cgiEndHTML(); } /* * 'do_menu()' - Show the main menu. */ static void do_menu(http_t *http) /* I - HTTP connection */ { int num_settings; /* Number of server settings */ cups_option_t *settings; /* Server settings */ const char *val; /* Setting value */ /* * Get the current server settings... */ if (!cupsAdminGetServerSettings(http, &num_settings, &settings)) { cgiSetVariable("SETTINGS_MESSAGE", cgiText(_("Unable to open cupsd.conf file:"))); cgiSetVariable("SETTINGS_ERROR", cupsLastErrorString()); } if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, settings)) != NULL && atoi(val)) cgiSetVariable("DEBUG_LOGGING", "CHECKED"); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, settings)) != NULL && atoi(val)) cgiSetVariable("REMOTE_ADMIN", "CHECKED"); if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, settings)) != NULL && atoi(val)) cgiSetVariable("REMOTE_ANY", "CHECKED"); if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, settings)) != NULL && atoi(val)) cgiSetVariable("SHARE_PRINTERS", "CHECKED"); if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, settings)) != NULL && atoi(val)) cgiSetVariable("USER_CANCEL_ANY", "CHECKED"); #ifdef HAVE_GSSAPI cgiSetVariable("HAVE_GSSAPI", "1"); if ((val = cupsGetOption("DefaultAuthType", num_settings, settings)) != NULL && !_cups_strcasecmp(val, "Negotiate")) cgiSetVariable("KERBEROS", "CHECKED"); else #endif /* HAVE_GSSAPI */ cgiSetVariable("KERBEROS", ""); if ((val = cupsGetOption("BrowseWebIF", num_settings, settings)) == NULL) val = "No"; if (!_cups_strcasecmp(val, "yes") || !_cups_strcasecmp(val, "on") || !_cups_strcasecmp(val, "true")) cgiSetVariable("BROWSE_WEB_IF", "CHECKED"); if ((val = cupsGetOption("PreserveJobHistory", num_settings, settings)) == NULL) val = "Yes"; if (val && (!_cups_strcasecmp(val, "0") || !_cups_strcasecmp(val, "no") || !_cups_strcasecmp(val, "off") || !_cups_strcasecmp(val, "false") || !_cups_strcasecmp(val, "disabled"))) { cgiSetVariable("PRESERVE_JOB_HISTORY", "0"); cgiSetVariable("PRESERVE_JOB_FILES", "0"); } else { cgiSetVariable("PRESERVE_JOBS", "CHECKED"); cgiSetVariable("PRESERVE_JOB_HISTORY", val); if ((val = cupsGetOption("PreserveJobFiles", num_settings, settings)) == NULL) val = "1d"; cgiSetVariable("PRESERVE_JOB_FILES", val); } if ((val = cupsGetOption("MaxClients", num_settings, settings)) == NULL) val = "100"; cgiSetVariable("MAX_CLIENTS", val); if ((val = cupsGetOption("MaxJobs", num_settings, settings)) == NULL) val = "500"; cgiSetVariable("MAX_JOBS", val); if ((val = cupsGetOption("MaxLogSize", num_settings, settings)) == NULL) val = "1m"; cgiSetVariable("MAX_LOG_SIZE", val); cupsFreeOptions(num_settings, settings); /* * Finally, show the main menu template... */ cgiStartHTML(cgiText(_("Administration"))); cgiCopyTemplateLang("admin.tmpl"); cgiEndHTML(); } /* * 'do_set_allowed_users()' - Set the allowed/denied users for a queue. */ static void do_set_allowed_users(http_t *http) /* I - HTTP connection */ { int i; /* Looping var */ ipp_t *request, /* IPP request */ *response; /* IPP response */ char uri[HTTP_MAX_URI]; /* Printer URI */ const char *printer, /* Printer name (purge-jobs) */ *is_class, /* Is a class? */ *users, /* List of users or groups */ *type; /* Allow/deny type */ int num_users; /* Number of users */ char *ptr, /* Pointer into users string */ *end, /* Pointer to end of users string */ quote; /* Quote character */ ipp_attribute_t *attr; /* Attribute */ static const char * const attrs[] = /* Requested attributes */ { "requesting-user-name-allowed", "requesting-user-name-denied" }; is_class = cgiGetVariable("IS_CLASS"); printer = cgiGetVariable("PRINTER_NAME"); if (!printer) { cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiStartHTML(cgiText(_("Set Allowed Users"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } users = cgiGetVariable("users"); type = cgiGetVariable("type"); if (!users || !type || (strcmp(type, "requesting-user-name-allowed") && strcmp(type, "requesting-user-name-denied"))) { /* * Build a Get-Printer-Attributes request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * requested-attributes */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(attrs) / sizeof(attrs[0])), NULL, attrs); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { cgiSetIPPVars(response, NULL, NULL, NULL, 0); ippDelete(response); } cgiStartHTML(cgiText(_("Set Allowed Users"))); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to get printer attributes")); else cgiCopyTemplateLang("users.tmpl"); cgiEndHTML(); } else { /* * Save the changes... */ for (num_users = 0, ptr = (char *)users; *ptr; num_users ++) { /* * Skip whitespace and commas... */ while (*ptr == ',' || isspace(*ptr & 255)) ptr ++; if (!*ptr) break; if (*ptr == '\'' || *ptr == '\"') { /* * Scan quoted name... */ quote = *ptr++; for (end = ptr; *end; end ++) if (*end == quote) break; } else { /* * Scan space or comma-delimited name... */ for (end = ptr; *end; end ++) if (isspace(*end & 255) || *end == ',') break; } /* * Advance to the next name... */ ptr = end; } /* * Build a CUPS-Add-Printer/Class request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * requesting-user-name-{allowed,denied} */ request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); if (num_users == 0) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "requesting-user-name-allowed", NULL, "all"); else { attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME, type, num_users, NULL, NULL); for (i = 0, ptr = (char *)users; *ptr; i ++) { /* * Skip whitespace and commas... */ while (*ptr == ',' || isspace(*ptr & 255)) ptr ++; if (!*ptr) break; if (*ptr == '\'' || *ptr == '\"') { /* * Scan quoted name... */ quote = *ptr++; for (end = ptr; *end; end ++) if (*end == quote) break; } else { /* * Scan space or comma-delimited name... */ for (end = ptr; *end; end ++) if (isspace(*end & 255) || *end == ',') break; } /* * Terminate the name... */ if (*end) *end++ = '\0'; /* * Add the name... */ ippSetString(request, &attr, i, ptr); /* * Advance to the next name... */ ptr = end; } } /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/admin/")); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(cgiText(_("Set Allowed Users"))); cgiShowIPPError(_("Unable to change printer")); } else { /* * Redirect successful updates back to the printer page... */ char url[1024], /* Printer/class URL */ refresh[1024]; /* Refresh URL */ cgiRewriteURL(uri, url, sizeof(url), NULL); cgiFormEncode(uri, url, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(cgiText(_("Set Allowed Users"))); cgiCopyTemplateLang(is_class ? "class-modified.tmpl" : "printer-modified.tmpl"); } cgiEndHTML(); } } /* * 'do_set_default()' - Set the server default printer/class. */ static void do_set_default(http_t *http) /* I - HTTP connection */ { const char *title; /* Page title */ ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* Printer URI */ const char *printer, /* Printer name (purge-jobs) */ *is_class; /* Is a class? */ is_class = cgiGetVariable("IS_CLASS"); printer = cgiGetVariable("PRINTER_NAME"); title = cgiText(_("Set As Server Default")); if (!printer) { cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } /* * Build a printer request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(CUPS_SET_DEFAULT); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/admin/")); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(_("Unable to set server default")); } else { /* * Redirect successful updates back to the printer page... */ char url[1024], /* Printer/class URL */ refresh[1024]; /* Refresh URL */ cgiRewriteURL(uri, url, sizeof(url), NULL); cgiFormEncode(uri, url, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); cgiCopyTemplateLang("printer-default.tmpl"); } cgiEndHTML(); } /* * 'do_set_options()' - Configure the default options for a queue. */ static void do_set_options(http_t *http, /* I - HTTP connection */ int is_class) /* I - Set options for class? */ { int i, j, k, m; /* Looping vars */ int have_options; /* Have options? */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ char uri[HTTP_MAX_URI]; /* Job URI */ const char *var; /* Variable value */ const char *printer; /* Printer printer name */ const char *filename; /* PPD filename */ char tempfile[1024]; /* Temporary filename */ cups_file_t *in, /* Input file */ *out; /* Output file */ char line[1024], /* Line from PPD file */ value[1024], /* Option value */ keyword[1024], /* Keyword from Default line */ *keyptr; /* Pointer into keyword... */ ppd_file_t *ppd; /* PPD file */ ppd_group_t *group; /* Option group */ ppd_option_t *option; /* Option */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Custom parameter */ ppd_attr_t *ppdattr; /* PPD attribute */ const char *title; /* Page title */ title = cgiText(is_class ? _("Set Class Options") : _("Set Printer Options")); fprintf(stderr, "DEBUG: do_set_options(http=%p, is_class=%d)\n", http, is_class); /* * Get the printer name... */ if ((printer = cgiGetVariable("PRINTER_NAME")) != NULL) httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", printer); else { cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } fprintf(stderr, "DEBUG: printer=\"%s\", uri=\"%s\"...\n", printer, uri); /* * If the user clicks on the Auto-Configure button, send an AutoConfigure * command file to the printer... */ if (cgiGetVariable("AUTOCONFIGURE")) { cgiPrintCommand(http, printer, "AutoConfigure", "Set Default Options"); return; } /* * Get the PPD file... */ if (is_class) filename = NULL; else filename = cupsGetPPD2(http, printer); if (filename) { fprintf(stderr, "DEBUG: Got PPD file: \"%s\"\n", filename); if ((ppd = ppdOpenFile(filename)) == NULL) { cgiSetVariable("ERROR", ppdErrorString(ppdLastError(&i))); cgiSetVariable("MESSAGE", cgiText(_("Unable to open PPD file"))); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } } else { fputs("DEBUG: No PPD file\n", stderr); ppd = NULL; } if (cgiGetVariable("job_sheets_start") != NULL || cgiGetVariable("job_sheets_end") != NULL) have_options = 1; else have_options = 0; if (ppd) { ppdMarkDefaults(ppd); for (option = ppdFirstOption(ppd); option; option = ppdNextOption(ppd)) { if ((var = cgiGetVariable(option->keyword)) != NULL) { have_options = 1; ppdMarkOption(ppd, option->keyword, var); fprintf(stderr, "DEBUG: Set %s to %s...\n", option->keyword, var); } else fprintf(stderr, "DEBUG: Didn't find %s...\n", option->keyword); } } if (!have_options || ppdConflicts(ppd)) { /* * Show the options to the user... */ fputs("DEBUG: Showing options...\n", stderr); /* * Show auto-configure button if supported... */ if (ppd) { if (ppd->num_filters == 0 || ((ppdattr = ppdFindAttr(ppd, "cupsCommands", NULL)) != NULL && ppdattr->value && strstr(ppdattr->value, "AutoConfigure"))) cgiSetVariable("HAVE_AUTOCONFIGURE", "YES"); else { for (i = 0; i < ppd->num_filters; i ++) if (!strncmp(ppd->filters[i], "application/vnd.cups-postscript", 31)) { cgiSetVariable("HAVE_AUTOCONFIGURE", "YES"); break; } } } /* * Get the printer attributes... */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); response = cupsDoRequest(http, request, "/"); /* * List the groups used as "tabs"... */ i = 0; if (ppd) { for (group = ppd->groups; i < ppd->num_groups; i ++, group ++) { cgiSetArray("GROUP_ID", i, group->name); if (!strcmp(group->name, "InstallableOptions")) cgiSetArray("GROUP", i, cgiText(_("Options Installed"))); else cgiSetArray("GROUP", i, group->text); } } if (ippFindAttribute(response, "job-sheets-supported", IPP_TAG_ZERO)) { cgiSetArray("GROUP_ID", i, "CUPS_BANNERS"); cgiSetArray("GROUP", i ++, cgiText(_("Banners"))); } if (ippFindAttribute(response, "printer-error-policy-supported", IPP_TAG_ZERO) || ippFindAttribute(response, "printer-op-policy-supported", IPP_TAG_ZERO)) { cgiSetArray("GROUP_ID", i, "CUPS_POLICIES"); cgiSetArray("GROUP", i ++, cgiText(_("Policies"))); } if ((attr = ippFindAttribute(response, "port-monitor-supported", IPP_TAG_NAME)) != NULL && attr->num_values > 1) { cgiSetArray("GROUP_ID", i, "CUPS_PORT_MONITOR"); cgiSetArray("GROUP", i, cgiText(_("Port Monitor"))); } cgiStartHTML(cgiText(_("Set Printer Options"))); cgiCopyTemplateLang("set-printer-options-header.tmpl"); if (ppd) { ppdLocalize(ppd); if (ppdConflicts(ppd)) { for (i = ppd->num_groups, k = 0, group = ppd->groups; i > 0; i --, group ++) for (j = group->num_options, option = group->options; j > 0; j --, option ++) if (option->conflicted) { cgiSetArray("ckeyword", k, option->keyword); cgiSetArray("ckeytext", k, option->text); for (m = 0; m < option->num_choices; m ++) { if (option->choices[m].marked) { cgiSetArray("cchoice", k, option->choices[m].text); break; } } k ++; } cgiCopyTemplateLang("option-conflict.tmpl"); } for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) { for (j = group->num_options, option = group->options; j > 0; j --, option ++) { if (!strcmp(option->keyword, "PageRegion")) continue; if (option->num_choices > 1) break; } if (j == 0) continue; cgiSetVariable("GROUP_ID", group->name); if (!strcmp(group->name, "InstallableOptions")) cgiSetVariable("GROUP", cgiText(_("Options Installed"))); else cgiSetVariable("GROUP", group->text); cgiCopyTemplateLang("option-header.tmpl"); for (j = group->num_options, option = group->options; j > 0; j --, option ++) { if (!strcmp(option->keyword, "PageRegion") || option->num_choices < 2) continue; cgiSetVariable("KEYWORD", option->keyword); cgiSetVariable("KEYTEXT", option->text); if (option->conflicted) cgiSetVariable("CONFLICTED", "1"); else cgiSetVariable("CONFLICTED", "0"); cgiSetSize("CHOICES", 0); cgiSetSize("TEXT", 0); for (k = 0, m = 0; k < option->num_choices; k ++) { cgiSetArray("CHOICES", m, option->choices[k].choice); cgiSetArray("TEXT", m, option->choices[k].text); m ++; if (option->choices[k].marked) cgiSetVariable("DEFCHOICE", option->choices[k].choice); } cgiSetSize("PARAMS", 0); cgiSetSize("PARAMTEXT", 0); cgiSetSize("PARAMVALUE", 0); cgiSetSize("INPUTTYPE", 0); if ((coption = ppdFindCustomOption(ppd, option->keyword))) { const char *units = NULL; /* Units value, if any */ cgiSetVariable("ISCUSTOM", "1"); for (cparam = ppdFirstCustomParam(coption), m = 0; cparam; cparam = ppdNextCustomParam(coption), m ++) { if (!_cups_strcasecmp(option->keyword, "PageSize") && _cups_strcasecmp(cparam->name, "Width") && _cups_strcasecmp(cparam->name, "Height")) { m --; continue; } cgiSetArray("PARAMS", m, cparam->name); cgiSetArray("PARAMTEXT", m, cparam->text); cgiSetArray("INPUTTYPE", m, "text"); switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_POINTS : if (!_cups_strncasecmp(option->defchoice, "Custom.", 7)) { units = option->defchoice + strlen(option->defchoice) - 2; if (strcmp(units, "mm") && strcmp(units, "cm") && strcmp(units, "in") && strcmp(units, "ft")) { if (units[1] == 'm') units ++; else units = "pt"; } } else units = "pt"; if (!strcmp(units, "mm")) snprintf(value, sizeof(value), "%g", cparam->current.custom_points / 72.0 * 25.4); else if (!strcmp(units, "cm")) snprintf(value, sizeof(value), "%g", cparam->current.custom_points / 72.0 * 2.54); else if (!strcmp(units, "in")) snprintf(value, sizeof(value), "%g", cparam->current.custom_points / 72.0); else if (!strcmp(units, "ft")) snprintf(value, sizeof(value), "%g", cparam->current.custom_points / 72.0 / 12.0); else if (!strcmp(units, "m")) snprintf(value, sizeof(value), "%g", cparam->current.custom_points / 72.0 * 0.0254); else snprintf(value, sizeof(value), "%g", cparam->current.custom_points); cgiSetArray("PARAMVALUE", m, value); break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_REAL : snprintf(value, sizeof(value), "%g", cparam->current.custom_real); cgiSetArray("PARAMVALUE", m, value); break; case PPD_CUSTOM_INT: snprintf(value, sizeof(value), "%d", cparam->current.custom_int); cgiSetArray("PARAMVALUE", m, value); break; case PPD_CUSTOM_PASSCODE: case PPD_CUSTOM_PASSWORD: if (cparam->current.custom_password) cgiSetArray("PARAMVALUE", m, cparam->current.custom_password); else cgiSetArray("PARAMVALUE", m, ""); cgiSetArray("INPUTTYPE", m, "password"); break; case PPD_CUSTOM_STRING: if (cparam->current.custom_string) cgiSetArray("PARAMVALUE", m, cparam->current.custom_string); else cgiSetArray("PARAMVALUE", m, ""); break; } } if (units) { cgiSetArray("PARAMS", m, "Units"); cgiSetArray("PARAMTEXT", m, cgiText(_("Units"))); cgiSetArray("PARAMVALUE", m, units); } } else cgiSetVariable("ISCUSTOM", "0"); switch (option->ui) { case PPD_UI_BOOLEAN : cgiCopyTemplateLang("option-boolean.tmpl"); break; case PPD_UI_PICKONE : cgiCopyTemplateLang("option-pickone.tmpl"); break; case PPD_UI_PICKMANY : cgiCopyTemplateLang("option-pickmany.tmpl"); break; } } cgiCopyTemplateLang("option-trailer.tmpl"); } } if ((attr = ippFindAttribute(response, "job-sheets-supported", IPP_TAG_ZERO)) != NULL) { /* * Add the job sheets options... */ cgiSetVariable("GROUP_ID", "CUPS_BANNERS"); cgiSetVariable("GROUP", cgiText(_("Banners"))); cgiCopyTemplateLang("option-header.tmpl"); cgiSetSize("CHOICES", attr->num_values); cgiSetSize("TEXT", attr->num_values); for (k = 0; k < attr->num_values; k ++) { cgiSetArray("CHOICES", k, attr->values[k].string.text); cgiSetArray("TEXT", k, attr->values[k].string.text); } attr = ippFindAttribute(response, "job-sheets-default", IPP_TAG_ZERO); cgiSetVariable("KEYWORD", "job_sheets_start"); cgiSetVariable("KEYTEXT", /* TRANSLATORS: Banner/cover sheet before the print job. */ cgiText(_("Starting Banner"))); cgiSetVariable("DEFCHOICE", attr != NULL ? attr->values[0].string.text : ""); cgiCopyTemplateLang("option-pickone.tmpl"); cgiSetVariable("KEYWORD", "job_sheets_end"); cgiSetVariable("KEYTEXT", /* TRANSLATORS: Banner/cover sheet after the print job. */ cgiText(_("Ending Banner"))); cgiSetVariable("DEFCHOICE", attr != NULL && attr->num_values > 1 ? attr->values[1].string.text : ""); cgiCopyTemplateLang("option-pickone.tmpl"); cgiCopyTemplateLang("option-trailer.tmpl"); } if (ippFindAttribute(response, "printer-error-policy-supported", IPP_TAG_ZERO) || ippFindAttribute(response, "printer-op-policy-supported", IPP_TAG_ZERO)) { /* * Add the error and operation policy options... */ cgiSetVariable("GROUP_ID", "CUPS_POLICIES"); cgiSetVariable("GROUP", cgiText(_("Policies"))); cgiCopyTemplateLang("option-header.tmpl"); /* * Error policy... */ attr = ippFindAttribute(response, "printer-error-policy-supported", IPP_TAG_ZERO); if (attr) { cgiSetSize("CHOICES", attr->num_values); cgiSetSize("TEXT", attr->num_values); for (k = 0; k < attr->num_values; k ++) { cgiSetArray("CHOICES", k, attr->values[k].string.text); cgiSetArray("TEXT", k, attr->values[k].string.text); } attr = ippFindAttribute(response, "printer-error-policy", IPP_TAG_ZERO); cgiSetVariable("KEYWORD", "printer_error_policy"); cgiSetVariable("KEYTEXT", cgiText(_("Error Policy"))); cgiSetVariable("DEFCHOICE", attr == NULL ? "" : attr->values[0].string.text); } cgiCopyTemplateLang("option-pickone.tmpl"); /* * Operation policy... */ attr = ippFindAttribute(response, "printer-op-policy-supported", IPP_TAG_ZERO); if (attr) { cgiSetSize("CHOICES", attr->num_values); cgiSetSize("TEXT", attr->num_values); for (k = 0; k < attr->num_values; k ++) { cgiSetArray("CHOICES", k, attr->values[k].string.text); cgiSetArray("TEXT", k, attr->values[k].string.text); } attr = ippFindAttribute(response, "printer-op-policy", IPP_TAG_ZERO); cgiSetVariable("KEYWORD", "printer_op_policy"); cgiSetVariable("KEYTEXT", cgiText(_("Operation Policy"))); cgiSetVariable("DEFCHOICE", attr == NULL ? "" : attr->values[0].string.text); cgiCopyTemplateLang("option-pickone.tmpl"); } cgiCopyTemplateLang("option-trailer.tmpl"); } /* * Binary protocol support... */ if ((attr = ippFindAttribute(response, "port-monitor-supported", IPP_TAG_NAME)) != NULL && attr->num_values > 1) { cgiSetVariable("GROUP_ID", "CUPS_PORT_MONITOR"); cgiSetVariable("GROUP", cgiText(_("Port Monitor"))); cgiSetSize("CHOICES", attr->num_values); cgiSetSize("TEXT", attr->num_values); for (i = 0; i < attr->num_values; i ++) { cgiSetArray("CHOICES", i, attr->values[i].string.text); cgiSetArray("TEXT", i, attr->values[i].string.text); } attr = ippFindAttribute(response, "port-monitor", IPP_TAG_NAME); cgiSetVariable("KEYWORD", "port_monitor"); cgiSetVariable("KEYTEXT", cgiText(_("Port Monitor"))); cgiSetVariable("DEFCHOICE", attr ? attr->values[0].string.text : "none"); cgiCopyTemplateLang("option-header.tmpl"); cgiCopyTemplateLang("option-pickone.tmpl"); cgiCopyTemplateLang("option-trailer.tmpl"); } cgiCopyTemplateLang("set-printer-options-trailer.tmpl"); cgiEndHTML(); ippDelete(response); } else { /* * Set default options... */ fputs("DEBUG: Setting options...\n", stderr); if (filename) { out = cupsTempFile2(tempfile, sizeof(tempfile)); in = cupsFileOpen(filename, "r"); if (!in || !out) { cgiSetVariable("ERROR", strerror(errno)); cgiStartHTML(cgiText(_("Set Printer Options"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); if (in) cupsFileClose(in); if (out) { cupsFileClose(out); unlink(tempfile); } unlink(filename); return; } while (cupsFileGets(in, line, sizeof(line))) { if (!strncmp(line, "*cupsProtocol:", 14)) continue; else if (strncmp(line, "*Default", 8)) cupsFilePrintf(out, "%s\n", line); else { /* * Get default option name... */ strlcpy(keyword, line + 8, sizeof(keyword)); for (keyptr = keyword; *keyptr; keyptr ++) if (*keyptr == ':' || isspace(*keyptr & 255)) break; *keyptr = '\0'; if (!strcmp(keyword, "PageRegion") || !strcmp(keyword, "PaperDimension") || !strcmp(keyword, "ImageableArea")) var = get_option_value(ppd, "PageSize", value, sizeof(value)); else var = get_option_value(ppd, keyword, value, sizeof(value)); if (!var) cupsFilePrintf(out, "%s\n", line); else cupsFilePrintf(out, "*Default%s: %s\n", keyword, var); } } cupsFileClose(in); cupsFileClose(out); } else { /* * Make sure temporary filename is cleared when there is no PPD... */ tempfile[0] = '\0'; } /* * Build a CUPS_ADD_MODIFY_CLASS/PRINTER request, which requires the * following attributes: * * attributes-charset * attributes-natural-language * printer-uri * job-sheets-default * printer-error-policy * printer-op-policy * [ppd file] */ request = ippNewRequest(is_class ? CUPS_ADD_MODIFY_CLASS : CUPS_ADD_MODIFY_PRINTER); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "job-sheets-default", 2, NULL, NULL); ippSetString(request, &attr, 0, cgiGetVariable("job_sheets_start")); ippSetString(request, &attr, 1, cgiGetVariable("job_sheets_end")); if ((var = cgiGetVariable("printer_error_policy")) != NULL) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-error-policy", NULL, var); if ((var = cgiGetVariable("printer_op_policy")) != NULL) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-op-policy", NULL, var); if ((var = cgiGetVariable("port_monitor")) != NULL) ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor", NULL, var); /* * Do the request and get back a response... */ if (filename) ippDelete(cupsDoFileRequest(http, request, "/admin/", tempfile)); else ippDelete(cupsDoRequest(http, request, "/admin/")); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(_("Unable to set options")); } else { /* * Redirect successful updates back to the printer page... */ char refresh[1024]; /* Refresh URL */ cgiFormEncode(uri, printer, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=/%s/%s", is_class ? "classes" : "printers", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); cgiCopyTemplateLang("printer-configured.tmpl"); } cgiEndHTML(); if (filename) unlink(tempfile); } if (filename) unlink(filename); } /* * 'do_set_sharing()' - Set printer-is-shared value. */ static void do_set_sharing(http_t *http) /* I - HTTP connection */ { ipp_t *request, /* IPP request */ *response; /* IPP response */ char uri[HTTP_MAX_URI]; /* Printer URI */ const char *printer, /* Printer name */ *is_class, /* Is a class? */ *shared; /* Sharing value */ is_class = cgiGetVariable("IS_CLASS"); printer = cgiGetVariable("PRINTER_NAME"); shared = cgiGetVariable("SHARED"); if (!printer || !shared) { cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); cgiStartHTML(cgiText(_("Set Publishing"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return; } /* * Build a CUPS-Add-Printer/CUPS-Add-Class request, which requires the * following attributes: * * attributes-charset * attributes-natural-language * printer-uri * printer-is-shared */ request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", (char)atoi(shared)); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/admin/")) != NULL) { cgiSetIPPVars(response, NULL, NULL, NULL, 0); ippDelete(response); } if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(cgiText(_("Set Publishing"))); cgiShowIPPError(_("Unable to change printer-is-shared attribute")); } else { /* * Redirect successful updates back to the printer page... */ char url[1024], /* Printer/class URL */ refresh[1024]; /* Refresh URL */ cgiRewriteURL(uri, url, sizeof(url), NULL); cgiFormEncode(uri, url, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(cgiText(_("Set Publishing"))); cgiCopyTemplateLang(is_class ? "class-modified.tmpl" : "printer-modified.tmpl"); } cgiEndHTML(); } /* * 'get_option_value()' - Return the value of an option. * * This function also handles generation of custom option values. */ static char * /* O - Value string or NULL on error */ get_option_value( ppd_file_t *ppd, /* I - PPD file */ const char *name, /* I - Option name */ char *buffer, /* I - String buffer */ size_t bufsize) /* I - Size of buffer */ { char *bufptr, /* Pointer into buffer */ *bufend; /* End of buffer */ ppd_coption_t *coption; /* Custom option */ ppd_cparam_t *cparam; /* Current custom parameter */ char keyword[256]; /* Parameter name */ const char *val, /* Parameter value */ *uval; /* Units value */ long integer; /* Integer value */ double number, /* Number value */ number_points; /* Number in points */ /* * See if we have a custom option choice... */ if ((val = cgiGetVariable(name)) == NULL) { /* * Option not found! */ return (NULL); } else if (_cups_strcasecmp(val, "Custom") || (coption = ppdFindCustomOption(ppd, name)) == NULL) { /* * Not a custom choice... */ strlcpy(buffer, val, bufsize); return (buffer); } /* * OK, we have a custom option choice, format it... */ *buffer = '\0'; if (!strcmp(coption->keyword, "PageSize")) { const char *lval; /* Length string value */ double width, /* Width value */ width_points, /* Width in points */ length, /* Length value */ length_points; /* Length in points */ val = cgiGetVariable("PageSize.Width"); lval = cgiGetVariable("PageSize.Height"); uval = cgiGetVariable("PageSize.Units"); if (!val || !lval || !uval || (width = strtod(val, NULL)) == 0.0 || (length = strtod(lval, NULL)) == 0.0 || (strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") && strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) return (NULL); width_points = get_points(width, uval); length_points = get_points(length, uval); if (width_points < ppd->custom_min[0] || width_points > ppd->custom_max[0] || length_points < ppd->custom_min[1] || length_points > ppd->custom_max[1]) return (NULL); snprintf(buffer, bufsize, "Custom.%gx%g%s", width, length, uval); } else if (cupsArrayCount(coption->params) == 1) { cparam = ppdFirstCustomParam(coption); snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, cparam->name); if ((val = cgiGetVariable(keyword)) == NULL) return (NULL); switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_REAL : if ((number = strtod(val, NULL)) == 0.0 || number < cparam->minimum.custom_real || number > cparam->maximum.custom_real) return (NULL); snprintf(buffer, bufsize, "Custom.%g", number); break; case PPD_CUSTOM_INT : if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN || integer == LONG_MAX || integer < cparam->minimum.custom_int || integer > cparam->maximum.custom_int) return (NULL); snprintf(buffer, bufsize, "Custom.%ld", integer); break; case PPD_CUSTOM_POINTS : snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword); if ((number = strtod(val, NULL)) == 0.0 || (uval = cgiGetVariable(keyword)) == NULL || (strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") && strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) return (NULL); number_points = get_points(number, uval); if (number_points < cparam->minimum.custom_points || number_points > cparam->maximum.custom_points) return (NULL); snprintf(buffer, bufsize, "Custom.%g%s", number, uval); break; case PPD_CUSTOM_PASSCODE : for (uval = val; *uval; uval ++) if (!isdigit(*uval & 255)) return (NULL); case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : integer = (long)strlen(val); if (integer < cparam->minimum.custom_string || integer > cparam->maximum.custom_string) return (NULL); snprintf(buffer, bufsize, "Custom.%s", val); break; } } else { const char *prefix = "{"; /* Prefix string */ bufptr = buffer; bufend = buffer + bufsize; for (cparam = ppdFirstCustomParam(coption); cparam; cparam = ppdNextCustomParam(coption)) { snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, cparam->name); if ((val = cgiGetVariable(keyword)) == NULL) return (NULL); snprintf(bufptr, (size_t)(bufend - bufptr), "%s%s=", prefix, cparam->name); bufptr += strlen(bufptr); prefix = " "; switch (cparam->type) { case PPD_CUSTOM_UNKNOWN : break; case PPD_CUSTOM_CURVE : case PPD_CUSTOM_INVCURVE : case PPD_CUSTOM_REAL : if ((number = strtod(val, NULL)) == 0.0 || number < cparam->minimum.custom_real || number > cparam->maximum.custom_real) return (NULL); snprintf(bufptr, (size_t)(bufend - bufptr), "%g", number); break; case PPD_CUSTOM_INT : if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN || integer == LONG_MAX || integer < cparam->minimum.custom_int || integer > cparam->maximum.custom_int) return (NULL); snprintf(bufptr, (size_t)(bufend - bufptr), "%ld", integer); break; case PPD_CUSTOM_POINTS : snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword); if ((number = strtod(val, NULL)) == 0.0 || (uval = cgiGetVariable(keyword)) == NULL || (strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") && strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) return (NULL); number_points = get_points(number, uval); if (number_points < cparam->minimum.custom_points || number_points > cparam->maximum.custom_points) return (NULL); snprintf(bufptr, (size_t)(bufend - bufptr), "%g%s", number, uval); break; case PPD_CUSTOM_PASSCODE : for (uval = val; *uval; uval ++) if (!isdigit(*uval & 255)) return (NULL); case PPD_CUSTOM_PASSWORD : case PPD_CUSTOM_STRING : integer = (long)strlen(val); if (integer < cparam->minimum.custom_string || integer > cparam->maximum.custom_string) return (NULL); if ((bufptr + 2) > bufend) return (NULL); bufend --; *bufptr++ = '\"'; while (*val && bufptr < bufend) { if (*val == '\\' || *val == '\"') { if ((bufptr + 1) >= bufend) return (NULL); *bufptr++ = '\\'; } *bufptr++ = *val++; } if (bufptr >= bufend) return (NULL); *bufptr++ = '\"'; *bufptr = '\0'; bufend ++; break; } bufptr += strlen(bufptr); } if (bufptr == buffer || (bufend - bufptr) < 2) return (NULL); memcpy(bufptr, "}", 2); } return (buffer); } /* * 'get_points()' - Get a value in points. */ static double /* O - Number in points */ get_points(double number, /* I - Original number */ const char *uval) /* I - Units */ { if (!strcmp(uval, "mm")) /* Millimeters */ return (number * 72.0 / 25.4); else if (!strcmp(uval, "cm")) /* Centimeters */ return (number * 72.0 / 2.54); else if (!strcmp(uval, "in")) /* Inches */ return (number * 72.0); else if (!strcmp(uval, "ft")) /* Feet */ return (number * 72.0 * 12.0); else if (!strcmp(uval, "m")) /* Meters */ return (number * 72.0 / 0.0254); else /* Points */ return (number); } /* * 'get_printer_ppd()' - Get an IPP Everywhere PPD file for the given URI. */ static char * /* O - Filename or NULL */ get_printer_ppd(const char *uri, /* I - Printer URI */ char *buffer, /* I - Filename buffer */ size_t bufsize) /* I - Size of filename buffer */ { http_t *http; /* Connection to printer */ ipp_t *request, /* Get-Printer-Attributes request */ *response; /* Get-Printer-Attributes response */ char resolved[1024], /* Resolved URI */ scheme[32], /* URI scheme */ userpass[256], /* Username:password */ host[256], /* Hostname */ resource[256]; /* Resource path */ int port; /* Port number */ static const char * const pattrs[] = /* Printer attributes we need */ { "all", "media-col-database" }; /* * Connect to the printer... */ if (strstr(uri, "._tcp")) { /* * Resolve URI... */ if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL)) { fprintf(stderr, "ERROR: Unable to resolve \"%s\".\n", uri); return (NULL); } uri = resolved; } if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { fprintf(stderr, "ERROR: Bad printer URI \"%s\".\n", uri); return (NULL); } http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL); if (!http) { fprintf(stderr, "ERROR: Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString()); return (NULL); } /* * Send a Get-Printer-Attributes request... */ request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); response = cupsDoRequest(http, request, resource); if (!_ppdCreateFromIPP(buffer, bufsize, response)) fprintf(stderr, "ERROR: Unable to create PPD file: %s\n", strerror(errno)); ippDelete(response); httpClose(http); if (buffer[0]) return (buffer); else return (NULL); } cups-2.3.1/cgi-bin/Dependencies000664 000765 000024 00000011007 13574721672 016417 0ustar00mikestaff000000 000000 help-index.o: help-index.c cgi-private.h cgi.h ../cups/cups.h \ ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \ ../cups/array.h ../cups/language.h ../cups/pwg.h help-index.h \ ../cups/debug-private.h ../cups/language-private.h ../config.h \ ../cups/transcode.h ../cups/string-private.h ../cups/ipp-private.h \ ../cups/dir.h html.o: html.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h ipp-var.o: ipp-var.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h search.o: search.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h template.o: template.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h var.o: var.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h admin.o: admin.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h ../cups/http-private.h \ ../cups/ppd-private.h ../cups/ppd.h ../cups/raster.h \ ../cups/pwg-private.h ../cups/adminutil.h classes.o: classes.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h help.o: help.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h jobs.o: jobs.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h makedocset.o: makedocset.c cgi-private.h cgi.h ../cups/cups.h \ ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \ ../cups/array.h ../cups/language.h ../cups/pwg.h help-index.h \ ../cups/debug-private.h ../cups/language-private.h ../config.h \ ../cups/transcode.h ../cups/string-private.h ../cups/ipp-private.h printers.o: printers.c cgi-private.h cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \ ../cups/language-private.h ../config.h ../cups/transcode.h \ ../cups/string-private.h ../cups/ipp-private.h testcgi.o: testcgi.c cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h testhi.o: testhi.c cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h testtemplate.o: testtemplate.c cgi.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h help-index.h cups-2.3.1/cgi-bin/template.c000664 000765 000024 00000034711 13574721672 016074 0ustar00mikestaff000000 000000 /* * CGI template function. * * Copyright 2007-2015 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #include "cgi-private.h" #include #include /* * Local functions... */ static void cgi_copy(FILE *out, FILE *in, int element, char term, int indent); static void cgi_puts(const char *s, FILE *out); static void cgi_puturi(const char *s, FILE *out); /* * 'cgiCopyTemplateFile()' - Copy a template file and replace all the * '{variable}' strings with the variable value. */ void cgiCopyTemplateFile(FILE *out, /* I - Output file */ const char *tmpl) /* I - Template file to read */ { FILE *in; /* Input file */ fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out, tmpl ? tmpl : "(null)"); /* * Range check input... */ if (!tmpl || !out) return; /* * Open the template file... */ if ((in = fopen(tmpl, "r")) == NULL) { fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n", tmpl ? tmpl : "(null)", strerror(errno)); return; } /* * Parse the file to the end... */ cgi_copy(out, in, 0, 0, 0); /* * Close the template file and return... */ fclose(in); } /* * 'cgiCopyTemplateLang()' - Copy a template file using a language... */ void cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */ { char filename[1024], /* Filename */ locale[16], /* Locale name */ *locptr; /* Pointer into locale name */ const char *directory, /* Directory for templates */ *lang; /* Language */ FILE *in; /* Input file */ fprintf(stderr, "DEBUG2: cgiCopyTemplateLang(tmpl=\"%s\")\n", tmpl ? tmpl : "(null)"); /* * Convert the language to a locale name... */ locale[0] = '\0'; if ((lang = getenv("LANG")) != NULL) { locale[0] = '/'; strlcpy(locale + 1, lang, sizeof(locale) - 1); if ((locptr = strchr(locale, '.')) != NULL) *locptr = '\0'; /* Strip charset */ } fprintf(stderr, "DEBUG2: lang=\"%s\", locale=\"%s\"...\n", lang ? lang : "(null)", locale); /* * See if we have a template file for this language... */ directory = cgiGetTemplateDir(); snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl); if ((in = fopen(filename, "r")) == NULL) { locale[3] = '\0'; snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl); if ((in = fopen(filename, "r")) == NULL) { snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl); in = fopen(filename, "r"); } } fprintf(stderr, "DEBUG2: Template file is \"%s\"...\n", filename); /* * Open the template file... */ if (!in) { fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n", filename, strerror(errno)); return; } /* * Parse the file to the end... */ cgi_copy(stdout, in, 0, 0, 0); /* * Close the template file and return... */ fclose(in); } /* * 'cgiGetTemplateDir()' - Get the templates directory... */ char * /* O - Template directory */ cgiGetTemplateDir(void) { const char *datadir; /* CUPS_DATADIR env var */ static char templates[1024] = ""; /* Template directory */ if (!templates[0]) { /* * Build the template directory pathname... */ if ((datadir = getenv("CUPS_DATADIR")) == NULL) datadir = CUPS_DATADIR; snprintf(templates, sizeof(templates), "%s/templates", datadir); } return (templates); } /* * 'cgiSetServerVersion()' - Set the server name and CUPS version... */ void cgiSetServerVersion(void) { cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME")); cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER")); cgiSetVariable("CUPS_VERSION", CUPS_SVERSION); #ifdef LC_TIME setlocale(LC_TIME, ""); #endif /* LC_TIME */ } /* * 'cgi_copy()' - Copy the template file, substituting as needed... */ static void cgi_copy(FILE *out, /* I - Output file */ FILE *in, /* I - Input file */ int element, /* I - Element number (0 to N) */ char term, /* I - Terminating character */ int indent) /* I - Debug info indentation */ { int ch; /* Character from file */ char op; /* Operation */ char name[255], /* Name of variable */ *nameptr, /* Pointer into name */ innername[255], /* Inner comparison name */ *innerptr, /* Pointer into inner name */ *s; /* String pointer */ const char *value; /* Value of variable */ const char *innerval; /* Inner value */ const char *outptr; /* Output string pointer */ char outval[1024], /* Formatted output string */ compare[1024]; /* Comparison string */ int result; /* Result of comparison */ int uriencode; /* Encode as URI */ regex_t re; /* Regular expression to match */ fprintf(stderr, "DEBUG2: %*sStarting at file position %ld...\n", indent, "", ftell(in)); /* * Parse the file to the end... */ while ((ch = getc(in)) != EOF) if (ch == term) break; else if (ch == '{') { /* * Get a variable name... */ uriencode = 0; for (s = name; (ch = getc(in)) != EOF;) if (strchr("}]<>=!~ \t\n", ch)) break; else if (s == name && ch == '%') uriencode = 1; else if (s > name && ch == '?') break; else if (s < (name + sizeof(name) - 1)) *s++ = (char)ch; *s = '\0'; if (s == name && isspace(ch & 255)) { fprintf(stderr, "DEBUG2: %*sLone { at %ld...\n", indent, "", ftell(in)); if (out) { putc('{', out); putc(ch, out); } continue; } if (ch == '}') fprintf(stderr, "DEBUG2: %*s\"{%s}\" at %ld...\n", indent, "", name, ftell(in)); /* * See if it has a value... */ if (name[0] == '?') { /* * Insert value only if it exists... */ if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1] & 255)) { *nameptr++ = '\0'; if ((value = cgiGetArray(name + 1, atoi(nameptr) - 1)) != NULL) outptr = value; else { outval[0] = '\0'; outptr = outval; } } else if ((value = cgiGetArray(name + 1, element)) != NULL) outptr = value; else { outval[0] = '\0'; outptr = outval; } } else if (name[0] == '#') { /* * Insert count... */ if (name[1]) sprintf(outval, "%d", cgiGetSize(name + 1)); else sprintf(outval, "%d", element + 1); outptr = outval; } else if (name[0] == '[') { /* * Loop for # of elements... */ int i; /* Looping var */ long pos; /* File position */ int count; /* Number of elements */ if (isdigit(name[1] & 255)) count = atoi(name + 1); else count = cgiGetSize(name + 1); pos = ftell(in); fprintf(stderr, "DEBUG2: %*sLooping on \"%s\" at %ld, count=%d...\n", indent, "", name + 1, pos, count); if (count > 0) { for (i = 0; i < count; i ++) { if (i) fseek(in, pos, SEEK_SET); cgi_copy(out, in, i, '}', indent + 2); } } else cgi_copy(NULL, in, 0, '}', indent + 2); fprintf(stderr, "DEBUG2: %*sFinished looping on \"%s\"...\n", indent, "", name + 1); continue; } else if (name[0] == '$') { /* * Insert cookie value or nothing if not defined. */ if ((value = cgiGetCookie(name + 1)) != NULL) outptr = value; else { outval[0] = '\0'; outptr = outval; } } else { /* * Insert variable or variable name (if element is NULL)... */ if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1] & 255)) { *nameptr++ = '\0'; if ((value = cgiGetArray(name, atoi(nameptr) - 1)) == NULL) { snprintf(outval, sizeof(outval), "{%s}", name); outptr = outval; } else outptr = value; } else if ((value = cgiGetArray(name, element)) == NULL) { snprintf(outval, sizeof(outval), "{%s}", name); outptr = outval; } else outptr = value; } /* * See if the terminating character requires another test... */ if (ch == '}') { /* * End of substitution... */ if (out) { if (uriencode) cgi_puturi(outptr, out); else if (!_cups_strcasecmp(name, "?cupsdconf_default")) fputs(outptr, stdout); else cgi_puts(outptr, out); } continue; } /* * OK, process one of the following checks: * * {name?exist:not-exist} Exists? * {name=value?true:false} Equal * {namevalue?true:false} Greater than * {name!value?true:false} Not equal * {name~refex?true:false} Regex match */ op = (char)ch; if (ch == '?') { /* * Test for existance... */ if (name[0] == '?') result = cgiGetArray(name + 1, element) != NULL; else if (name[0] == '#') result = cgiGetVariable(name + 1) != NULL; else result = cgiGetArray(name, element) != NULL; result = result && outptr[0]; compare[0] = '\0'; } else { /* * Compare to a string... */ for (s = compare; (ch = getc(in)) != EOF;) if (ch == '?') break; else if (s >= (compare + sizeof(compare) - 1)) continue; else if (ch == '#') { sprintf(s, "%d", element + 1); s += strlen(s); } else if (ch == '{') { /* * Grab the value of a variable... */ innerptr = innername; while ((ch = getc(in)) != EOF && ch != '}') if (innerptr < (innername + sizeof(innername) - 1)) *innerptr++ = (char)ch; *innerptr = '\0'; if (innername[0] == '#') sprintf(s, "%d", cgiGetSize(innername + 1)); else if ((innerptr = strrchr(innername, '-')) != NULL && isdigit(innerptr[1] & 255)) { *innerptr++ = '\0'; if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL) *s = '\0'; else strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare)); } else if (innername[0] == '?') { if ((innerval = cgiGetArray(innername + 1, element)) == NULL) *s = '\0'; else strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare)); } else if ((innerval = cgiGetArray(innername, element)) == NULL) snprintf(s, sizeof(compare) - (size_t)(s - compare), "{%s}", innername); else strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare)); s += strlen(s); } else if (ch == '\\') *s++ = (char)getc(in); else *s++ = (char)ch; *s = '\0'; if (ch != '?') { fprintf(stderr, "DEBUG2: %*sBad terminator '%c' at file position %ld...\n", indent, "", ch, ftell(in)); return; } /* * Do the comparison... */ switch (op) { case '<' : result = _cups_strcasecmp(outptr, compare) < 0; break; case '>' : result = _cups_strcasecmp(outptr, compare) > 0; break; case '=' : result = _cups_strcasecmp(outptr, compare) == 0; break; case '!' : result = _cups_strcasecmp(outptr, compare) != 0; break; case '~' : fprintf(stderr, "DEBUG: Regular expression \"%s\"\n", compare); if (regcomp(&re, compare, REG_EXTENDED | REG_ICASE)) { fprintf(stderr, "ERROR: Unable to compile regular expression \"%s\"!\n", compare); result = 0; } else { regmatch_t matches[10]; result = 0; if (!regexec(&re, outptr, 10, matches, 0)) { int i; for (i = 0; i < 10; i ++) { fprintf(stderr, "DEBUG: matches[%d].rm_so=%d\n", i, (int)matches[i].rm_so); if (matches[i].rm_so < 0) break; result ++; } } regfree(&re); } break; default : result = 1; break; } } fprintf(stderr, "DEBUG2: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n", indent, "", name, op, compare, ftell(in), result); if (result) { /* * Comparison true; output first part and ignore second... */ fprintf(stderr, "DEBUG2: %*sOutput first part...\n", indent, ""); cgi_copy(out, in, element, ':', indent + 2); fprintf(stderr, "DEBUG2: %*sSkip second part...\n", indent, ""); cgi_copy(NULL, in, element, '}', indent + 2); } else { /* * Comparison false; ignore first part and output second... */ fprintf(stderr, "DEBUG2: %*sSkip first part...\n", indent, ""); cgi_copy(NULL, in, element, ':', indent + 2); fprintf(stderr, "DEBUG2: %*sOutput second part...\n", indent, ""); cgi_copy(out, in, element, '}', indent + 2); } fprintf(stderr, "DEBUG2: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "", name, op, compare, out); } else if (ch == '\\') /* Quoted char */ { if (out) putc(getc(in), out); else getc(in); } else if (out) putc(ch, out); if (ch == EOF) fprintf(stderr, "DEBUG2: %*sReturning at file position %ld on EOF...\n", indent, "", ftell(in)); else fprintf(stderr, "DEBUG2: %*sReturning at file position %ld on character '%c'...\n", indent, "", ftell(in), ch); if (ch == EOF && term) fprintf(stderr, "ERROR: %*sSaw EOF, expected '%c'!\n", indent, "", term); /* * Flush any pending output... */ if (out) fflush(out); } /* * 'cgi_puts()' - Put a string to the output file, quoting as needed... */ static void cgi_puts(const char *s, /* I - String to output */ FILE *out) /* I - Output file */ { while (*s) { if (*s == '<') fputs("<", out); else if (*s == '>') fputs(">", out); else if (*s == '\"') fputs(""", out); else if (*s == '\'') fputs("'", out); else if (*s == '&') fputs("&", out); else putc(*s, out); s ++; } } /* * 'cgi_puturi()' - Put a URI string to the output file, quoting as needed... */ static void cgi_puturi(const char *s, /* I - String to output */ FILE *out) /* I - Output file */ { while (*s) { if (strchr("%@&+ <>#=", *s) || *s < ' ' || *s & 128) fprintf(out, "%%%02X", *s & 255); else putc(*s, out); s ++; } } cups-2.3.1/cgi-bin/help-index.c000664 000765 000024 00000060010 13574721672 016305 0ustar00mikestaff000000 000000 /* * Online help index routines for CUPS. * * 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 * information. */ /* * Include necessary headers... */ #include "cgi-private.h" #include /* * List of common English words that should not be indexed... */ static char help_common_words[][6] = { "about", "all", "an", "and", "are", "as", "at", "be", "been", "but", "by", "call", "can", "come", "could", "day", "did", "do", "down", "each", "find", "first", "for", "from", "go", "had", "has", "have", "he", "her", "him", "his", "hot", "how", "if", "in", "is", "it", "know", "like", "long", "look", "make", "many", "may", "more", "most", "my", "no", "now", "of", "on", "one", "or", "other", "out", "over", "said", "see", "she", "side", "so", "some", "sound", "than", "that", "the", "their", "them", "then", "there", "these", "they", "thing", "this", "time", "to", "two", "up", "use", "was", "water", "way", "we", "were", "what", "when", "which", "who", "will", "with", "word", "would", "write", "you", "your" }; /* * Local functions... */ static help_word_t *help_add_word(help_node_t *n, const char *text); static void help_delete_node(help_node_t *n); static void help_delete_word(help_word_t *w); static int help_load_directory(help_index_t *hi, const char *directory, const char *relative); static int help_load_file(help_index_t *hi, const char *filename, const char *relative, time_t mtime); static help_node_t *help_new_node(const char *filename, const char *anchor, const char *section, const char *text, time_t mtime, off_t offset, size_t length) _CUPS_NONNULL(1,3,4); static int help_sort_by_name(help_node_t *p1, help_node_t *p2); static int help_sort_by_score(help_node_t *p1, help_node_t *p2); static int help_sort_words(help_word_t *w1, help_word_t *w2); /* * 'helpDeleteIndex()' - Delete an index, freeing all memory used. */ void helpDeleteIndex(help_index_t *hi) /* I - Help index */ { help_node_t *node; /* Current node */ if (!hi) return; for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) { if (!hi->search) help_delete_node(node); } cupsArrayDelete(hi->nodes); cupsArrayDelete(hi->sorted); free(hi); } /* * 'helpFindNode()' - Find a node in an index. */ help_node_t * /* O - Node pointer or NULL */ helpFindNode(help_index_t *hi, /* I - Index */ const char *filename, /* I - Filename */ const char *anchor) /* I - Anchor */ { help_node_t key; /* Search key */ /* * Range check input... */ if (!hi || !filename) return (NULL); /* * Initialize the search key... */ key.filename = (char *)filename; key.anchor = (char *)anchor; /* * Return any match... */ return ((help_node_t *)cupsArrayFind(hi->nodes, &key)); } /* * 'helpLoadIndex()' - Load a help index from disk. */ help_index_t * /* O - Index pointer or NULL */ helpLoadIndex(const char *hifile, /* I - Index filename */ const char *directory) /* I - Directory that is indexed */ { help_index_t *hi; /* Help index */ cups_file_t *fp; /* Current file */ char line[2048], /* Line from file */ *ptr, /* Pointer into line */ *filename, /* Filename in line */ *anchor, /* Anchor in line */ *sectptr, /* Section pointer in line */ section[1024], /* Section name */ *text; /* Text in line */ time_t mtime; /* Modification time */ off_t offset; /* Offset into file */ size_t length; /* Length in bytes */ int update; /* Update? */ help_node_t *node; /* Current node */ help_word_t *word; /* Current word */ /* * Create a new, empty index. */ if ((hi = (help_index_t *)calloc(1, sizeof(help_index_t))) == NULL) return (NULL); hi->nodes = cupsArrayNew((cups_array_func_t)help_sort_by_name, NULL); hi->sorted = cupsArrayNew((cups_array_func_t)help_sort_by_score, NULL); if (!hi->nodes || !hi->sorted) { cupsArrayDelete(hi->nodes); cupsArrayDelete(hi->sorted); free(hi); return (NULL); } /* * Try loading the existing index file... */ if ((fp = cupsFileOpen(hifile, "r")) != NULL) { /* * Lock the file and then read the first line... */ cupsFileLock(fp, 1); if (cupsFileGets(fp, line, sizeof(line)) && !strcmp(line, "HELPV2")) { /* * Got a valid header line, now read the data lines... */ node = NULL; while (cupsFileGets(fp, line, sizeof(line))) { /* * Each line looks like one of the following: * * filename mtime offset length "section" "text" * filename#anchor offset length "text" * SP count word */ if (line[0] == ' ') { /* * Read a word in the current node... */ if (!node || (ptr = strrchr(line, ' ')) == NULL) continue; if ((word = help_add_word(node, ptr + 1)) != NULL) word->count = atoi(line + 1); } else { /* * Add a node... */ filename = line; if ((ptr = strchr(line, ' ')) == NULL) break; while (isspace(*ptr & 255)) *ptr++ = '\0'; if ((anchor = strrchr(filename, '#')) != NULL) { *anchor++ = '\0'; mtime = 0; } else mtime = strtol(ptr, &ptr, 10); offset = strtoll(ptr, &ptr, 10); length = (size_t)strtoll(ptr, &ptr, 10); while (isspace(*ptr & 255)) ptr ++; if (!anchor) { /* * Get section... */ if (*ptr != '\"') break; ptr ++; sectptr = ptr; while (*ptr && *ptr != '\"') ptr ++; if (*ptr != '\"') break; *ptr++ = '\0'; strlcpy(section, sectptr, sizeof(section)); while (isspace(*ptr & 255)) ptr ++; } else section[0] = '\0'; if (*ptr != '\"') break; ptr ++; text = ptr; while (*ptr && *ptr != '\"') ptr ++; if (*ptr != '\"') break; *ptr++ = '\0'; if ((node = help_new_node(filename, anchor, section, text, mtime, offset, length)) == NULL) break; node->score = -1; cupsArrayAdd(hi->nodes, node); } } } cupsFileClose(fp); } /* * Scan for new/updated files... */ update = help_load_directory(hi, directory, NULL); /* * Remove any files that are no longer installed... */ for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) if (node->score < 0) { /* * Delete this node... */ cupsArrayRemove(hi->nodes, node); help_delete_node(node); } /* * Add nodes to the sorted array... */ for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) cupsArrayAdd(hi->sorted, node); /* * Save the index if we updated it... */ if (update) helpSaveIndex(hi, hifile); /* * Return the index... */ return (hi); } /* * 'helpSaveIndex()' - Save a help index to disk. */ int /* O - 0 on success, -1 on error */ helpSaveIndex(help_index_t *hi, /* I - Index */ const char *hifile) /* I - Index filename */ { cups_file_t *fp; /* Index file */ help_node_t *node; /* Current node */ help_word_t *word; /* Current word */ /* * Try creating a new index file... */ if ((fp = cupsFileOpen(hifile, "w9")) == NULL) return (-1); /* * Lock the file while we write it... */ cupsFileLock(fp, 1); cupsFilePuts(fp, "HELPV2\n"); for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) { /* * Write the current node with/without the anchor... */ if (node->anchor) { if (cupsFilePrintf(fp, "%s#%s " CUPS_LLFMT " " CUPS_LLFMT " \"%s\"\n", node->filename, node->anchor, CUPS_LLCAST node->offset, CUPS_LLCAST node->length, node->text) < 0) break; } else { if (cupsFilePrintf(fp, "%s %d " CUPS_LLFMT " " CUPS_LLFMT " \"%s\" \"%s\"\n", node->filename, (int)node->mtime, CUPS_LLCAST node->offset, CUPS_LLCAST node->length, node->section ? node->section : "", node->text) < 0) break; } /* * Then write the words associated with the node... */ for (word = (help_word_t *)cupsArrayFirst(node->words); word; word = (help_word_t *)cupsArrayNext(node->words)) if (cupsFilePrintf(fp, " %d %s\n", word->count, word->text) < 0) break; } cupsFileFlush(fp); if (cupsFileClose(fp) < 0) return (-1); else if (node) return (-1); else return (0); } /* * 'helpSearchIndex()' - Search an index. */ help_index_t * /* O - Search index */ helpSearchIndex(help_index_t *hi, /* I - Index */ const char *query, /* I - Query string */ const char *section, /* I - Limit search to this section */ const char *filename) /* I - Limit search to this file */ { help_index_t *search; /* Search index */ help_node_t *node; /* Current node */ help_word_t *word; /* Current word */ void *sc; /* Search context */ int matches; /* Number of matches */ /* * Range check... */ if (!hi || !query) return (NULL); /* * Reset the scores of all nodes to 0... */ for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) node->score = 0; /* * Find the first node to search in... */ if (filename) { node = helpFindNode(hi, filename, NULL); if (!node) return (NULL); } else node = (help_node_t *)cupsArrayFirst(hi->nodes); /* * Convert the query into a regular expression... */ sc = cgiCompileSearch(query); if (!sc) return (NULL); /* * Allocate a search index... */ search = calloc(1, sizeof(help_index_t)); if (!search) { cgiFreeSearch(sc); return (NULL); } search->nodes = cupsArrayNew((cups_array_func_t)help_sort_by_name, NULL); search->sorted = cupsArrayNew((cups_array_func_t)help_sort_by_score, NULL); if (!search->nodes || !search->sorted) { cupsArrayDelete(search->nodes); cupsArrayDelete(search->sorted); free(search); cgiFreeSearch(sc); return (NULL); } search->search = 1; /* * Check each node in the index, adding matching nodes to the * search index... */ for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes)) if (section && strcmp(node->section, section)) continue; else if (filename && strcmp(node->filename, filename)) continue; else { matches = cgiDoSearch(sc, node->text); for (word = (help_word_t *)cupsArrayFirst(node->words); word; word = (help_word_t *)cupsArrayNext(node->words)) if (cgiDoSearch(sc, word->text) > 0) matches += word->count; if (matches > 0) { /* * Found a match, add the node to the search index... */ node->score = matches; cupsArrayAdd(search->nodes, node); cupsArrayAdd(search->sorted, node); } } /* * Free the search context... */ cgiFreeSearch(sc); /* * Return the results... */ return (search); } /* * 'help_add_word()' - Add a word to a node. */ static help_word_t * /* O - New word */ help_add_word(help_node_t *n, /* I - Node */ const char *text) /* I - Word text */ { help_word_t *w, /* New word */ key; /* Search key */ /* * Create the words array as needed... */ if (!n->words) n->words = cupsArrayNew((cups_array_func_t)help_sort_words, NULL); /* * See if the word is already added... */ key.text = (char *)text; if ((w = (help_word_t *)cupsArrayFind(n->words, &key)) == NULL) { /* * Create a new word... */ if ((w = calloc(1, sizeof(help_word_t))) == NULL) return (NULL); if ((w->text = strdup(text)) == NULL) { free(w); return (NULL); } cupsArrayAdd(n->words, w); } /* * Bump the counter for this word and return it... */ w->count ++; return (w); } /* * 'help_delete_node()' - Free all memory used by a node. */ static void help_delete_node(help_node_t *n) /* I - Node */ { help_word_t *w; /* Current word */ if (!n) return; if (n->filename) free(n->filename); if (n->anchor) free(n->anchor); if (n->section) free(n->section); if (n->text) free(n->text); for (w = (help_word_t *)cupsArrayFirst(n->words); w; w = (help_word_t *)cupsArrayNext(n->words)) help_delete_word(w); cupsArrayDelete(n->words); free(n); } /* * 'help_delete_word()' - Free all memory used by a word. */ static void help_delete_word(help_word_t *w) /* I - Word */ { if (!w) return; if (w->text) free(w->text); free(w); } /* * 'help_load_directory()' - Load a directory of files into an index. */ static int /* O - 0 = success, -1 = error, 1 = updated */ help_load_directory( help_index_t *hi, /* I - Index */ const char *directory, /* I - Directory */ const char *relative) /* I - Relative path */ { cups_dir_t *dir; /* Directory file */ cups_dentry_t *dent; /* Directory entry */ char *ext, /* Pointer to extension */ filename[1024], /* Full filename */ relname[1024]; /* Relative filename */ int update; /* Updated? */ help_node_t *node; /* Current node */ /* * Open the directory and scan it... */ if ((dir = cupsDirOpen(directory)) == NULL) return (0); update = 0; while ((dent = cupsDirRead(dir)) != NULL) { /* * Skip "." files... */ if (dent->filename[0] == '.') continue; /* * Get absolute and relative filenames... */ snprintf(filename, sizeof(filename), "%s/%s", directory, dent->filename); if (relative) snprintf(relname, sizeof(relname), "%s/%s", relative, dent->filename); else strlcpy(relname, dent->filename, sizeof(relname)); /* * Check if we have a HTML file... */ if ((ext = strstr(dent->filename, ".html")) != NULL && (!ext[5] || !strcmp(ext + 5, ".gz"))) { /* * HTML file, see if we have already indexed the file... */ if ((node = helpFindNode(hi, relname, NULL)) != NULL) { /* * File already indexed - check dates to confirm that the * index is up-to-date... */ if (node->mtime == dent->fileinfo.st_mtime) { /* * Same modification time, so mark all of the nodes * for this file as up-to-date... */ for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes)) if (!strcmp(node->filename, relname)) node->score = 0; else break; continue; } } update = 1; help_load_file(hi, filename, relname, dent->fileinfo.st_mtime); } else if (S_ISDIR(dent->fileinfo.st_mode)) { /* * Process sub-directory... */ if (help_load_directory(hi, filename, relname) == 1) update = 1; } } cupsDirClose(dir); return (update); } /* * 'help_load_file()' - Load a HTML files into an index. */ static int /* O - 0 = success, -1 = error */ help_load_file( help_index_t *hi, /* I - Index */ const char *filename, /* I - Filename */ const char *relative, /* I - Relative path */ time_t mtime) /* I - Modification time */ { cups_file_t *fp; /* HTML file */ help_node_t *node; /* Current node */ char line[1024], /* Line from file */ temp[1024], /* Temporary word */ section[1024], /* Section */ *ptr, /* Pointer into line */ *anchor, /* Anchor name */ *text; /* Text for anchor */ off_t offset; /* File offset */ char quote; /* Quote character */ help_word_t *word; /* Current word */ int wordlen; /* Length of word */ if ((fp = cupsFileOpen(filename, "r")) == NULL) return (-1); node = NULL; offset = 0; strlcpy(section, "Other", sizeof(section)); while (cupsFileGets(fp, line, sizeof(line))) { /* * Look for "", "<A NAME", or "<!-- SECTION:" prefix... */ if ((ptr = strstr(line, "<!-- SECTION:")) != NULL) { /* * Got section line, copy it! */ for (ptr += 13; isspace(*ptr & 255); ptr ++); strlcpy(section, ptr, sizeof(section)); if ((ptr = strstr(section, "-->")) != NULL) { /* * Strip comment stuff from end of line... */ for (*ptr-- = '\0'; ptr > line && isspace(*ptr & 255); *ptr-- = '\0'); if (isspace(*ptr & 255)) *ptr = '\0'; } continue; } for (ptr = line; (ptr = strchr(ptr, '<')) != NULL;) { ptr ++; if (!_cups_strncasecmp(ptr, "TITLE>", 6)) { /* * Found the title... */ anchor = NULL; ptr += 6; } else { char *idptr; /* Pointer to ID */ if (!_cups_strncasecmp(ptr, "A NAME=", 7)) ptr += 7; else if ((idptr = strstr(ptr, " ID=")) != NULL) ptr = idptr + 4; else if ((idptr = strstr(ptr, " id=")) != NULL) ptr = idptr + 4; else continue; /* * Found an anchor... */ if (*ptr == '\"' || *ptr == '\'') { /* * Get quoted anchor... */ quote = *ptr; anchor = ptr + 1; if ((ptr = strchr(anchor, quote)) != NULL) *ptr++ = '\0'; else break; } else { /* * Get unquoted anchor... */ anchor = ptr + 1; for (ptr = anchor; *ptr && *ptr != '>' && !isspace(*ptr & 255); ptr ++); if (*ptr != '>') *ptr++ = '\0'; else break; } /* * Got the anchor, now lets find the end... */ while (*ptr && *ptr != '>') ptr ++; if (*ptr != '>') break; *ptr++ = '\0'; } /* * Now collect text for the link... */ text = ptr; while ((ptr = strchr(text, '<')) == NULL) { ptr = text + strlen(text); if (ptr >= (line + sizeof(line) - 2)) break; *ptr++ = ' '; if (!cupsFileGets(fp, ptr, sizeof(line) - (size_t)(ptr - line) - 1)) break; } *ptr = '\0'; if (node) node->length = (size_t)(offset - node->offset); if (!*text) { node = NULL; break; } if ((node = helpFindNode(hi, relative, anchor)) != NULL) { /* * Node already in the index, so replace the text and other * data... */ cupsArrayRemove(hi->nodes, node); if (node->section) free(node->section); if (node->text) free(node->text); if (node->words) { for (word = (help_word_t *)cupsArrayFirst(node->words); word; word = (help_word_t *)cupsArrayNext(node->words)) help_delete_word(word); cupsArrayDelete(node->words); node->words = NULL; } node->section = section[0] ? strdup(section) : NULL; node->text = strdup(text); node->mtime = mtime; node->offset = offset; node->score = 0; } else { /* * New node... */ node = help_new_node(relative, anchor, section, text, mtime, offset, 0); } /* * Go through the text value and replace tabs and newlines with * whitespace and eliminate extra whitespace... */ for (ptr = node->text, text = node->text; *ptr;) if (isspace(*ptr & 255)) { while (isspace(*ptr & 255)) ptr ++; *text++ = ' '; } else if (text != ptr) *text++ = *ptr++; else { text ++; ptr ++; } *text = '\0'; /* * (Re)add the node to the array... */ cupsArrayAdd(hi->nodes, node); if (!anchor) node = NULL; break; } if (node) { /* * Scan this line for words... */ for (ptr = line; *ptr; ptr ++) { /* * Skip HTML stuff... */ if (*ptr == '<') { if (!strncmp(ptr, "<!--", 4)) { /* * Skip HTML comment... */ if ((text = strstr(ptr + 4, "-->")) == NULL) ptr += strlen(ptr) - 1; else ptr = text + 2; } else { /* * Skip HTML element... */ for (ptr ++; *ptr && *ptr != '>'; ptr ++) { if (*ptr == '\"' || *ptr == '\'') { for (quote = *ptr++; *ptr && *ptr != quote; ptr ++); if (!*ptr) ptr --; } } if (!*ptr) ptr --; } continue; } else if (*ptr == '&') { /* * Skip HTML entity... */ for (ptr ++; *ptr && *ptr != ';'; ptr ++); if (!*ptr) ptr --; continue; } else if (!isalnum(*ptr & 255)) continue; /* * Found the start of a word, search until we find the end... */ for (text = ptr, ptr ++; *ptr && isalnum(*ptr & 255); ptr ++); wordlen = (int)(ptr - text); memcpy(temp, text, (size_t)wordlen); temp[wordlen] = '\0'; ptr --; if (wordlen > 1 && !bsearch(temp, help_common_words, (sizeof(help_common_words) / sizeof(help_common_words[0])), sizeof(help_common_words[0]), (int (*)(const void *, const void *)) _cups_strcasecmp)) help_add_word(node, temp); } } /* * Get the offset of the next line... */ offset = cupsFileTell(fp); } cupsFileClose(fp); if (node) node->length = (size_t)(offset - node->offset); return (0); } /* * 'help_new_node()' - Create a new node and add it to an index. */ static help_node_t * /* O - Node pointer or NULL on error */ help_new_node(const char *filename, /* I - Filename */ const char *anchor, /* I - Anchor */ const char *section, /* I - Section */ const char *text, /* I - Text */ time_t mtime, /* I - Modification time */ off_t offset, /* I - Offset in file */ size_t length) /* I - Length in bytes */ { help_node_t *n; /* Node */ n = (help_node_t *)calloc(1, sizeof(help_node_t)); if (!n) return (NULL); n->filename = strdup(filename); n->anchor = anchor ? strdup(anchor) : NULL; n->section = (section && *section) ? strdup(section) : NULL; n->text = strdup(text); n->mtime = mtime; n->offset = offset; n->length = length; return (n); } /* * 'help_sort_nodes_by_name()' - Sort nodes by section, filename, and anchor. */ static int /* O - Difference */ help_sort_by_name(help_node_t *n1, /* I - First node */ help_node_t *n2) /* I - Second node */ { int diff; /* Difference */ if ((diff = strcmp(n1->filename, n2->filename)) != 0) return (diff); if (!n1->anchor && !n2->anchor) return (0); else if (!n1->anchor) return (-1); else if (!n2->anchor) return (1); else return (strcmp(n1->anchor, n2->anchor)); } /* * 'help_sort_nodes_by_score()' - Sort nodes by score and text. */ static int /* O - Difference */ help_sort_by_score(help_node_t *n1, /* I - First node */ help_node_t *n2) /* I - Second node */ { int diff; /* Difference */ if (n1->score != n2->score) return (n2->score - n1->score); if (n1->section && !n2->section) return (1); else if (!n1->section && n2->section) return (-1); else if (n1->section && n2->section && (diff = strcmp(n1->section, n2->section)) != 0) return (diff); return (_cups_strcasecmp(n1->text, n2->text)); } /* * 'help_sort_words()' - Sort words alphabetically. */ static int /* O - Difference */ help_sort_words(help_word_t *w1, /* I - Second word */ help_word_t *w2) /* I - Second word */ { return (_cups_strcasecmp(w1->text, w2->text)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cups-2.3.1/cgi-bin/ipp-var.c������������������������������������������������������������������������000664 �000765 �000024 �00000111353 13574721672 015635� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * CGI <-> IPP variable routines for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" /* * 'cgiGetAttributes()' - Get the list of attributes that are needed * by the template file. */ void cgiGetAttributes(ipp_t *request, /* I - IPP request */ const char *tmpl) /* I - Base filename */ { int num_attrs; /* Number of attributes */ char *attrs[1000]; /* Attributes */ int i; /* Looping var */ char filename[1024], /* Filename */ locale[16]; /* Locale name */ const char *directory, /* Directory */ *lang; /* Language */ FILE *in; /* Input file */ int ch; /* Character from file */ char name[255], /* Name of variable */ *nameptr; /* Pointer into name */ /* * Convert the language to a locale name... */ if ((lang = getenv("LANG")) != NULL) { for (i = 0; lang[i] && i < 15; i ++) if (isalnum(lang[i] & 255)) locale[i] = (char)tolower(lang[i]); else locale[i] = '_'; locale[i] = '\0'; } else locale[0] = '\0'; /* * See if we have a template file for this language... */ directory = cgiGetTemplateDir(); snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl); if (access(filename, 0)) { locale[2] = '\0'; snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl); if (access(filename, 0)) snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl); } /* * Open the template file... */ if ((in = fopen(filename, "r")) == NULL) return; /* * Loop through the file adding attribute names as needed... */ num_attrs = 0; attrs[0] = NULL; /* Eliminate compiler warning */ while ((ch = getc(in)) != EOF) if (ch == '\\') getc(in); else if (ch == '{' && num_attrs < (int)(sizeof(attrs) / sizeof(attrs[0]))) { /* * Grab the name... */ for (nameptr = name; (ch = getc(in)) != EOF;) if (strchr("}]<>=!~ \t\n", ch)) break; else if (nameptr > name && ch == '?') break; else if (nameptr < (name + sizeof(name) - 1)) { if (ch == '_') *nameptr++ = '-'; else *nameptr++ = (char)ch; } *nameptr = '\0'; if (!strncmp(name, "printer_state_history", 21)) strlcpy(name, "printer_state_history", sizeof(name)); /* * Possibly add it to the list of attributes... */ for (i = 0; i < num_attrs; i ++) if (!strcmp(attrs[i], name)) break; if (i >= num_attrs) { attrs[num_attrs] = strdup(name); num_attrs ++; } } /* * If we have attributes, add a requested-attributes attribute to the * request... */ if (num_attrs > 0) { ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", num_attrs, NULL, (const char **)attrs); for (i = 0; i < num_attrs; i ++) free(attrs[i]); } fclose(in); } /* * 'cgiGetIPPObjects()' - Get the objects in an IPP response. */ cups_array_t * /* O - Array of objects */ cgiGetIPPObjects(ipp_t *response, /* I - IPP response */ void *search) /* I - Search filter */ { int i; /* Looping var */ cups_array_t *objs; /* Array of objects */ ipp_attribute_t *attr, /* Current attribute */ *first; /* First attribute for object */ ipp_tag_t group; /* Current group tag */ int add; /* Add this object to the array? */ if (!response) return (0); for (add = 0, first = NULL, objs = cupsArrayNew(NULL, NULL), group = IPP_TAG_ZERO, attr = response->attrs; attr; attr = attr->next) { if (attr->group_tag != group) { group = attr->group_tag; if (group != IPP_TAG_ZERO && group != IPP_TAG_OPERATION) { first = attr; add = 0; } else if (add && first) { cupsArrayAdd(objs, first); add = 0; first = NULL; } } if (attr->name && attr->group_tag != IPP_TAG_OPERATION && !add) { if (!search) { /* * Add all objects if there is no search... */ add = 1; } else { /* * Check the search string against the string and integer values. */ switch (attr->value_tag) { case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_URI : case IPP_TAG_MIMETYPE : for (i = 0; !add && i < attr->num_values; i ++) if (cgiDoSearch(search, attr->values[i].string.text)) add = 1; break; case IPP_TAG_INTEGER : if (!strncmp(ippGetName(attr), "time-at-", 8)) break; /* Ignore time-at-xxx */ for (i = 0; !add && i < attr->num_values; i ++) { char buf[255]; /* Number buffer */ sprintf(buf, "%d", attr->values[i].integer); if (cgiDoSearch(search, buf)) add = 1; } break; default : break; } } } } if (add && first) cupsArrayAdd(objs, first); return (objs); } /* * 'cgiMoveJobs()' - Move one or more jobs. * * At least one of dest or job_id must be non-zero/NULL. */ void cgiMoveJobs(http_t *http, /* I - Connection to server */ const char *dest, /* I - Destination or NULL */ int job_id) /* I - Job ID or 0 for all */ { int i; /* Looping var */ const char *user; /* Username */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* Current attribute */ const char *name; /* Destination name */ const char *job_printer_uri; /* JOB_PRINTER_URI form variable */ char current_dest[1024]; /* Current destination */ /* * Make sure we have a username... */ if ((user = getenv("REMOTE_USER")) == NULL) { puts("Status: 401\n"); exit(0); } /* * See if the user has already selected a new destination... */ if ((job_printer_uri = cgiGetVariable("JOB_PRINTER_URI")) == NULL) { /* * Make sure necessary form variables are set... */ if (job_id) { char temp[255]; /* Temporary string */ sprintf(temp, "%d", job_id); cgiSetVariable("JOB_ID", temp); } if (dest) cgiSetVariable("PRINTER_NAME", dest); /* * No new destination specified, show the user what the available * printers/classes are... */ if (!dest) { /* * Get the current destination for job N... */ char job_uri[1024]; /* Job URI */ request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, job_uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "job-printer-uri"); if ((response = cupsDoRequest(http, request, "/")) != NULL) { if ((attr = ippFindAttribute(response, "job-printer-uri", IPP_TAG_URI)) != NULL) { /* * Pull the name from the URI... */ strlcpy(current_dest, strrchr(attr->values[0].string.text, '/') + 1, sizeof(current_dest)); dest = current_dest; } ippDelete(response); } if (!dest) { /* * Couldn't get the current destination... */ cgiStartHTML(cgiText(_("Move Job"))); cgiShowIPPError(_("Unable to find destination for job")); cgiEndHTML(); return; } } /* * Get the list of available destinations... */ request = ippNewRequest(CUPS_GET_PRINTERS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "printer-uri-supported"); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", CUPS_PRINTER_LOCAL); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", CUPS_PRINTER_SCANNER); if ((response = cupsDoRequest(http, request, "/")) != NULL) { for (i = 0, attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI); attr; attr = ippFindNextAttribute(response, "printer-uri-supported", IPP_TAG_URI)) { /* * Pull the name from the URI... */ name = strrchr(attr->values[0].string.text, '/') + 1; /* * If the name is not the same as the current destination, add it! */ if (_cups_strcasecmp(name, dest)) { cgiSetArray("JOB_PRINTER_URI", i, attr->values[0].string.text); cgiSetArray("JOB_PRINTER_NAME", i, name); i ++; } } ippDelete(response); } /* * Show the form... */ if (job_id) cgiStartHTML(cgiText(_("Move Job"))); else cgiStartHTML(cgiText(_("Move All Jobs"))); if (cgiGetSize("JOB_PRINTER_NAME") > 0) cgiCopyTemplateLang("job-move.tmpl"); else { if (job_id) cgiSetVariable("MESSAGE", cgiText(_("Unable to move job"))); else cgiSetVariable("MESSAGE", cgiText(_("Unable to move jobs"))); cgiSetVariable("ERROR", cgiText(_("No destinations added."))); cgiCopyTemplateLang("error.tmpl"); } } else { /* * Try moving the job or jobs... */ char uri[1024], /* Job/printer URI */ resource[1024], /* Post resource */ refresh[1024]; /* Refresh URL */ const char *job_printer_name; /* New printer name */ request = ippNewRequest(CUPS_MOVE_JOB); if (job_id) { /* * Move 1 job... */ snprintf(resource, sizeof(resource), "/jobs/%d", job_id); snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); } else { /* * Move all active jobs on a destination... */ snprintf(resource, sizeof(resource), "/%s/%s", cgiGetVariable("SECTION"), dest); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", ippPort(), "/%s/%s", cgiGetVariable("SECTION"), dest); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); } ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-printer-uri", NULL, job_printer_uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); ippDelete(cupsDoRequest(http, request, resource)); /* * Show the results... */ job_printer_name = strrchr(job_printer_uri, '/') + 1; if (cupsLastError() <= IPP_OK_CONFLICT) { const char *path = strstr(job_printer_uri, "/printers/"); if (!path) { path = strstr(job_printer_uri, "/classes/"); cgiSetVariable("IS_CLASS", "YES"); } if (path) { cgiFormEncode(uri, path, sizeof(uri)); snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); cgiSetVariable("refresh_page", refresh); } } if (job_id) cgiStartHTML(cgiText(_("Move Job"))); else cgiStartHTML(cgiText(_("Move All Jobs"))); if (cupsLastError() > IPP_OK_CONFLICT) { if (job_id) cgiShowIPPError(_("Unable to move job")); else cgiShowIPPError(_("Unable to move jobs")); } else { cgiSetVariable("JOB_PRINTER_NAME", job_printer_name); cgiCopyTemplateLang("job-moved.tmpl"); } } cgiEndHTML(); } /* * 'cgiPrintCommand()' - Print a CUPS command job. */ void cgiPrintCommand(http_t *http, /* I - Connection to server */ const char *dest, /* I - Destination printer */ const char *command, /* I - Command to send */ const char *title) /* I - Page/job title */ { int job_id; /* Command file job */ char uri[HTTP_MAX_URI], /* Job URI */ resource[1024], /* Printer resource path */ refresh[1024], /* Refresh URL */ command_file[1024]; /* Command "file" */ http_status_t status; /* Document status */ cups_option_t hold_option; /* job-hold-until option */ const char *user; /* User name */ ipp_t *request, /* Get-Job-Attributes request */ *response; /* Get-Job-Attributes response */ ipp_attribute_t *attr; /* Current job attribute */ static const char * const job_attrs[] =/* Job attributes we want */ { "job-state", "job-printer-state-message" }; /* * Create the CUPS command file... */ snprintf(command_file, sizeof(command_file), "#CUPS-COMMAND\n%s\n", command); /* * Show status... */ if (cgiSupportsMultipart()) { cgiStartMultipart(); cgiStartHTML(title); cgiCopyTemplateLang("command.tmpl"); cgiEndHTML(); fflush(stdout); } /* * Send the command file job... */ hold_option.name = "job-hold-until"; hold_option.value = "no-hold"; if ((user = getenv("REMOTE_USER")) != NULL) cupsSetUser(user); else cupsSetUser("anonymous"); if ((job_id = cupsCreateJob(http, dest, title, 1, &hold_option)) < 1) { cgiSetVariable("MESSAGE", cgiText(_("Unable to send command to printer driver"))); cgiSetVariable("ERROR", cupsLastErrorString()); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); if (cgiSupportsMultipart()) cgiEndMultipart(); return; } status = cupsStartDocument(http, dest, job_id, NULL, CUPS_FORMAT_COMMAND, 1); if (status == HTTP_CONTINUE) status = cupsWriteRequestData(http, command_file, strlen(command_file)); if (status == HTTP_CONTINUE) cupsFinishDocument(http, dest); if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE) { cgiSetVariable("MESSAGE", cgiText(_("Unable to send command to printer driver"))); cgiSetVariable("ERROR", cupsLastErrorString()); cgiStartHTML(title); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); if (cgiSupportsMultipart()) cgiEndMultipart(); cupsCancelJob(dest, job_id); return; } /* * Wait for the job to complete... */ if (cgiSupportsMultipart()) { for (;;) { /* * Get the current job state... */ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", 2, NULL, job_attrs); if ((response = cupsDoRequest(http, request, "/")) != NULL) cgiSetIPPVars(response, NULL, NULL, NULL, 0); attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM); if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED || attr->values[0].integer == IPP_JOB_HELD) { ippDelete(response); break; } /* * Job not complete, so update the status... */ ippDelete(response); cgiStartHTML(title); cgiCopyTemplateLang("command.tmpl"); cgiEndHTML(); fflush(stdout); sleep(5); } } /* * Send the final page that reloads the printer's page... */ snprintf(resource, sizeof(resource), "/printers/%s", dest); cgiFormEncode(uri, resource, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); cgiCopyTemplateLang("command.tmpl"); cgiEndHTML(); if (cgiSupportsMultipart()) cgiEndMultipart(); } /* * 'cgiPrintTestPage()' - Print a test page. */ void cgiPrintTestPage(http_t *http, /* I - Connection to server */ const char *dest) /* I - Destination printer/class */ { ipp_t *request, /* IPP request */ *response; /* IPP response */ char uri[HTTP_MAX_URI], /* Printer URI */ resource[1024], /* POST resource path */ refresh[1024], /* Refresh URL */ filename[1024]; /* Test page filename */ const char *datadir; /* CUPS_DATADIR env var */ const char *user; /* Username */ /* * See who is logged in... */ user = getenv("REMOTE_USER"); /* * Locate the test page file... */ if ((datadir = getenv("CUPS_DATADIR")) == NULL) datadir = CUPS_DATADIR; snprintf(filename, sizeof(filename), "%s/data/testprint", datadir); /* * Point to the printer/class... */ snprintf(resource, sizeof(resource), "/%s/%s", cgiGetVariable("SECTION"), dest); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", ippPort(), "/%s/%s", cgiGetVariable("SECTION"), dest); /* * Build an IPP_PRINT_JOB request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri * requesting-user-name */ request = ippNewRequest(IPP_PRINT_JOB); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, "Test Page"); /* * Do the request and get back a response... */ if ((response = cupsDoFileRequest(http, request, resource, filename)) != NULL) { cgiSetIPPVars(response, NULL, NULL, NULL, 0); ippDelete(response); } if (cupsLastError() <= IPP_OK_CONFLICT) { /* * Automatically reload the printer status page... */ cgiFormEncode(uri, resource, sizeof(uri)); snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); cgiSetVariable("refresh_page", refresh); } else if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } cgiStartHTML(cgiText(_("Print Test Page"))); if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to print test page")); else { cgiSetVariable("PRINTER_NAME", dest); cgiCopyTemplateLang("test-page.tmpl"); } cgiEndHTML(); } /* * 'cgiRewriteURL()' - Rewrite a printer URI into a web browser URL... */ char * /* O - New URL */ cgiRewriteURL(const char *uri, /* I - Current URI */ char *url, /* O - New URL */ int urlsize, /* I - Size of URL buffer */ const char *newresource) /* I - Replacement resource */ { char scheme[HTTP_MAX_URI], userpass[HTTP_MAX_URI], hostname[HTTP_MAX_URI], rawresource[HTTP_MAX_URI], resource[HTTP_MAX_URI], /* URI components... */ *rawptr, /* Pointer into rawresource */ *resptr; /* Pointer into resource */ int port; /* Port number */ static int ishttps = -1; /* Using encryption? */ static const char *server; /* Name of server */ static char servername[1024]; /* Local server name */ static const char hexchars[] = "0123456789ABCDEF"; /* Hexadecimal conversion characters */ /* * Check if we have been called before... */ if (ishttps < 0) { /* * No, initialize static vars for the conversion... * * First get the server name associated with the client interface as * well as the locally configured hostname. We'll check *both* of * these to see if the printer URL is local... */ if ((server = getenv("SERVER_NAME")) == NULL) server = ""; httpGetHostname(NULL, servername, sizeof(servername)); /* * Then flag whether we are using SSL on this connection... */ ishttps = getenv("HTTPS") != NULL; } /* * Convert the URI to a URL... */ httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, rawresource, sizeof(rawresource)); if (!strcmp(scheme, "ipp") || !strcmp(scheme, "http") || !strcmp(scheme, "https")) { if (newresource) { /* * Force the specified resource name instead of the one in the URL... */ strlcpy(resource, newresource, sizeof(resource)); } else { /* * Rewrite the resource string so it doesn't contain any * illegal chars... */ for (rawptr = rawresource, resptr = resource; *rawptr; rawptr ++) if ((*rawptr & 128) || *rawptr == '%' || *rawptr == ' ' || *rawptr == '#' || *rawptr == '?' || *rawptr == '.') /* For MSIE */ { if (resptr < (resource + sizeof(resource) - 3)) { *resptr++ = '%'; *resptr++ = hexchars[(*rawptr >> 4) & 15]; *resptr++ = hexchars[*rawptr & 15]; } } else if (resptr < (resource + sizeof(resource) - 1)) *resptr++ = *rawptr; *resptr = '\0'; } /* * Map local access to a local URI... */ if (!_cups_strcasecmp(hostname, "127.0.0.1") || !_cups_strcasecmp(hostname, "[::1]") || !_cups_strcasecmp(hostname, "localhost") || !_cups_strncasecmp(hostname, "localhost.", 10) || !_cups_strcasecmp(hostname, server) || !_cups_strcasecmp(hostname, servername)) { /* * Make URI relative to the current server... */ strlcpy(url, resource, (size_t)urlsize); } else { /* * Rewrite URI with HTTP/HTTPS scheme... */ if (userpass[0]) snprintf(url, (size_t)urlsize, "%s://%s@%s:%d%s", ishttps ? "https" : "http", userpass, hostname, port, resource); else snprintf(url, (size_t)urlsize, "%s://%s:%d%s", ishttps ? "https" : "http", hostname, port, resource); } } else strlcpy(url, uri, (size_t)urlsize); return (url); } /* * 'cgiSetIPPObjectVars()' - Set CGI variables from an IPP object. */ ipp_attribute_t * /* O - Next object */ cgiSetIPPObjectVars( ipp_attribute_t *obj, /* I - Response data to be copied... */ const char *prefix, /* I - Prefix for name or NULL */ int element) /* I - Parent element number */ { ipp_attribute_t *attr; /* Attribute in response... */ int i; /* Looping var */ char name[1024], /* Name of attribute */ *nameptr, /* Pointer into name */ value[16384], /* Value(s) */ *valptr; /* Pointer into value */ fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", " "element=%d)\n", obj, prefix ? prefix : "(null)", element); /* * Set common CGI template variables... */ if (!prefix) cgiSetServerVersion(); /* * Loop through the attributes and set them for the template... */ for (attr = obj; attr && attr->group_tag != IPP_TAG_ZERO; attr = attr->next) { /* * Copy the attribute name, substituting "_" for "-"... */ if (!attr->name) continue; if (prefix) { snprintf(name, sizeof(name), "%s.", prefix); nameptr = name + strlen(name); } else nameptr = name; for (i = 0; attr->name[i] && nameptr < (name + sizeof(name) - 1); i ++) if (attr->name[i] == '-') *nameptr++ = '_'; else *nameptr++ = attr->name[i]; *nameptr = '\0'; /* * Add "job_printer_name" variable if we have a "job_printer_uri" * attribute... */ if (!strcmp(name, "job_printer_uri")) { if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL) valptr = "unknown"; else valptr ++; cgiSetArray("job_printer_name", element, valptr); } /* * Localize event names in "notify_events" variable... */ if (!strcmp(name, "notify_events")) { size_t remaining; /* Remaining bytes in buffer */ value[0] = '\0'; valptr = value; for (i = 0; i < attr->num_values; i ++) { if (valptr >= (value + sizeof(value) - 3)) break; if (i) { *valptr++ = ','; *valptr++ = ' '; } remaining = sizeof(value) - (size_t)(valptr - value); if (!strcmp(attr->values[i].string.text, "printer-stopped")) strlcpy(valptr, _("Printer Paused"), remaining); else if (!strcmp(attr->values[i].string.text, "printer-added")) strlcpy(valptr, _("Printer Added"), remaining); else if (!strcmp(attr->values[i].string.text, "printer-modified")) strlcpy(valptr, _("Printer Modified"), remaining); else if (!strcmp(attr->values[i].string.text, "printer-deleted")) strlcpy(valptr, _("Printer Deleted"), remaining); else if (!strcmp(attr->values[i].string.text, "job-created")) strlcpy(valptr, _("Job Created"), remaining); else if (!strcmp(attr->values[i].string.text, "job-completed")) strlcpy(valptr, _("Job Completed"), remaining); else if (!strcmp(attr->values[i].string.text, "job-stopped")) strlcpy(valptr, _("Job Stopped"), remaining); else if (!strcmp(attr->values[i].string.text, "job-config-changed")) strlcpy(valptr, _("Job Options Changed"), remaining); else if (!strcmp(attr->values[i].string.text, "server-restarted")) strlcpy(valptr, _("Server Restarted"), remaining); else if (!strcmp(attr->values[i].string.text, "server-started")) strlcpy(valptr, _("Server Started"), remaining); else if (!strcmp(attr->values[i].string.text, "server-stopped")) strlcpy(valptr, _("Server Stopped"), remaining); else if (!strcmp(attr->values[i].string.text, "server-audit")) strlcpy(valptr, _("Server Security Auditing"), remaining); else strlcpy(valptr, attr->values[i].string.text, remaining); valptr += strlen(valptr); } cgiSetArray("notify_events", element, value); continue; } /* * Add "notify_printer_name" variable if we have a "notify_printer_uri" * attribute... */ if (!strcmp(name, "notify_printer_uri")) { if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL) valptr = "unknown"; else valptr ++; cgiSetArray("notify_printer_name", element, valptr); } /* * Add "notify_recipient_name" variable if we have a "notify_recipient_uri" * attribute, and rewrite recipient URI... */ if (!strcmp(name, "notify_recipient_uri")) { char uri[1024], /* New URI */ scheme[32], /* Scheme portion of URI */ userpass[256], /* Username/password portion of URI */ host[1024], /* Hostname portion of URI */ resource[1024], /* Resource portion of URI */ *options; /* Options in URI */ int port; /* Port number */ httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)); if (!strcmp(scheme, "rss")) { /* * RSS notification... */ if ((options = strchr(resource, '?')) != NULL) *options = '\0'; if (host[0]) { /* * Link to remote feed... */ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "http", userpass, host, port, resource); strlcpy(name, uri, sizeof(name)); } else { /* * Link to local feed... */ snprintf(uri, sizeof(uri), "/rss%s", resource); strlcpy(name, resource + 1, sizeof(name)); } } else { /* * Other... */ strlcpy(uri, attr->values[0].string.text, sizeof(uri)); strlcpy(name, resource, sizeof(name)); } cgiSetArray("notify_recipient_uri", element, uri); cgiSetArray("notify_recipient_name", element, name); continue; } /* * Add "admin_uri" variable if we have a "printer_uri_supported" * attribute... */ if (!strcmp(name, "printer_uri_supported")) { cgiRewriteURL(attr->values[0].string.text, value, sizeof(value), "/admin/"); cgiSetArray("admin_uri", element, value); } /* * Copy values... */ value[0] = '\0'; /* Initially an empty string */ valptr = value; /* Start at the beginning */ for (i = 0; i < attr->num_values; i ++) { if (i) strlcat(valptr, ", ", sizeof(value) - (size_t)(valptr - value)); valptr += strlen(valptr); switch (attr->value_tag) { case IPP_TAG_INTEGER : case IPP_TAG_ENUM : if (strncmp(name, "time_at_", 8) == 0) _cupsStrDate(valptr, sizeof(value) - (size_t)(valptr - value), (time_t)ippGetInteger(attr, i)); else snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", ippGetInteger(attr, i)); break; case IPP_TAG_BOOLEAN : snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", attr->values[i].boolean); break; case IPP_TAG_NOVALUE : strlcat(valptr, "novalue", sizeof(value) - (size_t)(valptr - value)); break; case IPP_TAG_RANGE : snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d-%d", attr->values[i].range.lower, attr->values[i].range.upper); break; case IPP_TAG_RESOLUTION : snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%dx%d%s", attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); break; case IPP_TAG_URI : if (strchr(attr->values[i].string.text, ':') && strcmp(name, "device_uri")) { /* * Rewrite URIs... */ cgiRewriteURL(attr->values[i].string.text, valptr, (int)(sizeof(value) - (size_t)(valptr - value)), NULL); break; } case IPP_TAG_STRING : case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : strlcat(valptr, attr->values[i].string.text, sizeof(value) - (size_t)(valptr - value)); break; case IPP_TAG_BEGIN_COLLECTION : snprintf(value, sizeof(value), "%s%d", name, i + 1); cgiSetIPPVars(attr->values[i].collection, NULL, NULL, value, element); break; default : break; /* anti-compiler-warning-code */ } } /* * Add the element... */ if (attr->value_tag != IPP_TAG_BEGIN_COLLECTION) { cgiSetArray(name, element, value); fprintf(stderr, "DEBUG2: %s[%d]=\"%s\"\n", name, element, value); } } return (attr ? attr->next : NULL); } /* * 'cgiSetIPPVars()' - Set CGI variables from an IPP response. */ int /* O - Maximum number of elements */ cgiSetIPPVars(ipp_t *response, /* I - Response data to be copied... */ const char *filter_name, /* I - Filter name */ const char *filter_value, /* I - Filter value */ const char *prefix, /* I - Prefix for name or NULL */ int parent_el) /* I - Parent element number */ { int element; /* Element in CGI array */ ipp_attribute_t *attr, /* Attribute in response... */ *filter; /* Filtering attribute */ fprintf(stderr, "DEBUG2: cgiSetIPPVars(response=%p, filter_name=\"%s\", " "filter_value=\"%s\", prefix=\"%s\", parent_el=%d)\n", response, filter_name ? filter_name : "(null)", filter_value ? filter_value : "(null)", prefix ? prefix : "(null)", parent_el); /* * Set common CGI template variables... */ if (!prefix) cgiSetServerVersion(); /* * Loop through the attributes and set them for the template... */ attr = response->attrs; if (!prefix) while (attr && attr->group_tag == IPP_TAG_OPERATION) attr = attr->next; for (element = parent_el; attr; element ++) { /* * Copy attributes to a separator... */ while (attr && attr->group_tag == IPP_TAG_ZERO) attr= attr->next; if (!attr) break; if (filter_name) { for (filter = attr; filter != NULL && filter->group_tag != IPP_TAG_ZERO; filter = filter->next) if (filter->name && !strcmp(filter->name, filter_name) && (filter->value_tag == IPP_TAG_STRING || (filter->value_tag >= IPP_TAG_TEXTLANG && filter->value_tag <= IPP_TAG_MIMETYPE)) && filter->values[0].string.text != NULL && !_cups_strcasecmp(filter->values[0].string.text, filter_value)) break; if (!filter) return (element + 1); if (filter->group_tag == IPP_TAG_ZERO) { attr = filter; element --; continue; } } attr = cgiSetIPPObjectVars(attr, prefix, element); } fprintf(stderr, "DEBUG2: Returning %d from cgiSetIPPVars()...\n", element); return (element); } /* * 'cgiShowIPPError()' - Show the last IPP error message. * * The caller must still call cgiStartHTML() and cgiEndHTML(). */ void cgiShowIPPError(const char *message) /* I - Contextual message */ { cgiSetVariable("MESSAGE", cgiText(message)); cgiSetVariable("ERROR", cupsLastErrorString()); cgiCopyTemplateLang("error.tmpl"); } /* * 'cgiShowJobs()' - Show print jobs. */ void cgiShowJobs(http_t *http, /* I - Connection to server */ const char *dest) /* I - Destination name or NULL */ { int i; /* Looping var */ const char *which_jobs; /* Which jobs to show */ ipp_t *request, /* IPP request */ *response; /* IPP response */ cups_array_t *jobs; /* Array of job objects */ ipp_attribute_t *job; /* Job object */ int first, /* First job to show */ count; /* Number of jobs */ const char *var, /* Form variable */ *query, /* Query string */ *section; /* Section in web interface */ void *search; /* Search data */ char url[1024], /* Printer URI */ val[1024]; /* Form variable */ /* * Build an IPP_GET_JOBS request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_JOBS); if (dest) { httpAssembleURIf(HTTP_URI_CODING_ALL, url, sizeof(url), "ipp", NULL, "localhost", ippPort(), "/printers/%s", dest); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, url); } else ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/"); if ((which_jobs = cgiGetVariable("which_jobs")) != NULL && *which_jobs) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", NULL, which_jobs); if ((var = cgiGetVariable("FIRST")) != NULL) { if ((first = atoi(var)) < 0) first = 0; } else first = 0; if (first > 0) ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "first-index", first + 1); cgiGetAttributes(request, "jobs.tmpl"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Get a list of matching job objects. */ if ((query = cgiGetVariable("QUERY")) != NULL && !cgiGetVariable("CLEAR")) search = cgiCompileSearch(query); else { query = NULL; search = NULL; } jobs = cgiGetIPPObjects(response, search); count = cupsArrayCount(jobs) + first; if (search) cgiFreeSearch(search); /* * Figure out which jobs to display... */ section = cgiGetVariable("SECTION"); cgiClearVariables(); if (query) cgiSetVariable("QUERY", query); cgiSetVariable("SECTION", section); sprintf(val, "%d", count); cgiSetVariable("TOTAL", val); if (which_jobs) cgiSetVariable("WHICH_JOBS", which_jobs); for (i = 0, job = (ipp_attribute_t *)cupsArrayFirst(jobs); i < CUPS_PAGE_MAX && job; i ++, job = (ipp_attribute_t *)cupsArrayNext(jobs)) cgiSetIPPObjectVars(job, NULL, i); /* * Save navigation URLs... */ if (dest) { snprintf(val, sizeof(val), "/%s/%s", section, dest); cgiSetVariable("PRINTER_NAME", dest); cgiSetVariable("PRINTER_URI_SUPPORTED", val); } else strlcpy(val, "/jobs/", sizeof(val)); cgiSetVariable("THISURL", val); if (first > 0) { sprintf(val, "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { sprintf(val, "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } if (count > CUPS_PAGE_MAX) { snprintf(val, sizeof(val), "%d", CUPS_PAGE_MAX * (count / CUPS_PAGE_MAX)); cgiSetVariable("LAST", val); } /* * Then show everything... */ if (dest) cgiSetVariable("SEARCH_DEST", dest); cgiCopyTemplateLang("search.tmpl"); cgiCopyTemplateLang("jobs-header.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); cgiCopyTemplateLang("jobs.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); cupsArrayDelete(jobs); ippDelete(response); } } /* * 'cgiText()' - Return localized text. */ const char * /* O - Localized message */ cgiText(const char *message) /* I - Message */ { static cups_lang_t *language = NULL; /* Language */ if (!language) language = cupsLangDefault(); return (_cupsLangString(language, message)); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cups-2.3.1/cgi-bin/search.c�������������������������������������������������������������������������000664 �000765 �000024 �00000013702 13574721672 015523� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Search routines for CUPS. * * Copyright 2007-2018 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cgi-private.h" #include <regex.h> /* * 'cgiCompileSearch()' - Compile a search string. */ void * /* O - Search context */ cgiCompileSearch(const char *query) /* I - Query string */ { regex_t *re; /* Regular expression */ char *s, /* Regular expression string */ *sptr, /* Pointer into RE string */ *sword; /* Pointer to start of word */ size_t slen; /* Allocated size of RE string */ const char *qptr, /* Pointer into query string */ *qend; /* End of current word */ const char *prefix; /* Prefix to add to next word */ int quoted; /* Word is quoted */ size_t wlen; /* Word length */ char *lword; /* Last word in query */ /* * Range check input... */ if (!query) return (NULL); /* * Allocate a regular expression storage structure... */ if ((re = (regex_t *)calloc(1, sizeof(regex_t))) == NULL) return (NULL); /* * Allocate a buffer to hold the regular expression string, starting * at 1024 bytes or 3 times the length of the query string, whichever * is greater. We'll expand the string as needed... */ slen = strlen(query) * 3; if (slen < 1024) slen = 1024; if ((s = (char *)malloc(slen)) == NULL) { free(re); return (NULL); } /* * Copy the query string to the regular expression, handling basic * AND and OR logic... */ prefix = ".*"; qptr = query; sptr = s; lword = NULL; while (*qptr) { /* * Skip leading whitespace... */ while (isspace(*qptr & 255)) qptr ++; if (!*qptr) break; /* * Find the end of the current word... */ if (*qptr == '\"' || *qptr == '\'') { /* * Scan quoted string... */ quoted = *qptr ++; for (qend = qptr; *qend && *qend != quoted; qend ++); if (!*qend) { /* * No closing quote, error out! */ free(s); free(re); if (lword) free(lword); return (NULL); } } else { /* * Scan whitespace-delimited string... */ quoted = 0; for (qend = qptr + 1; *qend && !isspace(*qend); qend ++); } wlen = (size_t)(qend - qptr); /* * Look for logic words: AND, OR */ if (wlen == 3 && !_cups_strncasecmp(qptr, "AND", 3)) { /* * Logical AND with the following text... */ if (sptr > s) prefix = ".*"; qptr = qend; } else if (wlen == 2 && !_cups_strncasecmp(qptr, "OR", 2)) { /* * Logical OR with the following text... */ if (sptr > s) prefix = ".*|.*"; qptr = qend; } else { /* * Add a search word, making sure we have enough room for the * string + RE overhead... */ wlen = (size_t)(sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11; if (lword) wlen += strlen(lword); if (wlen > slen) { /* * Expand the RE string buffer... */ char *temp; /* Temporary string pointer */ slen = wlen + 128; temp = (char *)realloc(s, slen); if (!temp) { free(s); free(re); if (lword) free(lword); return (NULL); } sptr = temp + (sptr - s); s = temp; } /* * Add the prefix string... */ memcpy(sptr, prefix, strlen(prefix) + 1); sptr += strlen(sptr); /* * Then quote the remaining word characters as needed for the * RE... */ sword = sptr; while (qptr < qend) { /* * Quote: ^ . [ $ ( ) | * + ? { \ */ if (strchr("^.[$()|*+?{\\", *qptr)) *sptr++ = '\\'; *sptr++ = *qptr++; } *sptr = '\0'; /* * For "word1 AND word2", add reciprocal "word2 AND word1"... */ if (!strcmp(prefix, ".*") && lword) { char *lword2; /* New "last word" */ if ((lword2 = strdup(sword)) == NULL) { free(lword); free(s); free(re); return (NULL); } memcpy(sptr, ".*|.*", 6); sptr += 5; memcpy(sptr, lword2, strlen(lword2) + 1); sptr += strlen(sptr); memcpy(sptr, ".*", 3); sptr += 2; memcpy(sptr, lword, strlen(lword) + 1); sptr += strlen(sptr); free(lword); lword = lword2; } else { if (lword) free(lword); lword = strdup(sword); } prefix = ".*|.*"; } /* * Advance to the next string... */ if (quoted) qptr ++; } if (lword) free(lword); if (sptr > s) memcpy(sptr, ".*", 3); else { /* * No query data, return NULL... */ free(s); free(re); return (NULL); } /* * Compile the regular expression... */ if (regcomp(re, s, REG_EXTENDED | REG_ICASE)) { free(re); free(s); return (NULL); } /* * Free the RE string and return the new regular expression we compiled... */ free(s); return ((void *)re); } /* * 'cgiDoSearch()' - Do a search of some text. */ int /* O - Number of matches */ cgiDoSearch(void *search, /* I - Search context */ const char *text) /* I - Text to search */ { int i; /* Looping var */ regmatch_t matches[100]; /* RE matches */ /* * Range check... */ if (!search || !text) return (0); /* * Do a lookup... */ if (!regexec((regex_t *)search, text, sizeof(matches) / sizeof(matches[0]), matches, 0)) { /* * Figure out the number of matches in the string... */ for (i = 0; i < (int)(sizeof(matches) / sizeof(matches[0])); i ++) if (matches[i].rm_so < 0) break; return (i); } else return (0); } /* * 'cgiFreeSearch()' - Free a compiled search context. */ void cgiFreeSearch(void *search) /* I - Search context */ { regfree((regex_t *)search); free(search); } ��������������������������������������������������������������cups-2.3.1/cgi-bin/cgi-private.h��������������������������������������������������������������������000664 �000765 �000024 �00000001022 13574721672 016465� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Private CGI definitions for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi.h" #include <cups/debug-private.h> #include <cups/language-private.h> #include <cups/string-private.h> #include <cups/ipp-private.h> /* TODO: Update so we don't need this */ /* * Limits... */ #define CUPS_PAGE_MAX 100 /* Maximum items per page */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cups-2.3.1/cgi-bin/help.c���������������������������������������������������������������������������000664 �000765 �000024 �00000020656 13574721672 015214� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Online help CGI for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" /* * 'main()' - Main entry for CGI. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { help_index_t *hi, /* Help index */ *si; /* Search index */ help_node_t *n; /* Current help node */ int i; /* Looping var */ const char *query; /* Search query */ const char *cache_dir; /* CUPS_CACHEDIR environment variable */ const char *docroot; /* CUPS_DOCROOT environment variable */ const char *helpfile, /* Current help file */ *helptitle = NULL; /* Current help title */ const char *topic; /* Current topic */ char topic_data[1024]; /* Topic form data */ const char *section; /* Current section */ char filename[1024], /* Filename */ directory[1024]; /* Directory */ cups_file_t *fp; /* Help file */ char line[1024]; /* Line from file */ int printable; /* Show printable version? */ /* * Get any form variables... */ cgiInitialize(); printable = cgiGetVariable("PRINTABLE") != NULL; /* * Set the web interface section... */ cgiSetVariable("SECTION", "help"); cgiSetVariable("REFRESH_PAGE", ""); /* * Load the help index... */ if ((cache_dir = getenv("CUPS_CACHEDIR")) == NULL) cache_dir = CUPS_CACHEDIR; snprintf(filename, sizeof(filename), "%s/help.index", cache_dir); if ((docroot = getenv("CUPS_DOCROOT")) == NULL) docroot = CUPS_DOCROOT; snprintf(directory, sizeof(directory), "%s/help", docroot); fprintf(stderr, "DEBUG: helpLoadIndex(filename=\"%s\", directory=\"%s\")\n", filename, directory); hi = helpLoadIndex(filename, directory); if (!hi) { perror(filename); cgiStartHTML(cgiText(_("Online Help"))); cgiSetVariable("ERROR", cgiText(_("Unable to load help index."))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return (1); } fprintf(stderr, "DEBUG: %d nodes in help index...\n", cupsArrayCount(hi->nodes)); /* * See if we are viewing a file... */ for (i = 0; i < argc; i ++) fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); if ((helpfile = getenv("PATH_INFO")) != NULL) { helpfile ++; if (!*helpfile) helpfile = NULL; } if (helpfile) { /* * Verify that the help file exists and is part of the index... */ snprintf(filename, sizeof(filename), "%s/help/%s", docroot, helpfile); fprintf(stderr, "DEBUG: helpfile=\"%s\", filename=\"%s\"\n", helpfile, filename); if (access(filename, R_OK)) { perror(filename); cgiStartHTML(cgiText(_("Online Help"))); cgiSetVariable("ERROR", cgiText(_("Unable to access help file."))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return (1); } if ((n = helpFindNode(hi, helpfile, NULL)) == NULL) { cgiStartHTML(cgiText(_("Online Help"))); cgiSetVariable("ERROR", cgiText(_("Help file not in index."))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); return (1); } /* * Save the page title and help file... */ helptitle = n->text; topic = n->section; /* * Send a standard page header... */ if (printable) puts("Content-Type: text/html;charset=utf-8\n"); else cgiStartHTML(n->text); } else { /* * Send a standard page header... */ cgiStartHTML(cgiText(_("Online Help"))); topic = cgiGetVariable("TOPIC"); } /* * Do a search as needed... */ if (cgiGetVariable("CLEAR")) cgiSetVariable("QUERY", ""); query = cgiGetVariable("QUERY"); si = helpSearchIndex(hi, query, topic, helpfile); cgiClearVariables(); if (query) cgiSetVariable("QUERY", query); if (topic) cgiSetVariable("TOPIC", topic); if (helpfile) cgiSetVariable("HELPFILE", helpfile); if (helptitle) cgiSetVariable("HELPTITLE", helptitle); fprintf(stderr, "DEBUG: query=\"%s\", topic=\"%s\"\n", query ? query : "(null)", topic ? topic : "(null)"); if (si) { help_node_t *nn; /* Parent node */ fprintf(stderr, "DEBUG: si=%p, si->sorted=%p, cupsArrayCount(si->sorted)=%d\n", si, si->sorted, cupsArrayCount(si->sorted)); for (i = 0, n = (help_node_t *)cupsArrayFirst(si->sorted); n; i ++, n = (help_node_t *)cupsArrayNext(si->sorted)) { if (helpfile && n->anchor) snprintf(line, sizeof(line), "#%s", n->anchor); else if (n->anchor) snprintf(line, sizeof(line), "/help/%s?QUERY=%s#%s", n->filename, query ? query : "", n->anchor); else snprintf(line, sizeof(line), "/help/%s?QUERY=%s", n->filename, query ? query : ""); cgiSetArray("QTEXT", i, n->text); cgiSetArray("QLINK", i, line); if (!helpfile && n->anchor) { nn = helpFindNode(hi, n->filename, NULL); snprintf(line, sizeof(line), "/help/%s?QUERY=%s", nn->filename, query ? query : ""); cgiSetArray("QPTEXT", i, nn->text); cgiSetArray("QPLINK", i, line); } else { cgiSetArray("QPTEXT", i, ""); cgiSetArray("QPLINK", i, ""); } fprintf(stderr, "DEBUG: [%d] = \"%s\" @ \"%s\"\n", i, n->text, line); } helpDeleteIndex(si); } /* * OK, now list the bookmarks within the index... */ for (i = 0, section = NULL, n = (help_node_t *)cupsArrayFirst(hi->sorted); n; n = (help_node_t *)cupsArrayNext(hi->sorted)) { if (n->anchor) continue; /* * Add a section link as needed... */ if (n->section && (!section || strcmp(n->section, section))) { /* * Add a link for this node... */ snprintf(line, sizeof(line), "/help/?TOPIC=%s&QUERY=%s", cgiFormEncode(topic_data, n->section, sizeof(topic_data)), query ? query : ""); cgiSetArray("BMLINK", i, line); cgiSetArray("BMTEXT", i, n->section); cgiSetArray("BMINDENT", i, "0"); i ++; section = n->section; } if (!topic || !n->section || strcmp(n->section, topic)) continue; /* * Add a link for this node... */ snprintf(line, sizeof(line), "/help/%s?TOPIC=%s&QUERY=%s", n->filename, cgiFormEncode(topic_data, n->section, sizeof(topic_data)), query ? query : ""); cgiSetArray("BMLINK", i, line); cgiSetArray("BMTEXT", i, n->text); cgiSetArray("BMINDENT", i, "1"); i ++; if (helpfile && !strcmp(helpfile, n->filename)) { help_node_t *nn; /* Pointer to sub-node */ cupsArraySave(hi->sorted); for (nn = (help_node_t *)cupsArrayFirst(hi->sorted); nn; nn = (help_node_t *)cupsArrayNext(hi->sorted)) if (nn->anchor && !strcmp(helpfile, nn->filename)) { /* * Add a link for this node... */ snprintf(line, sizeof(line), "#%s", nn->anchor); cgiSetArray("BMLINK", i, line); cgiSetArray("BMTEXT", i, nn->text); cgiSetArray("BMINDENT", i, "2"); i ++; } cupsArrayRestore(hi->sorted); } } /* * Show the search and bookmark content... */ if (!helpfile || !printable) cgiCopyTemplateLang("help-header.tmpl"); else cgiCopyTemplateLang("help-printable.tmpl"); /* * If we are viewing a file, copy it in now... */ if (helpfile) { if ((fp = cupsFileOpen(filename, "r")) != NULL) { int inbody; /* Are we inside the body? */ char *lineptr; /* Pointer into line */ inbody = 0; while (cupsFileGets(fp, line, sizeof(line))) { for (lineptr = line; *lineptr && isspace(*lineptr & 255); lineptr ++); if (inbody) { if (!_cups_strncasecmp(lineptr, "</BODY>", 7)) break; printf("%s\n", line); } else if (!_cups_strncasecmp(lineptr, "<BODY", 5)) inbody = 1; } cupsFileClose(fp); } else { perror(filename); cgiSetVariable("ERROR", cgiText(_("Unable to open help file."))); cgiCopyTemplateLang("error.tmpl"); } } /* * Send a standard trailer... */ if (!printable) { cgiCopyTemplateLang("help-trailer.tmpl"); cgiEndHTML(); } else puts("</BODY>\n</HTML>"); /* * Delete the index... */ helpDeleteIndex(hi); /* * Return with no errors... */ return (0); } ����������������������������������������������������������������������������������cups-2.3.1/cgi-bin/jobs.c���������������������������������������������������������������������������000664 �000765 �000024 �00000007721 13574721672 015217� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Job status CGI for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" /* * Local functions... */ static void do_job_op(http_t *http, int job_id, ipp_op_t op); /* * 'main()' - Main entry for CGI. */ int /* O - Exit status */ main(void) { http_t *http; /* Connection to the server */ const char *op; /* Operation name */ const char *job_id_var; /* Job ID form variable */ int job_id; /* Job ID */ /* * Get any form variables... */ cgiInitialize(); /* * Set the web interface section... */ cgiSetVariable("SECTION", "jobs"); cgiSetVariable("REFRESH_PAGE", ""); /* * Connect to the HTTP server... */ http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); /* * Get the job ID, if any... */ if ((job_id_var = cgiGetVariable("JOB_ID")) != NULL) job_id = atoi(job_id_var); else job_id = 0; /* * Do the operation... */ if ((op = cgiGetVariable("OP")) != NULL && job_id > 0 && cgiIsPOST()) { /* * Do the operation... */ if (!strcmp(op, "cancel-job")) do_job_op(http, job_id, IPP_CANCEL_JOB); else if (!strcmp(op, "hold-job")) do_job_op(http, job_id, IPP_HOLD_JOB); else if (!strcmp(op, "move-job")) cgiMoveJobs(http, NULL, job_id); else if (!strcmp(op, "release-job")) do_job_op(http, job_id, IPP_RELEASE_JOB); else if (!strcmp(op, "restart-job")) do_job_op(http, job_id, IPP_RESTART_JOB); else { /* * Bad operation code... Display an error... */ cgiStartHTML(cgiText(_("Jobs"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } } else { /* * Show a list of jobs... */ cgiStartHTML(cgiText(_("Jobs"))); cgiShowJobs(http, NULL); cgiEndHTML(); } /* * Close the HTTP server connection... */ httpClose(http); /* * Return with no errors... */ return (0); } /* * 'do_job_op()' - Do a job operation. */ static void do_job_op(http_t *http, /* I - HTTP connection */ int job_id, /* I - Job ID */ ipp_op_t op) /* I - Operation to perform */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* Job URI */ const char *user; /* Username */ /* * Build a job request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * job-uri or printer-uri (purge-jobs) * requesting-user-name */ request = ippNewRequest(op); snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); if ((user = getenv("REMOTE_USER")) == NULL) user = "guest"; ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); /* * Do the request and get back a response... */ ippDelete(cupsDoRequest(http, request, "/jobs")); if (cupsLastError() <= IPP_OK_CONFLICT && getenv("HTTP_REFERER")) { /* * Redirect successful updates back to the parent page... */ char url[1024]; /* Encoded URL */ strlcpy(url, "5;URL=", sizeof(url)); cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6); cgiSetVariable("refresh_page", url); } else if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } cgiStartHTML(cgiText(_("Jobs"))); if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Job operation failed")); else if (op == IPP_CANCEL_JOB) cgiCopyTemplateLang("job-cancel.tmpl"); else if (op == IPP_HOLD_JOB) cgiCopyTemplateLang("job-hold.tmpl"); else if (op == IPP_RELEASE_JOB) cgiCopyTemplateLang("job-release.tmpl"); else if (op == IPP_RESTART_JOB) cgiCopyTemplateLang("job-restart.tmpl"); cgiEndHTML(); } �����������������������������������������������cups-2.3.1/cgi-bin/makedocset.c���������������������������������������������������������������������000664 �000765 �000024 �00000027642 13574721672 016405� 0����������������������������������������������������������������������������������������������������ustar�00mike����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Xcode documentation set generator. * * Copyright 2007-2012 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. * * Usage: * * makedocset directory *.tokens */ /* * Include necessary headers... */ #include "cgi-private.h" #include <errno.h> /* * Local structures... */ typedef struct _cups_html_s /**** Help file ****/ { char *path; /* Path to help file */ char *title; /* Title of help file */ } _cups_html_t; typedef struct _cups_section_s /**** Help section ****/ { char *name; /* Section name */ cups_array_t *files; /* Files in this section */ } _cups_section_t; /* * Local functions... */ static int compare_html(_cups_html_t *a, _cups_html_t *b); static int compare_sections(_cups_section_t *a, _cups_section_t *b); static int compare_sections_files(_cups_section_t *a, _cups_section_t *b); static void write_index(const char *path, help_index_t *hi); static void write_info(const char *path, const char *revision); static void write_nodes(const char *path, help_index_t *hi); /* * 'main()' - Test the help index code. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ char path[1024], /* Path to documentation */ line[1024]; /* Line from file */ help_index_t *hi; /* Help index */ cups_file_t *tokens, /* Tokens.xml file */ *fp; /* Current file */ if (argc < 4) { puts("Usage: makedocset directory revision *.tokens"); return (1); } /* * Index the help documents... */ snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation", argv[1]); if ((hi = helpLoadIndex(NULL, path)) == NULL) { fputs("makedocset: Unable to index help files!\n", stderr); return (1); } snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation/index.html", argv[1]); write_index(path, hi); snprintf(path, sizeof(path), "%s/Contents/Resources/Nodes.xml", argv[1]); write_nodes(path, hi); /* * Write the Info.plist file... */ snprintf(path, sizeof(path), "%s/Contents/Info.plist", argv[1]); write_info(path, argv[2]); /* * Merge the Tokens.xml files... */ snprintf(path, sizeof(path), "%s/Contents/Resources/Tokens.xml", argv[1]); if ((tokens = cupsFileOpen(path, "w")) == NULL) { fprintf(stderr, "makedocset: Unable to create \"%s\": %s\n", path, strerror(errno)); return (1); } cupsFilePuts(tokens, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); cupsFilePuts(tokens, "<Tokens version=\"1.0\">\n"); for (i = 3; i < argc; i ++) { if ((fp = cupsFileOpen(argv[i], "r")) == NULL) { fprintf(stderr, "makedocset: Unable to open \"%s\": %s\n", argv[i], strerror(errno)); return (1); } if (!cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "<?xml ", 6) || !cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "<Tokens ", 8)) { fprintf(stderr, "makedocset: Bad Tokens.xml file \"%s\"!\n", argv[i]); return (1); } while (cupsFileGets(fp, line, sizeof(line))) { if (strcmp(line, "</Tokens>")) cupsFilePrintf(tokens, "%s\n", line); } cupsFileClose(fp); } cupsFilePuts(tokens, "</Tokens>\n"); cupsFileClose(tokens); /* * Return with no errors... */ return (0); } /* * 'compare_html()' - Compare the titles of two HTML files. */ static int /* O - Result of comparison */ compare_html(_cups_html_t *a, /* I - First file */ _cups_html_t *b) /* I - Second file */ { return (_cups_strcasecmp(a->title, b->title)); } /* * 'compare_sections()' - Compare the names of two help sections. */ static int /* O - Result of comparison */ compare_sections(_cups_section_t *a, /* I - First section */ _cups_section_t *b) /* I - Second section */ { return (_cups_strcasecmp(a->name, b->name)); } /* * 'compare_sections_files()' - Compare the number of files and section names. */ static int /* O - Result of comparison */ compare_sections_files( _cups_section_t *a, /* I - First section */ _cups_section_t *b) /* I - Second section */ { int ret = cupsArrayCount(b->files) - cupsArrayCount(a->files); if (ret) return (ret); else return (_cups_strcasecmp(a->name, b->name)); } /* * 'write_index()' - Write an index file for the CUPS help. */ static void write_index(const char *path, /* I - File to write */ help_index_t *hi) /* I - Index of files */ { cups_file_t *fp; /* Output file */ help_node_t *node; /* Current help node */ _cups_section_t *section, /* Current section */ key; /* Section search key */ _cups_html_t *html; /* Current HTML file */ cups_array_t *sections, /* Sections in index */ *sections_files,/* Sections sorted by size */ *columns[3]; /* Columns in final HTML file */ int column, /* Current column */ lines[3], /* Number of lines in each column */ min_column, /* Smallest column */ min_lines; /* Smallest number of lines */ /* * Build an array of sections and their files. */ sections = cupsArrayNew((cups_array_func_t)compare_sections, NULL); for (node = (help_node_t *)cupsArrayFirst(hi->nodes); node; node = (help_node_t *)cupsArrayNext(hi->nodes)) { if (node->anchor) continue; key.name = node->section ? node->section : "Miscellaneous"; if ((section = (_cups_section_t *)cupsArrayFind(sections, &key)) == NULL) { section = (_cups_section_t *)calloc(1, sizeof(_cups_section_t)); section->name = key.name; section->files = cupsArrayNew((cups_array_func_t)compare_html, NULL); cupsArrayAdd(sections, section); } html = (_cups_html_t *)calloc(1, sizeof(_cups_html_t)); html->path = node->filename; html->title = node->text; cupsArrayAdd(section->files, html); } /* * Build a sorted list of sections based on the number of files in each section * and the section name... */ sections_files = cupsArrayNew((cups_array_func_t)compare_sections_files, NULL); for (section = (_cups_section_t *)cupsArrayFirst(sections); section; section = (_cups_section_t *)cupsArrayNext(sections)) cupsArrayAdd(sections_files, section); /* * Then build three columns to hold everything, trying to balance the number of * lines in each column... */ for (column = 0; column < 3; column ++) { columns[column] = cupsArrayNew((cups_array_func_t)compare_sections, NULL); lines[column] = 0; } for (section = (_cups_section_t *)cupsArrayFirst(sections_files); section; section = (_cups_section_t *)cupsArrayNext(sections_files)) { for (min_column = 0, min_lines = lines[0], column = 1; column < 3; column ++) { if (lines[column] < min_lines) { min_column = column; min_lines = lines[column]; } } cupsArrayAdd(columns[min_column], section); lines[min_column] += cupsArrayCount(section->files) + 2; } /* * Write the HTML file... */ if ((fp = cupsFileOpen(path, "w")) == NULL) { fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, strerror(errno)); exit(1); } cupsFilePuts(fp, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " "Transitional//EN\" " "\"http://www.w3.org/TR/html4/loose.dtd\">\n" "<html>\n" "<head>\n" "<title>CUPS Documentation\n" "\n" "\n" "\n" "

    CUPS Documentation

    \n" "\n" "\n"); for (column = 0; column < 3; column ++) { if (column) cupsFilePuts(fp, "\n"); cupsFilePuts(fp, "\n"); } cupsFilePuts(fp, "\n" "
         "); for (section = (_cups_section_t *)cupsArrayFirst(columns[column]); section; section = (_cups_section_t *)cupsArrayNext(columns[column])) { cupsFilePrintf(fp, "

    %s

    \n", section->name); for (html = (_cups_html_t *)cupsArrayFirst(section->files); html; html = (_cups_html_t *)cupsArrayNext(section->files)) cupsFilePrintf(fp, "

    %s

    \n", html->path, html->title); } cupsFilePuts(fp, "
    \n" "\n" "\n"); cupsFileClose(fp); } /* * 'write_info()' - Write the Info.plist file. */ static void write_info(const char *path, /* I - File to write */ const char *revision) /* I - Subversion revision number */ { cups_file_t *fp; /* File */ if ((fp = cupsFileOpen(path, "w")) == NULL) { fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, strerror(errno)); exit(1); } cupsFilePrintf(fp, "\n" "\n" "\n" "\n" "\tCFBundleIdentifier\n" "\torg.cups.docset\n" "\tCFBundleName\n" "\tCUPS Documentation\n" "\tCFBundleVersion\n" "\t%d.%d.%s\n" "\tCFBundleShortVersionString\n" "\t%d.%d.%d\n" "\tDocSetFeedName\n" "\tcups.org\n" "\tDocSetFeedURL\n" "\thttp://www.cups.org/org.cups.docset.atom" "\n" "\tDocSetPublisherIdentifier\n" "\torg.cups\n" "\tDocSetPublisherName\n" "\tCUPS\n" "\n" "\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, revision, CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH); cupsFileClose(fp); } /* * 'write_nodes()' - Write the Nodes.xml file. */ static void write_nodes(const char *path, /* I - File to write */ help_index_t *hi) /* I - Index of files */ { cups_file_t *fp; /* Output file */ int id; /* Current node ID */ help_node_t *node; /* Current help node */ int subnodes; /* Currently in Subnodes for file? */ int needclose; /* Need to close the current node? */ if ((fp = cupsFileOpen(path, "w")) == NULL) { fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, strerror(errno)); exit(1); } cupsFilePuts(fp, "\n" "\n" "\n" "\n" "CUPS Documentation\n" "Documentation/index.html\n" "\n"); for (node = (help_node_t *)cupsArrayFirst(hi->nodes), id = 1, subnodes = 0, needclose = 0; node; node = (help_node_t *)cupsArrayNext(hi->nodes), id ++) { if (node->anchor) { if (!subnodes) { cupsFilePuts(fp, "\n"); subnodes = 1; } cupsFilePrintf(fp, "\n" "Documentation/%s\n" "%s\n" "%s\n" "\n", id, node->filename, node->anchor, node->text); } else { if (subnodes) { cupsFilePuts(fp, "\n"); subnodes = 0; } if (needclose) cupsFilePuts(fp, "\n"); cupsFilePrintf(fp, "\n" "Documentation/%s\n" "%s\n", id, node->filename, node->text); needclose = 1; } } if (subnodes) cupsFilePuts(fp, "\n"); if (needclose) cupsFilePuts(fp, "\n"); cupsFilePuts(fp, "\n" "\n"); cupsFileClose(fp); } cups-2.3.1/cgi-bin/html.c000664 000765 000024 00000007132 13574721672 015222 0ustar00mikestaff000000 000000 /* * HTML support functions for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" /* * Local globals... */ static const char *cgi_multipart = NULL; /* Multipart separator, if any */ /* * Local functions... */ static const char *cgi_null_passwd(const char *prompt); /* * 'cgiEndHTML()' - End a HTML page. */ void cgiEndHTML(void) { /* * Send the standard trailer... */ cgiCopyTemplateLang("trailer.tmpl"); } /* * 'cgiEndMultipart()' - End the delivery of a multipart web page. */ void cgiEndMultipart(void) { if (cgi_multipart) { printf("\n%s--\n", cgi_multipart); fflush(stdout); } } /* * 'cgiFormEncode()' - Encode a string as a form variable. */ char * /* O - Destination string */ cgiFormEncode(char *dst, /* I - Destination string */ const char *src, /* I - Source string */ size_t dstsize) /* I - Size of destination string */ { char *dstptr, /* Pointer into destination */ *dstend; /* End of destination */ static const char *hex = /* Hexadecimal characters */ "0123456789ABCDEF"; /* * Mark the end of the string... */ dstend = dst + dstsize - 1; /* * Loop through the source string and copy... */ for (dstptr = dst; *src && dstptr < dstend;) { switch (*src) { case ' ' : /* * Encode spaces with a "+"... */ *dstptr++ = '+'; src ++; break; case '&' : case '%' : case '+' : /* * Encode special characters with %XX escape... */ if (dstptr < (dstend - 2)) { *dstptr++ = '%'; *dstptr++ = hex[(*src & 255) >> 4]; *dstptr++ = hex[*src & 15]; src ++; } break; default : /* * Copy other characters literally... */ *dstptr++ = *src++; break; } } /* * Nul-terminate the destination string... */ *dstptr = '\0'; /* * Return the encoded string... */ return (dst); } /* * 'cgiStartHTML()' - Start a HTML page. */ void cgiStartHTML(const char *title) /* I - Title of page */ { /* * Disable any further authentication attempts... */ cupsSetPasswordCB(cgi_null_passwd); /* * Tell the client to expect UTF-8 encoded HTML... */ if (cgi_multipart) puts(cgi_multipart); puts("Content-Type: text/html;charset=utf-8\n"); /* * Send a standard header... */ cgiSetVariable("TITLE", title); cgiSetServerVersion(); cgiCopyTemplateLang("header.tmpl"); } /* * 'cgiStartMultipart()' - Start a multipart delivery of a web page. */ void cgiStartMultipart(void) { puts("MIME-Version: 1.0\n" "Content-Type: multipart/x-mixed-replace; boundary=\"CUPS-MULTIPART\"\n"); fflush(stdout); cgi_multipart = "--CUPS-MULTIPART"; } /* * 'cgiSupportsMultipart()' - Does the browser support multi-part documents? */ int /* O - 1 if multi-part supported, 0 otherwise */ cgiSupportsMultipart(void) { /* * Too many bug reports for browsers that don't support it, and too much pain * to whitelist known-good browsers, so for now we just punt on multi-part * support... :( */ return (0); } /* * 'cgi_null_passwd()' - Return a NULL password for authentication. */ static const char * /* O - NULL */ cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */ { (void)prompt; fprintf(stderr, "DEBUG: cgi_null_passwd(prompt=\"%s\") called!\n", prompt ? prompt : "(null)"); return (NULL); } cups-2.3.1/cgi-bin/classes.c000664 000765 000024 00000027406 13574721672 015721 0ustar00mikestaff000000 000000 /* * Class status CGI for CUPS. * * Copyright 2007-2016 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi-private.h" /* * Local functions... */ static void do_class_op(http_t *http, const char *printer, ipp_op_t op, const char *title); static void show_all_classes(http_t *http, const char *username); static void show_class(http_t *http, const char *printer); /* * 'main()' - Main entry for CGI. */ int /* O - Exit status */ main(void) { const char *pclass; /* Class name */ const char *user; /* Username */ http_t *http; /* Connection to the server */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ const char *op; /* Operation to perform, if any */ static const char *def_attrs[] = /* Attributes for default printer */ { "printer-name", "printer-uri-supported" }; /* * Get any form variables... */ cgiInitialize(); op = cgiGetVariable("OP"); /* * Set the web interface section... */ cgiSetVariable("SECTION", "classes"); cgiSetVariable("REFRESH_PAGE", ""); /* * See if we are displaying a printer or all classes... */ if ((pclass = getenv("PATH_INFO")) != NULL) { pclass ++; if (!*pclass) pclass = NULL; if (pclass) cgiSetVariable("PRINTER_NAME", pclass); } /* * See who is logged in... */ user = getenv("REMOTE_USER"); /* * Connect to the HTTP server... */ http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); /* * Get the default printer... */ if (!op || !cgiIsPOST()) { /* * Get the default destination... */ request = ippNewRequest(CUPS_GET_DEFAULT); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs); if ((response = cupsDoRequest(http, request, "/")) != NULL) { if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL) cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text); if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) { char url[HTTP_MAX_URI]; /* New URL */ cgiSetVariable("DEFAULT_URI", cgiRewriteURL(attr->values[0].string.text, url, sizeof(url), NULL)); } ippDelete(response); } /* * See if we need to show a list of classes or the status of a * single printer... */ if (!pclass) show_all_classes(http, user); else show_class(http, pclass); } else if (pclass) { if (!*op) { const char *server_port = getenv("SERVER_PORT"); /* Port number string */ int port = atoi(server_port ? server_port : "0"); /* Port number */ char uri[1024]; /* URL */ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), getenv("HTTPS") ? "https" : "http", NULL, getenv("SERVER_NAME"), port, "/classes/%s", pclass); printf("Location: %s\n\n", uri); } else if (!strcmp(op, "start-class")) do_class_op(http, pclass, IPP_RESUME_PRINTER, cgiText(_("Resume Class"))); else if (!strcmp(op, "stop-class")) do_class_op(http, pclass, IPP_PAUSE_PRINTER, cgiText(_("Pause Class"))); else if (!strcmp(op, "accept-jobs")) do_class_op(http, pclass, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); else if (!strcmp(op, "reject-jobs")) do_class_op(http, pclass, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); else if (!strcmp(op, "cancel-jobs")) do_class_op(http, pclass, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs"))); else if (!_cups_strcasecmp(op, "print-test-page")) cgiPrintTestPage(http, pclass); else if (!_cups_strcasecmp(op, "move-jobs")) cgiMoveJobs(http, pclass, 0); else { /* * Unknown/bad operation... */ cgiStartHTML(pclass); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } } else { /* * Unknown/bad operation... */ cgiStartHTML(cgiText(_("Classes"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } /* * Close the HTTP server connection... */ httpClose(http); /* * Return with no errors... */ return (0); } /* * 'do_class_op()' - Do a class operation. */ static void do_class_op(http_t *http, /* I - HTTP connection */ const char *printer, /* I - Printer name */ ipp_op_t op, /* I - Operation to perform */ const char *title) /* I - Title of page */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI], /* Printer URI */ resource[HTTP_MAX_URI]; /* Path for request */ /* * Build a printer request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(op); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); /* * Do the request and get back a response... */ snprintf(resource, sizeof(resource), "/classes/%s", printer); ippDelete(cupsDoRequest(http, request, resource)); if (cupsLastError() == IPP_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } else if (cupsLastError() > IPP_OK_CONFLICT) { cgiStartHTML(title); cgiShowIPPError(_("Unable to do maintenance command")); } else { /* * Redirect successful updates back to the printer page... */ char url[1024], /* Printer/class URL */ refresh[1024]; /* Refresh URL */ cgiRewriteURL(uri, url, sizeof(url), NULL); cgiFormEncode(uri, url, sizeof(uri)); snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); cgiSetVariable("refresh_page", refresh); cgiStartHTML(title); cgiSetVariable("IS_CLASS", "YES"); if (op == IPP_PAUSE_PRINTER) cgiCopyTemplateLang("printer-stop.tmpl"); else if (op == IPP_RESUME_PRINTER) cgiCopyTemplateLang("printer-start.tmpl"); else if (op == CUPS_ACCEPT_JOBS) cgiCopyTemplateLang("printer-accept.tmpl"); else if (op == CUPS_REJECT_JOBS) cgiCopyTemplateLang("printer-reject.tmpl"); else if (op == IPP_OP_CANCEL_JOBS) cgiCopyTemplateLang("printer-cancel-jobs.tmpl"); } cgiEndHTML(); } /* * 'show_all_classes()' - Show all classes... */ static void show_all_classes(http_t *http, /* I - Connection to server */ const char *user) /* I - Username */ { int i; /* Looping var */ ipp_t *request, /* IPP request */ *response; /* IPP response */ cups_array_t *classes; /* Array of class objects */ ipp_attribute_t *pclass; /* Class object */ int first, /* First class to show */ count; /* Number of classes */ const char *var; /* Form variable */ void *search; /* Search data */ char val[1024]; /* Form variable */ /* * Show the standard header... */ cgiStartHTML(cgiText(_("Classes"))); /* * Build a CUPS_GET_CLASSES request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * requesting-user-name */ request = ippNewRequest(CUPS_GET_CLASSES); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user); cgiGetAttributes(request, "classes.tmpl"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Get a list of matching job objects. */ if ((var = cgiGetVariable("QUERY")) != NULL && !cgiGetVariable("CLEAR")) search = cgiCompileSearch(var); else search = NULL; classes = cgiGetIPPObjects(response, search); count = cupsArrayCount(classes); if (search) cgiFreeSearch(search); /* * Figure out which classes to display... */ if ((var = cgiGetVariable("FIRST")) != NULL) first = atoi(var); else first = 0; if (first >= count) first = count - CUPS_PAGE_MAX; first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX; if (first < 0) first = 0; sprintf(val, "%d", count); cgiSetVariable("TOTAL", val); for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, first); i < CUPS_PAGE_MAX && pclass; i ++, pclass = (ipp_attribute_t *)cupsArrayNext(classes)) cgiSetIPPObjectVars(pclass, NULL, i); /* * Save navigation URLs... */ cgiSetVariable("THISURL", "/classes/"); if (first > 0) { sprintf(val, "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { sprintf(val, "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } if (count > CUPS_PAGE_MAX) { snprintf(val, sizeof(val), "%d", CUPS_PAGE_MAX * (count / CUPS_PAGE_MAX)); cgiSetVariable("LAST", val); } /* * Then show everything... */ cgiCopyTemplateLang("search.tmpl"); cgiCopyTemplateLang("classes-header.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); cgiCopyTemplateLang("classes.tmpl"); if (count > CUPS_PAGE_MAX) cgiCopyTemplateLang("pager.tmpl"); /* * Delete the response... */ cupsArrayDelete(classes); ippDelete(response); } else { /* * Show the error... */ cgiShowIPPError(_("Unable to get class list")); } cgiEndHTML(); } /* * 'show_class()' - Show a single class. */ static void show_class(http_t *http, /* I - Connection to server */ const char *pclass) /* I - Name of class */ { ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ char uri[HTTP_MAX_URI]; /* Printer URI */ char refresh[1024]; /* Refresh URL */ /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri */ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", pclass); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); cgiGetAttributes(request, "class.tmpl"); /* * Do the request and get back a response... */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { /* * Got the result; set the CGI variables and check the status of a * single-queue request... */ cgiSetIPPVars(response, NULL, NULL, NULL, 0); if (pclass && (attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL && attr->values[0].integer == IPP_PRINTER_PROCESSING) { /* * Class is processing - automatically refresh the page until we * are done printing... */ cgiFormEncode(uri, pclass, sizeof(uri)); snprintf(refresh, sizeof(refresh), "10;URL=/classes/%s", uri); cgiSetVariable("refresh_page", refresh); } /* * Delete the response... */ ippDelete(response); /* * Show the standard header... */ cgiStartHTML(pclass); /* * Show the class status... */ cgiCopyTemplateLang("class.tmpl"); /* * Show jobs for the specified class... */ cgiCopyTemplateLang("class-jobs-header.tmpl"); cgiShowJobs(http, pclass); } else { /* * Show the IPP error... */ cgiStartHTML(pclass); cgiShowIPPError(_("Unable to get class status")); } cgiEndHTML(); } cups-2.3.1/cgi-bin/var.c000664 000765 000024 00000063570 13574721672 015056 0ustar00mikestaff000000 000000 /* * CGI form variable and array functions for CUPS. * * 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. */ /* * Include necessary headers... */ /*#define DEBUG*/ #include "cgi-private.h" #include /* * Session ID name */ #define CUPS_SID "org.cups.sid" /* * Data structure to hold all the CGI form variables and arrays... */ typedef struct /**** Form variable structure ****/ { char *name; /* Name of variable */ int nvalues, /* Number of values */ avalues; /* Number of values allocated */ char **values; /* Value(s) of variable */ } _cgi_var_t; /* * Local globals... */ static int num_cookies = 0;/* Number of cookies */ static cups_option_t *cookies = NULL;/* Cookies */ static int form_count = 0, /* Form variable count */ form_alloc = 0; /* Number of variables allocated */ static _cgi_var_t *form_vars = NULL; /* Form variables */ static cgi_file_t *form_file = NULL; /* Uploaded file */ /* * Local functions... */ static void cgi_add_variable(const char *name, int element, const char *value); static int cgi_compare_variables(const _cgi_var_t *v1, const _cgi_var_t *v2); static _cgi_var_t *cgi_find_variable(const char *name); static void cgi_initialize_cookies(void); static int cgi_initialize_get(void); static int cgi_initialize_multipart(const char *boundary); static int cgi_initialize_post(void); static int cgi_initialize_string(const char *data); static const char *cgi_passwd(const char *prompt); static const char *cgi_set_sid(void); static void cgi_sort_variables(void); static void cgi_unlink_file(void); /* * 'cgiCheckVariables()' - Check for the presence of "required" variables. * * Names may be separated by spaces and/or commas. */ int /* O - 1 if all variables present, 0 otherwise */ cgiCheckVariables(const char *names) /* I - Variables to look for */ { char name[255], /* Current variable name */ *s; /* Pointer in string */ const char *val; /* Value of variable */ int element; /* Array element number */ if (names == NULL) return (1); while (*names != '\0') { while (*names == ' ' || *names == ',') names ++; for (s = name; *names != '\0' && *names != ' ' && *names != ','; s ++, names ++) *s = *names; *s = 0; if (name[0] == '\0') break; if ((s = strrchr(name, '-')) != NULL) { *s = '\0'; element = atoi(s + 1) - 1; val = cgiGetArray(name, element); } else val = cgiGetVariable(name); if (val == NULL) return (0); if (*val == '\0') { free((void *)val); return (0); /* Can't be blank, either! */ } free((void *)val); } return (1); } /* * 'cgiClearVariables()' - Clear all form variables. */ void cgiClearVariables(void) { int i, j; /* Looping vars */ _cgi_var_t *v; /* Current variable */ fputs("DEBUG: cgiClearVariables called.\n", stderr); for (v = form_vars, i = form_count; i > 0; v ++, i --) { free(v->name); for (j = 0; j < v->nvalues; j ++) if (v->values[j]) free(v->values[j]); } form_count = 0; cgi_unlink_file(); } /* * 'cgiGetArray()' - Get an element from a form array. */ char * /* O - Element value or NULL */ cgiGetArray(const char *name, /* I - Name of array variable */ int element) /* I - Element number (0 to N) */ { _cgi_var_t *var; /* Pointer to variable */ if ((var = cgi_find_variable(name)) == NULL) return (NULL); if (element < 0 || element >= var->nvalues) return (NULL); if (var->values[element] == NULL) return (NULL); return (strdup(var->values[element])); } /* * 'cgiGetCookie()' - Get a cookie value. */ const char * /* O - Value or NULL */ cgiGetCookie(const char *name) /* I - Name of cookie */ { return (cupsGetOption(name, num_cookies, cookies)); } /* * 'cgiGetFile()' - Get the file (if any) that was submitted in the form. */ const cgi_file_t * /* O - Attached file or NULL */ cgiGetFile(void) { return (form_file); } /* * 'cgiGetSize()' - Get the size of a form array value. */ int /* O - Number of elements */ cgiGetSize(const char *name) /* I - Name of variable */ { _cgi_var_t *var; /* Pointer to variable */ if ((var = cgi_find_variable(name)) == NULL) return (0); return (var->nvalues); } /* * 'cgiGetVariable()' - Get a CGI variable from the database. * * Returns NULL if the variable doesn't exist. If the variable is an * array of values, returns the last element. */ char * /* O - Value of variable */ cgiGetVariable(const char *name) /* I - Name of variable */ { const _cgi_var_t *var; /* Returned variable */ var = cgi_find_variable(name); return ((var == NULL) ? NULL : strdup(var->values[var->nvalues - 1])); } /* * 'cgiInitialize()' - Initialize the CGI variable "database". */ int /* O - Non-zero if there was form data */ cgiInitialize(void) { const char *method, /* Form posting method */ *content_type, /* Content-Type of post data */ *cups_sid_cookie, /* SID cookie */ *cups_sid_form; /* SID form variable */ /* * Setup a password callback for authentication... */ cupsSetPasswordCB(cgi_passwd); /* * Set the locale so that times, etc. are formatted properly... */ setlocale(LC_ALL, ""); #ifdef DEBUG /* * Disable output buffering to find bugs... */ setbuf(stdout, NULL); #endif /* DEBUG */ /* * Get cookies... */ cgi_initialize_cookies(); if ((cups_sid_cookie = cgiGetCookie(CUPS_SID)) == NULL) { fputs("DEBUG: " CUPS_SID " cookie not found, initializing!\n", stderr); cups_sid_cookie = cgi_set_sid(); } fprintf(stderr, "DEBUG: " CUPS_SID " cookie is \"%s\"\n", cups_sid_cookie); /* * Get the request method (GET or POST)... */ method = getenv("REQUEST_METHOD"); content_type = getenv("CONTENT_TYPE"); if (!method) return (0); /* * Grab form data from the corresponding location... */ if (!_cups_strcasecmp(method, "GET")) return (cgi_initialize_get()); else if (!_cups_strcasecmp(method, "POST") && content_type) { const char *boundary = strstr(content_type, "boundary="); if (boundary) boundary += 9; if (content_type && !strncmp(content_type, "multipart/form-data; ", 21)) { if (!cgi_initialize_multipart(boundary)) return (0); } else if (!cgi_initialize_post()) return (0); if ((cups_sid_form = cgiGetVariable(CUPS_SID)) == NULL || strcmp(cups_sid_cookie, cups_sid_form)) { if (cups_sid_form) fprintf(stderr, "DEBUG: " CUPS_SID " form variable is \"%s\"\n", cups_sid_form); else fputs("DEBUG: " CUPS_SID " form variable is not present.\n", stderr); free((void *)cups_sid_form); cgiClearVariables(); return (0); } else { free((void *)cups_sid_form); return (1); } } else return (0); } /* * 'cgiIsPOST()' - Determine whether this page was POSTed. */ int /* O - 1 if POST, 0 if GET */ cgiIsPOST(void) { const char *method; /* REQUEST_METHOD environment variable */ if ((method = getenv("REQUEST_METHOD")) == NULL) return (0); else return (!strcmp(method, "POST")); } /* * 'cgiSetArray()' - Set array element N to the specified string. * * If the variable array is smaller than (element + 1), the intervening * elements are set to NULL. */ void cgiSetArray(const char *name, /* I - Name of variable */ int element, /* I - Element number (0 to N) */ const char *value) /* I - Value of variable */ { int i; /* Looping var */ _cgi_var_t *var; /* Returned variable */ if (name == NULL || value == NULL || element < 0 || element > 100000) return; fprintf(stderr, "DEBUG: cgiSetArray: %s[%d]=\"%s\"\n", name, element, value); if ((var = cgi_find_variable(name)) == NULL) { cgi_add_variable(name, element, value); cgi_sort_variables(); } else { if (element >= var->avalues) { char **temp; /* Temporary pointer */ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(element + 16)); if (!temp) return; var->avalues = element + 16; var->values = temp; } if (element >= var->nvalues) { for (i = var->nvalues; i < element; i ++) var->values[i] = NULL; var->nvalues = element + 1; } else if (var->values[element]) free((char *)var->values[element]); var->values[element] = strdup(value); } } /* * 'cgiSetCookie()' - Set a cookie value. */ void cgiSetCookie(const char *name, /* I - Name */ const char *value, /* I - Value */ const char *path, /* I - Path (typically "/") */ const char *domain, /* I - Domain name */ time_t expires, /* I - Expiration date (0 for session) */ int secure) /* I - Require SSL */ { num_cookies = cupsAddOption(name, value, num_cookies, &cookies); printf("Set-Cookie: %s=%s;", name, value); if (path) printf(" path=%s;", path); if (domain) printf(" domain=%s;", domain); if (expires) { char date[256]; /* Date string */ printf(" expires=%s;", httpGetDateString2(expires, date, sizeof(date))); } if (secure) puts(" httponly; secure;"); else puts(" httponly;"); } /* * 'cgiSetSize()' - Set the array size. */ void cgiSetSize(const char *name, /* I - Name of variable */ int size) /* I - Number of elements (0 to N) */ { int i; /* Looping var */ _cgi_var_t *var; /* Returned variable */ if (name == NULL || size < 0 || size > 100000) return; if ((var = cgi_find_variable(name)) == NULL) return; if (size >= var->avalues) { char **temp; /* Temporary pointer */ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(size + 16)); if (!temp) return; var->avalues = size + 16; var->values = temp; } if (size > var->nvalues) { for (i = var->nvalues; i < size; i ++) var->values[i] = NULL; } else if (size < var->nvalues) { for (i = size; i < var->nvalues; i ++) if (var->values[i]) free((void *)(var->values[i])); } var->nvalues = size; } /* * 'cgiSetVariable()' - Set a CGI variable in the database. * * If the variable is an array, this truncates the array to a single element. */ void cgiSetVariable(const char *name, /* I - Name of variable */ const char *value) /* I - Value of variable */ { int i; /* Looping var */ _cgi_var_t *var; /* Returned variable */ if (name == NULL || value == NULL) return; fprintf(stderr, "cgiSetVariable: %s=\"%s\"\n", name, value); if ((var = cgi_find_variable(name)) == NULL) { cgi_add_variable(name, 0, value); cgi_sort_variables(); } else { for (i = 0; i < var->nvalues; i ++) if (var->values[i]) free((char *)var->values[i]); var->values[0] = strdup(value); var->nvalues = 1; } } /* * 'cgi_add_variable()' - Add a form variable. */ static void cgi_add_variable(const char *name, /* I - Variable name */ int element, /* I - Array element number */ const char *value) /* I - Variable value */ { _cgi_var_t *var; /* New variable */ if (name == NULL || value == NULL || element < 0 || element > 100000) return; if (form_count >= form_alloc) { _cgi_var_t *temp_vars; /* Temporary form pointer */ if (form_alloc == 0) temp_vars = malloc(sizeof(_cgi_var_t) * 16); else temp_vars = realloc(form_vars, (size_t)(form_alloc + 16) * sizeof(_cgi_var_t)); if (!temp_vars) return; form_vars = temp_vars; form_alloc += 16; } var = form_vars + form_count; if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL) return; var->name = strdup(name); var->nvalues = element + 1; var->avalues = element + 1; var->values[element] = strdup(value); form_count ++; } /* * 'cgi_compare_variables()' - Compare two variables. */ static int /* O - Result of comparison */ cgi_compare_variables( const _cgi_var_t *v1, /* I - First variable */ const _cgi_var_t *v2) /* I - Second variable */ { return (_cups_strcasecmp(v1->name, v2->name)); } /* * 'cgi_find_variable()' - Find a variable. */ static _cgi_var_t * /* O - Variable pointer or NULL */ cgi_find_variable(const char *name) /* I - Name of variable */ { _cgi_var_t key; /* Search key */ if (form_count < 1 || name == NULL) return (NULL); key.name = (char *)name; return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t), (int (*)(const void *, const void *))cgi_compare_variables)); } /* * 'cgi_initialize_cookies()' - Initialize cookies. */ static void cgi_initialize_cookies(void) { const char *cookie; /* HTTP_COOKIE environment variable */ char name[128], /* Name string */ value[512], /* Value string */ *ptr; /* Pointer into name/value */ if ((cookie = getenv("HTTP_COOKIE")) == NULL) return; while (*cookie) { int skip = 0; /* Skip this cookie? */ /* * Skip leading whitespace... */ while (isspace(*cookie & 255)) cookie ++; if (!*cookie) break; /* * Copy the name... */ for (ptr = name; *cookie && *cookie != '=';) if (ptr < (name + sizeof(name) - 1)) { *ptr++ = *cookie++; } else { skip = 1; cookie ++; } if (*cookie != '=') break; *ptr = '\0'; cookie ++; /* * Then the value... */ if (*cookie == '\"') { for (cookie ++, ptr = value; *cookie && *cookie != '\"';) if (ptr < (value + sizeof(value) - 1)) { *ptr++ = *cookie++; } else { skip = 1; cookie ++; } if (*cookie == '\"') cookie ++; else skip = 1; } else { for (ptr = value; *cookie && *cookie != ';';) if (ptr < (value + sizeof(value) - 1)) { *ptr++ = *cookie++; } else { skip = 1; cookie ++; } } if (*cookie == ';') cookie ++; else if (*cookie) skip = 1; *ptr = '\0'; /* * Then add the cookie to an array as long as the name doesn't start with * "$"... */ if (name[0] != '$' && !skip) num_cookies = cupsAddOption(name, value, num_cookies, &cookies); } } /* * 'cgi_initialize_get()' - Initialize form variables using the GET method. */ static int /* O - 1 if form data read */ cgi_initialize_get(void) { char *data; /* Pointer to form data string */ /* * Check to see if there is anything for us to read... */ data = getenv("QUERY_STRING"); if (data == NULL || strlen(data) == 0) return (0); /* * Parse it out and return... */ return (cgi_initialize_string(data)); } /* * 'cgi_initialize_multipart()' - Initialize variables and file using the POST * method. * * TODO: Update to support files > 2GB. */ static int /* O - 1 if form data was read */ cgi_initialize_multipart( const char *boundary) /* I - Boundary string */ { char line[10240], /* MIME header line */ name[1024], /* Form variable name */ filename[1024], /* Form filename */ mimetype[1024], /* MIME media type */ bstring[256], /* Boundary string to look for */ *ptr, /* Pointer into name/filename */ *end; /* End of buffer */ int ch, /* Character from file */ fd; /* Temporary file descriptor */ size_t blen; /* Length of boundary string */ /* * Read multipart form data until we run out... */ name[0] = '\0'; filename[0] = '\0'; mimetype[0] = '\0'; snprintf(bstring, sizeof(bstring), "\r\n--%s", boundary); blen = strlen(bstring); while (fgets(line, sizeof(line), stdin)) { if (!strcmp(line, "\r\n")) { /* * End of headers, grab value... */ if (filename[0]) { /* * Read an embedded file... */ if (form_file) { /* * Remove previous file... */ cgi_unlink_file(); } /* * Allocate memory for the new file... */ if ((form_file = calloc(1, sizeof(cgi_file_t))) == NULL) return (0); form_file->name = strdup(name); form_file->filename = strdup(filename); form_file->mimetype = strdup(mimetype); fd = cupsTempFd(form_file->tempfile, sizeof(form_file->tempfile)); if (fd < 0) return (0); atexit(cgi_unlink_file); /* * Copy file data to the temp file... */ ptr = line; while ((ch = getchar()) != EOF) { *ptr++ = (char)ch; if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen)) { ptr -= blen; break; } if ((ptr - line - (int)blen) >= 8192) { /* * Write out the first 8k of the buffer... */ write(fd, line, 8192); memmove(line, line + 8192, (size_t)(ptr - line - 8192)); ptr -= 8192; } } /* * Write the rest of the data and close the temp file... */ if (ptr > line) write(fd, line, (size_t)(ptr - line)); close(fd); } else { /* * Just get a form variable; the current code only handles * form values up to 10k in size... */ ptr = line; end = line + sizeof(line) - 1; while ((ch = getchar()) != EOF) { if (ptr < end) *ptr++ = (char)ch; if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen)) { ptr -= blen; break; } } *ptr = '\0'; /* * Set the form variable... */ if ((ptr = strrchr(name, '-')) != NULL && isdigit(ptr[1] & 255)) { /* * Set a specific index in the array... */ *ptr++ = '\0'; if (line[0]) cgiSetArray(name, atoi(ptr) - 1, line); } else if ((ptr = cgiGetVariable(name)) != NULL) { /* * Add another element in the array... */ free(ptr); cgiSetArray(name, cgiGetSize(name), line); } else { /* * Just set the line... */ cgiSetVariable(name, line); } } /* * Read the rest of the current line... */ fgets(line, sizeof(line), stdin); /* * Clear the state vars... */ name[0] = '\0'; filename[0] = '\0'; mimetype[0] = '\0'; } else if (!_cups_strncasecmp(line, "Content-Disposition:", 20)) { if ((ptr = strstr(line + 20, " name=\"")) != NULL) { strlcpy(name, ptr + 7, sizeof(name)); if ((ptr = strchr(name, '\"')) != NULL) *ptr = '\0'; } if ((ptr = strstr(line + 20, " filename=\"")) != NULL) { strlcpy(filename, ptr + 11, sizeof(filename)); if ((ptr = strchr(filename, '\"')) != NULL) *ptr = '\0'; } } else if (!_cups_strncasecmp(line, "Content-Type:", 13)) { for (ptr = line + 13; isspace(*ptr & 255); ptr ++); strlcpy(mimetype, ptr, sizeof(mimetype)); for (ptr = mimetype + strlen(mimetype) - 1; ptr > mimetype && isspace(*ptr & 255); *ptr-- = '\0'); } } /* * Return 1 for "form data found"... */ return (1); } /* * 'cgi_initialize_post()' - Initialize variables using the POST method. */ static int /* O - 1 if form data was read */ cgi_initialize_post(void) { char *content_length, /* Length of input data (string) */ *data; /* Pointer to form data string */ size_t length, /* Length of input data */ tbytes; /* Total number of bytes read */ ssize_t nbytes; /* Number of bytes read this read() */ int status; /* Return status */ /* * Check to see if there is anything for us to read... */ content_length = getenv("CONTENT_LENGTH"); if (content_length == NULL || atoi(content_length) <= 0) return (0); /* * Get the length of the input stream and allocate a buffer for it... */ length = (size_t)strtol(content_length, NULL, 10); data = malloc(length + 1); // lgtm [cpp/uncontrolled-allocation-size] if (data == NULL) return (0); /* * Read the data into the buffer... */ for (tbytes = 0; tbytes < length; tbytes += (size_t)nbytes) if ((nbytes = read(0, data + tbytes, (size_t)(length - tbytes))) < 0) { if (errno != EAGAIN) { free(data); return (0); } else nbytes = 0; } else if (nbytes == 0) { /* * CUPS STR #3176: OpenBSD: Early end-of-file on POST data causes 100% CPU * * This should never happen, but does on OpenBSD. If we see early end-of- * file, treat this as an error and process no data. */ free(data); return (0); } data[length] = '\0'; /* * Parse it out... */ status = cgi_initialize_string(data); /* * Free the data and return... */ free(data); return (status); } /* * 'cgi_initialize_string()' - Initialize form variables from a string. */ static int /* O - 1 if form data was processed */ cgi_initialize_string(const char *data) /* I - Form data string */ { int done; /* True if we're done reading a form variable */ char *s, /* Pointer to current form string */ ch, /* Temporary character */ name[255], /* Name of form variable */ value[65536], /* Variable value */ *temp; /* Temporary pointer */ /* * Check input... */ if (data == NULL) return (0); /* * Loop until we've read all the form data... */ while (*data != '\0') { /* * Get the variable name... */ for (s = name; *data != '\0'; data ++) if (*data == '=') break; else if (*data >= ' ' && s < (name + sizeof(name) - 1)) *s++ = *data; *s = '\0'; if (*data == '=') data ++; else return (0); /* * Read the variable value... */ for (s = value, done = 0; !done && *data != '\0'; data ++) switch (*data) { case '&' : /* End of data... */ done = 1; break; case '+' : /* Escaped space character */ if (s < (value + sizeof(value) - 1)) *s++ = ' '; break; case '%' : /* Escaped control character */ /* * Read the hex code... */ if (!isxdigit(data[1] & 255) || !isxdigit(data[2] & 255)) return (0); if (s < (value + sizeof(value) - 1)) { data ++; ch = *data - '0'; if (ch > 9) ch -= 7; *s = (char)(ch << 4); data ++; ch = *data - '0'; if (ch > 9) ch -= 7; *s++ |= ch; } else data += 2; break; default : /* Other characters come straight through */ if (*data >= ' ' && s < (value + sizeof(value) - 1)) *s++ = *data; break; } *s = '\0'; /* nul terminate the string */ /* * Remove trailing whitespace... */ if (s > value) s --; while (s >= value && isspace(*s & 255)) *s-- = '\0'; /* * Add the string to the variable "database"... */ if ((s = strrchr(name, '-')) != NULL && isdigit(s[1] & 255)) { *s++ = '\0'; if (value[0]) cgiSetArray(name, atoi(s) - 1, value); } else if ((temp = cgiGetVariable(name)) != NULL) { free(temp); cgiSetArray(name, cgiGetSize(name), value); } else cgiSetVariable(name, value); } return (1); } /* * 'cgi_passwd()' - Catch authentication requests and notify the server. * * This function sends a Status header and exits, forcing authentication * for this request. */ static const char * /* O - NULL (no return) */ cgi_passwd(const char *prompt) /* I - Prompt (not used) */ { (void)prompt; fprintf(stderr, "DEBUG: cgi_passwd(prompt=\"%s\") called!\n", prompt ? prompt : "(null)"); /* * Send a 401 (unauthorized) status to the server, so it can notify * the client that authentication is required. */ puts("Status: 401\n"); exit(0); /* * This code is never executed, but is present to satisfy the compiler. */ return (NULL); } /* * 'cgi_set_sid()' - Set the CUPS session ID. */ static const char * /* O - New session ID */ cgi_set_sid(void) { char buffer[512], /* SID data */ sid[33]; /* SID string */ unsigned char sum[16]; /* MD5 sum */ const char *remote_addr, /* REMOTE_ADDR */ *server_name, /* SERVER_NAME */ *server_port; /* SERVER_PORT */ struct timeval curtime; /* Current time */ if ((remote_addr = getenv("REMOTE_ADDR")) == NULL) remote_addr = "REMOTE_ADDR"; if ((server_name = getenv("SERVER_NAME")) == NULL) server_name = "SERVER_NAME"; if ((server_port = getenv("SERVER_PORT")) == NULL) server_port = "SERVER_PORT"; gettimeofday(&curtime, NULL); CUPS_SRAND(curtime.tv_sec + curtime.tv_usec); snprintf(buffer, sizeof(buffer), "%s:%s:%s:%02X%02X%02X%02X%02X%02X%02X%02X", remote_addr, server_name, server_port, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255); cupsHashData("md5", (unsigned char *)buffer, strlen(buffer), sum, sizeof(sum)); cgiSetCookie(CUPS_SID, cupsHashString(sum, sizeof(sum), sid, sizeof(sid)), "/", NULL, 0, 0); return (cupsGetOption(CUPS_SID, num_cookies, cookies)); } /* * 'cgi_sort_variables()' - Sort all form variables for faster lookup. */ static void cgi_sort_variables(void) { if (form_count < 2) return; qsort(form_vars, (size_t)form_count, sizeof(_cgi_var_t), (int (*)(const void *, const void *))cgi_compare_variables); } /* * 'cgi_unlink_file()' - Remove the uploaded form. */ static void cgi_unlink_file(void) { if (form_file) { /* * Remove the temporary file... */ unlink(form_file->tempfile); /* * Free memory used... */ free(form_file->name); free(form_file->filename); free(form_file->mimetype); free(form_file); form_file = NULL; } } cups-2.3.1/cgi-bin/testhi.html000664 000765 000024 00000001453 13574721672 016300 0ustar00mikestaff000000 000000 Test File for Help Index Code

    This is a test file for the help index code. The help index code reads plain HTML and indexes the title and any anchored text, ignoring all other markup. Anchor tags must be on a single line, although the text they wrap may cross multiple lines and be up to 1024 bytes in length.

    This is the First Anchor

    This is some text for the first anchor.

    This is the Second Anchor

    This is some text for the first anchor.

    John asked Mary to the dance.

    This is the Third Anchor

    This is some text for the third anchor. This is an in-line anchor that crosses a line.

    cups-2.3.1/cgi-bin/help-index.h000664 000765 000024 00000003616 13574721672 016323 0ustar00mikestaff000000 000000 /* * Online help index definitions for CUPS. * * Copyright 2007-2011 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ #ifndef _CUPS_HELP_INDEX_H_ # define _CUPS_HELP_INDEX_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Data structures... */ typedef struct help_word_s /**** Help word structure... ****/ { int count; /* Number of occurrences */ char *text; /* Word text */ } help_word_t; typedef struct help_node_s /**** Help node structure... ****/ { char *filename; /* Filename, relative to help dir */ char *section; /* Section name (NULL if none) */ char *anchor; /* Anchor name (NULL if none) */ char *text; /* Text in anchor */ cups_array_t *words; /* Words after this node */ time_t mtime; /* Last modification time */ off_t offset; /* Offset in file */ size_t length; /* Length in bytes */ int score; /* Search score */ } help_node_t; typedef struct help_index_s /**** Help index structure ****/ { int search; /* 1 = search index, 0 = normal */ cups_array_t *nodes; /* Nodes sorted by filename */ cups_array_t *sorted; /* Nodes sorted by score + text */ } help_index_t; /* * Functions... */ extern void helpDeleteIndex(help_index_t *hi); extern help_node_t *helpFindNode(help_index_t *hi, const char *filename, const char *anchor); extern help_index_t *helpLoadIndex(const char *hifile, const char *directory); extern int helpSaveIndex(help_index_t *hi, const char *hifile); extern help_index_t *helpSearchIndex(help_index_t *hi, const char *query, const char *section, const char *filename); # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_HELP_INDEX_H_ */ cups-2.3.1/cgi-bin/cgi.h000664 000765 000024 00000006660 13574721672 015032 0ustar00mikestaff000000 000000 /* * CGI support library definitions for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_CGI_H_ # define _CUPS_CGI_H_ # include # include # include # include # ifdef _WIN32 # include # include # else # include # endif /* _WIN32 */ # include # include # include "help-index.h" /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Types... */ typedef struct cgi_file_s /**** Uploaded file data ****/ { char tempfile[1024], /* Temporary file containing data */ *name, /* Variable name */ *filename, /* Original filename */ *mimetype; /* MIME media type */ size_t filesize; /* Size of uploaded file */ } cgi_file_t; /* * Prototypes... */ extern void cgiAbort(const char *title, const char *stylesheet, const char *format, ...); extern int cgiCheckVariables(const char *names); extern void cgiClearVariables(void); extern void *cgiCompileSearch(const char *query); extern void cgiCopyTemplateFile(FILE *out, const char *tmpl); extern void cgiCopyTemplateLang(const char *tmpl); extern int cgiDoSearch(void *search, const char *text); extern void cgiEndHTML(void); extern void cgiEndMultipart(void); extern char *cgiFormEncode(char *dst, const char *src, size_t dstsize); extern void cgiFreeSearch(void *search); extern char *cgiGetArray(const char *name, int element); extern void cgiGetAttributes(ipp_t *request, const char *tmpl); extern const char *cgiGetCookie(const char *name); extern const cgi_file_t *cgiGetFile(void); extern cups_array_t *cgiGetIPPObjects(ipp_t *response, void *search); extern int cgiGetSize(const char *name); extern char *cgiGetTemplateDir(void); extern char *cgiGetVariable(const char *name); extern int cgiInitialize(void); extern int cgiIsPOST(void); extern void cgiMoveJobs(http_t *http, const char *dest, int job_id); extern void cgiPrintCommand(http_t *http, const char *dest, const char *command, const char *title); extern void cgiPrintTestPage(http_t *http, const char *dest); extern char *cgiRewriteURL(const char *uri, char *url, int urlsize, const char *newresource); extern void cgiSetArray(const char *name, int element, const char *value); extern void cgiSetCookie(const char *name, const char *value, const char *path, const char *domain, time_t expires, int secure); extern ipp_attribute_t *cgiSetIPPObjectVars(ipp_attribute_t *obj, const char *prefix, int element); extern int cgiSetIPPVars(ipp_t *response, const char *filter_name, const char *filter_value, const char *prefix, int parent_el); extern void cgiSetServerVersion(void); extern void cgiSetSize(const char *name, int size); extern void cgiSetVariable(const char *name, const char *value); extern void cgiShowIPPError(const char *message); extern void cgiShowJobs(http_t *http, const char *dest); extern void cgiStartHTML(const char *title); extern void cgiStartMultipart(void); extern int cgiSupportsMultipart(void); extern const char *cgiText(const char *message); # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_CGI_H_ */ cups-2.3.1/cgi-bin/testcgi.c000664 000765 000024 00000002157 13574721672 015722 0ustar00mikestaff000000 000000 /* * CGI test program for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include "cgi.h" /* * 'main()' - Test the CGI code. */ int /* O - Exit status */ main(void) { /* * Test file upload/multi-part submissions... */ freopen("multipart.dat", "rb", stdin); putenv("CONTENT_TYPE=multipart/form-data; " "boundary=---------------------------1977426492562745908748943111"); putenv("REQUEST_METHOD=POST"); printf("cgiInitialize: "); if (cgiInitialize()) { const cgi_file_t *file; /* Upload file */ if ((file = cgiGetFile()) != NULL) { puts("PASS"); printf(" tempfile=\"%s\"\n", file->tempfile); printf(" name=\"%s\"\n", file->name); printf(" filename=\"%s\"\n", file->filename); printf(" mimetype=\"%s\"\n", file->mimetype); } else puts("FAIL (no file!)"); } else puts("FAIL (init)"); /* * Return with no errors... */ return (0); } cups-2.3.1/examples/ipp-2.0.test000664 000765 000024 00000016366 13574721672 016417 0ustar00mikestaff000000 000000 # # IPP/2.0 test suite. # # Copyright © 2007-2017 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Usage: # # ./ipptool -V 2.0 -f filename -t printer-uri ipp-2.0.test # # Do all of the IPP/1.1 tests as an IPP/2.0 client # # Required by: PWG 5100.12 section 4.1 INCLUDE "ipp-1.1.test" # Regular expression for PWG media size names (eek!) DEFINE MEDIA_REGEX "/^(choice(_((custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])in|(custom|iso|jis|jpn|prc|om|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])mm)){2,}|(custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])in|(custom|iso|jis|jpn|prc|om|roll)_[a-z0-9][-a-z0-9]*_([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])x([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])mm)$$/" # Test required printer description attribute support. # # Required by: PWG 5100.12 section 6.2 { NAME "PWG 5100.12 section 6.2 - Required Printer Description Attributes" OPERATION Get-Printer-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format application/octet-stream STATUS successful-ok # Figure out capabilities EXPECT color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true DEFINE-MATCH PRINTER_IS_COLOR # Job template attributes EXPECT copies-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0 EXPECT copies-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3 EXPECT media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$MEDIA_REGEX" EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX" EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX" EXPECT orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6 EXPECT orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6 EXPECT output-bin-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1 EXPECT output-bin-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag EXPECT print-quality-default OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5 EXPECT print-quality-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5 EXPECT printer-resolution-default OF-TYPE resolution IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag EXPECT sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/" EXPECT sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/" # Optional media-col support EXPECT ?media-col-default OF-TYPE collection IN-GROUP printer-attributes-tag COUNT 1 EXPECT ?media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag EXPECT ?media-col-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT media-col-supported WITH-VALUE media-back-coating DEFINE-MATCH HAVE_MEDIA_BACK_COATING EXPECT media-col-supported WITH-VALUE media-color DEFINE-MATCH HAVE_MEDIA_COLOR EXPECT media-col-supported WITH-VALUE media-front-coating DEFINE-MATCH HAVE_MEDIA_FRONT_COATING EXPECT media-col-supported WITH-VALUE media-grain DEFINE-MATCH HAVE_MEDIA_GRAIN EXPECT media-col-supported WITH-VALUE media-hole-count DEFINE-MATCH HAVE_MEDIA_HOLE_COUNT EXPECT media-col-supported WITH-VALUE media-info DEFINE-MATCH HAVE_MEDIA_INFO EXPECT media-col-supported WITH-VALUE media-key DEFINE-MATCH HAVE_MEDIA_KEY EXPECT media-col-supported WITH-VALUE media-order-count DEFINE-MATCH HAVE_MEDIA_ORDER_COUNT EXPECT media-col-supported WITH-VALUE media-pre-printed DEFINE-MATCH HAVE_MEDIA_PRE_PRINTED EXPECT media-col-supported WITH-VALUE media-recycled DEFINE-MATCH HAVE_MEDIA_RECYCLED EXPECT media-col-supported WITH-VALUE media-size DEFINE-MATCH HAVE_MEDIA_SIZE EXPECT media-col-supported WITH-VALUE media-tooth DEFINE-MATCH HAVE_MEDIA_TOOTH EXPECT media-col-supported WITH-VALUE media-type DEFINE-MATCH HAVE_MEDIA_TYPE EXPECT media-col-supported WITH-VALUE media-weight-metric DEFINE-MATCH HAVE_MEDIA_WEIGHT_METRIC EXPECT media-back-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_BACK_COATING EXPECT media-color-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_COLOR EXPECT media-front-coating-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_FRONT_COATING EXPECT media-grain-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_GRAIN EXPECT media-hole-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_HOLE_COUNT EXPECT media-info-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_INFO EXPECT media-key-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_KEY EXPECT media-order-count-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0 IF-DEFINED HAVE_MEDIA_ORDER_COUNT EXPECT media-pre-printed-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_PRE_PRINTED EXPECT media-recycled-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_RECYCLED EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_SIZE EXPECT media-tooth-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TOOTH EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag IF-DEFINED HAVE_MEDIA_TYPE EXPECT media-weight-metric-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >-1 IF-DEFINED HAVE_MEDIA_WEIGHT_METRIC # Printer description attributes EXPECT color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 EXPECT pages-per-minute OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 EXPECT pages-per-minute-color OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED PRINTER_IS_COLOR EXPECT !pages-per-minute-color IF-NOT-DEFINED PRINTER_IS_COLOR EXPECT printer-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/" EXPECT printer-location OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/" EXPECT printer-make-and-model OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/" EXPECT printer-more-info OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 } cups-2.3.1/examples/create-job-format.test000664 000765 000024 00000002446 13574721672 020625 0ustar00mikestaff000000 000000 # Print a test page using create-job + send-document, specifying the # document format. { # The name of the test... NAME "Print test page using create-job" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION create-job # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user GROUP job ATTR integer copies 1 # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes # What attributes do we expect? EXPECT job-id EXPECT job-uri } { # The name of the test... NAME "... and send-document" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION send-document # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR integer job-id $job-id ATTR name requesting-user-name $user ATTR mimetype document-format application/postscript ATTR boolean last-document true FILE ../data/testprint.ps # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes } cups-2.3.1/examples/ipp-everywhere.test000664 000765 000024 00001135567 13574721672 020313 0ustar00mikestaff000000 000000 # # IPP Everywhere test suite. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Usage: # # ./ipptool -V 2.0 -tf filename.ext printer-uri ipp-everywhere.test # # Do all of the IPP/1.1 and IPP/2.0 tests INCLUDE "ipp-2.0.test" # Test required printer description attribute support. # # Required by: PWG 5100.14 { NAME "PWG 5100.14 section 5.1/5.2 - Required Operations and Attributes" OPERATION Get-Printer-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format application/octet-stream ATTR keyword requested-attributes all,media-col-database STATUS successful-ok # Operations EXPECT operations-supported WITH-VALUE 0x0002 # Print-Job EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job EXPECT operations-supported WITH-VALUE 0x0005 # Create-Job EXPECT operations-supported WITH-VALUE 0x0006 # Send-Document EXPECT operations-supported WITH-VALUE 0x0008 # Cancel-Job EXPECT operations-supported WITH-VALUE 0x0009 # Get-Job-Attributes EXPECT operations-supported WITH-VALUE 0x000a # Get-Jobs EXPECT operations-supported WITH-VALUE 0x000b # Get-Printer-Attributes EXPECT operations-supported WITH-VALUE 0x0039 # Cancel-My-Jobs EXPECT operations-supported WITH-VALUE 0x003b # Close-Job EXPECT operations-supported WITH-VALUE 0x003c # Identify-Printer # Printer description attributes EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "deflate" DEFINE-MATCH HAVE_DEFLATE EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "gzip" DEFINE-MATCH HAVE_GZIP EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/jpeg" EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "image/pwg-raster" EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag WITH-VALUE "/^(application/pdf|application/openxps)$/" DEFINE-MATCH PDF_OR_OPENXPS EXPECT feed-orientation-supported OF-TYPE keyword IN-GROUP printer-attributes-tag DEFINE-MATCH FEED_ORIENTATION_SUPPORTED EXPECT feed-orientation-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED FEED_ORIENTATION_SUPPORTED EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag DEFINE-MATCH FINISHINGS_SUPPORTED EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag IF-DEFINED FINISHINGS_SUPPORTED EXPECT identify-actions-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/" EXPECT identify-actions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(display|flash|sound|speak)$/" EXPECT ipp-features-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "ipp-everywhere" EXPECT job-account-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNT_ID_SUPPORTED EXPECT job-account-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNT_ID_SUPPORTED EXPECT job-accounting-user-id-supported OF-TYPE boolean IN-GROUP printer-attributes-tag WITH-VALUE true COUNT 1 DEFINE-MATCH JOB_ACCOUNTING_USER_ID_SUPPORTED EXPECT job-accounting-user-id-default OF-TYPE name|no-value IN-GROUP printer-attributes-tag COUNT 1 IF-DEFINED JOB_ACCOUNTING_USER_ID_SUPPORTED EXPECT job-constraints-supported OF-TYPE collection IN-GROUP printer-attributes-tag DEFINE-MATCH JOB_CONSTRAINTS_SUPPORTED EXPECT job-resolvers-supported OF-TYPE collection IN-GROUP printer-attributes-tag IF-DEFINED JOB_CONSTRAINTS_SUPPORTED EXPECT job-creation-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT job-ids-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true EXPECT preferred-attributes-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 EXPECT media-bottom-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1 EXPECT media-left-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1 EXPECT media-right-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1 EXPECT media-top-margin-supported OF-TYPE integer IN-GROUP printer-attributes-tag WITH-ALL-VALUES >-1 EXPECT media-col-database OF-TYPE collection IN-GROUP printer-attributes-tag EXPECT media-col-ready OF-TYPE collection IN-GROUP printer-attributes-tag EXPECT media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag EXPECT media-size-supported OF-TYPE collection IN-GROUP printer-attributes-tag EXPECT media-source-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag EXPECT media-type-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag EXPECT multiple-document-jobs-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 EXPECT multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0 EXPECT multiple-operation-time-out-action OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(abort-job|hold-job|process-job)$/" EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-number" EXPECT overrides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "pages" EXPECT page-ranges-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE true IF-DEFINED PDF_OR_OPENXPS EXPECT print-color-mode-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/" EXPECT print-color-mode-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|auto-monochrome|bi-level|color|highlight|monochrome|process-bi-level|process-monochrome)$/" EXPECT print-content-optimize-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|graphic|photo|text|text-and-graphic)$/" EXPECT print-content-optimize-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|graphic|photo|text|text-and-graphic)$/" EXPECT print-rendering-intent-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/" EXPECT print-rendering-intent-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(auto|absolute|perceptual|relative|relative-bpc|saturation)$/" EXPECT ?printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag EXPECT ?printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert EXPECT printer-charge-info DEFINE-MATCH PRINTER_CHARGE_INFO EXPECT ?printer-charge-info OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-charge-info-uri IF-DEFINED PRINTER_CHARGE_INFO EXPECT ?printer-charge-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-config-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-config-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1 EXPECT printer-device-id OF-TYPE text IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^([-A-Za-z ]+:[^;]*;)+$/" EXPECT printer-geo-location OF-TYPE uri|unknown IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^geo:/" EXPECT printer-get-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "document-format" EXPECT ?printer-icc-profiles-supported OF-TYPE collection IN-GROUP printer-attributes-tag EXPECT printer-icons OF-TYPE uri IN-GROUP printer-attributes-tag EXPECT ?printer-mandatory-job-attributes OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT printer-organization OF-TYPE text IN-GROUP printer-attributes-tag EXPECT printer-organizational-unit OF-TYPE text IN-GROUP printer-attributes-tag EXPECT printer-state-change-date-time OF-TYPE dateTime IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-state-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >-1 EXPECT printer-supply OF-TYPE octetString IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply-description EXPECT printer-supply-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-supply EXPECT printer-supply-info-uri OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-uuid OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^urn:uuid:[0-9A-Fa-f]{8,8}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{4,4}-[0-9A-Fa-f]{12,12}/" EXPECT pwg-raster-document-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag EXPECT pwg-raster-document-resolution-supported WITH-VALUE 150dpi DEFINE-MATCH HAVE_150DPI EXPECT pwg-raster-document-resolution-supported WITH-VALUE 180dpi DEFINE-MATCH HAVE_180DPI EXPECT pwg-raster-document-resolution-supported WITH-VALUE 300dpi DEFINE-MATCH HAVE_300DPI EXPECT pwg-raster-document-resolution-supported WITH-VALUE 360dpi DEFINE-MATCH HAVE_360DPI EXPECT pwg-raster-document-resolution-supported WITH-VALUE 600dpi DEFINE-MATCH HAVE_600DPI EXPECT pwg-raster-document-resolution-supported WITH-VALUE 720dpi DEFINE-MATCH HAVE_720DPI EXPECT pwg-raster-document-sheet-back OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 EXPECT pwg-raster-document-type-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT pwg-raster-document-type-supported WITH-VALUE "black_1" DEFINE-MATCH HAVE_BLACK_1 EXPECT pwg-raster-document-type-supported WITH-VALUE "cmyk_8" DEFINE-MATCH HAVE_CMYK_8 EXPECT pwg-raster-document-type-supported WITH-VALUE "sgray_8" DEFINE-MATCH HAVE_SGRAY_8 EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_8" DEFINE-MATCH HAVE_SRGB_8 EXPECT pwg-raster-document-type-supported WITH-VALUE "srgb_16" DEFINE-MATCH HAVE_SRGB_16 EXPECT which-jobs-supported OF-TYPE keyword IN-GROUP printer-attributes-tag } # Test printing all sample documents { NAME "Print color.jpg-4x6 @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/color.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/color.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/color.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-8/color.jpg-4x6-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 150dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-16/color.jpg-4x6-srgb-16-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/color.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/color.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/color.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-8/color.jpg-4x6-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 180dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-16/color.jpg-4x6-srgb-16-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/color.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/color.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/color.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-8/color.jpg-4x6-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 300dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-16/color.jpg-4x6-srgb-16-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/color.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/color.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/color.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-8/color.jpg-4x6-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 360dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-16/color.jpg-4x6-srgb-16-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/color.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/color.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/color.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-8/color.jpg-4x6-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 600dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-16/color.jpg-4x6-srgb-16-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/color.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/color.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/color.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-8/color.jpg-4x6-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-16" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "color.jpg-4x6" FILE pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "color.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print color.jpg-4x6 @ 720dpi, srgb-16, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_16 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "color.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-16/color.jpg-4x6-srgb-16-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/document-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/document-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/document-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 150dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-8/document-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/document-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/document-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/document-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 180dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-8/document-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/document-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/document-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/document-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 300dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-8/document-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/document-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/document-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/document-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 360dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-8/document-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/document-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/document-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/document-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 600dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-8/document-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/document-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/document-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/document-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-a4" FILE pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-a4 @ 720dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-8/document-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/document-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/document-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/document-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 150dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-8/document-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/document-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/document-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/document-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 180dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-8/document-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/document-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/document-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/document-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 300dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-8/document-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/document-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/document-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/document-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 360dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-8/document-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/document-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/document-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/document-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 600dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-8/document-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/document-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/document-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/document-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "document-letter" FILE pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "document-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print document-letter @ 720dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "document-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-8/document-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/gray.jpg-4x6-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/gray.jpg-4x6-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/gray.jpg-4x6-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/gray.jpg-4x6-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/gray.jpg-4x6-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/gray.jpg-4x6-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/gray.jpg-4x6-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/gray.jpg-4x6-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/gray.jpg-4x6-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/gray.jpg-4x6-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/gray.jpg-4x6-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/gray.jpg-4x6-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/gray.jpg-4x6-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/gray.jpg-4x6-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/gray.jpg-4x6-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/gray.jpg-4x6-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/gray.jpg-4x6-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "gray.jpg-4x6" FILE pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "gray.jpg-4x6" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print gray.jpg-4x6 @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "gray.jpg-4x6" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/gray.jpg-4x6-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/onepage-a4-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/onepage-a4-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/onepage-a4-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 150dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-8/onepage-a4-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/onepage-a4-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/onepage-a4-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/onepage-a4-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 180dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-8/onepage-a4-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/onepage-a4-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/onepage-a4-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/onepage-a4-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 300dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-8/onepage-a4-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/onepage-a4-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/onepage-a4-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/onepage-a4-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 360dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-8/onepage-a4-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/onepage-a4-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/onepage-a4-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/onepage-a4-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 600dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-8/onepage-a4-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/onepage-a4-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/onepage-a4-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/onepage-a4-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-a4" FILE pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-a4" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-a4 @ 720dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-a4" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-8/onepage-a4-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/black-1/onepage-letter-black-1-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/cmyk-8/onepage-letter-cmyk-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/sgray-8/onepage-letter-sgray-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 150dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg SKIP-IF-NOT-DEFINED HAVE_150DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-150dpi/srgb-8/onepage-letter-srgb-8-150dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/black-1/onepage-letter-black-1-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/cmyk-8/onepage-letter-cmyk-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/sgray-8/onepage-letter-sgray-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 180dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg SKIP-IF-NOT-DEFINED HAVE_180DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-180dpi/srgb-8/onepage-letter-srgb-8-180dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/black-1/onepage-letter-black-1-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/cmyk-8/onepage-letter-cmyk-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/sgray-8/onepage-letter-sgray-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 300dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg SKIP-IF-NOT-DEFINED HAVE_300DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-300dpi/srgb-8/onepage-letter-srgb-8-300dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/black-1/onepage-letter-black-1-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/cmyk-8/onepage-letter-cmyk-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/sgray-8/onepage-letter-sgray-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 360dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg SKIP-IF-NOT-DEFINED HAVE_360DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-360dpi/srgb-8/onepage-letter-srgb-8-360dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/black-1/onepage-letter-black-1-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/cmyk-8/onepage-letter-cmyk-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/sgray-8/onepage-letter-sgray-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 600dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg SKIP-IF-NOT-DEFINED HAVE_600DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-600dpi/srgb-8/onepage-letter-srgb-8-600dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, black-1" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, black-1, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, black-1, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_BLACK_1 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/black-1/onepage-letter-black-1-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, cmyk-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, cmyk-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, cmyk-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_CMYK_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/cmyk-8/onepage-letter-cmyk-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, sgray-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, sgray-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, sgray-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SGRAY_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/sgray-8/onepage-letter-sgray-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, srgb-8" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR name job-name "onepage-letter" FILE pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, srgb-8, deflate" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_DEFLATE OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression deflate ATTR name job-name "onepage-letter" COMPRESSION deflate FILE pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } { NAME "Print onepage-letter @ 720dpi, srgb-8, gzip" SKIP-IF-MISSING pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg SKIP-IF-NOT-DEFINED HAVE_720DPI SKIP-IF-NOT-DEFINED HAVE_SRGB_8 SKIP-IF-NOT-DEFINED HAVE_GZIP OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format image/pwg-raster ATTR keyword compression gzip ATTR name job-name "onepage-letter" COMPRESSION gzip FILE pwg-raster-samples-720dpi/srgb-8/onepage-letter-srgb-8-720dpi.pwg STATUS successful-ok STATUS server-error-busy REPEAT-MATCH } # # End of "$Id$". # cups-2.3.1/examples/r300-basic.drv000664 000765 000024 00000003327 13574721672 016702 0ustar00mikestaff000000 000000 // Include standard font and media definitions #include #include // Include ESC/P driver definitions #include // Specify that this driver uses the ESC/P driver... DriverType escp // Specify the driver options via the model number... ModelNumber ($ESCP_ESCK $ESCP_EXT_UNITS $ESCP_EXT_MARGINS $ESCP_USB $ESCP_PAGE_SIZE $ESCP_RASTER_ESCI) // List the fonts that are supported, in this case all standard // fonts... Font * // Manufacturer and driver version Manufacturer "Epson" Version 1.0 // Supported page sizes and their margins HWMargins 8.4 0 8.4 0 *MediaSize Letter MediaSize Legal MediaSize Executive MediaSize Statement MediaSize A4 MediaSize A5 MediaSize A6 MediaSize B5 MediaSize Env10 MediaSize EnvC5 MediaSize EnvDL MediaSize EnvISOB5 MediaSize Postcard MediaSize DoublePostcard VariablePaperSize Yes MinSize 1in 4in MaxSize 8.5in 44in // Four color modes are supported... ColorModel Gray/Grayscale w chunky 1 ColorModel Black k chunky 1 *ColorModel RGB/Color rgb chunky 1 ColorModel CMYK cmyk chunky 1 // Supported resolutions Resolution - 8 90 0 103 "360dpi/360 DPI" *Resolution - 8 90 0 206 "720dpi/720 DPI" Resolution - 8 90 0 412 "1440dpi/1440 DPI" // Very basic dithering settings Attribute cupsInkChannels "" 6 Attribute cupsInkLimit "" 2.0 Attribute cupsCyanLtDk "" "0.5 1.0" Attribute cupsMagentaLtDk "" "0.5 1.0" Attribute cupsAllDither 360dpi "0.5 0.75 1.0" Attribute cupsAllDither 720dpi "0.6 0.9 1.2" Attribute cupsAllDither 1440dpi "0.9 1.35" Attribute cupsESCPDotSize 360dpi 16 Attribute cupsESCPDotSize 720dpi 17 Attribute cupsESCPDotSize 1440dpi 18 { // EPSON Stylus Photo R300 Series Throughput 1 ModelName "Stylus Photo R300" PCFileName "epspr301.ppd" } cups-2.3.1/examples/get-ppds-make-and-model.test000664 000765 000024 00000000771 13574721672 021617 0ustar00mikestaff000000 000000 # Get PPD files using CUPS-Get-PPDs and model { # The name of the test... NAME "Get PPD files using CUPS-Get-PPDs and model" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-Get-PPDs # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR text ppd-make-and-model $ENV[model] # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/get-ppds-product.test000664 000765 000024 00000000770 13574721672 020523 0ustar00mikestaff000000 000000 # Get PPD files using CUPS-Get-PPDs and Product { # The name of the test... NAME "Get PPD files using CUPS-Get-PPDs and Product" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-Get-PPDs # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR text ppd-product $ENV[product] # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/laserjet-pjl.drv000664 000765 000024 00000004426 13574721672 017534 0ustar00mikestaff000000 000000 // Include standard font and media definitions #include #include // Include HP-PCL driver definitions #include // Specify that this driver uses the HP-PCL driver... DriverType pcl // Specify the driver options via the model number... ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION) // List the fonts that are supported, in this case all standard // fonts... Font * // Manufacturer and driver version Manufacturer "HP" Version 2.0 // Supported page sizes and their margins HWMargins 18 12 18 12 *MediaSize Letter MediaSize Legal MediaSize Executive MediaSize Monarch MediaSize Statement MediaSize FanFoldGermanLegal HWMargins 18 12.72 18 12.72 MediaSize Env10 HWMargins 9.72 12 9.72 12 MediaSize A4 MediaSize A5 MediaSize B5 MediaSize EnvC5 MediaSize EnvDL MediaSize EnvISOB5 MediaSize Postcard MediaSize DoublePostcard // Only black-and-white output with mode 3 compression... ColorModel Gray k chunky 3 // Supported resolutions Resolution - 1 0 0 0 "300dpi/300 DPI" *Resolution - 8 0 0 0 "600dpi/600 DPI" // Supported input slots *InputSlot 7 "Auto/Automatic Selection" InputSlot 2 "Manual/Tray 1 - Manual Feed" InputSlot 4 "Upper/Tray 1" InputSlot 1 "Lower/Tray 2" InputSlot 5 "LargeCapacity/Tray 3" // Tray 3 is an option... Installable "OptionLargeCapacity/Tray 3 Installed" UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity" // PJL options Attribute cupsPJL cupsRET "@PJL SET SMOOTHING=%?False:OFF;%?True:ON;%n" Option "cupsRET/Smoothing" Boolean DocumentSetup 10 Choice "False/Off" "" *Choice "True/On" "" Attribute cupsPJL cupsTonerSave "@PJL SET ECONOMODE=%?False:OFF;%?True:ON;%n" Option "cupsTonerSave/Save Toner" Boolean DocumentSetup 10 *Choice "False/No" "" Choice "True/Yes" "" { // HP LaserJet 2100 Series Throughput 10 ModelName "LaserJet 2100 Series PJL" PCFileName "hpljt212.ppd" } { // LaserJet 2200 and 2300 series have duplexer option... Duplex normal Installable "OptionDuplex/Duplexer Installed" UIConstraints "*OptionDuplex False *Duplex" { // HP LaserJet 2200 Series Throughput 19 ModelName "LaserJet 2200 Series PJL" PCFileName "hpljt222.ppd" } { // HP LaserJet 2300 Series Throughput 25 ModelName "LaserJet 2300 Series PJL" PCFileName "hpljt232.ppd" } } cups-2.3.1/examples/create-printer-subscription.test000664 000765 000024 00000002662 13574721672 022772 0ustar00mikestaff000000 000000 # Create a printer subscription. # # Usage: # # ./ipptool [-d recipient=uri] printer-uri create-printer-subscription.test { # The name of the test... NAME "Create a push printer subscription" SKIP-IF-NOT-DEFINED recipient # The operation to use OPERATION Create-Printer-Subscription # The attributes to send GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri GROUP subscription-attributes-tag ATTR uri notify-recipient-uri $recipient ATTR keyword notify-events printer-config-changed,printer-state-changed # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT notify-subscription-id OF-TYPE integer WITH-VALUE >0 DISPLAY notify-subscription-id } { # The name of the test... NAME "Create a pull printer subscription" SKIP-IF-DEFINED recipient # The operation to use OPERATION Create-Printer-Subscription # The attributes to send GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri GROUP subscription-attributes-tag ATTR keyword notify-pull-method ippget ATTR keyword notify-events printer-config-changed,printer-state-changed # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT notify-subscription-id OF-TYPE integer WITH-VALUE >0 DISPLAY notify-subscription-id } cups-2.3.1/examples/get-ppds-language.test000664 000765 000024 00000001010 13574721672 020612 0ustar00mikestaff000000 000000 # Get PPD files using CUPS-Get-PPDs and language { # The name of the test... NAME "Get PPD files using CUPS-Get-PPDs and language" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-Get-PPDs # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR language ppd-natural-language $ENV[language] # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/create-job-timeout.test000664 000765 000024 00000002313 13574721672 021014 0ustar00mikestaff000000 000000 # Print a test page using create-job + send-document, but don't send # last-document = true { # The name of the test... NAME "Print test page using create-job" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION create-job # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user GROUP job ATTR integer copies 1 ATTR name job-sheets unclassified,unclassified # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT job-id EXPECT job-uri } { # The name of the test... NAME "... and send-document" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION send-document # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR integer job-id $job-id ATTR name requesting-user-name $user ATTR mimetype document-format application/octet-stream FILE ../data/testprint.ps # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/get-ppd-printer.test000664 000765 000024 00000000706 13574721672 020342 0ustar00mikestaff000000 000000 # Get printer PPD file using CUPS-Get-PPD { # The name of the test... NAME "Get printer PPD file using CUPS-Get-PPD" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-Get-PPD # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/gray.jpg000664 000765 000024 00000405647 13574721672 016101 0ustar00mikestaff000000 000000 JFIFHHXICC_PROFILEHappl scnrRGB XYZ acspAPPLappl-appl rXYZgXYZbXYZ0wtptDchadX,rTRCgTRCbTRCdescncprtAdscmXYZ tK>XYZ Zs&XYZ (W3XYZ Rsf32 B&lcurv3mluc enUS$esES,LdaDK4deDE,fiFI(frFU<itIT,rnlNL$noNO xptBR(JsvSE*jaJPkoKR2zhTW2zhCNKameran RGB-profiiliRGB-profil fr Kamera000 RGB 000000exOMvj_ RGB r_icϏPerfil RGB para CmaraRGB-kameraprofilRGB-Profil fr Kamerasvg: RGB cϏeNRGB-beskrivelse til KameraRGB-profiel CameratT| RGB \ |Perfil RGB de CmeraProfilo RGB FotocameraCamera RGB ProfileProfil RVB de l appareil-phototextCopyright 2003 Apple Computer Inc., all rights reserved.descCamera RGB ProfileCamera RGB Profile~ExifMM* (12<̇iCanonCanon EOS 30DHHQuickTime 7.42008:02:03 22:54:07Mac OS X 10.5.1"'02202 FN V  ^0100fn 2007:11:15 17:56:022007:11:15 17:56:02:W;;http://ns.adobe.com/xap/1.0/ 720516805 EF28-135mm f/3.5-5.6 IS USM unknown 65535 Firmware 1.0.4 224 0/1 C      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?2зƆf7ϥi`&,v똉_|\&f)s:O,g`nRI9C6?1@ƃ CᨦSun _D(cC2CN2ob`c5 vzZɸGӝ4fª&ڭ֤̗6ǎV#>ƓMմM67^5~< ğ84 I&I34.?Uhz4/튻 I V:eւ})aOcY6D\›ʠ¯UyFa\9C@-Xct ޠ5QhzD,€@'xU;^Cu|`F?'OΖhHe]{}>eJL*ʜs޳&.3@zEh[ڢIE3@48=l6>vN~ƞ g]n$_+n >XC@y"$w_ l^jX736vLl&aΏV.9ύ嶸^ڵM:wQo HMV$edqYcy%*GPաe;݅s?ʀo] 8qTQ>\iݺ]FyڭtS+^msS{pϒ@^@AoRSu= DOSMڊ=ʬO5̨6@e-.\9`8$q@ZGQ:R<ۃӯ"Yچ+<8aSN{\nG)X8nO4ib7ڀ;Ke$~\Ux7:4Z?ghF[?+f ϓq2qGˎ+xkǝ!Ik7'׈p(e5YSNKs8ML؞+?V7ivBD&Vt%F"Uoh%ebx<' Z=.OxF25)3f2gm 7cZ]<*r= wMƭ#HljMXK]EpɌ  rr3Bg MiI>,ṗ15xi֦2;C#6㓓:Og⯁~hux#kĐȓ"R뼐:ISC)IOG%Քf:}ntփ'#Bp ;ޙGBQ+!zso|J) YE6qF Rx^٣Wgⅅl]\ZHc܊tBzy68GCnzsgMk )z+o|c>;"2fa; ) 242k229s@ڃ[\ ʒp# ĺ'Yd1OoZYN Sbb14U`zb|w+7R5Olz+m?OT* >}zc%u#oev, IcOڵWEI ܜFzOYZPЊ a RAqO5 ҤQd}2ʀ6㏭r6> }E#[`OКߓ~tFG@d0A)ݕrq4Fyu%Yp@Lf#4$k^\l?,_m=ك *=#:,S"nܽ}xIv!KP|L'I]׮>H-ّ Vo Z̖X.R0vCHSO 3j4mɺC"]7UK:i.F0ܟb)?dԭ1 1Yz5x4~ :M7QQާ:ƾRO܎{1i-B+El4ca~u_cӯcs=&Laqo|jZ,J[,VJ֧249qZt"z􀇰hNAilU9sz K#˂[Ҟ59W˂6Ik S|2JҒx[xV;O&C7u\>~ߵ߃75-itZ]uz!k^Ry9?fpwZ5$0 +no؛O⟈_o>%𝤺y MܒG F298UP b@ɽok}Lh_ i;Gm4ő1$t8a|T?hO+;shcp8WO mmă1_wo?+ccL uB+-Ћ8 W͚O$< ^񮓥$VHJ9c-3VQ su Q=TJ.lCUf_@>DG>xKόiת^Hە>c&m1?훢|._o$ӵcLZ#I F$)axN+ai$w‘Y5h>7xg qCJ8C@G5{6O>*j,\Z~48m>%IJ1WnŒ6~ٯşI׈_h:XtIdV-9 +4\agϜz >S<֛jD^Ty䲑l`)yl\GHqI叹'˟8~ iz_ b$.pzfq0sE~"\=~n Ii+9dWNJ~SSg{4-a /#U;4o>5|3a>y}g'*,ɸd l%-ar;*9u(. "g_ӭ~}C◊~ZKo>+m4:n}cEz57c[awKezudсC)__i Ⓘ2l\~?4+Be=84%_N x^H%=Q…BU0] Jh3&A$!?f`! xx37~PY@P`!{m]P__ގEkǞOx:V_Io#i%IBG87 8s*3ZY=Ť)o5]KCG*F *;p}_,x |7牴fo :Aӗ!.tTzW]ߴ,!Z$I MV</.-TKwK iou*2Ƥd1O؇ ?޵Zڬ^xvBGPWQbgNw_d-"aNlTq{ ~Zn^f/%X#Tt%3p3Z+o90.:`eo߉SOh:5a5 YO[!s ~ѺG.э#n[x???e_htN{di`PI|#^) DRȁс @ޛ<4r0cG߯5CRI'AWIhfT{ܬU;FzjmPViMހ*x&;x|.\F 2NsZ;m8(:b<9> ]_J?x &"ݧ) EC2㞂04ɥ`V-!#zlj?cG\I3edrqd\FM߉VQ=FKCשȠzs(lqˠi0TWVNO8t׿`xcMP'7H[ΛG+\ލ-x}ዝ"(dbͺ &IMѢ8#>++H!ЎzkVۛEs}Z^']RpI|vm$Q<,TrF6U#?_&Ϳ OPӵ-9 ŭʬ r@LyLIE|ax[ OixVOfwf]0o+U{ex7ut,F"!€ep= gKrGKP:%M}t*ѪX.N \fTy$&GoV''&q@?O$/~!xIO'g#]Q$οO@v"\`E~̢+'JHV#ʀ!`G4*H't `4ʇE_Qio"L&E#$c5"̲q@ Pۗ|i?gr|?itn/Xk%$smr |zovɚ(. AzOA'-/ؼ$gvRLѷmӆRI#*O o>(~к7mcs,2FE:1A3 _7xoGխYI1}ciO/mn_Cawopʾc*!`gm~gP ~_cRxDl}(N}(gIYj&K>QL*/#e|~?6^.կɳʐ Zm?z(R{]f-Ab۸ t~X|(>Xj>cPk[Dlul̻U덎y #k|O_$2i*>|~7Pۻ^W|9bD"E(P]$a#5>dN|B>x%4;,l/VY1v!0 ;whR[wtmֿz?K?O>0GXj=;K'ڿE$'i+8s~?QnZf.9٥C4kI1^:C޽/ e,R&a76':?o/WU&yjwZZDn55.d@E#*y*[-?cs~_  EѰV'l#wZ_kX%9 4~?'ß7i^ . s-y (wW .^g>e|?n9OVC[w&6a{B9e x(~_ Zh>*/W~/t6:u\yI[\zנ~ϟ=7ևcyGַzvWvOD bhs0ܣhb3 ~߲"~ʞD<К)b_7ea9Xa8\d _؇ je??}OKoEX- ,bܬф|1#ր?Hڳ)iV~#YyTde`1_ xDŽ4o8G /d9Pks.Hocm)2=}k/ Y<17x3~!>LXԭt( 0FvQP)== XD!'#w?)|m׊uiqבsnd\l?kwē>>SVK-m.u9-$ңO,Is_G> 㷈4%RZ"aǍFWȠs߰Wt_6cm@,cuKKi9_1Ҿ>+RRUbv7q럛~('s~+|U俹t?Fi-r${/ sp>?گh i=:Yoى;D]@, 1<  Les\mq|XH3?ueB xZ'ŋPKKCk"0~Y–]"6>}wwO?դ.A3+,0ep^:osGi/j^3w.kڔӻiM#pȨr@=' _@j(|3-; xT> 0iD #ckA{k/.%2&uI2IFxjᏈZ?OQ<9u\$hC=b3!Tgӌ7{~Q>4 oi.s˗ׯti mylHv9 `('|wX>2+?;t1 /9vO=%Lv15ާ,l4o! xYؒsӁ'?|DQxxrUF U6;K$Eq׌6аls>bK=+:C_IߺZE<ƢM:oD`@N{~5kNk~1:Y"w!:q.~xC㵗.uۛMK-֥7WR3%N !?_?ਾKW_kY4׉tο#FAs 8(x6die]`B}3q-qa?o߈/uk?]pc.'HcUA /ukQ<+sfRKM!Wx' ?Yr@͔#h/ҨA}Pt?Z]闏|eD_L}1>VӼY#YG2mE!TGRN>imGD9uz#(?? F+? t xщ sBC ŗVkA| -??H^?ԴEڮ(M+#Ikaq,08llER@\|2o6-6iot}2I+/DKg״ud+_Lx~+ O_Z:(hfmU#!_0|<//#.6yk?*ӵo⧄ȯ-EԩqzkLzFPzb_I]oxzF욢_!Y6΁Bqh+$ӑsW¿pOu?6|W(fxLX.mLFO'5h&6~B*K{H;ȯG}zo\6~M' YkHYb }Fk;Xm4+?6MionvpV|Qsֿ=k' &pO_(ſz6rV9@>ȭfu||5v@$4dGƕ'/?ƾ/_ =wmwHj\Զ!89+3XJ>-%̊]S\`~uMo);+SSmHW Kj<1 iG݅(o|Ba]C}jWI95+629=o?QD$#|ǟ_>Qi?)eoᥲӔ2}?7DUee}A慮 l 4ΜE8ݎ*U*\ +.сPOAJ0HT7+)U,9<~D+J{hA2p>ﱭ/ ƧWӆ[pxXJ,B9 \Vl nzP"WG>QG,y-+n*d˕7` n"MyW "*% e6/[k߂0K_2mc_V16(/!,wzGk&q v6!')`E} 1|ށ2x*Iaxub|=,_R?e~_ |IxuIvEg!C+7@ĿPmG oZ wem/4hcQNXgɓqלWo"[_]/_K ?a^,HBǜ8xʒ[oqӭZyVEEwLocEmFDyzr};~55@;y0:zw$_m丸gL$_ot 2y=@[y+{B?\ ;Qq2|nK/V Ǟ|1&w0y@+?oA$7-D3zy:]Z(88I5O[ų|>+bd0zs~ԗz`]P'9 ¤am y{kǃ/ygz,zlk7- &ܨT>x}ݖ%3x3vQ!+ê[/}̽~ ~x3/ $5n's W$Ȗd$o2Ah贆$ *# c;ٗVڤ:ԆȆ$$rQ%Ԁ=~S_K|mp >>Q6?A€>x9$g_h|+?ea7\i "*$0Hq+wĿdQ3#ۧZrW풓`?:mΛj\edOgzSZh|1GZ7rp'bs JF@5|Ybl?,?䔂H,+ʤ־%]M&sMHv :y29l|+σ~~(iͽ ہzJrYpwv -ҬX]c'-~;r2 |D-a409=<]sq ŷ[D |d=_o2Q(OBZ%,lO.X_A&? 組<% ~=4ʈѧOB0y:hZ2A,NNCD~,\[ylko *b^59I'H1$To0FL}{fr|# ?k6ONde_ |)x_ x,( iZ(=4"4[o/Ƿt>RDD2pCz_J![nfoeoeO.6"s W?WUJoUBd ">ws#@JO [^^{ Ymuե"%1.7`+&?">-'nuOQSws4jX$O&~!8u6[M*%}>$e,cぞ8z>Yxn{?I>JIu yYqq5flIx]p1\.0ZB0r$WPH('>ww!Xy/ocV 38sk?M ?Mվ)|=wu Yu913ekw~U7/G]Cgxmͺڻd>49o?d[O~%+jV!DHͮmUq2R^#]QGEn,H?9YZԲʬI`=yu[_dz{Dm.SM7jO+aϕe -sbҰYx_]i|J",deb19w"ep\+վyE֙lΛ-œZ0OnJJ7V*/ڳπq5XK-zT][ft;E.7΃_?/.,})F&,&,cZ.w~ %l5]v<'6nto"h홣pxjA?@?W/xVU!"Q`p,xAa?/$X4tA@;haazQo ԧxZeXy*rݱX:G?EM+ Ω08ʆ=n_(wUu^|d=gN4{c^GXUd [pG5_ǯ%˪[ꖟ4otWZWhFvƨp3ɠ8gYi>o%jR<`8;%~S5;Y_ſ$Z|I嶍ۛ!35sPw{F7 z( q4cV>w f+t&V  ?e?oiuWp\wW`4EJGa d\>r>~ٟK_#xZW^hv 2$ᦡ%{w4jeoB@~x/+/?eߊ_?eQh:/l677sjW4ɕۻ $4;l#2F /: .~ Hu859]M$0cldcg*Ÿ oug;eD_Phvm|#>'}5 <CG0SčCz4OYҙv#C@?KOQMK-?SHt2aԐGs(5k~ٿn>'xJׂ)o1o{?|{w\׵D5 3́pLp2=I'3 >Οo}Oσ<j^As2J4)`G\@R_)7 >Wi^+ռu~K>xC*~ګ={WSS.f:w:fݬڤOmp}2'#_9C?m?CS6goK⋭%/k ,݇"1`A8_#|#7>'~׎C]_ؽ‚;v1$s@1[wl BI?|7WOfN'5;b򄌹$rN{??e bc_߸uݴ$ƾ-I#Y|ͅ> `kA@;x4]lmPi-)=R22H1MiV?uST`uC6c ֺQ]cfc! b<Mt7$IviSgi/=UMK sƣw$¸ܑ2Pm+w|-Z6eͮmټ[}q C[F7?KxRլVPLLQ" <26>>?~c|MekW?JLG^TC\xsg#__kpǟ@H;W\O/Ek?g{:M̒,1DEzϵrO<O~][o@D/u{5'oin%fi$bxf>HyHKI#0 rI큓_Yx-<5{mu,>:7@M1Spkҿ L)SQ,&vݲ6ʣIs_ f[?-G7>*u gG'Ӥ dF$/jcXݠW89zWÿ[=rzG{M)bc"3bAﷸٯnO'IkOJ~.xPw$r2L+_-칣[!ƞ&O^jk'NR'ـH\@?Y![2>I$ٟ38*X~_x |:Qkl-}^ `UQ`$cװ⻟ŭ7w|9MZ/pYGpqր8$ZAiN wt1q5]Nx+S]sBnbC{/$$iMI䜚ҿdiaˇO.J9Gր>d/FKɊ9?tf(yɹϲrxÎCA@__O¯ . Uӻ?)=K }&o~.M4[XHb_6* ,h2DZ acǰ%bwl0c[+|az66Pܤcqo /ƟK|oNmF"-xG0608'p=ho Mz?7bJacOۡqrbo?uFO9K/5kSO% G4"'~wop @(̳:5'mߵo |qw8sQ/%}vV`WW_ i~}Imo i#ll /nM--K.tXjwqú<ڵ2˩a;r[#jO*Ïz7XkH`YS@Ѧ芵|quT[ik'~x Fd8Jq3|5j1~+Cosj=յtڹirG$CWWkWSFYUKžlP/k.-ҿ~6a. {v"DqkO 1f]..[ wېTO-k#^w? xzcڶ>MS1QF`z( +mi.Ѧۉ|Y=Jj֭/y;<\O(ۻm.\x*\XHw: HIwnv5YyĕݞZL躍Nl{2\g~ul$SF@B8;mZG:b M|l HQixW`ߦ1~?!"^|9~3OYxĐy;fpa! R6sZh$wp_Fp?&TIV/#RojYR0ɿ*+aegßS'$en48,9cy*$,00H_fYV cxTWxG!xO6v3dT3Y0JH߅7/_U/T:_;~`NgVY~~ hTHy cȯmV @;Mo㝖k}eth'M:R0[$^( sU>.RcJ rG'?śӑ#__P 2PPB_EI ض8bM~ >:x^~Dܠ+|Jq_/?nwĿ/ǟ4Mq]IqϩhJoX#y RgLt$g~ÿhأ(׾;v9?\4~/e|X~0xO~ qx~dkU<#ڿ4!fgYQ-8ۊ:|*3"q^ke \@(77\>:'62jzkمBٚU;;Ժ%LYÚKF|6ӭKxGTDK=#Ԃr1om5LCqg209 kJN>-xŸ5 hwHMV}o1I4*<|MbGMg)R# ëONS7}d?=B5u0&\($mz8U O,#~"&s"19ޖRi&*hzjs r?{icm6ܟc_e|:Ѯm_RHmϼt'|N+?#T m:x Pv>G@sOC c_i8 t ۯZM7=_/Ƌkkᦿ;|QEJ/vkϷ}=: '|n>~U &BfϧH.ݸl'j0:Jր?9s}]O11HN'PQ|=ڛFFx~G=Wx?O˔)kAwqGO>#aMu0M7ءL2y O$1~˽J=/F,B'#;cҴWȟ o }S߻}u.eN7WM~߳n; pq%0E4yѻGLE/м)kHڠ _|tnx~#ihN uI>UfQs€<ֿw{4)@ҾQ;еoOC+^ :lZ6mGPԧyny !9 lү+ WmO~oȕmD& O[s߁P 2x {7o E2Ȯw9쑞pk?._? [ľ?xgCHeu< E#8IWQ|~]6.OJS~']|(.]ܚZtK`Yn&^42{2ŷPN6 ӜO: G[<۲rg>o95, YF9x?~*Cϟm9ﵘZZ., +gx6&m3_(is::T$w~% _P{#Ė斀^O鈡{xQYyb^M5/?9z}CDhcUĻĈD# A5C{JmucKL[yQ.vdaLģ&3O |3;K6zŴp[*P Xwg ~½[wd\ǯZ$$>DXmI__o$ŭKVHm*%iX#nA籯<_bxgdbX@Z%R%I!`2Gx=߳3~%К7,/[M4M[B|Бhö 3WMඟM=hgSoO xkbCXDTΫuVs_~?WM Q?fh6^MTAI ed1!s+W V?R-¯|rѴ÷Ȅ%EUW6T֟?? 4O?<5ioKX#Q9}sQ WmN> җ ĊlIy$@:⾔F2F٤_H; WJ000a@+n]Z|9|}r$GqtHo ]us_=֒NK-2QP|K$Kpe¾:t v ^[x-B5xh f2IH*ex) P*/ [߳ޣqaXª[rzr:W[[p#y.`ğ~XdŒt־~:G|L}H;"I[ #`s@DlJÿ?in5+ψ sfױCVpz<( -_#2K kѬ+V' +޴mwJʹ~8 jG4|tssXl,ʙM.X:50u;Tk i-Q $C1&08? |K' &x~UނH>\[[~8|QQ?_:ku߇> 𵕼xn($ &1K7h_mk \_Ix}u A[_fuk Lv,9U)nk ٳE/~|I [8uM;NQV`l.Br3_DZJk[;'+^DbD22,|`/: ֡w5{&#|7v=IMv O~I6v_:/࿊-|%M6mI 3A &E| ÿkO3s]?fZ JQ[PAȭ+1hڴۛS&e$5ǂ(p}h\מ/K'= u c̓5_]77.ң ǐQ~s)?n_|-?x36#Ӯ {}ѢI'RJؑ~ YOHi7qŜҾ} i7'u;k\}cT>Q1jm\۞Fp2y{< |M{x=v;X bfG#ZS߁=𽎲|k5F, 2'\Ʈ@|d> ugZ|B7#Pױ4O9&o6~hQyFs|#5 xnky&kh.)!UHcz_GBOm֍|Gٞ-:Ϟxܪ<(]_3 Xg|;e ̛Ϯ3_F_?jC]C&K=0U۪ф'PoV>7 ꚼGֿ6|4oSofׯn#vGy dWNH_8-{ឥ H[Tv7bD$ÕC)8 ٗ[_iz?-{Rq-:wdd`dǹd +~!vfYsxq ̧@&E,p긍66{ދ|)6 < %$hXZ{?<u }"`b?(_Sγx>3Ǥ6:{?4ҿx1MI|0bS$ 9GY>KLy/2~WE7!Ue0 t֠(Ghb q}8x^p|mQ|!|˯xۿ'FF<-(kޭ<>/\>8vl(ʤ~(Śx~~D|3rNX=ށc1v?WmVddG `!S۽5Y4Rݤs߭y1ow*c9Sևt{~P~$Đ!M&f9۵]ĎQqPyo(AYH\?pgʎeIf p3. Np=_l%vk}.>_^F;_Ð@fW@(+pg arO?SGU΋ڀ?8F ൟR )&tE9=ya|Qhg8>,dՅw_CJSO69${gi ?LUK\ [H4cd|`#'ci:v߇a}BOa}&l 0 ^3Sۗ?gb~m5xܣ-ad.ӝĶ,YQo1Is_1,zvrΣ$lo{?g? aT/JLn?;.Ix7[ޫaʼnZP ̖(JޠpVCu>M~,xWV=gs/6Ԉ a;"A'l>W@^@27MxWg9mp:Sk.]s|3\ e ʏS@^sL~9;{xaŚ0$oP ΀M/xY..vP;mvFqڿSQh# o+Xi**5K~QQ|kop?j%{9#nGxzfibd\wӌWyM?gK{t ͻy]oECTRܭ8>hqǷ>ZŴi|ITN+,NSۼV(̻CT'u+a_LyfLy6 eCW JԲ_$l YEE;$^90+mϹDY0d :xKdH_ }Xd %?2٘HSO>'Aȫ p?AZ<#*qh&ݜv?Q/-r22U~}3t|A[?)evJq?&8@zl>}e,[h(Wre9E}9ma k?8D:$5 $[yd"C&0L؋ e)WG=ׯ俻*sw2[nm5?O# ! k]_Bk$e^[p0mo8"~+[r%^[qƿUbE t+Cm:N[Qn2K#C4}G_R^Jl(d4jg-+d c>/ [đl!ɄLpk=|}եo#(þ5H19os3@_Cjxo*!Wf5E rrG_z?Z#B?िOG}LϡjI_q[׈Pbyf'W.=+Ŀ  ^G^SixNtϪ -FArS%@_xT- '!'}moYImռI-A򕱖a\ߝ|% ĺͬ4E8=:jt)WP *)#0/-E{ `Ȭ xE7~z~sP_[gefj ;o TfЌ1 AYӯ,!cοg}xo^CuW I ?pL/;? tc[XCOtKlr2F8j-~?g/G|8n㳒GcF؈ı-Lgz5%ĒZ '"v4)cn 榏 e^4Kݝ~τ,- [AwMaX<-ݿr7 'k`F@ ?}P|bkc+ ji4hN)-y4\_F[{&h94}#"ϡLvǟګ>$.7Qi׶wFI KS>ߴ[4<=i%ws.HV?l?~9+߄75׌)G4eum]?Fph~׻/bw`i\?ɤ !]jS<!mlA0[0$Y-6h2xq qvz槛 t`T˘i[8Ǟ1@2x Sx>X5Ƕ3ܼVby6`e!K6XpJ,/go-6K+Swt",_O3X7tM'EntQ#[6BuVnQ^o~Вj>_+}9ր>9 'JxWM_tHΩQ$-#8ûkyqsp]Y̜z, ?n#O'!|j' Θ}ϛ#^Oq5{}W]@23$XyS49>eLV/Հrբ?ec0+yտ ЮSnE#=k-QTp@~.h5 yjp&q屒sr:^1WJ?l"6p3$@ɩ#?j}P7yәY(@S{G.wg'֖^ 3/h@HR5 |p#h9[^usy }sϠh,mVS)iXʑIUU,?W_[!wU Na@=NNhڳ\|:ua$7t `|{ѿX>z!gtk?;cЊ8d}Z}U}ܳ+z >Ѿ6L]{gyGل5|5G^mk>"iijgR-28-Up3_RƬOʊ0q_ cmL/<8wzt`Hh?kO_|)Wඩ[ƭ=YQvoa*a}Hqu:w_KK̄#ڽVQxcMqk*zֆӂ( FxT9k2g$+5写h[w"J:P7"Joqvu{uu$Ѣ ȯ`/KN?jVKYiIE_j>Xdu8{Mݯ5z G[M_ŭFD@z׬P[}=u[5[ h!фX@Je_# i5a죕xLuQ#>q^ǂ$ic=@s@r/?>m =A>(*v8vve㞥^,}[Ziix< ePF8',{JH޾&gx`i?/-},MsF\1P, 9@%o-q৊-ŭ˿<ֿ<ipl=u|2ڟoܖg,2d:F=9X-bSj@Qzq@ŽO&j=ےcڹhב|яn{f-|XdQwO.s7F\'>@_еe~TW}➻>iϏ~koxSRTG4k"<[pV89<`_F!K9[&DXF#i ` =_\O>0GRtw2ۗg{PYFA.YE<&*pI^.cs_H|,&wub2w6@;S![WNdodv}:>|ՃEgr''_/3TMoWSᶂq!{E=+qυlNI]q_CP= ~{g|JHvOq'ր;-5I"syqGJJtZL3 `'$E<_'5%75% 6ڿ?xR V Gkl^$3BdKLjS4aߍ|7 ,)>`t2UauV8=S"sU5;+Q?{ ,Ct'eS@k_:\2]MF)ni&A `icɯ?3O4㞞҇O~e~71k_MNnRKķWQ*+LI?Nϔ?#zOo[O2AjO"'B"Mz>2W~D>4ځN5/P_=|+hog7@[tK pG$s@e_,A[| hzi3?}8?z kE|$;mI7AtmH:I}9aj%y8'L\q@,,KJ ÌDmrkJt 18=?  k%灾}xqc 9x澻Wl_.R Gԗ澠qcھ*\[_oRx_?/WڡB.|gxi_ 99<ʿ-}uoD#8k->9fF5T_V-uo r 鸃ўlsO#?*Hq5;|10LƵrM|7 ܸ7vL $}ξVq_ďAhrQxXd:~u4Rz@s6~_f35ψ3uM}c7z^G[8r?_Ztnhg](З #%0O[83~ր4d䌀a-]#z|CS:K ʾe?d`:s >-ʁKFj/dg,`sma2xr0.?_7t9ox+Иߛ3G(lp>"1ԞW޽F7&-ޡlqMuT^2iw* G_ʀ8ς57Ww^'|[-oi Ci| },5"ol9Xp4HG`~tGG#ψ^mI`_݅YHe[0_`.4GBGQ~%ýRT:mh3DV;φ~(\B~ |?}O6uGW XfϘXۑW?~aN,ms'f/Oz= U. wN9RfUB2}Rqg7n$ZťN4BYPNg^GǀFwGvA" f,_>PV 9v )3ۊ%~|Pu,Og!Ҁ.LV^LK%c|c9=Ǐ<}| ?~ ڼ<=7\^%dK1N3#{_B0rߝ|k6X?fN%ܛi ?0q@?9~4jܑ.<ߜ1Z^0OmWEfd)S,:]ȼuVz,cQݢ9n۴Jc~3[_/ψ_R4PqpdeZoqG-X }YG^;U𝆅}Ώi< zI8=3_i=M~Kl~kxRxVemg*-Ue#ppO5&oח%ښ+6Yٌd-($@2{-wtw<[ZS$<$qs_Y趨EA|'oZ'#$ZV7>Y=G9Ώ-u? ?Gmᝅ7M%ޭ5"5]|VY2᳷݆@M|u9xN UAw{*76Ð35|#?d_دkƝom[hRiwǼ#%n!E;Cf86[dEA0+LW-b~_B|3|gw;_'gl3M-KEϛ]Z6oYT1ƶ۩YyxfW/i>i(,JXrT<z_C at< _l'ώߴht^<>ӮO El=ScpQJnPN]<ϪxU7B\F#JUSpAo3eْ~B?Q7}6MHouX$"-wDLH9;c|kG7g uO|V?5A$$meKxqee 91_?#ᧈ4̚e17zo%d="x"7YhoCuOZĚoƏa8;>־S~M-ok|B%GL˶X6U#vpPv9.uf?7uJoNw2 ;Æ9+b{TFq$LͶ0 8R#(=()|؞}Yl l-IdڡVLqֽo׶1)7IfrK1MdB-%|. jݢI2\(PB)J R>"xiT|2LzOGwǍx5 [tPIZ@DI,{ہ ~cm(X`E𖛢.+k(Q́b=OKx,qxW?n5R[?Y KxB]$c1< Wֶ)9J(ݎtg8ҿb߉|s’Mx"[{/5.N$$ǽ~xwls_?<ïֿ|./wRᘕ\o?ZfkG6yXw&o^]zby?Vh/1w@0o0;rk"1Yw2X'Rs_=Ȏ3q:P]j 0  |eua/ 7:|avMڬ\  +L߈s!Afqz:"mςO7  M~A,F|9|.úz卝13HQ%;i pOwO?lo[_4I-.[%W)g9 5_Oּ!'_u#Js$ioagUBp e\RAic핵j{/Ͱ*-}d@i~/۽;H@RYfBXI{gz aa5j|Mu\k]Nڷ0ć''nak闶Z$'t=z?C-_"Dhu< *BU00@KZ>v?OORNӬyne ħ$XD*3(~XQ,A8&u|2Jxi|X~M.n:̸eXca?T8k(|;j%,pxwo G NF~07N}ȱG1(5i{+8@s0(dRpQ+>DAR)w!/Q>x)Jt 1Bϓ 9&sѦjxw٤gn۔9Ǣ@qtjY.]-o M:{3k6vG/c7^t "O+;947I&hPL+C^Q){A>hYb"v*kԅmh'Gnv9Lc|eku,GL'A_F#"c[}=+?*ޱ&"|Q{n130NJ}ai>5[VjI[+y!#@dw3yd-WFBEw cgkUKo VEc/<۩%I_# ᯉ߱|?k:d%ѡ~^{ٱO|sk۟]mC'ӎ}n n;دmO^Z%έjo۷$")%KsFTrqihZ 6R;pzSԶ>l~UY'W-,lieU$;47jˆ<щ\_H_A:/HWXӿ 񞡭&xY2rcW#Ӛ?A~·4-G[9 &[xdѰ(q_u${߲YYCId, [Gwܺ slk^%a}/Qq%ź;Ihe(k) (jHr.k V>2xwN.,rs01d}_+ƻ GYẺKA,.$y^O>PFm8ӄ$א?_ $[D`yu2H#ݑץxOpgA@4? قT~眚MFu j릝9" ia1wܟҿ)<9m%K:b5?NO(?u|#%hCǦjVz2hcFH1$08 ֗mu j[#g2,yG ^)"%*Fe8Ŕ& ?#hD #{Or=7^AhsgԼO2Br^;W^xqjc\ 4~3|/Mڿ0t< g?ϮٺʹJ$t{tRѯ GHꖒۼpHٕ0\(mG15wk ![[&@Z[/~Li`^˪XF}: xx9ˮjrs_IF2_n#~1rctn {{ED7q _s^?:׈u+N_4dGB".GF_pԡ#q Îkπۤ]_E7X&2&O;W>,L>09Ĵ,L=K$V&_tHX5Y '=~k(}oPH/sr>W8 5ߵoO~$onbAO*?%®@ݟJJC"{Z$nDQs!-!ƿ,N<W,|U,G5lYԡ->ܩ#8a+ѿٶ\:lմE yѧaI5Uo r,9ǿ5 009=>} |(<{^j:Vmts<~[|)`j_ρ9ḷզ2)#rzKgVy]N"F {^ }$}l`%O~yV_ >Om-5hb;X TF[,y|'%~Ӽ1i7۬<.4حu[ˤj8$ fo@kOZږ([rF6+BI?챠?JĽjWUgPOr}v 7XFW?n-f#[}`6kH"Hcd; ֬HEJT(Fш_i?)Fp_.4,'<װJ8ۏlm~1FA;"$+?f?l?NqXPy?-AcGf#|\Fʸ>G4Gj䟴Ni[h8+)'{{!l6tL9 n>8i[X䈢D<@4ijQLfwK*?VyB5@ _]jpmp`u|qf?iU{zJH0:}hؑs5td[27ń/&;Cϐ?TٯjmSW"EXⰾ|;"8@ij 4ػF U;r3 /lM%Y!R#v1Z¶j(TtU:H_'|;%BZC){_,"ܜjGcO]xD* О{W{nB7P s@p_VbbUVf,8<m~vE' [}RG ;_\>8ikk#nXIgL%R0*X0<= 㯊eb[!׊;,| °}OX- J vࢾ]kRē1,2ɀP[\io׊G´*ԤlǵbR|z Wմ<Z2 0# ⾀Elbpݠ)T33Gai4 5:_ Oswo\h^Sp̛to+Gt=21gH25< w?G=쮾>@nẀFA,sS]$ xӅ;|qӾ!i+-15CˎBm؀]'}'߇:5o >c,Kw-]ZJ$syO7D4$]o#߁d'F IkҀ1VȊ_1\yj}qʠ7 ?%7Dg;8r>Ot&M]-R"F}kоڿ[x>F׮I͐< G+#;pEpY շӚ$߇1[Zx_ӿ4-OԤd#;X _<hk0ŝ+I% Cy8x<_-x g$Cәa* ! 'SӴ|\Ɗ g88|Lw3@Wajg̎}}s|bơwfLWPM{2_nƅUBDI>8ޯji_ǫq4[CKTXVɏh~'x𪟃^ DZC8!DQqܞ+sǟV i?<;eNCމ4dY3`\`*8e  Ow٥KaŤkhq! nȠ ||%,מ#r5خ`;vG:gkQx2ޱ7OJHH\2Ҁ???jW Zig/b 4m4H !IPNp_tJ&i/uEy%fW,Gps_Ӣܤ0a';~ 5+Q`_?SFO-Y~Ynq$/n?kw} ^2yj[k#[I%Ǜ(Jgmq?6/~~:Fi< =f*Oڬq__;n?c }xmgZŮӓPt$M:.pA' xMu#l0!H)3Y}J$`sgT7O?:+glK_ۉF@ zW3;x-A5[;˧e+l#Jvn!< o+пog8"ozΕ<IR6Vg0e"%'־sk%wi^&-]Zm6 %Ԗ, =HT?+  0U?,H if9Qh`HzDvp򭎧u^ 5Q$k Zy!_:iLI>X% v\EեR\BV!;yqh\Vvs, wi f$A$$״鿰WhjZg\%_cy>V ';{Ҽ=Zc}Ⱦ̷% rdaM܎#qbmNI<F'%ex[xwLLj$'{x|8R/quηrwYjzw#m2DqfSm k)S71kto4-n˦c 1hj?M_ | k>S{m{sMCR uyx(0yI"?-7G['û y`c*q?nGowi=W??dվӮ^B-m2cvVBGI}ۥ񶢹bP1ڀ?=5$-hu5<4RwIvH q%14;߅uEUuMRnd9vh~b%gukc?wcP9~^/^2_e?1@%cI+G8?gk#WTőVq r0Gzt6j-qǢ[9;zgeCtKx^t?VNlvl%ri0w{.ϧ݄:fUu5 &u܂OظH=gV ,>}7Hpd1zWW;ZO:7[>Y`BC_Ntc1F`K(@klC;˟2ҺI\ez@ Qm2?GV ^1\7RD~3yk~n_H?ӯjo٥?$}WĿ !ry ԫ!$}Wr>fy`Ρcac9]k(E!c=}s:Jj6Iώam M>ϭ~#HYmxpTG:ӳk)H)(A/nMEg GqEs;lR6iSqp!/pK{2^珮kKὲx#Elng8:Kvƺ?!8h~j$HqeEЂA5Ko^y\Ÿx_^nŕfF@  ?_?iM V`qR?Qk_ċsbM mr3@? |o~+AW4xB zWlB7:|-&Lv΍G*('~A/vxG(AۦB;c?v# ?/KC͂wc*|<ȊPk5?:lo^xKp6dzi$O@tπ^SLgm8A -xb޿倜ǚpqԌp <)xkQ_ x/W>! _$+f?HOIW;,LO*mCusgNEi?4vqR0O‚OCӷI1 aB k>:blx? ?ŕ0CT}4(l_9g*xVѬZZ*.T~bÎs)\Hr|(ߜJk _5WMFERI0mbT*8pv=hK!qN~8N>VZm^_Z۽yg$!XFG |1N +mc>J> oax-G>Pٝ(:=׾K^v&v+FtxUL 08<#x 9>btrʭmœ[9 ʱao.UOWzmXs[C6/)*%{@LjnyX-5y`p 8sڿs-?c8_G"˕-똛.j,|/q(7,4?U'_Lxf㇈Hks&;qra5>\hghu$zkȹ,|plŽ{WFntrJ=vOK|}#81w޿G#VR?\JI?cTOq \Ҩc+>I`v4$D[3ڔb]yei `Is #8a?|cc +5`kKCCIqO򯦰$I=̿ݤEfѮ^%Ǒh'ס_ڀ e#a<3RYfЁqГǧjPqO#!(ARcs+__jW R dރ}hm{{zRl1b6mM1JLQ JaL%{d8^|?8>ԆTdHS.Ap%Ù3PF@W`4+ҿ4`Z|A hC6Ju8@c뵰H,Ʌl74>A c YCV7)ai۹xnV)'nf-Wnae4(?8/П;zQ@{V ?:mcg<0ui{@uK$M 2_~Q|,?t=S徥x,-\mQ@d3_||Wb4ƶ'H%̈́g7D{X0\]fB]J?v<0szP/_c j= baYUb҇SٕOj:E_:HHW8 ޯ: Sc}GqD nљqV?~#ߔ_ÒQLc {jTڸۧWЌxv6eɰ`'rWC}_ʭt 5O]ҵ[K?0x?+3?`=W-EHv$T)bƭo zgvz˒|lGmǜ{ge| MwuxJ|sQ3݅md˨q/ 3 ߇:Rg%6v.Z쏗)C wѵȱb:VVI#.{ ~Bo+^S \y 85 4>=37e]j'MѲF\8+MDieX-dbYD@;sQ I-Ʌt(mfr_/ȄnU<tZ3,WPFAEeVUx|YK-!=@7(?OGŭSŏ7.Eu}[B[1nJH籯j?ಿνWV><|6tU{2jDua_+B|Zi`Ѩb:$dV7O<$awA3SK?T*~~:s"1b?[gϙ(A#2;}pOjg{_|k|\\ u -Q}'x v+n3_ kXąĉs5nQYdʫb N{Z[MrG!MES˟a_x 1hT-#⮃㻝–~>s{2NҤR!(%ẑdk@8{"1I^^v|PuƿZi_4gNff?yP2{_QФDf&S"}8v=jK}z-6tUiXzr3ZB% o#h%oR "}펝_leWR96`yV7ѧiQ+5M!Ƙ2tA9a[`y(O+O,a8:6Z})'O;D~Pԧ4~ *b#* ?4),OLZ`?eϚ^?0>7i%Lm?Rr|\\0=0i8fǮqko ?nz?=v?pw$NԅT&mŻ`b'qߧMD-`ُ\tǽLebs::JM줴#3<z2*Hlz}}}i#+ov9@x ʏ |rjZmP pv۽|3S rd k8kg9ZUPw ?Oj}B{vyR+ydr]d98DZ] O-f .?vb.g~!bP6HR;gW74yӦXMٕ#1Dtx)+Qx?Qu|L@&ͷ ?|_8. >@-(W&˞TG|M= kl>Q~̙أ'a,?g+Cyzs' Nb8_|z{~4Vm0O0i+f8ǧ4]©vg %!b1>KH?&<3l[|!.;E*-r;RoGEK=ޠ 0V/ _Oj]A=jVo1T˟_C' oq)1uǯAN~1 X__Q_t}\,|| e5}{WF *\@qߧc%҅]<jې~sxs;}&m,.{c5m3{ƞ=YAtgQxaiKxƹg<A&3үg#J]:_7cϭ}?ڧxRmI[-X-nhnJ_fx;MsEе{Ze­ 2=#YFA֒iY $=9Pv O=x+PԌJ/S^࿍ZĚֲ.fH琑nDjd/tm|IǴ}}}kNk [e@LQo?ʿei.U 'G¹expx1_>"M|UCžӌdV9ɑU63_cb9F,5kٳaH~j!v~$is)b/|-!`"<?qgyeD7sG2zr\wM.ڡtn.<-o2s@pw_)xßo7ԧw[v;HMo".CslG,lz?2&߳!Qܱ<'Һ_O['b"\t+?oJ3@R-@>Zu)mLc $ǎESZA:<\fj!Cpsahwz[D's%d.*{fZ }ů5xlftk%_4[HqI'wsaKts*w/_g9[^gE <Yw< s'xRB,fa`yS4`+M A [W?i'&vtsm=`N`';ئh/5X(@F;fARv moڀ??QOxo7>6kwZ^u=^{ѭvD,xm9⾼?hI-ʤSS#uHq]> _ƬcK)` ^O2:_s<Z?)*|!ŜRi]34&8dOCzg}~e1O^k$~%YʑIŽ೾?48|9$QS]vO -aRun} YM&qHm |ao" ?/O,^7*U. ޱ)/rGjk8gSQgu{6K ;I9}i:ŋdTSGq#,LA9 q_ϏÝfmk#l8Fvgk9֮mF4uA-󴘘ǥvYe ){: CM5`5,Xa=`>{pZ\M噢b=+K+Gdqsi>QLg(o1qԃǠ֢߯muIm0e|0ro[>ۧ H$ ^UO$ >$5j$3(WoJY!m8Tb4 X8c }vUB%6C#3T`/ُS(ܒwX.I9o^)w68[AjD-1o%KOvwޙ,k 6N"h~_k0t;YkM1}g[j*fc}ʪ*CǮ+]5R %ŪJ6T,<Q^I+zZ[CI#l-0Y4~^pHH$M}88?M R7SͲ73߮wwXx?x!]vz灟NVz%cgOgC&Kiҁ,}N7mczӚW7lZRLՔ(``mpw!HkkyrII1atހ>RZj cS8ޠǚKspu3{0m8њgбtC0CP%wmMoA/QPDnhm94A٫ T,.f{bU dJ eV=8o|~۾1~4|ob}c&'Ĩ`n>/q~οi 1q'*s/s>UNyM]7枓OY2ހ{W r7<~̿SSI8a1hձTH!H ~4{m:K_ٗ㧛4a _@c}#%Fy}&O+3_%G@qnqK2}Ԏj@}H}\&fL tf$(;E(0T|QCX񯄼M]J^`/Tա X$eX C9#;Oڥ {g&^H 3ɴ;?ɐ}AU[o ^PG lF2ţ85?_%j/":suj$"J POt}T~YcS|_N çL>ʐKrG,Dcg?l!4_c?xS5O*MPIl#3GYy0ѿKo/o޲>`s ے{?Zw$7_޸ʌeQ>W龝e$0l1E &?%T=2-?jw ׄ!X5ەoL"<{Pc iVHWO:<{6x.?ɬ=%&h$ @u߹FpK?¾+,]:?%]af7.ہgMx?,hV f|\wv<;Im,ʾiI'Kisb φfǜ{'f 6fr%@Ҁ?K{'ßO ~"TZEr[} 7'pi6&;o@k2ǥ]>&i6ovؿ9SEyhѼ:04nZ do4Q{+y."l7H>AmhsAR>b+'YT+FɃ t~&}F#f!wro0C /O;Q=;bq_',>%23ku즈$ezֿD?eOPm[tf ,4YU=+7=PGo w=.?/ʾupOjnyC[炬q__Dڟ?gy4'75ǀ FX,BNRJI/Z=Ժr)(g@#@<o=i_zmա{i s[2&Z%n3973I,:dW ux|]MJ',*F.8%qP~CV6~ϚZYI4f%u 0M}s$ q |;aPItϱ>'O *NUِӖaWi\|ӵ)h⫛dn2¿6?b?_>6zeo5{x?5ndaI >dh^s?lƉ>ls]72GQq>=}< ώ2iZW-o|1Ӯn`Yo#eܭnAePm:^ |mm^MͭHMxU1ߌ= }y\? B؟i9eʗڹ'ok|Tcj,|VXm"3mJx.#ǟ?io ivxSo]b[̤œ9bpcxzon-Hn ?^{rzbe@>)O-5tߎe$  8` @KpjS㇄ iaMKRހl]jbN9[Εu/M(@OlkS v*H'^ȝT?1c⇇|>!=WVvx 3!)TϥS<7^@߂4Т<ww}a`7TA)?(ݵp=I+{7E Ttխ|AGu&|9G׼x6yE^38s |iJ?**4>F v ' TmKˆy6N9~w5wM R'cvWSf[_7ٌ͊SPclMm݁y<{^El)8w5IdB HZxZ!m00$ \]~k7rneط2c=:_om/K(6yy2ޙsՒ %6O0δl`u̬8;i-|LF}\K`?h6.rw9 \E}o%~V eT ¤ AomJuo5x$3rIx^]ES\4f\uG#m>sylDsUuUp;6:@4qyնcf>BwNWg{rd0d`Gz 涓M1MfYRx$}6yR[h]bXyNr@U;f&ZaHj;:?m~k. >5}r졒r//yY _߳2~~o Ě5堐8;WcF@wSz瑞~>蘒 IL].v͐vzt/}AVxdsʤuߟJkh4kh_C˼d+'9 s[^,㶾Cr9'@DW1Z\ۛ8@8+8$nzU^)o2L1}- ECdu26gUOHa4ZJo>P@c+؟A@=~F`g-{e/}80Z/h-$:LR[m՜cˏrTz|y6R> !!$.w>+O! M yº瞇$ ܆^!Oz^i 1 "O\a{W">+<;4 6n4|c8Á㟬cr}ZZe$l.!(2 [@v?C>/Če2f3z~,O4I.-PÉ@=OB?rm?t[TS!Cg'P]i ṙAl`dUY}?渡I[>l7=9$ ^i_ж6̼c8yN~&s,#[7'xz_t5G|k#HXڔ'`3_~/ÛRLB=-x={ lv4cZ)I"Ҁ? 2A3`.|ldq=82'AN}fѮ9+FH3$(;WQ/VwK1}1Sρas v$1_5~[ڡrs}^ᕎkx$ԮyE ,ȎѮpF9c+wqh~i[.wmgWGCs,h73ׯǟ@>< MQRޓkYFUtrC'P|CRe ye u*PZ=T|8i%Or?~xW~Oܷ#۷^c_ŝ'_n~ILH|Ng #>G7M?=tMKN\ ]OiKC63bEs־_ LtfM]X[d+0d9Pg6O?J< /Fx|=jU0nZiҼP6ڟKKa!W"&_$ 5~|;*-4Fh!ۈaq@wH4¨PyrxxS;Wg~<_iE{X3C+8m5KO%x/ۿ<6$#r3_gM3,*pfW붯uۛ{W3F)\G8?s: Kr3|vl[h+,EJ2z"Kܑ3P<[p G5h9 cv'@ܩ12zW70O腉r=bM~ ngd[}:4#oP+Yf~3JNoݎr%U<@J7H.Em?0zQ TN?/~e<8?: cG<3BԐTc@DV.N60 ^h^~ƾ;ƺL۳(u:Lu߿ր,Y݈X)5/M>~ږ0yuOi1Vtel{aA-䙕}FUm,V6FDNp߮h됷mzm{zW?[) EP[(d!VU$_`s_Q-O%|z ? 9mOE>Hؑ}zW=coB-K aH0NGuA#׈?5$>,!<'a~XB{ ۙ؎G\| |9xSG[O4,Xw2? Q# zz:\:G&iȅ FH|kv`0:?JۿJſ[ czZj/"{&w-Y&Jо'Hkٿh&~x/h[<ʓk:wOm72 O|{p%qOn _״(A! 68}wp-nRI`=k(-iRn9P.o!T qP.q{dFv6HqCǐ O7xXEF2sԮd Ia G Aʿ/V~>ALSU?4O&Wm&Xա>&x;k 8ߐOL/Qz=5߻Xtm{upa0rdՋ"Oӂ8s ׺r\޾P5"A~ 0h<}azjV<~JxɦN\7n|2-i_jFq*ޚC,M2 !1g83sM袷-{6tX%I!~\3gP.- Qo;`q~yڙ2hR;3Г ;wK)+d? [_@020iE݀H3štL3`xg[p&K1$chO=A* |9.kl߆8R0]Hг(b8qH|Ww+L\RO*ze}y$k-<8}OVkUO3v=8΀:M&F7vL4g܃Z0;tv'ynǚ休aqǧz+;>%<+_E%ݝ0}y 2OvH/caRv3Jȷp$72g=AwXj.G%Fc| z^]VV,I<4K衳Fۤ@n}+WPMQUbl~d8qyJ_÷mSoEo(p7xx+n{YD[ʷ`R00{C@&So +qF;jpYZeXu ߞO Φȑ );}ik3 4f,3ѰOmg~k=ǂ+kHlЭ٢$V;~$+諻{nW$2X c܀CxydNyGچ8{La&wvd€;_{-F/GID',>w:̗R $myܒ1Rzۨ1$h(ѣa5q;i7$a]/rG1yv>Ȥx6Չ{SiR$IP|tP(|7 /QWӿK CFKl'iw/dzu+)[ >}EN zk?ਟ1,Fbx-%9'?ξ^yPH%v8⾣mgաD3 n+?,??9mb<  kOox l"8TlRIs_>&aҬ`vhd 5.$V]2l *Dl Ct3,G@IDj8Rׄ|U(ǐGX [>#ֿ2\νv &5s d=hj9Kk3d~W' ~-~ZNKZY=wH 'qj %Y5YεgU[nn%Kžf>xxNk 4xC]J}&Q󣯾[ih[pI8>W_m~~+/]iW ьwShĪG̠ ?fO(keemqe%.&}*eڣp('?u}6^,{[)šTXZ/.!|uߏ_+CY-p(m&0r:}MyQMkGWaOGlH~4 $/$ha+\W>ÿZg /"{cx^wkZ]T%{M"skoďVk?i^8C 鈑\whxMګ:\-lA3y`Fk?k u-|B$u yܪ8 O ?bO/ڃֹ} !k-&8{bKௌ4oSůkv6=XGjv&hRCm=OMib?ߩH4huRK鎞vj#, T~O |x;זѮ]%-LWǘ6q9z_#Wf/AٻBaH8t1饏g73:n킒8+uuӎ; ӏWwIj6T/aOo7[kCKº֏PD0$0s/<}w[ :-ݮSm-먛;Q_(<}Wm 5{HO < _#^as:vu Z꺆cU0Gym#Ծ2|WZ摮⹎hm^1_5> e爾!_ūxs3iڋIJg|[Z}I!0v@?gn/@dp Fr?ZG G~_֚ӻ8dgvpqk4Owv-7eyr65n߃ Yx ~$Ou9߾ͱh >Q-5 YtcQ(9ġyU5|d>%]Cӹك{W>6vӈI Pvp#~L"/Xw,v΃''$°]|K:fqg0.,`SzL%`5%THmUIuXl8R }pq D+CRCq?kX流D-onFp6qj.bPG߈.ZB `|}Fv$[ZE؉sղz}\;D"ZR:e+Ί.܂z=bRySH4* TֶC[K2܍ &Xm,ig,i[THrzq@Rb;DlN է}"#;HQec] QC[`XܬHO_e[k¯[4Zú|;$cbP`ӧx1qֱ5Ks}a=r1lu,ld5gែ7>Em!h^()$X"P&*szWg-Bg6ʑߨBps1⨊3ܽF Wg1·p]nhQ(ᤸwʓP$lpH`<c~cR}$PBGO ;m$VchK®ruOټ=O#߮﯒Ҿe3GNZ^\-ޝrַp$vnu2%:bצ4^9u;cK,+@wMyO}+|9o(#La?f^]_Zآym8\d_xj0[muGc*0AF2} |Wai4x[i^Vu䜃^(H񥏃#:% dZ^B4۝_PRv҉Y!\1H'=I~{Ot O4s)956cl_/|fU ᇆӴ.IimUՆݧh"<'ߋwSᾱo^xH[l˧ιh̸aE|Ro#$m'?OK:>*NmUvݴFkKe-V T6_ʀ0P)[ r42a*p?Z6,lYX/>^!?)Ê|wlZ#"~޵8io~^TI!GH>$pȅH#\8?ҿta[NHQ.̙`& 1Ė1tؒeUW v9/վ5oh;bWbTA!r_G'I,fboaEYCŌg{|/6Yx~Yk#-5!E\pX |@]|Tv . O1N=kcKT ӢJL ~Jt_o'+;ԉ"ÒN_)2=5WDdRO__{ik5Ej+`lèZ&-$pYc'W}?V^m>#0?u.q|(qxl@7p !Fxjğ׍m'$n"1tSNI:5|EMWcy۔Uqcqך&'t¾kkMy?Ҥzj6T \o@@O!bԯVMã澒RfuP, : >2.mnI~Ena_]4;I8|u(^d0aH}+]7öz41 #X<Z -+Bm} 3kbO_g%Ny!|qb 7xio4s)[V9mܨ"|XGn|[nj"P,76^=H@e26}\rɱ82/ίm=̏4=ˁ+eA4?}Ye\|j`,~0=ԧJԗS{e p#;⿔Ql/Pm /Q`~ϫ.d*pT;}QV|T66<:gWr^~?,/,1*9:U 3/vX%X8@oiO`'9&zQmOH@çBxc"sN°{?z//t-[T5{=;Q}>HGvT> xT(4_Y>k8cTB둹NzW|D^ki$l]'Fߔc#1w~eI0 e2T6O5>Xi4vhY M0j8c+'!M;K;V55moh|/igYEKD沃g 浯#j^Csdx歮_xNgU{۩& ơN @=ԾyLj.6?q}qԚj|Woy}&h٢j.y,\0v7?|)ZZj([Hoݕ ~Z|T]\E)u%72L +ENs@+Yi=פ51xvxv3 & U[W|,+)`vCn2tw91 6p]ԯm|R% r!\:v~꓆sXG{-F {mlYrHr6RO$C. Vڅi%C>b; # ӟ޼6?^hn|k|Z… 4rd*0 JS=cCK"m ro^=é>+ɴ 49_\Uc;Z`_n>7x7M<I 8Yz R;{]cHʬ`@nk>y}j jI}k/1!, 8$dפ]|]lt{MOZ6a'ԍ QY[ lKk /c.`<dyG2\}"o-5nۊ'q:]G]w__p$ V䶺 d#cy/MS kƛ#\c/1jECMӮVVIq#-=Gaq ѓM3K(r\sZjI+ih~TVIia 2 X*e\'/7kJHc2^vDf^`" 4=65^+d G'О-ߋ~/jmN072So|sU|]K֝xgL|:5+Whw-8ô/ M!|Ceƭq-SѤ)gkohn 4 dpH1S_|Q@}o|ձ4m?x>i& _M7u7} Kr/ec5Vo>0x^X~4Y@7yb|K54ZFGi@}㍗0G<(b[\i`:ysGa9"he-X/ KQES~Alm{;06G#rÚ3_д S4#īwe<"|{ -aJ}IYFk cyaKeAGoi/mc8Q_|u-skCL<=j>!'ɞK}p n`H߼%k(?zWV3]xNg1^ cT۵q~+hR76$YAW{ˏ:Yq=kx d $tw<3d6G:N+~͖?j;@xR,X+_3 ]bCZ_#V97)F? +#WkPr?K=ahpxWU0DU#I$_ҿgZ#5&o1ַ,SlS9$PO48y_6jO\Iq~^F;ߛpT,$׈~6k⸿fbPO?zG8>{(͊OH+Ӗ1yɏD+uyTUT&Yq@e{+j~ x{C4]J7fȎPTHvkIτ j:4缽9̌<0~ꀿ(JO<4Kqhkou|}_~Mm7~m.'Hc.aYVT ]x뮿? ~ EJy,rO͎CcU|~C׍{_JBe'p B_@?L L|>ڴ7Zjn=|No~ ^BBĞr <;Mn$$*/Xkg/sP-km=ۛrѲ wg4Wh%OZ) Cm篵}/_ -FzXccE28^k?&'uV_g_ϧb>Kp7J_cY3c6Jh | >"mo>r̋\}'h>UmS]Isb[vol*Hk?)#t?h$"!fV=ÜI#χO~tOY4:z8'q8q|R $]+)- cێ=/ a_N͏)?[Σy @Fxϥ}%o᷃th2ii n2m8׽|I'c/3Eo|!{ hji;XDQ p~W뻜VY-oּ5'32+8YX8lc+Ǐ|!M;\4Io̳*̧ {4i3\[Zn fû{c?Ng?^~|]em*Z$ܮܘ; _:Vb D9< ÏRK]gu}N,6eP}v_ [K_[֫ 嬩ƍ2_pcj >m'o|Y<2ڦpP @P74f࿎Gڢ=RD05ϔ2o ݎ2O9@6Z;Z2QyxjzזGYgU/08=Fqڻ ΍HGݹ#=8 m5ľ-ѭ5VĶvdm{ x֛K._xĚ41ĪR8bBmP3euKi4lRQɵI3;zy}7k]kN]<7M\)wo<($>Zd"V?kɾZxjv`> MYGY&p!Jt,#k /x[)'OFϊ>Ѕ˅34$*j_Z<;xM{L?x(/-ɹdiYPE#b򹐱Q=4Ǣ׺Lo.q4 oY(cpr_kƇDg[Xn̟Z@h|/ڒ|\ YF5ItHt>o|ʥw:IpT9w*{In4>hP&ڮz1*iu[Cqu줊c \%v`O}=fE[Z`hyV,;1AKm\W3+ksidֶSKl3ؑ6)ʳ;rhFnn4]*..c_,d(pTp?5+]3TЄ֚Y',r#b8C2n;[/w:.5p/O{g-LUǗoxĭ Y& xO˳l<_X⹐ۣ]⌀s H!rxN}J]NO X[-ѱ3L4ѵb6) 7I+1|+xdRH+(w(XoaT-OqCv85|Ej=Ḽ3V^mJ as4HYCxą\Px9j^|+Xhn..<>7Hb6Pp|M'5moMJ#k[hn-܀n@ Y.Un"rw0[iFHeyX$`=G^$sx_CӾ*\k7VRC#FB#*;F̒_$dph7"f=Nok<13Fz殓ĺƽSPJ\%ɖ;8 ?A o;I⸟ 4ԃ0jUŕ]-]#bXy)v1<[OwSͩhZnՠ{@f"wGO'+7M]&Fˊm=;̯NבAcV߈u7zx~%f>PO3qv'#gfz;k Hq#E#@XW!BŜɫ;}* ^Jnmq]^ۜc > k}:Yj:Au6w\\7=ۇ>~^]#De^pIl']0H[+M9Iˁw9ڸm7Q?jj74`sI䍠ry@9k/S*|ijm3)7}Vmo+8+Z|$A,ܐf /mڻ\xA+,){ \{9<뢬3Ҿk|\>~_~Һ6cE3ȞdQm2~Sv|# $/T}/[ [T"7MᏕoP W{oۇÞ:Hu/x?J0_:aGPt)= b0WyJuV ïZ4_i=W:~EJ.?+eQ1̠TrZF[*Ȭ;ci,,W [IX4Zqb=c~_w:gҋb 8>q@c^[w~I[7W8§VC9K }*TmRXF8W? JT!=86Ɨw%ǩI&)$ Bc9|g'3_^}- c~>1<75KGwgxpc@CC~rS'XM!M#$\'w[hmqWiz>8xmO{-tHFbR0H9/pӴ:o!<Žbq=ͳ4UGĿ Tu۬H^+tk2ґ[;a<_W6~Yi kqo}$6mF8%<8+<x[ឋ|9e{]M4aܻuK7&>288HwYn?xg? |elo\ĈjfYZh mԒn㰺%y$~8=>&xEֵ˯Azu쑈[(,p89#ZeK;WUi rxtcKwhm4t>?)y'jˈZoEfY>״4ۯ9 &@+'Lco7Gր?\W:eLhZ(*n 穫:uV/kHet;|V ! #vrI3x^-ooKX`kĬv+vIkm f|wFA& kzŗ v-`M=ݻ,X9qR }}_~>Ԯumw[{F| o'!Ul283@iZS1w2ɥFڡ[15W b=trZ#f<_lSMg1G"|(~9ԋ?{F=4}Џ-*d$~?rɧCa=H_Gm]Na1:W9 _KYUGaLQvH]>^t)8 נ+ApXHF7YM|}j>9o CgEՠ[_BH\ NMp~#>_F;>+ZfPm,j8⮡/Vdrl/|[ꑮuN06B$'nRy[_Aoi:Ƴ]5$hg|V/dmsȩ+IFαtI&ǟOK 2ʁN8| fy6h=Į6*;V%nRJ3b œkv:5޺mMgWBNre z :k-vx>OaYnr-nʮ8c,6~ ^ 6Af%nȚ\XH1,  8MRE%<3axQkWK,d,c R Q Ik<%~_3C/}[]>1_;4Seu4˨|c[=/M{; ZD΁ESQ>@izPf8*=fu#jRySrz >4xg֙==-a!BƯU@T`iY:r{cA@#76ow3K#Koe$eTIE&oov]6մ Epy|(р\bMr6zhSwaV0 ™QZ@w$1@;JXZiYmo9<\7T<] 1gNYXu%rNVUkb/ӕѴ4xc*X%V'-&\E#L%Y.B"$GXG!j7Qj2>+ЦK5-it8&0~Rû𭍋KS`/4ul,W2pZW.8N44_\RBC\ܣ1Dap*t $V𭶝oad.-# T̬AYAmXrS8;'6 PGE>m1Q(yG'%􄁑X-m Yg_jbtXR+LF &Kv8!omq,S+ ±б bV4 vwugi0)P@1QSvyF槥xr>#< jewۖ"69^r#uoX7KKX0 ^@YH]]@yh_>[IK=+Cmc[_ ٮS!\I XA:|[x|%O),p%-u:?<]eHuOwWlMĘ "I5薓xJgnuu .K{x',Qܖn|n4 =WI.3B+V\b5;t̾<_/Ú~%LmAԅ$@v.~0$ v; 'ƚ-pt;&iITd(lA^w?ǢiZ~?V4Y!Z%#*pY"$ͅ׌t3W6^tqxU$YewJU0yzqa\CsjPJ#h;Pc(oåx9KqSz\zqk2̊z<쏂iHg|w&5`wܩ 6=4ڣ?n՜9:AԨ e*N:dWG EV(`(I8A5U++p6{m?~sPGtm_Lan#hV$>Շ,~ۿ Y=ih;CcokIԶyǸ?.临&6|u@zZZ_XaHeVQ'rGjljxՄ| A57~u|lE~ ]ZՠeObwת,ciqb=mRN=Xij FF臈!xAL$ZsH '@~(~6? C<;aqp.u{q3 D)/=~j Ⰱhx_qETsN፧uuMo02H$thF^EaZ .';)7`N{_~R0pè<-7k vŎ?Q}s^#'NVN(x5GŚY.e vܱ \ϹL`ހ7m|e όբ, 8cEr$l@籫xbIKI]jOI؀)(nԸp;@` Njw0;Djk)$R|8@YM$&ٰgWQ; yXR>YN8bJ ƁPN2rƀ5KE$8Op ;mc>[ݾF@=iK3 ?0whѝFu([P`ZdX44#nA60ܿNk#F ]{X|HBL !#9D0Wa01dU}>rHcnx@Wswgr{u! ~UfuUmЬFM2Bc8u u(i pLLv}:p v}h`v>Ry{P7B{m,j#ͻp9Ojۗyۨ9Eg9xͼj>e`)l&G>Q:t!ha^cp[$\#sr1_yk&7vOI/0n\o,Ėpq`| B}B+5opw̮{zzW^-uoX\jZ6i~ᅇ]@ǵHi 4QR_ M҆wzNJ͌<7Zs\3dıv :~1m5^ QOqmWPŵwĺp_/XO dd)evFoy,G5rv ֯5? xUSd.!JҒJ얰-r0=[Eze/ZV8~˺]sd#~A4-n,'V (r!1%7ҼOŗrj^)ֺlh:%9ۗSrя6|[7,n5M6MHA/D[R%mAdAey1jz{Km 6D|܅o. aD5qS mmpÝY5`%PϵcNK+dž_xgQ"&-IvM!Pb(HX;; mgA $Ht D`ƪS$/xqY8%=,4~MHcE 4vo-<\xuΗM`ݵYۊkc$N؇Obil rE $;B+uVtZt.%7X,,Љ~P`E-`&>@?wk{KOͼWȽeH1|1 dݪ? Gtj7I XG EfgE31ZiEaW=eMTz7b{nKlUNXd|KR>j"|l"\bH8Y!@ʐ~>8x&S>!jmk:<(Y#9ٷ$^iwn>#dY/4ZC DQȂ2bsŸ4e1xĒ"u)vəNYv|I-'Ҽ?uYفŌp=אb%nw .ޝ@(M_0hW:Υ<~U!;"C2I$҂P&M5xVo#Yt;?!i$ HUqƣZicj!/^G+f$MDYT=z/> E׊uY@tvDhɎsmciGS#R   /xX-ig(cYrLp\X5ykx\\I4 6Vk%ծ&LPEP$8.'X$ӴF15<@XDn3>PJG;Wk-"=./%4,O$I)xرR ]m {mv+nR[ɴ bW8كzMxEڒ\k%ck۰+cU2\)ޒtɭKFiL,m'U+ҭ'xGI"7ne8oY,Ƞ iʆ$@ /7+r_te4˫6UlVbo/01P_?~ "&/9pWTYQ@cV \Kz<7gZѰ,Mr\1o޶1==ԯ?W&J{AMҸ֤yjv繖Dmθ۹'@]ePJM/x6H`N6$m"cx2ގ7hzk6e $q\0o@1ۓu^h]:#Ip0<+6:ϋt-퍴B x^;cZtr@ɲc_f?>w0cY$?@߄ mn5)=LyVIH9[ͅoǿ'9z?nZd!?18llcoR}o b V[M=䎔Eky pY>E?ίYx Ҵ, 7!)[L3n9ڻq4iIeÂ2$-`łKyD~uBrgb O͏@s]3CY'O2yIć\@ڄ $3njd|Daz{WU5N:~hsG#*wqya?nԭ :5[9d ĈZFWLp]2s[n&mta©xɯFk?Ic'?p: M- ˁnIzws%8(稠YB:1=y/#S{gO$:Tc"1˓Ҁ3cW^ճkXI rsT-JLd4裐q(=*(,MniZjRo5qj$v^}F=ysր3Z&I>1NN{P,gxJA*-ӥi,1Ws6ҞG!=2dǒq(ȊYJM7cҙ# O,<@ b?/_K /) g'`vghwg_q\lxpǶjg3y 6_ 6rgȞM8mHx,tV[!Q(ه-Nk]{x>3P햑d&W4Fer5ۛ ^MZdVw)N+MOўLfR ےϖ$#rHdm|>aO}Sj,hV+}FY 0+ .H:.>"0!x,n+{}S/"1ێ _D=BF~pZ9 #FhhZU> ئj/Ioͨb+) ? sk^:f|My;5fYHI5`[Ÿ ?,?GK͂yu VQ܀uukǺi[ȩwn4C%<.r:Ҁ<.ju|bY, n"ciHa;i4Vk[{m.yvVQ1"/abD!U` O5Ju/xZmV. |W %=F5-NU)9^X1An=A9Bo5.m#uiծ@@ʱDg5ZMV9;:I6!ɆBQe9|rh'QNMO\C*X;'~2$.p9<.jO⩼[o.I[-6HUY2Z ~ƚ|/^淤YGpk KX(J9#-w(x}~֚mգ\9[ :i3#9'gBtxY{<dOlcKz&k|'hn) 낤> _쵋?-:vEot8Eđ,D!3=h%]Y? 0O3tvBƋ% c^"eR$l/OZiڇ O[-uAO\{@6Gƚٮɧ蚍͂nrNܱI~&]1 R]\ZKΐjz~Q5G*lJQw9|-d6/M|\%cۜ䁌] 4B' V1"=s~%kO%rAL!o(qǀxmOK&R4E/GLn_R"q>Nɼ){ tBb/AW6ⶸ Dq9'zUι';c}%Fu Pnh553>tkhƋ4A #@Y7bT@^t x@կe*uǟx#v'c$/Ƞ~+hb[kbZ;(fA>(|B5sg.Il!q~~=ΥmJ~%mmbk$K0Ǚ=k?mhm=|um Eq tY$^}kC$U^[K!r͌!P}sж7dV,QzR@IFN s1ןZ6DrDž;dqm^ A|7ΨC$]H)Z9i@$^B|SQ۬٠ oe͔q=:'T@pv#ڶ/o .fpcsËm>awoj9[xXA^cOFSrBbp7Ɉ>oOsi{yy]K!x=:Gޱ\>!,9'-$rS 6֎dpS@={r.# 0 }rU\Ӂ۞h[(;̜kY'mlRKm+d{Pn 揗:Qv1v*&&o}mۀPI$BJcҝ0gTBCy`OQڤBD[?+cJO @Wx]nqSc;!\Ǘ-:FK3}31ӤŹ*J71![[1^J|.uBƈ1sH99I]1Ws,͟U+rs >#diI$I =&VA>v6ҽq(xԋG qQ۹ =}R3 g=dt9va/=泥96m16Ӝ}s$7X 68?:H<5.=ҐY#zϷ'#Bb4F31%͐)gEE7N9zbGcX̗7!mBl]wgS޾oY̚đ+nIbVAsdq_^Ez[L6Q{Wck$k3N4@w5}RgVGJ u#y,mhMsvK+yݮ&pN _~Լ=ԋEGXA²A &5I60F*%7UN:~z=i0u7xsOivlbrTL6ހ z?l$>emU=(mKja}z[XՅMyN={խW[Z$xz32.b(em;0Emf`O!wC䌓NVk0<9!IzlP/o-W k!h\$ O<{=5XE~ 4@cZ?͵ulJp :Z";A`&KhtϷ@Z&BS+,ɹF[\ηt};B^m8](;mK7+t ڡ$]pFq>Ǐm$dwnhBvg@ HoK{&匑}f}\d8=s7i%|'ZE #j g+Ӯ>[awko*ݜ+-gױu^brjQI/F1㞔X]۝9B"rdgҢ/o.tr$~豧<8̼g'R7/,I+$7Pz8Tƫ*4FϨiӊӎˢ[>hwh7BXxϵXi2+mWI ;}OzZ'A)Km}}iv6hTF73_@=hX5-JIkI4wAJЂQkMI"ibXJ`^1紖K}NA&P%v'b:=;-&}G3iptuYFن~RTx yC4nVm)*)lmc|w<)nіbhRI Y\4"U#dHPOГ]¿y#m*$9Z[.iԶ#LX3; p:=$G&:iϵu3\B1}=T܁X:s@X4wC$chlAjOn?d홯m緽tv6.p_a!l?X*Ol՗frpzҩX?n(h&c+~  w&%ڋj.Eg$gzZ*퍢b?ιRY&(skZ-O V=s}㊒Eq> ]Oc L;@cw^/{OJ nSƸ7'V^K0zg-rֲaUA @/d#MX0?TAԷdKwRrېgEAwgn|={N #*/HKVV#3RH)߀1@kv Wu}+D"}$za.-6͹l ˅!9hM+Xc%˩z^ ͵Ns׎ճY ^M7ʜk#;0 XX$x'@%;Cld`\|r(\"Jş6)RÓۈRè-K,G HaoZ#ey' TX x6kb8ϽUYv?x g1 ŋ x5q>Yk(`˒xt"LǭI-#u*p4[jMI0W_=(Ƣo9'm|<Сx4#vH˓<\Ծt+M?Jj~IC-tq;@Y 8cb VWHcgݴ5Kz5^K|=ixu"ka; 6Wz]QUe9H &^ƭAHmg_!xWEoqk)M{PGģԐ:M弾ѭ%2ijK EՆz/Q=>Q aw*QKH^[8f8zWin#um>쟗+R,,,ada(Ec'~`HPx 8P\],{bv>#^+KO貈[ga+$c@3*4.uRG7h˴YQ9&PFdM"k"g JT1 [޽z >9 cj;wᷫwqPk \d5MzV[[ SSyyti$L#lr'=zU;];K{T\s.KlgV@gCjѴڲ509FsJzO'ӗOP42JY[v~_Ly%#8oPʙbݏ]Gt; `B鷦Brof}߹ٔ $۩L'tOj-R6\Eʟ19' k'{yZ|AH[ (!y(+ho'M GqEDeb@!vּ_4>*=>P8s}?.]QO]< [|׀cqV~~>&-#stU՘]7Myy*ZקK}.HI UbOc<^O")ʿymE;c79+/. EmV& yl2N8,N3@6/AԼ_E 1-ؑ=c` ڣk6;}+5OGAtM/..cely.TD[imQI9+Z7G೰%`%l}^POR\iXy|?&{Qm͹s;潓e>x,F/mNJ[#$!ҹp+Ok`eOs7gt0!W9ڀ3UtoֺPW;pP(^rG/v 3KZG+ qU:d;Oҧ=:)#! y*n, PJ]7Sad,= ㎴_7-˔_3va'ˏzт{/[72cc*G*NV;@qZQ68ʰWWX?Ƽ_.bn'3"{tZ7u#y:s(aЍ@0XýϐĒzۭˇ%=*-*0`.]YAY@ey6& qj!0aNjt9d\u崸~J%.>_M:6=hȎAy-B݋nVRvCj Fb ppIIzvʘXF9ϯTf cR>LdH Ҁ.ApJpX3sn,S?&rIjD98 P ֖D5RL%F@jqv˶4,Y`*$ROn⧝-MmprrN:ԏ&Or= " H=D7$c?j6'~6ȓ`Z-d\6+QkʜGzʮPJ3aWmՖ zY:GeLsWK4MIn9{iDlF9w-Ѿn%93}uT4x7&DKscfklsaVG ]e0s jSkQyn}[Wd3L:gqgܚ93!xG?~'OJ?Cl,G"^US4>]X(Y,BmI~َ9_b =i#NO iHo.Ѓ9 Sa߉5wm|>Զn'b1۶B2@cˑmxO.v{r,cB6m&.r$8ɠɤDmJ/@6v҉%Tq7m/sx,T=ecJt݅9P~xXxVd.dnr(*8ws/'ΟO;\լ8eKZ8%TeAs};Z[%m:O=n 1:\:5e֒kGx0ɼR8 HW:X?eŷ7̷dPK;mߴ>ա/tfk. 2l .w+nVNH+řXf#;%F玼WKO@n<[euP)r00AҀ>DZWeZʇ!`u l88'_xYB"isC0vq־uRYBJQI`@hVZl|ymLsm8ā#,0(Od}*wv^o-``D3uc1Ñߊc(|{[ NOFHaaYXdA˭}[He岴Sb`k\BŕX{WM<CY-*-ǜ8lv$zP~̾Ӱ::pbbҨ'{F;=mej; _->Aﴘ2 YI ;OZOi)s7>S=v'ŸI Ƒe8n&H#K߆\tE[yvf2W}~֖I |sfd.0G!|ާu? ~]ox30太>^^9B P k_[] ?⳼OZqa2@FGH|Lm={W;xėC iq-;ǔY"8\r^c6x+V{+x\wCL68>?>~'hl&>/oɔ HَPPH8;Úgin!A"smslbN:}+o߳pho D:8^%|6=6?|%[;joow`㸖ԙ890ApΈ|)gKgğkyJ[@@5%Tpw;Qz7Ffme dR[+Qӏ_[GDZ":*^\G . -ۑZG5;$٠j^ ex[ۦ&eQ'V Yh-rUDԖQopXGs^YӠ<7ۍnM㶻˪ ,ʣi[Wպ/O?xjEH/TE\na,x_H7*}.; `ETntv:ۚ_SPBcl~u#q:Y4NݙAH^<s13nwih-'CF0ab4|%sV|kyLdUKv>> dYc 8'ҽPʓ"85LG@%$3VIx#b|H0?ƭ\Oqp,+ HR Td=cp7.3Aʏ7+nk_U;%IAKr_@="="A w1GI~,Faro Wf1?9_Kق_1[>P-\bΨy8P6 >.nˡw&erS2!bp CGźv1K>"R9dP# {8^y8_O%ىe2H68a{=]:x | wSr=E#c9#x#aT#r3d_tKL{61+eqN\xj;ɤ$rzch,rbKȘ2'8njXmO>˶adr>oLP/kcF.htK7[{r` ` E|ZkG2K! l&EQ.$_m y^5-X@_<@Wq7</_cY4B\oOAjFYe:d.o0XȮ^'2C)z+|?|-$uTוjxVՋɩ}tgW;7N*T _ZZW7[^ V+Ls[$J߼f۱zsɠD;tdy!fl8d EzIdFFs:V)#]i3QUKnc.b $yqC~T\(`Y:c GS}pSv9<M9:9r9<xXlSRԜ53*>̻ @p!2x"φ`qRy˷ ]U8މ~1Տ̻Gc:zn'b_9zb |c >b 89:TM嗭EsF2V5MT +ׯJ:Oր6b ry=:Z}4p8jHNLP1KyHىVJBXT~5}94%cc5j`8_Z3 ϭBӬVnN|D¶Q$S0s֩ȯ,&IÎ@Y|0 l|3uYk&um&WciR =r+? v>pK8=A?w<ڿme@?_W嗇/6mk-ד4fH @r@>;OP/-.l˫ V$'ΝR 0akԠQ6In:\ݧ9$l97O~8)g>:4Ox}(H 2erGZ-GЀA4.-ouiHNE)Ap>=?li?`(˩,Ϯ {Wywݷlu8luiچ-LH?Zߴ3J<_ ?a}4SbZ?[ =9Mk㷃'%dQqؠ|C>TծuiiA$\+C{cdo`u?,rz\K)ct>{`/͏aXK~CkE:7o䍆yhK^dHVEh䎾{G|Sr UWpܬ3\~7~ڎ@.V ݹlQr Em]ntv𮟪ZBqh<6;y3E }oA!| ΖwxCKR 1P_Z2c)NmC@d~_y-*o势(xeӚL`|ՃKM; }1@^4>aVivH2;,lUV?}z~ 77|(f$K š.`ukTLsRxs>"L *7a(V?gĵ$;?]j#4ZcҠ$.9oº  };g-VC_-FaVVA.JAu>,͡Nt+@v thf|}ϗ1uO%w*lD_'eC7 G*1E}%t/Jێ$W=~M 0dq W1xFsuek!N?ڊx`=p>",fF#xlozOBLS?l-6-:%S,2ލj6MguX27r=0Zmⶶ3e"g#py/ xSJ}нV5 W@s~6K}ߗ9o=)r޿TxcK`Go}DbMAocp䨪6s$c.Lw$*d,<m kΞ$73=LؾgG*H)8_ߋ-~)5_x6H[RQcq+dp+fsY SF!e7{ݑ 09,w,>2[ Of=KBXIi"nO<9 9i^ EbMec*_1M%)bHj%5>k6!/MlDzbC3ї@Z;fz`<5!a;t FAkk$6f[?|Ik;kƙctIm.H)*23_ ^ŮiZ ~iǙ–,X qEƹE4HDGz׼x wPxwOp#j6AP9#LK돡|^|;$%ZU4rn 09I46M74qXcUƶ#c{[}IHj,SrGzwgeab駤Zz}#=lƀ=`ʼnnII[ZvJ)g=IcsP-ń@ڠQkdkGUbFYjƂO1Jr*Wo9Iv}n9X0% ujΗo,`F y^R\$E5=ċ| 9Pˁ0ź``hF."lC,1{?n$1>VY_iWyb ˍ [˩kTm;DfPy;Pd> ->g:⤗# ͹shzw\!%$@]i >``t^ed.կTE>rv׀+q<4EÞ+|Co(4m=-Hl`E5-m- ;u#Ҳ,/htyq2[]Moml.t_4͈9kKZR;F(`OsB؟-:_0'8-ԹhD~@xzڥ 4p@3umj\[KZ%SuQS(Wп௚D{ UG}|~R}fզy n6uT6*7ѬظR8qdwqVeԭ#F {\jvksOi43 $EdR=d:mb5C2Dq1[OW+/W`Hmo1 hqs{suyq9@8GSδHIQr6wb?F8Ta l.]%XS:1mMj_N!:e@P&Y2@{eIU]B"g3˕onk?Þ,u%ǃu/W Iip_Sm;[8 u/c߽׆&/[ZYuj%ND\t&gF/*.=A4!f :s^7K i9]w)e<YZJmrv_ZIf4D.aZO2?6d,בڣtf8㨥_^AϚ~``w:4fn#@ ^lu7V0]E*ihgyE[I)P:(+{HOu60W8S- aW%Kf.RIk[3.Nv aa:CP8ֲ',x9eeOަb6ʗ i-Ϧ?^-Ojum#J$"i5" hG#'o8i;y:ռMucko+$Dƒ* \NNlL'9ycHC]tsR:nܤ/O"`I9`Q>\_xWj:4A-5;Ų>D9R ; 3p0G5gƟv@xCNt{鴯 `u͕Kh#g4 ֻ?|E'a4cFӭZw\۹*p0;C{3ķ>/|17m>gDɆ%MȒ0E{ Z?*-1)`Lџ`Tyߵ7{Cž26étEZ]Y5g|+o1|st?iys4ik̺uRh %vMFG*7Og7 |-qk>lؖYaYrE@$^ňU[׈C<70H֣gA"ZS̡n'>>xž3 +kӤс*L0R3@ E5 ;ˏLV9]wo|)sKA_j\n{,fJOڔ,ʀ>pդңkXi)A NtϠuqj1Y.&c }1MaOLՆ:sfp9e2~djԷڤ[L|+K]LG{.sE[z IS9m=TQC~UӼ2mCo_f%`!7Fq׊l#Vlm䌦$=Uۈ1bni.v@Oq+矩 $;c;:~u8jsjA؂H5v-#f3f@vv[`&qS&|<⧞ILj GDL'zHPZi]UGLj1UF HJ^cg@#\žO6%n߭nh!ӯ`XFpI>TZen &ZxhYy\;@(z}awٴfB$^kB ZXG؞a`眎>kvs[%֯up)AOҴH]Rsrc"CJ~O:\E\:A]Bhz'êI}qp @bX+߇(N(#i?t(0h Ilx䶹Q6}Ayx^5bBȊޛViG`m}? 03@2dG_xiyL6.zUF{:EYqA%翽'~ >͜7C$~o@uۭQ>2Xi5,]PUǹ={Pv?Ks5mʱG0z~nqtZvannTGo{/VҵK+ջ n,G%(C@.􋴻@[ p}IB7z)ſﵗU}2monAe1"t<{:z&k'7Kw)?|Fh?>0H}ws-Ų RO\_K3%F[ϊ4}H$&_O?XZOt$3cw#Z˂f6^PT .G]#OjՏQLbF P)W a'_ mߌ.-| ]sW*jP1Rd>b3N{ "ǛsI*Դ$-o02OAqT}ʿ+k~@~^1[8m5E6RMzݾe{xfY#ս/kbEhbH\۸I$0>wJϻB&şlè P.]"5y㯇k[dtosJLO%TԳ^h5W&Z]']aêfQo: Z!w:J]"X5]lxPŸҼ;*z' @--2;cP1>Dk.u{|DI÷og.Z+b+/r?~/t6-iAYT2g< iw~FǞixĉr(4mbpީqnv/鵅|EwO¶׈o>,˦ݽwoo 3s b929↭jy?-nӮ-I 67}# dl`Hr+ t?ƾ{]P;I|Y r$Mɸ*]->Q|Ěń:|ҀmQ0 qݜq2Ţ$Z^,m&=KV^g%9>g"8_r@OJm*(_#i8cZP͢ڵb픏?+@yTYgi,ي5#g_IVYKySI!C΀1t$\Ec`Hbgv`t9гwW5 ggŞBh;}J_&O >qmjϐiL"-'R}*i1*1=h._`njZtsp☌d}G .Y; ~2J7GXGg#ēLP. orITZ9/$+ Xuuܰ2HG躨ҥMEPJlvP|N>nR?Rɏr'ʞ?Tx@+y d'i2\x^M0\,,O8\OE:Y>^("m'ou+E]n@$n$[HFp2xY8_ Gj1qDe0?{<jd[+~PцB}Q{)fmwi kˆms1S[G^HEyM͵dIUAkG7W*!YYF@BwMCXfG\M/XHSo۬&ك <?h:%&h6lmsM'`'twwyCv9(4[Ͱ@02lč ar3w+l${p$<6_kb(k?ƱC/ Wx j6mf,}SJ6F%1otPpZWm}n\`ǵ{] `Hc HWO о"|%D/-t9qh"-r>%G$ym E2q?[Hzʑ22@dV]̯,P;1#64CMcYa?!,\+⏅5ƙ%</ F tekl@6@T$ps#5'OKbKߏxnܖa/ dšGud7#xG$(rR1Ij7W8#E=ROppSz]Uz퓥o<9JwMsE֬PR`5j%j[k:hM}KOaϙo3.{"7㏁ 0Tf֭RYHCM~jzcQD$11ya_ x d㏀m!iOuɏO_Fn4956WlTXP[nGw9jQP6[9blsE]h#0e)WPVpcz{P-!Y ?3|]1Pg͓'s$p 6H>j=SIɮ"xն#u@| c/c?x?+㮙 [hC pސ2.: ~3| ~(o:K5=rdݲGEU'> O~˞hxhaGyoD8"[[q#rs=QH4Kٶ^x[Vou -T~BaL,V`(c<[z~?]twQŰVNzG8yGO xS$W~$h7VWoY<'#_ |KrDރ毨Akuyq)%n'9~,| YŦZ&[)Xkgq($z/j7ߴ?ve[j>5mBdh_|0ej\dxS_~ nwiZ}Zafu |ª qO<7[vbYtQ\ FIP ۣ# `xR|]7-<κ}[[+hA.ef9C AoǏ|\/REfn4kkG%9,LFFUP>u M;Fn4_z.>%PXY_"G̳0%ehf< }k/o;Q%DC]1, |]^nڋ2{`(1xǺև4M+Jh- EY[j86y;TZΡ{j-'H8,qxn9gŎ0Ce@-h#'cI7RG]DYӮ#Ry܄VK)V?˽ejWG*FF0EVQ(31TCJCfKQKe(Uc :'D3 /vsT*X\qL2.iq/1x9@S/؎tr$Y*FYӑ5nӚ}@ 7[WeؙfN1I N ;T%ԊͷZܷ&ƀ9hbyZQhuo"NcRV \?nހ4tDY a3=2o Y܆̜A=󚻢vEO*n=J=?:htͼ{T}̴~!߅->]FK):p8s޴>[ O'!]!2>Z>UQfwIq}kTbUKcPȴӝ`y_ ж{㨮Gcc6G ~ȯ@ӣIO b)SҳƷ7qxr1[yQ@,~c@Ҩ'ta$t[ϓD>uc%dܥ$v!@j~.Td0 z3/5E߇][ArZπKENԈʼl+~oyOl Od77F h+=@aɯ-dqa,H}r4O\R3xk?R?^|%y|IWq"8aU/O~4>5AIqMMuG{C|>Wv2c<ߌ<{↎-/:Chc,:=/74;w #x Տ|$o"o{Y]*X,o?C\DI M+Vm6:Gf:O ON~k_F>µ,i 6eTѯn.۫FH tiH3=kgޥ'o63UA?:& zk-%8~KMۃ~xEf4JUL5_R1JUZd/ c8\xL/5k[ZKX \hpuSO[|cwxF`bQBc#'kLěkZni& ep)_ާ_\X<PN8[n1yj:|;IeKԥ}ޥS*F?'ERi8'C]"?<Q? ?[43j^\nfq(\?c_E W09|G&0U4`)j7wv< E"d* :Q}k ŀ'i^7I< ٱ?JT{C37&Gx2ܓ΀6t ^%4FҘS]^\J]/*yO5hKw)\m t={b qo"=(2Kf9pG!HWS&xQ8^?Ta+;[Y_\\Uiqwc4R;z_О+PÐ÷d H?J~+xz J[[$rLqg|;/^&:_仳5y,vKspzר_~ieĪ:".V{"_2"LB 299z5)5H׋mQ#*=h#7w]qMLpOMcxOeχbl#I,7 ][mg_i"[5Ԣq_'ր8]' |odnJ92@C\~Eƈm’csG % KUXR3 $FVe$t&=;ź=Ƨ^PSeǡa@-~L0FxmPcXˀSw=ַU_-1KJ0KHY׼ω0k]+Tp=H@׍8ŏk k( [_Ÿ^!ll<=V_*${ŷ;`j^2UF!i//񦵡xbUZs_̺LzE֘qW\X=E[i08d'N߆>$j'xZĚ--͈FAx(WNHɧ/׷)ez5hy s bQهwⰼYeΝo"\yw^o $0z^|6ozc'tkRt2c˖<+|3=+?cң4w2>hK0+G'%OҀ>5whhɨDeq1A=IO+7qEg(tKpVFy ~;Ft FI5xf Ѵa$@oI; X@:"m5'o~9U\mkw_Uxyel_G3h%-OIžXsryǦ3.chjW+}KAqtdԯٰccҹ]{G{-jy& \KtrsV t頺@cAچS[0% |yX;Lq֯뚥j){fgg^C y^ JM?Cqʯ?0ϩ,aPX9+Kx"ݩ[ 7dSnnWpǂuzi0TmX _5OHcu42<XhoolNW~RE󜛉QUOaֵ!{YGb?jQ;B~m<&BN Մ[hu+MH7z; ٶ2ΤL|ZÇKV+b1P(=l)ےZ:r=2>pSMZdFB.qyPeHkN q`*jh &B[ r}Q5eaϠ@$ވݠ/1F`H}֣Yc(X=/6#x8: '1}s4L>a>#Yʩ؞M8I0b@lnH6{kK@?Jz[+'P53mN3?i%@PhF%VXҧ#<}cgv4t{ M@. H=* C]m'Ti/P,sUKmzf _o :S0GK1<` ?Gi(tKxK;lWEgB;f.Xyd=+5h,[<iߌu8ncn-Q[O2-Ni,(7 clnb'xO[v#IcE-YzZt?߬M3l;f_;(էDD{O^y.r$#Y>Uʅp$ ':HFh>(laYN1&>E>Z_;mldR=ץgK?[xqC;"[Id޵ό&e,Zq2ym;Xx4k_|+nUZ2Ҩfχߴƨ57>#:e2mӤ)c3( f\5^դx˽@*I:[ -QtJǾ>({/ hZޗE Z'6neh0Yw\[⏅Q?1|85c;%ǚQ5S_ExOwXݳ [/"=}ȫ~.Fv='YU{gހ|дZ CόN{[asbZ_6 f y~{?,,-'d9k{P4:etLe'zj>=RRm Rw?|Kc4zFjIĜݱžg7ia|Mw (<('bÍK_kֵQVH"75Ÿu}T-/ ܵńǖ8ǃ~|lsCXiF41%r`GzɛgoxʺNmNkt{ \^$ӮfJsׯZoƭsYd xxkD*#uU~7xR~/Gm̹DRM7ATw4;4wzTsnUH|"T=_xcӾjG;u:ޝJZHf"'Q]8B~c6 qԆՈeRJFOCZ1̚[\E$*1k/&4QZ?k $lާhc qMe_j.p6Doǻg*Y'lhT3ZX/uh%oc{#U9OҾ [)#ϚI$H݂*+B:Bq*T'_3+W \0 z>Լ7RY+g=ƝQfI0MNHTcc~=hYb@O͸ )#+H|x._wvS%E"cڹh:&l/S@""^E]pe2pI@4$ l,h[:X Okp\ >eM@љ q{kmzvg$Nh7]*.wvS=R=>`PgYt\\JHUBB ֱn5k;e}FHGGf_xuN! rs* =6[M2C@GZK`V$0I=X'Ih6 #jatJ);Z;S ?՛=5efp,q׎۝I v MM3]kL`΀*]OqjLlgj+{w$WlmmdVԐpk1"0F@yi&hrfQS$ Hy͙C&GAJҾKm D Hs]xe ev/1Ԛ(捚21|wNMyd}hsON"+Xc%ww'lS*LjφqƲ$H\rk[_lekV Jz'2=8ڙuhY#0)i8v܁].{* -dE'e;#N{</1Y[%`Nb~##mKԈ4nU1 M>.Iި::݆گ%6?uc;kQnAq)c|UyxFT>{V amDfOL L,5Mqdjn-βv'gҋ< 0#s1 3[,3MVbrXlc/C<}s}X#Lҥ8@UcH؂JHFF:sIq,>k㏋4M>8tهw#,Isߊ޳붲j'1yG G\iaլNty"<'I }h]5Im8ᛡ'zn/ծUm6Tzukؿ?j6s21,A#k ̧Þ2FqC-R4ph*T`օk/ kj~%nBe/3<r0Ozo]ԼAzc+Fюyaޕ2Y^3AV^I>{s49M,'3Lؑ˹ ʠ}(Լ)#EyuX٭ྸy+2X;S'$u xzmͮ}{pD;Gq9$sgM(`d@[zt).4VqđH(&qgg~m.LX2)wuY-[ʚ[V;IM^9HnH#N M<&6TY7,j&"-c'd ' ֡i ,V^q@-4f*6lUVf?*m\jiQ`?2ӧwK{om_^ڊ7h%G~ |2C "9=J薇6Ak‰bgE3\[r>OϵyMޕuz;u\t9ZD֑:R"`2qצ7c .q\ƱU5i5KodYH6$+;XӃ@jK)Ihe1B9d>-nĈ2s]^|i7iX3 N}벰|Gxx7І|߉F5Mayے+ʵ>6fL<7IǕ|Ť\ cO|c&umX]Mwjovn!b2>#~;~vOt>;8(mٶ1Ԥ֬tAboX0Uuɤ0B@qޯi5i-:/&Mqbs1 ri!w/7ww$A`s&p:MrŔ INF_pke$] frNd" ;D6}5>{u6 v*TC_u6KiL 1Bªj߲扡Zi|W?z[VlvH<,7k.b?Z|)OeYr#SlK#vSm5Ki۠ ;zTVOf6& ھi{#ӡN?.kcF&-Wo4Ue.͈ "3gQHWzhw;V_0=+H6-em dc(O] KEuc\+m'*E~xo|Df8H;@KcH>dICݰP:}߆mwcv&UMcSy.1:f/$o@HHLs[[69lQX;.r }c>lȌIO~{ o yonMf6Fjk6B+q ђJ/~}%K`_UWˍ;-ɫP]t9AܠoZ,eZk;Sͨ.#,,9P0z .|sZGN `xĈ~sU>iʶ;B]Yk%JѸmNMFUֱ"ӥ`>@|ᐘִun <1ctjZ4SSouDtPc#⠒IE$|e_Rj(w%ϱÓY$vU\<hS-w1BRGTܣDV7b~^Upp1UWج*.8]x4a@/1`R;zzdIvJĘ[zx#C}JHImKDy$/ ڤҭ类o-% pT76SX`pHː)%"Cm38B8:⤷H yS!N `MfkWV}~'!I7B3ǸL]7:xKK5.s##ϽtJ&1s ͎O8JS{Yj'Ld)*VΚwsAzuEZ-t۝z|@x]Oi @Yc `}r;W? c/+)dY!10H噷(׬^aTn ]s&HX/pmoP6g?9㩮_B75#|HbyJqf儲FN IN~3f6>.bUX%d,8ldrx]>rT42r.-e4+Ooqc̑,ہ85 txGRx]4la-%عD#p}n" JIX@`&/@Ϧx^I \խAqG܈9 EvzoZWVQhӦVS.{0=567(g;O܋&$>H]ׅic9L-p-E!&,OFOZuٷAt!^BU xr-ʌ_λ~њ6oSm3 awTmدԮg,_-̿twR'u2ݷt*^c|7I|' 0Sq >Nw!է 0lH?Z׿e$K3iT-㟌~k FUjm f #k3qf#5t2}>m/Sl; }(~^ .R{]:MoW1pڎuĩ"0kcwƟ\h_ . xr=1yT[9{|kA}5vPDD[G (ҿd  xnR-uFKɎ_Ƥr u !5I_xrfҤ6IaT`:c9=+fo}|k mof%fa}9Fx42-cÉ7K*[ar{ >Nw.#1nvcU$ƽ'÷'']CZu?$JQZ@3ھV:3њ%Qi*nm1FlĬr&]X,A&HuJMGϡAqKl:ʟwB(cg~6 5$Z\X~\~{bKip}_M\kW/fBU{RI"JӿP~\eKu- @X6 OY}=:V Q׮MoY-s`\nuϭr:~&[tΧ,ɑW?d+ ]ayAp e2(hιMORGFn D?x >}Oݮqj `AݜVNh רc# ٌqN# )f*Jŋ<0Õ<"4M8jY`i$Qp.ýԧ i63#rV 'Ե^;F|ҵ$a8;bt1jrq}Mj2v^Op\@mn-%GHO %7TFd\^jYE`IH>hy\ZsxR!"-<mN8V*)mJ4VPig6m+NnOO^+mJC-1Rs%Tdİ\O rc_Ԍڀ1|+ASm!ZDm,cH H{$ gXeDAN7#⹶힩_:\_Fp.]TCʠb8ɠbI49 &_28 ]5ܗCrضwn,G$WIk9?"Os`K|n21ǩV-DzG3ZPB|~SbMs~3i>dhwE_ts d18xu!W|$w*I24NFGlӮ쮴Y`{L%UU#pxƯ*.kvز#o/lxn@8kMQޘR10[6F9'5G Fpq?*gm!,aZ+̀JN\#>Y}rgn9Ckg4ǹnb{k+AP\Szq<-∼A᫧cc hf@9ʌڮ4qX|Q@(|;* ˡ>#i6Mz~ h@tϼd.Wwx^"_qluvw [\+PǷ@HKw~_5Kvim/[k nE`e}dOyy% /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Maximum amount of data to encode/decode... */ # define PPDX_MAX_STATUS 1024 /* Limit on log messages in 10.6 */ # define PPDX_MAX_DATA 16777216/* 16MiB */ /* * 'ppdxReadData()' - Read encoded data from a ppd_file_t *. * * Reads chunked data in the PPD file "ppd" using the prefix "name". Returns * an allocated pointer to the data (which is nul-terminated for convenience) * along with the length of the data in the variable pointed to by "datasize", * which can be NULL to indicate the caller doesn't need the length. * * Returns NULL if no data is present in the PPD with the prefix. */ extern void *ppdxReadData(ppd_file_t *ppd, const char *name, size_t *datasize); /* * 'ppdxWriteData()' - Writes encoded data to stderr using PPD: messages. * * Writes chunked data to the PPD file using PPD: messages sent to stderr for * cupsd. "name" must be a valid PPD keyword string whose length is less than * 37 characters to allow for chunk numbering. "data" provides a pointer to the * data to be written, and "datasize" provides the length. */ extern void ppdxWriteData(const char *name, const void *data, size_t datasize); # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_PPDX_H */ cups-2.3.1/examples/grouping.drv000664 000765 000024 00000001331 13574721672 016762 0ustar00mikestaff000000 000000 // Include standard font and media definitions #include #include // List the fonts that are supported, in this case all standard // fonts... Font * // Manufacturer and version Manufacturer "Foo" Version 1.0 // Each filter provided by the driver... Filter application/vnd.cups-raster 100 rastertofoo // Supported page sizes *MediaSize Letter MediaSize A4 { // Supported resolutions *Resolution k 8 0 0 0 "600dpi/600 DPI" // Specify the model name and filename... ModelName "FooJet 2000" PCFileName "foojet2k.ppd" } { // Supported resolutions *Resolution k 8 0 0 0 "1200dpi/1200 DPI" // Specify the model name and filename... ModelName "FooJet 2001" PCFileName "foojt2k1.ppd" } cups-2.3.1/examples/get-printers.test000664 000765 000024 00000000646 13574721672 017747 0ustar00mikestaff000000 000000 # Get printer attributes using get-printer-attributes { # The name of the test... NAME "CUPS-Get-Printers" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-Get-Printers # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en # What statuses are OK? STATUS successful-ok } cups-2.3.1/examples/print-job-and-wait.test000664 000765 000024 00000002064 13574721672 020726 0ustar00mikestaff000000 000000 # Print a test page using print-job { # The name of the test... NAME "Print file using Print-Job" # The operation to use OPERATION Print-Job # Attributes, starting in the operation group... GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format $filetype GROUP job-attributes-tag ATTR integer copies 1 FILE $filename # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes # What attributes do we expect? EXPECT job-id EXPECT job-uri } { NAME "Wait for job to complete..." OPERATION Get-Job-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR integer job-id $job-id ATTR name requesting-user-name $user STATUS successful-ok EXPECT job-id EXPECT job-state WITH-VALUE >5 REPEAT-NO-MATCH DISPLAY job-state DISPLAY job-state-reasons } cups-2.3.1/examples/postscript.drv000664 000765 000024 00000002314 13574721672 017344 0ustar00mikestaff000000 000000 // Include standard font and media definitions #include #include // Specify this is a PostScript printer driver DriverType ps // List the fonts that are supported, in this case all standard fonts Font * // Manufacturer, model name, and version Manufacturer "Foo" ModelName "Foo LaserProofer 2000" Version 1.0 // PostScript printer attributes Attribute DefaultColorSpace "" Gray Attribute LandscapeOrientation "" Minus90 Attribute LanguageLevel "" "3" Attribute Product "" "(Foo LaserProofer 2000)" Attribute PSVersion "" "(3010) 0" Attribute TTRasterizer "" Type42 // Supported page sizes *MediaSize Letter MediaSize Legal MediaSize A4 // Query command for page size Attribute "?PageSize" "" " save currentpagedevice /PageSize get aload pop 2 copy gt {exch} if (Unknown) 23 dict dup [612 792] (Letter) put dup [612 1008] (Legal) put dup [595 842] (A4) put {exch aload pop 4 index sub abs 5 le exch 5 index sub abs 5 le and {exch pop exit} {pop} ifelse } bind forall = flush pop pop restore" // Specify the name of the PPD file we want to generate PCFileName "fooproof.ppd" cups-2.3.1/examples/print-job-deflate.test000664 000765 000024 00000001373 13574721672 020630 0ustar00mikestaff000000 000000 # Print a test page using print-job and compression=gzip { # The name of the test... NAME "Print file using Print-Job and compression=deflate" # The operation to use OPERATION Print-Job # Attributes, starting in the operation group... GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format $filetype ATTR keyword compression deflate GROUP job-attributes-tag ATTR integer copies 1 COMPRESSION deflate FILE $filename # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes # What attributes do we expect? EXPECT job-id EXPECT job-uri } cups-2.3.1/examples/ipp-2.1.test000664 000765 000024 00000010607 13574721672 016410 0ustar00mikestaff000000 000000 # # IPP/2.1 test suite. # # Copyright © 2007-2017 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Usage: # # ./ipptool -V 2.1 -f filename -t printer-uri ipp-2.1.test # # Do all of the IPP/1.1 and IPP/2.0 tests as an IPP/2.1 client INCLUDE "ipp-2.0.test" # Test required printer description attribute support. # # Required by: PWG 5100.12 section 6.3 { NAME "PWG 5100.12 section 6.3 - Required Printer Description Attributes" OPERATION Get-Printer-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimeMediaType document-format application/octet-stream STATUS successful-ok # Job template attributes EXPECT job-hold-until-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1 EXPECT job-hold-until-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE no-hold EXPECT job-priority-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101 EXPECT job-priority-supported OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0,<101 EXPECT job-settable-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT job-sheets-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag EXPECT job-sheets-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE none EXPECT media-col-default OF-TYPE collection IN-GROUP printer-attributes-tag COUNT 1 EXPECT media-col-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT media-col-supported WITH-VALUE media-size EXPECT media-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1 EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag # Subscription attributes EXPECT notify-events-default OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT notify-events-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT notify-lease-duration-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 EXPECT notify-lease-duration-supported OF-TYPE integer|rangeOfInteger IN-GROUP printer-attributes-tag EXPECT notify-max-events-supported OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >1 EXPECT notify-pull-method-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE ippget # Printer description attributes EXPECT ippget-event-life OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 EXPECT multiple-operation-time-out OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0 # Operations EXPECT operations-supported WITH-VALUE 0x0005 # Create-Job EXPECT operations-supported WITH-VALUE 0x0006 # Send-Document EXPECT operations-supported WITH-VALUE 0x000C # Hold-Job EXPECT operations-supported WITH-VALUE 0x000D # Release-Job EXPECT operations-supported WITH-VALUE 0x000E # Restart-Job EXPECT operations-supported WITH-VALUE 0x0010 # Pause-Printer EXPECT operations-supported WITH-VALUE 0x0011 # Resume-Printer EXPECT operations-supported WITH-VALUE 0x0012 # Purge-Jobs EXPECT operations-supported WITH-VALUE 0x0013 # Set-Printer-Attributes EXPECT operations-supported WITH-VALUE 0x0014 # Set-Job-Attributes EXPECT operations-supported WITH-VALUE 0x0015 # Get-Printer-Supported-Values EXPECT operations-supported WITH-VALUE 0x0016 # Create-Printer-Subscriptions EXPECT operations-supported WITH-VALUE 0x0018 # Get-Subscription-Attributes EXPECT operations-supported WITH-VALUE 0x0019 # Get-Subscriptions EXPECT operations-supported WITH-VALUE 0x001A # Renew-Subscription EXPECT operations-supported WITH-VALUE 0x001B # Cancel-Subscription EXPECT operations-supported WITH-VALUE 0x001C # Get-Notifications EXPECT operations-supported WITH-VALUE 0x0022 # Enable-Printer EXPECT operations-supported WITH-VALUE 0x0023 # Disable-Printer EXPECT ?printer-alert OF-TYPE octetString IN-GROUP printer-attributes-tag EXPECT ?printer-alert-description OF-TYPE text IN-GROUP printer-attributes-tag SAME-COUNT-AS printer-alert EXPECT printer-settable-attributes-supported OF-TYPE keyword IN-GROUP printer-attributes-tag EXPECT printer-state-change-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag } cups-2.3.1/examples/print-job-media-col.test000664 000765 000024 00000002163 13574721672 021054 0ustar00mikestaff000000 000000 # Print a test page using Print-Job + media-col # # Usage: # # ./ipptest -f filename ipp://... print-job-media-col.test { # The name of the test... NAME "Print test page using Print-Job + media-col" # The operation to use OPERATION Print-Job # Attributes, starting in the operation group... GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR name requesting-user-name $user ATTR mimetype document-format application/octet-stream GROUP job-attributes-tag ATTR collection media-col { MEMBER collection media-size { # 4x6 MEMBER integer x-dimension 10160 MEMBER integer y-dimension 15240 } # Borderless MEMBER integer media-left-margin 0 MEMBER integer media-right-margin 0 MEMBER integer media-top-margin 0 MEMBER integer media-bottom-margin 0 } ATTR enum print-quality 5 FILE $filename # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes # What attributes do we expect? EXPECT job-id OF-TYPE integer WITH-VALUE >0 EXPECT job-uri OF-TYPE uri } cups-2.3.1/examples/get-devices.test000664 000765 000024 00000000770 13574721672 017521 0ustar00mikestaff000000 000000 # Get devices using CUPS-get-devices { # The name of the test... NAME "Get devices using CUPS-get-devices" # The resource to use for the POST # RESOURCE /admin # The operation to use OPERATION CUPS-get-devices # Attributes, starting in the operation group... GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri # What statuses are OK? STATUS successful-ok STATUS successful-ok-ignored-or-substituted-attributes } cups-2.3.1/examples/Makefile000664 000765 000024 00000007046 13574721672 016064 0ustar00mikestaff000000 000000 # # Example files makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2002-2005 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # # Include standard definitions... # include ../Makedefs # # Examples... # DRVFILES = \ color.drv \ constraint.drv \ custom.drv \ grouping.drv \ laserjet-basic.drv \ laserjet-pjl.drv \ minimum.drv \ postscript.drv \ r300-basic.drv \ r300-colorman.drv \ r300-remote.drv DATAFILES = \ color.jpg \ document-a4.pdf \ document-a4.ps \ document-letter.pdf \ document-letter.ps \ gray.jpg \ onepage-a4.pdf \ onepage-a4.ps \ onepage-letter.pdf \ onepage-letter.ps \ testfile.jpg \ testfile.pcl \ testfile.pdf \ testfile.ps \ testfile.txt TESTFILES = \ cancel-current-job.test \ create-job-format.test \ create-job-sheets.test \ create-job-timeout.test \ create-job.test \ create-printer-subscription.test \ cups-create-local-printer.test \ fax-job.test \ get-completed-jobs.test \ get-devices.test \ get-job-attributes.test \ get-job-attributes2.test \ get-job-template-attributes.test \ get-jobs.test \ get-notifications.test \ get-ppd-printer.test \ get-ppd.test \ get-ppds-drv-only.test \ get-ppds-language.test \ get-ppds-make-and-model.test \ get-ppds-make.test \ get-ppds-product.test \ get-ppds-psversion.test \ get-ppds.test \ get-printer-attributes-suite.test \ get-printer-attributes.test \ get-printer-description-attributes.test \ get-printers-printer-id.test \ get-printers.test \ get-subscriptions.test \ identify-printer-display.test \ identify-printer-multiple.test \ identify-printer.test \ ipp-1.1.test \ ipp-2.0.test \ ipp-2.1.test \ ipp-2.2.test \ ipp-backend.test \ ipp-everywhere.test \ print-job-and-wait.test \ print-job-deflate.test \ print-job-gzip.test \ print-job-hold.test \ print-job-letter.test \ print-job-manual.test \ print-job-media-col.test \ print-job-password.test \ print-job.test \ print-uri.test \ set-attrs-hold.test \ validate-job.test # # Make everything... # all: # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean everything... # clean: # # Dummy depend... # depend: # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: echo Installing sample PPD compiler files in $(DATADIR)/examples... $(INSTALL_DIR) $(DATADIR)/examples for file in $(DRVFILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/examples; \ done echo Installing sample ipptool files in $(DATADIR)/ipptool... $(INSTALL_DIR) -m 755 $(DATADIR)/ipptool for file in $(DATAFILES); do \ $(INSTALL_COMPDATA) $$file $(DATADIR)/ipptool; \ done for file in $(TESTFILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/ipptool; \ done # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: echo Uninstalling sample PPD compiler files from $(DATADIR)/examples... for file in $(DRVFILES); do \ $(RM) $(DATADIR)/examples/$$file; \ done -$(RMDIR) $(DATADIR)/examples echo Uninstalling sample ipptool files from $(DATADIR)/ipptool... for file in $(DATAFILES); do \ $(RM) $(DATADIR)/ipptool/$$file; \ done for file in $(TESTFILES); do \ $(RM) $(DATADIR)/ipptool/$$file; \ done -$(RMDIR) $(DATADIR)/ipptool cups-2.3.1/examples/document-a4.sla000664 000765 000024 00000163033 13574721672 017244 0ustar00mikestaff000000 000000

    CUPS Software Test Report

    This software test report provides detailed test results that are used to evaluate the stability and standards compliance of the CUPS software.

    Document Overview

    This software test plan is organized into the following sections:

    cups-2.3.1/test/5.9-lpinfo.sh000664 000765 000024 00000001515 13574721672 015714 0ustar00mikestaff000000 000000 #!/bin/sh # # Test the lpinfo command. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2005 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # echo "LPINFO Devices Test" echo "" echo " lpinfo -v" $runcups $VALGRIND ../systemv/lpinfo -v 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPINFO Drivers Test" echo "" echo " lpinfo -m" $runcups $VALGRIND ../systemv/lpinfo -m 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPINFO Drivers Test" echo "" echo " lpinfo -m | grep -q sample.drv" $runcups $VALGRIND ../systemv/lpinfo -m | grep -q sample.drv 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" cups-2.3.1/test/test.types000664 000765 000024 00000000145 13574721672 015623 0ustar00mikestaff000000 000000 # Test file listing potential MIME media types that are not in the standard mime.types file image/urfcups-2.3.1/test/str-trailer.html000664 000765 000024 00000000022 13574721672 016706 0ustar00mikestaff000000 000000 cups-2.3.1/test/5.6-lpr.sh000664 000765 000024 00000003160 13574721672 015215 0ustar00mikestaff000000 000000 #!/bin/sh # # Test the lpr command. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2005 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # echo "LPR Default Test" echo "" echo " lpr testfile.pdf" $runcups $VALGRIND ../berkeley/lpr ../examples/testfile.pdf 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPR Destination Test" echo "" echo " lpr -P Test3 -o fit-to-page testfile.jpg" $runcups $VALGRIND ../berkeley/lpr -P Test3 -o fit-to-page ../examples/testfile.jpg 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPR Options Test" echo "" echo " lpr -P Test1 -o number-up=4 -o job-sheets=standard,none testfile.pdf" $runcups $VALGRIND ../berkeley/lpr -P Test1 -o number-up=4 -o job-sheets=standard,none ../examples/testfile.pdf 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPR Flood Test ($1 times in parallel)" echo "" echo " lpr -P Test1 testfile.jpg" echo " lpr -P Test2 testfile.jpg" i=0 pids="" while test $i -lt $1; do j=1 while test $j -le $2; do $runcups $VALGRIND ../berkeley/lpr -P test-$j ../examples/testfile.jpg 2>&1 j=`expr $j + 1` done $runcups $VALGRIND ../berkeley/lpr -P Test1 ../examples/testfile.jpg 2>&1 & pids="$pids $!" $runcups $VALGRIND ../berkeley/lpr -P Test2 ../examples/testfile.jpg 2>&1 & pids="$pids $!" i=`expr $i + 1` done wait $pids if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" ./waitjobs.sh cups-2.3.1/test/5.3-lpq.sh000664 000765 000024 00000000643 13574721672 015214 0ustar00mikestaff000000 000000 #!/bin/sh # # Test the lpq command. # # Copyright © 2007 by Apple Inc. # Copyright © 1997-2005 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # echo "LPQ Test" echo "" echo " lpq -P Test1" $runcups $VALGRIND ../berkeley/lpq -P Test1 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" cups-2.3.1/test/4.1-requests.test000664 000765 000024 00000006472 13574721672 016643 0ustar00mikestaff000000 000000 # # Verify that the server requires the following attributes: # # attributes-charset # attributes-natural-language # printer-uri/job-uri # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # { # The name of the test... NAME "No Attributes" # The operation to use OPERATION get-jobs # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Charset Attribute" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Language Attribute" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR language attributes-natural-language en # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Language + Charset Attributes" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR language attributes-natural-language en ATTR charset attributes-charset utf-8 # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Charset + Language Attributes" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Charset + Language + Printer URI Attributes" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Charset + Language + Job URI Attributes" # The operation to use OPERATION get-jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri job-uri $scheme://$hostname:$port/jobs # What statuses are OK? STATUS client-error-bad-request # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Bad IPP Version" # The operation to use OPERATION get-jobs # The version number to use VERSION 0.0 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri ipp://localhost/printers # What statuses are OK? STATUS server-error-version-not-supported } # # End of "$Id$" # cups-2.3.1/test/testhp.ppd000664 000765 000024 00000021171 13574721672 015574 0ustar00mikestaff000000 000000 *PPD-Adobe: "4.3" *% *% Test HP PPD file for CUPS. *% *% Copyright © 2007-2018 by Apple Inc. *% Copyright © 1997-2005 by Easy Software Products. *% *% Licensed under Apache License v2.0. See the file "LICENSE" for more *% information. *% *FormatVersion: "4.3" *FileVersion: "2.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "TESTHP.PPD" *Manufacturer: "ESP" *Product: "(CUPS v2.3)" *cupsVersion: 2.3 *cupsManualCopies: True *cupsFilter: "application/vnd.cups-raster 50 rastertohp" *cupsFilter2: "application/vnd.cups-raster application/vnd.hp-pcl 50 rastertohp" *ModelName: "Test HP Printer" *ShortNickName: "Test HP Printer" *NickName: "Test HP Printer CUPS v2.3" *PSVersion: "(3010.000) 550" *LanguageLevel: "3" *ColorDevice: True *DefaultColorSpace: RGB *FileSystem: False *Throughput: "1" *LandscapeOrientation: Plus90 *VariablePaperSize: False *TTRasterizer: Type42 *UIConstraints: *PageSize Executive *InputSlot Envelope *UIConstraints: *PageSize Letter *InputSlot Envelope *UIConstraints: *PageSize Legal *InputSlot Envelope *UIConstraints: *PageSize Tabloid *InputSlot Envelope *UIConstraints: *PageSize A3 *InputSlot Envelope *UIConstraints: *PageSize A4 *InputSlot Envelope *UIConstraints: *PageSize A5 *InputSlot Envelope *UIConstraints: *PageSize B5 *InputSlot Envelope *UIConstraints: *Resolution 600dpi *ColorModel CMYK *OpenUI *PageSize/Media Size: PickOne *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: Letter *PageSize Letter/US Letter: "<>setpagedevice" *PageSize Legal/US Legal: "<>setpagedevice" *PageSize Executive/US Executive: "<>setpagedevice" *PageSize Tabloid/US Tabloid: "<>setpagedevice" *PageSize A3/A3: "<>setpagedevice" *PageSize A4/A4: "<>setpagedevice" *PageSize A5/A5: "<>setpagedevice" *PageSize B5/B5 (JIS): "<>setpagedevice" *PageSize EnvISOB5/Envelope B5: "<>setpagedevice" *PageSize Env10/Envelope #10: "<>setpagedevice" *PageSize EnvC5/Envelope C5: "<>setpagedevice" *PageSize EnvDL/Envelope DL: "<>setpagedevice" *PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" *CloseUI: *PageSize *OpenUI *PageRegion: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: Letter *PageRegion Letter/US Letter: "<>setpagedevice" *PageRegion Legal/US Legal: "<>setpagedevice" *PageRegion Executive/US Executive: "<>setpagedevice" *PageRegion Tabloid/US Tabloid: "<>setpagedevice" *PageRegion A3/A3: "<>setpagedevice" *PageRegion A4/A4: "<>setpagedevice" *PageRegion A5/A5: "<>setpagedevice" *PageRegion B5/B5 (JIS): "<>setpagedevice" *PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" *PageRegion Env10/Envelope #10: "<>setpagedevice" *PageRegion EnvC5/Envelope C5: "<>setpagedevice" *PageRegion EnvDL/Envelope DL: "<>setpagedevice" *PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" *CloseUI: *PageRegion *DefaultImageableArea: Letter *ImageableArea Letter/US Letter: "18 36 594 756" *ImageableArea Legal/US Legal: "18 36 594 972" *ImageableArea Executive/US Executive: "18 36 504 684" *ImageableArea Tabloid/US Tabloid: "18 36 774 1188" *ImageableArea A3/A3: "18 36 824 1155" *ImageableArea A4/A4: "18 36 577 806" *ImageableArea A5/A5: "18 36 403 559" *ImageableArea B5/JIS B5: "18 36 498 693" *ImageableArea EnvISOB5/B5 (ISO): "18 36 463 673" *ImageableArea Env10/Com-10: "18 36 279 648" *ImageableArea EnvC5/EnvC5: "18 36 441 613" *ImageableArea EnvDL/EnvDL: "18 36 294 588" *ImageableArea EnvMonarch/Envelope Monarch: "18 36 261 504" *DefaultPaperDimension: Letter *PaperDimension Letter/US Letter: "612 792" *PaperDimension Legal/US Legal: "612 1008" *PaperDimension Executive/US Executive: "522 756" *PaperDimension Tabloid/US Tabloid: "792 1224" *PaperDimension A3/A3: "842 1191" *PaperDimension A4/A4: "595 842" *PaperDimension A5/A5: "421 595" *PaperDimension B5/B5 (JIS): "516 729" *PaperDimension EnvISOB5/Envelope B5: "499 709" *PaperDimension Env10/Envelope #10: "297 684" *PaperDimension EnvC5/Envelope C5: "459 649" *PaperDimension EnvDL/Envelope DL: "312 624" *PaperDimension EnvMonarch/Envelope Monarch: "279 540" *OpenUI *MediaType/Media Type: PickOne *OrderDependency: 10 AnySetup *MediaType *DefaultMediaType: Plain *MediaType Plain/Plain Paper: "<>setpagedevice" *MediaType Bond/Bond Paper: "<>setpagedevice" *MediaType Special/Special Paper: "<>setpagedevice" *MediaType Transparency/Transparency: "<>setpagedevice" *MediaType Glossy/Glossy Paper: "<>setpagedevice" *CloseUI: *MediaType *OpenUI *InputSlot/Media Source: PickOne *OrderDependency: 10 AnySetup *InputSlot *DefaultInputSlot: Tray *InputSlot Tray/Tray: "<>setpagedevice" *InputSlot Manual/Manual Feed: "<>setpagedevice" *InputSlot Envelope/Envelope Feed: "<>setpagedevice" *CloseUI: *InputSlot *OpenUI *Resolution/Output Resolution: PickOne *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 300dpi *Resolution 150dpi/150 DPI: "<>setpagedevice" *Resolution 300dpi/300 DPI: "<>setpagedevice" *Resolution 600dpi/600 DPI: "<>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne *OrderDependency: 10 AnySetup *ColorModel *DefaultColorModel: CMYK *ColorModel CMYK/CMYK Color: "<>setpagedevice" *ColorModel RGB/CMY Color: "<>setpagedevice" *ColorModel Gray/Grayscale: "<>setpagedevice" *CloseUI: *ColorModel *DefaultFont: Courier *Font AvantGarde-Book: Standard "(001.006S)" Standard ROM *Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM *Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM *Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM *Font Bookman-Demi: Standard "(001.004S)" Standard ROM *Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM *Font Bookman-Light: Standard "(001.004S)" Standard ROM *Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM *Font Courier: Standard "(002.004S)" Standard ROM *Font Courier-Bold: Standard "(002.004S)" Standard ROM *Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM *Font Courier-Oblique: Standard "(002.004S)" Standard ROM *Font Helvetica: Standard "(001.006S)" Standard ROM *Font Helvetica-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM *Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM *Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM *Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM *Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM *Font Palatino-Bold: Standard "(001.005S)" Standard ROM *Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM *Font Palatino-Italic: Standard "(001.005S)" Standard ROM *Font Palatino-Roman: Standard "(001.005S)" Standard ROM *Font Symbol: Special "(001.007S)" Special ROM *Font Times-Bold: Standard "(001.007S)" Standard ROM *Font Times-BoldItalic: Standard "(001.009S)" Standard ROM *Font Times-Italic: Standard "(001.007S)" Standard ROM *Font Times-Roman: Standard "(001.007S)" Standard ROM *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM cups-2.3.1/test/4.4-subscription-ops.test000664 000765 000024 00000007556 13574721672 020322 0ustar00mikestaff000000 000000 # # Verify that the CUPS subscription operations work. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # { # The name of the test... NAME "Add Printer Subscription w/Lease" # The operation to use OPERATION Create-Printer-Subscription RESOURCE / # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user GROUP subscription ATTR uri notify-recipient-uri testnotify:// ATTR keyword notify-events printer-state-changed ATTR integer notify-lease-duration 5 # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT notify-subscription-id DISPLAY notify-subscription-id } { # The name of the test... NAME "Verify Subscription Expiration" # Delay test for 7 seconds to allow lease to expire... DELAY 7 # The operation to use OPERATION Get-Subscription-Attributes RESOURCE / # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 ATTR integer notify-subscription-id $notify-subscription-id ATTR name requesting-user-name $user # What statuses are OK? STATUS client-error-not-found # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Add 2 Printer Subscriptions w/Lease" # The operation to use OPERATION Create-Printer-Subscription RESOURCE / # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user GROUP subscription ATTR uri notify-recipient-uri testnotify:// ATTR keyword notify-events printer-state-changed ATTR integer notify-lease-duration 5 GROUP subscription ATTR uri notify-recipient-uri testnotify:// ATTR keyword notify-events printer-config-changed ATTR integer notify-lease-duration 5 # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT notify-subscription-id DISPLAY notify-subscription-id } { # The name of the test... NAME "List Printer Subscriptions" # The operation to use OPERATION Get-Subscriptions RESOURCE / # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT notify-subscription-id DISPLAY notify-subscription-id EXPECT notify-printer-uri DISPLAY notify-printer-uri EXPECT notify-events DISPLAY notify-events } { # The name of the test... NAME "Check MaxSubscriptions limits" # The operation to use OPERATION Create-Printer-Subscription RESOURCE / # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user GROUP subscription ATTR uri notify-recipient-uri testnotify:// ATTR keyword notify-events printer-state-changed ATTR integer notify-lease-duration 5 # What statuses are OK? STATUS client-error-too-many-subscriptions # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } cups-2.3.1/test/testps.ppd000664 000765 000024 00000020575 13574721672 015616 0ustar00mikestaff000000 000000 *PPD-Adobe: "4.3" *% *% Test PS PPD file for CUPS. *% *% Copyright © 2007-2018 by Apple Inc. *% Copyright © 1997-2005 by Easy Software Products. *% *% Licensed under Apache License v2.0. See the file "LICENSE" for more *% information. *% *FormatVersion: "4.3" *FileVersion: "2.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "TESTPS.PPD" *Manufacturer: "Apple" *Product: "(CUPS v2.3)" *ModelName: "Test PS Printer" *ShortNickName: "Test PS Printer" *NickName: "Test PS Printer CUPS v2.3" *PSVersion: "(3010.000) 550" *LanguageLevel: "3" *ColorDevice: True *DefaultColorSpace: RGB *FileSystem: False *Throughput: "1" *LandscapeOrientation: Plus90 *VariablePaperSize: False *TTRasterizer: Type42 *UIConstraints: *PageSize Executive *InputSlot Envelope *UIConstraints: *PageSize Letter *InputSlot Envelope *UIConstraints: *PageSize Legal *InputSlot Envelope *UIConstraints: *PageSize Tabloid *InputSlot Envelope *UIConstraints: *PageSize A3 *InputSlot Envelope *UIConstraints: *PageSize A4 *InputSlot Envelope *UIConstraints: *PageSize A5 *InputSlot Envelope *UIConstraints: *PageSize B5 *InputSlot Envelope *UIConstraints: *Resolution 600dpi *ColorModel CMYK *OpenUI *PageSize/Media Size: PickOne *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: Letter *PageSize Letter/US Letter: "<>setpagedevice" *PageSize Legal/US Legal: "<>setpagedevice" *PageSize Executive/US Executive: "<>setpagedevice" *PageSize Tabloid/US Tabloid: "<>setpagedevice" *PageSize A3/A3: "<>setpagedevice" *PageSize A4/A4: "<>setpagedevice" *PageSize A5/A5: "<>setpagedevice" *PageSize B5/B5 (JIS): "<>setpagedevice" *PageSize EnvISOB5/Envelope B5: "<>setpagedevice" *PageSize Env10/Envelope #10: "<>setpagedevice" *PageSize EnvC5/Envelope C5: "<>setpagedevice" *PageSize EnvDL/Envelope DL: "<>setpagedevice" *PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" *CloseUI: *PageSize *OpenUI *PageRegion: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: Letter *PageRegion Letter/US Letter: "<>setpagedevice" *PageRegion Legal/US Legal: "<>setpagedevice" *PageRegion Executive/US Executive: "<>setpagedevice" *PageRegion Tabloid/US Tabloid: "<>setpagedevice" *PageRegion A3/A3: "<>setpagedevice" *PageRegion A4/A4: "<>setpagedevice" *PageRegion A5/A5: "<>setpagedevice" *PageRegion B5/B5 (JIS): "<>setpagedevice" *PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" *PageRegion Env10/Envelope #10: "<>setpagedevice" *PageRegion EnvC5/Envelope C5: "<>setpagedevice" *PageRegion EnvDL/Envelope DL: "<>setpagedevice" *PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" *CloseUI: *PageRegion *DefaultImageableArea: Letter *ImageableArea Letter/US Letter: "18 36 594 756" *ImageableArea Legal/US Legal: "18 36 594 972" *ImageableArea Executive/US Executive: "18 36 504 684" *ImageableArea Tabloid/US Tabloid: "18 36 774 1188" *ImageableArea A3/A3: "18 36 824 1155" *ImageableArea A4/A4: "18 36 577 806" *ImageableArea A5/A5: "18 36 403 559" *ImageableArea B5/JIS B5: "18 36 498 693" *ImageableArea EnvISOB5/B5 (ISO): "18 36 463 673" *ImageableArea Env10/Com-10: "18 36 279 648" *ImageableArea EnvC5/EnvC5: "18 36 441 613" *ImageableArea EnvDL/EnvDL: "18 36 294 588" *ImageableArea EnvMonarch/Envelope Monarch: "18 36 261 504" *DefaultPaperDimension: Letter *PaperDimension Letter/US Letter: "612 792" *PaperDimension Legal/US Legal: "612 1008" *PaperDimension Executive/US Executive: "522 756" *PaperDimension Tabloid/US Tabloid: "792 1224" *PaperDimension A3/A3: "842 1191" *PaperDimension A4/A4: "595 842" *PaperDimension A5/A5: "421 595" *PaperDimension B5/B5 (JIS): "516 729" *PaperDimension EnvISOB5/Envelope B5: "499 709" *PaperDimension Env10/Envelope #10: "297 684" *PaperDimension EnvC5/Envelope C5: "459 649" *PaperDimension EnvDL/Envelope DL: "312 624" *PaperDimension EnvMonarch/Envelope Monarch: "279 540" *OpenUI *MediaType/Media Type: PickOne *OrderDependency: 10 AnySetup *MediaType *DefaultMediaType: Plain *MediaType Plain/Plain Paper: "<>setpagedevice" *MediaType Bond/Bond Paper: "<>setpagedevice" *MediaType Special/Special Paper: "<>setpagedevice" *MediaType Transparency/Transparency: "<>setpagedevice" *MediaType Glossy/Glossy Paper: "<>setpagedevice" *CloseUI: *MediaType *OpenUI *InputSlot/Media Source: PickOne *OrderDependency: 10 AnySetup *InputSlot *DefaultInputSlot: Tray *InputSlot Tray/Tray: "<>setpagedevice" *InputSlot Manual/Manual Feed: "<>setpagedevice" *InputSlot Envelope/Envelope Feed: "<>setpagedevice" *CloseUI: *InputSlot *OpenUI *Resolution/Output Resolution: PickOne *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 100dpi *Resolution 75dpi/75 DPI: "<>setpagedevice" *Resolution 100dpi/100 DPI: "<>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne *OrderDependency: 10 AnySetup *ColorModel *DefaultColorModel: CMYK *ColorModel CMYK/CMYK Color: "<>setpagedevice" *ColorModel RGB/CMY Color: "<>setpagedevice" *ColorModel Gray/Grayscale: "<>setpagedevice" *CloseUI: *ColorModel *DefaultFont: Courier *Font AvantGarde-Book: Standard "(001.006S)" Standard ROM *Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM *Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM *Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM *Font Bookman-Demi: Standard "(001.004S)" Standard ROM *Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM *Font Bookman-Light: Standard "(001.004S)" Standard ROM *Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM *Font Courier: Standard "(002.004S)" Standard ROM *Font Courier-Bold: Standard "(002.004S)" Standard ROM *Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM *Font Courier-Oblique: Standard "(002.004S)" Standard ROM *Font Helvetica: Standard "(001.006S)" Standard ROM *Font Helvetica-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM *Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM *Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM *Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM *Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM *Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM *Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM *Font Palatino-Bold: Standard "(001.005S)" Standard ROM *Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM *Font Palatino-Italic: Standard "(001.005S)" Standard ROM *Font Palatino-Roman: Standard "(001.005S)" Standard ROM *Font Symbol: Special "(001.007S)" Special ROM *Font Times-Bold: Standard "(001.007S)" Standard ROM *Font Times-BoldItalic: Standard "(001.009S)" Standard ROM *Font Times-Italic: Standard "(001.007S)" Standard ROM *Font Times-Roman: Standard "(001.007S)" Standard ROM *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM cups-2.3.1/test/5.1-lpadmin.sh000664 000765 000024 00000002643 13574721672 016044 0ustar00mikestaff000000 000000 #!/bin/sh # # Test the lpadmin command. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 1997-2005 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # echo "Add Printer Test" echo "" echo " lpadmin -p Test3 -v file:/dev/null -E -m drv:///sample.drv/deskjet.ppd" $runcups $VALGRIND ../systemv/lpadmin -p Test3 -v file:/dev/null -E -m drv:///sample.drv/deskjet.ppd 2>&1 if test $? != 0; then echo " FAILED" exit 1 else if test -f $CUPS_SERVERROOT/ppd/Test3.ppd; then echo " PASSED" else echo " FAILED (No PPD)" exit 1 fi fi echo "" echo "Modify Printer Test" echo "" echo " lpadmin -p Test3 -v file:/tmp/Test3 -o PageSize=A4" $runcups $VALGRIND ../systemv/lpadmin -p Test3 -v file:/tmp/Test3 -o PageSize=A4 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "Delete Printer Test" echo "" echo " lpadmin -x Test3" $runcups $VALGRIND ../systemv/lpadmin -x Test3 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "Add Shared Printer Test" echo "" echo " lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m everywhere" $runcups $VALGRIND ../systemv/lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m everywhere 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" cups-2.3.1/test/5.4-lpstat.sh000664 000765 000024 00000001700 13574721672 015723 0ustar00mikestaff000000 000000 #!/bin/sh # # Test the lpstat command. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2005 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # echo "LPSTAT Basic Test" echo "" echo " lpstat -t" $runcups $VALGRIND ../systemv/lpstat -t 2>&1 if test $? != 0; then echo " FAILED" exit 1 else echo " PASSED" fi echo "" echo "LPSTAT Enumeration Test" echo "" echo " lpstat -e" printers="`$runcups $VALGRIND ../systemv/lpstat -e 2>&1`" if test $? != 0 -o "x$printers" = x; then echo " FAILED" exit 1 else for printer in $printers; do echo $printer done echo " PASSED" fi echo "" echo "LPSTAT Get Host Test" echo "" echo " lpstat -H" server="`$runcups $VALGRIND ../systemv/lpstat -H 2>&1`" if test $? != 0 -o "x$server" != x$CUPS_SERVER; then echo " FAILED ($server)" exit 1 else echo " PASSED ($server)" fi echo "" cups-2.3.1/test/4.3-job-ops.test000664 000765 000024 00000016437 13574721672 016345 0ustar00mikestaff000000 000000 # # Verify that the IPP job operations work. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products. All rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # { # The name of the test... NAME "Print PostScript Job with bad job-sheets value to Test1" # The operation to use OPERATION print-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user ATTR name job-sheets "none\,none" FILE ../examples/testfile.ps # What statuses are OK? STATUS client-error-bad-request } { # The name of the test... NAME "Print PostScript Job to Test1" # The operation to use OPERATION print-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user FILE ../examples/testfile.ps # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id } { # The name of the test... NAME "Get Job Attributes" # The operation to use OPERATION get-job-attributes RESOURCE /jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR integer job-id $job-id # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id EXPECT job-uri EXPECT job-state } { # The name of the test... NAME "Print JPEG Job to Test2" # The operation to use OPERATION print-job RESOURCE /printers/Test2 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test2 ATTR name requesting-user-name $user GROUP subscription ATTR uri notify-recipient-uri testnotify:/// FILE ../examples/testfile.jpg # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id EXPECT notify-subscription-id } { # The name of the test... NAME "Get Job Attributes" # The operation to use OPERATION get-job-attributes RESOURCE /jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test2 ATTR integer job-id $job-id # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id EXPECT job-uri EXPECT job-state } { # The name of the test... NAME "Print Text Job to Test1" # The operation to use OPERATION print-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user FILE ../examples/testfile.txt # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id } { # The name of the test... NAME "Print PDF Job to Test1" # The operation to use OPERATION print-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user GROUP job ATTR keyword job-hold-until weekend FILE ../examples/testfile.pdf # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id } { # The name of the test... NAME "Hold Job on Test1" # The operation to use OPERATION hold-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR integer job-id $job-id ATTR name requesting-user-name $user # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Release Job on Test1" # The operation to use OPERATION release-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR integer job-id $job-id ATTR name requesting-user-name $user # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Print Held Image Job to Test1" # The operation to use OPERATION print-job RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 ATTR name requesting-user-name $user GROUP job ATTR keyword job-hold-until indefinite FILE ../examples/testfile.jpg # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-id } { # The name of the test... NAME "Cancel Job" # The operation to use OPERATION cancel-job RESOURCE /jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri job-uri $method://$hostname:$port/jobs/$job-id ATTR name requesting-user-name $user # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language } { # The name of the test... NAME "Get Job List on Test1" # The operation to use OPERATION get-jobs RESOURCE /printers/Test1 # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $method://$hostname:$port/printers/Test1 # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT !job-printer-uri } { # The name of the test... NAME "Get All Jobs" # The operation to use OPERATION get-jobs RESOURCE /jobs # The attributes to send GROUP operation ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $scheme://$hostname:$port/ ATTR keyword requested-attributes all # What statuses are OK? STATUS successful-ok # What attributes do we expect? EXPECT attributes-charset EXPECT attributes-natural-language EXPECT job-uri EXPECT job-id EXPECT job-state EXPECT job-printer-uri } cups-2.3.1/locale/cups_ja.po000664 000765 000024 00001261143 13574721672 016032 0ustar00mikestaff000000 000000 # # Japanese message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2014-11-15 19:27+0900\n" "Last-Translator: OPFC TRANSCUPS \n" "Language-Team: Japanese - OPFC TRANSCUPS \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(すべて)" msgid "\t\t(none)" msgstr "\t\t(なし)" #, c-format msgid "\t%d entries" msgstr "\t%d エントリー" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\t失敗後: 継続" #, c-format msgid "\tAlerts: %s" msgstr "\t警告: %s" msgid "\tBanner required" msgstr "\tバナーが必要" msgid "\tCharset sets:" msgstr "\t文字セット:" msgid "\tConnection: direct" msgstr "\t接続: 直結" msgid "\tConnection: remote" msgstr "\t接続: リモート" msgid "\tContent types: any" msgstr "\tコンテンツの種類: すべて" msgid "\tDefault page size:" msgstr "\tデフォルト用紙サイズ:" msgid "\tDefault pitch:" msgstr "\tデフォルトピッチ:" msgid "\tDefault port settings:" msgstr "\tデフォルトポート設定:" #, c-format msgid "\tDescription: %s" msgstr "\t説明: %s" msgid "\tForm mounted:" msgstr "\t設定されたフォーム:" msgid "\tForms allowed:" msgstr "\t許可されているフォーム:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tインターフェイス: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tインターフェイス: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\t場所: %s" msgid "\tOn fault: no alert" msgstr "\t失敗時: 警告なし" msgid "\tPrinter types: unknown" msgstr "\tプリンターの種類: 不明" #, c-format msgid "\tStatus: %s" msgstr "\tステータス: %s" msgid "\tUsers allowed:" msgstr "\t許可されているユーザー:" msgid "\tUsers denied:" msgstr "\t禁止されているユーザー:" msgid "\tdaemon present" msgstr "\tデーモンは提供されています" msgid "\tno entries" msgstr "\tエントリーがありません" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tデバイス '%s' 上のプリンター 速度 -1" msgid "\tprinting is disabled" msgstr "\t印刷は無効です" msgid "\tprinting is enabled" msgstr "\t印刷は有効です" #, c-format msgid "\tqueued for %s" msgstr "\t%s にキューしました" msgid "\tqueuing is disabled" msgstr "\tキューは無効です" msgid "\tqueuing is enabled" msgstr "\tキューは有効です" msgid "\treason unknown" msgstr "\t未知の理由" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " 適合テスト結果詳細" msgid " REF: Page 15, section 3.1." msgstr " 参照: 15 ページ、セクション 3.1。" msgid " REF: Page 15, section 3.2." msgstr " 参照: 15 ページ、セクション 3.2。" msgid " REF: Page 19, section 3.3." msgstr " 参照: 19 ページ、セクション 3.3。" msgid " REF: Page 20, section 3.4." msgstr " 参照: 20 ページ、セクション 3.4。" msgid " REF: Page 27, section 3.5." msgstr " 参照: 27 ページ、セクション 3.5。" msgid " REF: Page 42, section 5.2." msgstr " 参照: 42 ページ、セクション 5.2。" msgid " REF: Pages 16-17, section 3.2." msgstr " 参照: 16-17 ページ、セクション 3.2。" msgid " REF: Pages 42-45, section 5.2." msgstr " 参照: 42-45 ページ、セクション 5.2。" msgid " REF: Pages 45-46, section 5.2." msgstr " 参照: 45-46 ページ、セクション 5.2。" msgid " REF: Pages 48-49, section 5.2." msgstr " 参照: 48-49 ページ、セクション 5.2。" msgid " REF: Pages 52-54, section 5.2." msgstr " 参照: 52-54 ページ、セクション 5.2。" #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f バイト" #, c-format msgid " PASS Default%s" msgstr " 合格 Default%s" msgid " PASS DefaultImageableArea" msgstr " 合格 DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " 合格 DefaultPaperDimension" msgid " PASS FileVersion" msgstr " 合格 FileVersion" msgid " PASS FormatVersion" msgstr " 合格 FormatVersion" msgid " PASS LanguageEncoding" msgstr " 合格 LanguageEncoding" msgid " PASS LanguageVersion" msgstr " 合格 LanguageVersion" msgid " PASS Manufacturer" msgstr " 合格 Manufacturer" msgid " PASS ModelName" msgstr " 合格 ModelName" msgid " PASS NickName" msgstr " 合格 NickName" msgid " PASS PCFileName" msgstr " 合格 PCFileName" msgid " PASS PSVersion" msgstr " 合格 PSVersion" msgid " PASS PageRegion" msgstr " 合格 PageRegion" msgid " PASS PageSize" msgstr " 合格 PageSize" msgid " PASS Product" msgstr " 合格 Product" msgid " PASS ShortNickName" msgstr " 合格 ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " 警告 %s は相当するオプションがありません。" #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " 警告 %s は %s と一般プレフィックスを共有します。\n" " 参照: 15 ページ、セクション 3.2。" #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " 警告 Duplex オプションキーワード %s は期待通りに動作しないかもしれ" "ません。また、Duplex という名前であるべきです。 参照: 122 ペー" "ジ、セクション 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" " 警告 ファイルが CR、LF、CR LF の行末を混在して含んでいます。" msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " 警告 LanguageEncoding は PPD 4.3 仕様で必須です。\n" " 参照: 56-57 ページ、セクション 5.3。" #, c-format msgid " WARN Line %d only contains whitespace." msgstr " 警告 %d 行が空白だけです。" msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " 警告 Manufacturer は PPD 4.3 仕様で必須です。\n" " 参照: 58-59 ページ、セクション 5.3。" msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " 警告 非 Windows PPD ファイルは、CR LF でなく LF のみを行末に使うべ" "きです。" #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " 警告 PPD バージョン %.1f は現在使われていません。\n" " 参照: 42 ページ、セクション 5.2。" msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " 警告 8.3 文字より長い PCFileName は PPD 仕様違反です。\n" " 参照: 61-62 ページ、セクション 5.3。" msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " 警告 PCFileName はユニークなファイル名でなければなりません。\n" " 参照: 61-62 ページ、セクション 5.3。" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " 警告 プロトコルが PJL を含んでいますが JCL 属性が設定されていませ" "ん。\n" " 参照: 78-79 ページ、セクション 5.7。" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " 警告 プロトコルが PJL と BCP の両方を含んでいます; TBCP を想定しま" "す。\n" " 参照: 78-79 ページ、セクション 5.7。" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " 警告 ShortNickName は PPD 4.3 仕様で必須です。\n" " 参照: 64-65 ページ、セクション 5.3。" #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" は \"%s %s\" と競合します\n" " (禁則=\"%s %s %s %s\")。" #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s が存在しません。" #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr "" " %s %s ファイル \"%s\" は不正な大文字で始まるワードを含んでいます。" #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s 不正な %s が %s を選んでいます。\n" " 参照: 122 ページ、セクション 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 、選択 %s) です。" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 用) です。" #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s 不正な値が cupsFilter に設定されています。 \"%s\"" #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s 不正な値が cupsFilter2 に設定されています。 \"%s\"" #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s 不正な cupsICCProfile %s です。" #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s 不正な値が cupsPreFilter に設定されています。 \"%s\"" #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s 不正な cupsUIConstraints %s: \"%s\" です。" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s 無効な言語 \"%s\" です。" #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s 不正なパーミッション %s です (ファイル \"%s\")。" #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s %s の不正な綴りです - %s であるべきです。" #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr " %s APScanAppPath と APScanAppBundleID は同時に指定できません。" #, c-format msgid " %s Default choices conflicting." msgstr " %s デフォルトの選択肢が競合しています。" #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s 空の cupsUIConstraints %s です。" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" " %s \"%s\" 翻訳文字列 (オプション %s 、選択 %s) が見つかりません。" #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s \"%s\" 翻訳文字列 (オプション %s 用) が見つかりません。" #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s %s が見つかりません (ファイル \"%s\")。" #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s 必須の PageRegion オプションが見つかりません。\n" " 参照: 100 ページ、セクション 5.14。" #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s 必須の PageSize オプションが見つかりません。\n" " 参照: 99 ページ、セクション 5.14。" #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" " %s  選択 *%s %s が UIConstraints \"*%s %s *%s %s\" 内に見つかりませ" "ん。" #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr "" " %s 選択 *%s %s が cupsUIConstraints %s: \"%s\" 内に見つかりません。" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s cupsUIResolver ファイル %s が見つかりません。" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" " %s オプション %s がUIConstraints \"*%s %s *%s %s\" に見つかりません。" #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "" " %s オプション %s がcupsUIConstraints %s に見つかりません: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s ファイルにベース翻訳文字列 \"%s\" がありません。" #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s 必須の %s が選択肢 None を定義していません。\n" " 参照: 122 ページ、セクション 5.17。" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "" " %s サイズ \"%s\" は %s 向けに定義されていますが、%s にはありません。" #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s サイズ \"%s\" は規定外の寸法 (%gx%g) を持っています。" #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s サイズ \"%s\" は \"%s\" であるべきです。" #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr " %s サイズ \"%s\" は Adobe 標準名称 \"%s\" であるべきです。" #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s cupsICCProfileのハッシュ値 %s が %s と一致しません。" #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolverの %s がループしています。" #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" " %s cupsUIResolver %s は最低でも 2 つの異なったオプションを持っていなけ" "ればなりません。" #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **失敗** %s は 1284DeviceID でなければなりません。\n" " 参照: 72 ページ、セクション 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **失敗** 不正な Default%s %s\n" " 参照: 40 ページ、セクション 4.5。" #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **失敗** %s は不正な DefaultImageableArea です。\n" " 参照: 102 ページ、セクション 5.15。" #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **失敗** %s は不正な DefaultPaperDimension です。\n" " 参照: 103 ページ、セクション 5.15。" #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **失敗** 不正なFileVersion \"%s\"\n" " 参照: 56 ページ、セクション 5.3。" #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **失敗** FormatVersion が違います \"%s\"\n" " 参照: 56 ページ、セクション 5.3。" msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **失敗** ファイルに不正な JobPatchFile 属性があります\n" " 参照: 24 ページ、セクション 3.4。" #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" " **失敗** 無効な LanguageEncoding %s - ISOLatin1 でなければなりません。" #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" " **失敗** 無効な LanguageVersion %s - English でなければなりません。" #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **失敗** 不正な Manufacturer (\"%s\" でなければなりません)\n" " 参照: 211 ページ、表 D.1。" #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **失敗** 不正な ModelName - 文字列に \"%c\" は許可されていません。\n" " 参照: 59-60 ページ、セクション 5.3。" msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **失敗** 不正な PSVersion - \"(文字列) 整数\" ではありません。\n" " 参照: 62-64 ページ、セクション 5.3。" msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **失敗** 不正な Product - \"(文字列)\" ではありません。\n" " 参照: 62 ページ、セクション 5.3。" msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **失敗** 不正な ShortNickName - 31 文字を超えています。\n" " 参照: 64-65 ページ、セクション 5.3。" #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **失敗** 不正な %s が %s を選んでいます。\n" " 参照: 84 ページ、セクション 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr " **失敗** デフォルトのオプションコードが解釈できません: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **失敗** オプション %s、選択肢 %s のデフォルトの翻訳文字列が 8 ビット" "文字を含んでいます。" #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **失敗** オプション %s のデフォルトの翻訳文字列が 8 ビット文字を含んで" "います。" #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr " **失敗** グループ名 %s と %s は大文字/小文字が違うだけです。" #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr " **失敗** %s で複数のオプション %s が選択されています。" #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" " **失敗** %s が選択した %s と %s は大文字/小文字のみが違うだけです。" #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr " **失敗** オプション名 %s と %s は大文字/小文字が違うだけです。" #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **失敗** Default%s は必須\n" " 参照: 40 ページ、セクション 4.5。" msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **失敗** DefaultImageableArea は必須\n" " 参照: 102 ページ、セクション 5.15。" msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **失敗** DefaultPaperDimension は必須\n" " 参照: 103 ページ、セクション 5.15。" msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **失敗** FileVersion は必須\n" " 参照: 56 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **失敗** FormatVersion は必須\n" " 参照: 56 ページ、セクション 5.3。" #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **失敗** PageSize %s に ImageableArea は必須\n" " 参照: 41 ページ、セクション 5。\n" " 参照: 102 ページ、セクション 5.15。" msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **失敗** LanguageEncoding は必須\n" " 参照: 56-57 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **失敗** LanguageVersion は必須\n" " 参照: 57-58 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **失敗** Manufacturer は必須\n" " 参照: 58-59 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **失敗** ModelName は必須\n" " 参照: 59-60 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **失敗** NickName は必須\n" " 参照: 60 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **失敗** PCFileName は必須\n" " 参照: 61-62 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **失敗** PSVersion は必須\n" " 参照: 62-64 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **失敗** PageRegion は必須\n" " 参照: 100 ページ、セクション 5.14。" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **失敗** PageSize は必須\n" " 参照: 41 ページ、セクション 5。\n" " 参照: 99 ページ、セクション 5.14。" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **失敗** PageSize は必須\n" " 参照: 99-100 ページ、セクション 5.14。" #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **失敗** PageSize %s に PaperDimension は必須\n" " 参照: 41 ページ、セクション 5。\n" " 参照: 103 ページ、セクション 5.15。" msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **失敗** Product は必須\n" " 参照: 62 ページ、セクション 5.3。" msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **失敗** ShortNickName は必須\n" " 参照: 64-65 ページ、セクション 5.3。" #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" " 失敗\n" " **失敗** PPD ファイルを開けません - %s (%d 行)。" #, c-format msgid " %d ERRORS FOUND" msgstr " %d 個のエラーが見つかりました" msgid " NO ERRORS FOUND" msgstr " エラーは見つかりませんでした" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr 行末を CR とする (Mac OS 9)。" msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf 行末を CR + LF とする (Windows)。" msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr " --list-filters 使用されるフィルターのリストを表示する。" msgid " -D Remove the input file when finished." msgstr " -D 終了したときに入力ファイルを削除する。" msgid " -D name=value Set named variable to value." msgstr "" " -D name=value name で指定された変数に値 value をセットする。" msgid " -I include-dir Add include directory to search path." msgstr "" " -I include-dir インクルードディレクトリーを検索パスに含める。" msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd PPD ファイルを指定する。" msgid " -U username Specify username." msgstr " -U username ユーザー名を指定する。" msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalog.po 指定したメッセージカタログをロードする。" msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c cups-files.conf cups-files.conf を利用するよう設定する。" msgid " -d output-dir Specify the output directory." msgstr " -d output-dir 出力先ディレクトリーを指定する。" msgid " -d printer Use the named printer." msgstr " -d printer 指定されたプリンターを利用する。" msgid " -e Use every filter from the PPD file." msgstr "" " -e PPD ファイルからすべてのフィルターを使用する。" msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i mime/type 入力の MIME タイプを指定する (指定がなければ自動タ" "イプ)。" msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] フィルターファイル N を指定されたジョブから使用す" "る (デフォルトは ファイル 1)。" msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] 出力言語を指定する。(複数可能)" msgid " -m Use the ModelName value as the filename." msgstr " -m ModelName の値をファイル名として使用する。" msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type 出力の MIME タイプを指定する (指定がなければ " "application/pdf)。" msgid " -n copies Set number of copies." msgstr " -n copies 部数を指定する。" msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o filename.drv ドライバー情報ファイルを指定する (指定がなければ " "ppdi.drv)。" msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o filename.ppd[.gz] 出力ファイルを指定する (指定がなければ標準出力)。" msgid " -o name=value Set option(s)." msgstr " -o name=value オプションを指定する。" msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd PPD ファイルを指定する。" msgid " -t Test PPDs instead of generating them." msgstr " -t PPD を出力しないでテストする。" msgid " -t title Set title." msgstr " -t title タイトルを指定する。" msgid " -u Remove the PPD file when finished." msgstr " -u 終了したときに PPD ファイルを削除する。" msgid " -v Be verbose." msgstr " -v 冗長出力を行う。" msgid " -z Compress PPD files using GNU zip." msgstr " -z PPD ファイルを GNU zip を使って圧縮する。" msgid " FAIL" msgstr " 失敗" msgid " PASS" msgstr " 合格" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f バイト" #, c-format msgid "%d x %d mm" msgstr "%d x %d mm" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (ふちなし)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (ふちなし, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (ふちなし, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s は %s からリクエストを受け付けています" #, c-format msgid "%s cannot be changed." msgstr "%s は変更できません。" #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s は lpc の CUPS バージョンでは実装されていません。" #, c-format msgid "%s is not ready" msgstr "%s は準備ができていません" #, c-format msgid "%s is ready" msgstr "%s は準備ができています" #, c-format msgid "%s is ready and printing" msgstr "%s は準備ができており印刷しています" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s ジョブID ユーザー タイトル コピー数 オプション [ファイル]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s は %s からリクエストを受け付けていません -" #, c-format msgid "%s not supported." msgstr "%s はサポートされていません。" #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s は %s からリクエストを受け付けています" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s は %s からリクエストを受け付けていません - " #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s:%-33.33s [ジョブ %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s に失敗しました: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: -V オプションにおいて %s は不正なバージョンです。" #, c-format msgid "%s: Don't know what to do." msgstr "%s: 何が起きているか不明です。" #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています。" #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: エラー - '/version=1.1' をサーバー名に付与してください。" #, c-format msgid "%s: Error - bad job ID." msgstr "%s: エラー - 不正なジョブ ID です。" #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: エラー - ファイルを印刷できず、ジョブを同時に変えることができません。" #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: エラー - ファイルまたはジョブ ID が提供されている場合、標準入力から印刷で" "きません。 " #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: エラー - \"-S\" オプションのあとには文字セットが必要です。" #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: エラー - \"-T\" オプションのあとにはコンテンツタイプが必要です。" #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: エラー - \"-#\" オプションのあとにはコピー数が必要です。" #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: エラー - \"-n\" オプションのあとにはコピー数が必要です。" #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: エラー - \"-P\" オプションのあとには宛先が必要です。" #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: エラー - \"-d\" オプションのあとにはプリンター名が必要です。" #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: エラー - \"-f\" オプションのあとには用紙名が必要です。" #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: エラー - \"-H\" オプションのあとにはホールド名が必要です。" #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: エラー - \"-H\" オプションのあとにはホスト名が必要です。" #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: エラー - \"-h\" オプションのあとにはホスト名が必要です。" #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: エラー - \"-y\" オプションのあとにはモードリストが必要です。" #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: エラー - \"-%c\" オプションのあとには名前が必要です。" #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: エラー - \"-o\" オプションのあとには オプション=値 が必要です。" #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: エラー - \"-P\" オプションのあとにはページリストが必要です。" #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: エラー - \"-%c\" オプションのあとには優先度が必要です。" #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: エラー - \"-r\" のあとには理由のテキストが必要です。" #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: エラー - \"-t\" オプションのあとにはタイトルが必要です。" #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: エラー - \"-U\" オプションのあとにはユーザー名が必要です。" #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: エラー - \"-u\" オプションのあとにはユーザー名が必要です。" #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: エラー - \"-%c\" オプションのあとには値が必要です。" #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: エラー - \"-W\" オプションのあとには、\"completed\"、\"not-completed" "\"、\"all\" のいずれかが必要です。" #, c-format msgid "%s: Error - no default destination available." msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。" #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: エラー - 優先度は 1 から 100 の間である必要があります。" #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: エラー - スケジューラーが応答していません。" #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: エラー - ファイルが多すぎます - \"%s\"" #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: エラー - \"%s\" にアクセスできません - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: エラー - 標準入力からキューにデータを入力できません。 - %s" #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: エラー - \"%s\" は未知の宛先です。" #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: エラー - \"%s/%s\" は未知の宛先です。" #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: エラー - '%c' は未知のオプションです。" #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: エラー - '%s' は未知のオプションです。" #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: '-i' オプションのあとにはジョブ ID が必要です。" #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: リスト \"%s\" に無効な宛先名があります。" #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: 無効なフィルター文字列です \"%s\"" #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: \"-P\" にファイル名がありません。" #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: \"-T\" オプションにタイムアウトが設定されていません。" #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: \"-V\" オプションにバージョンの指定がありません。" #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: '-H restart' の前にはジョブ ID ('-i ジョブID') が必要です。" #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: %s/%s から %s/%s に変換するフィルターがありません。" #, c-format msgid "%s: Operation failed: %s" msgstr "%s: 操作に失敗しました: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: 残念ながら、暗号化サポートはコンパイル時に組み込まれていません。" #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: サーバーに接続できません" #, c-format msgid "%s: Unable to contact server." msgstr "%s: サーバーに連絡できません。" #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: \"%s\" の MIME タイプを判別できません。" #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: \"%s\" を開けません: %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: %s を開けません: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: PPD ファイルを開けません: %s の %d 行目" #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" "%s: \"%s\" または \"%s\" から MIME データベースを読み取ることができません。" #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: \"%s\" は未知の宛先です。" #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: %s/%s は未知の宛先 MIME タイプです。" #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: '%c' は未知のオプションです。" #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: \"%s\" は未知のオプションです。" #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: \"-%c\" は未知のオプションです。" #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: %s/%s は未知のソース MIME タイプです。" #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: 警告 - '%c' 形式修飾子はサポートされていません - 出力は正しくないものにな" "るかもしれません。" #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: 警告 - 文字セットオプションは無視されます。" #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: 警告 - コンテンツタイプオプションは無視されます。" #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: 警告 - 用紙オプションは無視されます。" #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: 警告 - モードオプションは無視されます。" msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 インチ/秒" msgid "1.25x0.25\"" msgstr "1.25x0.25 インチ" msgid "1.25x2.25\"" msgstr "1.25x2.25 インチ" msgid "1.5 inch/sec." msgstr "1.5 インチ/秒" msgid "1.50x0.25\"" msgstr "1.50x0.25 インチ" msgid "1.50x0.50\"" msgstr "1.50x0.50 インチ" msgid "1.50x1.00\"" msgstr "1.50x1.00 インチ" msgid "1.50x2.00\"" msgstr "1.50x2.00 インチ" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 インチ/秒" msgid "10 x 11" msgstr "10 x 11 インチ" msgid "10 x 13" msgstr "10 x 13 インチ" msgid "10 x 14" msgstr "10 x 14 インチ" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 ミリメートル/秒" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 インチ/秒" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 インチ/秒" msgid "12 x 11" msgstr "12 x 11 インチ" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 ミリメートル/秒" msgid "120x60dpi" msgstr "120x60dpi" msgid "120x72dpi" msgstr "120x72dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 ミリメートル/秒" msgid "15 x 11" msgstr "15 x 11 インチ" msgid "150 mm/sec." msgstr "150 ミリメートル/秒" msgid "150dpi" msgstr "150dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 インチ/秒" msgid "2-Sided Printing" msgstr "両面印刷" msgid "2.00x0.37\"" msgstr "2.00x0.37 インチ" msgid "2.00x0.50\"" msgstr "2.00x0.50 インチ" msgid "2.00x1.00\"" msgstr "2.00x1.00 インチ" msgid "2.00x1.25\"" msgstr "2.00x1.25 インチ" msgid "2.00x2.00\"" msgstr "2.00x2.00 インチ" msgid "2.00x3.00\"" msgstr "2.00x3.00 インチ" msgid "2.00x4.00\"" msgstr "2.00x4.00 インチ" msgid "2.00x5.50\"" msgstr "2.00x5.50 インチ" msgid "2.25x0.50\"" msgstr "2.25x0.50 インチ" msgid "2.25x1.25\"" msgstr "2.25x1.25 インチ" msgid "2.25x4.00\"" msgstr "2.25x4.00 インチ" msgid "2.25x5.50\"" msgstr "2.25x5.50 インチ" msgid "2.38x5.50\"" msgstr "2.38x5.50 インチ" msgid "2.5 inches/sec." msgstr "2.5 インチ/秒" msgid "2.50x1.00\"" msgstr "2.50x1.00 インチ" msgid "2.50x2.00\"" msgstr "2.50x2.00 インチ" msgid "2.75x1.25\"" msgstr "2.75x1.25 インチ" msgid "2.9 x 1\"" msgstr "2.9 x 1 インチ" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 ミリメートル/秒" msgid "200 mm/sec." msgstr "200 ミリメートル/秒" msgid "203dpi" msgstr "203dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24 ピンシリーズ" msgid "240x72dpi" msgstr "240x72dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 ミリメートル/秒" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 インチ/秒" msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00 インチ" msgid "3.00x1.25\"" msgstr "3.00x1.25 インチ" msgid "3.00x2.00\"" msgstr "3.00x2.00 インチ" msgid "3.00x3.00\"" msgstr "3.00x3.00インチ" msgid "3.00x5.00\"" msgstr "3.00x5.00 インチ" msgid "3.25x2.00\"" msgstr "3.25x2.00 インチ" msgid "3.25x5.00\"" msgstr "3.25x5.00 インチ" msgid "3.25x5.50\"" msgstr "3.25x5.50 インチ" msgid "3.25x5.83\"" msgstr "3.25x5.83 インチ" msgid "3.25x7.83\"" msgstr "3.25x7.83 インチ" msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "3.5 インチディスク" msgid "3.50x1.00\"" msgstr "3.50x1.00 インチ" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 ミリメートル/秒" msgid "300 mm/sec." msgstr "300 ミリメートル/秒" msgid "300dpi" msgstr "300dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360dpi" msgid "360x180dpi" msgstr "360x180dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 インチ/秒" msgid "4.00x1.00\"" msgstr "4.00x1.00 インチ" msgid "4.00x13.00\"" msgstr "4.00x13.00 インチ" msgid "4.00x2.00\"" msgstr "4.00x2.00 インチ" msgid "4.00x2.50\"" msgstr "4.00x2.50 インチ" msgid "4.00x3.00\"" msgstr "4.00x3.00 インチ" msgid "4.00x4.00\"" msgstr "4.00x4.00 インチ" msgid "4.00x5.00\"" msgstr "4.00x5.00 インチ" msgid "4.00x6.00\"" msgstr "4.00x6.00 インチ" msgid "4.00x6.50\"" msgstr "4.00x6.50 インチ" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 ミリメートル/秒" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 インチ/秒" msgid "5 x 7" msgstr "5 x 7 インチ" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 インチ/秒" msgid "6.00x1.00\"" msgstr "6.00x1.00 インチ" msgid "6.00x2.00\"" msgstr "6.00x2.00 インチ" msgid "6.00x3.00\"" msgstr "6.00x3.00 インチ" msgid "6.00x4.00\"" msgstr "6.00x4.00 インチ" msgid "6.00x5.00\"" msgstr "6.00x5.00 インチ" msgid "6.00x6.00\"" msgstr "6.00x6.00 インチ" msgid "6.00x6.50\"" msgstr "6.00x6.50 インチ" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 ミリメートル/秒" msgid "600dpi" msgstr "600dpi" msgid "60dpi" msgstr "60dpi" msgid "60x72dpi" msgstr "60x72dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 インチ/秒" msgid "7 x 9" msgstr "7 x 9 インチ" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 インチ/秒" msgid "8 x 10" msgstr "8 x 10 インチ" msgid "8.00x1.00\"" msgstr "8.00x1.00 インチ" msgid "8.00x2.00\"" msgstr "8.00x2.00 インチ" msgid "8.00x3.00\"" msgstr "8.00x3.00 インチ" msgid "8.00x4.00\"" msgstr "8.00x4.00 インチ" msgid "8.00x5.00\"" msgstr "8.00x5.00 インチ" msgid "8.00x6.00\"" msgstr "8.00x6.00 インチ" msgid "8.00x6.50\"" msgstr "8.00x6.50 インチ" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 ミリメートル/秒" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 インチ/秒" msgid "9 x 11" msgstr "9 x 11 インチ" msgid "9 x 12" msgstr "9 x 12 インチ" msgid "9-Pin Series" msgstr "9 ピンシリーズ" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?無効なヘルプコマンドです" #, c-format msgid "A class named \"%s\" already exists." msgstr "\"%s\" という名前のクラスはすでに存在します。" #, c-format msgid "A printer named \"%s\" already exists." msgstr "\"%s\" という名前のプリンターはすでに存在します。" msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 長辺送り" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 長辺送り" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 長辺送り" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 長辺送り" msgid "A3 Oversize" msgstr "A3 (特大)" msgid "A3 Oversize Long Edge" msgstr "A3 (特大) 長辺送り" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 長辺送り" msgid "A4 Oversize" msgstr "A4 (特大)" msgid "A4 Small" msgstr "A4 (小)" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 長辺送り" msgid "A5 Oversize" msgstr "A5 (特大)" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 長辺送り" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C 長辺送り" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D 長辺送り" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E 長辺送り" msgid "Accept Jobs" msgstr "ジョブの受け付け" msgid "Accepted" msgstr "受け付けました" msgid "Add Class" msgstr "クラスの追加" msgid "Add Printer" msgstr "プリンターの追加" msgid "Address" msgstr "アドレス" msgid "Administration" msgstr "管理" msgid "Always" msgstr "常に有効" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "アプリケーター" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "%s printer-state に 不正な値 %d を設定しようとしています。" #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "属性グループは範囲外です (%x < %x)。" msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "B5 (特大)" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "誤った 'document-format' の値です \"%s\"。" msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "不正な NULL 送信先ポインター" msgid "Bad OpenGroup" msgstr "不正な OpenGroup" msgid "Bad OpenUI/JCLOpenUI" msgstr "不正な OpenUI/JCLOpenUI" msgid "Bad OrderDependency" msgstr "不正な OrderDependency" msgid "Bad PPD cache file." msgstr "不正な PPD キャッシュファイルです。" msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "不正なリクエスト" msgid "Bad SNMP version number" msgstr "不正な SNMP バージョン番号" msgid "Bad UIConstraints" msgstr "不正な UIConstraints" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "関数の引数が不正" #, c-format msgid "Bad copies value %d." msgstr "%d は不正なコピー値です。" msgid "Bad custom parameter" msgstr "不正なカスタムパラメーター" #, c-format msgid "Bad device-uri \"%s\"." msgstr "\"%s\" は無効な device-uri です。" #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "\"%s\" は無効な device-uri スキーマです。" #, c-format msgid "Bad document-format \"%s\"." msgstr "\"%s\" は不正な document-format です。" #, c-format msgid "Bad document-format-default \"%s\"." msgstr "\"%s\" は不正な document-format-default です。" msgid "Bad filename buffer" msgstr "不正なファイル名バッファーです。" msgid "Bad hostname/address in URI" msgstr "URI のホスト名/アドレスが不正" #, c-format msgid "Bad job-name value: %s" msgstr "誤った job-name 値: %s" msgid "Bad job-name value: Wrong type or count." msgstr "誤った job-name 値: 型かカウントが誤っています。" msgid "Bad job-priority value." msgstr "不正な job-priority 値です。" #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "\"%s\" は不正な job-sheets 値です。" msgid "Bad job-sheets value type." msgstr "不正な job-sheets 値タイプ です。" msgid "Bad job-state value." msgstr "不正な job-state 値です。" #, c-format msgid "Bad job-uri \"%s\"." msgstr "\"%s\" は無効な job-uri 属性です。" #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "\"%s\" は無効な notify-pull-method です。" #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "URI \"%s\" は不正な notify-recipient-uri です。" #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "%d は不正な number-up 値です。" #, c-format msgid "Bad page-ranges values %d-%d." msgstr "%d-%d は不正な page-ranges 値です。" msgid "Bad port number in URI" msgstr "URI のポート番号が不正" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "\"%s\" は無効な port-monitor です。" #, c-format msgid "Bad printer-state value %d." msgstr "%d は無効な printer-state 値です。" msgid "Bad printer-uri." msgstr "printer-uri が不正です。" #, c-format msgid "Bad request ID %d." msgstr "%d は無効なリクエストIDです。" #, c-format msgid "Bad request version number %d.%d." msgstr "バージョン番号 %d.%d は無効なリクエストです。" msgid "Bad resource in URI" msgstr "URI のリソースが不正" msgid "Bad scheme in URI" msgstr "URI のスキームが不正" msgid "Bad username in URI" msgstr "URI のユーザー名が不正" msgid "Bad value string" msgstr "値文字列がありません" msgid "Bad/empty URI" msgstr "URI が不正か空" msgid "Banners" msgstr "バナー" msgid "Bond Paper" msgstr "ボンド紙" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "論理値は、waiteof オプション \"%s\" であるべきです" msgid "Buffer overflow detected, aborting." msgstr "オーバーフローが検出され、中断しました。" msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "CPCL ラベルプリンター" msgid "Cancel Jobs" msgstr "ジョブをキャンセル" msgid "Canceling print job." msgstr "プリントジョブをキャンセルしています。" msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "リモートの Kerberos 認証のプリンターを共有できません。" msgid "Cassette" msgstr "カセット" msgid "Change Settings" msgstr "設定の変更" #, c-format msgid "Character set \"%s\" not supported." msgstr "文字セット \"%s\" はサポートされていません。" msgid "Classes" msgstr "クラス" msgid "Clean Print Heads" msgstr "プリントヘッドクリーニング" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job は job-uri 属性をサポートしていません。" msgid "Color" msgstr "カラー" msgid "Color Mode" msgstr "カラーモード" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "コマンドは短縮できます。 コマンド:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "コミュニティ名の長さが不定" msgid "Connected to printer." msgstr "プリンターに接続しました。" msgid "Connecting to printer." msgstr "プリンターに接続中。" msgid "Continue" msgstr "継続" msgid "Continuous" msgstr "連続" msgid "Control file sent successfully." msgstr "コントロールファイルが正常に送信されました。" msgid "Copying print data." msgstr "印刷データをコピーしています。" msgid "Created" msgstr "ジョブ作成" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "カスタム" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "カット" msgid "Cutter" msgstr "カッター" msgid "Dark" msgstr "濃い" msgid "Darkness" msgstr "濃さ" msgid "Data file sent successfully." msgstr "データファイルが正常に送信されました。" msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "クラスの削除" msgid "Delete Printer" msgstr "プリンターの削除" msgid "DeskJet Series" msgstr "DeskJet シリーズ" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "宛先 \"%s\" はジョブを受け付けていません。" msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "デバイス: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgid "Direct Thermal Media" msgstr "感熱紙" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "ディレクトリー \"%s\" は相対パスを含んでいます。" #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" "ディレクトリー \"%s\" は安全でないパーミッションが与えられています (0%o/uid=" "%d/gid=%d)。" #, c-format msgid "Directory \"%s\" is a file." msgstr "ディレクトリー \"%s\" はファイルです。" #, c-format msgid "Directory \"%s\" not available: %s" msgstr "ディレクトリー \"%s\" は利用できません: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" "ディレクトリー \"%s\" のパーミッションは問題ありません (0%o/uid=%d/gid=%d)。" msgid "Disabled" msgstr "無効" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "ドキュメント #%d がジョブ #%d に見つかりません。" msgid "Draft" msgstr "" msgid "Duplexer" msgstr "両面オプション" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "EPL1 ラベルプリンター" msgid "EPL2 Label Printer" msgstr "EPL2 ラベルプリンター" msgid "Edit Configuration File" msgstr "設定ファイルの編集" msgid "Encryption is not supported." msgstr "暗号化はサポートされていません。" #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "終了バナー" msgid "English" msgstr "English" 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 "" "このページにアクセスするために、あなたのユーザー名とパスワード、あるいは " "root のユーザー名とパスワードを入力してください。Kerberos 認証を使用している" "場合、有効な Kerberos チケットがあることを確認してください。" msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "封筒 #11" msgid "Envelope #12" msgstr "封筒 #12" msgid "Envelope #14" msgstr "封筒 #14" msgid "Envelope #9" msgstr "封筒 #9" msgid "Envelope B4" msgstr "封筒 B4" msgid "Envelope B5" msgstr "封筒 B5" msgid "Envelope B6" msgstr "封筒 B6" msgid "Envelope C0" msgstr "封筒 C0" msgid "Envelope C1" msgstr "封筒 C1" msgid "Envelope C2" msgstr "封筒 C2" msgid "Envelope C3" msgstr "封筒 C3" msgid "Envelope C4" msgstr "封筒 C4" msgid "Envelope C5" msgstr "封筒 C5" msgid "Envelope C6" msgstr "封筒 C6" msgid "Envelope C65" msgstr "封筒 C65" msgid "Envelope C7" msgstr "封筒 C7" msgid "Envelope Choukei 3" msgstr "封筒 長形3号" msgid "Envelope Choukei 3 Long Edge" msgstr "封筒 長形3号 長辺送り" msgid "Envelope Choukei 4" msgstr "封筒 長形4号" msgid "Envelope Choukei 4 Long Edge" msgstr "封筒 長形4号 長辺送り" msgid "Envelope DL" msgstr "封筒 DL" msgid "Envelope Feed" msgstr "封筒フィード" msgid "Envelope Invite" msgstr "招待状封筒" msgid "Envelope Italian" msgstr "イタリア封筒" msgid "Envelope Kaku2" msgstr "封筒 角2" msgid "Envelope Kaku2 Long Edge" msgstr "封筒 角2 長辺送り" msgid "Envelope Kaku3" msgstr "封筒 角3" msgid "Envelope Kaku3 Long Edge" msgstr "封筒 角3 長辺送り" msgid "Envelope Monarch" msgstr "封筒 Monarch" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "封筒 PRC1 長辺送り" msgid "Envelope PRC10" msgstr "封筒 PRC10" msgid "Envelope PRC10 Long Edge" msgstr "封筒 PRC10 長辺送り" msgid "Envelope PRC2" msgstr "封筒 PRC2" msgid "Envelope PRC2 Long Edge" msgstr "封筒 PRC2 長辺送り" msgid "Envelope PRC3" msgstr "封筒 PRC3" msgid "Envelope PRC3 Long Edge" msgstr "封筒 PRC3 長辺送り" msgid "Envelope PRC4" msgstr "封筒 PRC4" msgid "Envelope PRC4 Long Edge" msgstr "封筒 PRC4 長辺送り" msgid "Envelope PRC5 Long Edge" msgstr "封筒 PRC5 長辺送り" msgid "Envelope PRC5PRC5" msgstr "封筒 PRC5" msgid "Envelope PRC6" msgstr "封筒 PRC6" msgid "Envelope PRC6 Long Edge" msgstr "封筒 PRC6 長辺送り" msgid "Envelope PRC7" msgstr "封筒 PRC7" msgid "Envelope PRC7 Long Edge" msgstr "封筒 PRC7 長辺送り" msgid "Envelope PRC8" msgstr "封筒 PRC8" msgid "Envelope PRC8 Long Edge" msgstr "封筒 PRC8 長辺送り" msgid "Envelope PRC9" msgstr "封筒 PRC9" msgid "Envelope PRC9 Long Edge" msgstr "封筒 PRC9 長辺送り" msgid "Envelope Personal" msgstr "パーソナル封筒" msgid "Envelope You4" msgstr "封筒 洋形4号" msgid "Envelope You4 Long Edge" msgstr "封筒 洋形4号 長辺送り" msgid "Environment Variables:" msgstr "環境変数:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "エラーポリシー" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "ラスターデータの送信でエラーが起きました。" msgid "Error: need hostname after \"-h\" option." msgstr "Error: '-h' オプションのあとにはホスト名が必要です。" msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "10 ラベルごと" msgid "Every 2 Labels" msgstr "2 ラベルごと" msgid "Every 3 Labels" msgstr "3 ラベルごと" msgid "Every 4 Labels" msgstr "4 ラベルごと" msgid "Every 5 Labels" msgstr "5 ラベルごと" msgid "Every 6 Labels" msgstr "6 ラベルごと" msgid "Every 7 Labels" msgstr "7 ラベルごと" msgid "Every 8 Labels" msgstr "8 ラベルごと" msgid "Every 9 Labels" msgstr "9 ラベルごと" msgid "Every Label" msgstr "すべてのラベル" msgid "Executive" msgstr "エグゼクティブ" msgid "Expectation Failed" msgstr "予測に失敗しました" msgid "Expressions:" msgstr "式:" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "ファイル \"%s\" は相対パスを含んでいます。" #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" "ファイル \"%s\" は安全でないパーミッションが与えられています (0%o/uid=%d/gid=" "%d)。" #, c-format msgid "File \"%s\" is a directory." msgstr "ファイル \"%s\" はディレクトリーです。" #, c-format msgid "File \"%s\" not available: %s" msgstr "ファイル \"%s\" は利用できません: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "ファイル \"%s\" のパーミッションは問題ありません (0%o/uid=%d/gid=%d)。" msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "ファイルデバイス URI は無効になっています。有効にするには、\"%s/cups-files." "conf\" の FileDevice ディレクティブを参照してください。" #, c-format msgid "Finished page %d." msgstr "ページ %d を終了。" msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "フォリオ" msgid "Forbidden" msgstr "Forbidden" msgid "Found" msgstr "" msgid "General" msgstr "一般" msgid "Generic" msgstr "汎用" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU は不確定の長さを使用しています" msgid "Glossy Paper" msgstr "光沢紙" msgid "Got a printer-uri attribute but no job-id." msgstr "printer-uri 属性を取得しましたが、job-id を取得できませんでした。" msgid "Grayscale" msgstr "グレースケール" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Hanging Folder" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "ヘルプファイルが索引に含まれていません。" msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "IPP の 1setOf 属性が value タグと互換性がありません。" msgid "IPP attribute has no name." msgstr "IPP の属性に名前がありません。" msgid "IPP attribute is not a member of the message." msgstr "IPP の属性がメッセージのメンバーではありません。" msgid "IPP begCollection value not 0 bytes." msgstr "IPP の begCollection は想定された 0 バイトになっていません。" msgid "IPP boolean value not 1 byte." msgstr "IPP の真偽値が想定された 1 バイトになっていません。" msgid "IPP date value not 11 bytes." msgstr "IPP の date 値は想定された 11 バイトになっていません。" msgid "IPP endCollection value not 0 bytes." msgstr "IPP の endCollection は想定された 0 バイトになっていません。" msgid "IPP enum value not 4 bytes." msgstr "IPP の enum 値は想定された 4 バイトになっていません。" msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP の拡張タグが 0x7FFFFFFF より大きいです。" msgid "IPP integer value not 4 bytes." msgstr "IPP の整数値は想定された 4 バイトになっていません。" msgid "IPP language length overflows value." msgstr "IPP の language length の値がオーバーフローしています。" msgid "IPP language length too large." msgstr "IPP の language の長さが長すぎます。" msgid "IPP member name is not empty." msgstr "IPP のメンバー名が空ではありません。" msgid "IPP memberName value is empty." msgstr "IPP の memberName の値が空です。" msgid "IPP memberName with no attribute." msgstr "IPP の memberName に属性がありません。" msgid "IPP name larger than 32767 bytes." msgstr "IPP 名が 32767 バイトより大きいです。" msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP の nameWithLanguage が最小値 4 バイト未満です。" msgid "IPP octetString length too large." msgstr "IPP の octetString の長さが大きすぎます。" msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP の rangeOfInteger は想定された 8 バイトになっていません。" msgid "IPP resolution value not 9 bytes." msgstr "IPP の resolution は想定された 9 バイトになっていません。" msgid "IPP string length overflows value." msgstr "IPP の文字列長の値がオーバーフローしています。" msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP の textWithLanguage の値が最小値 4 バイト未満です。" msgid "IPP value larger than 32767 bytes." msgstr "IPP の値が 32767 バイト以上です。" msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "不正な制御文字" msgid "Illegal main keyword string" msgstr "不正なメインキーワード文字列" msgid "Illegal option keyword string" msgstr "不正なオプションキーワード文字列" msgid "Illegal translation string" msgstr "不正な翻訳文字列" msgid "Illegal whitespace character" msgstr "不正な空白文字" msgid "Installable Options" msgstr "インストール可能オプション" msgid "Installed" msgstr "インストールされています" msgid "IntelliBar Label Printer" msgstr "IntelliBar ラベルプリンター" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "サーバー内部エラー" msgid "Internal error" msgstr "内部エラー" msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-Part" msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-Part" msgid "Internet Printing Protocol" msgstr "インターネット印刷プロトコル" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "無効なメディア名引数です。" msgid "Invalid media size." msgstr "無効なメディアサイズです。" msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "無効なプリンターコマンドです。 \"%s\"" msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 長辺送り" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 長辺送り" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 長辺送り" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "ジョブ番号 %d を再開できません - ファイルが見つかりません。" #, c-format msgid "Job #%d does not exist." msgstr "ジョブ番号 %d は存在しません。" #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "ジョブ番号 %d はすでに中断されています - キャンセルできません。" #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "ジョブ番号 %d はすでにキャンセルされています - キャンセルできません。" #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "ジョブ番号 %d はすでに完了しています - キャンセルできません。" #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "ジョブ番号 %d はすでに終了し、変更できません。" #, c-format msgid "Job #%d is not complete." msgstr "ジョブ番号 %d は完了していません。" #, c-format msgid "Job #%d is not held for authentication." msgstr "ジョブ番号 %d は認証のために保留されていません。" #, c-format msgid "Job #%d is not held." msgstr "ジョブ番号 %d は保留されていません。" msgid "Job Completed" msgstr "ジョブ完了" msgid "Job Created" msgstr "ジョブ作成" msgid "Job Options Changed" msgstr "ジョブオプション変更" msgid "Job Stopped" msgstr "ジョブ中止" msgid "Job is completed and cannot be changed." msgstr "ジョブは完了し変更できません。" msgid "Job operation failed" msgstr "ジョブ操作失敗" msgid "Job state cannot be changed." msgstr "ジョブの状態を変更できません。" msgid "Job subscriptions cannot be renewed." msgstr "ジョブサブスクリプションを更新できません。" msgid "Jobs" msgstr "ジョブ" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR ホストまたはプリンター" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "ラベルプリンター" msgid "Label Top" msgstr "ラベルトップ" #, c-format msgid "Language \"%s\" not supported." msgstr "言語 \"%s\" はサポートされていません。" msgid "Large Address" msgstr "ラージアドレス" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Series PCL 4/5" msgid "Letter Oversize" msgstr "US レター (特大)" msgid "Letter Oversize Long Edge" msgstr "US レター (特大) 長辺送り" msgid "Light" msgstr "薄い" msgid "Line longer than the maximum allowed (255 characters)" msgstr "1 行が最大値 (255 文字) を超えています" msgid "List Available Printers" msgstr "使用可能なプリンター一覧" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "長辺給紙 (縦向き)" msgid "Looking for printer." msgstr "プリンターを探しています。" msgid "Manual Feed" msgstr "手差し" msgid "Media Size" msgstr "用紙サイズ" msgid "Media Source" msgstr "給紙" msgid "Media Tracking" msgstr "用紙の経路" msgid "Media Type" msgstr "用紙種類" msgid "Medium" msgstr "紙質" msgid "Memory allocation error" msgstr "メモリー割り当てエラー" msgid "Missing CloseGroup" msgstr "CloseGroup がありません" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "PPD-Adobe-4.x ヘッダーがありません" msgid "Missing asterisk in column 1" msgstr "1 列目にアスタリスクがありません" msgid "Missing document-number attribute." msgstr "document-number 属性がありません。" msgid "Missing form variable" msgstr "form 変数がありません。" msgid "Missing last-document attribute in request." msgstr "リクエストに last-document 属性がありません。" msgid "Missing media or media-col." msgstr "media または media-col がありません。" msgid "Missing media-size in media-col." msgstr "media-col に media-size がありません。" msgid "Missing notify-subscription-ids attribute." msgstr "notify-subscription-ids 属性がありません。" msgid "Missing option keyword" msgstr "オプションキーワードがありません" msgid "Missing requesting-user-name attribute." msgstr "requesting-user-name 属性が設定されていません。" #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "必須の属性が設定されていません。" msgid "Missing resource in URI" msgstr "URI のリソースがない" msgid "Missing scheme in URI" msgstr "URI のスキームがない" msgid "Missing value string" msgstr "値文字列がありません" msgid "Missing x-dimension in media-size." msgstr "media-size に x-dimension がありません。" msgid "Missing y-dimension in media-size." msgstr "media-size に y-dimension がありません。" #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "モデル: 名前 = %s\n" " 言語 = %s\n" " プリンタードライバー = %s\n" " デバイス ID = %s" msgid "Modifiers:" msgstr "修飾子:" msgid "Modify Class" msgstr "クラスの変更" msgid "Modify Printer" msgstr "プリンターの変更" msgid "Move All Jobs" msgstr "すべてのジョブの移動" msgid "Move Job" msgstr "ジョブの移動" msgid "Moved Permanently" msgstr "別の場所へ移動しました" msgid "NULL PPD file pointer" msgstr "PPD ファイルポインターが NULL です" msgid "Name OID uses indefinite length" msgstr "OID 名は限定的な長さを使用します" msgid "Nested classes are not allowed." msgstr "入れ子になったクラスは許可されていません。" msgid "Never" msgstr "Never" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "いいえ" msgid "No Content" msgstr "中身がありません" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "PPD の名前がありません" msgid "No VarBind SEQUENCE" msgstr "VarBind SEQUENCE がありません" msgid "No active connection" msgstr "アクティブな接続はありません" msgid "No active connection." msgstr "アクティブな接続はありません。" #, c-format msgid "No active jobs on %s." msgstr "%s にはアクティブなジョブはありません。" msgid "No attributes in request." msgstr "リクエストに属性がありません。" msgid "No authentication information provided." msgstr "認証情報が提供されていません。" msgid "No common name specified." msgstr "" msgid "No community name" msgstr "コミュニティ名がありません" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "デフォルトのプリンターはありません。" msgid "No destinations added." msgstr "追加された宛先はありません。" msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりません。" msgid "No error-index" msgstr "エラーインデックスがありません" msgid "No error-status" msgstr "エラーステータスがありません" msgid "No file in print request." msgstr "印刷リクエストにファイルがありません。" msgid "No modification time" msgstr "変更時刻がありません" msgid "No name OID" msgstr "OID 名がありません" msgid "No pages were found." msgstr " ページが見つかりません。" msgid "No printer name" msgstr "プリンター名がありません" msgid "No printer-uri found" msgstr "プリンター URI が見つかりません" msgid "No printer-uri found for class" msgstr "クラスのプリンター URI が見つかりません" msgid "No printer-uri in request." msgstr "プリンター URI のリクエストがありません。" msgid "No request URI." msgstr "リクエスト URI がありません。" msgid "No request protocol version." msgstr "リクエストプロトコルバージョンがありません。" msgid "No request sent." msgstr "リクエストが送られませんでした。" msgid "No request-id" msgstr "リクエストID がありません" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "リクエストにサブスクリプション属性がありません。" msgid "No subscriptions found." msgstr "サブスクリプションが見つかりません。" msgid "No variable-bindings SEQUENCE" msgstr "variable-bindings SEQUENCE がありません" msgid "No version number" msgstr "バージョン名がありません" msgid "Non-continuous (Mark sensing)" msgstr "非連続です (Mark sensing)" msgid "Non-continuous (Web sensing)" msgstr "非連続です (Web sensing)" msgid "None" msgstr "" msgid "Normal" msgstr "標準" msgid "Not Found" msgstr "見つかりません" msgid "Not Implemented" msgstr "実装されていません" msgid "Not Installed" msgstr "インストールされていません" msgid "Not Modified" msgstr "変更されていません" msgid "Not Supported" msgstr "サポートされていません" msgid "Not allowed to print." msgstr "印刷が許可されていません。" msgid "Note" msgstr "注意" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Off (片面)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "オンラインヘルプ" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "%s のオープンに失敗しました: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup の前にまず CloseGroup が必要です" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI の前にまず CloseUI/JCLCloseUI が必要です" msgid "Operation Policy" msgstr "操作ポリシー" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "オプション \"%s\" は %%%%IncludeFeature 経由で含めることはできません。" msgid "Options Installed" msgstr "インストールされたオプション" msgid "Options:" msgstr "オプション:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "PPD キャッシュファイルが古すぎます。" msgid "Out of memory." msgstr "メモリーが足りません。" msgid "Output Mode" msgstr "出力モード" msgid "PCL Laser Printer" msgstr "PCL レーザープリンター" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K 長辺送り" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K 長辺送り" msgid "PRC32K Oversize" msgstr "PRC32K (特大)" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K (特大) 長辺送り" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "パケットが Get-Response-PDU を含んでいません" msgid "Packet does not start with SEQUENCE" msgstr "パケットが SEQUENCE から始まりません" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "%s のパスワード (%s 上)? " msgid "Pause Class" msgstr "クラスの休止" msgid "Pause Printer" msgstr "プリンターの休止" msgid "Peel-Off" msgstr "Peel-Off" msgid "Photo" msgstr "写真" msgid "Photo Labels" msgstr "写真ラベル" msgid "Plain Paper" msgstr "普通紙" msgid "Policies" msgstr "ポリシー" msgid "Port Monitor" msgstr "ポートモニター" msgid "PostScript Printer" msgstr "PostScript プリンター" msgid "Postcard" msgstr "ハガキ" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "往復ハガキ 長辺送り" msgid "Postcard Long Edge" msgstr "ハガキ 長辺送り" msgid "Preparing to print." msgstr "印刷準備中です。" msgid "Print Density" msgstr "印刷密度" msgid "Print Job:" msgstr "ジョブの印刷:" msgid "Print Mode" msgstr "印刷モード" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "印刷レート" msgid "Print Self-Test Page" msgstr "自己テストページの印刷" msgid "Print Speed" msgstr "印刷速度" msgid "Print Test Page" msgstr "テストページの印刷" msgid "Print and Cut" msgstr "プリントしてカット" msgid "Print and Tear" msgstr "プリントして切り取る" msgid "Print file sent." msgstr "プリントファイルが送られました。" msgid "Print job canceled at printer." msgstr "印刷ジョブはプリンターでキャンセルされました。" msgid "Print job too large." msgstr "印刷ジョブが大きすぎます。" msgid "Print job was not accepted." msgstr "印刷ジョブが受け付けられませんでした。" #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "追加されたプリンター" msgid "Printer Default" msgstr "デフォルトのプリンター" msgid "Printer Deleted" msgstr "削除されたプリンター" msgid "Printer Modified" msgstr "変更されたプリンター" msgid "Printer Paused" msgstr "プリンターの休止" msgid "Printer Settings" msgstr "プリンター設定" msgid "Printer cannot print supplied content." msgstr "プリンターは受信した内容を印刷できませんでした。" msgid "Printer cannot print with supplied options." msgstr "指定されたオプションではプリンターは印刷できません。" msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "プリンター:" msgid "Printers" msgstr "プリンター" #, c-format msgid "Printing page %d, %u%% complete." msgstr "ページ %d, %u%% の印刷が完了しました。" msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "クォータの制限に達しました。" msgid "Rank Owner Job File(s) Total Size" msgstr "ランク 所有者 ジョブ ファイル 合計サイズ" msgid "Reject Jobs" msgstr "ジョブの拒否" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "リモートホストがコントロールファイルを受け付けませんでした (%d)。" #, c-format msgid "Remote host did not accept data file (%d)." msgstr "リモートホストがデータファイルを受け付けませんでした (%d)。" msgid "Reprint After Error" msgstr "エラー後の再印刷" msgid "Request Entity Too Large" msgstr "要求するエンティティが大きすぎます" msgid "Resolution" msgstr "解像度" msgid "Resume Class" msgstr "クラスを再開する" msgid "Resume Printer" msgstr "プリンターを再開する" msgid "Return Address" msgstr "返信用ラベル" msgid "Rewind" msgstr "巻き取り" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE は不定長を使用しています" msgid "SSL/TLS Negotiation Error" msgstr "SSL/TLS のネゴシエーションエラー" msgid "See Other" msgstr "残りを見てください" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "データをプリンターに送信しています。" msgid "Server Restarted" msgstr "再起動されたサーバー" msgid "Server Security Auditing" msgstr "サーバーのセキュリティー監査" msgid "Server Started" msgstr "開始されたサーバー" msgid "Server Stopped" msgstr "停止されたサーバー" msgid "Server credentials not set." msgstr "サーバー証明書が設定されていません。" msgid "Service Unavailable" msgstr "利用できないサービス" msgid "Set Allowed Users" msgstr "許可するユーザーの設定" msgid "Set As Server Default" msgstr "サーバーのデフォルトに設定" msgid "Set Class Options" msgstr "クラスオプションの設定" msgid "Set Printer Options" msgstr "プリンターオプションの設定" msgid "Set Publishing" msgstr "公開の設定" msgid "Shipping Address" msgstr "発送先ラベル" msgid "Short-Edge (Landscape)" msgstr "短辺 (横原稿)" msgid "Special Paper" msgstr "特殊紙" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "ジョブをスプール中、%.0f%% 完了しました。" msgid "Standard" msgstr "標準" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "開始バナー" #, c-format msgid "Starting page %d." msgstr "ページ %d を開始しています。" msgid "Statement" msgstr "記述" #, c-format msgid "Subscription #%d does not exist." msgstr "サブスクリプション番号 %d は存在しません。" msgid "Substitutions:" msgstr "置換:" msgid "Super A" msgstr "スーパー A" msgid "Super B" msgstr "スーパー B" msgid "Super B/A3" msgstr "スーパー B/A3" msgid "Switching Protocols" msgstr "プロトコルの変更" msgid "Tabloid" msgstr "タブロイド" msgid "Tabloid Oversize" msgstr "タブロイド (特大)" msgid "Tabloid Oversize Long Edge" msgstr "タブロイド (特大) 長辺送り" msgid "Tear" msgstr "Tear" msgid "Tear-Off" msgstr "Tear-Off" msgid "Tear-Off Adjust Position" msgstr "Tear-Off 位置調節" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "印刷ジョブに \"%s\" 属性が必要です。" #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "%s 属性は、ジョブ ID と一緒に使うことはできません。" #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "%s 操作属性は、Create-Job リクエストの中で使うことはできません。" #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "PPD ファイル \"%s\" が見つかりません。" #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "PPD ファイル \"%s\" を開けませんでした: %s" msgid "The PPD file could not be opened." msgstr "PPD ファイルを開けませんでした。" msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "クラス名は 127 文字以内の表示可能文字からなり、空白、スラッシュ (/)、ハッ" "シュ (#) を含んではなりません。" msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "notify-lease-duration 属性は、ジョブサブスクリプションと一緒に使うことはでき" "ません。" #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "notify-user-data 値が大きすぎます (%d > 63 オクテット)。" msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "プリンターの設定が正しくないかプリンターはすでに存在しません。" msgid "The printer did not respond." msgstr "プリンターが応答しません。" msgid "The printer is in use." msgstr "プリンターは使用中です。" msgid "The printer is not connected." msgstr "プリンターは接続されていません。" msgid "The printer is not responding." msgstr "プリンターが応答していません。" msgid "The printer is now connected." msgstr "プリンターが接続されました。" msgid "The printer is now online." msgstr "プリンターは現在オンラインです。" msgid "The printer is offline." msgstr "プリンターはオフラインです。" msgid "The printer is unreachable at this time." msgstr "プリンターには現在到達できません。" msgid "The printer may not exist or is unavailable at this time." 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 "" msgid "The printer or class does not exist." msgstr "プリンターまたはクラスは存在しません。" msgid "The printer or class is not shared." msgstr "プリンターまたはクラスは共有できません。" #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "printer-uri \"%s\" には、無効な文字が含まれています。" msgid "The printer-uri attribute is required." msgstr "printer-uri 属性は必須です。" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "printer-uri は、\"ipp://ホスト名/classes/クラス名\" 形式でなければなりませ" "ん。" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "printer-uri は \"ipp://ホスト名/printers/プリンター名\" 形式でなければなりま" "せん。" msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "Web インターフェイスが現在無効になっています。有効にするには \"cupsctl " "WebInterface=yes\" を実行してください。" #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "which-jobs の値 \"%s\" はサポートされていません。" msgid "There are too many subscriptions." msgstr "サブスクリプションが多すぎます。" msgid "There was an unrecoverable USB error." msgstr "回復不可能な USB のエラーが発生しています。" msgid "Thermal Transfer Media" msgstr "熱転写メディア" msgid "Too many active jobs." msgstr "アクティブなジョブが多すぎます。" #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "job-sheets 値が多すぎます (%d > 2)。" #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "printer-state-reasons 値が多すぎます (%d > %d)。" msgid "Transparency" msgstr "OHP シート" msgid "Tray" msgstr "トレイ" msgid "Tray 1" msgstr "トレイ 1" msgid "Tray 2" msgstr "トレイ 2" msgid "Tray 3" msgstr "トレイ 3" msgid "Tray 4" msgstr "トレイ 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "URI が長すぎます" msgid "URI too large" msgstr "URI が長すぎる" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US レジャー" msgid "US Legal" msgstr "US リーガル" msgid "US Legal Oversize" msgstr "US リーガル (特大)" msgid "US Letter" msgstr "US レター" msgid "US Letter Long Edge" msgstr "US レター 長辺送り" msgid "US Letter Oversize" msgstr "US レター (特大)" msgid "US Letter Oversize Long Edge" msgstr "US レター (特大) 長辺送り" msgid "US Letter Small" msgstr "US レター (小)" msgid "Unable to access cupsd.conf file" msgstr "cupsd.conf ファイルにアクセスできません" msgid "Unable to access help file." msgstr "ヘルプファイルにアクセスできません。" msgid "Unable to add class" msgstr "クラスを追加できません" msgid "Unable to add document to print job." msgstr "ドキュメントを印刷ジョブに追加できません。" #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "宛先 \"%s\"にジョブを追加できません。" msgid "Unable to add printer" msgstr "プリンターを追加できません" msgid "Unable to allocate memory for file types." msgstr "ファイルタイプ用にメモリーを割り当てられません。" msgid "Unable to allocate memory for page info" msgstr "ページ情報のメモリー割り当てができません" msgid "Unable to allocate memory for pages array" msgstr "ページアレイのメモリー割り当てができません" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "プリンターを変更できません。" msgid "Unable to change printer" msgstr "プリンターを変更できません" msgid "Unable to change printer-is-shared attribute" msgstr "printer-is-shared 属性を変更することができません" msgid "Unable to change server settings" msgstr "サーバーの設定を変更できません" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "mimeMediaType の正規表現を解釈できませんでした: %s。" #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "naturalLanguage の正規表現を解釈できませんでした: %s。" msgid "Unable to configure printer options." msgstr "プリンターオプションを設定できません。" msgid "Unable to connect to host." msgstr "ホストに接続できません。" msgid "Unable to contact printer, queuing on next printer in class." msgstr "プリンターと交信できません。クラス内の次のプリンターにキューします。" #, c-format msgid "Unable to copy PPD file - %s" msgstr "PPD ファイルをコピーできません - %s" msgid "Unable to copy PPD file." msgstr "PPD ファイルをコピーできません。" msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "printer-uri を作成できません" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "サーバー証明書を作成できません。" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "テンポラリーファイルを作成できません" msgid "Unable to delete class" msgstr "クラスを削除できません" msgid "Unable to delete printer" msgstr "プリンターを削除できません" msgid "Unable to do maintenance command" msgstr "メンテナンスコマンドを実行できません" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "1MB 以上の cupsd.conf ファイルは編集できません" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "ホストへの安全な接続が確立できません (認証パスが無効です)。" msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "ホストへの安全な接続が確立できません (認証がまだ有効ではありません)。" msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "ホストへの安全な接続が確立できません (認証が期限切れです)。" msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "ホストへの安全な接続が確立できません (ホスト名が一致しません)。" msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "ホストへの安全な接続が確立できません (応答がある前に接続が切断されました)。" msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "ホストへの安全な接続が確立できません (自己署名証明書です)。" msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "ホストへの安全な接続が確立できません (信用できない証明書です)。" msgid "Unable to establish a secure connection to host." msgstr "ホストへの安全な接続を確立できません。" #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "ジョブの宛先が見つかりません" msgid "Unable to find printer." msgstr "プリンターが見つかりません。" msgid "Unable to find server credentials." msgstr "サーバー証明書を見つけられません。" msgid "Unable to get backend exit status." msgstr "バックエンドの終了ステータスを取得できません。" msgid "Unable to get class list" msgstr "クラスリストを取得できません" msgid "Unable to get class status" msgstr "クラスの状態を取得できません。" msgid "Unable to get list of printer drivers" msgstr "プリンタードライバーのリストを取得できません" msgid "Unable to get printer attributes" msgstr "プリンター属性を取得できません" msgid "Unable to get printer list" msgstr "プリンターリストを取得できません" msgid "Unable to get printer status" msgstr "プリンターの状態を取得できません" msgid "Unable to get printer status." msgstr "プリンターの状態を取得できません。" msgid "Unable to load help index." msgstr "ヘルプの索引を読み込めません。" #, c-format msgid "Unable to locate printer \"%s\"." msgstr "プリンター \"%s\" が見つかりません。" msgid "Unable to locate printer." msgstr "プリンターが見つかりません。" msgid "Unable to modify class" msgstr "クラスを変更できません" msgid "Unable to modify printer" msgstr "プリンターを変更できません" msgid "Unable to move job" msgstr "ジョブを移動できません" msgid "Unable to move jobs" msgstr "複数のジョブを移動できません" msgid "Unable to open PPD file" msgstr "PPD ファイルを読み込むことができません" msgid "Unable to open cupsd.conf file:" msgstr "cupsd.conf ファイルを開けません:" msgid "Unable to open device file" msgstr "デバイスファイルを開けません" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "ドキュメント %d (ジョブ %d) を開けません。" msgid "Unable to open help file." msgstr "ヘルプファイルを読み込むことができません。" msgid "Unable to open print file" msgstr "印刷ファイルを開けません" msgid "Unable to open raster file" msgstr "ラスターファイルを開けません" msgid "Unable to print test page" msgstr "テストページを印刷できません" msgid "Unable to read print data." msgstr "プリントデータを読み込めません。" #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "printer-uri を解決できません。" msgid "Unable to see in file" msgstr "ファイルを読み込むことができません" msgid "Unable to send command to printer driver" msgstr "プリンタードライバーにコマンドを送信できません" msgid "Unable to send data to printer." msgstr "プリンターにデータを送信することができません。" msgid "Unable to set options" msgstr "オプションを設定できません" msgid "Unable to set server default" msgstr "サーバーをデフォルトに設定できません" msgid "Unable to start backend process." msgstr "バックエンドのプロセスを起動できません。" msgid "Unable to upload cupsd.conf file" msgstr "cupsd.conf ファイルをアップロードできません" msgid "Unable to use legacy USB class driver." msgstr "古いタイプの USB クラスドライバーは使用できません。" msgid "Unable to write print data" msgstr "プリントデータを書き込めません" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "非圧縮のプリントデータを書き込めません: %s" msgid "Unauthorized" msgstr "未許可" msgid "Units" msgstr "ユニット" msgid "Unknown" msgstr "未知" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "\"%s\" (オプション \"%s\" 用) は未知の設定です。" #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "\"%s\" は未知の暗号オプション値です。" #, c-format msgid "Unknown file order: \"%s\"." msgstr "\"%s\" は未知のファイルオーダーです。" #, c-format msgid "Unknown format character: \"%c\"." msgstr "\"%c\" は未知の書式文字です。" msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "未知のメディアサイズ名称です。" #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "\"%s\" (値 \"%s\") は未知のオプションです。" #, c-format msgid "Unknown option \"%s\"." msgstr "\"%s\" は未知のオプションです。" #, c-format msgid "Unknown print mode: \"%s\"." msgstr "\"%s\" は未知のプリントモードです。" #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "\"%s\" は未知の printer-error-policy です。" #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "\"%s\" は未知の printer-op-policy です。" msgid "Unknown request method." msgstr "未知のリクエスト方法です。" msgid "Unknown request version." msgstr "未知のリクエストバージョンです。" msgid "Unknown scheme in URI" msgstr "URI に未知のスキーマがあります" msgid "Unknown service name." msgstr "未知のサービス名です。" #, c-format msgid "Unknown version option value: \"%s\"." msgstr "\"%s\" は未知のバージョンオプション値です。" #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "\"%s\" はサポートされていない 'compression' の値です。" #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "\"%s\" はサポートされていない 'document-format' の値です。" msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "サポートされていない 'job-name' の値です。" #, c-format msgid "Unsupported character set \"%s\"." msgstr "\"%s\" はサポートされていない文字セットです。" #, c-format msgid "Unsupported compression \"%s\"." msgstr "\"%s\" はサポートされていない圧縮形式です。" #, c-format msgid "Unsupported document-format \"%s\"." msgstr "\"%s\" はサポートされていない文書形式です。" #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "\"%s/%s\" はサポートされていない文書形式です。" #, c-format msgid "Unsupported format \"%s\"." msgstr "\"%s\" はサポートされていない形式です。" msgid "Unsupported margins." msgstr "サポートされていないマージンです。" msgid "Unsupported media value." msgstr "サポートされていないメディアの値です。" #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "%d はサポートされていない number-up 値です。number-up=1 を使用します。" #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "%s はサポートされていない number-up-layout 値です。number-up-layout=lrtb を使" "用します。" #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" "%s はサポートされていない page-border 値です。page-border=none を使用します。" msgid "Unsupported raster data." msgstr "サポートされていないラスターデータです。" msgid "Unsupported value type" msgstr "サポートされていない型の値です" msgid "Upgrade Required" msgstr "アップグレードが必要です" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Usage: cupsctl [オプション] [パラメータ=値 ... パラメータN=値N]" msgid "Usage: cupsd [options]" msgstr "使い方: cupsd [オプション]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "使い方: cupsfilter [ オプション ] [ -- ] ファイル名" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "使い方: ippfind [オプション] 登録タイプ[,サブタイプ][.ドメイン.] ... [式]\n" " ippfind [オプション] 名前[.登録タイプ[.ドメイン.]] ... [式]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "使い方: ipptool [オプション] URI ファイル名 [ ... ファイル名N ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "使い方: ppdc [オプション] ファイル名.drv [ ... ファイル名N.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "使い方: ppdhtml [オプション] ファイル名.drv >ファイル名.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "使い方: ppdi [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "使い方: ppdmerge [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "使い方: ppdpo [オプション] -o ファイル名.po ファイル名.drv [ ... ファイル名N." "drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "使い方: snmp [ホスト名またはIPアドレス]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "値は不定長です" msgid "VarBind uses indefinite length" msgstr "VarBind は不定長です" msgid "Version uses indefinite length" msgstr "Version は不定長です" msgid "Waiting for job to complete." msgstr "ジョブが完了するのを待っています。" msgid "Waiting for printer to become available." msgstr "プリンターが使用可能になるのを待っています。" msgid "Waiting for printer to finish." msgstr "プリンターが終了するのを待っています。" msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "Web インターフェイスが無効になっています" msgid "Yes" msgstr "はい" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "" "このページには URL https://%s:%d%s を使ってアクセスする必要があります。" msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "ZPL ラベルプリンター" msgid "Zebra" msgstr "ゼブラ" msgid "aborted" msgstr "停止" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "キャンセル" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "完了" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "cups-deviced の実行に失敗しました。" msgid "cups-driverd failed to execute." msgstr "cups-driverd の実行に失敗しました。" #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: サーバーに接続できません: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: \"%s\" は未知のオプションです。" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: \"-%c\"は未知のオプションです。" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: \"-c\" オプションのあとには設定ファイル名が必要です。" msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" "cupsd: cups-files.conf ファイル名は \"-s\" オプションの後ろにあるべきです。" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" "cupsd: オンデマンドサポート有効でコンパイルされていません、標準モードで動作し" "ます。" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: 相対パスでの cups-files.conf の指定はできません。" msgid "cupsd: Unable to get current directory." msgstr "cupsd: カレントディレクトリーを取得できません。" msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: cups-files.conf ファイルへのパスが取得できません。" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: \"%s\" は未知の引数です - 停止します。" #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: \"%c\" は未知のオプションです - 停止します。" #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: 不正な文書番号 %d です。" #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: 不正なジョブID %d です。" msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: 1 つのファイル名のみを指定できます。" #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: ジョブ・ファイルを取得できません - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: -q オプションは -v オプションと両立できません。" msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: -v オプションは -q オプションと両立できません。" #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "%s/%s のデバイス: %s" #, c-format msgid "device for %s: %s" msgstr "%s のデバイス: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index は不定長です" msgid "error-status uses indefinite length" msgstr "error-status は不定長です" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "保留" msgid "help\t\tGet help on commands." msgstr "help\t\tコマンドのヘルプを取得。" msgid "idle" msgstr "待機中" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: 不正な正規表現です: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: --and は --or のあとに指定することはできません。" #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: %s のあとにはキー名が必要です。" #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: %s のあとにはポート範囲が必要です。" #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: %s のあとにはプログラム名が必要です。" #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: %s のあとにはセミコロンが必要です。" msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: 置換文字列の閉じカッコがありません。" msgid "ippfind: Missing close parenthesis." msgstr "ippfind: 閉じカッコが不足しています。" msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: \"--and\" の前には式が必要です。" msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: \"--or\" の前には式が必要です。" #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: %s のあとにはキー名が必要です。" #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "ippfind: 開きカッコが足りません。" #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: %s のあとにはプログラム名が必要です。" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: %s のあとには正規表現が必要です。" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: %s のあとにはセミコロンが必要です。" msgid "ippfind: Out of memory." msgstr "ippfind: メモリ不足です。" msgid "ippfind: Too many parenthesis." msgstr "ippfind: カッコが多すぎます。" #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: %s をブラウズできないか名前解決できません。" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: \"%s\" を実行できません: %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: Bonjour を利用できません: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: \"{%s}\" は不明な変数です。" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" "ipptool: \"-i\" および \"-n\" は \"-P\"、\"-X\" と一緒に指定できません。" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: \"-i\" に不正な秒数が指定されました。" msgid "ipptool: May only specify a single URI." msgstr "ipptool: URI は 1 つだけ指定できます。" msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: \"-n\" に回数の指定がありません。" msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: \"-f\" にファイル名の指定がありません。" msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: \"-d\" に 名前=値 の指定がありません。" msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: \"-i\" に秒数の指定がありません。" msgid "ipptool: URI required before test file." msgstr "ipptool: テストファイルの前に URI の指定が必要です。" #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "job-printer-uri 属性がありません。" #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: クラス名は表示可能文字のみで構成されなければなりません。" #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" "lpadmin: \"-u\" オプションのあとには allow/deny:ユーザーリスト が必要です。" msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: \"-r\" オプションのあとにはクラス名が必要です。" msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: \"-c\" オプションのあとにはクラス名が必要です。" msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: \"-D\" オプションのあとには説明が必要です。" msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: \"-v\" オプションのあとにはデバイス URI が必要です。" msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: \"-I\" オプションのあとにはファイル形式が必要です。" msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: \"-h\" オプションのあとにはホスト名が必要です。" msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: \"-L\" オプションのあとには場所が必要です。" msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: \"-m\" オプションのあとにはモデル名が必要です。" msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: \"-R\" オプションのあとには名前が必要です。" msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: \"-o\" オプションのあとには 変数名=値 が必要です。" msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: \"-p\" オプションのあとにはプリンター名が必要です。" msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: \"-d\" オプションのあとにはプリンター名が必要です。" msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "" "lpadmin: \"-x\" オプションのあとにはプリンター名またはクラス名が必要です。" msgid "lpadmin: No member names were seen." msgstr "lpadmin: メンバー名が見当たりません。" #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: プリンター %s はすでにクラス %s のメンバーです。" #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: プリンター %s はクラス %s のメンバーではありません。" msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: プリンター名には表示可能文字だけが使用できます。" msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: クラスにプリンターを追加できません:\n" " 先にプリンター名を指定する必要があります。" #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: サーバーに接続できません: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: テンポラリーファイルを作成できません" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: プリンター・オプションを削除できません:\n" " 先にプリンター名を指定する必要があります。" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: クラスからプリンターを削除できません:\n" " 先にプリンター名を指定する必要があります。" msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: プリンター・オプションを設定できません:\n" " 先にプリンター名を指定する必要があります。" #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin:\"%s\" は未知の allow/deny オプションです。" #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: \"%s\" は未知の引数です。" #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: \"%c\" は未知のオプションです。" msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: 警告 - コンテンツタイプリストは無視されます。" msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" "lpinfo: \"--device-id\" のあとには、1284 デバイス ID を指定する必要がありま" "す。" msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: \"--language\" のあとには、言語を指定する必要があります。" msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" "lpinfo: \"--make-and-model\" のあとには、メーカーとモデルを指定する必要があり" "ます。" msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: \"--product\" のあとには、製品名を指定する必要があります。" msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" "lpinfo: \"--exclude-schemes\" のあとには、スキーマ・リストを指定する必要があ" "ります。" msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" "lpinfo: \"--include-schemes\" のあとには、スキーマ・リストを指定する必要があ" "ります。" msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" "lpinfo: \"--timeout\" のあとには、タイムアウト値を指定する必要があります。" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: サーバーに接続できません: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: 未知の引数 \"%s\"。" msgid "lpoptions: No printers." msgstr "lpoptions: プリンターがありません。" #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: %s の PPD ファイルを取得できません: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: %s の PPD ファイルを開けません。" msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: 未知のプリンターまたはクラスです。" #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: エラー - 環境変数 %s が、存在しない宛先 \"%s\" を指しています。" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "クラス %s のメンバー:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "エントリーがありません" msgid "no system default destination" msgstr "システムのデフォルトの宛先がありません" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "notify-events が指定されていません。" #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "notify-recipient-uri URI \"%s\" はすでに使われています。" #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "notify-recipient-uri URI \"%s\" には未知のスキームが使われています。" #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "プリンター待ち" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: ディレクトリー \"%s\" を追加しています。" #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: %s から UI テキストを追加または更新しています。" #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: 不正な boolean 値 (%s) があります。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "不正なフォント属性: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: 不正な resolution 名 \"%s\" があります。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: 不正な status キーワード %s があります。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc: 不正な数値置換 ($%c) があります。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" "ppdc: %d 行目、ファイル名 %s で、Option がないのに Choice が見つかりました。" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "" "ppdc: locale %s に対して #po が二重に定義されています。%d 行目、ファイル名 " "%s。" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s においてフィルター定義が必要です。" #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s においてプログラム名が必要です。" #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において boolean 値が必要です。" #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Font のあとに charset が必要です。" #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において choice code が必要です。" #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において choice name/text が必要です。" #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ColorModel に対する color order が必要" "です。" #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ColorModel に対する colorspace が必要で" "す。" #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ColorModel に対する compression が必要" "です。" #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において UIConstraints に対する constraint が必" "要です。" #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において DriverType のあとに driver type " "keyword が必要です。" #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Duplex のあとに type が必要です。" #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Font のあとに encoding が必要です。" #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "ppdc: #po %s のあとにファイル名が必要です (%d 行目, ファイル %s)。" #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において group name/text が必要です。" #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において include ファイル名 が必要です。" #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において整数指定が必要です。" #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において #po のあとに locale が必要です。" #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: %s のあとに name が必要です。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において FileName のあとに name が必要です。" #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において Font のあとに name が必要です。" #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Manufacturer のあとに name が必要です。" #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において MediaSize のあとに name が必要です。" #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ModelName のあとに name が必要です。" #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において PCFileName のあとに name が必要です。" #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: %s のあとに name/text が必要です。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Installable のあとに name/text が必要で" "す。" #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Resolution のあとに name/text が必要で" "す。" #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ColorModel に対する name/text が必要で" "す。" #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において option name/text が必要です。" #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において option section が必要です。" #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において option type が必要です。" #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Resolution のあとに override field が必" "要です。" #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "%d 行: %s には引用符で囲まれた文字列が必要です。" #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において実数が必要です。" #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において ColorProfile に続いて resolution/" "mediatype が必要です。" #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において SimpleColorProfile に続いて resolution/" "mediatype が必要です。" #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: %s のあとに selector が必要です。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Font のあとに status が必要です。" #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Copyright のあとに文字列が必要です。" #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Version のあとに文字列が必要です。" #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において 2 つのオプション名が必要です。" #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: %s のあとに value が必要です。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Font のあとに version が必要です。" #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: 無効な #include/#po ファイル名です \"%s\"。" #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な cost がありま" "す。" #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の MIME タイプ" "があります。" #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s においてフィルターに対するプログラム名が空であり" "無効です。" #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "" "ppdc: 無効な option section があります \"%s\"。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: 無効な option type があります \"%s\"。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: ドライバー情報ファイル \"%s\" を読み込んでいます。" #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: ロケール \"%s\" のメッセージを読み込んでいます。" #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: \"%s\" からメッセージを読み込んでいます。" #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: \"%s\" の最後に #endif が見つかりません。" #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において #if が見つかりません。" #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "%d 行: %s の翻訳文字列の前に msgid 行が必要です。" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: ロケール %s に対するメッセージカタログが見つかりません。" #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" "ppdc: オプション %s が行 %d、ファイル %s の 2 つの異なるグループで定義されて" "います。" #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" "ppdc: オプション %s は異なる型で再定義されています。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" "ppdc: %d 行目、ファイル名 %s において Option constraint は *name で指定しなけ" "ればなりません。" #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: %d 行目、ファイル名 %s において #if のネストが多すぎます。" #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: PPD ファイル \"%s\" を作成できません - %s。" #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: 出力ディレクトリー \"%s\" を作成できません - %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: 出力パイプを作成できません: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: cupstestppd を実行できません: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: #po ファイル %s が見つかりません。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" "ppdc: インクルードファイル %s が見つかりません。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: \"%s\" に対する地域化情報が見つかりません - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: \"%s\" に対するローカライズファイルを読み込めません - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: %s を開けません: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: 変数 (%s) は未定義です。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "%d 行: %s は予期せぬテキストです。" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: %s は未知のドライバータイプです。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: \"%s\" は未知の両面タイプです。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: \"%s\" は未知の用紙サイズです。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "\"%s\" は未知のメッセージカタログの書式です。" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: 未知のトークン \"%s\" があります。%d 行目、ファイル名 %s。" #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "ppdc: 実数 \"%s\" に未知の終了文字があります。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" "ppdc: %c で始まる文字に対して終端文字がありません。%d 行目、ファイル名 %s。" #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: 警告 - ファイル名 \"%s\" が重複しています。" #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: %s を書き込んでいます。" #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: ディレクトリー \"%s\" に PPD ファイルを書き込んでいます。" #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: 不正な LanguageVersion \"%s\" が %s にあります。" #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: PPD ファイル %s を無視します。" #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: %s を %s にバックアップできません - %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "プリンター %s は %s から無効です -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "プリンター %s は待機中です。%s 以来有効です" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "プリンター %s は %s-%d を印刷しています。%s 以来有効です" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "プリンター %s/%s は %s から無効です -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "プリンター %s/%s は待機中です。%s 以来有効です" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "プリンター %s/%s は現在 %s-%d を印刷中です。%s 以来有効です" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "処理中" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "リクエスト ID は %s-%d です (%d 個のファイル)" msgid "request-id uses indefinite length" msgstr "リクエスト ID の長さが不定" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "スケジューラーは動作していません" msgid "scheduler is running" msgstr "スケジューラーは動作中です" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "%s の状態取得に失敗しました: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tデーモンとキューの状態を表示。" #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "停止" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "システムのデフォルトの宛先: %s" #, c-format msgid "system default destination: %s/%s" msgstr "システムのデフォルトの宛先: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "未知" msgid "untitled" msgstr "タイトルなし" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings の長さが不定" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "" #~ "プリンタードライバーをエクスポートするには Samba のパスワードが必要です。" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "プリンタードライバーをエクスポートするには、Samba のユーザー名が必要です。" #~ msgid "Export Printers to Samba" #~ msgstr "Samba へプリンターをエクスポート" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: Listen あるいは Port を直接設定できません。" #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: PPD ファイル \"%s\" を開けません - %s" cups-2.3.1/locale/ipp-strings.c000664 000765 000024 00000474640 13574721672 016500 0ustar00mikestaff000000 000000 /* TRANSLATORS: Accuracy Units */ _("accuracy-units"); /* TRANSLATORS: Millimeters */ _("accuracy-units.mm"); /* TRANSLATORS: Nanometers */ _("accuracy-units.nm"); /* TRANSLATORS: Micrometers */ _("accuracy-units.um"); /* TRANSLATORS: Bale Output */ _("baling"); /* TRANSLATORS: Bale Using */ _("baling-type"); /* TRANSLATORS: Band */ _("baling-type.band"); /* TRANSLATORS: Shrink Wrap */ _("baling-type.shrink-wrap"); /* TRANSLATORS: Wrap */ _("baling-type.wrap"); /* TRANSLATORS: Bale After */ _("baling-when"); /* TRANSLATORS: Job */ _("baling-when.after-job"); /* TRANSLATORS: Sets */ _("baling-when.after-sets"); /* TRANSLATORS: Bind Output */ _("binding"); /* TRANSLATORS: Bind Edge */ _("binding-reference-edge"); /* TRANSLATORS: Bottom */ _("binding-reference-edge.bottom"); /* TRANSLATORS: Left */ _("binding-reference-edge.left"); /* TRANSLATORS: Right */ _("binding-reference-edge.right"); /* TRANSLATORS: Top */ _("binding-reference-edge.top"); /* TRANSLATORS: Binder Type */ _("binding-type"); /* TRANSLATORS: Adhesive */ _("binding-type.adhesive"); /* TRANSLATORS: Comb */ _("binding-type.comb"); /* TRANSLATORS: Flat */ _("binding-type.flat"); /* TRANSLATORS: Padding */ _("binding-type.padding"); /* TRANSLATORS: Perfect */ _("binding-type.perfect"); /* TRANSLATORS: Spiral */ _("binding-type.spiral"); /* TRANSLATORS: Tape */ _("binding-type.tape"); /* TRANSLATORS: Velo */ _("binding-type.velo"); /* TRANSLATORS: Chamber Humidity */ _("chamber-humidity"); /* TRANSLATORS: Chamber Temperature */ _("chamber-temperature"); /* TRANSLATORS: Print Job Cost */ _("charge-info-message"); /* TRANSLATORS: Coat Sheets */ _("coating"); /* TRANSLATORS: Add Coating To */ _("coating-sides"); /* TRANSLATORS: Back */ _("coating-sides.back"); /* TRANSLATORS: Front and Back */ _("coating-sides.both"); /* TRANSLATORS: Front */ _("coating-sides.front"); /* TRANSLATORS: Type of Coating */ _("coating-type"); /* TRANSLATORS: Archival */ _("coating-type.archival"); /* TRANSLATORS: Archival Glossy */ _("coating-type.archival-glossy"); /* TRANSLATORS: Archival Matte */ _("coating-type.archival-matte"); /* TRANSLATORS: Archival Semi Gloss */ _("coating-type.archival-semi-gloss"); /* TRANSLATORS: Glossy */ _("coating-type.glossy"); /* TRANSLATORS: High Gloss */ _("coating-type.high-gloss"); /* TRANSLATORS: Matte */ _("coating-type.matte"); /* TRANSLATORS: Semi-gloss */ _("coating-type.semi-gloss"); /* TRANSLATORS: Silicone */ _("coating-type.silicone"); /* TRANSLATORS: Translucent */ _("coating-type.translucent"); /* TRANSLATORS: Print Confirmation Sheet */ _("confirmation-sheet-print"); /* TRANSLATORS: Copies */ _("copies"); /* TRANSLATORS: Back Cover */ _("cover-back"); /* TRANSLATORS: Front Cover */ _("cover-front"); /* TRANSLATORS: Cover Sheet Info */ _("cover-sheet-info"); /* TRANSLATORS: Date Time */ _("cover-sheet-info-supported.date-time"); /* TRANSLATORS: From Name */ _("cover-sheet-info-supported.from-name"); /* TRANSLATORS: Logo */ _("cover-sheet-info-supported.logo"); /* TRANSLATORS: Message */ _("cover-sheet-info-supported.message"); /* TRANSLATORS: Organization */ _("cover-sheet-info-supported.organization"); /* TRANSLATORS: Subject */ _("cover-sheet-info-supported.subject"); /* TRANSLATORS: To Name */ _("cover-sheet-info-supported.to-name"); /* TRANSLATORS: Printed Cover */ _("cover-type"); /* TRANSLATORS: No Cover */ _("cover-type.no-cover"); /* TRANSLATORS: Back Only */ _("cover-type.print-back"); /* TRANSLATORS: Front and Back */ _("cover-type.print-both"); /* TRANSLATORS: Front Only */ _("cover-type.print-front"); /* TRANSLATORS: None */ _("cover-type.print-none"); /* TRANSLATORS: Cover Output */ _("covering"); /* TRANSLATORS: Add Cover */ _("covering-name"); /* TRANSLATORS: Plain */ _("covering-name.plain"); /* TRANSLATORS: Pre-cut */ _("covering-name.pre-cut"); /* TRANSLATORS: Pre-printed */ _("covering-name.pre-printed"); /* TRANSLATORS: Detailed Status Message */ _("detailed-status-message"); /* TRANSLATORS: Copies */ _("document-copies"); /* TRANSLATORS: Document Privacy Attributes */ _("document-privacy-attributes"); /* TRANSLATORS: All */ _("document-privacy-attributes.all"); /* TRANSLATORS: Default */ _("document-privacy-attributes.default"); /* TRANSLATORS: Document Description */ _("document-privacy-attributes.document-description"); /* TRANSLATORS: Document Template */ _("document-privacy-attributes.document-template"); /* TRANSLATORS: None */ _("document-privacy-attributes.none"); /* TRANSLATORS: Document Privacy Scope */ _("document-privacy-scope"); /* TRANSLATORS: All */ _("document-privacy-scope.all"); /* TRANSLATORS: Default */ _("document-privacy-scope.default"); /* TRANSLATORS: None */ _("document-privacy-scope.none"); /* TRANSLATORS: Owner */ _("document-privacy-scope.owner"); /* TRANSLATORS: Document State */ _("document-state"); /* TRANSLATORS: Detailed Document State */ _("document-state-reasons"); /* TRANSLATORS: Aborted By System */ _("document-state-reasons.aborted-by-system"); /* TRANSLATORS: Canceled At Device */ _("document-state-reasons.canceled-at-device"); /* TRANSLATORS: Canceled By Operator */ _("document-state-reasons.canceled-by-operator"); /* TRANSLATORS: Canceled By User */ _("document-state-reasons.canceled-by-user"); /* TRANSLATORS: Completed Successfully */ _("document-state-reasons.completed-successfully"); /* TRANSLATORS: Completed With Errors */ _("document-state-reasons.completed-with-errors"); /* TRANSLATORS: Completed With Warnings */ _("document-state-reasons.completed-with-warnings"); /* TRANSLATORS: Compression Error */ _("document-state-reasons.compression-error"); /* TRANSLATORS: Data Insufficient */ _("document-state-reasons.data-insufficient"); /* TRANSLATORS: Digital Signature Did Not Verify */ _("document-state-reasons.digital-signature-did-not-verify"); /* TRANSLATORS: Digital Signature Type Not Supported */ _("document-state-reasons.digital-signature-type-not-supported"); /* TRANSLATORS: Digital Signature Wait */ _("document-state-reasons.digital-signature-wait"); /* TRANSLATORS: Document Access Error */ _("document-state-reasons.document-access-error"); /* TRANSLATORS: Document Fetchable */ _("document-state-reasons.document-fetchable"); /* TRANSLATORS: Document Format Error */ _("document-state-reasons.document-format-error"); /* TRANSLATORS: Document Password Error */ _("document-state-reasons.document-password-error"); /* TRANSLATORS: Document Permission Error */ _("document-state-reasons.document-permission-error"); /* TRANSLATORS: Document Security Error */ _("document-state-reasons.document-security-error"); /* TRANSLATORS: Document Unprintable Error */ _("document-state-reasons.document-unprintable-error"); /* TRANSLATORS: Errors Detected */ _("document-state-reasons.errors-detected"); /* TRANSLATORS: Incoming */ _("document-state-reasons.incoming"); /* TRANSLATORS: Interpreting */ _("document-state-reasons.interpreting"); /* TRANSLATORS: None */ _("document-state-reasons.none"); /* TRANSLATORS: Outgoing */ _("document-state-reasons.outgoing"); /* TRANSLATORS: Printing */ _("document-state-reasons.printing"); /* TRANSLATORS: Processing To Stop Point */ _("document-state-reasons.processing-to-stop-point"); /* TRANSLATORS: Queued */ _("document-state-reasons.queued"); /* TRANSLATORS: Queued For Marker */ _("document-state-reasons.queued-for-marker"); /* TRANSLATORS: Queued In Device */ _("document-state-reasons.queued-in-device"); /* TRANSLATORS: Resources Are Not Ready */ _("document-state-reasons.resources-are-not-ready"); /* TRANSLATORS: Resources Are Not Supported */ _("document-state-reasons.resources-are-not-supported"); /* TRANSLATORS: Submission Interrupted */ _("document-state-reasons.submission-interrupted"); /* TRANSLATORS: Transforming */ _("document-state-reasons.transforming"); /* TRANSLATORS: Unsupported Compression */ _("document-state-reasons.unsupported-compression"); /* TRANSLATORS: Unsupported Document Format */ _("document-state-reasons.unsupported-document-format"); /* TRANSLATORS: Warnings Detected */ _("document-state-reasons.warnings-detected"); /* TRANSLATORS: Pending */ _("document-state.3"); /* TRANSLATORS: Processing */ _("document-state.5"); /* TRANSLATORS: Stopped */ _("document-state.6"); /* TRANSLATORS: Canceled */ _("document-state.7"); /* TRANSLATORS: Aborted */ _("document-state.8"); /* TRANSLATORS: Completed */ _("document-state.9"); /* TRANSLATORS: Feed Orientation */ _("feed-orientation"); /* TRANSLATORS: Long Edge First */ _("feed-orientation.long-edge-first"); /* TRANSLATORS: Short Edge First */ _("feed-orientation.short-edge-first"); /* TRANSLATORS: Fetch Status Code */ _("fetch-status-code"); /* TRANSLATORS: Finishing Template */ _("finishing-template"); /* TRANSLATORS: Bale */ _("finishing-template.bale"); /* TRANSLATORS: Bind */ _("finishing-template.bind"); /* TRANSLATORS: Bind Bottom */ _("finishing-template.bind-bottom"); /* TRANSLATORS: Bind Left */ _("finishing-template.bind-left"); /* TRANSLATORS: Bind Right */ _("finishing-template.bind-right"); /* TRANSLATORS: Bind Top */ _("finishing-template.bind-top"); /* TRANSLATORS: Booklet Maker */ _("finishing-template.booklet-maker"); /* TRANSLATORS: Coat */ _("finishing-template.coat"); /* TRANSLATORS: Cover */ _("finishing-template.cover"); /* TRANSLATORS: Edge Stitch */ _("finishing-template.edge-stitch"); /* TRANSLATORS: Edge Stitch Bottom */ _("finishing-template.edge-stitch-bottom"); /* TRANSLATORS: Edge Stitch Left */ _("finishing-template.edge-stitch-left"); /* TRANSLATORS: Edge Stitch Right */ _("finishing-template.edge-stitch-right"); /* TRANSLATORS: Edge Stitch Top */ _("finishing-template.edge-stitch-top"); /* TRANSLATORS: Fold */ _("finishing-template.fold"); /* TRANSLATORS: Accordion Fold */ _("finishing-template.fold-accordion"); /* TRANSLATORS: Double Gate Fold */ _("finishing-template.fold-double-gate"); /* TRANSLATORS: Engineering Z Fold */ _("finishing-template.fold-engineering-z"); /* TRANSLATORS: Gate Fold */ _("finishing-template.fold-gate"); /* TRANSLATORS: Half Fold */ _("finishing-template.fold-half"); /* TRANSLATORS: Half Z Fold */ _("finishing-template.fold-half-z"); /* TRANSLATORS: Left Gate Fold */ _("finishing-template.fold-left-gate"); /* TRANSLATORS: Letter Fold */ _("finishing-template.fold-letter"); /* TRANSLATORS: Parallel Fold */ _("finishing-template.fold-parallel"); /* TRANSLATORS: Poster Fold */ _("finishing-template.fold-poster"); /* TRANSLATORS: Right Gate Fold */ _("finishing-template.fold-right-gate"); /* TRANSLATORS: Z Fold */ _("finishing-template.fold-z"); /* TRANSLATORS: JDF F10-1 */ _("finishing-template.jdf-f10-1"); /* TRANSLATORS: JDF F10-2 */ _("finishing-template.jdf-f10-2"); /* TRANSLATORS: JDF F10-3 */ _("finishing-template.jdf-f10-3"); /* TRANSLATORS: JDF F12-1 */ _("finishing-template.jdf-f12-1"); /* TRANSLATORS: JDF F12-10 */ _("finishing-template.jdf-f12-10"); /* TRANSLATORS: JDF F12-11 */ _("finishing-template.jdf-f12-11"); /* TRANSLATORS: JDF F12-12 */ _("finishing-template.jdf-f12-12"); /* TRANSLATORS: JDF F12-13 */ _("finishing-template.jdf-f12-13"); /* TRANSLATORS: JDF F12-14 */ _("finishing-template.jdf-f12-14"); /* TRANSLATORS: JDF F12-2 */ _("finishing-template.jdf-f12-2"); /* TRANSLATORS: JDF F12-3 */ _("finishing-template.jdf-f12-3"); /* TRANSLATORS: JDF F12-4 */ _("finishing-template.jdf-f12-4"); /* TRANSLATORS: JDF F12-5 */ _("finishing-template.jdf-f12-5"); /* TRANSLATORS: JDF F12-6 */ _("finishing-template.jdf-f12-6"); /* TRANSLATORS: JDF F12-7 */ _("finishing-template.jdf-f12-7"); /* TRANSLATORS: JDF F12-8 */ _("finishing-template.jdf-f12-8"); /* TRANSLATORS: JDF F12-9 */ _("finishing-template.jdf-f12-9"); /* TRANSLATORS: JDF F14-1 */ _("finishing-template.jdf-f14-1"); /* TRANSLATORS: JDF F16-1 */ _("finishing-template.jdf-f16-1"); /* TRANSLATORS: JDF F16-10 */ _("finishing-template.jdf-f16-10"); /* TRANSLATORS: JDF F16-11 */ _("finishing-template.jdf-f16-11"); /* TRANSLATORS: JDF F16-12 */ _("finishing-template.jdf-f16-12"); /* TRANSLATORS: JDF F16-13 */ _("finishing-template.jdf-f16-13"); /* TRANSLATORS: JDF F16-14 */ _("finishing-template.jdf-f16-14"); /* TRANSLATORS: JDF F16-2 */ _("finishing-template.jdf-f16-2"); /* TRANSLATORS: JDF F16-3 */ _("finishing-template.jdf-f16-3"); /* TRANSLATORS: JDF F16-4 */ _("finishing-template.jdf-f16-4"); /* TRANSLATORS: JDF F16-5 */ _("finishing-template.jdf-f16-5"); /* TRANSLATORS: JDF F16-6 */ _("finishing-template.jdf-f16-6"); /* TRANSLATORS: JDF F16-7 */ _("finishing-template.jdf-f16-7"); /* TRANSLATORS: JDF F16-8 */ _("finishing-template.jdf-f16-8"); /* TRANSLATORS: JDF F16-9 */ _("finishing-template.jdf-f16-9"); /* TRANSLATORS: JDF F18-1 */ _("finishing-template.jdf-f18-1"); /* TRANSLATORS: JDF F18-2 */ _("finishing-template.jdf-f18-2"); /* TRANSLATORS: JDF F18-3 */ _("finishing-template.jdf-f18-3"); /* TRANSLATORS: JDF F18-4 */ _("finishing-template.jdf-f18-4"); /* TRANSLATORS: JDF F18-5 */ _("finishing-template.jdf-f18-5"); /* TRANSLATORS: JDF F18-6 */ _("finishing-template.jdf-f18-6"); /* TRANSLATORS: JDF F18-7 */ _("finishing-template.jdf-f18-7"); /* TRANSLATORS: JDF F18-8 */ _("finishing-template.jdf-f18-8"); /* TRANSLATORS: JDF F18-9 */ _("finishing-template.jdf-f18-9"); /* TRANSLATORS: JDF F2-1 */ _("finishing-template.jdf-f2-1"); /* TRANSLATORS: JDF F20-1 */ _("finishing-template.jdf-f20-1"); /* TRANSLATORS: JDF F20-2 */ _("finishing-template.jdf-f20-2"); /* TRANSLATORS: JDF F24-1 */ _("finishing-template.jdf-f24-1"); /* TRANSLATORS: JDF F24-10 */ _("finishing-template.jdf-f24-10"); /* TRANSLATORS: JDF F24-11 */ _("finishing-template.jdf-f24-11"); /* TRANSLATORS: JDF F24-2 */ _("finishing-template.jdf-f24-2"); /* TRANSLATORS: JDF F24-3 */ _("finishing-template.jdf-f24-3"); /* TRANSLATORS: JDF F24-4 */ _("finishing-template.jdf-f24-4"); /* TRANSLATORS: JDF F24-5 */ _("finishing-template.jdf-f24-5"); /* TRANSLATORS: JDF F24-6 */ _("finishing-template.jdf-f24-6"); /* TRANSLATORS: JDF F24-7 */ _("finishing-template.jdf-f24-7"); /* TRANSLATORS: JDF F24-8 */ _("finishing-template.jdf-f24-8"); /* TRANSLATORS: JDF F24-9 */ _("finishing-template.jdf-f24-9"); /* TRANSLATORS: JDF F28-1 */ _("finishing-template.jdf-f28-1"); /* TRANSLATORS: JDF F32-1 */ _("finishing-template.jdf-f32-1"); /* TRANSLATORS: JDF F32-2 */ _("finishing-template.jdf-f32-2"); /* TRANSLATORS: JDF F32-3 */ _("finishing-template.jdf-f32-3"); /* TRANSLATORS: JDF F32-4 */ _("finishing-template.jdf-f32-4"); /* TRANSLATORS: JDF F32-5 */ _("finishing-template.jdf-f32-5"); /* TRANSLATORS: JDF F32-6 */ _("finishing-template.jdf-f32-6"); /* TRANSLATORS: JDF F32-7 */ _("finishing-template.jdf-f32-7"); /* TRANSLATORS: JDF F32-8 */ _("finishing-template.jdf-f32-8"); /* TRANSLATORS: JDF F32-9 */ _("finishing-template.jdf-f32-9"); /* TRANSLATORS: JDF F36-1 */ _("finishing-template.jdf-f36-1"); /* TRANSLATORS: JDF F36-2 */ _("finishing-template.jdf-f36-2"); /* TRANSLATORS: JDF F4-1 */ _("finishing-template.jdf-f4-1"); /* TRANSLATORS: JDF F4-2 */ _("finishing-template.jdf-f4-2"); /* TRANSLATORS: JDF F40-1 */ _("finishing-template.jdf-f40-1"); /* TRANSLATORS: JDF F48-1 */ _("finishing-template.jdf-f48-1"); /* TRANSLATORS: JDF F48-2 */ _("finishing-template.jdf-f48-2"); /* TRANSLATORS: JDF F6-1 */ _("finishing-template.jdf-f6-1"); /* TRANSLATORS: JDF F6-2 */ _("finishing-template.jdf-f6-2"); /* TRANSLATORS: JDF F6-3 */ _("finishing-template.jdf-f6-3"); /* TRANSLATORS: JDF F6-4 */ _("finishing-template.jdf-f6-4"); /* TRANSLATORS: JDF F6-5 */ _("finishing-template.jdf-f6-5"); /* TRANSLATORS: JDF F6-6 */ _("finishing-template.jdf-f6-6"); /* TRANSLATORS: JDF F6-7 */ _("finishing-template.jdf-f6-7"); /* TRANSLATORS: JDF F6-8 */ _("finishing-template.jdf-f6-8"); /* TRANSLATORS: JDF F64-1 */ _("finishing-template.jdf-f64-1"); /* TRANSLATORS: JDF F64-2 */ _("finishing-template.jdf-f64-2"); /* TRANSLATORS: JDF F8-1 */ _("finishing-template.jdf-f8-1"); /* TRANSLATORS: JDF F8-2 */ _("finishing-template.jdf-f8-2"); /* TRANSLATORS: JDF F8-3 */ _("finishing-template.jdf-f8-3"); /* TRANSLATORS: JDF F8-4 */ _("finishing-template.jdf-f8-4"); /* TRANSLATORS: JDF F8-5 */ _("finishing-template.jdf-f8-5"); /* TRANSLATORS: JDF F8-6 */ _("finishing-template.jdf-f8-6"); /* TRANSLATORS: JDF F8-7 */ _("finishing-template.jdf-f8-7"); /* TRANSLATORS: Jog Offset */ _("finishing-template.jog-offset"); /* TRANSLATORS: Laminate */ _("finishing-template.laminate"); /* TRANSLATORS: Punch */ _("finishing-template.punch"); /* TRANSLATORS: Punch Bottom Left */ _("finishing-template.punch-bottom-left"); /* TRANSLATORS: Punch Bottom Right */ _("finishing-template.punch-bottom-right"); /* TRANSLATORS: 2-hole Punch Bottom */ _("finishing-template.punch-dual-bottom"); /* TRANSLATORS: 2-hole Punch Left */ _("finishing-template.punch-dual-left"); /* TRANSLATORS: 2-hole Punch Right */ _("finishing-template.punch-dual-right"); /* TRANSLATORS: 2-hole Punch Top */ _("finishing-template.punch-dual-top"); /* TRANSLATORS: Multi-hole Punch Bottom */ _("finishing-template.punch-multiple-bottom"); /* TRANSLATORS: Multi-hole Punch Left */ _("finishing-template.punch-multiple-left"); /* TRANSLATORS: Multi-hole Punch Right */ _("finishing-template.punch-multiple-right"); /* TRANSLATORS: Multi-hole Punch Top */ _("finishing-template.punch-multiple-top"); /* TRANSLATORS: 4-hole Punch Bottom */ _("finishing-template.punch-quad-bottom"); /* TRANSLATORS: 4-hole Punch Left */ _("finishing-template.punch-quad-left"); /* TRANSLATORS: 4-hole Punch Right */ _("finishing-template.punch-quad-right"); /* TRANSLATORS: 4-hole Punch Top */ _("finishing-template.punch-quad-top"); /* TRANSLATORS: Punch Top Left */ _("finishing-template.punch-top-left"); /* TRANSLATORS: Punch Top Right */ _("finishing-template.punch-top-right"); /* TRANSLATORS: 3-hole Punch Bottom */ _("finishing-template.punch-triple-bottom"); /* TRANSLATORS: 3-hole Punch Left */ _("finishing-template.punch-triple-left"); /* TRANSLATORS: 3-hole Punch Right */ _("finishing-template.punch-triple-right"); /* TRANSLATORS: 3-hole Punch Top */ _("finishing-template.punch-triple-top"); /* TRANSLATORS: Saddle Stitch */ _("finishing-template.saddle-stitch"); /* TRANSLATORS: Staple */ _("finishing-template.staple"); /* TRANSLATORS: Staple Bottom Left */ _("finishing-template.staple-bottom-left"); /* TRANSLATORS: Staple Bottom Right */ _("finishing-template.staple-bottom-right"); /* TRANSLATORS: 2 Staples on Bottom */ _("finishing-template.staple-dual-bottom"); /* TRANSLATORS: 2 Staples on Left */ _("finishing-template.staple-dual-left"); /* TRANSLATORS: 2 Staples on Right */ _("finishing-template.staple-dual-right"); /* TRANSLATORS: 2 Staples on Top */ _("finishing-template.staple-dual-top"); /* TRANSLATORS: Staple Top Left */ _("finishing-template.staple-top-left"); /* TRANSLATORS: Staple Top Right */ _("finishing-template.staple-top-right"); /* TRANSLATORS: 3 Staples on Bottom */ _("finishing-template.staple-triple-bottom"); /* TRANSLATORS: 3 Staples on Left */ _("finishing-template.staple-triple-left"); /* TRANSLATORS: 3 Staples on Right */ _("finishing-template.staple-triple-right"); /* TRANSLATORS: 3 Staples on Top */ _("finishing-template.staple-triple-top"); /* TRANSLATORS: Trim */ _("finishing-template.trim"); /* TRANSLATORS: Trim After Every Set */ _("finishing-template.trim-after-copies"); /* TRANSLATORS: Trim After Every Document */ _("finishing-template.trim-after-documents"); /* TRANSLATORS: Trim After Job */ _("finishing-template.trim-after-job"); /* TRANSLATORS: Trim After Every Page */ _("finishing-template.trim-after-pages"); /* TRANSLATORS: Finishings */ _("finishings"); /* TRANSLATORS: Finishings */ _("finishings-col"); /* TRANSLATORS: Fold */ _("finishings.10"); /* TRANSLATORS: Z Fold */ _("finishings.100"); /* TRANSLATORS: Engineering Z Fold */ _("finishings.101"); /* TRANSLATORS: Trim */ _("finishings.11"); /* TRANSLATORS: Bale */ _("finishings.12"); /* TRANSLATORS: Booklet Maker */ _("finishings.13"); /* TRANSLATORS: Jog Offset */ _("finishings.14"); /* TRANSLATORS: Coat */ _("finishings.15"); /* TRANSLATORS: Laminate */ _("finishings.16"); /* TRANSLATORS: Staple Top Left */ _("finishings.20"); /* TRANSLATORS: Staple Bottom Left */ _("finishings.21"); /* TRANSLATORS: Staple Top Right */ _("finishings.22"); /* TRANSLATORS: Staple Bottom Right */ _("finishings.23"); /* TRANSLATORS: Edge Stitch Left */ _("finishings.24"); /* TRANSLATORS: Edge Stitch Top */ _("finishings.25"); /* TRANSLATORS: Edge Stitch Right */ _("finishings.26"); /* TRANSLATORS: Edge Stitch Bottom */ _("finishings.27"); /* TRANSLATORS: 2 Staples on Left */ _("finishings.28"); /* TRANSLATORS: 2 Staples on Top */ _("finishings.29"); /* TRANSLATORS: None */ _("finishings.3"); /* TRANSLATORS: 2 Staples on Right */ _("finishings.30"); /* TRANSLATORS: 2 Staples on Bottom */ _("finishings.31"); /* TRANSLATORS: 3 Staples on Left */ _("finishings.32"); /* TRANSLATORS: 3 Staples on Top */ _("finishings.33"); /* TRANSLATORS: 3 Staples on Right */ _("finishings.34"); /* TRANSLATORS: 3 Staples on Bottom */ _("finishings.35"); /* TRANSLATORS: Staple */ _("finishings.4"); /* TRANSLATORS: Punch */ _("finishings.5"); /* TRANSLATORS: Bind Left */ _("finishings.50"); /* TRANSLATORS: Bind Top */ _("finishings.51"); /* TRANSLATORS: Bind Right */ _("finishings.52"); /* TRANSLATORS: Bind Bottom */ _("finishings.53"); /* TRANSLATORS: Cover */ _("finishings.6"); /* TRANSLATORS: Trim Pages */ _("finishings.60"); /* TRANSLATORS: Trim Documents */ _("finishings.61"); /* TRANSLATORS: Trim Copies */ _("finishings.62"); /* TRANSLATORS: Trim Job */ _("finishings.63"); /* TRANSLATORS: Bind */ _("finishings.7"); /* TRANSLATORS: Punch Top Left */ _("finishings.70"); /* TRANSLATORS: Punch Bottom Left */ _("finishings.71"); /* TRANSLATORS: Punch Top Right */ _("finishings.72"); /* TRANSLATORS: Punch Bottom Right */ _("finishings.73"); /* TRANSLATORS: 2-hole Punch Left */ _("finishings.74"); /* TRANSLATORS: 2-hole Punch Top */ _("finishings.75"); /* TRANSLATORS: 2-hole Punch Right */ _("finishings.76"); /* TRANSLATORS: 2-hole Punch Bottom */ _("finishings.77"); /* TRANSLATORS: 3-hole Punch Left */ _("finishings.78"); /* TRANSLATORS: 3-hole Punch Top */ _("finishings.79"); /* TRANSLATORS: Saddle Stitch */ _("finishings.8"); /* TRANSLATORS: 3-hole Punch Right */ _("finishings.80"); /* TRANSLATORS: 3-hole Punch Bottom */ _("finishings.81"); /* TRANSLATORS: 4-hole Punch Left */ _("finishings.82"); /* TRANSLATORS: 4-hole Punch Top */ _("finishings.83"); /* TRANSLATORS: 4-hole Punch Right */ _("finishings.84"); /* TRANSLATORS: 4-hole Punch Bottom */ _("finishings.85"); /* TRANSLATORS: Multi-hole Punch Left */ _("finishings.86"); /* TRANSLATORS: Multi-hole Punch Top */ _("finishings.87"); /* TRANSLATORS: Multi-hole Punch Right */ _("finishings.88"); /* TRANSLATORS: Multi-hole Punch Bottom */ _("finishings.89"); /* TRANSLATORS: Edge Stitch */ _("finishings.9"); /* TRANSLATORS: Accordion Fold */ _("finishings.90"); /* TRANSLATORS: Double Gate Fold */ _("finishings.91"); /* TRANSLATORS: Gate Fold */ _("finishings.92"); /* TRANSLATORS: Half Fold */ _("finishings.93"); /* TRANSLATORS: Half Z Fold */ _("finishings.94"); /* TRANSLATORS: Left Gate Fold */ _("finishings.95"); /* TRANSLATORS: Letter Fold */ _("finishings.96"); /* TRANSLATORS: Parallel Fold */ _("finishings.97"); /* TRANSLATORS: Poster Fold */ _("finishings.98"); /* TRANSLATORS: Right Gate Fold */ _("finishings.99"); /* TRANSLATORS: Fold */ _("folding"); /* TRANSLATORS: Fold Direction */ _("folding-direction"); /* TRANSLATORS: Inward */ _("folding-direction.inward"); /* TRANSLATORS: Outward */ _("folding-direction.outward"); /* TRANSLATORS: Fold Position */ _("folding-offset"); /* TRANSLATORS: Fold Edge */ _("folding-reference-edge"); /* TRANSLATORS: Bottom */ _("folding-reference-edge.bottom"); /* TRANSLATORS: Left */ _("folding-reference-edge.left"); /* TRANSLATORS: Right */ _("folding-reference-edge.right"); /* TRANSLATORS: Top */ _("folding-reference-edge.top"); /* TRANSLATORS: Font Name */ _("font-name-requested"); /* TRANSLATORS: Font Size */ _("font-size-requested"); /* TRANSLATORS: Force Front Side */ _("force-front-side"); /* TRANSLATORS: From Name */ _("from-name"); /* TRANSLATORS: Imposition Template */ _("imposition-template"); /* TRANSLATORS: None */ _("imposition-template.none"); /* TRANSLATORS: Signature */ _("imposition-template.signature"); /* TRANSLATORS: Insert Page Number */ _("insert-after-page-number"); /* TRANSLATORS: Insert Count */ _("insert-count"); /* TRANSLATORS: Insert Sheet */ _("insert-sheet"); /* TRANSLATORS: Job Account ID */ _("job-account-id"); /* TRANSLATORS: Job Account Type */ _("job-account-type"); /* TRANSLATORS: General */ _("job-account-type.general"); /* TRANSLATORS: Group */ _("job-account-type.group"); /* TRANSLATORS: None */ _("job-account-type.none"); /* TRANSLATORS: Job Accounting Output Bin */ _("job-accounting-output-bin"); /* TRANSLATORS: Job Accounting Sheets */ _("job-accounting-sheets"); /* TRANSLATORS: Type of Job Accounting Sheets */ _("job-accounting-sheets-type"); /* TRANSLATORS: None */ _("job-accounting-sheets-type.none"); /* TRANSLATORS: Standard */ _("job-accounting-sheets-type.standard"); /* TRANSLATORS: Job Accounting User ID */ _("job-accounting-user-id"); /* TRANSLATORS: Job Cancel After */ _("job-cancel-after"); /* TRANSLATORS: Copies */ _("job-copies"); /* TRANSLATORS: Back Cover */ _("job-cover-back"); /* TRANSLATORS: Front Cover */ _("job-cover-front"); /* TRANSLATORS: Delay Output Until */ _("job-delay-output-until"); /* TRANSLATORS: Delay Output Until */ _("job-delay-output-until-time"); /* TRANSLATORS: Daytime */ _("job-delay-output-until.day-time"); /* TRANSLATORS: Evening */ _("job-delay-output-until.evening"); /* TRANSLATORS: Released */ _("job-delay-output-until.indefinite"); /* TRANSLATORS: Night */ _("job-delay-output-until.night"); /* TRANSLATORS: No Delay */ _("job-delay-output-until.no-delay-output"); /* TRANSLATORS: Second Shift */ _("job-delay-output-until.second-shift"); /* TRANSLATORS: Third Shift */ _("job-delay-output-until.third-shift"); /* TRANSLATORS: Weekend */ _("job-delay-output-until.weekend"); /* TRANSLATORS: On Error */ _("job-error-action"); /* TRANSLATORS: Abort Job */ _("job-error-action.abort-job"); /* TRANSLATORS: Cancel Job */ _("job-error-action.cancel-job"); /* TRANSLATORS: Continue Job */ _("job-error-action.continue-job"); /* TRANSLATORS: Suspend Job */ _("job-error-action.suspend-job"); /* TRANSLATORS: Print Error Sheet */ _("job-error-sheet"); /* TRANSLATORS: Type of Error Sheet */ _("job-error-sheet-type"); /* TRANSLATORS: None */ _("job-error-sheet-type.none"); /* TRANSLATORS: Standard */ _("job-error-sheet-type.standard"); /* TRANSLATORS: Print Error Sheet */ _("job-error-sheet-when"); /* TRANSLATORS: Always */ _("job-error-sheet-when.always"); /* TRANSLATORS: On Error */ _("job-error-sheet-when.on-error"); /* TRANSLATORS: Job Finishings */ _("job-finishings"); /* TRANSLATORS: Hold Until */ _("job-hold-until"); /* TRANSLATORS: Hold Until */ _("job-hold-until-time"); /* TRANSLATORS: Daytime */ _("job-hold-until.day-time"); /* TRANSLATORS: Evening */ _("job-hold-until.evening"); /* TRANSLATORS: Released */ _("job-hold-until.indefinite"); /* TRANSLATORS: Night */ _("job-hold-until.night"); /* TRANSLATORS: No Hold */ _("job-hold-until.no-hold"); /* TRANSLATORS: Second Shift */ _("job-hold-until.second-shift"); /* TRANSLATORS: Third Shift */ _("job-hold-until.third-shift"); /* TRANSLATORS: Weekend */ _("job-hold-until.weekend"); /* TRANSLATORS: Job Mandatory Attributes */ _("job-mandatory-attributes"); /* TRANSLATORS: Title */ _("job-name"); /* TRANSLATORS: Job Pages */ _("job-pages"); /* TRANSLATORS: Job Pages */ _("job-pages-col"); /* TRANSLATORS: Job Phone Number */ _("job-phone-number"); /* TRANSLATORS: Job Priority */ _("job-priority"); /* TRANSLATORS: Job Privacy Attributes */ _("job-privacy-attributes"); /* TRANSLATORS: All */ _("job-privacy-attributes.all"); /* TRANSLATORS: Default */ _("job-privacy-attributes.default"); /* TRANSLATORS: Job Description */ _("job-privacy-attributes.job-description"); /* TRANSLATORS: Job Template */ _("job-privacy-attributes.job-template"); /* TRANSLATORS: None */ _("job-privacy-attributes.none"); /* TRANSLATORS: Job Privacy Scope */ _("job-privacy-scope"); /* TRANSLATORS: All */ _("job-privacy-scope.all"); /* TRANSLATORS: Default */ _("job-privacy-scope.default"); /* TRANSLATORS: None */ _("job-privacy-scope.none"); /* TRANSLATORS: Owner */ _("job-privacy-scope.owner"); /* TRANSLATORS: Job Recipient Name */ _("job-recipient-name"); /* TRANSLATORS: Job Retain Until */ _("job-retain-until"); /* TRANSLATORS: Job Retain Until Interval */ _("job-retain-until-interval"); /* TRANSLATORS: Job Retain Until Time */ _("job-retain-until-time"); /* TRANSLATORS: End Of Day */ _("job-retain-until.end-of-day"); /* TRANSLATORS: End Of Month */ _("job-retain-until.end-of-month"); /* TRANSLATORS: End Of Week */ _("job-retain-until.end-of-week"); /* TRANSLATORS: Indefinite */ _("job-retain-until.indefinite"); /* TRANSLATORS: None */ _("job-retain-until.none"); /* TRANSLATORS: Job Save Disposition */ _("job-save-disposition"); /* TRANSLATORS: Job Sheet Message */ _("job-sheet-message"); /* TRANSLATORS: Banner Page */ _("job-sheets"); /* TRANSLATORS: Banner Page */ _("job-sheets-col"); /* TRANSLATORS: First Page in Document */ _("job-sheets.first-print-stream-page"); /* TRANSLATORS: Start and End Sheets */ _("job-sheets.job-both-sheet"); /* TRANSLATORS: End Sheet */ _("job-sheets.job-end-sheet"); /* TRANSLATORS: Start Sheet */ _("job-sheets.job-start-sheet"); /* TRANSLATORS: None */ _("job-sheets.none"); /* TRANSLATORS: Standard */ _("job-sheets.standard"); /* TRANSLATORS: Job State */ _("job-state"); /* TRANSLATORS: Job State Message */ _("job-state-message"); /* TRANSLATORS: Detailed Job State */ _("job-state-reasons"); /* TRANSLATORS: Stopping */ _("job-state-reasons.aborted-by-system"); /* TRANSLATORS: Account Authorization Failed */ _("job-state-reasons.account-authorization-failed"); /* TRANSLATORS: Account Closed */ _("job-state-reasons.account-closed"); /* TRANSLATORS: Account Info Needed */ _("job-state-reasons.account-info-needed"); /* TRANSLATORS: Account Limit Reached */ _("job-state-reasons.account-limit-reached"); /* TRANSLATORS: Decompression error */ _("job-state-reasons.compression-error"); /* TRANSLATORS: Conflicting Attributes */ _("job-state-reasons.conflicting-attributes"); /* TRANSLATORS: Connected To Destination */ _("job-state-reasons.connected-to-destination"); /* TRANSLATORS: Connecting To Destination */ _("job-state-reasons.connecting-to-destination"); /* TRANSLATORS: Destination Uri Failed */ _("job-state-reasons.destination-uri-failed"); /* TRANSLATORS: Digital Signature Did Not Verify */ _("job-state-reasons.digital-signature-did-not-verify"); /* TRANSLATORS: Digital Signature Type Not Supported */ _("job-state-reasons.digital-signature-type-not-supported"); /* TRANSLATORS: Document Access Error */ _("job-state-reasons.document-access-error"); /* TRANSLATORS: Document Format Error */ _("job-state-reasons.document-format-error"); /* TRANSLATORS: Document Password Error */ _("job-state-reasons.document-password-error"); /* TRANSLATORS: Document Permission Error */ _("job-state-reasons.document-permission-error"); /* TRANSLATORS: Document Security Error */ _("job-state-reasons.document-security-error"); /* TRANSLATORS: Document Unprintable Error */ _("job-state-reasons.document-unprintable-error"); /* TRANSLATORS: Errors Detected */ _("job-state-reasons.errors-detected"); /* TRANSLATORS: Canceled at printer */ _("job-state-reasons.job-canceled-at-device"); /* TRANSLATORS: Canceled by operator */ _("job-state-reasons.job-canceled-by-operator"); /* TRANSLATORS: Canceled by user */ _("job-state-reasons.job-canceled-by-user"); /* TRANSLATORS: */ _("job-state-reasons.job-completed-successfully"); /* TRANSLATORS: Completed with errors */ _("job-state-reasons.job-completed-with-errors"); /* TRANSLATORS: Completed with warnings */ _("job-state-reasons.job-completed-with-warnings"); /* TRANSLATORS: Insufficient data */ _("job-state-reasons.job-data-insufficient"); /* TRANSLATORS: Job Delay Output Until Specified */ _("job-state-reasons.job-delay-output-until-specified"); /* TRANSLATORS: Job Digital Signature Wait */ _("job-state-reasons.job-digital-signature-wait"); /* TRANSLATORS: Job Fetchable */ _("job-state-reasons.job-fetchable"); /* TRANSLATORS: Job Held For Review */ _("job-state-reasons.job-held-for-review"); /* TRANSLATORS: Job held */ _("job-state-reasons.job-hold-until-specified"); /* TRANSLATORS: Incoming */ _("job-state-reasons.job-incoming"); /* TRANSLATORS: Interpreting */ _("job-state-reasons.job-interpreting"); /* TRANSLATORS: Outgoing */ _("job-state-reasons.job-outgoing"); /* TRANSLATORS: Job Password Wait */ _("job-state-reasons.job-password-wait"); /* TRANSLATORS: Job Printed Successfully */ _("job-state-reasons.job-printed-successfully"); /* TRANSLATORS: Job Printed With Errors */ _("job-state-reasons.job-printed-with-errors"); /* TRANSLATORS: Job Printed With Warnings */ _("job-state-reasons.job-printed-with-warnings"); /* TRANSLATORS: Printing */ _("job-state-reasons.job-printing"); /* TRANSLATORS: Preparing to print */ _("job-state-reasons.job-queued"); /* TRANSLATORS: Processing document */ _("job-state-reasons.job-queued-for-marker"); /* TRANSLATORS: Job Release Wait */ _("job-state-reasons.job-release-wait"); /* TRANSLATORS: Restartable */ _("job-state-reasons.job-restartable"); /* TRANSLATORS: Job Resuming */ _("job-state-reasons.job-resuming"); /* TRANSLATORS: Job Saved Successfully */ _("job-state-reasons.job-saved-successfully"); /* TRANSLATORS: Job Saved With Errors */ _("job-state-reasons.job-saved-with-errors"); /* TRANSLATORS: Job Saved With Warnings */ _("job-state-reasons.job-saved-with-warnings"); /* TRANSLATORS: Job Saving */ _("job-state-reasons.job-saving"); /* TRANSLATORS: Job Spooling */ _("job-state-reasons.job-spooling"); /* TRANSLATORS: Job Streaming */ _("job-state-reasons.job-streaming"); /* TRANSLATORS: Suspended */ _("job-state-reasons.job-suspended"); /* TRANSLATORS: Job Suspended By Operator */ _("job-state-reasons.job-suspended-by-operator"); /* TRANSLATORS: Job Suspended By System */ _("job-state-reasons.job-suspended-by-system"); /* TRANSLATORS: Job Suspended By User */ _("job-state-reasons.job-suspended-by-user"); /* TRANSLATORS: Job Suspending */ _("job-state-reasons.job-suspending"); /* TRANSLATORS: Job Transferring */ _("job-state-reasons.job-transferring"); /* TRANSLATORS: Transforming */ _("job-state-reasons.job-transforming"); /* TRANSLATORS: None */ _("job-state-reasons.none"); /* TRANSLATORS: Printer offline */ _("job-state-reasons.printer-stopped"); /* TRANSLATORS: Printer partially stopped */ _("job-state-reasons.printer-stopped-partly"); /* TRANSLATORS: Stopping */ _("job-state-reasons.processing-to-stop-point"); /* TRANSLATORS: Ready */ _("job-state-reasons.queued-in-device"); /* TRANSLATORS: Resources Are Not Ready */ _("job-state-reasons.resources-are-not-ready"); /* TRANSLATORS: Resources Are Not Supported */ _("job-state-reasons.resources-are-not-supported"); /* TRANSLATORS: Service offline */ _("job-state-reasons.service-off-line"); /* TRANSLATORS: Submission Interrupted */ _("job-state-reasons.submission-interrupted"); /* TRANSLATORS: Unsupported Attributes Or Values */ _("job-state-reasons.unsupported-attributes-or-values"); /* TRANSLATORS: Unsupported Compression */ _("job-state-reasons.unsupported-compression"); /* TRANSLATORS: Unsupported Document Format */ _("job-state-reasons.unsupported-document-format"); /* TRANSLATORS: Waiting For User Action */ _("job-state-reasons.waiting-for-user-action"); /* TRANSLATORS: Warnings Detected */ _("job-state-reasons.warnings-detected"); /* TRANSLATORS: Pending */ _("job-state.3"); /* TRANSLATORS: Held */ _("job-state.4"); /* TRANSLATORS: Processing */ _("job-state.5"); /* TRANSLATORS: Stopped */ _("job-state.6"); /* TRANSLATORS: Canceled */ _("job-state.7"); /* TRANSLATORS: Aborted */ _("job-state.8"); /* TRANSLATORS: Completed */ _("job-state.9"); /* TRANSLATORS: Laminate Pages */ _("laminating"); /* TRANSLATORS: Laminate */ _("laminating-sides"); /* TRANSLATORS: Back Only */ _("laminating-sides.back"); /* TRANSLATORS: Front and Back */ _("laminating-sides.both"); /* TRANSLATORS: Front Only */ _("laminating-sides.front"); /* TRANSLATORS: Type of Lamination */ _("laminating-type"); /* TRANSLATORS: Archival */ _("laminating-type.archival"); /* TRANSLATORS: Glossy */ _("laminating-type.glossy"); /* TRANSLATORS: High Gloss */ _("laminating-type.high-gloss"); /* TRANSLATORS: Matte */ _("laminating-type.matte"); /* TRANSLATORS: Semi-gloss */ _("laminating-type.semi-gloss"); /* TRANSLATORS: Translucent */ _("laminating-type.translucent"); /* TRANSLATORS: Logo */ _("logo"); /* TRANSLATORS: Amount of Material */ _("material-amount"); /* TRANSLATORS: Amount Units */ _("material-amount-units"); /* TRANSLATORS: Grams */ _("material-amount-units.g"); /* TRANSLATORS: Kilograms */ _("material-amount-units.kg"); /* TRANSLATORS: Liters */ _("material-amount-units.l"); /* TRANSLATORS: Meters */ _("material-amount-units.m"); /* TRANSLATORS: Milliliters */ _("material-amount-units.ml"); /* TRANSLATORS: Millimeters */ _("material-amount-units.mm"); /* TRANSLATORS: Material Color */ _("material-color"); /* TRANSLATORS: Material Diameter */ _("material-diameter"); /* TRANSLATORS: Material Diameter Tolerance */ _("material-diameter-tolerance"); /* TRANSLATORS: Material Fill Density */ _("material-fill-density"); /* TRANSLATORS: Material Name */ _("material-name"); /* TRANSLATORS: Material Nozzle Diameter */ _("material-nozzle-diameter"); /* TRANSLATORS: Use Material For */ _("material-purpose"); /* TRANSLATORS: Everything */ _("material-purpose.all"); /* TRANSLATORS: Base */ _("material-purpose.base"); /* TRANSLATORS: In-fill */ _("material-purpose.in-fill"); /* TRANSLATORS: Shell */ _("material-purpose.shell"); /* TRANSLATORS: Supports */ _("material-purpose.support"); /* TRANSLATORS: Feed Rate */ _("material-rate"); /* TRANSLATORS: Feed Rate Units */ _("material-rate-units"); /* TRANSLATORS: Milligrams per second */ _("material-rate-units.mg_second"); /* TRANSLATORS: Milliliters per second */ _("material-rate-units.ml_second"); /* TRANSLATORS: Millimeters per second */ _("material-rate-units.mm_second"); /* TRANSLATORS: Material Retraction */ _("material-retraction"); /* TRANSLATORS: Material Shell Thickness */ _("material-shell-thickness"); /* TRANSLATORS: Material Temperature */ _("material-temperature"); /* TRANSLATORS: Material Type */ _("material-type"); /* TRANSLATORS: ABS */ _("material-type.abs"); /* TRANSLATORS: Carbon Fiber ABS */ _("material-type.abs-carbon-fiber"); /* TRANSLATORS: Carbon Nanotube ABS */ _("material-type.abs-carbon-nanotube"); /* TRANSLATORS: Chocolate */ _("material-type.chocolate"); /* TRANSLATORS: Gold */ _("material-type.gold"); /* TRANSLATORS: Nylon */ _("material-type.nylon"); /* TRANSLATORS: Pet */ _("material-type.pet"); /* TRANSLATORS: Photopolymer */ _("material-type.photopolymer"); /* TRANSLATORS: PLA */ _("material-type.pla"); /* TRANSLATORS: Conductive PLA */ _("material-type.pla-conductive"); /* TRANSLATORS: Pla Dissolvable */ _("material-type.pla-dissolvable"); /* TRANSLATORS: Flexible PLA */ _("material-type.pla-flexible"); /* TRANSLATORS: Magnetic PLA */ _("material-type.pla-magnetic"); /* TRANSLATORS: Steel PLA */ _("material-type.pla-steel"); /* TRANSLATORS: Stone PLA */ _("material-type.pla-stone"); /* TRANSLATORS: Wood PLA */ _("material-type.pla-wood"); /* TRANSLATORS: Polycarbonate */ _("material-type.polycarbonate"); /* TRANSLATORS: Dissolvable PVA */ _("material-type.pva-dissolvable"); /* TRANSLATORS: Silver */ _("material-type.silver"); /* TRANSLATORS: Titanium */ _("material-type.titanium"); /* TRANSLATORS: Wax */ _("material-type.wax"); /* TRANSLATORS: Materials */ _("materials-col"); /* TRANSLATORS: Media */ _("media"); /* TRANSLATORS: Back Coating of Media */ _("media-back-coating"); /* TRANSLATORS: Glossy */ _("media-back-coating.glossy"); /* TRANSLATORS: High Gloss */ _("media-back-coating.high-gloss"); /* TRANSLATORS: Matte */ _("media-back-coating.matte"); /* TRANSLATORS: None */ _("media-back-coating.none"); /* TRANSLATORS: Satin */ _("media-back-coating.satin"); /* TRANSLATORS: Semi-gloss */ _("media-back-coating.semi-gloss"); /* TRANSLATORS: Media Bottom Margin */ _("media-bottom-margin"); /* TRANSLATORS: Media */ _("media-col"); /* TRANSLATORS: Media Color */ _("media-color"); /* TRANSLATORS: Black */ _("media-color.black"); /* TRANSLATORS: Blue */ _("media-color.blue"); /* TRANSLATORS: Brown */ _("media-color.brown"); /* TRANSLATORS: Buff */ _("media-color.buff"); /* TRANSLATORS: Clear Black */ _("media-color.clear-black"); /* TRANSLATORS: Clear Blue */ _("media-color.clear-blue"); /* TRANSLATORS: Clear Brown */ _("media-color.clear-brown"); /* TRANSLATORS: Clear Buff */ _("media-color.clear-buff"); /* TRANSLATORS: Clear Cyan */ _("media-color.clear-cyan"); /* TRANSLATORS: Clear Gold */ _("media-color.clear-gold"); /* TRANSLATORS: Clear Goldenrod */ _("media-color.clear-goldenrod"); /* TRANSLATORS: Clear Gray */ _("media-color.clear-gray"); /* TRANSLATORS: Clear Green */ _("media-color.clear-green"); /* TRANSLATORS: Clear Ivory */ _("media-color.clear-ivory"); /* TRANSLATORS: Clear Magenta */ _("media-color.clear-magenta"); /* TRANSLATORS: Clear Multi Color */ _("media-color.clear-multi-color"); /* TRANSLATORS: Clear Mustard */ _("media-color.clear-mustard"); /* TRANSLATORS: Clear Orange */ _("media-color.clear-orange"); /* TRANSLATORS: Clear Pink */ _("media-color.clear-pink"); /* TRANSLATORS: Clear Red */ _("media-color.clear-red"); /* TRANSLATORS: Clear Silver */ _("media-color.clear-silver"); /* TRANSLATORS: Clear Turquoise */ _("media-color.clear-turquoise"); /* TRANSLATORS: Clear Violet */ _("media-color.clear-violet"); /* TRANSLATORS: Clear White */ _("media-color.clear-white"); /* TRANSLATORS: Clear Yellow */ _("media-color.clear-yellow"); /* TRANSLATORS: Cyan */ _("media-color.cyan"); /* TRANSLATORS: Dark Blue */ _("media-color.dark-blue"); /* TRANSLATORS: Dark Brown */ _("media-color.dark-brown"); /* TRANSLATORS: Dark Buff */ _("media-color.dark-buff"); /* TRANSLATORS: Dark Cyan */ _("media-color.dark-cyan"); /* TRANSLATORS: Dark Gold */ _("media-color.dark-gold"); /* TRANSLATORS: Dark Goldenrod */ _("media-color.dark-goldenrod"); /* TRANSLATORS: Dark Gray */ _("media-color.dark-gray"); /* TRANSLATORS: Dark Green */ _("media-color.dark-green"); /* TRANSLATORS: Dark Ivory */ _("media-color.dark-ivory"); /* TRANSLATORS: Dark Magenta */ _("media-color.dark-magenta"); /* TRANSLATORS: Dark Mustard */ _("media-color.dark-mustard"); /* TRANSLATORS: Dark Orange */ _("media-color.dark-orange"); /* TRANSLATORS: Dark Pink */ _("media-color.dark-pink"); /* TRANSLATORS: Dark Red */ _("media-color.dark-red"); /* TRANSLATORS: Dark Silver */ _("media-color.dark-silver"); /* TRANSLATORS: Dark Turquoise */ _("media-color.dark-turquoise"); /* TRANSLATORS: Dark Violet */ _("media-color.dark-violet"); /* TRANSLATORS: Dark Yellow */ _("media-color.dark-yellow"); /* TRANSLATORS: Gold */ _("media-color.gold"); /* TRANSLATORS: Goldenrod */ _("media-color.goldenrod"); /* TRANSLATORS: Gray */ _("media-color.gray"); /* TRANSLATORS: Green */ _("media-color.green"); /* TRANSLATORS: Ivory */ _("media-color.ivory"); /* TRANSLATORS: Light Black */ _("media-color.light-black"); /* TRANSLATORS: Light Blue */ _("media-color.light-blue"); /* TRANSLATORS: Light Brown */ _("media-color.light-brown"); /* TRANSLATORS: Light Buff */ _("media-color.light-buff"); /* TRANSLATORS: Light Cyan */ _("media-color.light-cyan"); /* TRANSLATORS: Light Gold */ _("media-color.light-gold"); /* TRANSLATORS: Light Goldenrod */ _("media-color.light-goldenrod"); /* TRANSLATORS: Light Gray */ _("media-color.light-gray"); /* TRANSLATORS: Light Green */ _("media-color.light-green"); /* TRANSLATORS: Light Ivory */ _("media-color.light-ivory"); /* TRANSLATORS: Light Magenta */ _("media-color.light-magenta"); /* TRANSLATORS: Light Mustard */ _("media-color.light-mustard"); /* TRANSLATORS: Light Orange */ _("media-color.light-orange"); /* TRANSLATORS: Light Pink */ _("media-color.light-pink"); /* TRANSLATORS: Light Red */ _("media-color.light-red"); /* TRANSLATORS: Light Silver */ _("media-color.light-silver"); /* TRANSLATORS: Light Turquoise */ _("media-color.light-turquoise"); /* TRANSLATORS: Light Violet */ _("media-color.light-violet"); /* TRANSLATORS: Light Yellow */ _("media-color.light-yellow"); /* TRANSLATORS: Magenta */ _("media-color.magenta"); /* TRANSLATORS: Multi-color */ _("media-color.multi-color"); /* TRANSLATORS: Mustard */ _("media-color.mustard"); /* TRANSLATORS: No Color */ _("media-color.no-color"); /* TRANSLATORS: Orange */ _("media-color.orange"); /* TRANSLATORS: Pink */ _("media-color.pink"); /* TRANSLATORS: Red */ _("media-color.red"); /* TRANSLATORS: Silver */ _("media-color.silver"); /* TRANSLATORS: Turquoise */ _("media-color.turquoise"); /* TRANSLATORS: Violet */ _("media-color.violet"); /* TRANSLATORS: White */ _("media-color.white"); /* TRANSLATORS: Yellow */ _("media-color.yellow"); /* TRANSLATORS: Front Coating of Media */ _("media-front-coating"); /* TRANSLATORS: Media Grain */ _("media-grain"); /* TRANSLATORS: Cross-Feed Direction */ _("media-grain.x-direction"); /* TRANSLATORS: Feed Direction */ _("media-grain.y-direction"); /* TRANSLATORS: Media Hole Count */ _("media-hole-count"); /* TRANSLATORS: Media Info */ _("media-info"); /* TRANSLATORS: Force Media */ _("media-input-tray-check"); /* TRANSLATORS: Media Left Margin */ _("media-left-margin"); /* TRANSLATORS: Pre-printed Media */ _("media-pre-printed"); /* TRANSLATORS: Blank */ _("media-pre-printed.blank"); /* TRANSLATORS: Letterhead */ _("media-pre-printed.letter-head"); /* TRANSLATORS: Pre-printed */ _("media-pre-printed.pre-printed"); /* TRANSLATORS: Recycled Media */ _("media-recycled"); /* TRANSLATORS: None */ _("media-recycled.none"); /* TRANSLATORS: Standard */ _("media-recycled.standard"); /* TRANSLATORS: Media Right Margin */ _("media-right-margin"); /* TRANSLATORS: Media Dimensions */ _("media-size"); /* TRANSLATORS: Media Name */ _("media-size-name"); /* TRANSLATORS: Media Source */ _("media-source"); /* TRANSLATORS: Alternate */ _("media-source.alternate"); /* TRANSLATORS: Alternate Roll */ _("media-source.alternate-roll"); /* TRANSLATORS: Automatic */ _("media-source.auto"); /* TRANSLATORS: Bottom */ _("media-source.bottom"); /* TRANSLATORS: By-pass Tray */ _("media-source.by-pass-tray"); /* TRANSLATORS: Center */ _("media-source.center"); /* TRANSLATORS: Disc */ _("media-source.disc"); /* TRANSLATORS: Envelope */ _("media-source.envelope"); /* TRANSLATORS: Hagaki */ _("media-source.hagaki"); /* TRANSLATORS: Large Capacity */ _("media-source.large-capacity"); /* TRANSLATORS: Left */ _("media-source.left"); /* TRANSLATORS: Main */ _("media-source.main"); /* TRANSLATORS: Main Roll */ _("media-source.main-roll"); /* TRANSLATORS: Manual */ _("media-source.manual"); /* TRANSLATORS: Middle */ _("media-source.middle"); /* TRANSLATORS: Photo */ _("media-source.photo"); /* TRANSLATORS: Rear */ _("media-source.rear"); /* TRANSLATORS: Right */ _("media-source.right"); /* TRANSLATORS: Roll 1 */ _("media-source.roll-1"); /* TRANSLATORS: Roll 10 */ _("media-source.roll-10"); /* TRANSLATORS: Roll 2 */ _("media-source.roll-2"); /* TRANSLATORS: Roll 3 */ _("media-source.roll-3"); /* TRANSLATORS: Roll 4 */ _("media-source.roll-4"); /* TRANSLATORS: Roll 5 */ _("media-source.roll-5"); /* TRANSLATORS: Roll 6 */ _("media-source.roll-6"); /* TRANSLATORS: Roll 7 */ _("media-source.roll-7"); /* TRANSLATORS: Roll 8 */ _("media-source.roll-8"); /* TRANSLATORS: Roll 9 */ _("media-source.roll-9"); /* TRANSLATORS: Side */ _("media-source.side"); /* TRANSLATORS: Top */ _("media-source.top"); /* TRANSLATORS: Tray 1 */ _("media-source.tray-1"); /* TRANSLATORS: Tray 10 */ _("media-source.tray-10"); /* TRANSLATORS: Tray 11 */ _("media-source.tray-11"); /* TRANSLATORS: Tray 12 */ _("media-source.tray-12"); /* TRANSLATORS: Tray 13 */ _("media-source.tray-13"); /* TRANSLATORS: Tray 14 */ _("media-source.tray-14"); /* TRANSLATORS: Tray 15 */ _("media-source.tray-15"); /* TRANSLATORS: Tray 16 */ _("media-source.tray-16"); /* TRANSLATORS: Tray 17 */ _("media-source.tray-17"); /* TRANSLATORS: Tray 18 */ _("media-source.tray-18"); /* TRANSLATORS: Tray 19 */ _("media-source.tray-19"); /* TRANSLATORS: Tray 2 */ _("media-source.tray-2"); /* TRANSLATORS: Tray 20 */ _("media-source.tray-20"); /* TRANSLATORS: Tray 3 */ _("media-source.tray-3"); /* TRANSLATORS: Tray 4 */ _("media-source.tray-4"); /* TRANSLATORS: Tray 5 */ _("media-source.tray-5"); /* TRANSLATORS: Tray 6 */ _("media-source.tray-6"); /* TRANSLATORS: Tray 7 */ _("media-source.tray-7"); /* TRANSLATORS: Tray 8 */ _("media-source.tray-8"); /* TRANSLATORS: Tray 9 */ _("media-source.tray-9"); /* TRANSLATORS: Media Thickness */ _("media-thickness"); /* TRANSLATORS: Media Tooth (Texture) */ _("media-tooth"); /* TRANSLATORS: Antique */ _("media-tooth.antique"); /* TRANSLATORS: Extra Smooth */ _("media-tooth.calendared"); /* TRANSLATORS: Coarse */ _("media-tooth.coarse"); /* TRANSLATORS: Fine */ _("media-tooth.fine"); /* TRANSLATORS: Linen */ _("media-tooth.linen"); /* TRANSLATORS: Medium */ _("media-tooth.medium"); /* TRANSLATORS: Smooth */ _("media-tooth.smooth"); /* TRANSLATORS: Stipple */ _("media-tooth.stipple"); /* TRANSLATORS: Rough */ _("media-tooth.uncalendared"); /* TRANSLATORS: Vellum */ _("media-tooth.vellum"); /* TRANSLATORS: Media Top Margin */ _("media-top-margin"); /* TRANSLATORS: Media Type */ _("media-type"); /* TRANSLATORS: Aluminum */ _("media-type.aluminum"); /* TRANSLATORS: Automatic */ _("media-type.auto"); /* TRANSLATORS: Back Print Film */ _("media-type.back-print-film"); /* TRANSLATORS: Cardboard */ _("media-type.cardboard"); /* TRANSLATORS: Cardstock */ _("media-type.cardstock"); /* TRANSLATORS: CD */ _("media-type.cd"); /* TRANSLATORS: Continuous */ _("media-type.continuous"); /* TRANSLATORS: Continuous Long */ _("media-type.continuous-long"); /* TRANSLATORS: Continuous Short */ _("media-type.continuous-short"); /* TRANSLATORS: Corrugated Board */ _("media-type.corrugated-board"); /* TRANSLATORS: Optical Disc */ _("media-type.disc"); /* TRANSLATORS: Glossy Optical Disc */ _("media-type.disc-glossy"); /* TRANSLATORS: High Gloss Optical Disc */ _("media-type.disc-high-gloss"); /* TRANSLATORS: Matte Optical Disc */ _("media-type.disc-matte"); /* TRANSLATORS: Satin Optical Disc */ _("media-type.disc-satin"); /* TRANSLATORS: Semi-Gloss Optical Disc */ _("media-type.disc-semi-gloss"); /* TRANSLATORS: Double Wall */ _("media-type.double-wall"); /* TRANSLATORS: Dry Film */ _("media-type.dry-film"); /* TRANSLATORS: DVD */ _("media-type.dvd"); /* TRANSLATORS: Embossing Foil */ _("media-type.embossing-foil"); /* TRANSLATORS: End Board */ _("media-type.end-board"); /* TRANSLATORS: Envelope */ _("media-type.envelope"); /* TRANSLATORS: Archival Envelope */ _("media-type.envelope-archival"); /* TRANSLATORS: Bond Envelope */ _("media-type.envelope-bond"); /* TRANSLATORS: Coated Envelope */ _("media-type.envelope-coated"); /* TRANSLATORS: Cotton Envelope */ _("media-type.envelope-cotton"); /* TRANSLATORS: Fine Envelope */ _("media-type.envelope-fine"); /* TRANSLATORS: Heavyweight Envelope */ _("media-type.envelope-heavyweight"); /* TRANSLATORS: Inkjet Envelope */ _("media-type.envelope-inkjet"); /* TRANSLATORS: Lightweight Envelope */ _("media-type.envelope-lightweight"); /* TRANSLATORS: Plain Envelope */ _("media-type.envelope-plain"); /* TRANSLATORS: Preprinted Envelope */ _("media-type.envelope-preprinted"); /* TRANSLATORS: Windowed Envelope */ _("media-type.envelope-window"); /* TRANSLATORS: Fabric */ _("media-type.fabric"); /* TRANSLATORS: Archival Fabric */ _("media-type.fabric-archival"); /* TRANSLATORS: Glossy Fabric */ _("media-type.fabric-glossy"); /* TRANSLATORS: High Gloss Fabric */ _("media-type.fabric-high-gloss"); /* TRANSLATORS: Matte Fabric */ _("media-type.fabric-matte"); /* TRANSLATORS: Semi-Gloss Fabric */ _("media-type.fabric-semi-gloss"); /* TRANSLATORS: Waterproof Fabric */ _("media-type.fabric-waterproof"); /* TRANSLATORS: Film */ _("media-type.film"); /* TRANSLATORS: Flexo Base */ _("media-type.flexo-base"); /* TRANSLATORS: Flexo Photo Polymer */ _("media-type.flexo-photo-polymer"); /* TRANSLATORS: Flute */ _("media-type.flute"); /* TRANSLATORS: Foil */ _("media-type.foil"); /* TRANSLATORS: Full Cut Tabs */ _("media-type.full-cut-tabs"); /* TRANSLATORS: Glass */ _("media-type.glass"); /* TRANSLATORS: Glass Colored */ _("media-type.glass-colored"); /* TRANSLATORS: Glass Opaque */ _("media-type.glass-opaque"); /* TRANSLATORS: Glass Surfaced */ _("media-type.glass-surfaced"); /* TRANSLATORS: Glass Textured */ _("media-type.glass-textured"); /* TRANSLATORS: Gravure Cylinder */ _("media-type.gravure-cylinder"); /* TRANSLATORS: Image Setter Paper */ _("media-type.image-setter-paper"); /* TRANSLATORS: Imaging Cylinder */ _("media-type.imaging-cylinder"); /* TRANSLATORS: Labels */ _("media-type.labels"); /* TRANSLATORS: Colored Labels */ _("media-type.labels-colored"); /* TRANSLATORS: Glossy Labels */ _("media-type.labels-glossy"); /* TRANSLATORS: High Gloss Labels */ _("media-type.labels-high-gloss"); /* TRANSLATORS: Inkjet Labels */ _("media-type.labels-inkjet"); /* TRANSLATORS: Matte Labels */ _("media-type.labels-matte"); /* TRANSLATORS: Permanent Labels */ _("media-type.labels-permanent"); /* TRANSLATORS: Satin Labels */ _("media-type.labels-satin"); /* TRANSLATORS: Security Labels */ _("media-type.labels-security"); /* TRANSLATORS: Semi-Gloss Labels */ _("media-type.labels-semi-gloss"); /* TRANSLATORS: Laminating Foil */ _("media-type.laminating-foil"); /* TRANSLATORS: Letterhead */ _("media-type.letterhead"); /* TRANSLATORS: Metal */ _("media-type.metal"); /* TRANSLATORS: Metal Glossy */ _("media-type.metal-glossy"); /* TRANSLATORS: Metal High Gloss */ _("media-type.metal-high-gloss"); /* TRANSLATORS: Metal Matte */ _("media-type.metal-matte"); /* TRANSLATORS: Metal Satin */ _("media-type.metal-satin"); /* TRANSLATORS: Metal Semi Gloss */ _("media-type.metal-semi-gloss"); /* TRANSLATORS: Mounting Tape */ _("media-type.mounting-tape"); /* TRANSLATORS: Multi Layer */ _("media-type.multi-layer"); /* TRANSLATORS: Multi Part Form */ _("media-type.multi-part-form"); /* TRANSLATORS: Other */ _("media-type.other"); /* TRANSLATORS: Paper */ _("media-type.paper"); /* TRANSLATORS: Photo Paper */ _("media-type.photographic"); /* TRANSLATORS: Photographic Archival */ _("media-type.photographic-archival"); /* TRANSLATORS: Photo Film */ _("media-type.photographic-film"); /* TRANSLATORS: Glossy Photo Paper */ _("media-type.photographic-glossy"); /* TRANSLATORS: High Gloss Photo Paper */ _("media-type.photographic-high-gloss"); /* TRANSLATORS: Matte Photo Paper */ _("media-type.photographic-matte"); /* TRANSLATORS: Satin Photo Paper */ _("media-type.photographic-satin"); /* TRANSLATORS: Semi-Gloss Photo Paper */ _("media-type.photographic-semi-gloss"); /* TRANSLATORS: Plastic */ _("media-type.plastic"); /* TRANSLATORS: Plastic Archival */ _("media-type.plastic-archival"); /* TRANSLATORS: Plastic Colored */ _("media-type.plastic-colored"); /* TRANSLATORS: Plastic Glossy */ _("media-type.plastic-glossy"); /* TRANSLATORS: Plastic High Gloss */ _("media-type.plastic-high-gloss"); /* TRANSLATORS: Plastic Matte */ _("media-type.plastic-matte"); /* TRANSLATORS: Plastic Satin */ _("media-type.plastic-satin"); /* TRANSLATORS: Plastic Semi Gloss */ _("media-type.plastic-semi-gloss"); /* TRANSLATORS: Plate */ _("media-type.plate"); /* TRANSLATORS: Polyester */ _("media-type.polyester"); /* TRANSLATORS: Pre Cut Tabs */ _("media-type.pre-cut-tabs"); /* TRANSLATORS: Roll */ _("media-type.roll"); /* TRANSLATORS: Screen */ _("media-type.screen"); /* TRANSLATORS: Screen Paged */ _("media-type.screen-paged"); /* TRANSLATORS: Self Adhesive */ _("media-type.self-adhesive"); /* TRANSLATORS: Self Adhesive Film */ _("media-type.self-adhesive-film"); /* TRANSLATORS: Shrink Foil */ _("media-type.shrink-foil"); /* TRANSLATORS: Single Face */ _("media-type.single-face"); /* TRANSLATORS: Single Wall */ _("media-type.single-wall"); /* TRANSLATORS: Sleeve */ _("media-type.sleeve"); /* TRANSLATORS: Stationery */ _("media-type.stationery"); /* TRANSLATORS: Stationery Archival */ _("media-type.stationery-archival"); /* TRANSLATORS: Coated Paper */ _("media-type.stationery-coated"); /* TRANSLATORS: Stationery Cotton */ _("media-type.stationery-cotton"); /* TRANSLATORS: Vellum Paper */ _("media-type.stationery-fine"); /* TRANSLATORS: Heavyweight Paper */ _("media-type.stationery-heavyweight"); /* TRANSLATORS: Stationery Heavyweight Coated */ _("media-type.stationery-heavyweight-coated"); /* TRANSLATORS: Stationery Inkjet Paper */ _("media-type.stationery-inkjet"); /* TRANSLATORS: Letterhead */ _("media-type.stationery-letterhead"); /* TRANSLATORS: Lightweight Paper */ _("media-type.stationery-lightweight"); /* TRANSLATORS: Preprinted Paper */ _("media-type.stationery-preprinted"); /* TRANSLATORS: Punched Paper */ _("media-type.stationery-prepunched"); /* TRANSLATORS: Tab Stock */ _("media-type.tab-stock"); /* TRANSLATORS: Tractor */ _("media-type.tractor"); /* TRANSLATORS: Transfer */ _("media-type.transfer"); /* TRANSLATORS: Transparency */ _("media-type.transparency"); /* TRANSLATORS: Triple Wall */ _("media-type.triple-wall"); /* TRANSLATORS: Wet Film */ _("media-type.wet-film"); /* TRANSLATORS: Media Weight (grams per m²) */ _("media-weight-metric"); /* TRANSLATORS: 28 x 40″ */ _("media.asme_f_28x40in"); /* TRANSLATORS: A4 or US Letter */ _("media.choice_iso_a4_210x297mm_na_letter_8.5x11in"); /* TRANSLATORS: 2a0 */ _("media.iso_2a0_1189x1682mm"); /* TRANSLATORS: A0 */ _("media.iso_a0_841x1189mm"); /* TRANSLATORS: A0x3 */ _("media.iso_a0x3_1189x2523mm"); /* TRANSLATORS: A10 */ _("media.iso_a10_26x37mm"); /* TRANSLATORS: A1 */ _("media.iso_a1_594x841mm"); /* TRANSLATORS: A1x3 */ _("media.iso_a1x3_841x1783mm"); /* TRANSLATORS: A1x4 */ _("media.iso_a1x4_841x2378mm"); /* TRANSLATORS: A2 */ _("media.iso_a2_420x594mm"); /* TRANSLATORS: A2x3 */ _("media.iso_a2x3_594x1261mm"); /* TRANSLATORS: A2x4 */ _("media.iso_a2x4_594x1682mm"); /* TRANSLATORS: A2x5 */ _("media.iso_a2x5_594x2102mm"); /* TRANSLATORS: A3 (Extra) */ _("media.iso_a3-extra_322x445mm"); /* TRANSLATORS: A3 */ _("media.iso_a3_297x420mm"); /* TRANSLATORS: A3x3 */ _("media.iso_a3x3_420x891mm"); /* TRANSLATORS: A3x4 */ _("media.iso_a3x4_420x1189mm"); /* TRANSLATORS: A3x5 */ _("media.iso_a3x5_420x1486mm"); /* TRANSLATORS: A3x6 */ _("media.iso_a3x6_420x1783mm"); /* TRANSLATORS: A3x7 */ _("media.iso_a3x7_420x2080mm"); /* TRANSLATORS: A4 (Extra) */ _("media.iso_a4-extra_235.5x322.3mm"); /* TRANSLATORS: A4 (Tab) */ _("media.iso_a4-tab_225x297mm"); /* TRANSLATORS: A4 */ _("media.iso_a4_210x297mm"); /* TRANSLATORS: A4x3 */ _("media.iso_a4x3_297x630mm"); /* TRANSLATORS: A4x4 */ _("media.iso_a4x4_297x841mm"); /* TRANSLATORS: A4x5 */ _("media.iso_a4x5_297x1051mm"); /* TRANSLATORS: A4x6 */ _("media.iso_a4x6_297x1261mm"); /* TRANSLATORS: A4x7 */ _("media.iso_a4x7_297x1471mm"); /* TRANSLATORS: A4x8 */ _("media.iso_a4x8_297x1682mm"); /* TRANSLATORS: A4x9 */ _("media.iso_a4x9_297x1892mm"); /* TRANSLATORS: A5 (Extra) */ _("media.iso_a5-extra_174x235mm"); /* TRANSLATORS: A5 */ _("media.iso_a5_148x210mm"); /* TRANSLATORS: A6 */ _("media.iso_a6_105x148mm"); /* TRANSLATORS: A7 */ _("media.iso_a7_74x105mm"); /* TRANSLATORS: A8 */ _("media.iso_a8_52x74mm"); /* TRANSLATORS: A9 */ _("media.iso_a9_37x52mm"); /* TRANSLATORS: B0 */ _("media.iso_b0_1000x1414mm"); /* TRANSLATORS: B10 */ _("media.iso_b10_31x44mm"); /* TRANSLATORS: B1 */ _("media.iso_b1_707x1000mm"); /* TRANSLATORS: B2 */ _("media.iso_b2_500x707mm"); /* TRANSLATORS: B3 */ _("media.iso_b3_353x500mm"); /* TRANSLATORS: B4 */ _("media.iso_b4_250x353mm"); /* TRANSLATORS: B5 (Extra) */ _("media.iso_b5-extra_201x276mm"); /* TRANSLATORS: Envelope B5 */ _("media.iso_b5_176x250mm"); /* TRANSLATORS: B6 */ _("media.iso_b6_125x176mm"); /* TRANSLATORS: Envelope B6/C4 */ _("media.iso_b6c4_125x324mm"); /* TRANSLATORS: B7 */ _("media.iso_b7_88x125mm"); /* TRANSLATORS: B8 */ _("media.iso_b8_62x88mm"); /* TRANSLATORS: B9 */ _("media.iso_b9_44x62mm"); /* TRANSLATORS: CEnvelope 0 */ _("media.iso_c0_917x1297mm"); /* TRANSLATORS: CEnvelope 10 */ _("media.iso_c10_28x40mm"); /* TRANSLATORS: CEnvelope 1 */ _("media.iso_c1_648x917mm"); /* TRANSLATORS: CEnvelope 2 */ _("media.iso_c2_458x648mm"); /* TRANSLATORS: CEnvelope 3 */ _("media.iso_c3_324x458mm"); /* TRANSLATORS: CEnvelope 4 */ _("media.iso_c4_229x324mm"); /* TRANSLATORS: CEnvelope 5 */ _("media.iso_c5_162x229mm"); /* TRANSLATORS: CEnvelope 6 */ _("media.iso_c6_114x162mm"); /* TRANSLATORS: CEnvelope 6c5 */ _("media.iso_c6c5_114x229mm"); /* TRANSLATORS: CEnvelope 7 */ _("media.iso_c7_81x114mm"); /* TRANSLATORS: CEnvelope 7c6 */ _("media.iso_c7c6_81x162mm"); /* TRANSLATORS: CEnvelope 8 */ _("media.iso_c8_57x81mm"); /* TRANSLATORS: CEnvelope 9 */ _("media.iso_c9_40x57mm"); /* TRANSLATORS: Envelope DL */ _("media.iso_dl_110x220mm"); /* TRANSLATORS: Id-1 */ _("media.iso_id-1_53.98x85.6mm"); /* TRANSLATORS: Id-3 */ _("media.iso_id-3_88x125mm"); /* TRANSLATORS: ISO RA0 */ _("media.iso_ra0_860x1220mm"); /* TRANSLATORS: ISO RA1 */ _("media.iso_ra1_610x860mm"); /* TRANSLATORS: ISO RA2 */ _("media.iso_ra2_430x610mm"); /* TRANSLATORS: ISO RA3 */ _("media.iso_ra3_305x430mm"); /* TRANSLATORS: ISO RA4 */ _("media.iso_ra4_215x305mm"); /* TRANSLATORS: ISO SRA0 */ _("media.iso_sra0_900x1280mm"); /* TRANSLATORS: ISO SRA1 */ _("media.iso_sra1_640x900mm"); /* TRANSLATORS: ISO SRA2 */ _("media.iso_sra2_450x640mm"); /* TRANSLATORS: ISO SRA3 */ _("media.iso_sra3_320x450mm"); /* TRANSLATORS: ISO SRA4 */ _("media.iso_sra4_225x320mm"); /* TRANSLATORS: JIS B0 */ _("media.jis_b0_1030x1456mm"); /* TRANSLATORS: JIS B10 */ _("media.jis_b10_32x45mm"); /* TRANSLATORS: JIS B1 */ _("media.jis_b1_728x1030mm"); /* TRANSLATORS: JIS B2 */ _("media.jis_b2_515x728mm"); /* TRANSLATORS: JIS B3 */ _("media.jis_b3_364x515mm"); /* TRANSLATORS: JIS B4 */ _("media.jis_b4_257x364mm"); /* TRANSLATORS: JIS B5 */ _("media.jis_b5_182x257mm"); /* TRANSLATORS: JIS B6 */ _("media.jis_b6_128x182mm"); /* TRANSLATORS: JIS B7 */ _("media.jis_b7_91x128mm"); /* TRANSLATORS: JIS B8 */ _("media.jis_b8_64x91mm"); /* TRANSLATORS: JIS B9 */ _("media.jis_b9_45x64mm"); /* TRANSLATORS: JIS Executive */ _("media.jis_exec_216x330mm"); /* TRANSLATORS: Envelope Chou 2 */ _("media.jpn_chou2_111.1x146mm"); /* TRANSLATORS: Envelope Chou 3 */ _("media.jpn_chou3_120x235mm"); /* TRANSLATORS: Envelope Chou 40 */ _("media.jpn_chou40_90x225mm"); /* TRANSLATORS: Envelope Chou 4 */ _("media.jpn_chou4_90x205mm"); /* TRANSLATORS: Hagaki */ _("media.jpn_hagaki_100x148mm"); /* TRANSLATORS: Envelope Kahu */ _("media.jpn_kahu_240x322.1mm"); /* TRANSLATORS: 270 x 382mm */ _("media.jpn_kaku1_270x382mm"); /* TRANSLATORS: Envelope Kahu 2 */ _("media.jpn_kaku2_240x332mm"); /* TRANSLATORS: 216 x 277mm */ _("media.jpn_kaku3_216x277mm"); /* TRANSLATORS: 197 x 267mm */ _("media.jpn_kaku4_197x267mm"); /* TRANSLATORS: 190 x 240mm */ _("media.jpn_kaku5_190x240mm"); /* TRANSLATORS: 142 x 205mm */ _("media.jpn_kaku7_142x205mm"); /* TRANSLATORS: 119 x 197mm */ _("media.jpn_kaku8_119x197mm"); /* TRANSLATORS: Oufuku Reply Postcard */ _("media.jpn_oufuku_148x200mm"); /* TRANSLATORS: Envelope You 4 */ _("media.jpn_you4_105x235mm"); /* TRANSLATORS: 10 x 11″ */ _("media.na_10x11_10x11in"); /* TRANSLATORS: 10 x 13″ */ _("media.na_10x13_10x13in"); /* TRANSLATORS: 10 x 14″ */ _("media.na_10x14_10x14in"); /* TRANSLATORS: 10 x 15″ */ _("media.na_10x15_10x15in"); /* TRANSLATORS: 11 x 12″ */ _("media.na_11x12_11x12in"); /* TRANSLATORS: 11 x 15″ */ _("media.na_11x15_11x15in"); /* TRANSLATORS: 12 x 19″ */ _("media.na_12x19_12x19in"); /* TRANSLATORS: 5 x 7″ */ _("media.na_5x7_5x7in"); /* TRANSLATORS: 6 x 9″ */ _("media.na_6x9_6x9in"); /* TRANSLATORS: 7 x 9″ */ _("media.na_7x9_7x9in"); /* TRANSLATORS: 9 x 11″ */ _("media.na_9x11_9x11in"); /* TRANSLATORS: Envelope A2 */ _("media.na_a2_4.375x5.75in"); /* TRANSLATORS: 9 x 12″ */ _("media.na_arch-a_9x12in"); /* TRANSLATORS: 12 x 18″ */ _("media.na_arch-b_12x18in"); /* TRANSLATORS: 18 x 24″ */ _("media.na_arch-c_18x24in"); /* TRANSLATORS: 24 x 36″ */ _("media.na_arch-d_24x36in"); /* TRANSLATORS: 26 x 38″ */ _("media.na_arch-e2_26x38in"); /* TRANSLATORS: 27 x 39″ */ _("media.na_arch-e3_27x39in"); /* TRANSLATORS: 36 x 48″ */ _("media.na_arch-e_36x48in"); /* TRANSLATORS: 12 x 19.17″ */ _("media.na_b-plus_12x19.17in"); /* TRANSLATORS: Envelope C5 */ _("media.na_c5_6.5x9.5in"); /* TRANSLATORS: 17 x 22″ */ _("media.na_c_17x22in"); /* TRANSLATORS: 22 x 34″ */ _("media.na_d_22x34in"); /* TRANSLATORS: 34 x 44″ */ _("media.na_e_34x44in"); /* TRANSLATORS: 11 x 14″ */ _("media.na_edp_11x14in"); /* TRANSLATORS: 12 x 14″ */ _("media.na_eur-edp_12x14in"); /* TRANSLATORS: Executive */ _("media.na_executive_7.25x10.5in"); /* TRANSLATORS: 44 x 68″ */ _("media.na_f_44x68in"); /* TRANSLATORS: European Fanfold */ _("media.na_fanfold-eur_8.5x12in"); /* TRANSLATORS: US Fanfold */ _("media.na_fanfold-us_11x14.875in"); /* TRANSLATORS: Foolscap */ _("media.na_foolscap_8.5x13in"); /* TRANSLATORS: 8 x 13″ */ _("media.na_govt-legal_8x13in"); /* TRANSLATORS: 8 x 10″ */ _("media.na_govt-letter_8x10in"); /* TRANSLATORS: 3 x 5″ */ _("media.na_index-3x5_3x5in"); /* TRANSLATORS: 6 x 8″ */ _("media.na_index-4x6-ext_6x8in"); /* TRANSLATORS: 4 x 6″ */ _("media.na_index-4x6_4x6in"); /* TRANSLATORS: 5 x 8″ */ _("media.na_index-5x8_5x8in"); /* TRANSLATORS: Statement */ _("media.na_invoice_5.5x8.5in"); /* TRANSLATORS: 11 x 17″ */ _("media.na_ledger_11x17in"); /* TRANSLATORS: US Legal (Extra) */ _("media.na_legal-extra_9.5x15in"); /* TRANSLATORS: US Legal */ _("media.na_legal_8.5x14in"); /* TRANSLATORS: US Letter (Extra) */ _("media.na_letter-extra_9.5x12in"); /* TRANSLATORS: US Letter (Plus) */ _("media.na_letter-plus_8.5x12.69in"); /* TRANSLATORS: US Letter */ _("media.na_letter_8.5x11in"); /* TRANSLATORS: Envelope Monarch */ _("media.na_monarch_3.875x7.5in"); /* TRANSLATORS: Envelope #10 */ _("media.na_number-10_4.125x9.5in"); /* TRANSLATORS: Envelope #11 */ _("media.na_number-11_4.5x10.375in"); /* TRANSLATORS: Envelope #12 */ _("media.na_number-12_4.75x11in"); /* TRANSLATORS: Envelope #14 */ _("media.na_number-14_5x11.5in"); /* TRANSLATORS: Envelope #9 */ _("media.na_number-9_3.875x8.875in"); /* TRANSLATORS: 8.5 x 13.4″ */ _("media.na_oficio_8.5x13.4in"); /* TRANSLATORS: Envelope Personal */ _("media.na_personal_3.625x6.5in"); /* TRANSLATORS: Quarto */ _("media.na_quarto_8.5x10.83in"); /* TRANSLATORS: 8.94 x 14″ */ _("media.na_super-a_8.94x14in"); /* TRANSLATORS: 13 x 19″ */ _("media.na_super-b_13x19in"); /* TRANSLATORS: 30 x 42″ */ _("media.na_wide-format_30x42in"); /* TRANSLATORS: 12 x 16″ */ _("media.oe_12x16_12x16in"); /* TRANSLATORS: 14 x 17″ */ _("media.oe_14x17_14x17in"); /* TRANSLATORS: 18 x 22″ */ _("media.oe_18x22_18x22in"); /* TRANSLATORS: 17 x 24″ */ _("media.oe_a2plus_17x24in"); /* TRANSLATORS: 2 x 3.5″ */ _("media.oe_business-card_2x3.5in"); /* TRANSLATORS: 10 x 12″ */ _("media.oe_photo-10r_10x12in"); /* TRANSLATORS: 20 x 24″ */ _("media.oe_photo-20r_20x24in"); /* TRANSLATORS: 3.5 x 5″ */ _("media.oe_photo-l_3.5x5in"); /* TRANSLATORS: 10 x 15″ */ _("media.oe_photo-s10r_10x15in"); /* TRANSLATORS: 4 x 4″ */ _("media.oe_square-photo_4x4in"); /* TRANSLATORS: 5 x 5″ */ _("media.oe_square-photo_5x5in"); /* TRANSLATORS: 184 x 260mm */ _("media.om_16k_184x260mm"); /* TRANSLATORS: 195 x 270mm */ _("media.om_16k_195x270mm"); /* TRANSLATORS: 55 x 85mm */ _("media.om_business-card_55x85mm"); /* TRANSLATORS: 55 x 91mm */ _("media.om_business-card_55x91mm"); /* TRANSLATORS: 54 x 86mm */ _("media.om_card_54x86mm"); /* TRANSLATORS: 275 x 395mm */ _("media.om_dai-pa-kai_275x395mm"); /* TRANSLATORS: 89 x 119mm */ _("media.om_dsc-photo_89x119mm"); /* TRANSLATORS: Folio */ _("media.om_folio-sp_215x315mm"); /* TRANSLATORS: Folio (Special) */ _("media.om_folio_210x330mm"); /* TRANSLATORS: Envelope Invitation */ _("media.om_invite_220x220mm"); /* TRANSLATORS: Envelope Italian */ _("media.om_italian_110x230mm"); /* TRANSLATORS: 198 x 275mm */ _("media.om_juuro-ku-kai_198x275mm"); /* TRANSLATORS: 200 x 300 */ _("media.om_large-photo_200x300"); /* TRANSLATORS: 130 x 180mm */ _("media.om_medium-photo_130x180mm"); /* TRANSLATORS: 267 x 389mm */ _("media.om_pa-kai_267x389mm"); /* TRANSLATORS: Envelope Postfix */ _("media.om_postfix_114x229mm"); /* TRANSLATORS: 100 x 150mm */ _("media.om_small-photo_100x150mm"); /* TRANSLATORS: 89 x 89mm */ _("media.om_square-photo_89x89mm"); /* TRANSLATORS: 100 x 200mm */ _("media.om_wide-photo_100x200mm"); /* TRANSLATORS: Envelope Chinese #10 */ _("media.prc_10_324x458mm"); /* TRANSLATORS: Chinese 16k */ _("media.prc_16k_146x215mm"); /* TRANSLATORS: Envelope Chinese #1 */ _("media.prc_1_102x165mm"); /* TRANSLATORS: Envelope Chinese #2 */ _("media.prc_2_102x176mm"); /* TRANSLATORS: Chinese 32k */ _("media.prc_32k_97x151mm"); /* TRANSLATORS: Envelope Chinese #3 */ _("media.prc_3_125x176mm"); /* TRANSLATORS: Envelope Chinese #4 */ _("media.prc_4_110x208mm"); /* TRANSLATORS: Envelope Chinese #5 */ _("media.prc_5_110x220mm"); /* TRANSLATORS: Envelope Chinese #6 */ _("media.prc_6_120x320mm"); /* TRANSLATORS: Envelope Chinese #7 */ _("media.prc_7_160x230mm"); /* TRANSLATORS: Envelope Chinese #8 */ _("media.prc_8_120x309mm"); /* TRANSLATORS: ROC 16k */ _("media.roc_16k_7.75x10.75in"); /* TRANSLATORS: ROC 8k */ _("media.roc_8k_10.75x15.5in"); /* TRANSLATORS: Multiple Document Handling */ _("multiple-document-handling"); /* TRANSLATORS: Separate Documents Collated Copies */ _("multiple-document-handling.separate-documents-collated-copies"); /* TRANSLATORS: Separate Documents Uncollated Copies */ _("multiple-document-handling.separate-documents-uncollated-copies"); /* TRANSLATORS: Single Document */ _("multiple-document-handling.single-document"); /* TRANSLATORS: Single Document New Sheet */ _("multiple-document-handling.single-document-new-sheet"); /* TRANSLATORS: Multiple Object Handling */ _("multiple-object-handling"); /* TRANSLATORS: Multiple Object Handling Actual */ _("multiple-object-handling-actual"); /* TRANSLATORS: Automatic */ _("multiple-object-handling.auto"); /* TRANSLATORS: Best Fit */ _("multiple-object-handling.best-fit"); /* TRANSLATORS: Best Quality */ _("multiple-object-handling.best-quality"); /* TRANSLATORS: Best Speed */ _("multiple-object-handling.best-speed"); /* TRANSLATORS: One At A Time */ _("multiple-object-handling.one-at-a-time"); /* TRANSLATORS: On Timeout */ _("multiple-operation-time-out-action"); /* TRANSLATORS: Abort Job */ _("multiple-operation-time-out-action.abort-job"); /* TRANSLATORS: Hold Job */ _("multiple-operation-time-out-action.hold-job"); /* TRANSLATORS: Process Job */ _("multiple-operation-time-out-action.process-job"); /* TRANSLATORS: Noise Removal */ _("noise-removal"); /* TRANSLATORS: Notify Attributes */ _("notify-attributes"); /* TRANSLATORS: Notify Charset */ _("notify-charset"); /* TRANSLATORS: Notify Events */ _("notify-events"); /* TRANSLATORS: Document Completed */ _("notify-events.document-completed"); /* TRANSLATORS: Document Config Changed */ _("notify-events.document-config-changed"); /* TRANSLATORS: Document Created */ _("notify-events.document-created"); /* TRANSLATORS: Document Fetchable */ _("notify-events.document-fetchable"); /* TRANSLATORS: Document State Changed */ _("notify-events.document-state-changed"); /* TRANSLATORS: Document Stopped */ _("notify-events.document-stopped"); /* TRANSLATORS: Job Completed */ _("notify-events.job-completed"); /* TRANSLATORS: Job Config Changed */ _("notify-events.job-config-changed"); /* TRANSLATORS: Job Created */ _("notify-events.job-created"); /* TRANSLATORS: Job Fetchable */ _("notify-events.job-fetchable"); /* TRANSLATORS: Job Progress */ _("notify-events.job-progress"); /* TRANSLATORS: Job State Changed */ _("notify-events.job-state-changed"); /* TRANSLATORS: Job Stopped */ _("notify-events.job-stopped"); /* TRANSLATORS: None */ _("notify-events.none"); /* TRANSLATORS: Printer Config Changed */ _("notify-events.printer-config-changed"); /* TRANSLATORS: Printer Finishings Changed */ _("notify-events.printer-finishings-changed"); /* TRANSLATORS: Printer Media Changed */ _("notify-events.printer-media-changed"); /* TRANSLATORS: Printer Queue Order Changed */ _("notify-events.printer-queue-order-changed"); /* TRANSLATORS: Printer Restarted */ _("notify-events.printer-restarted"); /* TRANSLATORS: Printer Shutdown */ _("notify-events.printer-shutdown"); /* TRANSLATORS: Printer State Changed */ _("notify-events.printer-state-changed"); /* TRANSLATORS: Printer Stopped */ _("notify-events.printer-stopped"); /* TRANSLATORS: Notify Get Interval */ _("notify-get-interval"); /* TRANSLATORS: Notify Lease Duration */ _("notify-lease-duration"); /* TRANSLATORS: Notify Natural Language */ _("notify-natural-language"); /* TRANSLATORS: Notify Pull Method */ _("notify-pull-method"); /* TRANSLATORS: Notify Recipient */ _("notify-recipient-uri"); /* TRANSLATORS: Notify Sequence Numbers */ _("notify-sequence-numbers"); /* TRANSLATORS: Notify Subscription Ids */ _("notify-subscription-ids"); /* TRANSLATORS: Notify Time Interval */ _("notify-time-interval"); /* TRANSLATORS: Notify User Data */ _("notify-user-data"); /* TRANSLATORS: Notify Wait */ _("notify-wait"); /* TRANSLATORS: Number Of Retries */ _("number-of-retries"); /* TRANSLATORS: Number-Up */ _("number-up"); /* TRANSLATORS: Object Offset */ _("object-offset"); /* TRANSLATORS: Object Size */ _("object-size"); /* TRANSLATORS: Organization Name */ _("organization-name"); /* TRANSLATORS: Orientation */ _("orientation-requested"); /* TRANSLATORS: Portrait */ _("orientation-requested.3"); /* TRANSLATORS: Landscape */ _("orientation-requested.4"); /* TRANSLATORS: Reverse Landscape */ _("orientation-requested.5"); /* TRANSLATORS: Reverse Portrait */ _("orientation-requested.6"); /* TRANSLATORS: None */ _("orientation-requested.7"); /* TRANSLATORS: Scanned Image Options */ _("output-attributes"); /* TRANSLATORS: Output Tray */ _("output-bin"); /* TRANSLATORS: Automatic */ _("output-bin.auto"); /* TRANSLATORS: Bottom */ _("output-bin.bottom"); /* TRANSLATORS: Center */ _("output-bin.center"); /* TRANSLATORS: Face Down */ _("output-bin.face-down"); /* TRANSLATORS: Face Up */ _("output-bin.face-up"); /* TRANSLATORS: Large Capacity */ _("output-bin.large-capacity"); /* TRANSLATORS: Left */ _("output-bin.left"); /* TRANSLATORS: Mailbox 1 */ _("output-bin.mailbox-1"); /* TRANSLATORS: Mailbox 10 */ _("output-bin.mailbox-10"); /* TRANSLATORS: Mailbox 2 */ _("output-bin.mailbox-2"); /* TRANSLATORS: Mailbox 3 */ _("output-bin.mailbox-3"); /* TRANSLATORS: Mailbox 4 */ _("output-bin.mailbox-4"); /* TRANSLATORS: Mailbox 5 */ _("output-bin.mailbox-5"); /* TRANSLATORS: Mailbox 6 */ _("output-bin.mailbox-6"); /* TRANSLATORS: Mailbox 7 */ _("output-bin.mailbox-7"); /* TRANSLATORS: Mailbox 8 */ _("output-bin.mailbox-8"); /* TRANSLATORS: Mailbox 9 */ _("output-bin.mailbox-9"); /* TRANSLATORS: Middle */ _("output-bin.middle"); /* TRANSLATORS: My Mailbox */ _("output-bin.my-mailbox"); /* TRANSLATORS: Rear */ _("output-bin.rear"); /* TRANSLATORS: Right */ _("output-bin.right"); /* TRANSLATORS: Side */ _("output-bin.side"); /* TRANSLATORS: Stacker 1 */ _("output-bin.stacker-1"); /* TRANSLATORS: Stacker 10 */ _("output-bin.stacker-10"); /* TRANSLATORS: Stacker 2 */ _("output-bin.stacker-2"); /* TRANSLATORS: Stacker 3 */ _("output-bin.stacker-3"); /* TRANSLATORS: Stacker 4 */ _("output-bin.stacker-4"); /* TRANSLATORS: Stacker 5 */ _("output-bin.stacker-5"); /* TRANSLATORS: Stacker 6 */ _("output-bin.stacker-6"); /* TRANSLATORS: Stacker 7 */ _("output-bin.stacker-7"); /* TRANSLATORS: Stacker 8 */ _("output-bin.stacker-8"); /* TRANSLATORS: Stacker 9 */ _("output-bin.stacker-9"); /* TRANSLATORS: Top */ _("output-bin.top"); /* TRANSLATORS: Tray 1 */ _("output-bin.tray-1"); /* TRANSLATORS: Tray 10 */ _("output-bin.tray-10"); /* TRANSLATORS: Tray 2 */ _("output-bin.tray-2"); /* TRANSLATORS: Tray 3 */ _("output-bin.tray-3"); /* TRANSLATORS: Tray 4 */ _("output-bin.tray-4"); /* TRANSLATORS: Tray 5 */ _("output-bin.tray-5"); /* TRANSLATORS: Tray 6 */ _("output-bin.tray-6"); /* TRANSLATORS: Tray 7 */ _("output-bin.tray-7"); /* TRANSLATORS: Tray 8 */ _("output-bin.tray-8"); /* TRANSLATORS: Tray 9 */ _("output-bin.tray-9"); /* TRANSLATORS: Scanned Image Quality */ _("output-compression-quality-factor"); /* TRANSLATORS: Page Delivery */ _("page-delivery"); /* TRANSLATORS: Reverse Order Face-down */ _("page-delivery.reverse-order-face-down"); /* TRANSLATORS: Reverse Order Face-up */ _("page-delivery.reverse-order-face-up"); /* TRANSLATORS: Same Order Face-down */ _("page-delivery.same-order-face-down"); /* TRANSLATORS: Same Order Face-up */ _("page-delivery.same-order-face-up"); /* TRANSLATORS: System Specified */ _("page-delivery.system-specified"); /* TRANSLATORS: Page Order Received */ _("page-order-received"); /* TRANSLATORS: 1 To N */ _("page-order-received.1-to-n-order"); /* TRANSLATORS: N To 1 */ _("page-order-received.n-to-1-order"); /* TRANSLATORS: Page Ranges */ _("page-ranges"); /* TRANSLATORS: Pages */ _("pages"); /* TRANSLATORS: Pages Per Subset */ _("pages-per-subset"); /* TRANSLATORS: Pclm Raster Back Side */ _("pclm-raster-back-side"); /* TRANSLATORS: Flipped */ _("pclm-raster-back-side.flipped"); /* TRANSLATORS: Normal */ _("pclm-raster-back-side.normal"); /* TRANSLATORS: Rotated */ _("pclm-raster-back-side.rotated"); /* TRANSLATORS: Pclm Source Resolution */ _("pclm-source-resolution"); /* TRANSLATORS: Platform Shape */ _("platform-shape"); /* TRANSLATORS: Round */ _("platform-shape.ellipse"); /* TRANSLATORS: Rectangle */ _("platform-shape.rectangle"); /* TRANSLATORS: Platform Temperature */ _("platform-temperature"); /* TRANSLATORS: Post-dial String */ _("post-dial-string"); /* TRANSLATORS: Pre-dial String */ _("pre-dial-string"); /* TRANSLATORS: Number-Up Layout */ _("presentation-direction-number-up"); /* TRANSLATORS: Top-bottom, Right-left */ _("presentation-direction-number-up.tobottom-toleft"); /* TRANSLATORS: Top-bottom, Left-right */ _("presentation-direction-number-up.tobottom-toright"); /* TRANSLATORS: Right-left, Top-bottom */ _("presentation-direction-number-up.toleft-tobottom"); /* TRANSLATORS: Right-left, Bottom-top */ _("presentation-direction-number-up.toleft-totop"); /* TRANSLATORS: Left-right, Top-bottom */ _("presentation-direction-number-up.toright-tobottom"); /* TRANSLATORS: Left-right, Bottom-top */ _("presentation-direction-number-up.toright-totop"); /* TRANSLATORS: Bottom-top, Right-left */ _("presentation-direction-number-up.totop-toleft"); /* TRANSLATORS: Bottom-top, Left-right */ _("presentation-direction-number-up.totop-toright"); /* TRANSLATORS: Print Accuracy */ _("print-accuracy"); /* TRANSLATORS: Print Base */ _("print-base"); /* TRANSLATORS: Print Base Actual */ _("print-base-actual"); /* TRANSLATORS: Brim */ _("print-base.brim"); /* TRANSLATORS: None */ _("print-base.none"); /* TRANSLATORS: Raft */ _("print-base.raft"); /* TRANSLATORS: Skirt */ _("print-base.skirt"); /* TRANSLATORS: Standard */ _("print-base.standard"); /* TRANSLATORS: Print Color Mode */ _("print-color-mode"); /* TRANSLATORS: Automatic */ _("print-color-mode.auto"); /* TRANSLATORS: Auto Monochrome */ _("print-color-mode.auto-monochrome"); /* TRANSLATORS: Text */ _("print-color-mode.bi-level"); /* TRANSLATORS: Color */ _("print-color-mode.color"); /* TRANSLATORS: Highlight */ _("print-color-mode.highlight"); /* TRANSLATORS: Monochrome */ _("print-color-mode.monochrome"); /* TRANSLATORS: Process Text */ _("print-color-mode.process-bi-level"); /* TRANSLATORS: Process Monochrome */ _("print-color-mode.process-monochrome"); /* TRANSLATORS: Print Optimization */ _("print-content-optimize"); /* TRANSLATORS: Print Content Optimize Actual */ _("print-content-optimize-actual"); /* TRANSLATORS: Automatic */ _("print-content-optimize.auto"); /* TRANSLATORS: Graphics */ _("print-content-optimize.graphic"); /* TRANSLATORS: Graphics */ _("print-content-optimize.graphics"); /* TRANSLATORS: Photo */ _("print-content-optimize.photo"); /* TRANSLATORS: Text */ _("print-content-optimize.text"); /* TRANSLATORS: Text and Graphics */ _("print-content-optimize.text-and-graphic"); /* TRANSLATORS: Text And Graphics */ _("print-content-optimize.text-and-graphics"); /* TRANSLATORS: Print Objects */ _("print-objects"); /* TRANSLATORS: Print Quality */ _("print-quality"); /* TRANSLATORS: Draft */ _("print-quality.3"); /* TRANSLATORS: Normal */ _("print-quality.4"); /* TRANSLATORS: High */ _("print-quality.5"); /* TRANSLATORS: Print Rendering Intent */ _("print-rendering-intent"); /* TRANSLATORS: Absolute */ _("print-rendering-intent.absolute"); /* TRANSLATORS: Automatic */ _("print-rendering-intent.auto"); /* TRANSLATORS: Perceptual */ _("print-rendering-intent.perceptual"); /* TRANSLATORS: Relative */ _("print-rendering-intent.relative"); /* TRANSLATORS: Relative w/Black Point Compensation */ _("print-rendering-intent.relative-bpc"); /* TRANSLATORS: Saturation */ _("print-rendering-intent.saturation"); /* TRANSLATORS: Print Scaling */ _("print-scaling"); /* TRANSLATORS: Automatic */ _("print-scaling.auto"); /* TRANSLATORS: Auto-fit */ _("print-scaling.auto-fit"); /* TRANSLATORS: Fill */ _("print-scaling.fill"); /* TRANSLATORS: Fit */ _("print-scaling.fit"); /* TRANSLATORS: None */ _("print-scaling.none"); /* TRANSLATORS: Print Supports */ _("print-supports"); /* TRANSLATORS: Print Supports Actual */ _("print-supports-actual"); /* TRANSLATORS: With Specified Material */ _("print-supports.material"); /* TRANSLATORS: None */ _("print-supports.none"); /* TRANSLATORS: Standard */ _("print-supports.standard"); /* TRANSLATORS: Printer Kind */ _("printer-kind"); /* TRANSLATORS: Disc */ _("printer-kind.disc"); /* TRANSLATORS: Document */ _("printer-kind.document"); /* TRANSLATORS: Envelope */ _("printer-kind.envelope"); /* TRANSLATORS: Label */ _("printer-kind.label"); /* TRANSLATORS: Large Format */ _("printer-kind.large-format"); /* TRANSLATORS: Photo */ _("printer-kind.photo"); /* TRANSLATORS: Postcard */ _("printer-kind.postcard"); /* TRANSLATORS: Receipt */ _("printer-kind.receipt"); /* TRANSLATORS: Roll */ _("printer-kind.roll"); /* TRANSLATORS: Message From Operator */ _("printer-message-from-operator"); /* TRANSLATORS: Print Resolution */ _("printer-resolution"); /* TRANSLATORS: Printer State */ _("printer-state"); /* TRANSLATORS: Detailed Printer State */ _("printer-state-reasons"); /* TRANSLATORS: Old Alerts Have Been Removed */ _("printer-state-reasons.alert-removal-of-binary-change-entry"); /* TRANSLATORS: Bander Added */ _("printer-state-reasons.bander-added"); /* TRANSLATORS: Bander Almost Empty */ _("printer-state-reasons.bander-almost-empty"); /* TRANSLATORS: Bander Almost Full */ _("printer-state-reasons.bander-almost-full"); /* TRANSLATORS: Bander At Limit */ _("printer-state-reasons.bander-at-limit"); /* TRANSLATORS: Bander Closed */ _("printer-state-reasons.bander-closed"); /* TRANSLATORS: Bander Configuration Change */ _("printer-state-reasons.bander-configuration-change"); /* TRANSLATORS: Bander Cover Closed */ _("printer-state-reasons.bander-cover-closed"); /* TRANSLATORS: Bander Cover Open */ _("printer-state-reasons.bander-cover-open"); /* TRANSLATORS: Bander Empty */ _("printer-state-reasons.bander-empty"); /* TRANSLATORS: Bander Full */ _("printer-state-reasons.bander-full"); /* TRANSLATORS: Bander Interlock Closed */ _("printer-state-reasons.bander-interlock-closed"); /* TRANSLATORS: Bander Interlock Open */ _("printer-state-reasons.bander-interlock-open"); /* TRANSLATORS: Bander Jam */ _("printer-state-reasons.bander-jam"); /* TRANSLATORS: Bander Life Almost Over */ _("printer-state-reasons.bander-life-almost-over"); /* TRANSLATORS: Bander Life Over */ _("printer-state-reasons.bander-life-over"); /* TRANSLATORS: Bander Memory Exhausted */ _("printer-state-reasons.bander-memory-exhausted"); /* TRANSLATORS: Bander Missing */ _("printer-state-reasons.bander-missing"); /* TRANSLATORS: Bander Motor Failure */ _("printer-state-reasons.bander-motor-failure"); /* TRANSLATORS: Bander Near Limit */ _("printer-state-reasons.bander-near-limit"); /* TRANSLATORS: Bander Offline */ _("printer-state-reasons.bander-offline"); /* TRANSLATORS: Bander Opened */ _("printer-state-reasons.bander-opened"); /* TRANSLATORS: Bander Over Temperature */ _("printer-state-reasons.bander-over-temperature"); /* TRANSLATORS: Bander Power Saver */ _("printer-state-reasons.bander-power-saver"); /* TRANSLATORS: Bander Recoverable Failure */ _("printer-state-reasons.bander-recoverable-failure"); /* TRANSLATORS: Bander Recoverable Storage */ _("printer-state-reasons.bander-recoverable-storage"); /* TRANSLATORS: Bander Removed */ _("printer-state-reasons.bander-removed"); /* TRANSLATORS: Bander Resource Added */ _("printer-state-reasons.bander-resource-added"); /* TRANSLATORS: Bander Resource Removed */ _("printer-state-reasons.bander-resource-removed"); /* TRANSLATORS: Bander Thermistor Failure */ _("printer-state-reasons.bander-thermistor-failure"); /* TRANSLATORS: Bander Timing Failure */ _("printer-state-reasons.bander-timing-failure"); /* TRANSLATORS: Bander Turned Off */ _("printer-state-reasons.bander-turned-off"); /* TRANSLATORS: Bander Turned On */ _("printer-state-reasons.bander-turned-on"); /* TRANSLATORS: Bander Under Temperature */ _("printer-state-reasons.bander-under-temperature"); /* TRANSLATORS: Bander Unrecoverable Failure */ _("printer-state-reasons.bander-unrecoverable-failure"); /* TRANSLATORS: Bander Unrecoverable Storage Error */ _("printer-state-reasons.bander-unrecoverable-storage-error"); /* TRANSLATORS: Bander Warming Up */ _("printer-state-reasons.bander-warming-up"); /* TRANSLATORS: Binder Added */ _("printer-state-reasons.binder-added"); /* TRANSLATORS: Binder Almost Empty */ _("printer-state-reasons.binder-almost-empty"); /* TRANSLATORS: Binder Almost Full */ _("printer-state-reasons.binder-almost-full"); /* TRANSLATORS: Binder At Limit */ _("printer-state-reasons.binder-at-limit"); /* TRANSLATORS: Binder Closed */ _("printer-state-reasons.binder-closed"); /* TRANSLATORS: Binder Configuration Change */ _("printer-state-reasons.binder-configuration-change"); /* TRANSLATORS: Binder Cover Closed */ _("printer-state-reasons.binder-cover-closed"); /* TRANSLATORS: Binder Cover Open */ _("printer-state-reasons.binder-cover-open"); /* TRANSLATORS: Binder Empty */ _("printer-state-reasons.binder-empty"); /* TRANSLATORS: Binder Full */ _("printer-state-reasons.binder-full"); /* TRANSLATORS: Binder Interlock Closed */ _("printer-state-reasons.binder-interlock-closed"); /* TRANSLATORS: Binder Interlock Open */ _("printer-state-reasons.binder-interlock-open"); /* TRANSLATORS: Binder Jam */ _("printer-state-reasons.binder-jam"); /* TRANSLATORS: Binder Life Almost Over */ _("printer-state-reasons.binder-life-almost-over"); /* TRANSLATORS: Binder Life Over */ _("printer-state-reasons.binder-life-over"); /* TRANSLATORS: Binder Memory Exhausted */ _("printer-state-reasons.binder-memory-exhausted"); /* TRANSLATORS: Binder Missing */ _("printer-state-reasons.binder-missing"); /* TRANSLATORS: Binder Motor Failure */ _("printer-state-reasons.binder-motor-failure"); /* TRANSLATORS: Binder Near Limit */ _("printer-state-reasons.binder-near-limit"); /* TRANSLATORS: Binder Offline */ _("printer-state-reasons.binder-offline"); /* TRANSLATORS: Binder Opened */ _("printer-state-reasons.binder-opened"); /* TRANSLATORS: Binder Over Temperature */ _("printer-state-reasons.binder-over-temperature"); /* TRANSLATORS: Binder Power Saver */ _("printer-state-reasons.binder-power-saver"); /* TRANSLATORS: Binder Recoverable Failure */ _("printer-state-reasons.binder-recoverable-failure"); /* TRANSLATORS: Binder Recoverable Storage */ _("printer-state-reasons.binder-recoverable-storage"); /* TRANSLATORS: Binder Removed */ _("printer-state-reasons.binder-removed"); /* TRANSLATORS: Binder Resource Added */ _("printer-state-reasons.binder-resource-added"); /* TRANSLATORS: Binder Resource Removed */ _("printer-state-reasons.binder-resource-removed"); /* TRANSLATORS: Binder Thermistor Failure */ _("printer-state-reasons.binder-thermistor-failure"); /* TRANSLATORS: Binder Timing Failure */ _("printer-state-reasons.binder-timing-failure"); /* TRANSLATORS: Binder Turned Off */ _("printer-state-reasons.binder-turned-off"); /* TRANSLATORS: Binder Turned On */ _("printer-state-reasons.binder-turned-on"); /* TRANSLATORS: Binder Under Temperature */ _("printer-state-reasons.binder-under-temperature"); /* TRANSLATORS: Binder Unrecoverable Failure */ _("printer-state-reasons.binder-unrecoverable-failure"); /* TRANSLATORS: Binder Unrecoverable Storage Error */ _("printer-state-reasons.binder-unrecoverable-storage-error"); /* TRANSLATORS: Binder Warming Up */ _("printer-state-reasons.binder-warming-up"); /* TRANSLATORS: Camera Failure */ _("printer-state-reasons.camera-failure"); /* TRANSLATORS: Chamber Cooling */ _("printer-state-reasons.chamber-cooling"); /* TRANSLATORS: Chamber Failure */ _("printer-state-reasons.chamber-failure"); /* TRANSLATORS: Chamber Heating */ _("printer-state-reasons.chamber-heating"); /* TRANSLATORS: Chamber Temperature High */ _("printer-state-reasons.chamber-temperature-high"); /* TRANSLATORS: Chamber Temperature Low */ _("printer-state-reasons.chamber-temperature-low"); /* TRANSLATORS: Cleaner Life Almost Over */ _("printer-state-reasons.cleaner-life-almost-over"); /* TRANSLATORS: Cleaner Life Over */ _("printer-state-reasons.cleaner-life-over"); /* TRANSLATORS: Configuration Change */ _("printer-state-reasons.configuration-change"); /* TRANSLATORS: Connecting To Device */ _("printer-state-reasons.connecting-to-device"); /* TRANSLATORS: Cover Open */ _("printer-state-reasons.cover-open"); /* TRANSLATORS: Deactivated */ _("printer-state-reasons.deactivated"); /* TRANSLATORS: Developer Empty */ _("printer-state-reasons.developer-empty"); /* TRANSLATORS: Developer Low */ _("printer-state-reasons.developer-low"); /* TRANSLATORS: Die Cutter Added */ _("printer-state-reasons.die-cutter-added"); /* TRANSLATORS: Die Cutter Almost Empty */ _("printer-state-reasons.die-cutter-almost-empty"); /* TRANSLATORS: Die Cutter Almost Full */ _("printer-state-reasons.die-cutter-almost-full"); /* TRANSLATORS: Die Cutter At Limit */ _("printer-state-reasons.die-cutter-at-limit"); /* TRANSLATORS: Die Cutter Closed */ _("printer-state-reasons.die-cutter-closed"); /* TRANSLATORS: Die Cutter Configuration Change */ _("printer-state-reasons.die-cutter-configuration-change"); /* TRANSLATORS: Die Cutter Cover Closed */ _("printer-state-reasons.die-cutter-cover-closed"); /* TRANSLATORS: Die Cutter Cover Open */ _("printer-state-reasons.die-cutter-cover-open"); /* TRANSLATORS: Die Cutter Empty */ _("printer-state-reasons.die-cutter-empty"); /* TRANSLATORS: Die Cutter Full */ _("printer-state-reasons.die-cutter-full"); /* TRANSLATORS: Die Cutter Interlock Closed */ _("printer-state-reasons.die-cutter-interlock-closed"); /* TRANSLATORS: Die Cutter Interlock Open */ _("printer-state-reasons.die-cutter-interlock-open"); /* TRANSLATORS: Die Cutter Jam */ _("printer-state-reasons.die-cutter-jam"); /* TRANSLATORS: Die Cutter Life Almost Over */ _("printer-state-reasons.die-cutter-life-almost-over"); /* TRANSLATORS: Die Cutter Life Over */ _("printer-state-reasons.die-cutter-life-over"); /* TRANSLATORS: Die Cutter Memory Exhausted */ _("printer-state-reasons.die-cutter-memory-exhausted"); /* TRANSLATORS: Die Cutter Missing */ _("printer-state-reasons.die-cutter-missing"); /* TRANSLATORS: Die Cutter Motor Failure */ _("printer-state-reasons.die-cutter-motor-failure"); /* TRANSLATORS: Die Cutter Near Limit */ _("printer-state-reasons.die-cutter-near-limit"); /* TRANSLATORS: Die Cutter Offline */ _("printer-state-reasons.die-cutter-offline"); /* TRANSLATORS: Die Cutter Opened */ _("printer-state-reasons.die-cutter-opened"); /* TRANSLATORS: Die Cutter Over Temperature */ _("printer-state-reasons.die-cutter-over-temperature"); /* TRANSLATORS: Die Cutter Power Saver */ _("printer-state-reasons.die-cutter-power-saver"); /* TRANSLATORS: Die Cutter Recoverable Failure */ _("printer-state-reasons.die-cutter-recoverable-failure"); /* TRANSLATORS: Die Cutter Recoverable Storage */ _("printer-state-reasons.die-cutter-recoverable-storage"); /* TRANSLATORS: Die Cutter Removed */ _("printer-state-reasons.die-cutter-removed"); /* TRANSLATORS: Die Cutter Resource Added */ _("printer-state-reasons.die-cutter-resource-added"); /* TRANSLATORS: Die Cutter Resource Removed */ _("printer-state-reasons.die-cutter-resource-removed"); /* TRANSLATORS: Die Cutter Thermistor Failure */ _("printer-state-reasons.die-cutter-thermistor-failure"); /* TRANSLATORS: Die Cutter Timing Failure */ _("printer-state-reasons.die-cutter-timing-failure"); /* TRANSLATORS: Die Cutter Turned Off */ _("printer-state-reasons.die-cutter-turned-off"); /* TRANSLATORS: Die Cutter Turned On */ _("printer-state-reasons.die-cutter-turned-on"); /* TRANSLATORS: Die Cutter Under Temperature */ _("printer-state-reasons.die-cutter-under-temperature"); /* TRANSLATORS: Die Cutter Unrecoverable Failure */ _("printer-state-reasons.die-cutter-unrecoverable-failure"); /* TRANSLATORS: Die Cutter Unrecoverable Storage Error */ _("printer-state-reasons.die-cutter-unrecoverable-storage-error"); /* TRANSLATORS: Die Cutter Warming Up */ _("printer-state-reasons.die-cutter-warming-up"); /* TRANSLATORS: Door Open */ _("printer-state-reasons.door-open"); /* TRANSLATORS: Extruder Cooling */ _("printer-state-reasons.extruder-cooling"); /* TRANSLATORS: Extruder Failure */ _("printer-state-reasons.extruder-failure"); /* TRANSLATORS: Extruder Heating */ _("printer-state-reasons.extruder-heating"); /* TRANSLATORS: Extruder Jam */ _("printer-state-reasons.extruder-jam"); /* TRANSLATORS: Extruder Temperature High */ _("printer-state-reasons.extruder-temperature-high"); /* TRANSLATORS: Extruder Temperature Low */ _("printer-state-reasons.extruder-temperature-low"); /* TRANSLATORS: Fan Failure */ _("printer-state-reasons.fan-failure"); /* TRANSLATORS: Fax Modem Life Almost Over */ _("printer-state-reasons.fax-modem-life-almost-over"); /* TRANSLATORS: Fax Modem Life Over */ _("printer-state-reasons.fax-modem-life-over"); /* TRANSLATORS: Fax Modem Missing */ _("printer-state-reasons.fax-modem-missing"); /* TRANSLATORS: Fax Modem Turned Off */ _("printer-state-reasons.fax-modem-turned-off"); /* TRANSLATORS: Fax Modem Turned On */ _("printer-state-reasons.fax-modem-turned-on"); /* TRANSLATORS: Folder Added */ _("printer-state-reasons.folder-added"); /* TRANSLATORS: Folder Almost Empty */ _("printer-state-reasons.folder-almost-empty"); /* TRANSLATORS: Folder Almost Full */ _("printer-state-reasons.folder-almost-full"); /* TRANSLATORS: Folder At Limit */ _("printer-state-reasons.folder-at-limit"); /* TRANSLATORS: Folder Closed */ _("printer-state-reasons.folder-closed"); /* TRANSLATORS: Folder Configuration Change */ _("printer-state-reasons.folder-configuration-change"); /* TRANSLATORS: Folder Cover Closed */ _("printer-state-reasons.folder-cover-closed"); /* TRANSLATORS: Folder Cover Open */ _("printer-state-reasons.folder-cover-open"); /* TRANSLATORS: Folder Empty */ _("printer-state-reasons.folder-empty"); /* TRANSLATORS: Folder Full */ _("printer-state-reasons.folder-full"); /* TRANSLATORS: Folder Interlock Closed */ _("printer-state-reasons.folder-interlock-closed"); /* TRANSLATORS: Folder Interlock Open */ _("printer-state-reasons.folder-interlock-open"); /* TRANSLATORS: Folder Jam */ _("printer-state-reasons.folder-jam"); /* TRANSLATORS: Folder Life Almost Over */ _("printer-state-reasons.folder-life-almost-over"); /* TRANSLATORS: Folder Life Over */ _("printer-state-reasons.folder-life-over"); /* TRANSLATORS: Folder Memory Exhausted */ _("printer-state-reasons.folder-memory-exhausted"); /* TRANSLATORS: Folder Missing */ _("printer-state-reasons.folder-missing"); /* TRANSLATORS: Folder Motor Failure */ _("printer-state-reasons.folder-motor-failure"); /* TRANSLATORS: Folder Near Limit */ _("printer-state-reasons.folder-near-limit"); /* TRANSLATORS: Folder Offline */ _("printer-state-reasons.folder-offline"); /* TRANSLATORS: Folder Opened */ _("printer-state-reasons.folder-opened"); /* TRANSLATORS: Folder Over Temperature */ _("printer-state-reasons.folder-over-temperature"); /* TRANSLATORS: Folder Power Saver */ _("printer-state-reasons.folder-power-saver"); /* TRANSLATORS: Folder Recoverable Failure */ _("printer-state-reasons.folder-recoverable-failure"); /* TRANSLATORS: Folder Recoverable Storage */ _("printer-state-reasons.folder-recoverable-storage"); /* TRANSLATORS: Folder Removed */ _("printer-state-reasons.folder-removed"); /* TRANSLATORS: Folder Resource Added */ _("printer-state-reasons.folder-resource-added"); /* TRANSLATORS: Folder Resource Removed */ _("printer-state-reasons.folder-resource-removed"); /* TRANSLATORS: Folder Thermistor Failure */ _("printer-state-reasons.folder-thermistor-failure"); /* TRANSLATORS: Folder Timing Failure */ _("printer-state-reasons.folder-timing-failure"); /* TRANSLATORS: Folder Turned Off */ _("printer-state-reasons.folder-turned-off"); /* TRANSLATORS: Folder Turned On */ _("printer-state-reasons.folder-turned-on"); /* TRANSLATORS: Folder Under Temperature */ _("printer-state-reasons.folder-under-temperature"); /* TRANSLATORS: Folder Unrecoverable Failure */ _("printer-state-reasons.folder-unrecoverable-failure"); /* TRANSLATORS: Folder Unrecoverable Storage Error */ _("printer-state-reasons.folder-unrecoverable-storage-error"); /* TRANSLATORS: Folder Warming Up */ _("printer-state-reasons.folder-warming-up"); /* TRANSLATORS: Fuser temperature high */ _("printer-state-reasons.fuser-over-temp"); /* TRANSLATORS: Fuser temperature low */ _("printer-state-reasons.fuser-under-temp"); /* TRANSLATORS: Hold New Jobs */ _("printer-state-reasons.hold-new-jobs"); /* TRANSLATORS: Identify Printer */ _("printer-state-reasons.identify-printer-requested"); /* TRANSLATORS: Imprinter Added */ _("printer-state-reasons.imprinter-added"); /* TRANSLATORS: Imprinter Almost Empty */ _("printer-state-reasons.imprinter-almost-empty"); /* TRANSLATORS: Imprinter Almost Full */ _("printer-state-reasons.imprinter-almost-full"); /* TRANSLATORS: Imprinter At Limit */ _("printer-state-reasons.imprinter-at-limit"); /* TRANSLATORS: Imprinter Closed */ _("printer-state-reasons.imprinter-closed"); /* TRANSLATORS: Imprinter Configuration Change */ _("printer-state-reasons.imprinter-configuration-change"); /* TRANSLATORS: Imprinter Cover Closed */ _("printer-state-reasons.imprinter-cover-closed"); /* TRANSLATORS: Imprinter Cover Open */ _("printer-state-reasons.imprinter-cover-open"); /* TRANSLATORS: Imprinter Empty */ _("printer-state-reasons.imprinter-empty"); /* TRANSLATORS: Imprinter Full */ _("printer-state-reasons.imprinter-full"); /* TRANSLATORS: Imprinter Interlock Closed */ _("printer-state-reasons.imprinter-interlock-closed"); /* TRANSLATORS: Imprinter Interlock Open */ _("printer-state-reasons.imprinter-interlock-open"); /* TRANSLATORS: Imprinter Jam */ _("printer-state-reasons.imprinter-jam"); /* TRANSLATORS: Imprinter Life Almost Over */ _("printer-state-reasons.imprinter-life-almost-over"); /* TRANSLATORS: Imprinter Life Over */ _("printer-state-reasons.imprinter-life-over"); /* TRANSLATORS: Imprinter Memory Exhausted */ _("printer-state-reasons.imprinter-memory-exhausted"); /* TRANSLATORS: Imprinter Missing */ _("printer-state-reasons.imprinter-missing"); /* TRANSLATORS: Imprinter Motor Failure */ _("printer-state-reasons.imprinter-motor-failure"); /* TRANSLATORS: Imprinter Near Limit */ _("printer-state-reasons.imprinter-near-limit"); /* TRANSLATORS: Imprinter Offline */ _("printer-state-reasons.imprinter-offline"); /* TRANSLATORS: Imprinter Opened */ _("printer-state-reasons.imprinter-opened"); /* TRANSLATORS: Imprinter Over Temperature */ _("printer-state-reasons.imprinter-over-temperature"); /* TRANSLATORS: Imprinter Power Saver */ _("printer-state-reasons.imprinter-power-saver"); /* TRANSLATORS: Imprinter Recoverable Failure */ _("printer-state-reasons.imprinter-recoverable-failure"); /* TRANSLATORS: Imprinter Recoverable Storage */ _("printer-state-reasons.imprinter-recoverable-storage"); /* TRANSLATORS: Imprinter Removed */ _("printer-state-reasons.imprinter-removed"); /* TRANSLATORS: Imprinter Resource Added */ _("printer-state-reasons.imprinter-resource-added"); /* TRANSLATORS: Imprinter Resource Removed */ _("printer-state-reasons.imprinter-resource-removed"); /* TRANSLATORS: Imprinter Thermistor Failure */ _("printer-state-reasons.imprinter-thermistor-failure"); /* TRANSLATORS: Imprinter Timing Failure */ _("printer-state-reasons.imprinter-timing-failure"); /* TRANSLATORS: Imprinter Turned Off */ _("printer-state-reasons.imprinter-turned-off"); /* TRANSLATORS: Imprinter Turned On */ _("printer-state-reasons.imprinter-turned-on"); /* TRANSLATORS: Imprinter Under Temperature */ _("printer-state-reasons.imprinter-under-temperature"); /* TRANSLATORS: Imprinter Unrecoverable Failure */ _("printer-state-reasons.imprinter-unrecoverable-failure"); /* TRANSLATORS: Imprinter Unrecoverable Storage Error */ _("printer-state-reasons.imprinter-unrecoverable-storage-error"); /* TRANSLATORS: Imprinter Warming Up */ _("printer-state-reasons.imprinter-warming-up"); /* TRANSLATORS: Input Cannot Feed Size Selected */ _("printer-state-reasons.input-cannot-feed-size-selected"); /* TRANSLATORS: Input Manual Input Request */ _("printer-state-reasons.input-manual-input-request"); /* TRANSLATORS: Input Media Color Change */ _("printer-state-reasons.input-media-color-change"); /* TRANSLATORS: Input Media Form Parts Change */ _("printer-state-reasons.input-media-form-parts-change"); /* TRANSLATORS: Input Media Size Change */ _("printer-state-reasons.input-media-size-change"); /* TRANSLATORS: Input Media Tray Failure */ _("printer-state-reasons.input-media-tray-failure"); /* TRANSLATORS: Input Media Tray Feed Error */ _("printer-state-reasons.input-media-tray-feed-error"); /* TRANSLATORS: Input Media Tray Jam */ _("printer-state-reasons.input-media-tray-jam"); /* TRANSLATORS: Input Media Type Change */ _("printer-state-reasons.input-media-type-change"); /* TRANSLATORS: Input Media Weight Change */ _("printer-state-reasons.input-media-weight-change"); /* TRANSLATORS: Input Pick Roller Failure */ _("printer-state-reasons.input-pick-roller-failure"); /* TRANSLATORS: Input Pick Roller Life Over */ _("printer-state-reasons.input-pick-roller-life-over"); /* TRANSLATORS: Input Pick Roller Life Warn */ _("printer-state-reasons.input-pick-roller-life-warn"); /* TRANSLATORS: Input Pick Roller Missing */ _("printer-state-reasons.input-pick-roller-missing"); /* TRANSLATORS: Input Tray Elevation Failure */ _("printer-state-reasons.input-tray-elevation-failure"); /* TRANSLATORS: Paper tray is missing */ _("printer-state-reasons.input-tray-missing"); /* TRANSLATORS: Input Tray Position Failure */ _("printer-state-reasons.input-tray-position-failure"); /* TRANSLATORS: Inserter Added */ _("printer-state-reasons.inserter-added"); /* TRANSLATORS: Inserter Almost Empty */ _("printer-state-reasons.inserter-almost-empty"); /* TRANSLATORS: Inserter Almost Full */ _("printer-state-reasons.inserter-almost-full"); /* TRANSLATORS: Inserter At Limit */ _("printer-state-reasons.inserter-at-limit"); /* TRANSLATORS: Inserter Closed */ _("printer-state-reasons.inserter-closed"); /* TRANSLATORS: Inserter Configuration Change */ _("printer-state-reasons.inserter-configuration-change"); /* TRANSLATORS: Inserter Cover Closed */ _("printer-state-reasons.inserter-cover-closed"); /* TRANSLATORS: Inserter Cover Open */ _("printer-state-reasons.inserter-cover-open"); /* TRANSLATORS: Inserter Empty */ _("printer-state-reasons.inserter-empty"); /* TRANSLATORS: Inserter Full */ _("printer-state-reasons.inserter-full"); /* TRANSLATORS: Inserter Interlock Closed */ _("printer-state-reasons.inserter-interlock-closed"); /* TRANSLATORS: Inserter Interlock Open */ _("printer-state-reasons.inserter-interlock-open"); /* TRANSLATORS: Inserter Jam */ _("printer-state-reasons.inserter-jam"); /* TRANSLATORS: Inserter Life Almost Over */ _("printer-state-reasons.inserter-life-almost-over"); /* TRANSLATORS: Inserter Life Over */ _("printer-state-reasons.inserter-life-over"); /* TRANSLATORS: Inserter Memory Exhausted */ _("printer-state-reasons.inserter-memory-exhausted"); /* TRANSLATORS: Inserter Missing */ _("printer-state-reasons.inserter-missing"); /* TRANSLATORS: Inserter Motor Failure */ _("printer-state-reasons.inserter-motor-failure"); /* TRANSLATORS: Inserter Near Limit */ _("printer-state-reasons.inserter-near-limit"); /* TRANSLATORS: Inserter Offline */ _("printer-state-reasons.inserter-offline"); /* TRANSLATORS: Inserter Opened */ _("printer-state-reasons.inserter-opened"); /* TRANSLATORS: Inserter Over Temperature */ _("printer-state-reasons.inserter-over-temperature"); /* TRANSLATORS: Inserter Power Saver */ _("printer-state-reasons.inserter-power-saver"); /* TRANSLATORS: Inserter Recoverable Failure */ _("printer-state-reasons.inserter-recoverable-failure"); /* TRANSLATORS: Inserter Recoverable Storage */ _("printer-state-reasons.inserter-recoverable-storage"); /* TRANSLATORS: Inserter Removed */ _("printer-state-reasons.inserter-removed"); /* TRANSLATORS: Inserter Resource Added */ _("printer-state-reasons.inserter-resource-added"); /* TRANSLATORS: Inserter Resource Removed */ _("printer-state-reasons.inserter-resource-removed"); /* TRANSLATORS: Inserter Thermistor Failure */ _("printer-state-reasons.inserter-thermistor-failure"); /* TRANSLATORS: Inserter Timing Failure */ _("printer-state-reasons.inserter-timing-failure"); /* TRANSLATORS: Inserter Turned Off */ _("printer-state-reasons.inserter-turned-off"); /* TRANSLATORS: Inserter Turned On */ _("printer-state-reasons.inserter-turned-on"); /* TRANSLATORS: Inserter Under Temperature */ _("printer-state-reasons.inserter-under-temperature"); /* TRANSLATORS: Inserter Unrecoverable Failure */ _("printer-state-reasons.inserter-unrecoverable-failure"); /* TRANSLATORS: Inserter Unrecoverable Storage Error */ _("printer-state-reasons.inserter-unrecoverable-storage-error"); /* TRANSLATORS: Inserter Warming Up */ _("printer-state-reasons.inserter-warming-up"); /* TRANSLATORS: Interlock Closed */ _("printer-state-reasons.interlock-closed"); /* TRANSLATORS: Interlock Open */ _("printer-state-reasons.interlock-open"); /* TRANSLATORS: Interpreter Cartridge Added */ _("printer-state-reasons.interpreter-cartridge-added"); /* TRANSLATORS: Interpreter Cartridge Removed */ _("printer-state-reasons.interpreter-cartridge-deleted"); /* TRANSLATORS: Interpreter Complex Page Encountered */ _("printer-state-reasons.interpreter-complex-page-encountered"); /* TRANSLATORS: Interpreter Memory Decrease */ _("printer-state-reasons.interpreter-memory-decrease"); /* TRANSLATORS: Interpreter Memory Increase */ _("printer-state-reasons.interpreter-memory-increase"); /* TRANSLATORS: Interpreter Resource Added */ _("printer-state-reasons.interpreter-resource-added"); /* TRANSLATORS: Interpreter Resource Deleted */ _("printer-state-reasons.interpreter-resource-deleted"); /* TRANSLATORS: Printer resource unavailable */ _("printer-state-reasons.interpreter-resource-unavailable"); /* TRANSLATORS: Lamp At End of Life */ _("printer-state-reasons.lamp-at-eol"); /* TRANSLATORS: Lamp Failure */ _("printer-state-reasons.lamp-failure"); /* TRANSLATORS: Lamp Near End of Life */ _("printer-state-reasons.lamp-near-eol"); /* TRANSLATORS: Laser At End of Life */ _("printer-state-reasons.laser-at-eol"); /* TRANSLATORS: Laser Failure */ _("printer-state-reasons.laser-failure"); /* TRANSLATORS: Laser Near End of Life */ _("printer-state-reasons.laser-near-eol"); /* TRANSLATORS: Envelope Maker Added */ _("printer-state-reasons.make-envelope-added"); /* TRANSLATORS: Envelope Maker Almost Empty */ _("printer-state-reasons.make-envelope-almost-empty"); /* TRANSLATORS: Envelope Maker Almost Full */ _("printer-state-reasons.make-envelope-almost-full"); /* TRANSLATORS: Envelope Maker At Limit */ _("printer-state-reasons.make-envelope-at-limit"); /* TRANSLATORS: Envelope Maker Closed */ _("printer-state-reasons.make-envelope-closed"); /* TRANSLATORS: Envelope Maker Configuration Change */ _("printer-state-reasons.make-envelope-configuration-change"); /* TRANSLATORS: Envelope Maker Cover Closed */ _("printer-state-reasons.make-envelope-cover-closed"); /* TRANSLATORS: Envelope Maker Cover Open */ _("printer-state-reasons.make-envelope-cover-open"); /* TRANSLATORS: Envelope Maker Empty */ _("printer-state-reasons.make-envelope-empty"); /* TRANSLATORS: Envelope Maker Full */ _("printer-state-reasons.make-envelope-full"); /* TRANSLATORS: Envelope Maker Interlock Closed */ _("printer-state-reasons.make-envelope-interlock-closed"); /* TRANSLATORS: Envelope Maker Interlock Open */ _("printer-state-reasons.make-envelope-interlock-open"); /* TRANSLATORS: Envelope Maker Jam */ _("printer-state-reasons.make-envelope-jam"); /* TRANSLATORS: Envelope Maker Life Almost Over */ _("printer-state-reasons.make-envelope-life-almost-over"); /* TRANSLATORS: Envelope Maker Life Over */ _("printer-state-reasons.make-envelope-life-over"); /* TRANSLATORS: Envelope Maker Memory Exhausted */ _("printer-state-reasons.make-envelope-memory-exhausted"); /* TRANSLATORS: Envelope Maker Missing */ _("printer-state-reasons.make-envelope-missing"); /* TRANSLATORS: Envelope Maker Motor Failure */ _("printer-state-reasons.make-envelope-motor-failure"); /* TRANSLATORS: Envelope Maker Near Limit */ _("printer-state-reasons.make-envelope-near-limit"); /* TRANSLATORS: Envelope Maker Offline */ _("printer-state-reasons.make-envelope-offline"); /* TRANSLATORS: Envelope Maker Opened */ _("printer-state-reasons.make-envelope-opened"); /* TRANSLATORS: Envelope Maker Over Temperature */ _("printer-state-reasons.make-envelope-over-temperature"); /* TRANSLATORS: Envelope Maker Power Saver */ _("printer-state-reasons.make-envelope-power-saver"); /* TRANSLATORS: Envelope Maker Recoverable Failure */ _("printer-state-reasons.make-envelope-recoverable-failure"); /* TRANSLATORS: Envelope Maker Recoverable Storage */ _("printer-state-reasons.make-envelope-recoverable-storage"); /* TRANSLATORS: Envelope Maker Removed */ _("printer-state-reasons.make-envelope-removed"); /* TRANSLATORS: Envelope Maker Resource Added */ _("printer-state-reasons.make-envelope-resource-added"); /* TRANSLATORS: Envelope Maker Resource Removed */ _("printer-state-reasons.make-envelope-resource-removed"); /* TRANSLATORS: Envelope Maker Thermistor Failure */ _("printer-state-reasons.make-envelope-thermistor-failure"); /* TRANSLATORS: Envelope Maker Timing Failure */ _("printer-state-reasons.make-envelope-timing-failure"); /* TRANSLATORS: Envelope Maker Turned Off */ _("printer-state-reasons.make-envelope-turned-off"); /* TRANSLATORS: Envelope Maker Turned On */ _("printer-state-reasons.make-envelope-turned-on"); /* TRANSLATORS: Envelope Maker Under Temperature */ _("printer-state-reasons.make-envelope-under-temperature"); /* TRANSLATORS: Envelope Maker Unrecoverable Failure */ _("printer-state-reasons.make-envelope-unrecoverable-failure"); /* TRANSLATORS: Envelope Maker Unrecoverable Storage Error */ _("printer-state-reasons.make-envelope-unrecoverable-storage-error"); /* TRANSLATORS: Envelope Maker Warming Up */ _("printer-state-reasons.make-envelope-warming-up"); /* TRANSLATORS: Marker Adjusting Print Quality */ _("printer-state-reasons.marker-adjusting-print-quality"); /* TRANSLATORS: Marker Cleaner Missing */ _("printer-state-reasons.marker-cleaner-missing"); /* TRANSLATORS: Marker Developer Almost Empty */ _("printer-state-reasons.marker-developer-almost-empty"); /* TRANSLATORS: Marker Developer Empty */ _("printer-state-reasons.marker-developer-empty"); /* TRANSLATORS: Marker Developer Missing */ _("printer-state-reasons.marker-developer-missing"); /* TRANSLATORS: Marker Fuser Missing */ _("printer-state-reasons.marker-fuser-missing"); /* TRANSLATORS: Marker Fuser Thermistor Failure */ _("printer-state-reasons.marker-fuser-thermistor-failure"); /* TRANSLATORS: Marker Fuser Timing Failure */ _("printer-state-reasons.marker-fuser-timing-failure"); /* TRANSLATORS: Marker Ink Almost Empty */ _("printer-state-reasons.marker-ink-almost-empty"); /* TRANSLATORS: Marker Ink Empty */ _("printer-state-reasons.marker-ink-empty"); /* TRANSLATORS: Marker Ink Missing */ _("printer-state-reasons.marker-ink-missing"); /* TRANSLATORS: Marker Opc Missing */ _("printer-state-reasons.marker-opc-missing"); /* TRANSLATORS: Marker Print Ribbon Almost Empty */ _("printer-state-reasons.marker-print-ribbon-almost-empty"); /* TRANSLATORS: Marker Print Ribbon Empty */ _("printer-state-reasons.marker-print-ribbon-empty"); /* TRANSLATORS: Marker Print Ribbon Missing */ _("printer-state-reasons.marker-print-ribbon-missing"); /* TRANSLATORS: Marker Supply Almost Empty */ _("printer-state-reasons.marker-supply-almost-empty"); /* TRANSLATORS: Ink/toner empty */ _("printer-state-reasons.marker-supply-empty"); /* TRANSLATORS: Ink/toner low */ _("printer-state-reasons.marker-supply-low"); /* TRANSLATORS: Marker Supply Missing */ _("printer-state-reasons.marker-supply-missing"); /* TRANSLATORS: Marker Toner Cartridge Missing */ _("printer-state-reasons.marker-toner-cartridge-missing"); /* TRANSLATORS: Marker Toner Missing */ _("printer-state-reasons.marker-toner-missing"); /* TRANSLATORS: Ink/toner waste bin almost full */ _("printer-state-reasons.marker-waste-almost-full"); /* TRANSLATORS: Ink/toner waste bin full */ _("printer-state-reasons.marker-waste-full"); /* TRANSLATORS: Marker Waste Ink Receptacle Almost Full */ _("printer-state-reasons.marker-waste-ink-receptacle-almost-full"); /* TRANSLATORS: Marker Waste Ink Receptacle Full */ _("printer-state-reasons.marker-waste-ink-receptacle-full"); /* TRANSLATORS: Marker Waste Ink Receptacle Missing */ _("printer-state-reasons.marker-waste-ink-receptacle-missing"); /* TRANSLATORS: Marker Waste Missing */ _("printer-state-reasons.marker-waste-missing"); /* TRANSLATORS: Marker Waste Toner Receptacle Almost Full */ _("printer-state-reasons.marker-waste-toner-receptacle-almost-full"); /* TRANSLATORS: Marker Waste Toner Receptacle Full */ _("printer-state-reasons.marker-waste-toner-receptacle-full"); /* TRANSLATORS: Marker Waste Toner Receptacle Missing */ _("printer-state-reasons.marker-waste-toner-receptacle-missing"); /* TRANSLATORS: Material Empty */ _("printer-state-reasons.material-empty"); /* TRANSLATORS: Material Low */ _("printer-state-reasons.material-low"); /* TRANSLATORS: Material Needed */ _("printer-state-reasons.material-needed"); /* TRANSLATORS: Media Drying */ _("printer-state-reasons.media-drying"); /* TRANSLATORS: Paper tray is empty */ _("printer-state-reasons.media-empty"); /* TRANSLATORS: Paper jam */ _("printer-state-reasons.media-jam"); /* TRANSLATORS: Paper tray is almost empty */ _("printer-state-reasons.media-low"); /* TRANSLATORS: Load paper */ _("printer-state-reasons.media-needed"); /* TRANSLATORS: Media Path Cannot Do 2-Sided Printing */ _("printer-state-reasons.media-path-cannot-duplex-media-selected"); /* TRANSLATORS: Media Path Failure */ _("printer-state-reasons.media-path-failure"); /* TRANSLATORS: Media Path Input Empty */ _("printer-state-reasons.media-path-input-empty"); /* TRANSLATORS: Media Path Input Feed Error */ _("printer-state-reasons.media-path-input-feed-error"); /* TRANSLATORS: Media Path Input Jam */ _("printer-state-reasons.media-path-input-jam"); /* TRANSLATORS: Media Path Input Request */ _("printer-state-reasons.media-path-input-request"); /* TRANSLATORS: Media Path Jam */ _("printer-state-reasons.media-path-jam"); /* TRANSLATORS: Media Path Media Tray Almost Full */ _("printer-state-reasons.media-path-media-tray-almost-full"); /* TRANSLATORS: Media Path Media Tray Full */ _("printer-state-reasons.media-path-media-tray-full"); /* TRANSLATORS: Media Path Media Tray Missing */ _("printer-state-reasons.media-path-media-tray-missing"); /* TRANSLATORS: Media Path Output Feed Error */ _("printer-state-reasons.media-path-output-feed-error"); /* TRANSLATORS: Media Path Output Full */ _("printer-state-reasons.media-path-output-full"); /* TRANSLATORS: Media Path Output Jam */ _("printer-state-reasons.media-path-output-jam"); /* TRANSLATORS: Media Path Pick Roller Failure */ _("printer-state-reasons.media-path-pick-roller-failure"); /* TRANSLATORS: Media Path Pick Roller Life Over */ _("printer-state-reasons.media-path-pick-roller-life-over"); /* TRANSLATORS: Media Path Pick Roller Life Warn */ _("printer-state-reasons.media-path-pick-roller-life-warn"); /* TRANSLATORS: Media Path Pick Roller Missing */ _("printer-state-reasons.media-path-pick-roller-missing"); /* TRANSLATORS: Motor Failure */ _("printer-state-reasons.motor-failure"); /* TRANSLATORS: Printer going offline */ _("printer-state-reasons.moving-to-paused"); /* TRANSLATORS: None */ _("printer-state-reasons.none"); /* TRANSLATORS: Optical Photoconductor Life Over */ _("printer-state-reasons.opc-life-over"); /* TRANSLATORS: OPC almost at end-of-life */ _("printer-state-reasons.opc-near-eol"); /* TRANSLATORS: Check the printer for errors */ _("printer-state-reasons.other"); /* TRANSLATORS: Output bin is almost full */ _("printer-state-reasons.output-area-almost-full"); /* TRANSLATORS: Output bin is full */ _("printer-state-reasons.output-area-full"); /* TRANSLATORS: Output Mailbox Select Failure */ _("printer-state-reasons.output-mailbox-select-failure"); /* TRANSLATORS: Output Media Tray Failure */ _("printer-state-reasons.output-media-tray-failure"); /* TRANSLATORS: Output Media Tray Feed Error */ _("printer-state-reasons.output-media-tray-feed-error"); /* TRANSLATORS: Output Media Tray Jam */ _("printer-state-reasons.output-media-tray-jam"); /* TRANSLATORS: Output tray is missing */ _("printer-state-reasons.output-tray-missing"); /* TRANSLATORS: Paused */ _("printer-state-reasons.paused"); /* TRANSLATORS: Perforater Added */ _("printer-state-reasons.perforater-added"); /* TRANSLATORS: Perforater Almost Empty */ _("printer-state-reasons.perforater-almost-empty"); /* TRANSLATORS: Perforater Almost Full */ _("printer-state-reasons.perforater-almost-full"); /* TRANSLATORS: Perforater At Limit */ _("printer-state-reasons.perforater-at-limit"); /* TRANSLATORS: Perforater Closed */ _("printer-state-reasons.perforater-closed"); /* TRANSLATORS: Perforater Configuration Change */ _("printer-state-reasons.perforater-configuration-change"); /* TRANSLATORS: Perforater Cover Closed */ _("printer-state-reasons.perforater-cover-closed"); /* TRANSLATORS: Perforater Cover Open */ _("printer-state-reasons.perforater-cover-open"); /* TRANSLATORS: Perforater Empty */ _("printer-state-reasons.perforater-empty"); /* TRANSLATORS: Perforater Full */ _("printer-state-reasons.perforater-full"); /* TRANSLATORS: Perforater Interlock Closed */ _("printer-state-reasons.perforater-interlock-closed"); /* TRANSLATORS: Perforater Interlock Open */ _("printer-state-reasons.perforater-interlock-open"); /* TRANSLATORS: Perforater Jam */ _("printer-state-reasons.perforater-jam"); /* TRANSLATORS: Perforater Life Almost Over */ _("printer-state-reasons.perforater-life-almost-over"); /* TRANSLATORS: Perforater Life Over */ _("printer-state-reasons.perforater-life-over"); /* TRANSLATORS: Perforater Memory Exhausted */ _("printer-state-reasons.perforater-memory-exhausted"); /* TRANSLATORS: Perforater Missing */ _("printer-state-reasons.perforater-missing"); /* TRANSLATORS: Perforater Motor Failure */ _("printer-state-reasons.perforater-motor-failure"); /* TRANSLATORS: Perforater Near Limit */ _("printer-state-reasons.perforater-near-limit"); /* TRANSLATORS: Perforater Offline */ _("printer-state-reasons.perforater-offline"); /* TRANSLATORS: Perforater Opened */ _("printer-state-reasons.perforater-opened"); /* TRANSLATORS: Perforater Over Temperature */ _("printer-state-reasons.perforater-over-temperature"); /* TRANSLATORS: Perforater Power Saver */ _("printer-state-reasons.perforater-power-saver"); /* TRANSLATORS: Perforater Recoverable Failure */ _("printer-state-reasons.perforater-recoverable-failure"); /* TRANSLATORS: Perforater Recoverable Storage */ _("printer-state-reasons.perforater-recoverable-storage"); /* TRANSLATORS: Perforater Removed */ _("printer-state-reasons.perforater-removed"); /* TRANSLATORS: Perforater Resource Added */ _("printer-state-reasons.perforater-resource-added"); /* TRANSLATORS: Perforater Resource Removed */ _("printer-state-reasons.perforater-resource-removed"); /* TRANSLATORS: Perforater Thermistor Failure */ _("printer-state-reasons.perforater-thermistor-failure"); /* TRANSLATORS: Perforater Timing Failure */ _("printer-state-reasons.perforater-timing-failure"); /* TRANSLATORS: Perforater Turned Off */ _("printer-state-reasons.perforater-turned-off"); /* TRANSLATORS: Perforater Turned On */ _("printer-state-reasons.perforater-turned-on"); /* TRANSLATORS: Perforater Under Temperature */ _("printer-state-reasons.perforater-under-temperature"); /* TRANSLATORS: Perforater Unrecoverable Failure */ _("printer-state-reasons.perforater-unrecoverable-failure"); /* TRANSLATORS: Perforater Unrecoverable Storage Error */ _("printer-state-reasons.perforater-unrecoverable-storage-error"); /* TRANSLATORS: Perforater Warming Up */ _("printer-state-reasons.perforater-warming-up"); /* TRANSLATORS: Platform Cooling */ _("printer-state-reasons.platform-cooling"); /* TRANSLATORS: Platform Failure */ _("printer-state-reasons.platform-failure"); /* TRANSLATORS: Platform Heating */ _("printer-state-reasons.platform-heating"); /* TRANSLATORS: Platform Temperature High */ _("printer-state-reasons.platform-temperature-high"); /* TRANSLATORS: Platform Temperature Low */ _("printer-state-reasons.platform-temperature-low"); /* TRANSLATORS: Power Down */ _("printer-state-reasons.power-down"); /* TRANSLATORS: Power Up */ _("printer-state-reasons.power-up"); /* TRANSLATORS: Printer Reset Manually */ _("printer-state-reasons.printer-manual-reset"); /* TRANSLATORS: Printer Reset Remotely */ _("printer-state-reasons.printer-nms-reset"); /* TRANSLATORS: Printer Ready To Print */ _("printer-state-reasons.printer-ready-to-print"); /* TRANSLATORS: Puncher Added */ _("printer-state-reasons.puncher-added"); /* TRANSLATORS: Puncher Almost Empty */ _("printer-state-reasons.puncher-almost-empty"); /* TRANSLATORS: Puncher Almost Full */ _("printer-state-reasons.puncher-almost-full"); /* TRANSLATORS: Puncher At Limit */ _("printer-state-reasons.puncher-at-limit"); /* TRANSLATORS: Puncher Closed */ _("printer-state-reasons.puncher-closed"); /* TRANSLATORS: Puncher Configuration Change */ _("printer-state-reasons.puncher-configuration-change"); /* TRANSLATORS: Puncher Cover Closed */ _("printer-state-reasons.puncher-cover-closed"); /* TRANSLATORS: Puncher Cover Open */ _("printer-state-reasons.puncher-cover-open"); /* TRANSLATORS: Puncher Empty */ _("printer-state-reasons.puncher-empty"); /* TRANSLATORS: Puncher Full */ _("printer-state-reasons.puncher-full"); /* TRANSLATORS: Puncher Interlock Closed */ _("printer-state-reasons.puncher-interlock-closed"); /* TRANSLATORS: Puncher Interlock Open */ _("printer-state-reasons.puncher-interlock-open"); /* TRANSLATORS: Puncher Jam */ _("printer-state-reasons.puncher-jam"); /* TRANSLATORS: Puncher Life Almost Over */ _("printer-state-reasons.puncher-life-almost-over"); /* TRANSLATORS: Puncher Life Over */ _("printer-state-reasons.puncher-life-over"); /* TRANSLATORS: Puncher Memory Exhausted */ _("printer-state-reasons.puncher-memory-exhausted"); /* TRANSLATORS: Puncher Missing */ _("printer-state-reasons.puncher-missing"); /* TRANSLATORS: Puncher Motor Failure */ _("printer-state-reasons.puncher-motor-failure"); /* TRANSLATORS: Puncher Near Limit */ _("printer-state-reasons.puncher-near-limit"); /* TRANSLATORS: Puncher Offline */ _("printer-state-reasons.puncher-offline"); /* TRANSLATORS: Puncher Opened */ _("printer-state-reasons.puncher-opened"); /* TRANSLATORS: Puncher Over Temperature */ _("printer-state-reasons.puncher-over-temperature"); /* TRANSLATORS: Puncher Power Saver */ _("printer-state-reasons.puncher-power-saver"); /* TRANSLATORS: Puncher Recoverable Failure */ _("printer-state-reasons.puncher-recoverable-failure"); /* TRANSLATORS: Puncher Recoverable Storage */ _("printer-state-reasons.puncher-recoverable-storage"); /* TRANSLATORS: Puncher Removed */ _("printer-state-reasons.puncher-removed"); /* TRANSLATORS: Puncher Resource Added */ _("printer-state-reasons.puncher-resource-added"); /* TRANSLATORS: Puncher Resource Removed */ _("printer-state-reasons.puncher-resource-removed"); /* TRANSLATORS: Puncher Thermistor Failure */ _("printer-state-reasons.puncher-thermistor-failure"); /* TRANSLATORS: Puncher Timing Failure */ _("printer-state-reasons.puncher-timing-failure"); /* TRANSLATORS: Puncher Turned Off */ _("printer-state-reasons.puncher-turned-off"); /* TRANSLATORS: Puncher Turned On */ _("printer-state-reasons.puncher-turned-on"); /* TRANSLATORS: Puncher Under Temperature */ _("printer-state-reasons.puncher-under-temperature"); /* TRANSLATORS: Puncher Unrecoverable Failure */ _("printer-state-reasons.puncher-unrecoverable-failure"); /* TRANSLATORS: Puncher Unrecoverable Storage Error */ _("printer-state-reasons.puncher-unrecoverable-storage-error"); /* TRANSLATORS: Puncher Warming Up */ _("printer-state-reasons.puncher-warming-up"); /* TRANSLATORS: Separation Cutter Added */ _("printer-state-reasons.separation-cutter-added"); /* TRANSLATORS: Separation Cutter Almost Empty */ _("printer-state-reasons.separation-cutter-almost-empty"); /* TRANSLATORS: Separation Cutter Almost Full */ _("printer-state-reasons.separation-cutter-almost-full"); /* TRANSLATORS: Separation Cutter At Limit */ _("printer-state-reasons.separation-cutter-at-limit"); /* TRANSLATORS: Separation Cutter Closed */ _("printer-state-reasons.separation-cutter-closed"); /* TRANSLATORS: Separation Cutter Configuration Change */ _("printer-state-reasons.separation-cutter-configuration-change"); /* TRANSLATORS: Separation Cutter Cover Closed */ _("printer-state-reasons.separation-cutter-cover-closed"); /* TRANSLATORS: Separation Cutter Cover Open */ _("printer-state-reasons.separation-cutter-cover-open"); /* TRANSLATORS: Separation Cutter Empty */ _("printer-state-reasons.separation-cutter-empty"); /* TRANSLATORS: Separation Cutter Full */ _("printer-state-reasons.separation-cutter-full"); /* TRANSLATORS: Separation Cutter Interlock Closed */ _("printer-state-reasons.separation-cutter-interlock-closed"); /* TRANSLATORS: Separation Cutter Interlock Open */ _("printer-state-reasons.separation-cutter-interlock-open"); /* TRANSLATORS: Separation Cutter Jam */ _("printer-state-reasons.separation-cutter-jam"); /* TRANSLATORS: Separation Cutter Life Almost Over */ _("printer-state-reasons.separation-cutter-life-almost-over"); /* TRANSLATORS: Separation Cutter Life Over */ _("printer-state-reasons.separation-cutter-life-over"); /* TRANSLATORS: Separation Cutter Memory Exhausted */ _("printer-state-reasons.separation-cutter-memory-exhausted"); /* TRANSLATORS: Separation Cutter Missing */ _("printer-state-reasons.separation-cutter-missing"); /* TRANSLATORS: Separation Cutter Motor Failure */ _("printer-state-reasons.separation-cutter-motor-failure"); /* TRANSLATORS: Separation Cutter Near Limit */ _("printer-state-reasons.separation-cutter-near-limit"); /* TRANSLATORS: Separation Cutter Offline */ _("printer-state-reasons.separation-cutter-offline"); /* TRANSLATORS: Separation Cutter Opened */ _("printer-state-reasons.separation-cutter-opened"); /* TRANSLATORS: Separation Cutter Over Temperature */ _("printer-state-reasons.separation-cutter-over-temperature"); /* TRANSLATORS: Separation Cutter Power Saver */ _("printer-state-reasons.separation-cutter-power-saver"); /* TRANSLATORS: Separation Cutter Recoverable Failure */ _("printer-state-reasons.separation-cutter-recoverable-failure"); /* TRANSLATORS: Separation Cutter Recoverable Storage */ _("printer-state-reasons.separation-cutter-recoverable-storage"); /* TRANSLATORS: Separation Cutter Removed */ _("printer-state-reasons.separation-cutter-removed"); /* TRANSLATORS: Separation Cutter Resource Added */ _("printer-state-reasons.separation-cutter-resource-added"); /* TRANSLATORS: Separation Cutter Resource Removed */ _("printer-state-reasons.separation-cutter-resource-removed"); /* TRANSLATORS: Separation Cutter Thermistor Failure */ _("printer-state-reasons.separation-cutter-thermistor-failure"); /* TRANSLATORS: Separation Cutter Timing Failure */ _("printer-state-reasons.separation-cutter-timing-failure"); /* TRANSLATORS: Separation Cutter Turned Off */ _("printer-state-reasons.separation-cutter-turned-off"); /* TRANSLATORS: Separation Cutter Turned On */ _("printer-state-reasons.separation-cutter-turned-on"); /* TRANSLATORS: Separation Cutter Under Temperature */ _("printer-state-reasons.separation-cutter-under-temperature"); /* TRANSLATORS: Separation Cutter Unrecoverable Failure */ _("printer-state-reasons.separation-cutter-unrecoverable-failure"); /* TRANSLATORS: Separation Cutter Unrecoverable Storage Error */ _("printer-state-reasons.separation-cutter-unrecoverable-storage-error"); /* TRANSLATORS: Separation Cutter Warming Up */ _("printer-state-reasons.separation-cutter-warming-up"); /* TRANSLATORS: Sheet Rotator Added */ _("printer-state-reasons.sheet-rotator-added"); /* TRANSLATORS: Sheet Rotator Almost Empty */ _("printer-state-reasons.sheet-rotator-almost-empty"); /* TRANSLATORS: Sheet Rotator Almost Full */ _("printer-state-reasons.sheet-rotator-almost-full"); /* TRANSLATORS: Sheet Rotator At Limit */ _("printer-state-reasons.sheet-rotator-at-limit"); /* TRANSLATORS: Sheet Rotator Closed */ _("printer-state-reasons.sheet-rotator-closed"); /* TRANSLATORS: Sheet Rotator Configuration Change */ _("printer-state-reasons.sheet-rotator-configuration-change"); /* TRANSLATORS: Sheet Rotator Cover Closed */ _("printer-state-reasons.sheet-rotator-cover-closed"); /* TRANSLATORS: Sheet Rotator Cover Open */ _("printer-state-reasons.sheet-rotator-cover-open"); /* TRANSLATORS: Sheet Rotator Empty */ _("printer-state-reasons.sheet-rotator-empty"); /* TRANSLATORS: Sheet Rotator Full */ _("printer-state-reasons.sheet-rotator-full"); /* TRANSLATORS: Sheet Rotator Interlock Closed */ _("printer-state-reasons.sheet-rotator-interlock-closed"); /* TRANSLATORS: Sheet Rotator Interlock Open */ _("printer-state-reasons.sheet-rotator-interlock-open"); /* TRANSLATORS: Sheet Rotator Jam */ _("printer-state-reasons.sheet-rotator-jam"); /* TRANSLATORS: Sheet Rotator Life Almost Over */ _("printer-state-reasons.sheet-rotator-life-almost-over"); /* TRANSLATORS: Sheet Rotator Life Over */ _("printer-state-reasons.sheet-rotator-life-over"); /* TRANSLATORS: Sheet Rotator Memory Exhausted */ _("printer-state-reasons.sheet-rotator-memory-exhausted"); /* TRANSLATORS: Sheet Rotator Missing */ _("printer-state-reasons.sheet-rotator-missing"); /* TRANSLATORS: Sheet Rotator Motor Failure */ _("printer-state-reasons.sheet-rotator-motor-failure"); /* TRANSLATORS: Sheet Rotator Near Limit */ _("printer-state-reasons.sheet-rotator-near-limit"); /* TRANSLATORS: Sheet Rotator Offline */ _("printer-state-reasons.sheet-rotator-offline"); /* TRANSLATORS: Sheet Rotator Opened */ _("printer-state-reasons.sheet-rotator-opened"); /* TRANSLATORS: Sheet Rotator Over Temperature */ _("printer-state-reasons.sheet-rotator-over-temperature"); /* TRANSLATORS: Sheet Rotator Power Saver */ _("printer-state-reasons.sheet-rotator-power-saver"); /* TRANSLATORS: Sheet Rotator Recoverable Failure */ _("printer-state-reasons.sheet-rotator-recoverable-failure"); /* TRANSLATORS: Sheet Rotator Recoverable Storage */ _("printer-state-reasons.sheet-rotator-recoverable-storage"); /* TRANSLATORS: Sheet Rotator Removed */ _("printer-state-reasons.sheet-rotator-removed"); /* TRANSLATORS: Sheet Rotator Resource Added */ _("printer-state-reasons.sheet-rotator-resource-added"); /* TRANSLATORS: Sheet Rotator Resource Removed */ _("printer-state-reasons.sheet-rotator-resource-removed"); /* TRANSLATORS: Sheet Rotator Thermistor Failure */ _("printer-state-reasons.sheet-rotator-thermistor-failure"); /* TRANSLATORS: Sheet Rotator Timing Failure */ _("printer-state-reasons.sheet-rotator-timing-failure"); /* TRANSLATORS: Sheet Rotator Turned Off */ _("printer-state-reasons.sheet-rotator-turned-off"); /* TRANSLATORS: Sheet Rotator Turned On */ _("printer-state-reasons.sheet-rotator-turned-on"); /* TRANSLATORS: Sheet Rotator Under Temperature */ _("printer-state-reasons.sheet-rotator-under-temperature"); /* TRANSLATORS: Sheet Rotator Unrecoverable Failure */ _("printer-state-reasons.sheet-rotator-unrecoverable-failure"); /* TRANSLATORS: Sheet Rotator Unrecoverable Storage Error */ _("printer-state-reasons.sheet-rotator-unrecoverable-storage-error"); /* TRANSLATORS: Sheet Rotator Warming Up */ _("printer-state-reasons.sheet-rotator-warming-up"); /* TRANSLATORS: Printer offline */ _("printer-state-reasons.shutdown"); /* TRANSLATORS: Slitter Added */ _("printer-state-reasons.slitter-added"); /* TRANSLATORS: Slitter Almost Empty */ _("printer-state-reasons.slitter-almost-empty"); /* TRANSLATORS: Slitter Almost Full */ _("printer-state-reasons.slitter-almost-full"); /* TRANSLATORS: Slitter At Limit */ _("printer-state-reasons.slitter-at-limit"); /* TRANSLATORS: Slitter Closed */ _("printer-state-reasons.slitter-closed"); /* TRANSLATORS: Slitter Configuration Change */ _("printer-state-reasons.slitter-configuration-change"); /* TRANSLATORS: Slitter Cover Closed */ _("printer-state-reasons.slitter-cover-closed"); /* TRANSLATORS: Slitter Cover Open */ _("printer-state-reasons.slitter-cover-open"); /* TRANSLATORS: Slitter Empty */ _("printer-state-reasons.slitter-empty"); /* TRANSLATORS: Slitter Full */ _("printer-state-reasons.slitter-full"); /* TRANSLATORS: Slitter Interlock Closed */ _("printer-state-reasons.slitter-interlock-closed"); /* TRANSLATORS: Slitter Interlock Open */ _("printer-state-reasons.slitter-interlock-open"); /* TRANSLATORS: Slitter Jam */ _("printer-state-reasons.slitter-jam"); /* TRANSLATORS: Slitter Life Almost Over */ _("printer-state-reasons.slitter-life-almost-over"); /* TRANSLATORS: Slitter Life Over */ _("printer-state-reasons.slitter-life-over"); /* TRANSLATORS: Slitter Memory Exhausted */ _("printer-state-reasons.slitter-memory-exhausted"); /* TRANSLATORS: Slitter Missing */ _("printer-state-reasons.slitter-missing"); /* TRANSLATORS: Slitter Motor Failure */ _("printer-state-reasons.slitter-motor-failure"); /* TRANSLATORS: Slitter Near Limit */ _("printer-state-reasons.slitter-near-limit"); /* TRANSLATORS: Slitter Offline */ _("printer-state-reasons.slitter-offline"); /* TRANSLATORS: Slitter Opened */ _("printer-state-reasons.slitter-opened"); /* TRANSLATORS: Slitter Over Temperature */ _("printer-state-reasons.slitter-over-temperature"); /* TRANSLATORS: Slitter Power Saver */ _("printer-state-reasons.slitter-power-saver"); /* TRANSLATORS: Slitter Recoverable Failure */ _("printer-state-reasons.slitter-recoverable-failure"); /* TRANSLATORS: Slitter Recoverable Storage */ _("printer-state-reasons.slitter-recoverable-storage"); /* TRANSLATORS: Slitter Removed */ _("printer-state-reasons.slitter-removed"); /* TRANSLATORS: Slitter Resource Added */ _("printer-state-reasons.slitter-resource-added"); /* TRANSLATORS: Slitter Resource Removed */ _("printer-state-reasons.slitter-resource-removed"); /* TRANSLATORS: Slitter Thermistor Failure */ _("printer-state-reasons.slitter-thermistor-failure"); /* TRANSLATORS: Slitter Timing Failure */ _("printer-state-reasons.slitter-timing-failure"); /* TRANSLATORS: Slitter Turned Off */ _("printer-state-reasons.slitter-turned-off"); /* TRANSLATORS: Slitter Turned On */ _("printer-state-reasons.slitter-turned-on"); /* TRANSLATORS: Slitter Under Temperature */ _("printer-state-reasons.slitter-under-temperature"); /* TRANSLATORS: Slitter Unrecoverable Failure */ _("printer-state-reasons.slitter-unrecoverable-failure"); /* TRANSLATORS: Slitter Unrecoverable Storage Error */ _("printer-state-reasons.slitter-unrecoverable-storage-error"); /* TRANSLATORS: Slitter Warming Up */ _("printer-state-reasons.slitter-warming-up"); /* TRANSLATORS: Spool Area Full */ _("printer-state-reasons.spool-area-full"); /* TRANSLATORS: Stacker Added */ _("printer-state-reasons.stacker-added"); /* TRANSLATORS: Stacker Almost Empty */ _("printer-state-reasons.stacker-almost-empty"); /* TRANSLATORS: Stacker Almost Full */ _("printer-state-reasons.stacker-almost-full"); /* TRANSLATORS: Stacker At Limit */ _("printer-state-reasons.stacker-at-limit"); /* TRANSLATORS: Stacker Closed */ _("printer-state-reasons.stacker-closed"); /* TRANSLATORS: Stacker Configuration Change */ _("printer-state-reasons.stacker-configuration-change"); /* TRANSLATORS: Stacker Cover Closed */ _("printer-state-reasons.stacker-cover-closed"); /* TRANSLATORS: Stacker Cover Open */ _("printer-state-reasons.stacker-cover-open"); /* TRANSLATORS: Stacker Empty */ _("printer-state-reasons.stacker-empty"); /* TRANSLATORS: Stacker Full */ _("printer-state-reasons.stacker-full"); /* TRANSLATORS: Stacker Interlock Closed */ _("printer-state-reasons.stacker-interlock-closed"); /* TRANSLATORS: Stacker Interlock Open */ _("printer-state-reasons.stacker-interlock-open"); /* TRANSLATORS: Stacker Jam */ _("printer-state-reasons.stacker-jam"); /* TRANSLATORS: Stacker Life Almost Over */ _("printer-state-reasons.stacker-life-almost-over"); /* TRANSLATORS: Stacker Life Over */ _("printer-state-reasons.stacker-life-over"); /* TRANSLATORS: Stacker Memory Exhausted */ _("printer-state-reasons.stacker-memory-exhausted"); /* TRANSLATORS: Stacker Missing */ _("printer-state-reasons.stacker-missing"); /* TRANSLATORS: Stacker Motor Failure */ _("printer-state-reasons.stacker-motor-failure"); /* TRANSLATORS: Stacker Near Limit */ _("printer-state-reasons.stacker-near-limit"); /* TRANSLATORS: Stacker Offline */ _("printer-state-reasons.stacker-offline"); /* TRANSLATORS: Stacker Opened */ _("printer-state-reasons.stacker-opened"); /* TRANSLATORS: Stacker Over Temperature */ _("printer-state-reasons.stacker-over-temperature"); /* TRANSLATORS: Stacker Power Saver */ _("printer-state-reasons.stacker-power-saver"); /* TRANSLATORS: Stacker Recoverable Failure */ _("printer-state-reasons.stacker-recoverable-failure"); /* TRANSLATORS: Stacker Recoverable Storage */ _("printer-state-reasons.stacker-recoverable-storage"); /* TRANSLATORS: Stacker Removed */ _("printer-state-reasons.stacker-removed"); /* TRANSLATORS: Stacker Resource Added */ _("printer-state-reasons.stacker-resource-added"); /* TRANSLATORS: Stacker Resource Removed */ _("printer-state-reasons.stacker-resource-removed"); /* TRANSLATORS: Stacker Thermistor Failure */ _("printer-state-reasons.stacker-thermistor-failure"); /* TRANSLATORS: Stacker Timing Failure */ _("printer-state-reasons.stacker-timing-failure"); /* TRANSLATORS: Stacker Turned Off */ _("printer-state-reasons.stacker-turned-off"); /* TRANSLATORS: Stacker Turned On */ _("printer-state-reasons.stacker-turned-on"); /* TRANSLATORS: Stacker Under Temperature */ _("printer-state-reasons.stacker-under-temperature"); /* TRANSLATORS: Stacker Unrecoverable Failure */ _("printer-state-reasons.stacker-unrecoverable-failure"); /* TRANSLATORS: Stacker Unrecoverable Storage Error */ _("printer-state-reasons.stacker-unrecoverable-storage-error"); /* TRANSLATORS: Stacker Warming Up */ _("printer-state-reasons.stacker-warming-up"); /* TRANSLATORS: Stapler Added */ _("printer-state-reasons.stapler-added"); /* TRANSLATORS: Stapler Almost Empty */ _("printer-state-reasons.stapler-almost-empty"); /* TRANSLATORS: Stapler Almost Full */ _("printer-state-reasons.stapler-almost-full"); /* TRANSLATORS: Stapler At Limit */ _("printer-state-reasons.stapler-at-limit"); /* TRANSLATORS: Stapler Closed */ _("printer-state-reasons.stapler-closed"); /* TRANSLATORS: Stapler Configuration Change */ _("printer-state-reasons.stapler-configuration-change"); /* TRANSLATORS: Stapler Cover Closed */ _("printer-state-reasons.stapler-cover-closed"); /* TRANSLATORS: Stapler Cover Open */ _("printer-state-reasons.stapler-cover-open"); /* TRANSLATORS: Stapler Empty */ _("printer-state-reasons.stapler-empty"); /* TRANSLATORS: Stapler Full */ _("printer-state-reasons.stapler-full"); /* TRANSLATORS: Stapler Interlock Closed */ _("printer-state-reasons.stapler-interlock-closed"); /* TRANSLATORS: Stapler Interlock Open */ _("printer-state-reasons.stapler-interlock-open"); /* TRANSLATORS: Stapler Jam */ _("printer-state-reasons.stapler-jam"); /* TRANSLATORS: Stapler Life Almost Over */ _("printer-state-reasons.stapler-life-almost-over"); /* TRANSLATORS: Stapler Life Over */ _("printer-state-reasons.stapler-life-over"); /* TRANSLATORS: Stapler Memory Exhausted */ _("printer-state-reasons.stapler-memory-exhausted"); /* TRANSLATORS: Stapler Missing */ _("printer-state-reasons.stapler-missing"); /* TRANSLATORS: Stapler Motor Failure */ _("printer-state-reasons.stapler-motor-failure"); /* TRANSLATORS: Stapler Near Limit */ _("printer-state-reasons.stapler-near-limit"); /* TRANSLATORS: Stapler Offline */ _("printer-state-reasons.stapler-offline"); /* TRANSLATORS: Stapler Opened */ _("printer-state-reasons.stapler-opened"); /* TRANSLATORS: Stapler Over Temperature */ _("printer-state-reasons.stapler-over-temperature"); /* TRANSLATORS: Stapler Power Saver */ _("printer-state-reasons.stapler-power-saver"); /* TRANSLATORS: Stapler Recoverable Failure */ _("printer-state-reasons.stapler-recoverable-failure"); /* TRANSLATORS: Stapler Recoverable Storage */ _("printer-state-reasons.stapler-recoverable-storage"); /* TRANSLATORS: Stapler Removed */ _("printer-state-reasons.stapler-removed"); /* TRANSLATORS: Stapler Resource Added */ _("printer-state-reasons.stapler-resource-added"); /* TRANSLATORS: Stapler Resource Removed */ _("printer-state-reasons.stapler-resource-removed"); /* TRANSLATORS: Stapler Thermistor Failure */ _("printer-state-reasons.stapler-thermistor-failure"); /* TRANSLATORS: Stapler Timing Failure */ _("printer-state-reasons.stapler-timing-failure"); /* TRANSLATORS: Stapler Turned Off */ _("printer-state-reasons.stapler-turned-off"); /* TRANSLATORS: Stapler Turned On */ _("printer-state-reasons.stapler-turned-on"); /* TRANSLATORS: Stapler Under Temperature */ _("printer-state-reasons.stapler-under-temperature"); /* TRANSLATORS: Stapler Unrecoverable Failure */ _("printer-state-reasons.stapler-unrecoverable-failure"); /* TRANSLATORS: Stapler Unrecoverable Storage Error */ _("printer-state-reasons.stapler-unrecoverable-storage-error"); /* TRANSLATORS: Stapler Warming Up */ _("printer-state-reasons.stapler-warming-up"); /* TRANSLATORS: Stitcher Added */ _("printer-state-reasons.stitcher-added"); /* TRANSLATORS: Stitcher Almost Empty */ _("printer-state-reasons.stitcher-almost-empty"); /* TRANSLATORS: Stitcher Almost Full */ _("printer-state-reasons.stitcher-almost-full"); /* TRANSLATORS: Stitcher At Limit */ _("printer-state-reasons.stitcher-at-limit"); /* TRANSLATORS: Stitcher Closed */ _("printer-state-reasons.stitcher-closed"); /* TRANSLATORS: Stitcher Configuration Change */ _("printer-state-reasons.stitcher-configuration-change"); /* TRANSLATORS: Stitcher Cover Closed */ _("printer-state-reasons.stitcher-cover-closed"); /* TRANSLATORS: Stitcher Cover Open */ _("printer-state-reasons.stitcher-cover-open"); /* TRANSLATORS: Stitcher Empty */ _("printer-state-reasons.stitcher-empty"); /* TRANSLATORS: Stitcher Full */ _("printer-state-reasons.stitcher-full"); /* TRANSLATORS: Stitcher Interlock Closed */ _("printer-state-reasons.stitcher-interlock-closed"); /* TRANSLATORS: Stitcher Interlock Open */ _("printer-state-reasons.stitcher-interlock-open"); /* TRANSLATORS: Stitcher Jam */ _("printer-state-reasons.stitcher-jam"); /* TRANSLATORS: Stitcher Life Almost Over */ _("printer-state-reasons.stitcher-life-almost-over"); /* TRANSLATORS: Stitcher Life Over */ _("printer-state-reasons.stitcher-life-over"); /* TRANSLATORS: Stitcher Memory Exhausted */ _("printer-state-reasons.stitcher-memory-exhausted"); /* TRANSLATORS: Stitcher Missing */ _("printer-state-reasons.stitcher-missing"); /* TRANSLATORS: Stitcher Motor Failure */ _("printer-state-reasons.stitcher-motor-failure"); /* TRANSLATORS: Stitcher Near Limit */ _("printer-state-reasons.stitcher-near-limit"); /* TRANSLATORS: Stitcher Offline */ _("printer-state-reasons.stitcher-offline"); /* TRANSLATORS: Stitcher Opened */ _("printer-state-reasons.stitcher-opened"); /* TRANSLATORS: Stitcher Over Temperature */ _("printer-state-reasons.stitcher-over-temperature"); /* TRANSLATORS: Stitcher Power Saver */ _("printer-state-reasons.stitcher-power-saver"); /* TRANSLATORS: Stitcher Recoverable Failure */ _("printer-state-reasons.stitcher-recoverable-failure"); /* TRANSLATORS: Stitcher Recoverable Storage */ _("printer-state-reasons.stitcher-recoverable-storage"); /* TRANSLATORS: Stitcher Removed */ _("printer-state-reasons.stitcher-removed"); /* TRANSLATORS: Stitcher Resource Added */ _("printer-state-reasons.stitcher-resource-added"); /* TRANSLATORS: Stitcher Resource Removed */ _("printer-state-reasons.stitcher-resource-removed"); /* TRANSLATORS: Stitcher Thermistor Failure */ _("printer-state-reasons.stitcher-thermistor-failure"); /* TRANSLATORS: Stitcher Timing Failure */ _("printer-state-reasons.stitcher-timing-failure"); /* TRANSLATORS: Stitcher Turned Off */ _("printer-state-reasons.stitcher-turned-off"); /* TRANSLATORS: Stitcher Turned On */ _("printer-state-reasons.stitcher-turned-on"); /* TRANSLATORS: Stitcher Under Temperature */ _("printer-state-reasons.stitcher-under-temperature"); /* TRANSLATORS: Stitcher Unrecoverable Failure */ _("printer-state-reasons.stitcher-unrecoverable-failure"); /* TRANSLATORS: Stitcher Unrecoverable Storage Error */ _("printer-state-reasons.stitcher-unrecoverable-storage-error"); /* TRANSLATORS: Stitcher Warming Up */ _("printer-state-reasons.stitcher-warming-up"); /* TRANSLATORS: Partially stopped */ _("printer-state-reasons.stopped-partly"); /* TRANSLATORS: Stopping */ _("printer-state-reasons.stopping"); /* TRANSLATORS: Subunit Added */ _("printer-state-reasons.subunit-added"); /* TRANSLATORS: Subunit Almost Empty */ _("printer-state-reasons.subunit-almost-empty"); /* TRANSLATORS: Subunit Almost Full */ _("printer-state-reasons.subunit-almost-full"); /* TRANSLATORS: Subunit At Limit */ _("printer-state-reasons.subunit-at-limit"); /* TRANSLATORS: Subunit Closed */ _("printer-state-reasons.subunit-closed"); /* TRANSLATORS: Subunit Cooling Down */ _("printer-state-reasons.subunit-cooling-down"); /* TRANSLATORS: Subunit Empty */ _("printer-state-reasons.subunit-empty"); /* TRANSLATORS: Subunit Full */ _("printer-state-reasons.subunit-full"); /* TRANSLATORS: Subunit Life Almost Over */ _("printer-state-reasons.subunit-life-almost-over"); /* TRANSLATORS: Subunit Life Over */ _("printer-state-reasons.subunit-life-over"); /* TRANSLATORS: Subunit Memory Exhausted */ _("printer-state-reasons.subunit-memory-exhausted"); /* TRANSLATORS: Subunit Missing */ _("printer-state-reasons.subunit-missing"); /* TRANSLATORS: Subunit Motor Failure */ _("printer-state-reasons.subunit-motor-failure"); /* TRANSLATORS: Subunit Near Limit */ _("printer-state-reasons.subunit-near-limit"); /* TRANSLATORS: Subunit Offline */ _("printer-state-reasons.subunit-offline"); /* TRANSLATORS: Subunit Opened */ _("printer-state-reasons.subunit-opened"); /* TRANSLATORS: Subunit Over Temperature */ _("printer-state-reasons.subunit-over-temperature"); /* TRANSLATORS: Subunit Power Saver */ _("printer-state-reasons.subunit-power-saver"); /* TRANSLATORS: Subunit Recoverable Failure */ _("printer-state-reasons.subunit-recoverable-failure"); /* TRANSLATORS: Subunit Recoverable Storage */ _("printer-state-reasons.subunit-recoverable-storage"); /* TRANSLATORS: Subunit Removed */ _("printer-state-reasons.subunit-removed"); /* TRANSLATORS: Subunit Resource Added */ _("printer-state-reasons.subunit-resource-added"); /* TRANSLATORS: Subunit Resource Removed */ _("printer-state-reasons.subunit-resource-removed"); /* TRANSLATORS: Subunit Thermistor Failure */ _("printer-state-reasons.subunit-thermistor-failure"); /* TRANSLATORS: Subunit Timing Failure */ _("printer-state-reasons.subunit-timing-Failure"); /* TRANSLATORS: Subunit Turned Off */ _("printer-state-reasons.subunit-turned-off"); /* TRANSLATORS: Subunit Turned On */ _("printer-state-reasons.subunit-turned-on"); /* TRANSLATORS: Subunit Under Temperature */ _("printer-state-reasons.subunit-under-temperature"); /* TRANSLATORS: Subunit Unrecoverable Failure */ _("printer-state-reasons.subunit-unrecoverable-failure"); /* TRANSLATORS: Subunit Unrecoverable Storage */ _("printer-state-reasons.subunit-unrecoverable-storage"); /* TRANSLATORS: Subunit Warming Up */ _("printer-state-reasons.subunit-warming-up"); /* TRANSLATORS: Printer stopped responding */ _("printer-state-reasons.timed-out"); /* TRANSLATORS: Out of toner */ _("printer-state-reasons.toner-empty"); /* TRANSLATORS: Toner low */ _("printer-state-reasons.toner-low"); /* TRANSLATORS: Trimmer Added */ _("printer-state-reasons.trimmer-added"); /* TRANSLATORS: Trimmer Almost Empty */ _("printer-state-reasons.trimmer-almost-empty"); /* TRANSLATORS: Trimmer Almost Full */ _("printer-state-reasons.trimmer-almost-full"); /* TRANSLATORS: Trimmer At Limit */ _("printer-state-reasons.trimmer-at-limit"); /* TRANSLATORS: Trimmer Closed */ _("printer-state-reasons.trimmer-closed"); /* TRANSLATORS: Trimmer Configuration Change */ _("printer-state-reasons.trimmer-configuration-change"); /* TRANSLATORS: Trimmer Cover Closed */ _("printer-state-reasons.trimmer-cover-closed"); /* TRANSLATORS: Trimmer Cover Open */ _("printer-state-reasons.trimmer-cover-open"); /* TRANSLATORS: Trimmer Empty */ _("printer-state-reasons.trimmer-empty"); /* TRANSLATORS: Trimmer Full */ _("printer-state-reasons.trimmer-full"); /* TRANSLATORS: Trimmer Interlock Closed */ _("printer-state-reasons.trimmer-interlock-closed"); /* TRANSLATORS: Trimmer Interlock Open */ _("printer-state-reasons.trimmer-interlock-open"); /* TRANSLATORS: Trimmer Jam */ _("printer-state-reasons.trimmer-jam"); /* TRANSLATORS: Trimmer Life Almost Over */ _("printer-state-reasons.trimmer-life-almost-over"); /* TRANSLATORS: Trimmer Life Over */ _("printer-state-reasons.trimmer-life-over"); /* TRANSLATORS: Trimmer Memory Exhausted */ _("printer-state-reasons.trimmer-memory-exhausted"); /* TRANSLATORS: Trimmer Missing */ _("printer-state-reasons.trimmer-missing"); /* TRANSLATORS: Trimmer Motor Failure */ _("printer-state-reasons.trimmer-motor-failure"); /* TRANSLATORS: Trimmer Near Limit */ _("printer-state-reasons.trimmer-near-limit"); /* TRANSLATORS: Trimmer Offline */ _("printer-state-reasons.trimmer-offline"); /* TRANSLATORS: Trimmer Opened */ _("printer-state-reasons.trimmer-opened"); /* TRANSLATORS: Trimmer Over Temperature */ _("printer-state-reasons.trimmer-over-temperature"); /* TRANSLATORS: Trimmer Power Saver */ _("printer-state-reasons.trimmer-power-saver"); /* TRANSLATORS: Trimmer Recoverable Failure */ _("printer-state-reasons.trimmer-recoverable-failure"); /* TRANSLATORS: Trimmer Recoverable Storage */ _("printer-state-reasons.trimmer-recoverable-storage"); /* TRANSLATORS: Trimmer Removed */ _("printer-state-reasons.trimmer-removed"); /* TRANSLATORS: Trimmer Resource Added */ _("printer-state-reasons.trimmer-resource-added"); /* TRANSLATORS: Trimmer Resource Removed */ _("printer-state-reasons.trimmer-resource-removed"); /* TRANSLATORS: Trimmer Thermistor Failure */ _("printer-state-reasons.trimmer-thermistor-failure"); /* TRANSLATORS: Trimmer Timing Failure */ _("printer-state-reasons.trimmer-timing-failure"); /* TRANSLATORS: Trimmer Turned Off */ _("printer-state-reasons.trimmer-turned-off"); /* TRANSLATORS: Trimmer Turned On */ _("printer-state-reasons.trimmer-turned-on"); /* TRANSLATORS: Trimmer Under Temperature */ _("printer-state-reasons.trimmer-under-temperature"); /* TRANSLATORS: Trimmer Unrecoverable Failure */ _("printer-state-reasons.trimmer-unrecoverable-failure"); /* TRANSLATORS: Trimmer Unrecoverable Storage Error */ _("printer-state-reasons.trimmer-unrecoverable-storage-error"); /* TRANSLATORS: Trimmer Warming Up */ _("printer-state-reasons.trimmer-warming-up"); /* TRANSLATORS: Unknown */ _("printer-state-reasons.unknown"); /* TRANSLATORS: Wrapper Added */ _("printer-state-reasons.wrapper-added"); /* TRANSLATORS: Wrapper Almost Empty */ _("printer-state-reasons.wrapper-almost-empty"); /* TRANSLATORS: Wrapper Almost Full */ _("printer-state-reasons.wrapper-almost-full"); /* TRANSLATORS: Wrapper At Limit */ _("printer-state-reasons.wrapper-at-limit"); /* TRANSLATORS: Wrapper Closed */ _("printer-state-reasons.wrapper-closed"); /* TRANSLATORS: Wrapper Configuration Change */ _("printer-state-reasons.wrapper-configuration-change"); /* TRANSLATORS: Wrapper Cover Closed */ _("printer-state-reasons.wrapper-cover-closed"); /* TRANSLATORS: Wrapper Cover Open */ _("printer-state-reasons.wrapper-cover-open"); /* TRANSLATORS: Wrapper Empty */ _("printer-state-reasons.wrapper-empty"); /* TRANSLATORS: Wrapper Full */ _("printer-state-reasons.wrapper-full"); /* TRANSLATORS: Wrapper Interlock Closed */ _("printer-state-reasons.wrapper-interlock-closed"); /* TRANSLATORS: Wrapper Interlock Open */ _("printer-state-reasons.wrapper-interlock-open"); /* TRANSLATORS: Wrapper Jam */ _("printer-state-reasons.wrapper-jam"); /* TRANSLATORS: Wrapper Life Almost Over */ _("printer-state-reasons.wrapper-life-almost-over"); /* TRANSLATORS: Wrapper Life Over */ _("printer-state-reasons.wrapper-life-over"); /* TRANSLATORS: Wrapper Memory Exhausted */ _("printer-state-reasons.wrapper-memory-exhausted"); /* TRANSLATORS: Wrapper Missing */ _("printer-state-reasons.wrapper-missing"); /* TRANSLATORS: Wrapper Motor Failure */ _("printer-state-reasons.wrapper-motor-failure"); /* TRANSLATORS: Wrapper Near Limit */ _("printer-state-reasons.wrapper-near-limit"); /* TRANSLATORS: Wrapper Offline */ _("printer-state-reasons.wrapper-offline"); /* TRANSLATORS: Wrapper Opened */ _("printer-state-reasons.wrapper-opened"); /* TRANSLATORS: Wrapper Over Temperature */ _("printer-state-reasons.wrapper-over-temperature"); /* TRANSLATORS: Wrapper Power Saver */ _("printer-state-reasons.wrapper-power-saver"); /* TRANSLATORS: Wrapper Recoverable Failure */ _("printer-state-reasons.wrapper-recoverable-failure"); /* TRANSLATORS: Wrapper Recoverable Storage */ _("printer-state-reasons.wrapper-recoverable-storage"); /* TRANSLATORS: Wrapper Removed */ _("printer-state-reasons.wrapper-removed"); /* TRANSLATORS: Wrapper Resource Added */ _("printer-state-reasons.wrapper-resource-added"); /* TRANSLATORS: Wrapper Resource Removed */ _("printer-state-reasons.wrapper-resource-removed"); /* TRANSLATORS: Wrapper Thermistor Failure */ _("printer-state-reasons.wrapper-thermistor-failure"); /* TRANSLATORS: Wrapper Timing Failure */ _("printer-state-reasons.wrapper-timing-failure"); /* TRANSLATORS: Wrapper Turned Off */ _("printer-state-reasons.wrapper-turned-off"); /* TRANSLATORS: Wrapper Turned On */ _("printer-state-reasons.wrapper-turned-on"); /* TRANSLATORS: Wrapper Under Temperature */ _("printer-state-reasons.wrapper-under-temperature"); /* TRANSLATORS: Wrapper Unrecoverable Failure */ _("printer-state-reasons.wrapper-unrecoverable-failure"); /* TRANSLATORS: Wrapper Unrecoverable Storage Error */ _("printer-state-reasons.wrapper-unrecoverable-storage-error"); /* TRANSLATORS: Wrapper Warming Up */ _("printer-state-reasons.wrapper-warming-up"); /* TRANSLATORS: Idle */ _("printer-state.3"); /* TRANSLATORS: Processing */ _("printer-state.4"); /* TRANSLATORS: Stopped */ _("printer-state.5"); /* TRANSLATORS: Printer Uptime */ _("printer-up-time"); /* TRANSLATORS: Proof Print */ _("proof-print"); /* TRANSLATORS: Proof Print Copies */ _("proof-print-copies"); /* TRANSLATORS: Punching */ _("punching"); /* TRANSLATORS: Punching Locations */ _("punching-locations"); /* TRANSLATORS: Punching Offset */ _("punching-offset"); /* TRANSLATORS: Punch Edge */ _("punching-reference-edge"); /* TRANSLATORS: Bottom */ _("punching-reference-edge.bottom"); /* TRANSLATORS: Left */ _("punching-reference-edge.left"); /* TRANSLATORS: Right */ _("punching-reference-edge.right"); /* TRANSLATORS: Top */ _("punching-reference-edge.top"); /* TRANSLATORS: Requested Attributes */ _("requested-attributes"); /* TRANSLATORS: Retry Interval */ _("retry-interval"); /* TRANSLATORS: Retry Timeout */ _("retry-time-out"); /* TRANSLATORS: Save Disposition */ _("save-disposition"); /* TRANSLATORS: None */ _("save-disposition.none"); /* TRANSLATORS: Print and Save */ _("save-disposition.print-save"); /* TRANSLATORS: Save Only */ _("save-disposition.save-only"); /* TRANSLATORS: Save Document Format */ _("save-document-format"); /* TRANSLATORS: Save Info */ _("save-info"); /* TRANSLATORS: Save Location */ _("save-location"); /* TRANSLATORS: Save Name */ _("save-name"); /* TRANSLATORS: Separator Sheets */ _("separator-sheets"); /* TRANSLATORS: Type of Separator Sheets */ _("separator-sheets-type"); /* TRANSLATORS: Start and End Sheets */ _("separator-sheets-type.both-sheets"); /* TRANSLATORS: End Sheet */ _("separator-sheets-type.end-sheet"); /* TRANSLATORS: None */ _("separator-sheets-type.none"); /* TRANSLATORS: Slip Sheets */ _("separator-sheets-type.slip-sheets"); /* TRANSLATORS: Start Sheet */ _("separator-sheets-type.start-sheet"); /* TRANSLATORS: 2-Sided Printing */ _("sides"); /* TRANSLATORS: Off */ _("sides.one-sided"); /* TRANSLATORS: On (Portrait) */ _("sides.two-sided-long-edge"); /* TRANSLATORS: On (Landscape) */ _("sides.two-sided-short-edge"); /* TRANSLATORS: Status Message */ _("status-message"); /* TRANSLATORS: Staple */ _("stitching"); /* TRANSLATORS: Stitching Angle */ _("stitching-angle"); /* TRANSLATORS: Stitching Locations */ _("stitching-locations"); /* TRANSLATORS: Staple Method */ _("stitching-method"); /* TRANSLATORS: Automatic */ _("stitching-method.auto"); /* TRANSLATORS: Crimp */ _("stitching-method.crimp"); /* TRANSLATORS: Wire */ _("stitching-method.wire"); /* TRANSLATORS: Stitching Offset */ _("stitching-offset"); /* TRANSLATORS: Staple Edge */ _("stitching-reference-edge"); /* TRANSLATORS: Bottom */ _("stitching-reference-edge.bottom"); /* TRANSLATORS: Left */ _("stitching-reference-edge.left"); /* TRANSLATORS: Right */ _("stitching-reference-edge.right"); /* TRANSLATORS: Top */ _("stitching-reference-edge.top"); /* TRANSLATORS: Subject */ _("subject"); /* TRANSLATORS: Subscription Privacy Attributes */ _("subscription-privacy-attributes"); /* TRANSLATORS: All */ _("subscription-privacy-attributes.all"); /* TRANSLATORS: Default */ _("subscription-privacy-attributes.default"); /* TRANSLATORS: None */ _("subscription-privacy-attributes.none"); /* TRANSLATORS: Subscription Description */ _("subscription-privacy-attributes.subscription-description"); /* TRANSLATORS: Subscription Template */ _("subscription-privacy-attributes.subscription-template"); /* TRANSLATORS: Subscription Privacy Scope */ _("subscription-privacy-scope"); /* TRANSLATORS: All */ _("subscription-privacy-scope.all"); /* TRANSLATORS: Default */ _("subscription-privacy-scope.default"); /* TRANSLATORS: None */ _("subscription-privacy-scope.none"); /* TRANSLATORS: Owner */ _("subscription-privacy-scope.owner"); /* TRANSLATORS: T33 Subaddress */ _("t33-subaddress"); /* TRANSLATORS: To Name */ _("to-name"); /* TRANSLATORS: Transmission Status */ _("transmission-status"); /* TRANSLATORS: Pending */ _("transmission-status.3"); /* TRANSLATORS: Pending Retry */ _("transmission-status.4"); /* TRANSLATORS: Processing */ _("transmission-status.5"); /* TRANSLATORS: Canceled */ _("transmission-status.7"); /* TRANSLATORS: Aborted */ _("transmission-status.8"); /* TRANSLATORS: Completed */ _("transmission-status.9"); /* TRANSLATORS: Cut */ _("trimming"); /* TRANSLATORS: Cut Position */ _("trimming-offset"); /* TRANSLATORS: Cut Edge */ _("trimming-reference-edge"); /* TRANSLATORS: Bottom */ _("trimming-reference-edge.bottom"); /* TRANSLATORS: Left */ _("trimming-reference-edge.left"); /* TRANSLATORS: Right */ _("trimming-reference-edge.right"); /* TRANSLATORS: Top */ _("trimming-reference-edge.top"); /* TRANSLATORS: Type of Cut */ _("trimming-type"); /* TRANSLATORS: Draw Line */ _("trimming-type.draw-line"); /* TRANSLATORS: Full */ _("trimming-type.full"); /* TRANSLATORS: Partial */ _("trimming-type.partial"); /* TRANSLATORS: Perforate */ _("trimming-type.perforate"); /* TRANSLATORS: Score */ _("trimming-type.score"); /* TRANSLATORS: Tab */ _("trimming-type.tab"); /* TRANSLATORS: Cut After */ _("trimming-when"); /* TRANSLATORS: Every Document */ _("trimming-when.after-documents"); /* TRANSLATORS: Job */ _("trimming-when.after-job"); /* TRANSLATORS: Every Set */ _("trimming-when.after-sets"); /* TRANSLATORS: Every Page */ _("trimming-when.after-sheets"); /* TRANSLATORS: X Accuracy */ _("x-accuracy"); /* TRANSLATORS: X Dimension */ _("x-dimension"); /* TRANSLATORS: X Offset */ _("x-offset"); /* TRANSLATORS: X Origin */ _("x-origin"); /* TRANSLATORS: Y Accuracy */ _("y-accuracy"); /* TRANSLATORS: Y Dimension */ _("y-dimension"); /* TRANSLATORS: Y Offset */ _("y-offset"); /* TRANSLATORS: Y Origin */ _("y-origin"); /* TRANSLATORS: Z Accuracy */ _("z-accuracy"); /* TRANSLATORS: Z Dimension */ _("z-dimension"); /* TRANSLATORS: Z Offset */ _("z-offset"); cups-2.3.1/locale/Makefile000664 000765 000024 00000007424 13574721672 015505 0ustar00mikestaff000000 000000 # # Locale file makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1993-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs OBJS = checkpo.o po2strings.o strings2po.o TARGETS = checkpo po2strings strings2po # # Make everything... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all config and object files... # clean: $(RM) $(TARGETS) $(OBJS) # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: $(INSTALL_LANGUAGES) install-languages: $(INSTALL_DIR) -m 755 $(LOCALEDIR) for loc in en $(LANGUAGES) ; do \ if test -f cups_$$loc.po; then \ $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \ $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ fi ; \ done install-langbundle: $(INSTALL_DIR) -m 755 "$(BUILDROOT)$(RESOURCEDIR)" $(INSTALL_DATA) cups.strings "$(BUILDROOT)$(RESOURCEDIR)" # # Install programs... # install-exec: # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall files... # uninstall: $(UNINSTALL_LANGUAGES) uninstall-languages: -for loc in en $(LANGUAGES) ; do \ $(RM) $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ done uninstall-langbundle: $(RM) "$(BUILDROOT)$(RESOURCEDIR)/cups.strings" # # pot - Creates/updates the cups.pot template file, merges changes into existing # message catalogs, and updates the cups.strings file. We don't use # xgettext to update the cups.strings file due to known xgettext bugs. # pot: checkpo po2strings echo Updating cups.pot... mv cups.pot cups.pot.bck touch cups.pot cd ..; xgettext -o locale/cups.pot -cTRANSLATORS -s \ --keyword=_ --no-wrap --from-code utf-8 \ --copyright-holder="Apple Inc." \ --package-name="CUPS" --package-version="$(CUPS_VERSION)" \ --msgid-bugs-address="https://github.com/apple/cups/issues" \ */*.c */*.cxx (cat cups.header; tail +6 cups.pot) > cups.pot.N mv cups.pot.N cups.pot echo Checking cups.pot... ./checkpo cups.pot for loc in *.po ; do \ if test $$loc = '*.po'; then \ break; \ fi; \ echo Merging changes into $$loc... ; \ msgmerge -o $$loc -s -N --no-location $$loc cups.pot ; \ done echo Updating cups.strings... ./po2strings cups_en.po cups.strings cups.strings: cups_en.po po2strings echo Updating cups.strings... ./po2strings cups_en.po cups.strings # # checkpo - A simple utility to check PO files for correct translation # strings. Dependency on static library is deliberate. # # checkpo filename.po [... filenameN.po] # checkpo: checkpo.o ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o checkpo checkpo.o \ $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ checkall: checkpo ./checkpo *.po *.strings # # po2strings - A simple utility which uses iconv to convert GNU gettext # message catalogs to macOS .strings files. # # po2strings filename.po filename.strings # po2strings: po2strings.o ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o po2strings po2strings.o \ $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # strings2po - A simple utility which uses iconv to convert macOS .strings files # to GNU gettext message catalogs. # # strings2po filename.strings filename.po # strings2po: strings2po.o echo Linking $@... $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o strings2po strings2po.o $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Dependencies... # include Dependencies cups-2.3.1/locale/cups_pt_BR.po000664 000765 000024 00001226215 13574721672 016447 0ustar00mikestaff000000 000000 # # Brazilian Portuguese message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # CUPS Glossary/Terminologies en->pt_BR # # character set = conjunto de caracteres # find = encontrar # get = obter # locate = localizar # not supported = Sem suporte a # open = abrir # status = estado # unable = não foi possível # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2016-01-31 16:45-0200\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.6\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "\t\t(all)" msgstr "\t\t(todos)" msgid "\t\t(none)" msgstr "\t\t(nenhum)" #, c-format msgid "\t%d entries" msgstr "\t%d registros" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tApós a falha: continuar" #, c-format msgid "\tAlerts: %s" msgstr "\tAlertas: %s" msgid "\tBanner required" msgstr "\tBanner é necessário" msgid "\tCharset sets:" msgstr "\tDefinições de conjunto de caracteres:" msgid "\tConnection: direct" msgstr "\tConexão: direta" msgid "\tConnection: remote" msgstr "\tConexão: remota" msgid "\tContent types: any" msgstr "\tTipos de conteúdos: qualquer" msgid "\tDefault page size:" msgstr "\tTamanho de página padrão:" msgid "\tDefault pitch:" msgstr "\tPitch padrão:" msgid "\tDefault port settings:" msgstr "\tConfiguração de porta padrão:" #, c-format msgid "\tDescription: %s" msgstr "\tDescrição: %s" msgid "\tForm mounted:" msgstr "\tFormulário montado:" msgid "\tForms allowed:" msgstr "\tFormulários permitidos:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tInterface: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tInterface: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tLocalização: %s" msgid "\tOn fault: no alert" msgstr "\tCaso de falha: nenhum alerta" msgid "\tPrinter types: unknown" msgstr "\tTipos de impressoras: desconhecido" #, c-format msgid "\tStatus: %s" msgstr "\tEstado: %s" msgid "\tUsers allowed:" msgstr "\tUsuários permitidos:" msgid "\tUsers denied:" msgstr "\tUsuários proibidos:" msgid "\tdaemon present" msgstr "\tdaemon presente" msgid "\tno entries" msgstr "\tnenhum registro" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\timpressora está na velocidade -1 do dispositivo \"%s\"" msgid "\tprinting is disabled" msgstr "\timpressão está desabilitada" msgid "\tprinting is enabled" msgstr "\timpressão está habilitada" #, c-format msgid "\tqueued for %s" msgstr "\tna fila de %s" msgid "\tqueuing is disabled" msgstr "\tenfileiramento está desabilitado" msgid "\tqueuing is enabled" msgstr "\tenfileiramento está habilitado" msgid "\treason unknown" msgstr "\tmotivo desconhecido" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " RESULTADOS DETALHADOS DE TESTE DE CONFORMIDADE" msgid " REF: Page 15, section 3.1." msgstr " REF: Página 15, seção 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Página 15, seção 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Página 19, seção 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Página 20, seção 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Página 27, seção 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Página 42, seção 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Página 16-17, seção 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Página 42-45, seção 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Página 45-46, seção 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Página 48-49, seção 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Página 52-54, seção 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f bytes" #, c-format msgid " PASS Default%s" msgstr " PASSOU Default%s" msgid " PASS DefaultImageableArea" msgstr " PASSOU DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " PASSOU DefaultPaperDimension" msgid " PASS FileVersion" msgstr " PASSOU FileVersion" msgid " PASS FormatVersion" msgstr " PASSOU FormatVersion" msgid " PASS LanguageEncoding" msgstr " PASSOU LanguageEncoding" msgid " PASS LanguageVersion" msgstr " PASSOU LanguageVersion" msgid " PASS Manufacturer" msgstr " PASSOU Manufacturer" msgid " PASS ModelName" msgstr " PASSOU ModelName" msgid " PASS NickName" msgstr " PASSOU NickName" msgid " PASS PCFileName" msgstr " PASSOU PCFileName" msgid " PASS PSVersion" msgstr " PASSOU PSVersion" msgid " PASS PageRegion" msgstr " PASSOU PageRegion" msgid " PASS PageSize" msgstr " PASSOU PageSize" msgid " PASS Product" msgstr " PASSOU Product" msgid " PASS ShortNickName" msgstr " PASSOU ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " AVISO %s não possui opções correspondentes." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " AVISO %s compartilha um prefixo comum com %s\n" " REF: Página 15, seção 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " AVISO A opção Duplex de palavra-chave %s pode não funcionar como " "esperado e deve ser renomeada para Duplex.\n" " REF: Página 122, seção 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" " AVISO Arquivo contém fim das linhas com uma mistura de CR, LF e CR " "LF." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " AVISO LanguageEncoding é necessário pela especificação PPD 4.3.\n" " REF: Páginas 56-57, seção 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " AVISO Linha %d contém somente espaço em branco." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " AVISO Fabricante é necessário pela especificação PPD 4.3.\n" " REF: Páginas 58-59, seção 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " AVISO Arquivos PPD de sistemas não-Windows deveriam usar fim de " "linhas somente com LR, e não CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " AVISO PPD versão %.1f está obsoleto.\n" " REF: Página 42, seção 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " AVISO PCFileName maior que 8.3 em violação com especificação PPD.\n" " REF: Páginas 61-62, seção 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " AVISO PCFileName deveria conter um nome de arquivo único.\n" " REF: Páginas 61-62, seção 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " AVISO Protocolos contêm PJL, mas atributos de JCL não estão " "definidos.\n" " REF: Páginas 78-79, seção 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " AVISO Protocolos contêm ambos PJL e BCP; esperava-se TBCP.\n" " REF: Páginas 78-79, seção 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " AVISO ShortNickName é necessário pela especificação PPD 4.3.\n" " REF: Páginas 64-65, seção 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" conflita com \"%s %s\"\n" " (restrição=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s não existe." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s Arquivo de %s \"%s\" possui letra maiúscula incorreta." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s Escolha %s inválida para %s.\n" " REF: Página 122, seção 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s Má string de tradução de \"%s\" em UTF-8 para a opção %s, escolha " "%s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %s Má string de tradução de \"%s\" em UTF-8 para a opção %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s Valor \"%s\" inválido para cupsFilter." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s Valor \"%s\" inválido para cupsFilter2." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s cupsICCProfile %s inválido." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s Valor \"%s\" inválido para cupsPreFilter." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s cupsUIConstraints %s inválido: \"%s\"" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s Idioma \"%s\" inválido." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s Permissões inválidas no arquivo %s \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s Pronúncia incorreta de %s - deveria ser %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" " %s Não é possível fornecer ambos APScanAppPath e APScanAppBundleID." #, c-format msgid " %s Default choices conflicting." msgstr " %s Escolhas padrão conflitando." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s cupsUIConstraints %s vazia" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" " %s Faltando string de tradução de \"%s\" para a opção %s, escolha %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s Faltando string de tradução de \"%s\" para a opção %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s Faltando %s arquivo \"%s\"." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s Faltando opção NECESSÁRIA PageRegion.\n" " REF: Página 100, seção 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s Faltando opção NECESSÁRIA PageSize.\n" " REF: Página 99, seção 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" " %s Faltando escolha de *%s %s em UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Faltando escolha *%s %s em cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s Faltando cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Faltando a opção %s em UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Faltando a opção %s em cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s Nenhuma tradução base de \"%s\" está inclusa no arquivo." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s %s NECESSÁRIO não define a escolha None.\n" " REF: Página 122, seção 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %s Tamanho \"%s\" definido para %s, mas não para %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s Tamanho \"%s\" tem dimensões inesperadas (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s Tamanho \"%s\" deveria ser \"%s\"." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" " %s Tamanho \"%s\" deveria ser no padrão do Adobo chamado \"%s\"." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s Valor de hash de cupsICCProfile %s colide com %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s causa um loop." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" " %s cupsUIResolver %s não lista pelo menos duas opções diferentes." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **FALHA** %s deve ser 1284DeviceID\n" " REF: Página 72, seção 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **FALHA** Default%s inválido %s\n" " REF: Página 40, seção 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **FALHA** DefaultImageableArea inválido %s\n" " REF: Página 102, seção 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **FALHA** DefaultPaperDimension inválido %s\n" " REF: Página 103, seção 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FALHA** FileVersion inválido \"%s\"\n" " REF: Página 56, seção 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FALHA** FormatVersion inválido \"%s\"\n" " REF: Página 56, seção 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **FALHA** Atributo inválido de JobPatchFile no arquivo\n" " REF: Página 24, seção 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr " **FALHA** LanguageEncoding inválido %s - tem que ser ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr " **FALHA** LanguageVersion inválido %s - deve ser Inglês." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **FALHA** Manufacturer inválido (deveria ser \"%s\")\n" " REF: Página 211, tabela D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FALHA** ModelName inválido - \"%c\" não permitido na string.\n" " REF: Páginas 59-60, seção 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FALHA** PSVersion inválida - não \"(string) int\".\n" " REF: Páginas 62-64, seção 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **FALHA** Product inválido - não \"(string)\".\n" " REF: Página 62, seção 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **FALHA** ShortNickName inválido - maior do que 31 caracteres.\n" " REF: Páginas 64-65, seção 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **FALHA** Opção inválido %s escolha %s\n" " REF: Página 84, seção 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr " **FALHA** Código de opção padrão não pode ser interpretado: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **FALHA** String de tradução padrão para opção %s escolha %s contém " "caracteres de 8-bit." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **FALHA** String de tradução padrão para opção %s contém caracteres de " "8-bit." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" " **FALHA** Nomes dos grupos %s e %s se diferem somente por maiúsculo/" "minúsculo." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr " **FALHA** Múltiplas ocorrências da opção %s escolha de nome %s." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" " **FALHA** Opção %s escolha de nomes %s e %s se diferem somente por " "maiúsculo/minúsculo." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" " **FALHA** Os nomes de opção %s e %s se diferem somente por maiúsculo/" "minúsculo." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **FALHA** NECESSÁRIO Default%s\n" " REF: Página 40, seção 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **FALHA** NECESSÁRIO DefaultImageableArea\n" " REF: Página 102, seção 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **FALHA** NECESSÁRIO DefaultPaperDimension\n" " REF: Página 103, seção 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FALHA** NECESSÁRIO FileVersion\n" " REF: Página 56, seção 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FALHA** NECESSÁRIO FormatVersion\n" " REF: Página 56, seção 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **FALHA** NECESSÁRIO ImageableArea para PageSize %s\n" " REF: Página 41, seção 5.\n" " REF: Página 102, seção 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **FALHA** NECESSÁRIO LanguageEncoding\n" " REF: Páginas 56-57, seção 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **FALHA** NECESSÁRIO LanguageVersion\n" " REF: Páginas 57-58, seção 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **FALHA** NECESSÁRIO Manufacturer\n" " REF: Páginas 58-59, seção 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FALHA** NECESSÁRIO ModelName\n" " REF: Páginas 59-60, seção 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **FALHA** NECESSÁRIO NickName\n" " REF: Página 60, seção 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **FALHA** NECESSÁRIO PCFileName\n" " REF: Páginas 61-62, seção 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FALHA** NECESSÁRIO PSVersion\n" " REF: Páginas 62-64, seção 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **FALHA** NECESSÁRIO PageRegion\n" " REF: Página 100, seção 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **FALHA** NECESSÁRIO PageSize\n" " REF: Página 41, seção 5.\n" " REF: Página 99, seção 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **FALHA** NECESSÁRIO PageSize\n" " REF: Páginas 99-100, seção 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **FALHA** NECESSÁRIO PaperDimension para PageSize %s\n" " REF: Página 41, seção 5.\n" " REF: Página 103, seção 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **FALHA** NECESSÁRIO Product\n" " REF: Página 62, seção 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **FALHA** NECESSÁRIO ShortNickName\n" " REF: Página 64-65, seção 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr " **FALHA** Não foi possível abrir o arquivo PPD - %s na linha %d." #, c-format msgid " %d ERRORS FOUND" msgstr " %d ERROS ENCONTRADOS" msgid " NO ERRORS FOUND" msgstr " NENHUM ERRO ENCONTRADO" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Fim de linhas com CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Fim de linhas com CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr " --list-filters Lista filtros que serão usados." msgid " -D Remove the input file when finished." msgstr " -D Remove o arquivo de entrada ao finalizar." msgid " -D name=value Set named variable to value." msgstr " -D nome=valor Define a variável \"nome\" com \"valor\"." msgid " -I include-dir Add include directory to search path." msgstr "" " -I dir-include Adiciona diretório de include ao caminho de " "pesquisa." msgid " -P filename.ppd Set PPD file." msgstr " -P arquivo.ppd Define arquivo PPD." msgid " -U username Specify username." msgstr " -U usuário Especifica nome do usuário." msgid " -c catalog.po Load the specified message catalog." msgstr "" " -c catálogo.po Carrega o catálogo de mensagens especificado." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" " -c cups-files.conf Define o arquivo cups-files.conf para ser usado." msgid " -d output-dir Specify the output directory." msgstr " -d dir-saída Especifica o diretório de saída." msgid " -d printer Use the named printer." msgstr " -d impressora Usa a impressora informada." msgid " -e Use every filter from the PPD file." msgstr " -e Usa todos os filtros do arquivo PPD." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i tipo-mime Define o tipo MIME de entrada (caso " "contrário, tipo automático)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] Filtra o arquivo N do trabalho especificado " "(o padrão é o arquivo 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l idioma[,idioma,...] Especifica o(s) idioma(s) de saída (locale)." msgid " -m Use the ModelName value as the filename." msgstr "" " -m Usa o valor de ModelName como o nome de arquivo." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m tipo-mime Define o tipo MIME de saída (caso " "contrário, aplicação/pdf)." msgid " -n copies Set number of copies." msgstr " -n cópias Define número de cópias." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o arquivo.drv Define o arquivo de informações do " "driver (caso contrário, ppdi.drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o arquivo.ppd[.gz] Define arquivo de saída (caso contrário, stdout)." msgid " -o name=value Set option(s)." msgstr " -o nome=valor Define opção/opções." msgid " -p filename.ppd Set PPD file." msgstr " -p arquivo.ppd Define arquivo PPD." msgid " -t Test PPDs instead of generating them." msgstr " -t Testa PPDs ao invés de criá-los." msgid " -t title Set title." msgstr " -t título Define um título." msgid " -u Remove the PPD file when finished." msgstr " -u Remove o arquivo PPD ao final." msgid " -v Be verbose." msgstr " -v Modo detalhado." msgid " -z Compress PPD files using GNU zip." msgstr " -z Compacta arquivos PPD usando GNU zip." msgid " FAIL" msgstr " FALHA" msgid " PASS" msgstr " PASSOU" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes" #, c-format msgid "%d x %d mm" msgstr "%d x %d mm" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (Sem borda)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (Sem borda, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (Sem borda, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s está aceitando requisições desde %s" #, c-format msgid "%s cannot be changed." msgstr "%s não pode ser alterada." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s não está implementada pela versão CUPS do lpc." #, c-format msgid "%s is not ready" msgstr "%s não está pronta" #, c-format msgid "%s is ready" msgstr "%s está pronta" #, c-format msgid "%s is ready and printing" msgstr "%s está pronta e imprimindo" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s job-id usuário título cópia opções [arquivo]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s não está aceitando requisições desde %s -" #, c-format msgid "%s not supported." msgstr "não há suporte a %s." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s está aceitando requisições desde %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s não está aceitando requisições desde %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [trabalho %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s falhou: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s: URI de impressora inválida \"%s\"." #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: Versão inválida %s para \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: Não sei o que fazer." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: Erro - A variável de ambiente %s contém destino inexistente \"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Erro - adicione '/version=1.1' ao nome do servidor." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: Erro - ID de trabalho inválido." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: Erro - não é possível imprimir arquivos e alterar trabalhos " "simultaneamente." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: Erro - não é possível imprimir de stdin se os arquivos ou um ID de " "trabalho forem fornecidos." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Erro - esperava uma codificação de caracteres após a opção \"-S\"." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: Erro - esperava um tipo de conteúdo após a opção \"-T\"." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: Erro - esperava cópias após a opção \"-#\"." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: Erro - esperava cópias após a opção \"-n\"." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Erro - esperava um destino após a opção \"-P\"." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: Erro - esperava um destino após a opção \"-d\"." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Erro - esperava um formulário após a opção \"-f\"." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Erro - esperava um nome para segurar após a opção \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: Erro - esperava o nome da máquina após a opção \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: Erro - esperava o nome da máquina após a opção \"-h\"." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Erro - esperava uma lista de modos após a opção \"-y\"." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: Erro - esperava um nome após a opção \"-%c\"." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Erro - esperava opção=valor após a opção \"-o\"." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: Erro - esperava uma lista de página após a opção \"-P\"." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Erro - esperava uma prioridade após a opção \"-%c\"." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: Erro - esperava um texto com motivo após a opção \"-r\"." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Erro - esperava um título após a opção \"-t\"." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: Erro - esperava um nome de usuário após a opção \"-U\"." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: Erro - esperava um nome de usuário após a opção \"-u\"." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: Erro - esperava um valor após a opção \"-%c\"." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: Erro - precisa de \"completed\", \"not-completed\" ou \"all\" após a " "opção \"-W\"." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: Erro - nenhum destino padrão disponível." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: Erro - prioridade deve estar entre 1 e 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: Erro - agendador não está respondendo." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: Erro - arquivos demais - \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: Erro - não foi possível acessar \"%s\" - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: Erro - não foi possível enfilerar de stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: Erro - destino desconhecido \"%s\"." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: Erro - destino desconhecido \"%s/%s\"." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: Erro - opção desconhecida \"%c\"." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: Erro - opção desconhecida \"%s\"." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Esperava ID do trabalho após a \"-i\"." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: Nome de destino inválido na lista \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: String de filtro inválida \"%s\"." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: Faltando nome de arquivo para \"-P\"." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: Faltando tempo de espera para \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: Faltando versão para \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: Precisa de ID de trabalho (\"-i jobid\") antes de \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: Nenhum filtro para converter de %s/%s para %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: Operação falhou: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: Desculpa, não há suporte a criptografia." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s: Não foi possível conectar a \"%s:%d\": %s" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: Não foi possível conectar ao servidor." #, c-format msgid "%s: Unable to contact server." msgstr "%s: Não foi possível contactar o servidor." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s: Não foi possível criar o arquivo PDD: %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: Não foi possível determinar o tipo MIME de \"%s\"." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: Não foi possível abrir \"%s\": %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: Não foi possível abrir %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: Não foi possível abrir o arquivo PPD: %s na linha %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: Não foi possível ler o banco de dados MIME de \"%s\" ou \"%s\"." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s: Não foi possível resolver \"%s\"." #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: Destino desconhecido \"%s\"." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: Tipo de MIME de destino desconhecido %s/%s." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: Opção desconhecida \"%c\"." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: Opção desconhecida \"%s\"." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: Opção desconhecida \"-%c\"." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: Tipo MIME de origem desconhecida %s/%s." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: Aviso - não há suporte ao modificador de formato \"%c\" - a saída pode " "não ficar correta." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: Aviso - opção de conjunto de caracteres ignorada." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: Aviso - opção de tipo de conteúdo ignorada." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: Aviso - opção de formulário ignorada." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Aviso - opção modo ignorada." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 pol/seg." msgid "1.25x0.25\"" msgstr "1.25x0.25\"" msgid "1.25x2.25\"" msgstr "1.25x2.25\"" msgid "1.5 inch/sec." msgstr "1.5 pol/seg." msgid "1.50x0.25\"" msgstr "1.50x0.25\"" msgid "1.50x0.50\"" msgstr "1.50x0.50\"" msgid "1.50x1.00\"" msgstr "1.50x1.00\"" msgid "1.50x2.00\"" msgstr "1.50x2.00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 pol/seg." msgid "10 x 11" msgstr "10 x 11" msgid "10 x 13" msgstr "10 x 13" msgid "10 x 14" msgstr "10 x 14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/s" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 pol/s" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 pol/s" msgid "12 x 11" msgstr "12 x 11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/s" msgid "120x60dpi" msgstr "120x60dpi" msgid "120x72dpi" msgstr "120x72dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/s" msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/s" msgid "150dpi" msgstr "150dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 pol/s" msgid "2-Sided Printing" msgstr "Frente e Verso" msgid "2.00x0.37\"" msgstr "2.00x0.37\"" msgid "2.00x0.50\"" msgstr "2.00x0.50\"" msgid "2.00x1.00\"" msgstr "2.00x1.00\"" msgid "2.00x1.25\"" msgstr "2.00x1.25\"" msgid "2.00x2.00\"" msgstr "2.00x2.00\"" msgid "2.00x3.00\"" msgstr "2.00x3.00\"" msgid "2.00x4.00\"" msgstr "2.00x4.00\"" msgid "2.00x5.50\"" msgstr "2.00x5.50\"" msgid "2.25x0.50\"" msgstr "2.25x0.50\"" msgid "2.25x1.25\"" msgstr "2.25x1.25\"" msgid "2.25x4.00\"" msgstr "2.25x4.00\"" msgid "2.25x5.50\"" msgstr "2.25x5.50\"" msgid "2.38x5.50\"" msgstr "2.38x5.50\"" msgid "2.5 inches/sec." msgstr "2.5 pol/s" msgid "2.50x1.00\"" msgstr "2.50x1.00\"" msgid "2.50x2.00\"" msgstr "2.50x2.00\"" msgid "2.75x1.25\"" msgstr "2.75x1.25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/s" msgid "200 mm/sec." msgstr "200 mm/s" msgid "203dpi" msgstr "203dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "Séries de 24 agulhas" msgid "240x72dpi" msgstr "240x72dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/s" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 pol/s" msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00\"" msgid "3.00x1.25\"" msgstr "3.00x1.25\"" msgid "3.00x2.00\"" msgstr "3.00x2.00\"" msgid "3.00x3.00\"" msgstr "3.00x3.00\"" msgid "3.00x5.00\"" msgstr "3.00x5.00\"" msgid "3.25x2.00\"" msgstr "3.25x2.00\"" msgid "3.25x5.00\"" msgstr "3.25x5.00\"" msgid "3.25x5.50\"" msgstr "3.25x5.50\"" msgid "3.25x5.83\"" msgstr "3.25x5.83\"" msgid "3.25x7.83\"" msgstr "3.25x7.83\"" msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "Disco de 3.5\"" msgid "3.50x1.00\"" msgstr "3.50x1.00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/s" msgid "300 mm/sec." msgstr "300 mm/s" msgid "300dpi" msgstr "300dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360dpi" msgid "360x180dpi" msgstr "360x180dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 pol/s" msgid "4.00x1.00\"" msgstr "4.00x1.00\"" msgid "4.00x13.00\"" msgstr "4.00x13.00\"" msgid "4.00x2.00\"" msgstr "4.00x2.00\"" msgid "4.00x2.50\"" msgstr "4.00x2.50\"" msgid "4.00x3.00\"" msgstr "4.00x3.00\"" msgid "4.00x4.00\"" msgstr "4.00x4.00\"" msgid "4.00x5.00\"" msgstr "4.00x5.00\"" msgid "4.00x6.00\"" msgstr "4.00x6.00\"" msgid "4.00x6.50\"" msgstr "4.00x6.50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/s" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 pol/s" msgid "5 x 7" msgstr "5 x 7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 pol/s" msgid "6.00x1.00\"" msgstr "6.00x1.00\"" msgid "6.00x2.00\"" msgstr "6.00x2.00\"" msgid "6.00x3.00\"" msgstr "6.00x3.00\"" msgid "6.00x4.00\"" msgstr "6.00x4.00\"" msgid "6.00x5.00\"" msgstr "6.00x5.00\"" msgid "6.00x6.00\"" msgstr "6.00x6.00\"" msgid "6.00x6.50\"" msgstr "6.00x6.50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/s" msgid "600dpi" msgstr "600dpi" msgid "60dpi" msgstr "60dpi" msgid "60x72dpi" msgstr "60x72dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 pol/s" msgid "7 x 9" msgstr "7 x 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 pol/s" msgid "8 x 10" msgstr "8 x 10" msgid "8.00x1.00\"" msgstr "8.00x1.00\"" msgid "8.00x2.00\"" msgstr "8.00x2.00\"" msgid "8.00x3.00\"" msgstr "8.00x3.00\"" msgid "8.00x4.00\"" msgstr "8.00x4.00\"" msgid "8.00x5.00\"" msgstr "8.00x5.00\"" msgid "8.00x6.00\"" msgstr "8.00x6.00\"" msgid "8.00x6.50\"" msgstr "8.00x6.50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/s" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 pol/s" msgid "9 x 11" msgstr "9 x 11" msgid "9 x 12" msgstr "9 x 12" msgid "9-Pin Series" msgstr "Série de 9 agulhas" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Comando de ajuda inválido desconhecido." #, c-format msgid "A class named \"%s\" already exists." msgstr "Uma classe chamada \"%s\" já existe." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Uma impressora chamada \"%s\" já existe." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 borda maior" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 borda maior" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 borda maior" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 borda maior" msgid "A3 Oversize" msgstr "A3 grande" msgid "A3 Oversize Long Edge" msgstr "A3 borda muito maior" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 borda maior" msgid "A4 Oversize" msgstr "A4 grande" msgid "A4 Small" msgstr "A4 pequeno" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 borda maior" msgid "A5 Oversize" msgstr "A5 grande" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 borda maior" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C borda maior" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D borda maior" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E borda maior" msgid "Accept Jobs" msgstr "Aceitando trabalhos" msgid "Accepted" msgstr "Aceitou" msgid "Add Class" msgstr "Adicionar classe" msgid "Add Printer" msgstr "Adicionar impressora" msgid "Address" msgstr "Endereço" msgid "Administration" msgstr "Administração" msgid "Always" msgstr "Sempre" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Aplicador" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" "Tentativa de definir o estado da impressora %s para o valor inválido %d." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Grupos de atributos estão fora de ordem (%x < %x)." msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "B5 grande" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "Valor de \"document-format\" inválido \"%s\"." msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Ponteiro de destinatário NULO inválido" msgid "Bad OpenGroup" msgstr "OpenGroup inválido" msgid "Bad OpenUI/JCLOpenUI" msgstr "OpenUI/JCLOpenUI inválido" msgid "Bad OrderDependency" msgstr "OrderDependency inválido" msgid "Bad PPD cache file." msgstr "Arquivo de cache de PPD inválido." msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "Requisição inválida" msgid "Bad SNMP version number" msgstr "Número de versão SNMP inválido" msgid "Bad UIConstraints" msgstr "UIConstraints inválido" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "Argumentos inválidos para função" #, c-format msgid "Bad copies value %d." msgstr "Valor de cópias inválido %d." msgid "Bad custom parameter" msgstr "Parâmetro personalizado inválido" #, c-format msgid "Bad device-uri \"%s\"." msgstr "device-uri inválido \"%s\"." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Esquema device-uri inválido \"%s\"." #, c-format msgid "Bad document-format \"%s\"." msgstr "document-format inválido \"%s\"." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "document-format-default inválido \"%s\"." msgid "Bad filename buffer" msgstr "Buffer de nome de arquivo inválido" msgid "Bad hostname/address in URI" msgstr "Nome de máquina/Endereço inválidos na URI" #, c-format msgid "Bad job-name value: %s" msgstr "Valor de job-name inválido: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Valor de job-name inválido: Quantidade ou tipo inválido." msgid "Bad job-priority value." msgstr "Valor job-priority inválido." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Valor de job-sheets inválido \"%s\"." msgid "Bad job-sheets value type." msgstr "Tipo de valor de job-sheets inválido." msgid "Bad job-state value." msgstr "Valor de job-state inválido." #, c-format msgid "Bad job-uri \"%s\"." msgstr "job-uri inválido \"%s\"." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "notify-pull-method inválido \"%s\"." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "notify-recipient-uri inválido \"%s\"." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Valor de number-up inválido %d." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Valor de page-ranges inválido %d-%d." msgid "Bad port number in URI" msgstr "Número de porta inválida" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "port-monitor inválido \"%s\"." #, c-format msgid "Bad printer-state value %d." msgstr "Valor de printer-state inválido %d." msgid "Bad printer-uri." msgstr "printer-uri inválido." #, c-format msgid "Bad request ID %d." msgstr "ID da requisição inválido %d." #, c-format msgid "Bad request version number %d.%d." msgstr "Número da versão de requisição inválido %d.%d." msgid "Bad resource in URI" msgstr "Recurso inválido na URI" msgid "Bad scheme in URI" msgstr "Esquema inválido na URI" msgid "Bad username in URI" msgstr "Usuário inválido na URI" msgid "Bad value string" msgstr "String de valor inválido" msgid "Bad/empty URI" msgstr "URI vazia/inválida" msgid "Banners" msgstr "Banners" msgid "Bond Paper" msgstr "Papel autocolante" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "Esperava booleano para opção waiteof \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "Estouro de pilha do buffer detectado, abortando." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "Impressora de etiqueta CPCL" msgid "Cancel Jobs" msgstr "Cancelar trabalhos" msgid "Canceling print job." msgstr "Cancelando trabalho de impressão." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "Não foi possível compartilhar uma impressora remota via Kerberos." msgid "Cassette" msgstr "Cassette" msgid "Change Settings" msgstr "Alterar configurações" #, c-format msgid "Character set \"%s\" not supported." msgstr "Não há suporte ao conjunto de caracteres \"%s\"." msgid "Classes" msgstr "Classes" msgid "Clean Print Heads" msgstr "Limpar cabeça de impressão" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job não suporta o atributo job-uri." msgid "Color" msgstr "Cor" msgid "Color Mode" msgstr "Modo colorido" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Comandos podem ser abreviados. Os comandos são:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Nome da comunidade usa comprimento indefinido" msgid "Connected to printer." msgstr "Conectado à impressora." msgid "Connecting to printer." msgstr "Conectando à impressora." msgid "Continue" msgstr "Continuar" msgid "Continuous" msgstr "Contínuo" msgid "Control file sent successfully." msgstr "Arquivo de controle enviado com sucesso." msgid "Copying print data." msgstr "Copiando dados de impressão." msgid "Created" msgstr "Criada" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Personalizar" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Cortar" msgid "Cutter" msgstr "Cortador" msgid "Dark" msgstr "Escuro" msgid "Darkness" msgstr "Escuridão" msgid "Data file sent successfully." msgstr "Arquivo de dados enviado com sucesso." msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Excluir classe" msgid "Delete Printer" msgstr "Excluir impressora" msgid "DeskJet Series" msgstr "DeskJet Séries" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "Destino \"%s\" não está aceitando trabalhos." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Dispositivo: uri = %s\n" " classe = %s\n" " info = %s\n" " marca-e-modelo = %s\n" " dispo-id = %s\n" " localização = %s" msgid "Direct Thermal Media" msgstr "Mídia Térmica Direta" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "Diretório \"%s\" contém um caminho relativo." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Diretório \"%s\" contém permissões inseguras (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "Diretório \"%s\" é um arquivo." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Diretório \"%s\" não está disponível: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Permissões do diretório \"%s\" estão OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Desabilitado" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "Documento #%d não existe no trabalho #%d." msgid "Draft" msgstr "" msgid "Duplexer" msgstr "Duplexador" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Impressora de etiqueta EPL1" msgid "EPL2 Label Printer" msgstr "Impressora de etiqueta EPL2" msgid "Edit Configuration File" msgstr "Editar arquivo de configuração" msgid "Encryption is not supported." msgstr "Não há suporte a criptografia." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Banner ao final" msgid "English" msgstr "Inglês" 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 "" "Digite seu nome de usuário e senha, ou do usuário root, para acessar esta " "página. Se você estiver usando autenticação Kerberos, certifique-se de que " "você tem um ticket Kerberos válido." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "Envelope #11" msgid "Envelope #12" msgstr "Envelope #12" msgid "Envelope #14" msgstr "Envelope #14" msgid "Envelope #9" msgstr "Envelope #9" msgid "Envelope B4" msgstr "Envelope B4" msgid "Envelope B5" msgstr "Envelope B5" msgid "Envelope B6" msgstr "Envelope B6" msgid "Envelope C0" msgstr "Envelope C0" msgid "Envelope C1" msgstr "Envelope C1" msgid "Envelope C2" msgstr "Envelope C2" msgid "Envelope C3" msgstr "Envelope C3" msgid "Envelope C4" msgstr "Envelope C4" msgid "Envelope C5" msgstr "Envelope C5" msgid "Envelope C6" msgstr "Envelope C6" msgid "Envelope C65" msgstr "Envelope C65" msgid "Envelope C7" msgstr "Envelope C7" msgid "Envelope Choukei 3" msgstr "Envelope Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Envelope Choukei 3 borda maior" msgid "Envelope Choukei 4" msgstr "Envelope Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Envelope Choukei 4 borda maior" msgid "Envelope DL" msgstr "Envelope DL" msgid "Envelope Feed" msgstr "Alimentação de Envelope" msgid "Envelope Invite" msgstr "Envelope Convite" msgid "Envelope Italian" msgstr "Envelope Italiano" msgid "Envelope Kaku2" msgstr "Envelope Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Envelope Kaku2 borda maior" msgid "Envelope Kaku3" msgstr "Envelope Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Envelope Kaku3 borda maior" msgid "Envelope Monarch" msgstr "Envelope Monarch" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "Envelope PRC1 borda maior" msgid "Envelope PRC10" msgstr "Envelope PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Envelope PRC10 borda maior" msgid "Envelope PRC2" msgstr "Envelope PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Envelope PRC2 borda maior" msgid "Envelope PRC3" msgstr "Envelope PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Envelope PRC3 borda maior" msgid "Envelope PRC4" msgstr "Envelope PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Envelope PRC4 borda maior" msgid "Envelope PRC5 Long Edge" msgstr "Envelope PRC5 borda maior" msgid "Envelope PRC5PRC5" msgstr "Envelope PRC5" msgid "Envelope PRC6" msgstr "Envelope PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Envelope PRC6 borda maior" msgid "Envelope PRC7" msgstr "Envelope PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Envelope PRC7 borda maior" msgid "Envelope PRC8" msgstr "Envelope PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Envelope PRC8 borda maior" msgid "Envelope PRC9" msgstr "Envelope PRC9" msgid "Envelope PRC9 Long Edge" msgstr "Envelope PRC9 borda maior" msgid "Envelope Personal" msgstr "Envelope Pessoal" msgid "Envelope You4" msgstr "Envelope You4" msgid "Envelope You4 Long Edge" msgstr "Envelope You4 borda maior" msgid "Environment Variables:" msgstr "Variáveis de ambiente:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Política de erro" msgid "Error reading raster data." msgstr "Erro ao ler dados de rasterização." msgid "Error sending raster data." msgstr "Erro ao enviar dados de rasterização." msgid "Error: need hostname after \"-h\" option." msgstr "Erro: precisa de nome da máquina após a opção \"-h\"." msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "A cada 10 etiquetas" msgid "Every 2 Labels" msgstr "A cada 2 etiquetas" msgid "Every 3 Labels" msgstr "A cada 3 etiquetas" msgid "Every 4 Labels" msgstr "A cada 4 etiquetas" msgid "Every 5 Labels" msgstr "A cada 5 etiquetas" msgid "Every 6 Labels" msgstr "A cada 6 etiquetas" msgid "Every 7 Labels" msgstr "A cada 7 etiquetas" msgid "Every 8 Labels" msgstr "A cada 8 etiquetas" msgid "Every 9 Labels" msgstr "A cada 9 etiquetas" msgid "Every Label" msgstr "A cada etiqueta" msgid "Executive" msgstr "Executivo" msgid "Expectation Failed" msgstr "Falhou a expectativa" msgid "Expressions:" msgstr "Expressões:" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "Arquivo \"%s\" contém um caminho relativo." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Arquivo \"%s\" tem permissões inseguras (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "Arquivo \"%s\" é um diretório." #, c-format msgid "File \"%s\" not available: %s" msgstr "Arquivo \"%s\" não está disponível: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Permissões do arquivo \"%s\" estão OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "URIs de arquivos de dispositivo foram desabilitadas. Para habilitar, veja a " "diretiva FileDevice em \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." msgstr "Terminou página %d." msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Fólio" msgid "Forbidden" msgstr "Proibido" msgid "Found" msgstr "" msgid "General" msgstr "Geral" msgid "Generic" msgstr "Genérico" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU usa comprimento indefinido" msgid "Glossy Paper" msgstr "Papel brilhante" msgid "Got a printer-uri attribute but no job-id." msgstr "Atributo printer-ui obtido, mas nenhum job-id." msgid "Grayscale" msgstr "Escalas de cinza" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Pasta suspensa" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "Arquivo de ajuda não está no índice." msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "Atributo 1setOf de IPP com tags de valor incompatível." msgid "IPP attribute has no name." msgstr "Atributo de IPP não tem nome." msgid "IPP attribute is not a member of the message." msgstr "Atributo de IPP não é um membro da mensagem." msgid "IPP begCollection value not 0 bytes." msgstr "Valor begCollection de IPP não contém 0 bytes." msgid "IPP boolean value not 1 byte." msgstr "Valor booleano de IPP não contém 1 byte." msgid "IPP date value not 11 bytes." msgstr "Valor de data de IPP não contém 11 bytes." msgid "IPP endCollection value not 0 bytes." msgstr "Valor endCollection IPP não contém 0 bytes." msgid "IPP enum value not 4 bytes." msgstr "Valor enum de IPP não contém 4 bytes." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "Tag de extensão de IPP maior do que 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "Valor inteiro de IPP não contém 4 bytes." msgid "IPP language length overflows value." msgstr "Comprimento do idioma de IPP excede o valor." msgid "IPP language length too large." msgstr "Comprimento do idioma de IPP muito grande." msgid "IPP member name is not empty." msgstr "Nome de membro de IPP não está vazio." msgid "IPP memberName value is empty." msgstr "Valor de memberName de IPP está vazio." msgid "IPP memberName with no attribute." msgstr "memberName de IPP sem atributo algum." msgid "IPP name larger than 32767 bytes." msgstr "Nome de IPP maior do que 32767 bytes." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "Valor de nameWithLanguage de IPP menor do que o mínimo de 4 bytes." msgid "IPP octetString length too large." msgstr "Comprimento de octetString de IPP muito grande." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "Valor de rangeOfInteger de IPP não contém 8 bytes." msgid "IPP resolution value not 9 bytes." msgstr "Valor de resolução de IPP não contém 9 bytes." msgid "IPP string length overflows value." msgstr "Comprimento da string de IPP excede o valor." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "Valor de textWithLanguage de IPP menor do que o mínimo de 4 bytes." msgid "IPP value larger than 32767 bytes." msgstr "Valor de IPP maior do que 32767 bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Caractere de controle é ilegal" msgid "Illegal main keyword string" msgstr "String ilegal de palavra-chave principal" msgid "Illegal option keyword string" msgstr "String ilegal de palavra-chave de opção" msgid "Illegal translation string" msgstr "String ilegal de tradução" msgid "Illegal whitespace character" msgstr "Caractere ilegal de espaço em branco" msgid "Installable Options" msgstr "Opções instaláveis" msgid "Installed" msgstr "Instalada" msgid "IntelliBar Label Printer" msgstr "Impressora de etiqueta IntelliBar" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Erro interno de servidor" msgid "Internal error" msgstr "Erro interno" msgid "Internet Postage 2-Part" msgstr "Internet Postage Parte-2" msgid "Internet Postage 3-Part" msgstr "Internet Postage Parte-3" msgid "Internet Printing Protocol" msgstr "Protocolo de Impressão para Internet" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "Argumentos de nome de mídia inválidos." msgid "Invalid media size." msgstr "Tamanho de mídia inválido." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "Comando de impressora \"%s\" inválido." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 borda maior" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 borda maior" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 borda maior" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "O trabalho #%d não pode ser reiniciado - nenhum arquivo." #, c-format msgid "Job #%d does not exist." msgstr "Trabalho #%d não existe." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Trabalho #%d já foi abortado - não é possível cancelar." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Trabalho #%d já foi cancelado - não é possível cancelar." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Trabalho #%d já concluiu - não é possível cancelar." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "Trabalho #%d já finalizou e não pode ser alterado." #, c-format msgid "Job #%d is not complete." msgstr "Trabalho #%d não concluiu." #, c-format msgid "Job #%d is not held for authentication." msgstr "Trabalho #%d não está agarrado para autenticação." #, c-format msgid "Job #%d is not held." msgstr "Trabalho #%d não está agarrado." msgid "Job Completed" msgstr "Trabalho concluiu" msgid "Job Created" msgstr "Trabalho criado" msgid "Job Options Changed" msgstr "Opções do trabalho alteradas" msgid "Job Stopped" msgstr "Trabalho parou" msgid "Job is completed and cannot be changed." msgstr "Trabalho está concluído e não pode ser alterado." msgid "Job operation failed" msgstr "Operação do trabalho falhou" msgid "Job state cannot be changed." msgstr "Estado do trabalho não pode ser alterado." msgid "Job subscriptions cannot be renewed." msgstr "Inscrições de trabalho não podem ser renovadas." msgid "Jobs" msgstr "Trabalhos" msgid "LPD/LPR Host or Printer" msgstr "Impressora ou máquina LPD/LPR" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Impressora de etiqueta" msgid "Label Top" msgstr "Parte superior da etiqueta" #, c-format msgid "Language \"%s\" not supported." msgstr "Não há suporte ao idioma \"%s\"." msgid "Large Address" msgstr "Endereço grande" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Series PCL 4/5" msgid "Letter Oversize" msgstr "Carta grande" msgid "Letter Oversize Long Edge" msgstr "Carta borda muito maior" msgid "Light" msgstr "Leve" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Linha maior do que o máximo permitido (255 caracteres)" msgid "List Available Printers" msgstr "Lista de impressoras disponíveis" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "Borda maior (retrato)" msgid "Looking for printer." msgstr "Procurando impressoras." msgid "Manual Feed" msgstr "Alimentação manual" msgid "Media Size" msgstr "Tamanho de mídia" msgid "Media Source" msgstr "Fonte de mídia" msgid "Media Tracking" msgstr "Rastreamento de mídia" msgid "Media Type" msgstr "Tipo de mídia" msgid "Medium" msgstr "Médio" msgid "Memory allocation error" msgstr "Erro de alocação de memória" msgid "Missing CloseGroup" msgstr "Faltando CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Faltando cabeçalho PPD-Adobe-4.x" msgid "Missing asterisk in column 1" msgstr "Faltando asterisco na coluna 1" msgid "Missing document-number attribute." msgstr "Faltando atributo document-number." msgid "Missing form variable" msgstr "Faltando variável de formulário" msgid "Missing last-document attribute in request." msgstr "Faltando atributo last-document na requisição." msgid "Missing media or media-col." msgstr "Faltando media ou media-col." msgid "Missing media-size in media-col." msgstr "Faltando media-size em media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Faltando atributo notify-subscription-ids." msgid "Missing option keyword" msgstr "Faltando palavra-chave de opção" msgid "Missing requesting-user-name attribute." msgstr "Faltando atributo requesting-user-name." #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "Faltando atributos necessários." msgid "Missing resource in URI" msgstr "Faltando rescurso na URI" msgid "Missing scheme in URI" msgstr "Faltando esquema na URI" msgid "Missing value string" msgstr "Faltando string de valor" msgid "Missing x-dimension in media-size." msgstr "Faltando dimensão-x em media-size." msgid "Missing y-dimension in media-size." msgstr "Faltando dimensão-y em media-size." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Modelo: nome = %s\n" " idioma_natural = %s\n" " marca-e-modelo = %s\n" " id-dispositivo = %s" msgid "Modifiers:" msgstr "Modificadores:" msgid "Modify Class" msgstr "Modificar classe" msgid "Modify Printer" msgstr "Modificar impressora" msgid "Move All Jobs" msgstr "Mover todos trabalhos" msgid "Move Job" msgstr "Mover trabalho" msgid "Moved Permanently" msgstr "Mover permanentemente" msgid "NULL PPD file pointer" msgstr "Ponteiro NULO para arquivo PPD" msgid "Name OID uses indefinite length" msgstr "OID de nome usa comprimento indefinido" msgid "Nested classes are not allowed." msgstr "Classes aninhadas não são permitidas." msgid "Never" msgstr "Nunca" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "Não" msgid "No Content" msgstr "Nenhum conteúdo" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "Nenhum nome PPD" msgid "No VarBind SEQUENCE" msgstr "Nenhuma SEQUENCE de VarBind" msgid "No active connection" msgstr "Nenhuma conexão ativa" msgid "No active connection." msgstr "Nenhuma conexão ativa." #, c-format msgid "No active jobs on %s." msgstr "Nenhum trabalho ativo em %s" msgid "No attributes in request." msgstr "Nenhum atributo na requisição." msgid "No authentication information provided." msgstr "Nenhuma informação de autenticação foi fornecida." msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Nenhum nome de comunidade" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "Nenhuma impressora padrão." msgid "No destinations added." msgstr "Nenhuma destinação foi adicionada." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "Nenhum URI de dispositivo encontrado em argv[0] ou na variável de ambiente " "DEVICE_URI." msgid "No error-index" msgstr "Nenhum error-index" msgid "No error-status" msgstr "Nenhum error-status" msgid "No file in print request." msgstr "Nenhum arquivo na requisição de impressão." msgid "No modification time" msgstr "Nenhum horário de modificação" msgid "No name OID" msgstr "Nenhum OID de nome" msgid "No pages were found." msgstr "Nenhuma página foi encontrada." msgid "No printer name" msgstr "Nenhum nome de impressora" msgid "No printer-uri found" msgstr "Nenhum printer-uri foi encontrado" msgid "No printer-uri found for class" msgstr "Nenhum printer-uri foi encontrado para classe" msgid "No printer-uri in request." msgstr "Nenhum printer-uri na requisição." msgid "No request URI." msgstr "Nenhuma URI de requisição." msgid "No request protocol version." msgstr "Nenhuma versão de protocolo de requisição." msgid "No request sent." msgstr "Nenhuma requisição enviada." msgid "No request-id" msgstr "Nenhum request-id" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "Nenhum atributo de inscrição na requisição." msgid "No subscriptions found." msgstr "Nenhuma inscrição encontrada." msgid "No variable-bindings SEQUENCE" msgstr "Nenhum SEQUENCE em variable-bindings" msgid "No version number" msgstr "Nenhum número de versão" msgid "Non-continuous (Mark sensing)" msgstr "Não-contíguo (Mark sensing)" msgid "Non-continuous (Web sensing)" msgstr "Não-contíguo (Web sensing)" msgid "None" msgstr "" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "Não encontrado" msgid "Not Implemented" msgstr "Não implementado" msgid "Not Installed" msgstr "Não instalado" msgid "Not Modified" msgstr "Não modificado" msgid "Not Supported" msgstr "Não há suporte" msgid "Not allowed to print." msgstr "Sem permissão para imprimir." msgid "Note" msgstr "Nota" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Off (1 lado)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Ajuda online" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "Abertura de %s falhou: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup sem um CloseGroup primeiro" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI sem um CloseUI/JCLCloseUI primeiro" msgid "Operation Policy" msgstr "Política de operação" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "Opção \"%s\" não pode ser incluída via %%%%IncludeFeature." msgid "Options Installed" msgstr "Opções instaladas" msgid "Options:" msgstr "Opções:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "Cache de arquivo PPD está desatualizado." msgid "Out of memory." msgstr "Memória insuficiente." msgid "Output Mode" msgstr "Mode de saída" msgid "PCL Laser Printer" msgstr "Impressora Laser PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K borda maior" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K borda maior" msgid "PRC32K Oversize" msgstr "PRC32K grande" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K borda muito maior" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "Pacote não contém um Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Pacote não inicia com SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Senha para %s em %s? " msgid "Pause Class" msgstr "Pausar classe" msgid "Pause Printer" msgstr "Pausar impressora" # peel-off seria descolar etiqueta do papel? msgid "Peel-Off" msgstr "Descolar" msgid "Photo" msgstr "Foto" msgid "Photo Labels" msgstr "Foto pequena" msgid "Plain Paper" msgstr "Papel normal" msgid "Policies" msgstr "Políticas" msgid "Port Monitor" msgstr "Monitor de porta" msgid "PostScript Printer" msgstr "Impressora PostScript" msgid "Postcard" msgstr "Postal" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "Postal duplo borda maior" msgid "Postcard Long Edge" msgstr "Postal borda maior" msgid "Preparing to print." msgstr "Preparando para imprimir." msgid "Print Density" msgstr "Densidade de impressão" msgid "Print Job:" msgstr "Trabalho de impressão:" msgid "Print Mode" msgstr "Modo de impressão" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "Taxa de impressão" msgid "Print Self-Test Page" msgstr "Imprimir página de auto-teste" msgid "Print Speed" msgstr "Velocidade de impressão" msgid "Print Test Page" msgstr "Imprimir página de teste" msgid "Print and Cut" msgstr "Imprimir e cortar" msgid "Print and Tear" msgstr "Imprimir e rasgar" msgid "Print file sent." msgstr "Arquivo de impressão enviado." msgid "Print job canceled at printer." msgstr "Trabalho de impressão cancelado na impressora." msgid "Print job too large." msgstr "Trabalho de impressão muito grande." msgid "Print job was not accepted." msgstr "Trabalho de impressão não foi aceito." #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "Impressora adicionada" msgid "Printer Default" msgstr "Impressora padrão" msgid "Printer Deleted" msgstr "Impressora excluída" msgid "Printer Modified" msgstr "Impressora modificada" msgid "Printer Paused" msgstr "Impressora pausada" msgid "Printer Settings" msgstr "Configurações de impressora" msgid "Printer cannot print supplied content." msgstr "Impressora não consegue imprimir o conteúdo fornecido." msgid "Printer cannot print with supplied options." msgstr "Impressora não consegue imprimir os opções fornecidas." msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Impressora:" msgid "Printers" msgstr "Impressoras" #, c-format msgid "Printing page %d, %u%% complete." msgstr "Imprimindo página %d, %u%% concluído." msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "Limite de quota alcançado." msgid "Rank Owner Job File(s) Total Size" msgstr "Ordem Dono Trab Arquivo(s) Tamanho total" msgid "Reject Jobs" msgstr "Rejeitar trabalhos" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "Máquina remota não aceitou arquivo de controle (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "Máquina remota não aceitou arquivo de dados (%d)." msgid "Reprint After Error" msgstr "Erro após reimpressão" msgid "Request Entity Too Large" msgstr "Entidade de requisição muito grande" msgid "Resolution" msgstr "Resolução" msgid "Resume Class" msgstr "Resumir classe" msgid "Resume Printer" msgstr "Resumir impressora" msgid "Return Address" msgstr "Retornar endereço" msgid "Rewind" msgstr "Rebobinar" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE usa comprimento indefinido" msgid "SSL/TLS Negotiation Error" msgstr "Erro de negociação SSL/TLS" msgid "See Other" msgstr "Veja outro" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "Enviando dados à impressora." msgid "Server Restarted" msgstr "Servidor reiniciado" msgid "Server Security Auditing" msgstr "Auditoria de segurança de servidor" msgid "Server Started" msgstr "Servidor iniciou" msgid "Server Stopped" msgstr "Servidor parou" msgid "Server credentials not set." msgstr "Credenciais no servidor não definidas." msgid "Service Unavailable" msgstr "Serviço indisponível" msgid "Set Allowed Users" msgstr "Definir usuários permitidos" msgid "Set As Server Default" msgstr "Definir como servidor padrão" msgid "Set Class Options" msgstr "Definir opções de classe" msgid "Set Printer Options" msgstr "Definir opções de impressora" msgid "Set Publishing" msgstr "Definir publicação" msgid "Shipping Address" msgstr "Endereço de entrega" msgid "Short-Edge (Landscape)" msgstr "Borda menor (paisagem)" msgid "Special Paper" msgstr "Papel especial" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Trabalho de impressão, %.0f%% completo." msgid "Standard" msgstr "Padrão" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Iniciando banner" #, c-format msgid "Starting page %d." msgstr "Iniciando página %d." msgid "Statement" msgstr "Declaração" #, c-format msgid "Subscription #%d does not exist." msgstr "Inscrição #%d não existe." msgid "Substitutions:" msgstr "Substituições:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Alternando protocolos" msgid "Tabloid" msgstr "Tabloide" msgid "Tabloid Oversize" msgstr "Tabloide grande" msgid "Tabloid Oversize Long Edge" msgstr "Tabloide borda muito maior" msgid "Tear" msgstr "Destacar" msgid "Tear-Off" msgstr "Destacar" msgid "Tear-Off Adjust Position" msgstr "Ajuste da posição de destaque" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "O atributo \"%s\" é necessário para imprimir os trabalhos." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "O atributo %s não pode ser fornecido com job-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" "O atributo de estado de trabalho '%s' não pode ser fornecido em uma " "requisição de criação de trabalho." #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "O atributo de operação '%s' não pode ser fornecido em uma requisição de " "criação de trabalho." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "O arquivo PPD \"%s\" não pôde ser encontrado." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "O arquivo PPD \"%s\" não pôde ser aberto: %s" msgid "The PPD file could not be opened." msgstr "O arquivo PPD não pôde ser aberto." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "O nome da classe pode conter somente até 127 caracteres imprimíveis e não " "pode conter espaços, barras (/), ou sinal de tralha (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "O atributo notify-lease-duration não pode ser usado para inscrições de " "trabalhos." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "O valor de notify-user-data está muito grande (%d > 63 octetos)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" "A configuração da impressora está incorreta ou a impressora não existe mais." msgid "The printer did not respond." msgstr "A impressora não respondeu." msgid "The printer is in use." msgstr "A impressora está em uso." msgid "The printer is not connected." msgstr "A impressora não está conectada." msgid "The printer is not responding." msgstr "A impressora não está respondendo." msgid "The printer is now connected." msgstr "A impressora está agora conectada." msgid "The printer is now online." msgstr "A impressora está agora online." msgid "The printer is offline." msgstr "A impressora está offline." msgid "The printer is unreachable at this time." msgstr "A impressora está inacessível neste momento." msgid "The printer may not exist or is unavailable at this time." msgstr "A impressora pode não existir ou está indisponível neste momento." 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 "" msgid "The printer or class does not exist." msgstr "A impressora ou classe não existe." msgid "The printer or class is not shared." msgstr "A impressora ou classe não está compartilhada." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "O printer-uri \"%s\" contém caracteres inválidos." msgid "The printer-uri attribute is required." msgstr "O atributo printer-uri é necessário." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "O printer-uri deve estar no formato \"ipp://MAQUINA/classes/NOMECLASSE\"." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "O printer-uri deve estar no formato \"ipp://MAQUINA/printers/NOMEIMPRESSORA" "\"." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "A interface web está desabilitada no momento. Execute \"cupsctl " "WebInterface=yes\" para habilitá-la." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "Não há suporte ao valor de which-jobs \"%s\"." msgid "There are too many subscriptions." msgstr "Há inscrições demais." msgid "There was an unrecoverable USB error." msgstr "Ocorreu um erro de USB irrecuperável." msgid "Thermal Transfer Media" msgstr "Mídia de transferência térmica" msgid "Too many active jobs." msgstr "Há trabalhos demais ativos." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Há valores de job-sheets demais (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Há valores de printer-state-reasons demais (%d >%d)." msgid "Transparency" msgstr "Transparência" msgid "Tray" msgstr "Bandeja" msgid "Tray 1" msgstr "Bandeja 1" msgid "Tray 2" msgstr "Bandeja 2" msgid "Tray 3" msgstr "Bandeja 3" msgid "Tray 4" msgstr "Bandeja 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "URI muito longa" msgid "URI too large" msgstr "URI muito grande" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "US Legal grande" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "US Letter borda maior" msgid "US Letter Oversize" msgstr "US Letter grande" msgid "US Letter Oversize Long Edge" msgstr "US Letter borda muito maior" msgid "US Letter Small" msgstr "US Letter pequena" msgid "Unable to access cupsd.conf file" msgstr "Não foi possível acessar o arquivo cupsd.conf" msgid "Unable to access help file." msgstr "Não foi possível acessar o arquivo de ajuda." msgid "Unable to add class" msgstr "Não foi possível adicionar classe" msgid "Unable to add document to print job." msgstr "Não foi possível adicionar o documento ao trabalho de impressão." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Não foi possível adicionar trabalho para destino \"%s\"." msgid "Unable to add printer" msgstr "Não foi possível adicionar impressora" msgid "Unable to allocate memory for file types." msgstr "Não foi possível alocar memória para os tipos de arquivos." msgid "Unable to allocate memory for page info" msgstr "Não foi possível alocar memória para informação de página" msgid "Unable to allocate memory for pages array" msgstr "Não foi possível alocar memória para vetor de páginas" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "Não foi possível cancelar trabalho de impressão." msgid "Unable to change printer" msgstr "Não foi possível alterar a impressora" msgid "Unable to change printer-is-shared attribute" msgstr "Não foi possível alterar o atributo printer-is-shared" msgid "Unable to change server settings" msgstr "Não foi possível alterar as configurações do servidor" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "Não foi possível compilar a expressão regular de mimeMediaType: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "Não foi possível compilar a expressão regular de naturalLanguage: %s." msgid "Unable to configure printer options." msgstr "Não foi possível configurar opções de impressora." msgid "Unable to connect to host." msgstr "Não foi possível conectar à máquina." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "Não foi possível contactar a impressora, enfileirando na próxima impressora " "na classe." #, c-format msgid "Unable to copy PPD file - %s" msgstr "Não foi possível copiar arquivo PPD - %s" msgid "Unable to copy PPD file." msgstr "Não foi possível copiar arquivo PPD." msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "Não foi possível criar uri de impressora" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "Não foi possível criar credenciais no servidor." #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "Não foi possível criar arquivo temporário" msgid "Unable to delete class" msgstr "Não foi possível excluir classe" msgid "Unable to delete printer" msgstr "Não foi possível excluir impressora" msgid "Unable to do maintenance command" msgstr "Não foi possível executar comando de manutenção" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "Não foi possível editar arquivos de cupsd.conf maiores que 1MB" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (cadeia de " "certificação inválida)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (certificado " "inválido no momento)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (certificado " "expirou)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (nome da " "máquina incorreto)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (terminou a " "conexão sem a resposta)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (certificado " "auto-assinado)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "Não foi possível estabelecer uma conexão segura com a máquina (certificado " "não confiado)." msgid "Unable to establish a secure connection to host." msgstr "Não foi possível estabelecer uma conexão segura com a máquina." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "Não foi possível encontrar o destino do trabalho" msgid "Unable to find printer." msgstr "Não foi possível encontrar a impressora." msgid "Unable to find server credentials." msgstr "Não foi possível encontrar credenciais no servidor." msgid "Unable to get backend exit status." msgstr "Não foi possível obter o estado de saída do backend." msgid "Unable to get class list" msgstr "Não foi possível obter lista de classes" msgid "Unable to get class status" msgstr "Não foi possível obter o estado da classe" msgid "Unable to get list of printer drivers" msgstr "Não foi possível obter lista de drivers de impressoras" msgid "Unable to get printer attributes" msgstr "Não foi possível obter atributos da impressora" msgid "Unable to get printer list" msgstr "Não foi possível obter lista de impressoras" msgid "Unable to get printer status" msgstr "Não foi possível obter estado da impressora" msgid "Unable to get printer status." msgstr "Não foi possível obter o estado da impressora." msgid "Unable to load help index." msgstr "Não foi possível carregar índice de ajuda." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "Não foi possível localizar a impressora \"%s\"." msgid "Unable to locate printer." msgstr "Não foi possível localizar a impressora." msgid "Unable to modify class" msgstr "Não foi possível modificar classe" msgid "Unable to modify printer" msgstr "Não foi possível modificar impressora" msgid "Unable to move job" msgstr "Não foi possível mover trabalho" msgid "Unable to move jobs" msgstr "Não foi possível mover trabalhos" msgid "Unable to open PPD file" msgstr "Não foi possível abrir arquivo PPD" msgid "Unable to open cupsd.conf file:" msgstr "Não foi possível abrir arquivo cupsd.conf:" msgid "Unable to open device file" msgstr "Não foi possível abrir arquivo dispositivo" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "Não foi possível abrir documento #%d no trabalho #%d." msgid "Unable to open help file." msgstr "Não foi possível abrir arquivo de ajuda." msgid "Unable to open print file" msgstr "Não foi possível abrir arquivo de impressão" msgid "Unable to open raster file" msgstr "Não foi possível arquivo de rasterização" msgid "Unable to print test page" msgstr "Não foi possível imprimir página teste" msgid "Unable to read print data." msgstr "Não foi possível ler dados de impressão." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "Não foi possível renomear o arquivo de documento do trabalho." msgid "Unable to resolve printer-uri." msgstr "Não foi possível resolver printer-ui." msgid "Unable to see in file" msgstr "Não foi possível ler o arquivo" msgid "Unable to send command to printer driver" msgstr "Não foi possível enviar comando ao driver da impressora" msgid "Unable to send data to printer." msgstr "Não foi possível enviar dados à impressora." msgid "Unable to set options" msgstr "Não foi possível definir opções" msgid "Unable to set server default" msgstr "Não foi possível definir servidor padrão" msgid "Unable to start backend process." msgstr "Não foi possível iniciar processo de backend." msgid "Unable to upload cupsd.conf file" msgstr "Não foi possível atualizar o arquivo cupsd.conf" msgid "Unable to use legacy USB class driver." msgstr "Não foi possível usar driver de classe USB legado." msgid "Unable to write print data" msgstr "Não foi possível escrever dados de impressão" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "Não foi possível escrever dados descompactados de impressão: %s" msgid "Unauthorized" msgstr "Não autorizado" msgid "Units" msgstr "Unidades" msgid "Unknown" msgstr "Desconhecido" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Escolha desconhecida \"%s\" para opção \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Valor da opção de criptografia desconhecido: \"%s\"." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Ordem de arquivo desconhecida: \"%s\"." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Caractere de formato desconhecido: \"%c\"." msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "Nome de tamanho de mídia desconhecido." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Opção \"%s\" desconhecida com valor \"%s\"." #, c-format msgid "Unknown option \"%s\"." msgstr "Opção \"%s\" desconhecida." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Modo de impressão desconhecido: \"%s\"." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "printer-error-policy \"%s\" desconhecido." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "printer-op-policy \"%s\" desconhecido." msgid "Unknown request method." msgstr "Método de requisição desconhecido." msgid "Unknown request version." msgstr "Versão de requisição desconhecida." msgid "Unknown scheme in URI" msgstr "Esquema desconhecido na URI" msgid "Unknown service name." msgstr "Nome de serviço desconhecido." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Valor de opção de versão desconhecido: \"%s\"." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Não suporte a \"compression\" com valor \"%s\"." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Não há suporte a \"document-format\" com valor \"%s\"." msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "Não há suporte ao valor de \"job-name\"." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Não há suporte ao conjunto de caracteres \"%s\"." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Não há suporte à compressão \"%s\"." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "Não há suporte ao document-format \"%s\"." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "Não há suporte ao document-format \"%s/%s\"." #, c-format msgid "Unsupported format \"%s\"." msgstr "Não há suporte ao formato \"%s\"." msgid "Unsupported margins." msgstr "Não há suporte a margens." msgid "Unsupported media value." msgstr "Não há suporte ao valor de mídia." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "Não há suporte ao valor de number-up %d; usando number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "Não há suporte ao valor de number-up-layout %s; usando number-up-layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "Não há suporte ao valor de page-border %s; usando page-border=none." msgid "Unsupported raster data." msgstr "Não há suporte a dados de rasterização." msgid "Unsupported value type" msgstr "Não há suporte ao tipo de valor" msgid "Upgrade Required" msgstr "Atualização necessária" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Uso: %s job-id usuário título cópias opções [arquivo]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Uso: cupsctl [opções] [param=valor ... paramN=valorN]" msgid "Usage: cupsd [options]" msgstr "Uso: cupsd [opções]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "Uso: cupsfilter [ opções ] [ -- ] arquivo" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "Uso: ippfind [opções] tiporeg[,tiposub][.domínio.] ... [expressões]\n" " ippfind [opções] nome[.tiporeg[.domínio.]] ... [expressões]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Uso: ipptool [opções] URI arquivo [ ... arquivoN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Uso: ppdc [opções] arquivo.drv [ ... arquivoN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Uso: ppdhtml [opções] arquivo.drv >arquivo.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Uso: ppdi [opções] arquivo.ppd [ ... arquivoN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Uso: ppdmerge [opções] arquivo.ppd [ ... arquivoN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "Uso: ppdpo [opções] -o arquivo.po arquivo.drv [ ... arquivoN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Uso: snmp [máquina-ou-endereço-ip]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Valor usa comprimento indefinido" msgid "VarBind uses indefinite length" msgstr "VarBind usa comprimento indefinido" msgid "Version uses indefinite length" msgstr "Version usa comprimento indefinido" msgid "Waiting for job to complete." msgstr "Esperando o trabalho completar." msgid "Waiting for printer to become available." msgstr "Esperando a impressora ficar disponível." msgid "Waiting for printer to finish." msgstr "Esperando a impressora finalizar." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "Interface web está desabilitada" msgid "Yes" msgstr "Sim" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Você tem que acessar esta página usando a URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Impressora de etiqueta ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "abortado" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "cancelado" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "completou" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "cups-deviced falhou na execução." msgid "cups-driverd failed to execute." msgstr "cups-driverd falhou na execução." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: Não foi possível conectar o servidor: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: Opção desconhecida \"%s\"" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: Opção desconhecida \"-%c\"" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: Esperava nome de arquivo de configuração após a opção \"-c\"." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" "cupsd: Esperava nome de arquivo de cups-files.conf após a opção \"-s\"." msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" "cupsd: Suporte à funcionalidade sob demanda não compilado, executando em " "modo normal." msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: Nome de arquivo relativo para cups-files.conf não é permitido." msgid "cupsd: Unable to get current directory." msgstr "cupsd: Não é possível obter diretório atual." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" "cupsd: Não foi possível obter o caminho para o arquivo cups-files.conf." #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: Argumento desconhecido \"%s\" - abortando." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: Opção desconhecida \"%c\" - abortando." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: Número de documento inválido %d." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: ID de trabalho inválido %d." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: Somente um nome de arquivo pode ser especificado." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: Não é possível obter o arquivo do trabalho - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: A opção -q é incompatível com a opção -v." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: A opção -v é incompatível com a opção -q." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "dispositivo de %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "dispositivo de %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index usa comprimento indefinido" msgid "error-status uses indefinite length" msgstr "error-status usa comprimento indefinido" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "retido" msgid "help\t\tGet help on commands." msgstr "help\t\tObtém ajuda sobre os comandos." msgid "idle" msgstr "inativo" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: Expressão regular inválida: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: Não é possível usar --and após --or." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: Esperava nome da chave após %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: Esperava faixa de portas após %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: Esperava o programa após %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: Esperava ponto-e-vírgula após %s." msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: Faltando chave de fechamento na substituição." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Faltando parênteses de fechamento." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: Faltando expressão antes de \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: Faltando expressão antes de \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: Faltando nome da chave após %s." #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "ippfind: Faltando parênteses de abertura." #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: Faltando programa após %s." #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: Faltando expressão regular após %s." #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: Faltando dois-pontos após %s." msgid "ippfind: Out of memory." msgstr "ippfind: Memória insuficiente." msgid "ippfind: Too many parenthesis." msgstr "ippfind: Número excessivo de parênteses." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: Não foi possível navegar ou resolver: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: Não foi possível executar \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: Não foi possível usar Bonjour: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: Argumento desconhecido \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "ipptool: \"-i\" e \"-n\" são incompatíveis com \"-P\" e \"-X\"." #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: Segundos inválidos para \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "ipptool: Só é possível especificar uma única URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: Contagem faltando para \"-n\"." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: Faltando nome de arquivo para \"-f\"." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: Faltando nome=valor para\"-d\"." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: Faltando segundos para \"-i\"." msgid "ipptool: URI required before test file." msgstr "ipptool: URI necessária antes do arquivo de teste." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "Faltando atributo de job-printer-uri." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: Nome da classe só pode conter caracteres imprimíveis." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" "lpadmin: Esperava permitir/negar lista de usuários após a opção \"-u\"." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: Esperava a classe após a opção \"-r\"." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: Esperava nome de classe após a opção \"-c\"." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: Esperava descrição após a opção \"-D\"." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: Esperava URI de dispositivo após a opção \"-v\"." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: Esperava tipo(s) de arquivo(s) após a opção \"-I\"." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: Esperava nome do máquina após a opção \"-h\"." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: Esperava localização após a opção \"-L\"." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: Esperava modelo após a opção \"-m\"." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: Esperava nome após a opção \"-R\"." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: Esperava nome=valor após a opção \"-o\"." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: Esperava impressora após a opção \"-p\"." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: Esperava nome da impressora após a opção \"-d\"." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: Esperava impressora ou classe após a opção \"-x\"." msgid "lpadmin: No member names were seen." msgstr "lpadmin: Nenhum nome de membros foi encontrado." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: Impressora %s já é um membro da classe %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: Impressora %s não é membro da classe %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: Nome da impressora só pode conter caracteres imprimíveis." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Não é possível adicionar impressora à classe\n" " Você deve primeiro especificar o nome da impressora." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: Não foi possível conectar ao servidor: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: Não foi possível criar arquivo temporário" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: Não foi possível excluir opção:\n" " Você deve primeiro especificar o nome da impressora." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "lpadmin: Não foi possível abrir PPD \"%s\": %s na linha %d." msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Não foi possível excluir impressora da classe:\n" " Você deve primeiro especificar o nome da impressora." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: Não foi possível definir as opções da impressora:\n" " Você deve primeiro especificar o nome da impressora." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: Opção de permitir/negar desconhecida \"%s\"." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: Argumento desconhecido \"%s\"." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: Opção desconhecida \"%c\"." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Aviso - lista de tipos de conteúdos ignorada." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" "lpinfo: Esperava string de ID de dispositivo 1284 após \"--device-id\"." msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: Esperava idioma após \"--language\"." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: Esperava marca e modelo após \"--make-and-model\"." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: Esperava string de produto após \"--product\"." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo: Esperava lista de esquemas após \"--exclude-schemes\"." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo: Esperava lista de esquemas após \"--include-schemes\"." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: Esperava tempo de espera após \"--timeout\"." #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: Não foi possível conectar ao servidor: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: Argumento desconhecido \"%s\"." msgid "lpoptions: No printers." msgstr "lpoptions: Nenhuma impressora." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: Não foi possível adicionar impressora ou instância: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: Não foi possível obter o arquivo PPD para %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: Não foi possível abrir o arquivo PPD para %s." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: Impressora ou classe desconhecida." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: Erro - variável de ambiente %s contém destino inexistente \"%s\"." #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "membros da classe %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "nenhum registro" msgid "no system default destination" msgstr "nenhum destino padrão de sistema" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "notify-events não especificado." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "URI de notify-recipient-uri \"%s\" já está sendo usada." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "URI de notify-recipient-uri \"%s\" usa um esquema desconhecido." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "pendente" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: Adicionando diretório de include \"%s\"." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: Adicionando/atualizando texto de UI de %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: Valor booleano inválido (%s) na linha %d de %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: Atributo de fonte inválido: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: Nome de resolução inválido \"%s\" na linha %d de %s." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: palavra-chave de estado inválida %s na linha %d de %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc: Substituição de variável inválida ($%c) na linha %d de %s." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc: Escolha encontrada na linha %d de %s com nenhuma opção." #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: Duplicata de #po para o local %s na linha %d de %s." #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: Esperava a definição de um filtro na linha %d de %s." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: Esperava o nome de um programa na linha %d de %s." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: Esperava um valor booleano na linha %d de %s." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "ppdc: Esperava conjunto de caracteres após Font na linha %d de %s." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: Esperava código de escolha na linha %d de %s." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: Esperava texto/nome de escolha na linha %d de %s." #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "ppdc: Esperava ordem de cores para ColorModel na linha %d de %s." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "ppdc: Esperava espaço de cores para ColorModel na linha %d de %s." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: Esperava compressão para ColorModel na linha %d de %s." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: Esperava string de restrições para UIConstraints na linha %d de %s." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: Esperava palavra-chave de tipo de driver seguindo DriverType na linha " "%d de %s." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc: Esperava tipo Duplex após Duplex na linha %d de %s." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: Esperava codificação após Font na linha %d de %s." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "ppdc: Esperava nome de arquivo após #po %s na linha %d de %s." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: Esperava text/nome de grupo na linha %d de %s." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: Esperava inclusão de nome de arquivo na linha %d de %s." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: Esperava número inteiro na linha %d de %s." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: Esperava local após #po na linha %d de %s." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: Esperava nome após %s na linha %d de %s." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: Esperava nome após FileName na linha %d de %s." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: Esperava nome após Font na linha %d de %s." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: Esperava nome após Manufacturer na linha %d de %s." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: Esperava nome após MediaSize na linha %d de %s." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: Esperava nome após ModelName na linha %d de %s." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: Esperava nome após PCFileName na linha %d de %s." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: Esperava nome/texto após %s na linha %d de %s." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "ppdc: Esperava nome/texto após Installable na linha %d de %s." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "ppdc: Esperava nome/texto após Resolution na linha %d de %s." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: Esperava combinação de nome/texto para ColorModel na linha %d de %s." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: Esperava opção de nome/texto na linha %d de %s." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: Esperava opção de seção na linha %d de %s." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: Esperava tipo da opção na linha %d de %s." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: Esperava um campo de substituição após Resolution na linha %d de %s." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: Esperava string em aspas na linha %d de %s." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: Esperava número real na linha %d de %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: Esperava resolução/tipo de mídia seguindo ColorProfile na linha %d de " "%s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: Esperava resolução/tipo de mídia seguindo SimpleColorProfile na linha " "%d de %s." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: Esperava seletor após %s na linha %d de %s." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: Esperava estado após Font na linha %d de %s." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: Esperava string após Copyright na linha %d de %s." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: Esperava string após Version na linha %d de %s." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: Esperava nomes de duas opções na linha %d de %s." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: Esperava valor após %s na linha %d de %s." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: Esperava versão após Font na linha %d de %s." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: Nome de arquivo \"%s\" de #include/#po inválido." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: Custo inválido para filtro na linha %d de %s." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc: Tipo MIME vazio inválido para filtro na linha %d de %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "ppdc: Nome de programa vazio inválido na linha %d de %s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: Seção \"%s\" inválida de opção na linha %d de %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: Tipo \"%s\" inválido de opção na linha %d de %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: Carregando arquivo \"%s\" de informações de driver." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: Carregando mensagens para locale \"%s\"." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: Carregando mensagens de \"%s\"." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: Faltando #endif ao final de \"%s\"." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: Faltando #if na linha %d de %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" "ppdc: Precisa de uma linha de msgid antes de qualquer string de tradução na " "linha %d de %s." #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: Nenhum catálogo de mensagens fornecido para o locale %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "ppdc: Opção %s definida em dois grupos diferentes na linha %d de %s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "ppdc: Opção %s redefinida com um tipo diferente na linha %d de %s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc: Restrição da opção deve *name na linha %d de %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: Muitos #if aninhados demais na linha %d de %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: Não foi possível criar o arquivo PPD \"%s\" - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: Não foi possível criar diretório de saída %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: Não foi possível criar redirecionamento de saída: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: Não foi possível executar cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: Não foi possível encontrar arquivo #po %s na linha %d de %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" "ppdc: Não foi possível encontrar o arquivo include \"%s\" na linha %d de %s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: Não foi possível encontrar localização para \"%s\" - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: Não foi possível carregar arquivo de localização \"%s\" - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: Não foi possível abrir %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: Variável indefinida (%s) na linha %d de %s." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: Texto inesperado na linha %d de %s." #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: Tipo de driver %s desconhecido na linha %d de %s." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: Tipo de duplex desconhecido \"%s\" na linha %d de %s." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: Tamanho de mídia desconhecido \"%s\" na linha %d de %s." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: Formato de catálogo de mensagens desconhecido para \"%s\"." #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: Token desconhecido \"%s\" visto na linha %d de %s." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: Caractere final desconhecido em número real \"%s\" na linha %d de %s." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc: Início de string não terminada com %c na linha %d de %s." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: Aviso - nome de arquivo em sobreposição \"%s\"." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: Gravando %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: Gravando arquivos PPD para a pasta \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: LanguageVersion incorreto \"%s\" em %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: Ignorando o arquivo PPD %s." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: Não é possível fazer backup de %s para %s - %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "impressora %s desabilitada desde %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "impressora %s está inativa; habilitada desde %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "impressora %s está imprimindo %s-%d; habilitada desde %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "impressora %s/%s desabilitada desde %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "impressora %s/%s está inativa; habilitada desde %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "impressora %s/%s está imprimindo %s-%d; habilitada desde %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "processando" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "id de requisição é %s-%d (%d arquivo(s))" msgid "request-id uses indefinite length" msgstr "request-id usa comprimento indefinido" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "Agendador não está em execução" msgid "scheduler is running" msgstr "Agendador está em execução" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "falhou o estado de %s: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tMostra estado do daemon e da fila." #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "parou" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "destino padrão do sistema: %s" #, c-format msgid "system default destination: %s/%s" msgstr "destino padrão do sistema: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "desconhecido" msgid "untitled" msgstr "sem título" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings usa comprimento indefinido" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "Uma senha do Samba é necessária para exportar drivers de impressora" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "Um nome de usuário do Samba é necessário para exportar drivers de " #~ "impressora" #~ msgid "Export Printers to Samba" #~ msgstr "Exportar impressoras para o Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: Não foi possível definir diretamente Porta ou Listen." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: Não foi possível abrir o arquivo PPD \"%s\" - %s" cups-2.3.1/locale/checkpo.c000664 000765 000024 00000021360 13574721672 015620 0ustar00mikestaff000000 000000 /* * Verify that translations in the .po file have the same number and type of * printf-style format strings. * * Copyright 2007-2017 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. * * Usage: * * checkpo filename.{po,strings} [... filenameN.{po,strings}] * * Compile with: * * gcc -o checkpo checkpo.c `cups-config --libs` */ #include /* * Local functions... */ static char *abbreviate(const char *s, char *buf, int bufsize); static cups_array_t *collect_formats(const char *id); static void free_formats(cups_array_t *fmts); /* * 'main()' - Validate .po and .strings files. */ int /* O - Exit code */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ cups_array_t *po; /* .po file */ _cups_message_t *msg; /* Current message */ cups_array_t *idfmts, /* Format strings in msgid */ *strfmts; /* Format strings in msgstr */ char *idfmt, /* Current msgid format string */ *strfmt; /* Current msgstr format string */ int fmtidx; /* Format index */ int status, /* Exit status */ pass, /* Pass/fail status */ untranslated; /* Untranslated messages */ char idbuf[80], /* Abbreviated msgid */ strbuf[80]; /* Abbreviated msgstr */ if (argc < 2) { puts("Usage: checkpo filename.{po,strings} [... filenameN.{po,strings}]"); return (1); } /* * Check every .po or .strings file on the command-line... */ for (i = 1, status = 0; i < argc; i ++) { /* * Use the CUPS .po loader to get the message strings... */ if (strstr(argv[i], ".strings")) po = _cupsMessageLoad(argv[i], _CUPS_MESSAGE_STRINGS); else po = _cupsMessageLoad(argv[i], _CUPS_MESSAGE_PO | _CUPS_MESSAGE_EMPTY); if (!po) { perror(argv[i]); return (1); } if (i > 1) putchar('\n'); printf("%s: ", argv[i]); fflush(stdout); /* * Scan every message for a % string and then match them up with * the corresponding string in the translation... */ pass = 1; untranslated = 0; for (msg = (_cups_message_t *)cupsArrayFirst(po); msg; msg = (_cups_message_t *)cupsArrayNext(po)) { /* * Make sure filter message prefixes are not translated... */ if (!strncmp(msg->msg, "ALERT:", 6) || !strncmp(msg->msg, "CRIT:", 5) || !strncmp(msg->msg, "DEBUG:", 6) || !strncmp(msg->msg, "DEBUG2:", 7) || !strncmp(msg->msg, "EMERG:", 6) || !strncmp(msg->msg, "ERROR:", 6) || !strncmp(msg->msg, "INFO:", 5) || !strncmp(msg->msg, "NOTICE:", 7) || !strncmp(msg->msg, "WARNING:", 8)) { if (pass) { pass = 0; puts("FAIL"); } printf(" Bad prefix on filter message \"%s\"\n", abbreviate(msg->msg, idbuf, sizeof(idbuf))); } idfmt = msg->msg + strlen(msg->msg) - 1; if (idfmt >= msg->msg && *idfmt == '\n') { if (pass) { pass = 0; puts("FAIL"); } printf(" Trailing newline in message \"%s\"\n", abbreviate(msg->msg, idbuf, sizeof(idbuf))); } for (; idfmt >= msg->msg; idfmt --) if (!isspace(*idfmt & 255)) break; if (idfmt >= msg->msg && *idfmt == '!') { if (pass) { pass = 0; puts("FAIL"); } printf(" Exclamation in message \"%s\"\n", abbreviate(msg->msg, idbuf, sizeof(idbuf))); } if ((idfmt - 2) >= msg->msg && !strncmp(idfmt - 2, "...", 3)) { if (pass) { pass = 0; puts("FAIL"); } printf(" Ellipsis in message \"%s\"\n", abbreviate(msg->msg, idbuf, sizeof(idbuf))); } if (!msg->str || !msg->str[0]) { untranslated ++; continue; } else if (strchr(msg->msg, '%')) { idfmts = collect_formats(msg->msg); strfmts = collect_formats(msg->str); fmtidx = 0; for (strfmt = (char *)cupsArrayFirst(strfmts); strfmt; strfmt = (char *)cupsArrayNext(strfmts)) { if (isdigit(strfmt[1] & 255) && strfmt[2] == '$') { /* * Handle positioned format stuff... */ fmtidx = strfmt[1] - '1'; strfmt += 3; if ((idfmt = (char *)cupsArrayIndex(idfmts, fmtidx)) != NULL) idfmt ++; } else { /* * Compare against the current format... */ idfmt = (char *)cupsArrayIndex(idfmts, fmtidx); } fmtidx ++; if (!idfmt || strcmp(strfmt, idfmt)) break; } if (cupsArrayCount(strfmts) != cupsArrayCount(idfmts) || strfmt) { if (pass) { pass = 0; puts("FAIL"); } printf(" Bad translation string \"%s\"\n for \"%s\"\n", abbreviate(msg->str, strbuf, sizeof(strbuf)), abbreviate(msg->msg, idbuf, sizeof(idbuf))); fputs(" Translation formats:", stdout); for (strfmt = (char *)cupsArrayFirst(strfmts); strfmt; strfmt = (char *)cupsArrayNext(strfmts)) printf(" %s", strfmt); fputs("\n Original formats:", stdout); for (idfmt = (char *)cupsArrayFirst(idfmts); idfmt; idfmt = (char *)cupsArrayNext(idfmts)) printf(" %s", idfmt); putchar('\n'); putchar('\n'); } free_formats(idfmts); free_formats(strfmts); } /* * Only allow \\, \n, \r, \t, \", and \### character escapes... */ for (strfmt = msg->str; *strfmt; strfmt ++) { if (*strfmt == '\\') { strfmt ++; if (*strfmt != '\\' && *strfmt != 'n' && *strfmt != 'r' && *strfmt != 't' && *strfmt != '\"' && !isdigit(*strfmt & 255)) { if (pass) { pass = 0; puts("FAIL"); } printf(" Bad escape \\%c in filter message \"%s\"\n" " for \"%s\"\n", strfmt[1], abbreviate(msg->str, strbuf, sizeof(strbuf)), abbreviate(msg->msg, idbuf, sizeof(idbuf))); break; } } } } if (pass) { int count = cupsArrayCount(po); /* Total number of messages */ if (untranslated >= (count / 10) && strcmp(argv[i], "cups.pot")) { /* * Only allow 10% of messages to be untranslated before we fail... */ pass = 0; puts("FAIL"); printf(" Too many untranslated messages (%d of %d or %.1f%% are translated)\n", count - untranslated, count, 100.0 - 100.0 * untranslated / count); } else if (untranslated > 0) printf("PASS (%d of %d or %.1f%% are translated)\n", count - untranslated, count, 100.0 - 100.0 * untranslated / count); else puts("PASS"); } if (!pass) status = 1; _cupsMessageFree(po); } return (status); } /* * 'abbreviate()' - Abbreviate a message string as needed. */ static char * /* O - Abbreviated string */ abbreviate(const char *s, /* I - String to abbreviate */ char *buf, /* I - Buffer */ int bufsize) /* I - Size of buffer */ { char *bufptr; /* Pointer into buffer */ for (bufptr = buf, bufsize -= 4; *s && bufsize > 0; s ++) { if (*s == '\n') { if (bufsize < 2) break; *bufptr++ = '\\'; *bufptr++ = 'n'; bufsize -= 2; } else if (*s == '\t') { if (bufsize < 2) break; *bufptr++ = '\\'; *bufptr++ = 't'; bufsize -= 2; } else if (*s >= 0 && *s < ' ') { if (bufsize < 4) break; sprintf(bufptr, "\\%03o", *s); bufptr += 4; bufsize -= 4; } else { *bufptr++ = *s; bufsize --; } } if (*s) memcpy(bufptr, "...", 4); else *bufptr = '\0'; return (buf); } /* * 'collect_formats()' - Collect all of the format strings in the msgid. */ static cups_array_t * /* O - Array of format strings */ collect_formats(const char *id) /* I - msgid string */ { cups_array_t *fmts; /* Array of format strings */ char buf[255], /* Format string buffer */ *bufptr; /* Pointer into format string */ fmts = cupsArrayNew(NULL, NULL); while ((id = strchr(id, '%')) != NULL) { if (id[1] == '%') { /* * Skip %%... */ id += 2; continue; } for (bufptr = buf; *id && bufptr < (buf + sizeof(buf) - 1); id ++) { *bufptr++ = *id; if (strchr("CDEFGIOSUXcdeifgopsux", *id)) { id ++; break; } } *bufptr = '\0'; cupsArrayAdd(fmts, strdup(buf)); } return (fmts); } /* * 'free_formats()' - Free all of the format strings. */ static void free_formats(cups_array_t *fmts) /* I - Array of format strings */ { char *s; /* Current string */ for (s = (char *)cupsArrayFirst(fmts); s; s = (char *)cupsArrayNext(fmts)) free(s); cupsArrayDelete(fmts); } cups-2.3.1/locale/cups_ru.po000664 000765 000024 00001270263 13574721672 016071 0ustar00mikestaff000000 000000 msgid "" msgstr "" "Project-Id-Version: CUPS 2.0\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2015-01-28 12:00-0800\n" "Last-Translator: Aleksandr Proklov\n" "Language-Team: Russian - PuppyRus Linux Team\n" "Language: Russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(все)" msgid "\t\t(none)" msgstr "\t\t(нет)" #, c-format msgid "\t%d entries" msgstr "\tзаписей: %d" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tПосле ошибки: продолжить" #, c-format msgid "\tAlerts: %s" msgstr "\tПредупреждения: %s" msgid "\tBanner required" msgstr "\tТребуется баннер" msgid "\tCharset sets:" msgstr "\tНабор символов устанавливает:" msgid "\tConnection: direct" msgstr "\tПодключение: прямое" msgid "\tConnection: remote" msgstr "\tПодключение: удаленное" msgid "\tContent types: any" msgstr "\tТип содержимого: любой" msgid "\tDefault page size:" msgstr "\tРазмер страницы по умолчанию:" msgid "\tDefault pitch:" msgstr "\tВысота по умолчанию:" msgid "\tDefault port settings:" msgstr "\tНастройки порта по умолчанию:" #, c-format msgid "\tDescription: %s" msgstr "\tОписание: %s" msgid "\tForm mounted:" msgstr "\tФорма подключения:" msgid "\tForms allowed:" msgstr "\tРазрешенные формы:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tИнтерфейс: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tИнтерфейс: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tРасположение: %s" msgid "\tOn fault: no alert" msgstr "\tПри ошибке: не выводить предупреждение" msgid "\tPrinter types: unknown" msgstr "\tТип принтера: неизвестен" #, c-format msgid "\tStatus: %s" msgstr "\tСтатус: %s" msgid "\tUsers allowed:" msgstr "\tРазрешенные пользователи:" msgid "\tUsers denied:" msgstr "\tЗапрещенные пользователи:" msgid "\tdaemon present" msgstr "\tдемон присутствует" msgid "\tno entries" msgstr "\tнет записей" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tпринтер на скорости -1 устройства «%s»" msgid "\tprinting is disabled" msgstr "\tпечать отключена" msgid "\tprinting is enabled" msgstr "\tпечать включена" #, c-format msgid "\tqueued for %s" msgstr "\tочередь для %s" msgid "\tqueuing is disabled" msgstr "\tочередь отключена" msgid "\tqueuing is enabled" msgstr "\tочередь включена" msgid "\treason unknown" msgstr "\tпричина неизвестна" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " ПОДРОБНЫЕ РЕЗУЛЬТАТЫ ТЕСТА СООТВЕТСТВИЯ" msgid " REF: Page 15, section 3.1." msgstr " REF: Стр. 15, раздел 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Стр. 15, раздел 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Стр. 19, раздел 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Стр. 20, раздел 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Стр. 27, раздел 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Стр. 42, раздел 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Стр. 16-17, раздел 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Стр. 42-45, раздел 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Стр. 45-46, раздел 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Стр. 48-49, раздел 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Стр. 52-54, раздел 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f байт" #, c-format msgid " PASS Default%s" msgstr " PASS Default%s" msgid " PASS DefaultImageableArea" msgstr " PASS DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " PASS DefaultPaperDimension" msgid " PASS FileVersion" msgstr " PASS FileVersion" msgid " PASS FormatVersion" msgstr " PASS FormatVersion" msgid " PASS LanguageEncoding" msgstr " PASS LanguageEncoding" msgid " PASS LanguageVersion" msgstr " PASS LanguageVersion" msgid " PASS Manufacturer" msgstr " PASS Manufacturer" msgid " PASS ModelName" msgstr " PASS ModelName" msgid " PASS NickName" msgstr " PASS NickName" msgid " PASS PCFileName" msgstr " PASS PCFileName" msgid " PASS PSVersion" msgstr " PASS PSVersion" msgid " PASS PageRegion" msgstr " PASS PageRegion" msgid " PASS PageSize" msgstr " PASS PageSize" msgid " PASS Product" msgstr " PASS Product" msgid " PASS ShortNickName" msgstr " PASS ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr "\tWARN\t%s не содержит соответствующих параметров." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" "\tWARN\t%s использует общий префикс совместно с %s\n" " REF: Стр. 15, раздел 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" "\tWARN\tКлючевое слово параметра дуплекса %s может привести к некорректным " "результатам. Используйте имя 'Duplex'\n" " REF: Стр. 122, раздел 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "\tWARN\tФайл содержит комбинацию окончаний строки CR, LF, CR LF" msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" "\tWARN\tLanguageEncoding требуется спецификацией PPD 4.3.\n" " REF: Стр. 56-57, раздел 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr "\tWARN\tСтрока %d содержит только пробелы." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" "\tWARN\tManufacturer требуется спецификацией PPD 4.3.\n" " REF: Стр. 58-59, раздел 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" "\tWARN\tPPD-файлы не из Windows должны использовать строки только с " "окончанием LF, а не с CR LF" #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" "\tWARN\tУстаревшая версия PPD %.1f.\n" " REF: Стр. 42, раздел 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" "\tWARN\tPCFileName длиннее чем 8.3 нарушает спецификацию PPD.\n" " REF: Стр. 61-62, раздел 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" "\tWARN\tPCFilename должен содержать уникальное название\n" " REF: Стр. 61-62, раздел 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" "\tWARN\tProtocols содержит PJL, но атрибуты JCL не настроены.\n" " REF: Стр. 78-79, раздел 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" "\tWARN\tProtocols содержит PJL и BCP; ожидается TBCP.\n" " REF: Стр. 78-79, раздел 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" "\tWARN\tShortNickName требуется спецификацией PPD 4.3.\n" " REF: Стр. 64-65, раздел 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" "\t%s \"%s %s\" конфликтует с \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr "\t%s %s %s не существует." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr "\t%s %s файл \"%s\" имеет неверный регистр." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" "\t%s Неверный %s выбор %s.\n" " REF: Стр. 122, раздел 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s, выбора %s" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s" #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr "\t%s Неверное значение cupsFilter \"%s\"." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr "\t%s Неверное значение cupsFilter2 \"%s\"." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr "\t%s Неверный cupsICCProfile %s." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr "\t%s Неверное значение cupsPreFilter \"%s\"." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr "\t%s Неверное значение cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Bad language \"%s\"." msgstr "\t%s Неверный язык \"%s\"." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr "\t%s Неверные права %s для файла \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s Ошибки в %s - должно быть %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "\t%s Невозможно предоставить APScanAppPath и APScanAppBundleID вместе." #, c-format msgid " %s Default choices conflicting." msgstr "\t%s\tЗначения, используемые по умолчанию, конфликтуют." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s Пустой cupsUIConstraints %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "\t%s Перевод \"%s\" отсутствует для параметра %s, выбора %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr "" #, c-format msgid " %s Missing %s file \"%s\"." msgstr "\t%s отсутствует %s файл \"%s\"." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" "\t%s Обязательный параметр PageRegion отсутствует.\n" "\t\t REF: Стр. 100, раздел 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" "\t%s Обязательный параметр PageSize отсутствует.\n" " REF: Стр. 99, раздел 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Выбор *%s %s отсутствует в UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Выбор *%s %s отсутствует в cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr "\t%s cupsUIResolver отсутствует %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "\t%s Отсутствует параметр %s у UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "\t%s Отсутствует параметр %s у cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr "\t%s Основной перевод \"%s\" не включен в файл." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" "\t ТРЕБУЕТСЯ %s: %s не определяет выбор \"Нет\".\n" " REF: Стр. 122, раздел 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "\t%s Размер \"%s\" определен для %s, но не определен для %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "\t%s Размер \"%s\" имеет неверное значение (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr "\t%s Размер \"%s\" должен быть \"%s\"." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "\t%s Размер \"%s\" должен быть в формате Adobe standard name \"%s\"." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr "\tХеш-значение %s cupsICCProfile %s конфликтует с %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr "\t%s cupsUIResolver %s создает цикл." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "\t%s В cupsUIResolver %s не перечислено как минимум два параметра." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" "\t**FAIL** %s должно соответствовать 1284DeviceID\n" " REF: Стр. 72, раздел 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" "\t**FAIL** Неверный Default%s %s\n" " REF: Стр. 40, раздел 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" "\t**FAIL** Неверный DefaultImageableArea %s\n" " REF: Стр. 102, раздел 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" "\t**FAIL** Неверный DefaultPaperDimension %s\n" " REF: Стр. 103, раздел 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" "\t**FAIL** Неверный FileVersion \"%s\"\n" " REF: Стр. 56, раздел 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" "\t**FAIL** Неверный FormatVersion \"%s\"\n" " REF: Стр. 56, раздел 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" "\t**FAIL** Неверный JobPatchFile атрибут в файле\n" " REF: Стр. 24, раздел 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "\t**FAIL** Неверный LanguageEncoding %s - должен быть ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "\t**FAIL** Неверный LanguageVersion %s - должен быть английский." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" "\t**FAIL** Неверный Manufacturer (должен быть \"%s\")\n" " REF: Стр. 211, таблица D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" "\t**FAIL** Неверное ModelName – \"%c\" не разрешено в строке.\n" " REF: Стр. 59-60, раздел 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" "\t**FAIL** Неверная PSVersion – не «(string) int».\n" " REF: Стр. 62-64, раздел 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" "\t**FAIL** Неверный Product – не \"(string)\".\n" " REF: Стр. 62, раздел 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" "\t**FAIL** Неверный ShortNickName – длиннее чем 31 симв.\n" " REF: Стр. 64-65, раздел 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" "\t**FAIL** Неверный параметр %s выбор %s\n" " REF: Стр. 84, раздел 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "\t**FAIL** Не удается опознать код параметра по умолчанию: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" "\t**FAIL** Стандартный перевод для параметра %s выбора %s содержит 8-битовые " "символы." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" "\t**FAIL** Стандартный перевод для параметра %s содержит 8-битовые символы." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "\t**FAIL** Имена групп %s и %s отличаются только регистром символов." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "\t**FAIL** Для выбора параметра %s имя %s встречается несколько раз." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" "\t**FAIL** Параметр %s с именами %s и %s отличается только регистром " "символов." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" "\t**FAIL** Названия параметров %s и %s отличаются только регистром символов." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ Default%s\n" " REF: Стр. 40, раздел 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ DefaultImageableArea\n" " REF: Стр. 102, раздел 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ DefaultPaperDimension\n" " REF: Стр. 103, раздел 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ FileVersion\n" " REF: Стр. 56, раздел 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ FormatVersion\n" " REF: Стр. 56, раздел 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ ImageableArea для PageSize %s\n" " REF: Стр. 41, раздел 5.\n" " REF: Стр. 102, раздел 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ LanguageEncoding\n" " REF: Стр. 56-57, раздел 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ LanguageVersion\n" " REF: Стр. 57-58, раздел 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ Manufacturer\n" " REF: Стр. 58-59, раздел 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ ModelName\n" " REF: Стр. 59-60, раздел 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ NickName\n" " REF: Стр. 60, раздел 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PCFileName\n" " REF: Стр. 61-62, раздел 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PSVersion\n" " REF: Стр. 62-64, раздел 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PageRegion\n" " REF: Стр. 100, раздел 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PageSize\n" " REF: Стр. 41, раздел 5.\n" " REF: Стр. 99, раздел 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PageSize\n" " REF: Стр. 99-100, раздел 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ PaperDimension для PageSize %s\n" " REF: Стр. 41, раздел 5.\n" " REF: Стр. 103, раздел 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ Product\n" " REF: Стр. 62, раздел 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" "\t**FAIL** ТРЕБУЕТСЯ ShortNickName\n" " REF: Стр. 64-65, раздел 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "\t**FAIL** Не удается открыть PPD-файл – %s в строке %d." #, c-format msgid " %d ERRORS FOUND" msgstr " ОБНАРУЖЕНО ОШИБОК: %d" msgid " NO ERRORS FOUND" msgstr " ОШИБОК НЕ ОБНАРУЖЕНО" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Строки заканчиваются на CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Строки заканчиваются на CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr "" " --list-filters Список фильтров которые должны использоваться." msgid " -D Remove the input file when finished." msgstr " -D Удалить входной файл после завершения." msgid " -D name=value Set named variable to value." msgstr " -D name=value Определение переменной." msgid " -I include-dir Add include directory to search path." msgstr " -I include-dir Добавить каталог include в путь поиска." msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd Задать PPD-файл." msgid " -U username Specify username." msgstr " -U username Указание имени пользователя." msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalog.po Загружается указанный каталог сообщений." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c cups-files.conf Использовать заданный cups-files.conf" msgid " -d output-dir Specify the output directory." msgstr " -d output-dir Задать выходной каталог." msgid " -d printer Use the named printer." msgstr " -d printer Использовать заданный принтер." msgid " -e Use every filter from the PPD file." msgstr " -e Использовать каждый фильтр из PPD-файла." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i mime/type Указать MIME-тип данных на входе (иначе " "автоопред.)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] Из указанного задания выбирается файл N (по " "умолчанию файл 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] Задать выходной язык(и) (locale)." msgid " -m Use the ModelName value as the filename." msgstr "" " -m В качестве имени файла используется ModelName." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type Указать MIME-тип данных на выходе (иначе " "application/pdf)." msgid " -n copies Set number of copies." msgstr " -n copies Указать количество копий." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o filename.drv Указать файл с информацией о драйвере (иначе ppdi." "drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr " -o filename.ppd[.gz] Задать выходной файл (иначе stdout)." msgid " -o name=value Set option(s)." msgstr " -o name=value Задать параметры." msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd Задать PPD-файл." msgid " -t Test PPDs instead of generating them." msgstr " -t Тест PPDs вместо его создания." msgid " -t title Set title." msgstr " -t title Задать заголовок." msgid " -u Remove the PPD file when finished." msgstr " -u Удалить PPD-файл после завершения." msgid " -v Be verbose." msgstr " -v Подробный вывод лога." msgid " -z Compress PPD files using GNU zip." msgstr " -z Сжимать PPD-файл используя GNU zip." msgid " FAIL" msgstr " FAIL" msgid " PASS" msgstr " PASS" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f байт" #, c-format msgid "%d x %d mm" msgstr "%d x %d мм" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (без полей)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (без полей, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (без полей, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s принимает запросы с момента %s" #, c-format msgid "%s cannot be changed." msgstr "%s не может быть изменен." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s не выполнено версией CUPS для lpc." #, c-format msgid "%s is not ready" msgstr "%s не готов" #, c-format msgid "%s is ready" msgstr "%s готов" #, c-format msgid "%s is ready and printing" msgstr "%s готов и печатает" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s задание пользователь название копий параметры [файл]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s не принимает запросы с момента %s -" #, c-format msgid "%s not supported." msgstr "%s не поддерживается." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s принимает запросы с момента %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s не принимает запросы с момента %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [задание %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: ошибка %s: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: Неверная версия %s для \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: Дальнейшие действия неизвестны." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: Ошибка - %s переменная окружения указывает на несуществующее назначение " "\"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Ошибка - добавьте '/version=1.1' к имени сервера." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: Ошибка - неверный ID задания." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: Ошибка - невозможно печатать файлы и редактировать задания одновременно." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: Ошибка - не удается печать из stdin, если предоставлены файлы или ID " "задания." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Ошибка - после параметра \"-S\" должен идти набор символов." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "" "%s: Ошибка - после параметра \"-T\" должен быть указан тип содержимого." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "" "%s: Ошибка - после параметра \"-#\" должно быть указано количество копий." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "" "%s: Ошибка - после параметра \"-n\" должно быть указано количество копий." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Ошибка - после параметра \"-P\" должно быть указано назначение." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: Ошибка - после параметра \"-d\" должно быть указано назначение." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Ошибка - после параметра \"-f\" должна быть указана форма." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Ошибка - после параметра \"-H\" должно быть указано имя хоста." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: Ошибка - после параметра \"-H\" должно быть указано имя хоста." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: Ошибка - после параметра \"-h\" должно быть указано имя хоста." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Ошибка - после параметра \"-y\" должен быть указан список режимов." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: Ошибка - после параметра \"-%c\" должно быть указано имя." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" "%s: Ошибка - после параметра '-o' должна быть указана строка вида " "option=value" #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: Ошибка – после параметра \"-P\" должен идти список страниц." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Ошибка - после параметра \"-%c\" должен быть указан приоритет." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: Ошибка - после параметра \"-r\" должен идти текст причины." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Ошибка - после параметра \"-t\" должен быть указан заголовок." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "" "%s: Ошибка - после параметра \"-U\" должно быть указано имя пользователя." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "" "%s: Ошибка - после параметра \"-u\" должно быть указано имя пользователя." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: Ошибка - после параметра \"-%c\" должно быть указано значение." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: Ошибка - требуется \"завершено\",\"не завершено\" или \"все\" после " "параметра \"-W\" " #, c-format msgid "%s: Error - no default destination available." msgstr "%s: Ошибка – нет доступного назначения по умолчанию." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: Ошибка – приоритет должен быть от 1 до 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: Ошибка - планировщик не отвечает." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: Ошибка – слишком много файлов – \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: Ошибка – не удается получить доступ к \"%s\" – %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: Ошибка – не удается поставить в очередь из stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: Ошибка - неизвестное назначение \"%s\"." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: ошибка - неизвестное назначение \"%s/%s\"." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: Ошибка - неизвестный параметр \"%c\"." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: Ошибка - неизвестный параметр \"%s\"." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: После параметра \"-i\" должен быть указан ID задания." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: Недопустимое имя назначения в списке \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: Неверная строка фильтра \"%s\"." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: Пропущено имя файла для \"-P\"." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: Пропущен таймаут для \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: Пропущена версия для \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: Необходимо указать ID задания (\"-i jobid\") перед \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "" "%s: Отсутствует фильтр, необходимый для преобразования из %s/%s в %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: Операция не удалась: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: Нет поддержки шифрования." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: Не удается подключиться к серверу." #, c-format msgid "%s: Unable to contact server." msgstr "%s: Не удается установить связь с сервером." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: Не удается определить тип MIME \"%s\"." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: Не удается открыть \"%s\": %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: Не удается открыть %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: Не удается открыть PPD-файл: %s в строке %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: Не удается прочитать базу данных MIME из \"%s\" или \"%s\"." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: Неизвестное назначение \"%s\"." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: Неизвестный MIME-тип назначения %s/%s." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: Неизвестный параметр \"%c\"." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: Неизвестный параметр \"%s\"." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: Неизвестный параметр \"-%c\"." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: Неизвестный MIME-тип источника %s/%s." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: Внимание - модификатор формата \"%c\" не поддерживается - вывод может " "быть неправильным." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: Внимание - параметр набора символов пропущен." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: Внимание - параметр типа содержимого пропущен." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: Внимание - параметр формы пропущен." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Внимание - параметр режима пропущен." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 дюйм/с" msgid "1.25x0.25\"" msgstr "1,25x0,25\"" msgid "1.25x2.25\"" msgstr "1,25x2,25\"" msgid "1.5 inch/sec." msgstr "1,5 дюйма/с" msgid "1.50x0.25\"" msgstr "1,50x0,25\"" msgid "1.50x0.50\"" msgstr "1,50x0,50\"" msgid "1.50x1.00\"" msgstr "1,50x1,00\"" msgid "1.50x2.00\"" msgstr "1,50x2,00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 дюймов/с" msgid "10 x 11" msgstr "" msgid "10 x 13" msgstr "" msgid "10 x 14" msgstr "" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 мм/с" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 дюймов/с" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 дюймов/с" msgid "12 x 11" msgstr "" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 мм/с" msgid "120x60dpi" msgstr "120x60dpi" msgid "120x72dpi" msgstr "120x72dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 мм/с" msgid "15 x 11" msgstr "" msgid "150 mm/sec." msgstr "150 мм/с" msgid "150dpi" msgstr "150dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 дюйма/с" msgid "2-Sided Printing" msgstr "двусторонняя печать" msgid "2.00x0.37\"" msgstr "2,00x0,37\"" msgid "2.00x0.50\"" msgstr "2,00x0,50\"" msgid "2.00x1.00\"" msgstr "2,00x1,00\"" msgid "2.00x1.25\"" msgstr "2,00x1,25\"" msgid "2.00x2.00\"" msgstr "2,00x2,00\"" msgid "2.00x3.00\"" msgstr "2,00x3,00\"" msgid "2.00x4.00\"" msgstr "2,00x4,00\"" msgid "2.00x5.50\"" msgstr "2,00x5,50\"" msgid "2.25x0.50\"" msgstr "2,25x0,50\"" msgid "2.25x1.25\"" msgstr "2,25x1,25\"" msgid "2.25x4.00\"" msgstr "2,25x4,00\"" msgid "2.25x5.50\"" msgstr "2,25x5,50\"" msgid "2.38x5.50\"" msgstr "2,38x5,50\"" msgid "2.5 inches/sec." msgstr "2,5 дюйма/с" msgid "2.50x1.00\"" msgstr "2,50x1,00\"" msgid "2.50x2.00\"" msgstr "2,50x2,00\"" msgid "2.75x1.25\"" msgstr "2,75x1,25\"" msgid "2.9 x 1\"" msgstr "2,9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 мм/с" msgid "200 mm/sec." msgstr "200 мм/с" msgid "203dpi" msgstr "203dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "Тип 24-Pin" msgid "240x72dpi" msgstr "240x72dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 мм/с" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 дюйма/с" msgid "3 x 5" msgstr "" msgid "3.00x1.00\"" msgstr "3,00x1,00\"" msgid "3.00x1.25\"" msgstr "3,00x1,25\"" msgid "3.00x2.00\"" msgstr "3,00x2,00\"" msgid "3.00x3.00\"" msgstr "3,00x3,00\"" msgid "3.00x5.00\"" msgstr "3,00x5,00\"" msgid "3.25x2.00\"" msgstr "3,25x2,00\"" msgid "3.25x5.00\"" msgstr "3,25x5,00\"" msgid "3.25x5.50\"" msgstr "3,25x5,50\"" msgid "3.25x5.83\"" msgstr "3,25x5,83\"" msgid "3.25x7.83\"" msgstr "3,25x7,83\"" msgid "3.5 x 5" msgstr "" msgid "3.5\" Disk" msgstr "Диск 3.5\"" msgid "3.50x1.00\"" msgstr "3,50x1,00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 мм/с" msgid "300 mm/sec." msgstr "300 мм/с" msgid "300dpi" msgstr "300dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360dpi" msgid "360x180dpi" msgstr "360x180dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 дюйма/с" msgid "4.00x1.00\"" msgstr "4,00x1,00\"" msgid "4.00x13.00\"" msgstr "4,00x13,00\"" msgid "4.00x2.00\"" msgstr "4,00x2,00\"" msgid "4.00x2.50\"" msgstr "4,00x2,50\"" msgid "4.00x3.00\"" msgstr "4,00x3,00\"" msgid "4.00x4.00\"" msgstr "4,00x4,00\"" msgid "4.00x5.00\"" msgstr "4,00x5,00\"" msgid "4.00x6.00\"" msgstr "4,00x6,00\"" msgid "4.00x6.50\"" msgstr "4,00x6,50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 мм/с" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 дюймов/с" msgid "5 x 7" msgstr "" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 дюймов/с" msgid "6.00x1.00\"" msgstr "6,00x1,00\"" msgid "6.00x2.00\"" msgstr "6,00x2,00\"" msgid "6.00x3.00\"" msgstr "6,00x3,00\"" msgid "6.00x4.00\"" msgstr "6,00x4,00\"" msgid "6.00x5.00\"" msgstr "6,00x5,00\"" msgid "6.00x6.00\"" msgstr "6,00x6,00\"" msgid "6.00x6.50\"" msgstr "6,00x6,50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 мм/с" msgid "600dpi" msgstr "600dpi" msgid "60dpi" msgstr "60dpi" msgid "60x72dpi" msgstr "" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 дюймов/с" msgid "7 x 9" msgstr "" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 дюймов/с" msgid "8 x 10" msgstr "" msgid "8.00x1.00\"" msgstr "8,00x1,00\"" msgid "8.00x2.00\"" msgstr "8,00x2,00\"" msgid "8.00x3.00\"" msgstr "8,00x3,00\"" msgid "8.00x4.00\"" msgstr "8,00x4,00\"" msgid "8.00x5.00\"" msgstr "8,00x5,00\"" msgid "8.00x6.00\"" msgstr "8,00x6,00\"" msgid "8.00x6.50\"" msgstr "8,00x6,50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 мм/с" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 дюймов/с" msgid "9 x 11" msgstr "" msgid "9 x 12" msgstr "" msgid "9-Pin Series" msgstr "Тип 9-Pin" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "" #, c-format msgid "A class named \"%s\" already exists." msgstr "Группа с именем \"%s\" уже существует." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Принтер с именем \"%s\" уже существует." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "" msgid "A3 Oversize" msgstr "" msgid "A3 Oversize Long Edge" msgstr "" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "" msgid "A4 Oversize" msgstr "" msgid "A4 Small" msgstr "" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "" msgid "A5 Oversize" msgstr "" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "" msgid "Accept Jobs" msgstr "Принять задания" msgid "Accepted" msgstr "Принято" msgid "Add Class" msgstr "Добавить группу" msgid "Add Printer" msgstr "Добавить принтер" msgid "Address" msgstr "Адрес" msgid "Administration" msgstr "Администрирование" msgid "Always" msgstr "Всегда" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Исполнительное устройство" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "Попытка установить %s printer-state на неверное значение %d" #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Атрибут группы не в диапазоне (%x < %x)" msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Неверный указатель NULL dests" msgid "Bad OpenGroup" msgstr "Неверное значение OpenGroup" msgid "Bad OpenUI/JCLOpenUI" msgstr "Неверное значение OpenUI/JCLOpenUI" msgid "Bad OrderDependency" msgstr "Неверное значение OrderDependency" msgid "Bad PPD cache file." msgstr "" msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "Неверный запрос" msgid "Bad SNMP version number" msgstr "Неверный номер версии SNMP" msgid "Bad UIConstraints" msgstr "Неверное значение UIConstraints" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "Неверные аргументы для функции" #, c-format msgid "Bad copies value %d." msgstr "Неверное значение количества копий %d." msgid "Bad custom parameter" msgstr "Неверный индивидуальный параметр" #, c-format msgid "Bad device-uri \"%s\"." msgstr "Неверное значение device-uri \"%s\"." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Неверная схема device-uri \"%s\"." #, c-format msgid "Bad document-format \"%s\"." msgstr "Неверное значение document-format \"%s\"." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "Неверное значение document-format-default \"%s\"." msgid "Bad filename buffer" msgstr "Ошибка в буфере filename" msgid "Bad hostname/address in URI" msgstr "Неверный hostname/address в URI" #, c-format msgid "Bad job-name value: %s" msgstr "Неверное значение job-name: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Неверное значение job-name: Wrong type or count." msgid "Bad job-priority value." msgstr "Неверное значение job-priority." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Неверное значение job-sheets \"%s\"." msgid "Bad job-sheets value type." msgstr "Неверный тип значения job-sheets." msgid "Bad job-state value." msgstr "Неверное значение job-state." #, c-format msgid "Bad job-uri \"%s\"." msgstr "Неверный job-uri \"%s\"." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "Неверное значение notify-pull-method \"%s\"." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "Неверный notify-recipient-uri \"%s\"." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Неверное значение number-up %d." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Неверные значения page-ranges %d-%d." msgid "Bad port number in URI" msgstr "Неверный номер порта в URI" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "Неверное значение port-monitor \"%s\"." #, c-format msgid "Bad printer-state value %d." msgstr "Неверное значение printer-state %d." msgid "Bad printer-uri." msgstr "Неверное значение printer-uri" #, c-format msgid "Bad request ID %d." msgstr "Неверный ID запроса %d." #, c-format msgid "Bad request version number %d.%d." msgstr "Неверный номер версии запроса %d.%d." msgid "Bad resource in URI" msgstr "" msgid "Bad scheme in URI" msgstr "" msgid "Bad username in URI" msgstr "Неверное имя пользователя в URI" msgid "Bad value string" msgstr "Неверная строка значений" msgid "Bad/empty URI" msgstr "Неверный или пустой URI" msgid "Banners" msgstr "Баннеры" msgid "Bond Paper" msgstr "Документная бумага" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "Параметр waiteof \"%s\" должен иметь двоичное значение" msgid "Buffer overflow detected, aborting." msgstr "Обнаружено переполнение буфера, прерывание." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "Принтер для печати этикеток CPCL" msgid "Cancel Jobs" msgstr "Отменить задания" msgid "Canceling print job." msgstr "Отмена задания печати." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "" msgid "Cassette" msgstr "Лоток" msgid "Change Settings" msgstr "Изменить настройки" #, c-format msgid "Character set \"%s\" not supported." msgstr "Набор символов \"%s\" не поддерживается." msgid "Classes" msgstr "Группы" msgid "Clean Print Heads" msgstr "Очистить головки принтера" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job не подерживает атрибут job-uri" msgid "Color" msgstr "Цвет" msgid "Color Mode" msgstr "Цветной режим" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Команды могут быть сокращены. Команды:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Для имени сообщества длина не установлена" msgid "Connected to printer." msgstr "Подключен к принтеру." msgid "Connecting to printer." msgstr "Подключение к принтеру" msgid "Continue" msgstr "Продолжить" msgid "Continuous" msgstr "Непрерывно" msgid "Control file sent successfully." msgstr "Контрольный файл успешно отправлен." msgid "Copying print data." msgstr "Копирование данных печати." msgid "Created" msgstr "Создано" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Индивидуальный" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Обрезать" msgid "Cutter" msgstr "Резак" msgid "Dark" msgstr "Темный" msgid "Darkness" msgstr "Затемненность" msgid "Data file sent successfully." msgstr "Файл данных успешно отправлен." msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Удалить группу" msgid "Delete Printer" msgstr "Удалить принтер" msgid "DeskJet Series" msgstr "Серия DeskJet" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "Назначение «%s» не принимает задания." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" msgid "Direct Thermal Media" msgstr "Носитель для термопечати" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "Каталог \"%s\" содержит относительный путь." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Каталог \"%s\" имеет небезопасные права доступа (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "Каталог \"%s\" это файл." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Каталог \"%s\" недоступен: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Каталог \"%s\" доступ OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Отключено" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "Документ #%d не существует в задании #%d." msgid "Draft" msgstr "" msgid "Duplexer" msgstr "Дуплексер" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Принтер для печати этикеток EPL1" msgid "EPL2 Label Printer" msgstr "Принтер для печати этикеток EPL2" msgid "Edit Configuration File" msgstr "Редактировать файл конфигурации" msgid "Encryption is not supported." msgstr "Шифрование не поддерживается." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Конечный баннер" msgid "English" msgstr "Russian" 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 "" "Введите свое имя пользователя и пароль или данные учетной записи root, чтобы " "получить доступ к этой странице. Если используется проверка подлинности " "Kerberos, необходимо также иметь действительный билет Kerberos." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "" msgid "Envelope #12" msgstr "" msgid "Envelope #14" msgstr "" msgid "Envelope #9" msgstr "" msgid "Envelope B4" msgstr "" msgid "Envelope B5" msgstr "" msgid "Envelope B6" msgstr "" msgid "Envelope C0" msgstr "" msgid "Envelope C1" msgstr "" msgid "Envelope C2" msgstr "" msgid "Envelope C3" msgstr "" msgid "Envelope C4" msgstr "" msgid "Envelope C5" msgstr "" msgid "Envelope C6" msgstr "" msgid "Envelope C65" msgstr "" msgid "Envelope C7" msgstr "" msgid "Envelope Choukei 3" msgstr "" msgid "Envelope Choukei 3 Long Edge" msgstr "" msgid "Envelope Choukei 4" msgstr "" msgid "Envelope Choukei 4 Long Edge" msgstr "" msgid "Envelope DL" msgstr "" msgid "Envelope Feed" msgstr "Подача конвертов" msgid "Envelope Invite" msgstr "" msgid "Envelope Italian" msgstr "" msgid "Envelope Kaku2" msgstr "" msgid "Envelope Kaku2 Long Edge" msgstr "" msgid "Envelope Kaku3" msgstr "" msgid "Envelope Kaku3 Long Edge" msgstr "" msgid "Envelope Monarch" msgstr "" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "" msgid "Envelope PRC10" msgstr "" msgid "Envelope PRC10 Long Edge" msgstr "" msgid "Envelope PRC2" msgstr "" msgid "Envelope PRC2 Long Edge" msgstr "" msgid "Envelope PRC3" msgstr "" msgid "Envelope PRC3 Long Edge" msgstr "" msgid "Envelope PRC4" msgstr "" msgid "Envelope PRC4 Long Edge" msgstr "" msgid "Envelope PRC5 Long Edge" msgstr "" msgid "Envelope PRC5PRC5" msgstr "" msgid "Envelope PRC6" msgstr "" msgid "Envelope PRC6 Long Edge" msgstr "" msgid "Envelope PRC7" msgstr "" msgid "Envelope PRC7 Long Edge" msgstr "" msgid "Envelope PRC8" msgstr "" msgid "Envelope PRC8 Long Edge" msgstr "" msgid "Envelope PRC9" msgstr "" msgid "Envelope PRC9 Long Edge" msgstr "" msgid "Envelope Personal" msgstr "" msgid "Envelope You4" msgstr "" msgid "Envelope You4 Long Edge" msgstr "" msgid "Environment Variables:" msgstr "" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Политика ошибок" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "Ошибка отправки данных растра." msgid "Error: need hostname after \"-h\" option." msgstr "ERROR: Требуется имя хоста после параметра \"-h\"" msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Каждые 10 этикеток" msgid "Every 2 Labels" msgstr "Каждые 2 этикетки" msgid "Every 3 Labels" msgstr "Каждые 3 этикетки" msgid "Every 4 Labels" msgstr "Каждые 4 этикетки" msgid "Every 5 Labels" msgstr "Каждые 5 этикеток" msgid "Every 6 Labels" msgstr "Каждые 6 этикеток" msgid "Every 7 Labels" msgstr "Каждые 7 этикеток" msgid "Every 8 Labels" msgstr "Каждые 8 этикеток" msgid "Every 9 Labels" msgstr "Каждые 9 этикеток" msgid "Every Label" msgstr "Каждая этикетка" msgid "Executive" msgstr "Executive" msgid "Expectation Failed" msgstr "Сбой ожидания" msgid "Expressions:" msgstr "Выражение:" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "Файл \"%s\" содержит относительный путь." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Файл \"%s\" имеет небезопасные права доступа (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "Файл \"%s\" является каталогом." #, c-format msgid "File \"%s\" not available: %s" msgstr "Файл \"%s\" недоступен: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Файл \"%s\" права доступа OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "URI-адреса файлового устройства отключены! Чтобы включить их, используйте " "параметр FileDevice в \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." msgstr "Последняя страница %d." msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Фолио" msgid "Forbidden" msgstr "Запрещено" msgid "Found" msgstr "" msgid "General" msgstr "Основные" msgid "Generic" msgstr "Общее" msgid "Get-Response-PDU uses indefinite length" msgstr "Для Get-Response-PDU длина не установлена" msgid "Glossy Paper" msgstr "Глянцевая бумага" msgid "Got a printer-uri attribute but no job-id." msgstr "Получен атрибут printer-uri, но не job-id" msgid "Grayscale" msgstr "Оттенки серого" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Папка подвесного хранения" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "Файл справки не проиндексирован." msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "IPP атрибут 1setOf с недопустимым значением." msgid "IPP attribute has no name." msgstr "IPP атрибут не имеет имени." msgid "IPP attribute is not a member of the message." msgstr "IPP атрибут не входит в состав сообщения." msgid "IPP begCollection value not 0 bytes." msgstr "IPP значение begCollection не 0 байт." msgid "IPP boolean value not 1 byte." msgstr "IPP двоичное значение не 1 байт." msgid "IPP date value not 11 bytes." msgstr "IPP длина даты не 11 байтов." msgid "IPP endCollection value not 0 bytes." msgstr "IPP значение endCollection не 0 байт." msgid "IPP enum value not 4 bytes." msgstr "IPP значение enum не 4 байта." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP extension tag больше чем 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "IPP тип integer не 4 байта" msgid "IPP language length overflows value." msgstr "IPP переполнение значения language length" msgid "IPP language length too large." msgstr "IPP language length слишком длинное." msgid "IPP member name is not empty." msgstr "IPP member name не пустое." msgid "IPP memberName value is empty." msgstr "IPP memberName пустое значение." msgid "IPP memberName with no attribute." msgstr "IPP memberName без атрибута." msgid "IPP name larger than 32767 bytes." msgstr "IPP имя больше чем 32767 байт." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP значение nameWithLanguage меньше минимума 4 байт." msgid "IPP octetString length too large." msgstr "IPP octetString слишком длинное." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP rangeOfInteger значение не 8 байт." msgid "IPP resolution value not 9 bytes." msgstr "IPP resolution значение не 9 байт." msgid "IPP string length overflows value." msgstr "IPP переполнение значения string length." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP textWithLanguage меньше минимума 4 байт." msgid "IPP value larger than 32767 bytes." msgstr "IPP значение больше чем 32767 байт." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "UTF-8" msgid "Illegal control character" msgstr "Недействительный контрольный символ" msgid "Illegal main keyword string" msgstr "Недействительная основная строка ключевых слов" msgid "Illegal option keyword string" msgstr "Недействительная строка ключевых слов параметра" msgid "Illegal translation string" msgstr "Недействительный перевод" msgid "Illegal whitespace character" msgstr "Недействительный символ пробела" msgid "Installable Options" msgstr "Параметры, разрешенные к установке" msgid "Installed" msgstr "Установлено" msgid "IntelliBar Label Printer" msgstr "Принтер для печати этикеток IntelliBar" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Внутренняя Ошибка сервера" msgid "Internal error" msgstr "Внутренняя ошибка" msgid "Internet Postage 2-Part" msgstr "Наклейки Internet Postage 2-Part" msgid "Internet Postage 3-Part" msgstr "Наклейки Internet Postage 3-Part" msgid "Internet Printing Protocol" msgstr "Протокол интернет-печати" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "Неверные аргументы имени бумаги." msgid "Invalid media size." msgstr "Неверный размер бумаги." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "Неверная команда принтера \"%s\"." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "" msgid "JIS B1" msgstr "" msgid "JIS B10" msgstr "" msgid "JIS B2" msgstr "" msgid "JIS B3" msgstr "" msgid "JIS B4" msgstr "" msgid "JIS B4 Long Edge" msgstr "" msgid "JIS B5" msgstr "" msgid "JIS B5 Long Edge" msgstr "" msgid "JIS B6" msgstr "" msgid "JIS B6 Long Edge" msgstr "" msgid "JIS B7" msgstr "" msgid "JIS B8" msgstr "" msgid "JIS B9" msgstr "" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "Задание #%d не может быть перезапущено - отсутствуют файлы." #, c-format msgid "Job #%d does not exist." msgstr "Задание #%d не существует." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Задание #%d уже прервано – не удается отменить." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Задание #%d уже отменено – не удается отменить." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Задание #%d уже завершено – не удается отменить." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "Задание #%d завершено и не может быть изменено." #, c-format msgid "Job #%d is not complete." msgstr "Задание #%d не завершено." #, c-format msgid "Job #%d is not held for authentication." msgstr "Задание #%d не задержано для идентификации." #, c-format msgid "Job #%d is not held." msgstr "Задание #%d не задержано." msgid "Job Completed" msgstr "Задание завершено" msgid "Job Created" msgstr "Задание создано" msgid "Job Options Changed" msgstr "Параметры задания изменены" msgid "Job Stopped" msgstr "Задание остановлено" msgid "Job is completed and cannot be changed." msgstr "Задание завершено и не может быть изменено." msgid "Job operation failed" msgstr "Сбой операции задания." msgid "Job state cannot be changed." msgstr "Состояние задания не может быть изменено." msgid "Job subscriptions cannot be renewed." msgstr "Подписки на задание не могут быть обновлены." msgid "Jobs" msgstr "Задания" msgid "LPD/LPR Host or Printer" msgstr "Хост или принтер LPD/LPR" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Принтер для печати этикеток" msgid "Label Top" msgstr "Верхний край этикетки" #, c-format msgid "Language \"%s\" not supported." msgstr "Язык \"%s\" не поддерживается." msgid "Large Address" msgstr "Полный адрес" msgid "LaserJet Series PCL 4/5" msgstr "Серия LaserJet, PCL 4/5" msgid "Letter Oversize" msgstr "" msgid "Letter Oversize Long Edge" msgstr "" msgid "Light" msgstr "Светлый" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Строка длиннее разрешенного предела (255 символов)" msgid "List Available Printers" msgstr "Список доступных принтеров" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "По длинной стороне (книжная)" msgid "Looking for printer." msgstr "Поиск принтера." msgid "Manual Feed" msgstr "Ручная подача" msgid "Media Size" msgstr "Размер бумаги" msgid "Media Source" msgstr "Источник бумаги" msgid "Media Tracking" msgstr "Контроль подачи бумаги" msgid "Media Type" msgstr "Тип бумаги" msgid "Medium" msgstr "Средний" msgid "Memory allocation error" msgstr "Ошибка выделения памяти" msgid "Missing CloseGroup" msgstr "Пропущен CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Отсутствует заголовок PPD-Adobe-4.x" msgid "Missing asterisk in column 1" msgstr "Отсутствует звездочка в колонке 1" msgid "Missing document-number attribute." msgstr "Отсутствует атрибут document-number" msgid "Missing form variable" msgstr "Отсутствует переменная формы" msgid "Missing last-document attribute in request." msgstr "Отсутствует атрибут last-document в запросе." msgid "Missing media or media-col." msgstr "Отсутствует media или media-col." msgid "Missing media-size in media-col." msgstr "Отсутствует media-size в media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Отсутствует атрибут notify-subscription-ids" msgid "Missing option keyword" msgstr "Отсутствует ключевое слово параметра" msgid "Missing requesting-user-name attribute." msgstr "Отсутствует атрибут requesting-user-name." #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "Отсутствуют обязательные атрибуты." msgid "Missing resource in URI" msgstr "Отсутствует resource в URI" msgid "Missing scheme in URI" msgstr "Отсутствует scheme в URI" msgid "Missing value string" msgstr "Отсутствует строка значения" msgid "Missing x-dimension in media-size." msgstr "Отсутствует x-dimension в media-size." msgid "Missing y-dimension in media-size." msgstr "Отсутствует y-dimension в media-size." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgid "Modifiers:" msgstr "Управление:" msgid "Modify Class" msgstr "Изменить группу" msgid "Modify Printer" msgstr "Изменить принтер" msgid "Move All Jobs" msgstr "Переместить все задания" msgid "Move Job" msgstr "Переместить задание" msgid "Moved Permanently" msgstr "Перемещено окончательно" msgid "NULL PPD file pointer" msgstr "Указатель PPD-файла установлен на NULL" msgid "Name OID uses indefinite length" msgstr "Для имени OID длина не установлена" msgid "Nested classes are not allowed." msgstr "Вложенные группы не допускаются." msgid "Never" msgstr "Никогда" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "Нет" msgid "No Content" msgstr "Нет содержимого" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "Нет имени PPD" msgid "No VarBind SEQUENCE" msgstr "Нет последовательности VarBind" msgid "No active connection" msgstr "Нет рабочего подключения" msgid "No active connection." msgstr "Нет рабочего подключения." #, c-format msgid "No active jobs on %s." msgstr "Нет активных заданий на %s" msgid "No attributes in request." msgstr "Нет атрибутов в запросе." msgid "No authentication information provided." msgstr "Нет информации для проверки подлинности." msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Нет имени сообщества" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "Нет принтера по умолчанию." msgid "No destinations added." msgstr "Нет добавленных назначений." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "Не обнаружено URI устройства в argv[0] или в переменной окружения DEVICE_URI" msgid "No error-index" msgstr "Нет значения error-index" msgid "No error-status" msgstr "Нет значения error-status" msgid "No file in print request." msgstr "Нет файла в запросе на печать." msgid "No modification time" msgstr "Не указано время изменения" msgid "No name OID" msgstr "Нет имени OID" msgid "No pages were found." msgstr "Страницы не были найдены." msgid "No printer name" msgstr "Нет имени принтера" msgid "No printer-uri found" msgstr "Не указан адрес printer-uri" msgid "No printer-uri found for class" msgstr "Не указан адрес printer-uri для группы" msgid "No printer-uri in request." msgstr "Нет адреса printer-uri в запросе." msgid "No request URI." msgstr "Нет запроса URI." msgid "No request protocol version." msgstr "Нет запроса версии протокола." msgid "No request sent." msgstr "Не отправлен запрос." msgid "No request-id" msgstr "Нет идентификатора request-id" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "Нет атрибутов подписки в запросе." msgid "No subscriptions found." msgstr "Подписки не найдены." msgid "No variable-bindings SEQUENCE" msgstr "Нет последовательности variable-bindings" msgid "No version number" msgstr "Нет номера версии" msgid "Non-continuous (Mark sensing)" msgstr "С прерыванием (Mark sensing)" msgid "Non-continuous (Web sensing)" msgstr "С прерыванием (Web sensing)" msgid "None" msgstr "" msgid "Normal" msgstr "Нормальный" msgid "Not Found" msgstr "Не найден" msgid "Not Implemented" msgstr "Не реализовано" msgid "Not Installed" msgstr "Не установлено" msgid "Not Modified" msgstr "Не изменено" msgid "Not Supported" msgstr "Не поддерживается" msgid "Not allowed to print." msgstr "Не разрешено печатать." msgid "Note" msgstr "Примечание" msgid "OK" msgstr "ОК" msgid "Off (1-Sided)" msgstr "Выкл. (1-сторонняя печать)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Интернет справка" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "Не удалось открыть %s: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup без предыдущего CloseGroup" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI без предыдущего CloseUI/JCLCloseUI" msgid "Operation Policy" msgstr "Политика операций" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "Параметр \"%s\" не может быть добавлен через %%%%IncludeFeature." msgid "Options Installed" msgstr "Доп.устройства" msgid "Options:" msgstr "Параметры:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "Устаревший файл кеша PPD" msgid "Out of memory." msgstr "Недостаточно памяти." msgid "Output Mode" msgstr "Режим вывода" msgid "PCL Laser Printer" msgstr "Лазерный принтер PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "" msgid "PRC32K Oversize" msgstr "" msgid "PRC32K Oversize Long Edge" msgstr "" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "В пакете нет Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Нет индикатора SEQUENCE в начале пакета" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Пароль для %s на %s? " msgid "Pause Class" msgstr "Приостановить группу" msgid "Pause Printer" msgstr "Приостановить принтер" msgid "Peel-Off" msgstr "Съемный слой" msgid "Photo" msgstr "Фото" msgid "Photo Labels" msgstr "Фотоэтикетки" msgid "Plain Paper" msgstr "Обычная бумага" msgid "Policies" msgstr "Политики" msgid "Port Monitor" msgstr "Мониторинг порта" msgid "PostScript Printer" msgstr "Принтер PostScript" msgid "Postcard" msgstr "Открытка" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "Открытка двойная Long Edge" msgid "Postcard Long Edge" msgstr "Открытка Long Edge" msgid "Preparing to print." msgstr "Подготовка к печати." msgid "Print Density" msgstr "Плотность печати" msgid "Print Job:" msgstr "Задание печати:" msgid "Print Mode" msgstr "Режим печати" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "Скорость печати" msgid "Print Self-Test Page" msgstr "Напечатать пробную страницу" msgid "Print Speed" msgstr "Скорость печати" msgid "Print Test Page" msgstr "Напечатать пробную страницу" msgid "Print and Cut" msgstr "Напечатать и обрезать" msgid "Print and Tear" msgstr "Напечатать и оборвать" msgid "Print file sent." msgstr "Файл печати отправлен." msgid "Print job canceled at printer." msgstr "Задание отменено на принтере." msgid "Print job too large." msgstr "Задание слишком большое." msgid "Print job was not accepted." msgstr "Задание не принято." #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "Принтер добавлен" msgid "Printer Default" msgstr "Принтер выбран по умолчанию" msgid "Printer Deleted" msgstr "Принтер удален" msgid "Printer Modified" msgstr "Принтер изменен" msgid "Printer Paused" msgstr "Принтер приостановлен" msgid "Printer Settings" msgstr "Параметры принтера" msgid "Printer cannot print supplied content." msgstr "Принтер не может распечатать содержимое." msgid "Printer cannot print with supplied options." msgstr "Принтер не может печатать с данными параметрами." msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Принтер:" msgid "Printers" msgstr "Принтеры" #, c-format msgid "Printing page %d, %u%% complete." msgstr "Печать страницы %d, %u%% завершена." msgid "Punch" msgstr "" msgid "Quarto" msgstr "Кватро" msgid "Quota limit reached." msgstr "Предел квоты достигнут." msgid "Rank Owner Job File(s) Total Size" msgstr "" "Ранг Владелец Задание Файл(ы) Общий размер" msgid "Reject Jobs" msgstr "Отклонить задания" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "Удаленный хост не принял контрольный файл (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "Удаленный хост не принял файл данных (%d)." msgid "Reprint After Error" msgstr "Повторить печать после ошибки" msgid "Request Entity Too Large" msgstr "Слишком большое содержимое запроса" msgid "Resolution" msgstr "Разрешение" msgid "Resume Class" msgstr "Возобновить работу группы" msgid "Resume Printer" msgstr "Возобновить работу принтера" msgid "Return Address" msgstr "Обратный адрес" msgid "Rewind" msgstr "Вернуться в начало" msgid "SEQUENCE uses indefinite length" msgstr "Для SEQUENCE длина не установлена" msgid "SSL/TLS Negotiation Error" msgstr "SSL/TLS Negotiation Error" msgid "See Other" msgstr "Посмотреть другие" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "Отправка данных на принтер." msgid "Server Restarted" msgstr "Сервер перезагружен" msgid "Server Security Auditing" msgstr "Проверка безопасности сервера" msgid "Server Started" msgstr "Сервер загружен" msgid "Server Stopped" msgstr "Сервер остановлен" msgid "Server credentials not set." msgstr "Учетные данные сервера не заданы." msgid "Service Unavailable" msgstr "Служба недоступна" msgid "Set Allowed Users" msgstr "Указать допущенных пользователей" msgid "Set As Server Default" msgstr "Использовать данный сервер по умолчанию" msgid "Set Class Options" msgstr "Настроить параметры группы" msgid "Set Printer Options" msgstr "Настроить параметры принтера" msgid "Set Publishing" msgstr "Настроить публикацию" msgid "Shipping Address" msgstr "Адрес доставки" msgid "Short-Edge (Landscape)" msgstr "По короткой стороне (альбомная)" msgid "Special Paper" msgstr "Особая бумага" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Постановка в очередь, %.0f%% завершено." msgid "Standard" msgstr "Стандартный" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Стартовый баннер" #, c-format msgid "Starting page %d." msgstr "Главная страница %d." msgid "Statement" msgstr "Оператор" #, c-format msgid "Subscription #%d does not exist." msgstr "Подписка #%d не существует." msgid "Substitutions:" msgstr "Замещения:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Протоколы переключения" msgid "Tabloid" msgstr "Tabloid" msgid "Tabloid Oversize" msgstr "" msgid "Tabloid Oversize Long Edge" msgstr "" msgid "Tear" msgstr "Оборвать" msgid "Tear-Off" msgstr "Место отрыва" msgid "Tear-Off Adjust Position" msgstr "Откорректировать положение места отрыва" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "Атрибут \"%s\" требуется для печати задания." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "Атрибут %s не может быть использован с job-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "Атрибут '%s' не может быть подставлен в запрос Create-Job" #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "Не удается найти PPD-файл \"%s\"." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "Не удалось открыть PPD-файл \"%s\": %s" msgid "The PPD file could not be opened." msgstr "Не удалось открыть PPD-файл." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "Имя группы может содержать максимально 127 печатных символов и не может " "содержать пробелы, дроби (/) или знак \"решетки\" (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "Атрибут notify-lease-duration не может использоваться с подписками на " "задание." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "Значение notify-user-data слишком большое(%d > 63 октета)" msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "Неправильная конфигурация принтера, или принтер больше не доступен." msgid "The printer did not respond." msgstr "Принтер не отвечает." msgid "The printer is in use." msgstr "Принтер используется." msgid "The printer is not connected." msgstr "Принтер не подключен." msgid "The printer is not responding." msgstr "Принтер не отвечает." msgid "The printer is now connected." msgstr "Принтер подключен." msgid "The printer is now online." msgstr "Принтер подключен." msgid "The printer is offline." msgstr "Принтер выключен." msgid "The printer is unreachable at this time." msgstr "В настоящее время принтер недоступен." msgid "The printer may not exist or is unavailable at this time." 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 "" msgid "The printer or class does not exist." msgstr "Принтер или группа не существует." msgid "The printer or class is not shared." msgstr "Принтер или группа без совместного доступа." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "printer-uri \"%s\" содержит недопустимые символы." msgid "The printer-uri attribute is required." msgstr "Для printer-uri требуется атрибут." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "printer-uri должен иметь форму «ipp://HOSTNAME/classes/CLASSNAME»." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "printer-uri должен иметь форму «ipp://HOSTNAME/printers/PRINTERNAME»." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "Web интерфейс сейчас отключен. Выполните \"cupsctl WebInterface=yes\" для " "включения." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "Значение \"%s\" для which-jobs не поддерживается." msgid "There are too many subscriptions." msgstr "Слишком много подписок." msgid "There was an unrecoverable USB error." msgstr "Обнаружена ошибка USB." msgid "Thermal Transfer Media" msgstr "Носитель для печати методом термопереноса" msgid "Too many active jobs." msgstr "Слишком много активных заданий." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Слишком много значений job-sheets (%d>2)" #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Слишком много значений printer-state-reasons (%d > %d)" msgid "Transparency" msgstr "Прозрачность" msgid "Tray" msgstr "Лоток" msgid "Tray 1" msgstr "Лоток 1" msgid "Tray 2" msgstr "Лоток 2" msgid "Tray 3" msgstr "Лоток 3" msgid "Tray 4" msgstr "Лоток 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "Слишком длинный адрес URI" msgid "URI too large" msgstr "Слишком большой адрес URI" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "" msgid "US Letter Oversize" msgstr "" msgid "US Letter Oversize Long Edge" msgstr "" msgid "US Letter Small" msgstr "" msgid "Unable to access cupsd.conf file" msgstr "Не удается получить доступ к файлу \"cupsd.conf\"" msgid "Unable to access help file." msgstr "Не удается получить доступ к файлу помощи." msgid "Unable to add class" msgstr "Не удается добавить группу" msgid "Unable to add document to print job." msgstr "Не удается добавить документ в задание печати." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Не удается добавить задание для назначения \"%s\"" msgid "Unable to add printer" msgstr "Не удается добавить принтер" msgid "Unable to allocate memory for file types." msgstr "Не удается выделить память для типов файлов." msgid "Unable to allocate memory for page info" msgstr "Не удается выделить память для страницы информации" msgid "Unable to allocate memory for pages array" msgstr "Не удается выделить память для страниц" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "Не удается отменить задание печати." msgid "Unable to change printer" msgstr "Не удается изменить принтер" msgid "Unable to change printer-is-shared attribute" msgstr "Не удается изменить атрибут printer-is-shared" msgid "Unable to change server settings" msgstr "Не удается изменить настройки сервера" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "Не удается компилировать mimeMediaType регулярное выражение: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "Не удается компилировать naturalLanguage регулярное выражение: %s." msgid "Unable to configure printer options." msgstr "Не удается настроить параметры принтера." msgid "Unable to connect to host." msgstr "Не удается подключиться к хосту." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "Не удается установить связь с принтером, постановка в очередь на следующем " "принтере в группе." #, c-format msgid "Unable to copy PPD file - %s" msgstr "Не удается копировать PPD-файл - %s" msgid "Unable to copy PPD file." msgstr "Не удается копировать PPD-файл." msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "Не удается создать printer-uri" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "Не удается создать учетные данные сервера." #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "Не удается создать временный файл" msgid "Unable to delete class" msgstr "Не удается удалить группу" msgid "Unable to delete printer" msgstr "Не удается удалить принтер" msgid "Unable to do maintenance command" msgstr "Не удается выполнить команду обслуживания" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "Невозможно редактировать файлы cupsd.conf больше 1 МБ" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "Не удается установить защищенное соединение (неправильная цепочка " "сертификатов)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "Не удается установить защищенное соединение (недействительный сертификат)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "Не удается установить защищенное соединение (сертификат просрочен)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" "Не удается установить защищенное соединение (несовпадение имени хоста)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "Не удается установить защищенное соединение (соединение разорвано удаленной " "стороной.)" msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "Не удается установить защищенное соединение (самоподписанный сертификат)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "Не удается установить защищенное соединение (ненадежный сертификат)." msgid "Unable to establish a secure connection to host." msgstr "Не удается установить защищенное соединение." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "Не удается найти назначение для задания" msgid "Unable to find printer." msgstr "Не удается найти принтер." msgid "Unable to find server credentials." msgstr "Не удается найти учетные данные сервера." msgid "Unable to get backend exit status." msgstr "Не удается получить код завершения от backend." msgid "Unable to get class list" msgstr "Не удается получить список групп" msgid "Unable to get class status" msgstr "Не удается получить статус групп" msgid "Unable to get list of printer drivers" msgstr "Не удается получить список драйверов принтера" msgid "Unable to get printer attributes" msgstr "Не удается получить атрибуты принтера" msgid "Unable to get printer list" msgstr "Не удается получить список принтеров" msgid "Unable to get printer status" msgstr "Не удается получить статус принтера" msgid "Unable to get printer status." msgstr "Не удается получить статус принтера." msgid "Unable to load help index." msgstr "Не удается загрузить содержание справки." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "Принтер \"%s\" не найден" msgid "Unable to locate printer." msgstr "Принтер не найден" msgid "Unable to modify class" msgstr "Не удается изменить группу" msgid "Unable to modify printer" msgstr "Не удается изменить принтер" msgid "Unable to move job" msgstr "Не удается переместить задание" msgid "Unable to move jobs" msgstr "Не удается переместить задания" msgid "Unable to open PPD file" msgstr "Не удается открыть PPD-файл" msgid "Unable to open cupsd.conf file:" msgstr "Не удается открыть файл cupsd.conf:" msgid "Unable to open device file" msgstr "Не удается открыть файл устройства" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "Не удается открыть документ #%d в задании #%d." msgid "Unable to open help file." msgstr "Не удается открыть файл справки." msgid "Unable to open print file" msgstr "Не удается открыть файл печати" msgid "Unable to open raster file" msgstr "Не удается открыть растровый файл" msgid "Unable to print test page" msgstr "Не удается напечатать пробную страницу" msgid "Unable to read print data." msgstr "Не удается считать данные печати." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "Не удается определить printer-uri" msgid "Unable to see in file" msgstr "Не удается увидеть в файле" msgid "Unable to send command to printer driver" msgstr "Не удается отправить команду драйверу принтера" msgid "Unable to send data to printer." msgstr "Не удается отправить данные на принтер." msgid "Unable to set options" msgstr "Не удается настроить параметры" msgid "Unable to set server default" msgstr "Не удается назначить сервер используемым по умолчанию" msgid "Unable to start backend process." msgstr "Не удается запустить фоновый процесс" msgid "Unable to upload cupsd.conf file" msgstr "Не удается загрузить файл cupsd.conf" msgid "Unable to use legacy USB class driver." msgstr "Не удается использовать устаревший драйвер USB." msgid "Unable to write print data" msgstr "Не удается записать данные печати" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "Не удается записать несжатые данные печати: %s" msgid "Unauthorized" msgstr "В доступе отказано" msgid "Units" msgstr "Единицы" msgid "Unknown" msgstr "Неизвестный" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Неизвестный выбор \"%s\" для параметра \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Неизвестное значение \"%s\" параметра шифрования." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Неизвестный порядок файлов \"%s\"." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Символ неизвестного формата \"%c\"." msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "Неизвестное имя размера бумаги." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Неизвестный параметр \"%s\" со значением \"%s\"." #, c-format msgid "Unknown option \"%s\"." msgstr "Неизвестный параметр \"%s\"." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Неизвестный режим печати: \"%s\"." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "Неизвестная политика printer-error-policy \"%s\"." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "Неизвестная политика printer-op-policy \"%s\"." msgid "Unknown request method." msgstr "Неизвестный метод запроса." msgid "Unknown request version." msgstr "Неизвестный запрос версии." msgid "Unknown scheme in URI" msgstr "Неизвестный scheme в URI" msgid "Unknown service name." msgstr "Неизвестное имя сервиса." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Неизвестное значение параметра версии \"%s\"." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Неподдерживаемое значение 'compression' \"%s\"." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Неподдерживаемое значение'document-format' \"%s\"." msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "Неподдерживаемое значение 'job-name'." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Неподдерживаемый набор символов \"%s\"." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Неподдерживаемое сжатие \"%s\"." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "Неподдерживаемый document-format \"%s\"." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "Неподдерживаемый document-format \"%s/%s\"." #, c-format msgid "Unsupported format \"%s\"." msgstr "Неподдерживаемый формат \"%s\"." msgid "Unsupported margins." msgstr "Неподдерживаемые поля." msgid "Unsupported media value." msgstr "Неподдерживаемое значение бумаги." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "" "Неподдерживаемое значение number-up %d, используется значение number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "Неподдерживаемое значение number-up-layout %s, используется значение number-" "up-layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" "Неподдерживаемое значение page-border %s, используется значение page-" "border=none." msgid "Unsupported raster data." msgstr "Неподдерживаемые данные растра." msgid "Unsupported value type" msgstr "Неподдерживаемый тип значения" msgid "Upgrade Required" msgstr "Требуется обновление" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" msgid "Usage: cupsd [options]" msgstr "" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "Использование:\n" " ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: snmp [host-or-ip-address]" msgstr "" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Для значения длина не установлена" msgid "VarBind uses indefinite length" msgstr "Для VarBind длина не установлена" msgid "Version uses indefinite length" msgstr "Для Version длина не установлена" msgid "Waiting for job to complete." msgstr "Ожидание выполнения задания." msgid "Waiting for printer to become available." msgstr "Ожидание доступа к принтеру." msgid "Waiting for printer to finish." msgstr "Ожидание окончания работы принтера." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "Web интерфейс отключен" msgid "Yes" msgstr "Да" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "" "Вы должны получить доступ к этой странице с помощью URL https://%s:%d%s" msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Принтер для печати этикеток ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "прервано" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "отменено" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "завершено" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "Не удалось выполнить cups-deviced." msgid "cups-driverd failed to execute." msgstr "Не удалось выполнить cups-driverd." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: Не удается подключиться к серверу: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: Неизвестный параметр \"%s\"" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: Неизвестный параметр \"-%c\"" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: Пропущено имя файла конфигурации после параметра \"-с\"" msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "cupsd: Пропущено имя файла cups-files.conf после параметра \"-s\"" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" "cupsd: Поддержка запуска \"по запросу\" не включена, запуск в нормальном " "режиме." msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" msgid "cupsd: Unable to get current directory." msgstr "cupsd: Не удается определить текущий каталог" msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: Не удается определить путь до cups-files.conf" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: Неизвестный аргумент \"%s\" - прерывание." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: Неизвестный параметр \"%c\" - прерывание." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: Недопустимый номер документа %d." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: Недопустимый ID задания %d." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: Может быть указано только одно имя файла." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: Не удается получить файл задания - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: Параметр -q несовместим с параметром -v" msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: Параметр -v несовместим с параметром -q" #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "устройство для %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "устройство для %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "Для error-index длина не установлена" msgid "error-status uses indefinite length" msgstr "Для error-status длина не установлена" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "задержано" msgid "help\t\tGet help on commands." msgstr "help\t\tПолучить справку по командам." msgid "idle" msgstr "свободен" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: неправильное регулярное выражение: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: не используйте --and после --or." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: Ожидается key name после %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: Ожидается port range после %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: Ожидается program после %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: Ожидается semi-colon после %s." msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: Отсутствует закрывающая фигурная скобка в замене." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Отсутствует закрывающая скобка." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: Отсутствует выражение перед \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: Отсутствует выражение перед \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: Отсутствует key name после %s." #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "ippfind: Отсутствует открывающая скобка." #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: Отсутствует program после %s." #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: Отсутствует регулярное выражение после %s." #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: Отсутствует semi-colon после %s." msgid "ippfind: Out of memory." msgstr "ippfind: Недостаточно памяти." msgid "ippfind: Too many parenthesis." msgstr "ippfind: Слишком много скобок." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: Не удается просмотреть или определить: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: Не удается выполнить \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: Не удается использовать Bonjour: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: Неизвестная переменная \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "ipptool: Параметры \"-i\" и \"-n\" несовместимы с \"-P\" и \"-X\"." #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: Неправильные секунды для \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "ipptool: Может быть определен лишь один URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: Отсутствует count для \"-n\"." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: Отсутствует имя файла для \"-f\"." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: Отсутствует name=value для \"-d\"." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: Отсутствуют секунды для \"-i\"." msgid "ipptool: URI required before test file." msgstr "ipptool: Необходим URI перед указанием тест-файла." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "Атрибут job-printer-uri отсутствует." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: Имя группы может содержать только печатаемые символы." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin: После параметра '-u' должен быть указан allow/deny:userlist." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: После параметра \"-r\" должно быть указано имя группы." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: После параметра \"-c\" должно быть указано имя группы." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: После параметра \"-D\" должно быть указано описание." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: После параметра \"-v\" должен быть указан URI" msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "После параметра \"-I\" должен(-ны) быть указан(-ы) тип(-ы) файла(-ов)." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: После параметра \"-h\" должно быть указано имя хоста." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: После параметра \"-L\" должно быть указано местоположение." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: После параметра \"-m\" должна быть указана модель." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: После параметра \"-R\" должно быть указано имя." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: После параметра \"-o\" должно быть указано name=value" msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: После параметра \"-p\" должен быть указан принтер." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: После параметра \"-d\" должно быть указано имя принтера." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: После параметра \"-x\" должен быть указан принтер или группа." msgid "lpadmin: No member names were seen." msgstr "lpadmin: Имена пользователей не были найдены." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: Принтер %s уже находится в группе %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: Принтер %s не находится в группе %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: Имя принтера может содержать только печатаемые символы." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Не удается добавить принтер в группу:\n" "\t Необходимо сначала указать имя принтера." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: Не удается подключиться к серверу: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: Не удается создать временный файл" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: Не удается удалить параметр:\n" "\t Необходимо сначала указать имя принтера." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Не удается удалить принтер из группы:\n" "\t Необходимо сначала указать имя принтера." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: Не удается настроить параметры принтера:\n" "\t Необходимо сначала указать имя принтера." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: Неизвестный параметр allow/deny \"%s\"." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: Неизвестный аргумент \"%s\"." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: Неизвестный параметр \"%c\"." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Внимание - список типов содержимого пропущен." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "lpinfo: После \"--device-id\" должна идти строка ID устройства 1284" msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: После \"--language\" необходимо указать язык." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: После \"--make-and-model\" должна быть указана марка и модель." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: После \"--product\" должна идти строка продукта." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo: После \"--exclude-schemes\" должен идти список схем." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo: После \"--include-schemes\" должен идти список схем." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: После \"--timeout\" должно быть указано время ожидания" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: Не удается подключиться к серверу: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: Неизвестный аргумент \"%s\"." msgid "lpoptions: No printers." msgstr "lpoptions: Нет принтеров." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: Не удается добавить принтер или представителя класса: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: Не удается получить PPD-файл для %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: Не удается открыть PPD файл для %s" msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: Неизвестный принтер или группа" #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: ошибка - %s переменная окружения указывает несуществующее " "назначение \"%s\"" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "члены группы %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "нет записей" msgid "no system default destination" msgstr "Нет назначение системы по умолчанию" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "notify-events не указаны." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "notify-recipient-uri URI \"%s\" уже используется." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "notify-recipient-uri URI \"%s\" использует неизвестную схему." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "задержка" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: Добавление каталога \"%s\"." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: Добавление/обновление текста интерфейса из %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: Недопустимое двоичное значение (%s) в строке %d из %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: Недопустимый атрибут шрифта: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: Недопустимое имя разрешения \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: Недопустимое ключевое слово статуса %s в строке %d из %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc: Недопустимая замена переменной ($%c) в строке %d из %s." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" "ppdc: В строке %d из %s обнаружено значение, не привязанное к параметру" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: Дубликат #po для региона %s в строке %d из %s" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть определение фильтра." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть имя программы." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть двоичное значение." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "ppdc: После Font в строке %d из %s должен быть набор символов." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть код выбора." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть имя/текст выбора." #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" "ppdc: После ColorModel в строке %d из %s должна быть указана цветовая схема." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "ppdc: Для ColorModel в строке %d из %s должно быть указано colorspace." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: Для ColorModel в строке %d из %s должно быть указано сжатие." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: Для UIConstraints в строке %d из %s должна быть указана строка " "ограничений." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: После DriverType в строке %d из %s должно быть указано ключевое слово " "типа драйвера." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc: После Duplex в строке %d из %s должен быть указан тип дуплекса." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: После Font в строке %d из %s должна быть указана кодировка." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "После #po %s в строке %d из %s должно быть указано имя файла." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть указанно имя группы/текст." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть указано имя файла." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть целое число." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: После #po в строке %d из %s должен быть указан регион." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: После %s в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: После FileName в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: После Font в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: После Manufacturer в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: После MediaSize в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: После ModelName в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: После PCFileName в строке %d из %s должно быть указано имя." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: После %s в строке %d из %s должно быть указано имя/текст." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" "ppdc: После Installable в строке %d из %s должно быть указано имя/текст." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" "ppdc: После Resolution в строке %d из %s должно быть указано имя/текст." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: После ColorModel в строке %d из %s должно быть указано имя/текст." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть указано имя параметра/текст." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: В строке %d из %s должен быть указан раздел параметров." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: В строке %d из %s должен быть указан тип параметра." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: После Resolution в строке %d из %s должно быть поле переопределения." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: В строке %d из %s должна быть запись в кавычках." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: В строке %d из %s должно быть действительное число." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: После ColorProfile в строке %d из %s должно быть указано разрешение/" "тип носителя." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: После SimpleColorProfile в строке %d из %s должно быть указано " "разрешение/тип носителя." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: После %s в строке %d из %s должен быть selector." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: После Font в строке %d из %s должен быть указан статус." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: В строке %d из %s пропущено значение параметра Copyright." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: В строке %d из %s пропущено значение параметра Version." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: В строке %d из %s должны быть два имени параметра." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: После %s в строке %d из %s должно быть значение." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: После Font в строке %d из %s должна быть указана версия." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: Неверное имя файла #include/#po \"%s\"." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: Затраты на фильтр в строке %d из %s указаны неверно." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc: Недопустимый пустой MIME-тип для фильтра в строке %d из %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "ppdc: Недопустимое пустое имя программы для фильтра в строке %d из %s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: Неверный раздел параметров \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: Неверный тип параметра \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: Загружается файл с информацией о драйвере \"%s\"." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: Загружаю сообщения для региона \"%s\"." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: Загружаю сообщения из \"%s\"." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: Отсутствует #endif в конце \"%s\"." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: Отсутствует #if в строке %d из %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "ppdc: Требуется строка msgid перед строкой перевода в строке %d из %s" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: Не указан каталог сообщений для региона %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "ppdc: Параметр %s определен в двух разных группах в строке %d из %s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "ppdc: Для параметра %s определен другой тип в строке %d из %s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" "ppdc: Для ограничения параметра должно быть указано *name в строке %d из %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: Слишком много вложенных операторов #if в строке %d из %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: Не удается создать PPD-файл \"%s\" - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: Не удается создать каталог для выходных данных %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: Не удается создать конвейеры для выходных данных: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: Не удается выполнить cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: Не удается найти файл #po %s в строке %d из %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "ppdc: Не удается найти файл \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: Не удается найти перевод для \"%s\" - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: Не удается загрузить файл перевода \"%s\" - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: Не удается открыть %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: Не определена переменная (%s) в строке %d из %s." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: Неизвестный текст в %2$s строки %1$d" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: Неизвестный тип драйвера %s в строке %d из %s." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: Неизвестный тип дуплекса \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: Неизвестный размер бумаги \"%s\" в строке %d из %s." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: Неизвестный формат каталога сообщений для \"%s\"" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: Неизвестный маркер \"%s\" в строке %d из %s." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: Неизвестные конечные символы в вещественном числе \"%s\" в строке %d " "из %s." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc: Не завершена строка, начинающаяся с %c в строке %d из %s." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: Внимание - дублирующееся имя \"%s\"." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: Записывается %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: Записываются PPD-файлы в каталог \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: Неверное значение LanguageVersion \"%s\" в %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: Пропускается PPD-файл %s." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: Не удается создать резервную копию %s на %s- %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "принтер %s отключен с момента %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "принтер %s свободен. Включен с момента %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "принтер %s сейчас печатает %s-%d. Включен с момента %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "принтер %s/%s отключен с момента %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "принтер %s/%s свободен. Включен с момента %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "принтер %s/%s сейчас печатает %s-%d. Включен с момента %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "обработка" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "id запроса %s-%d (%d файл.)" msgid "request-id uses indefinite length" msgstr "Для request-id длина не определена" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "планировщик не запущен" msgid "scheduler is running" msgstr "планировщик запущен" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "не удалось установить %s: %s" msgid "status\t\tShow status of daemon and queue." msgstr "статус\t\tпоказать статус демона и очереди" #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "остановлен" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "назначение системы по умолчанию: %s" #, c-format msgid "system default destination: %s/%s" msgstr "назначение системы по умолчанию: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "неизвестный" msgid "untitled" msgstr "новый" msgid "variable-bindings uses indefinite length" msgstr "Для variable-bindings длина не установлена" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "Для экспорта драйверов принтера требуется пароль Samba" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "Для экспорта драйверов принтера требуется имя пользователя Samba" #~ msgid "Export Printers to Samba" #~ msgstr "Экспортировать принтеры в Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: Не удается задать Listen или Port." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: Не удается открыть PPD-файл \"%s\" - %s" cups-2.3.1/locale/Dependencies000664 000765 000024 00000001467 13574721672 016357 0ustar00mikestaff000000 000000 checkpo.o: checkpo.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h po2strings.o: po2strings.c ../cups/cups-private.h \ ../cups/string-private.h ../config.h ../cups/versioning.h \ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \ ../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \ ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h strings2po.o: strings2po.c cups-2.3.1/locale/cups_zh_CN.po000664 000765 000024 00001226631 13574721672 016444 0ustar00mikestaff000000 000000 # # Chinese message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Mingcong Bai , 2016, 2017, 2018. msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2018-10-09 00:21-0500\n" "Last-Translator: Mingcong Bai \n" "Language-Team: Chinese (Simplified)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.9\n" "Plural-Forms: nplurals=1; plural=0;\n" msgid "\t\t(all)" msgstr "\t\t(全部)" msgid "\t\t(none)" msgstr "\t\t(无)" #, c-format msgid "\t%d entries" msgstr "\t%d 个条目" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\t发生错误时:继续" #, c-format msgid "\tAlerts: %s" msgstr "\t警告:%s" msgid "\tBanner required" msgstr "\t需要横幅" msgid "\tCharset sets:" msgstr "\t字符集:" msgid "\tConnection: direct" msgstr "\t连接:直接" msgid "\tConnection: remote" msgstr "\t连接:远程" msgid "\tContent types: any" msgstr "\t内容类型:任意" msgid "\tDefault page size:" msgstr "\t默认页面尺寸:" msgid "\tDefault pitch:" msgstr "\t默认字间距:" msgid "\tDefault port settings:" msgstr "\t默认端口设置:" #, c-format msgid "\tDescription: %s" msgstr "\t描述:%s" msgid "\tForm mounted:" msgstr "\t已挂载表单:" msgid "\tForms allowed:" msgstr "\t已允许表单:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\t界面:%s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\t界面:%s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\t位置:%s" msgid "\tOn fault: no alert" msgstr "\t发生错误时:无警告" msgid "\tPrinter types: unknown" msgstr "\t打印机类型:未知" #, c-format msgid "\tStatus: %s" msgstr "\t状态:%s" msgid "\tUsers allowed:" msgstr "\t允许的用户:" msgid "\tUsers denied:" msgstr "\t拒绝的用户:" msgid "\tdaemon present" msgstr "\t守护程序正在运行" msgid "\tno entries" msgstr "\t无条目" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\t打印机存在于设备“%s”,速度为 -1" msgid "\tprinting is disabled" msgstr "\t已禁用打印" msgid "\tprinting is enabled" msgstr "\t已启用打印" #, c-format msgid "\tqueued for %s" msgstr "\t已为 %s 列队" msgid "\tqueuing is disabled" msgstr "\t已禁用队列" msgid "\tqueuing is enabled" msgstr "\t已启用队列" msgid "\treason unknown" msgstr "\t未知原因" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " 详细兼容性测试结果" msgid " REF: Page 15, section 3.1." msgstr " 引用:第 15 页,章节 3.1。" msgid " REF: Page 15, section 3.2." msgstr " 引用:第 15 页,章节 3.2。" msgid " REF: Page 19, section 3.3." msgstr " 引用:第 19 页,章节 3.3。" msgid " REF: Page 20, section 3.4." msgstr " 引用:第 20 页,章节 3.4。" msgid " REF: Page 27, section 3.5." msgstr " 引用:第 27 页,章节 3.5。" msgid " REF: Page 42, section 5.2." msgstr " 引用:第 42 页,章节 5.2。" msgid " REF: Pages 16-17, section 3.2." msgstr " 引用:第 16-17 页,章节 3.2。" msgid " REF: Pages 42-45, section 5.2." msgstr " 引用:第 42-45 页,章节 5.2。" msgid " REF: Pages 45-46, section 5.2." msgstr " 引用:第 45-46 页,章节 5.2。" msgid " REF: Pages 48-49, section 5.2." msgstr " 引用:第 48-49 页,章节 5.2。" msgid " REF: Pages 52-54, section 5.2." msgstr " 引用:第 52-54 页,章节 5.2。" #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f 字节" #, c-format msgid " PASS Default%s" msgstr " 通过 Default%s" msgid " PASS DefaultImageableArea" msgstr " 通过 DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " 通过 DefaultPaperDimension" msgid " PASS FileVersion" msgstr " 通过 FileVersion" msgid " PASS FormatVersion" msgstr " 通过 FormatVersion" msgid " PASS LanguageEncoding" msgstr " 通过 LanguageEncoding" msgid " PASS LanguageVersion" msgstr " 通过 LanguageVersion" msgid " PASS Manufacturer" msgstr " 通过 Manufacturer" msgid " PASS ModelName" msgstr " 通过 ModelName" msgid " PASS NickName" msgstr " 通过 NickName" msgid " PASS PCFileName" msgstr " 通过 PCFileName" msgid " PASS PSVersion" msgstr " 通过 PSVersion" msgid " PASS PageRegion" msgstr " 通过 PageRegion" msgid " PASS PageSize" msgstr " 通过 PageSize" msgid " PASS Product" msgstr " 通过 Product" msgid " PASS ShortNickName" msgstr " 通过 ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " 警告 %s 没有响应选项。" #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " 警告 %s 和 %s 共享前缀\n" " 引用:第 15 页,章节 3.2。" #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " 警告 Duplex 选项关键词 %s 可能不能正常工作,且应命名为 Duplex。\n" " 引用:第 122 页,章节 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr " 警告 文件中存在 CR,LF 和 CR LF 行末混用。" msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " 警告 PPD 4.3 规范需要 LanguageEncoding。\n" " 引用:第 56-57 页,章节 5.3。" #, c-format msgid " WARN Line %d only contains whitespace." msgstr " 警告 行 %d 仅包含空白。" msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " 警告 PPD 4.3 规范需要 Manufacturer。\n" " 引用:第 58-59 页,章节 5.3。" msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr " 警告 非 Windows PPD 文件应该使用 LF 行末而不是 CR LF。" #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " 警告 过时的 PPD 版本 %.1f。\n" " 引用:第 42 页,章节 5.2。" msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " 警告 PCFileName 超过 8.3 长度,不符合 PPD 规范。\n" " REF:第 61-62 页,章节 5.3。" msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " 警告 PCFileName 应包含特殊文件名。\n" " 引用:第 61-62 页,章节 5.3。" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " 警告 协议包含 PJL 但未设置 JCL 属性。\n" " 引用:第 78-79 页,章节 5.7。" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " 警告 协议包含 PJL 及 BCP;预期 TBCP。\n" " 引用:第 78-79 页,章节 5.7。" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " 警告 PPD 4.3 规范需要 ShortNickName。\n" " 引用:第 64-65 页,章节 5.3。" #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s “%s %s”与“%s %s”冲突\n" " (限制=“%s %s %s %s”)。" #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s 不存在。" #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s 文件“%s”包含错误大小写。" #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s 无效的 %s 选项 %s。\n" " 引用:第 122 页,章节 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr " %1$s 无效的选项 %3$s 的 UTF-8“%2$s”字串翻译,选择 %4$s。" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %1$s 无效的选项 %3$s 的 UTF-8“%2$s”字串翻译。" #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s 无效的 cupsFilter 值“%s”。" #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s 无效的 cupsFilter2 值“%s”。" #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s 无效 cupsICCProfile %s。" #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s 无效的 cupsPreFilter 值“%s”。" #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s 无效 cupsUIConstraints %s:“%s”" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s 无效语言“%s”。" #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s %s 文件“%s”存在无效权限。" #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s %s 拼写错误 — 应为 %s。" #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr " %s 无法同时提供 APScanAppPath 及 APScanAppBundleID。" #, c-format msgid " %s Default choices conflicting." msgstr " %s 默认选择相互冲突。" #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s 空白 cupsUIConstraints %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr " %1$s 选项 %3$s 缺少“%2$s”翻译字串,选择 %4$s。" #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %1$s 选项 %3$s 缺少“%2$s”翻译字串。" #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s 缺少 %s 文件“%s”。" #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s 缺少必须的 PageRegion 选项。\n" " 引用:第 100 页,章节 5.14。" #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s 缺少必须的 PageSize 选项。\n" " 引用:第 99 页,章节 5.14。" #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" " %1$s UIConstraints “*%4$s %5$s *%6$s %7$s”中缺少选择 %2$s %3$s。" #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %1$s cupsUIConstraints %4$s:“%5$s” 中缺少选择 *%2$s %3$s" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s 缺少 cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %1$s UIConstraints “*%3$s %4$s *%5$s %6$s” 中缺少选项 %2$s。" #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %1$s cupsUIConstraints %3$s:“%4$s” 中缺少选项 %2$s" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s 文件中无基础翻译“%s”。" #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s 必须的 %s 未定义空选项。\n" " 引用:第 122 页,章节 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %1$s 已为 %3$s 定义尺寸“%2$s”,但未为 %4$s 定义。" #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s 大小“%s”包含未预期尺寸 (%gx%g)。" #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s 大小“%s”应为“%s”。" #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr " %s 大小“%s”应为 Adobe 标准名称“%s”。" #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s cupsICCProfile %s 包含与 %s 冲突的哈希值。" #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s 导致循环。" #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr " %s cupsUIResolver %s 未列出至少两个不同的选项。" #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **失败** %s 必须为 1284DeviceID\n" " 引用:第 72 页,章节 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **失败** 无效的 Default%s 值 %s\n" " 引用:第 40 页,章节 4.5。" #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **失败** 无效的 DefaultImageableArea 值 %s\n" " 引用:第 102 页,章节 5.15。" #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **失败** 无效的 DefaultPaperDimension 值 %s\n" " 引用:第 103 页,章节 5.15。" #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **失败** 无效的 FileVersion 值“%s”\n" " 引用:第 56 页,章节 5.3。" #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **失败** 无效的 FormatVersion 值“%s”\n" " 引用:第 56 页,章节 5.3。" msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **失败** 文件中包含无效的 JobPatchFile 属性\n" " 引用:第 24 页,章节 3.4。" #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr " **失败** 无效的 LanguageEncoding 值 %s — 值必须为 ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr " **失败** 无效的 LanguageVersion 值 %s — 值必须为 English." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **失败** 无效的 Manufacturer 值(应为“%s”)\n" " 引用:第 211 页,表格 D.1。" #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **失败** 无效的 ModelName 值 — 字串不应包含“%c”。\n" " 引用:第 59-60 页,章节 5.3。" msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **失败** 无效的 PSVersion 值 — 赋值非“(string) int”。\n" " 引用:第 62-64 页,章节 5.3。" msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **失败** 无效的 Product 值 — 赋值非“(string)”。\n" " 引用:第 62 页,章节 5.3。" msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **失败** 无效的 ShortNickName 值 — 长度超过 31 个字符。\n" " 引用:第 64-65 页,章节 5.3。" #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **失败** 无效的选项 %s 选择 %s。\n" " 引用:第 84 页,章节 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr " **失败** 无法解析默认选项代码:%s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr " **失败** 选项 %s 选择 %s 的默认翻译字串包含 8 位字符。" #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr " **失败** 选项 %s 的默认翻译字串包含 8 位字符。" #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr " **失败** 组名 %s 及 %s 仅包含大小写区别。" #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr " **失败** 选项 %s 的选择名称 %s 多次出现。" #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr " **失败** 选项 %s 的选择名称 %s 及 %s 仅包含大小写区别。" #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr " **失败** 选项名称 %s 及 %s 仅包含大小写区别。" #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **失败** 需要 Default%s\n" " 引用:第 40 页,章节 4.5。" msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **失败** 需要 DefaultImageableArea\n" " 引用:第 102 页,章节 5.15。" msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **失败** 需要 DefaultPaperDimension\n" " 引用:第 103 页,章节 5.15。" msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **失败** 需要 FileVersion\n" " 引用:第 56 页,章节 5.3。" msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **失败** 需要 FormatVersion\n" " 引用:第 56 页,章节 5.3。" #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **失败** 需要为 PageSize 值 %s 定义 ImageableArea\n" " 引用:第 41 页,章节 5。\n" " 引用:第 102 页,章节 5.15。" msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **失败** 需要 LanguageEncoding\n" " 引用:第 56-57 页,章节 5.3。" msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **失败** 需要 LanguageVersion\n" " 引用:第 57-58 页,章节 5.3。" msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **失败** 需要 Manufacturer\n" " 引用:第 58-59 页,章节 5.3。" msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **失败** 需要 ModelName\n" " 引用:第 59-60 页,章节 5.3。" msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **失败** 需要 NickName\n" " 引用:第 60 页,章节 5.3。" msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **失败** 需要 PCFileName\n" " 引用:第 61-62 页,章节 5.3。" msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **失败** 需要 PSVersion\n" " 引用:第 62-64 页,章节 5.3。" msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **失败** 需要 PageRegion\n" " 引用:第 100 页,章节 5.14。" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **失败** 需要 PageSize\n" " 引用:第 41 页,章节 5。\n" " 引用:第 99 页,章节 5.14。" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **失败** 需要 PageSize\n" " 引用:第 99-100 页,章节 5.14。" #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **失败** 需要为 PageSize 值 %s 定义 PaperDimension\n" " 引用:第 41 页,章节 5。\n" " 引用:第 103 页,章节 5.15。" msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **失败** 需要 Product\n" " 引用:第 62 页,章节 5.3。" msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **失败** 需要 ShortNickName\n" " 引用:第 64-65 页,章节 5.3。" #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr " **失败** 无法打开 PPD 文件 — 行 %2$d 上的 %1$s。" #, c-format msgid " %d ERRORS FOUND" msgstr " 发现 %d 个错误" msgid " NO ERRORS FOUND" msgstr " 未发现错误" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr 使用 CR 行末 (Mac OS 9)。" msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf 使用 CR + LF 行末 (Windows)。" msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr " --lf 使用 LF 行末(UNIX/Linux/macOS)。" msgid " --list-filters List filters that will be used." msgstr " --list-filters 列出要使用的滤镜。" msgid " -D Remove the input file when finished." msgstr " -D 完成后删除输入文件。" msgid " -D name=value Set named variable to value." msgstr " -D 名称=赋值 为指定变量赋值。" msgid " -I include-dir Add include directory to search path." msgstr " -I include-dir 将引用目录加入到搜索路径。" msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd 设置 PPD 文件。" msgid " -U username Specify username." msgstr " -U 用户名 指定用户名。" msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalog.po 载入指定的消息索引。" msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c cups-files.conf 设置要使用的 cups-files.conf 文件。" msgid " -d output-dir Specify the output directory." msgstr " -d output-dir 指定输出目录。" msgid " -d printer Use the named printer." msgstr " -d 打印机 使用指定的打印机。" msgid " -e Use every filter from the PPD file." msgstr " -e 使用来自 PPD 文件的所有滤镜。" msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr " -i mime/type 设置输入的 MIME 类型(否则自动探测类型)。" msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr " -j job-id[,N] 从指定任务中过滤文件 N(默认为文件 1)。" msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] 指定输出语言(地域配置)。" msgid " -m Use the ModelName value as the filename." msgstr " -m 将 ModelName 值作为文件名。" msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type 设置输出 MIME 类型(缺省为 application/pdf)。" msgid " -n copies Set number of copies." msgstr " -n 副本数 设置副本数量。" msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr " -o filename.drv 指定驱动信息文件(缺省为 ppdi.drv)。" msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr " -o filename.ppd[.gz] 设置输出文件(缺省为标准输出)。" msgid " -o name=value Set option(s)." msgstr " -o 名称=赋值 设置选项。" msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd 指定 PPD 文件。" msgid " -t Test PPDs instead of generating them." msgstr " -t 测试而非生成 PPD 文件。" msgid " -t title Set title." msgstr " -t 标题 设置标题。" msgid " -u Remove the PPD file when finished." msgstr " -u 完成后删除 PPD 文件。" msgid " -v Be verbose." msgstr " -v 开启详细输出。" msgid " -z Compress PPD files using GNU zip." msgstr " -z 使用 GNU zip 压缩 PPD 文件。" msgid " FAIL" msgstr " 失败" msgid " PASS" msgstr " 通过" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "“%s”:无效的 URI 值“%s”— %s(RFC 8011 章节 5.1.6)。" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "“%s”:无效的 URI 值“%s”— 无效长度 %d(RFC 8011 章节 5.1.6)。" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "“%s”:无效的属性名称 — 无效长度 %d(RFC 8011 章节 5.1.4)。" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "“%s”:无效的属性名称 — 无效字符(RFC 8011 章节 5.1.4)。" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "“%s”:无效的布里值 %d(RFC 8011 章节 5.1.21)。" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "“%s”:无效的字符集值“%s”— 无效字符(RFC 8011 章节 5.1.21)。" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "“%s”:无效的字符集值“%s”— 无效长度 %d(RFC 8011 章节 5.1.21)。" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime UTC 小时值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime UTC 分钟值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime UTC 符号值“%c”(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 日期值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 十分之一秒值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 小时值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 分钟值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 月份值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "“%s”:无效的 dateTime 秒值 %u(RFC 8011 章节 5.1.15)。" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "“%s”:无效的枚举值 %d - 超出范围(RFC 8011 章节 5.1.5)。" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "“%s”:无效的关键字值“%s”— 无效长度 %d(RFC 8011 章节 5.1.4)。" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "“%s”:无效的关键字值“%s”— 无效字符(RFC 8011 章节 5.1.4)。" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "“%s”:无效的 mimeMediaType 值“%s”— 无效字符(RFC 8011 章节 5.1.10)。" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" "“%s”:无效的 mimeMediaType 值“%s”— 无效长度 %d(RFC 8011 章节 5.1.10)。" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "“%s”:无效的名称值“%s”— 无效 UTF-8 序列(RFC 8011 章节 5.1.3)。" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "“%s”:无效的名称值“%s”— 无效控制字符(PWG 5100.14 章节 8.1)。" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "“%s”:无效的名称值“%s”— 无效长度 %d(RFC 8011 章节 5.1.3)。" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "“%s”:无效的 naturalLanguage 值“%s”— 无效字符(RFC 8011 章节 5.1.9)。" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" "“%s”:无效的 naturalLanguage 值“%s”— 无效长度 %d(RFC 8011 章节 5.1.9)。" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "“%s”:无效的 octetString 值 — 无效长度 %d(RFC 8011 章节 5.1.20)。" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" "“%s”:无效的 rangeOfInteger 值 %d-%d — 整数下限大于上限(RFC 8011 章节 " "5.1.14)。" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "“%s”:无效的分辨率值 %dx%d%s — 无效单位值(RFC 8011 章节 5.1.16)。" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" "“%s”:无效的分辨率值 %dx%d%s — 横截分辨率必须为正数(RFC 8011 章节 5.1.16)。" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" "“%s”:无效的分辨率值 %dx%d%s — 顺向分辨率必须为正数(RFC 8011 章节 5.1.16)。" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "“%s”:无效的文本值“%s”— 无效 UTF-8 序列(RFC 8011 章节 5.1.2)。" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "“%s”:无效的文本值“%s”— 无效控制字符(PWG 5100.14 章节 8.3)。" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "“%s”:无效的文本值“%s”— 无效长度 %d(RFC 8011 章节 5.1.2)。" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "“%s”:无效的 uriScheme 值“%s”— 无效字符(RFC 8011 章节 5.1.7)。" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "“%s”:无效的 uriScheme 值“%s”— 无效长度 %d(RFC 8011 章节 5.1.7)。" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "“requesting-user-name”属性组不正确。" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "“requesting-user-name”属性组包含错误的语法。" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f 字节" #, c-format msgid "%d x %d mm" msgstr "%d x %d 毫米" #, c-format msgid "%g x %g \"" msgstr "%g x %g \"" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s(无边界)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s(无边界,%s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s(无边界,%s,%s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s 自从 %s 开始接受请求" #, c-format msgid "%s cannot be changed." msgstr "无法更改 %s。" #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s 未在 CUPS 版本的 lpc 中实现。" #, c-format msgid "%s is not ready" msgstr "%s 未就绪" #, c-format msgid "%s is ready" msgstr "%s 就绪" #, c-format msgid "%s is ready and printing" msgstr "%s 就绪且正在打印" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s job-id 用户标题副本选项 [文件]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s 自从 %s 不再接受请求" #, c-format msgid "%s not supported." msgstr "%s 不被支持。" #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s 自从 %s 开始接受请求" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s 自从 %s 不再接受请求" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s:%-33.33s [任务 %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s:%s" #, c-format msgid "%s: %s failed: %s" msgstr "%s:%s 失败:%s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s:无效的打印机 URI“%s”。" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s:用于“-V”的版本 %s 无效。" #, c-format msgid "%s: Don't know what to do." msgstr "%s:不知如何处理。" #, c-format msgid "%s: Error - %s" msgstr "%s:错误 — %s" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "%s:错误 — %s 环境变量指定了不存在的目的地“%s”。" #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s:错误 — 请将“/version=1.1”添加到服务器名称。" #, c-format msgid "%s: Error - bad job ID." msgstr "%s:错误 — 无效的任务 ID。" #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "%s:错误 — 无法在打印文件的同时更改任务。" #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "%s:错误 — 在指定了文件或任务 ID 的情况下不能从标准输入打印。" #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "%s:错误 — 副本数必须为至少 1。" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s:错误 — 在“-S”选项后预期字符集。" #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s:错误 — 在“-T”选项后预期内容类型。" #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s:错误 — 在“-#”选项后预期副本数量。" #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s:错误 — 在“-n”选项后预期副本数量。" #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s:错误 — 在“-P”选项后预期目的地。" #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s:错误 — 在“-d”选项后预期目的地。" #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s:错误 — 在“-f”选项后预期表单。" #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s:错误 — 在“-H”选项后期待保持名称。" #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s:错误 — 在“-H”选项后预期主机名。" #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s:错误 — 在“-h”选项后预期主机名。" #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s:错误 — 在“-y”选项后预期模式列表。" #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s:错误 — 在“-%c”选项后预期名称。" #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s:错误 — 在“-o”选项后预期选项=赋值。" #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s:错误 — 在“-P”选项后预期页码列表。" #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s:错误 — 在“-%c”选项后预期优先级。" #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s:错误 — 在“-r”选项后预期理由文本。" #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s:错误 — 在“-t”选项后预期标题。" #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s:错误 — 在“-U”选项后预期用户名。" #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s:错误 — 在“-u”选项后预期用户名。" #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s:错误 — 在“-%c”选项后预期赋值。" #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "%s:错误 — 在“-W”选项后需要“completed”,“not-completed”或“all”值。" #, c-format msgid "%s: Error - no default destination available." msgstr "%s:错误 — 无可用的默认目的地。" #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s:错误 — 优先级必须在 1 至 100 之间。" #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s:错误 — 调度器无响应。" #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s:错误 — 文件太多 -“%s”。" #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s:错误 — 无法访问“%s”- %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s:错误 — 无法从标准输出列表 — %s。" #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s:错误 — 未知目的地“%s”。" #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s:错误 — 未知目的地“%s/%s”。" #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s:错误 — 未知选项“%c”。" #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s:错误 — 未知选项“%s”。" #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s:在选项“-i”后预期任务 ID。" #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s:列表“%s”中的目的地名称无效。" #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s:无效的滤镜字串“%s”。" #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s:“-P”选项缺少文件名。" #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s:“-T”选项缺少超时。" #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s:“-V”选项缺少版本。" #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s:在指定“-H restart”之前需要任务 ID (\"-i jobid\")。" #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s:没有可以将 %s/%s 转换为 %s/%s 的滤镜。" #, c-format msgid "%s: Operation failed: %s" msgstr "%s:操作失败:%s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s:抱歉,无加密支持。" #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s:无法连接到“%s:%d”:%s" #, c-format msgid "%s: Unable to connect to server." msgstr "%s:无法连接到服务器。" #, c-format msgid "%s: Unable to contact server." msgstr "%s:无法与服务器通信。" #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s:无法创建 PPD 文件:%s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s:无法确定“%s”的 MIME 类型。" #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s:无法打开“%s”:%s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s:无法打开 %s:%s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%1$s:无法打开 PPD 文件:行 %3$d 上的 %2$s。" #, c-format msgid "%s: Unable to query printer: %s" msgstr "%s:无法查询打印机:%s" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s:无法从“%s”或“%s”读取 MIME 数据库。" #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s:无法解析“%s”。" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "%s:未知参数“%s”。" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s:未知目的地“%s”。" #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s:MIME 类型 %s/%s 的目的地未知。" #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s:未知选项“%c”。" #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s:未知选项“%s”。" #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s:未知选项“-%c”。" #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s:未知源 MIME 类型 %s/%s。" #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "%s:警告 — 不支持“%c”格式的修饰符 — 输出可能不正确。" #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s:警告 — 字符集选项被忽略。" #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s:警告 — 内容类型选项被忽略。" #, c-format msgid "%s: Warning - form option ignored." msgstr "%s:警告 — 图标选项被忽略。" #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s:警告 — 模式选项被忽略。" msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "/etc/cups/lpoptions 文件所指定的默认目标不存在。" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 英寸/秒" msgid "1.25x0.25\"" msgstr "1.25×0.25 英寸" msgid "1.25x2.25\"" msgstr "1.25×2.25 英寸" msgid "1.5 inch/sec." msgstr "1.5 英寸/秒" msgid "1.50x0.25\"" msgstr "1.50×0.25 英寸" msgid "1.50x0.50\"" msgstr "1.50×0.50 英寸" msgid "1.50x1.00\"" msgstr "1.50×1.00 英寸" msgid "1.50x2.00\"" msgstr "1.50×2.00 英寸" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 英寸/秒" msgid "10 x 11" msgstr "10×11" msgid "10 x 13" msgstr "10×13" msgid "10 x 14" msgstr "10×14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 毫米/秒" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 英寸/秒" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 英寸/秒" msgid "12 x 11" msgstr "12×11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 毫米/秒" msgid "120x60dpi" msgstr "120×60 dpi" msgid "120x72dpi" msgstr "120×72 dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136 dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 毫米/秒" msgid "15 x 11" msgstr "15×11" msgid "150 mm/sec." msgstr "150 毫米/秒" msgid "150dpi" msgstr "150 dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180 dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 英寸/秒" msgid "2-Sided Printing" msgstr "双面印刷" msgid "2.00x0.37\"" msgstr "2.00×0.37 英寸" msgid "2.00x0.50\"" msgstr "2.00×0.50 英寸" msgid "2.00x1.00\"" msgstr "2.00×1.00 英寸" msgid "2.00x1.25\"" msgstr "2.00×1.25 英寸" msgid "2.00x2.00\"" msgstr "2.00×2.00 英寸" msgid "2.00x3.00\"" msgstr "2.00×3.00 英寸" msgid "2.00x4.00\"" msgstr "2.00×4.00 英寸" msgid "2.00x5.50\"" msgstr "2.00×5.50 英寸" msgid "2.25x0.50\"" msgstr "2.25×0.50 英寸" msgid "2.25x1.25\"" msgstr "2.25×1.25 英寸" msgid "2.25x4.00\"" msgstr "2.25×4.00 英寸" msgid "2.25x5.50\"" msgstr "2.25×5.50 英寸" msgid "2.38x5.50\"" msgstr "2.38×5.50 英寸" msgid "2.5 inches/sec." msgstr "2.5 英寸/秒" msgid "2.50x1.00\"" msgstr "2.50×1.00 英寸" msgid "2.50x2.00\"" msgstr "2.50×2.00 英寸" msgid "2.75x1.25\"" msgstr "2.75×1.25 英寸" msgid "2.9 x 1\"" msgstr "2.9×1 英寸" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 毫米/秒" msgid "200 mm/sec." msgstr "200 毫米/秒" msgid "203dpi" msgstr "203 dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24 针序列" msgid "240x72dpi" msgstr "240×72 dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 毫米/秒" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 英寸/秒" msgid "3 x 5" msgstr "3×5" msgid "3.00x1.00\"" msgstr "3.00×1.00 英寸" msgid "3.00x1.25\"" msgstr "3.00×1.25 英寸" msgid "3.00x2.00\"" msgstr "3.00×2.00 英寸" msgid "3.00x3.00\"" msgstr "3.00×3.00 英寸" msgid "3.00x5.00\"" msgstr "3.00×5.00 英寸" msgid "3.25x2.00\"" msgstr "3.25×2.00 英寸" msgid "3.25x5.00\"" msgstr "3.25×5.00 英寸" msgid "3.25x5.50\"" msgstr "3.25×5.50 英寸" msgid "3.25x5.83\"" msgstr "3.25×5.83 英寸" msgid "3.25x7.83\"" msgstr "3.25×7.83 英寸" msgid "3.5 x 5" msgstr "3.5×5" msgid "3.5\" Disk" msgstr "3.5 英寸磁盘" msgid "3.50x1.00\"" msgstr "3.50×1.00 英寸" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 毫米/秒" msgid "300 mm/sec." msgstr "300 毫米/秒" msgid "300dpi" msgstr "300 dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360 dpi" msgid "360x180dpi" msgstr "360×180 dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 英寸/秒" msgid "4.00x1.00\"" msgstr "4.00×1.00 英寸" msgid "4.00x13.00\"" msgstr "4.00×13.00 英寸" msgid "4.00x2.00\"" msgstr "4.00×2.00 英寸" msgid "4.00x2.50\"" msgstr "4.00×2.50 英寸" msgid "4.00x3.00\"" msgstr "4.00×3.00 英寸" msgid "4.00x4.00\"" msgstr "4.00×4.00 英寸" msgid "4.00x5.00\"" msgstr "4.00×5.00 英寸" msgid "4.00x6.00\"" msgstr "4.00×6.00 英寸" msgid "4.00x6.50\"" msgstr "4.00×6.50 英寸" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 毫米/秒" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 英寸/秒" msgid "5 x 7" msgstr "5×7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 英寸/秒" msgid "6.00x1.00\"" msgstr "6.00×1.00 英寸" msgid "6.00x2.00\"" msgstr "6.00×2.00 英寸" msgid "6.00x3.00\"" msgstr "6.00×3.00 英寸" msgid "6.00x4.00\"" msgstr "6.00×4.00 英寸" msgid "6.00x5.00\"" msgstr "6.00×5.00 英寸" msgid "6.00x6.00\"" msgstr "6.00×6.00 英寸" msgid "6.00x6.50\"" msgstr "6.00×6.50 英寸" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 毫米/秒" msgid "600dpi" msgstr "600 dpi" msgid "60dpi" msgstr "60 dpi" msgid "60x72dpi" msgstr "60×72 dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 英寸/秒" msgid "7 x 9" msgstr "7×9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 英寸/秒" msgid "8 x 10" msgstr "8×10" msgid "8.00x1.00\"" msgstr "8.00×1.00 英寸" msgid "8.00x2.00\"" msgstr "8.00×2.00 英寸" msgid "8.00x3.00\"" msgstr "8.00×3.00 英寸" msgid "8.00x4.00\"" msgstr "8.00×4.00 英寸" msgid "8.00x5.00\"" msgstr "8.00×5.00 英寸" msgid "8.00x6.00\"" msgstr "8.00×6.00 英寸" msgid "8.00x6.50\"" msgstr "8.00×6.50 英寸" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 毫米/秒" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 英寸/秒" msgid "9 x 11" msgstr "9×11" msgid "9 x 12" msgstr "9×12" msgid "9-Pin Series" msgstr "9 针序列" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?无效 未知帮助命令。" #, c-format msgid "A class named \"%s\" already exists." msgstr "已存在名为“%s”的类。" #, c-format msgid "A printer named \"%s\" already exists." msgstr "已存在名为“%s”的打印机。" msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 长边缘" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 长边缘" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 长边缘" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 长边缘" msgid "A3 Oversize" msgstr "A3 超大" msgid "A3 Oversize Long Edge" msgstr "A3 超大长边缘" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 长边缘" msgid "A4 Oversize" msgstr "A4 超大" msgid "A4 Small" msgstr "A4 小型" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 长边缘" msgid "A5 Oversize" msgstr "A5 超大" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 长边缘" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C 长边缘" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D 长边缘" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E 长边缘" msgid "Accept Jobs" msgstr "接受任务" msgid "Accepted" msgstr "已接受" msgid "Add Class" msgstr "添加类" msgid "Add Printer" msgstr "添加打印机" msgid "Address" msgstr "地址" msgid "Administration" msgstr "管理" msgid "Always" msgstr "总是" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "涂药器" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "尝试设置 %s 打印机状态为无效值 %d。" #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "属性“%s”位于错误的组。" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "属性“%s”不是正确的值类型。" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "属性组排序错乱(%x < %x)。" msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "B5 超大" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "无效的“printer-id”值 %d。" #, c-format msgid "Bad '%s' value." msgstr "无效的“%s”值。" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "无效的“document-format”值“%s”。" msgid "Bad CloseUI/JCLCloseUI" msgstr "无效的 CloseUI/JCLCloseUI" msgid "Bad NULL dests pointer" msgstr "无效的 NULL 目标指针" msgid "Bad OpenGroup" msgstr "无效的 OpenGroup 值" msgid "Bad OpenUI/JCLOpenUI" msgstr "无效的 OpenUI/JCLOpenUI 值" msgid "Bad OrderDependency" msgstr "无效的 OrderDependency 值" msgid "Bad PPD cache file." msgstr "无效的 PPD 缓存文件。" msgid "Bad PPD file." msgstr "无效的 PPD 文件。" msgid "Bad Request" msgstr "无效请求" msgid "Bad SNMP version number" msgstr "无效的 SNMP 版本号" msgid "Bad UIConstraints" msgstr "无效的 UIConstraints 值" msgid "Bad URI." msgstr "无效的 URI。" msgid "Bad arguments to function" msgstr "函数的参数无效" #, c-format msgid "Bad copies value %d." msgstr "无效的副本值 %d。" msgid "Bad custom parameter" msgstr "无效的自定义参数" #, c-format msgid "Bad device-uri \"%s\"." msgstr "无效的 device-uri 值“%s”。" #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "无效的 device-uri 方案“%s”。" #, c-format msgid "Bad document-format \"%s\"." msgstr "无效的 document-format 值“%s”。" #, c-format msgid "Bad document-format-default \"%s\"." msgstr "无效的 document-format-default 值“%s”。" msgid "Bad filename buffer" msgstr "无效的文件名缓存" msgid "Bad hostname/address in URI" msgstr "URI 中的主机名/地址无效" #, c-format msgid "Bad job-name value: %s" msgstr "无效的 job-name 值:%s" msgid "Bad job-name value: Wrong type or count." msgstr "无效的 job-name 支持:无效的类型或序号。" msgid "Bad job-priority value." msgstr "无效的 job-priority 值。" #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "无效的 job-sheets 值“%s”。" msgid "Bad job-sheets value type." msgstr "无效的 job-sheets 值类型。" msgid "Bad job-state value." msgstr "无效的 job-state 值。" #, c-format msgid "Bad job-uri \"%s\"." msgstr "无效的 job-uri 值“%s”。" #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "无效的 notify-pull-method 值“%s”。" #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "无效的 notify-recipient-uri 值“%s”。" #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "无效的 notify-user-data “%s”。" #, c-format msgid "Bad number-up value %d." msgstr "无效的 number-up 值 %d。" #, c-format msgid "Bad page-ranges values %d-%d." msgstr "无效的 page-range 值 %d-%d。" msgid "Bad port number in URI" msgstr "URI 中的端口号无效" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "无效的 port-monitor 值“%s”。" #, c-format msgid "Bad printer-state value %d." msgstr "无效的 printer-state 值 %d。" msgid "Bad printer-uri." msgstr "无效的 printer-uri 值。" #, c-format msgid "Bad request ID %d." msgstr "无效的请求 ID %d。" #, c-format msgid "Bad request version number %d.%d." msgstr "无效的请求版本号 %d.%d。" msgid "Bad resource in URI" msgstr "URI 中的资源无效" msgid "Bad scheme in URI" msgstr "URI 中的方案无效" msgid "Bad username in URI" msgstr "URI 中的用户名无效" msgid "Bad value string" msgstr "无效的值字串" msgid "Bad/empty URI" msgstr "无效或空的 URI" msgid "Banners" msgstr "条幅" msgid "Bond Paper" msgstr "证券纸" msgid "Booklet" msgstr "册子" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "waiteof 选项“%s”预期布里值。" msgid "Buffer overflow detected, aborting." msgstr "检测到缓冲区溢出,正在中止。" msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "CPCL 标签打印机" msgid "Cancel Jobs" msgstr "取消任务" msgid "Canceling print job." msgstr "正在取消打印任务" msgid "Cannot change printer-is-shared for remote queues." msgstr "无法为远程队列更改 printer-is-shared 值。" msgid "Cannot share a remote Kerberized printer." msgstr "无法共享远程的通过 Kerberos 授权的打印机。" msgid "Cassette" msgstr "磁带" msgid "Change Settings" msgstr "更改选项" #, c-format msgid "Character set \"%s\" not supported." msgstr "不受支持的字符集“%s”。" msgid "Classes" msgstr "类" msgid "Clean Print Heads" msgstr "清理打印头" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job 指令不支持 job-uri 属性。" msgid "Color" msgstr "彩色" msgid "Color Mode" msgstr "色彩模式" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "命令可能为缩写。可用命令如下:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "社群名称不限长度" msgid "Connected to printer." msgstr "已连接到打印机。" msgid "Connecting to printer." msgstr "正在连接到打印机。" msgid "Continue" msgstr "继续" msgid "Continuous" msgstr "连续" msgid "Control file sent successfully." msgstr "已成功发送控制文件。" msgid "Copying print data." msgstr "正在复制打印数据。" msgid "Created" msgstr "创建时间" msgid "Credentials do not validate against site CA certificate." msgstr "无法与站点 CA 证书验证凭据。" msgid "Credentials have expired." msgstr "凭据已过期。" msgid "Custom" msgstr "自定义" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "剪切" msgid "Cutter" msgstr "车床刀具" msgid "Dark" msgstr "暗色" msgid "Darkness" msgstr "暗度" msgid "Data file sent successfully." msgstr "已成功发送数据文件。" msgid "Deep Color" msgstr "深色" msgid "Deep Gray" msgstr "深灰" msgid "Delete Class" msgstr "删除类" msgid "Delete Printer" msgstr "删除打印机" msgid "DeskJet Series" msgstr "DeskJet 系列" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "目标“%s”不接受任务。" msgid "Device CMYK" msgstr "设备 CMYK" msgid "Device Gray" msgstr "设备灰度" msgid "Device RGB" msgstr "设备 RGB" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "设备:\turi = %s\n" "\tclass = %s\n" "\tinfo = %s\n" "\tmake-and-model = %s\n" "\tdevice-id = %s\n" "\tlocation = %s" msgid "Direct Thermal Media" msgstr "直接热敏介质" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "目录“%s”包含相对路径。" #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "目录“%s”带有不安全的权限许可 (0%o/uid=%d/gid=%d)。" #, c-format msgid "Directory \"%s\" is a file." msgstr "目录“%s”是一个文件。" #, c-format msgid "Directory \"%s\" not available: %s" msgstr "目录“%s”不可用:%s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "目录“%s”的权限许可无问题 (0%o/uid=%d/gid=%d)。" msgid "Disabled" msgstr "已禁用" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "任务 #%2$d 中不包含文档 #%1$d。" msgid "Draft" msgstr "草稿" msgid "Duplexer" msgstr "双工器" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "EPL1 标签打印机" msgid "EPL2 Label Printer" msgstr "EPL2 标签打印机" msgid "Edit Configuration File" msgstr "编辑配置文件" msgid "Encryption is not supported." msgstr "不支持加密。" #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "结尾横幅" msgid "English" msgstr "英语" 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 "" "输入你的用户名和密码或 root 的用户名和密码以访问此页面。如果您正在使用 " "Kerberos 认证,请求确定您拥有有效的 Kerberos 凭据。" msgid "Envelope #10" msgstr "10 号信封" msgid "Envelope #11" msgstr "11 号信封" msgid "Envelope #12" msgstr "12 号信封" msgid "Envelope #14" msgstr "14 号信封" msgid "Envelope #9" msgstr "9 号信封" msgid "Envelope B4" msgstr "B4 信封" msgid "Envelope B5" msgstr "B5 信封" msgid "Envelope B6" msgstr "B6 信封" msgid "Envelope C0" msgstr "C0 信封" msgid "Envelope C1" msgstr "C1 信封" msgid "Envelope C2" msgstr "C2 信封" msgid "Envelope C3" msgstr "C3 信封" msgid "Envelope C4" msgstr "C4 信封" msgid "Envelope C5" msgstr "C5 信封" msgid "Envelope C6" msgstr "C6 信封" msgid "Envelope C65" msgstr "C65 信封" msgid "Envelope C7" msgstr "C7 信封" msgid "Envelope Choukei 3" msgstr "Choukei 3 信封" msgid "Envelope Choukei 3 Long Edge" msgstr "Choukei 3 长边缘信封" msgid "Envelope Choukei 4" msgstr "Choukei 4 信封" msgid "Envelope Choukei 4 Long Edge" msgstr "Choukei 4 长边缘信封" msgid "Envelope DL" msgstr "DL 信封" msgid "Envelope Feed" msgstr "信封喂纸口" msgid "Envelope Invite" msgstr "请柬信封" msgid "Envelope Italian" msgstr "意大利信封" msgid "Envelope Kaku2" msgstr "Kaku2 信封" msgid "Envelope Kaku2 Long Edge" msgstr "Kaku2 长边缘信封" msgid "Envelope Kaku3" msgstr "Kaku3 信封" msgid "Envelope Kaku3 Long Edge" msgstr "Kaku2 长边缘信封" msgid "Envelope Monarch" msgstr "君主信封" msgid "Envelope PRC1" msgstr "中国一号信封" msgid "Envelope PRC1 Long Edge" msgstr "中国一号长边缘信封" msgid "Envelope PRC10" msgstr "中国十号信封" msgid "Envelope PRC10 Long Edge" msgstr "中国十号长边缘信封" msgid "Envelope PRC2" msgstr "中国二号信封" msgid "Envelope PRC2 Long Edge" msgstr "中国二号长边缘信封" msgid "Envelope PRC3" msgstr "中国三号信封" msgid "Envelope PRC3 Long Edge" msgstr "中国三号长边缘信封" msgid "Envelope PRC4" msgstr "中国四号信封" msgid "Envelope PRC4 Long Edge" msgstr "中国四号长边缘信封" msgid "Envelope PRC5 Long Edge" msgstr "中国五号长边缘信封" msgid "Envelope PRC5PRC5" msgstr "中国五号信封" msgid "Envelope PRC6" msgstr "中国六号信封" msgid "Envelope PRC6 Long Edge" msgstr "中国六号长边缘信封" msgid "Envelope PRC7" msgstr "中国七号信封" msgid "Envelope PRC7 Long Edge" msgstr "中国七号长边缘信封" msgid "Envelope PRC8" msgstr "中国八号信封" msgid "Envelope PRC8 Long Edge" msgstr "中国八号长边缘信封" msgid "Envelope PRC9" msgstr "中国九号信封" msgid "Envelope PRC9 Long Edge" msgstr "中国九号长边缘信封" msgid "Envelope Personal" msgstr "个人信封" msgid "Envelope You4" msgstr "You4 信封" msgid "Envelope You4 Long Edge" msgstr "You4 长边缘信封" msgid "Environment Variables:" msgstr "环境变量:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "错误策略" msgid "Error reading raster data." msgstr "读取栅格化数据出错。" msgid "Error sending raster data." msgstr "发送栅格化数据出错。" msgid "Error: need hostname after \"-h\" option." msgstr "错误:“-h”选项后需要主机名。" msgid "European Fanfold" msgstr "欧洲折叠页" msgid "European Fanfold Legal" msgstr "欧洲法律用折叠页" msgid "Every 10 Labels" msgstr "每 10 个标签" msgid "Every 2 Labels" msgstr "每 2 个标签" msgid "Every 3 Labels" msgstr "每 3 个标签" msgid "Every 4 Labels" msgstr "每 4 个标签" msgid "Every 5 Labels" msgstr "每 5 个标签" msgid "Every 6 Labels" msgstr "每 6 个标签" msgid "Every 7 Labels" msgstr "每 7 个标签" msgid "Every 8 Labels" msgstr "每 8 个标签" msgid "Every 9 Labels" msgstr "每 9 个标签" msgid "Every Label" msgstr "每个标签" msgid "Executive" msgstr "执行" msgid "Expectation Failed" msgstr "未满足期望" msgid "Expressions:" msgstr "表达式:" msgid "Fast Grayscale" msgstr "快速灰度" #, c-format msgid "File \"%s\" contains a relative path." msgstr "文件“%s”包含相对路径。" #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "文件“%s”带有不安全的权限许可 (0%o/uid=%d/gid=%d)。" #, c-format msgid "File \"%s\" is a directory." msgstr "文件“%s”是一个目录。" #, c-format msgid "File \"%s\" not available: %s" msgstr "文件“%s”不可用:%s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "文件“%s”的权限许可无问题 (0%o/uid=%d/gid=%d)。" msgid "File Folder" msgstr "文件夹" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "已禁用文件设备 URI。要启用此功能,参阅“%s/cups-files.conf”中的 FileDevice 参" "数。" #, c-format msgid "Finished page %d." msgstr "已完成第 %d 页。" msgid "Finishing Preset" msgstr "结尾预设" msgid "Fold" msgstr "折纸" msgid "Folio" msgstr "对开本" msgid "Forbidden" msgstr "已禁止" msgid "Found" msgstr "已发现" msgid "General" msgstr "常规" msgid "Generic" msgstr "通用" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU 使用无限长度" msgid "Glossy Paper" msgstr "光面纸" msgid "Got a printer-uri attribute but no job-id." msgstr "获取到了 printer-uri 属性却未获取到 job-id。" msgid "Grayscale" msgstr "灰度" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "倒挂文件夹" msgid "Hash buffer too small." msgstr "哈希值缓冲区太小。" msgid "Help file not in index." msgstr "帮助文件不在索引中。" msgid "High" msgstr "高" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "带有不兼容值标签的 IPP 1setOf 属性。" msgid "IPP attribute has no name." msgstr "IPP 属性未命名。" msgid "IPP attribute is not a member of the message." msgstr "IPP 属性不是消息成员。" msgid "IPP begCollection value not 0 bytes." msgstr "IPP begCollection 值大小不是 0 字节。" msgid "IPP boolean value not 1 byte." msgstr "IPP 布里值大小不是 1 字节。" msgid "IPP date value not 11 bytes." msgstr "IPP 日期值大小不是 11 字节。" msgid "IPP endCollection value not 0 bytes." msgstr "IPP endCollection 值大小不是 0 字节。" msgid "IPP enum value not 4 bytes." msgstr "IPP enum 值大小不是 4 字节。" msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP 扩展标签大于 0x7FFFFFFF。" msgid "IPP integer value not 4 bytes." msgstr "IPP 整数值大小不是 4 字节。" msgid "IPP language length overflows value." msgstr "IPP 语言长度溢出值限制。" msgid "IPP language length too large." msgstr "IPP 语言长度太长。" msgid "IPP member name is not empty." msgstr "IPP 成员名称非空。" msgid "IPP memberName value is empty." msgstr "IPP memberName 值为空。" msgid "IPP memberName with no attribute." msgstr "IPP memberName 无属性。" msgid "IPP name larger than 32767 bytes." msgstr "IPP 名称大小超过 32767 字节。" msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP nameWithLanguage 值大小小于 4 字节的最小限制。" msgid "IPP octetString length too large." msgstr "IPP octetString 长度过长。" msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP rangeOfInteger 值大小不是 8 字节。" msgid "IPP resolution value not 9 bytes." msgstr "IPP 分辨率值大小不是 9 字节。" msgid "IPP string length overflows value." msgstr "IPP 字串长度超过溢出值限制。" msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP textWithLanguage 值大小小于 4 字节的最小限制。" msgid "IPP value larger than 32767 bytes." msgstr "IPP 值大小超过 32767 字节。" msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "非法控制字符" msgid "Illegal main keyword string" msgstr "非法主关键词字串" msgid "Illegal option keyword string" msgstr "非法选项关键词字串" msgid "Illegal translation string" msgstr "非法翻译字串" msgid "Illegal whitespace character" msgstr "非法空白字符" msgid "Installable Options" msgstr "可安装选项" msgid "Installed" msgstr "已安装" msgid "IntelliBar Label Printer" msgstr "IntelliBar 标签打印机" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "内部服务器错误" msgid "Internal error" msgstr "内部错误" msgid "Internet Postage 2-Part" msgstr "网邮 2 部" msgid "Internet Postage 3-Part" msgstr "网邮 3 部" msgid "Internet Printing Protocol" msgstr "互联网打印协议" msgid "Invalid group tag." msgstr "无效的组标签。" msgid "Invalid media name arguments." msgstr "无效的媒体名称参数。" msgid "Invalid media size." msgstr "无效的媒体大小。" msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "无效的 ppd-name 值。" #, c-format msgid "Invalid printer command \"%s\"." msgstr "无效的打印机命令“%s”。" msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 长边缘" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 长边缘" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 长边缘" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "无法重启任务 #%d — 没有文件。" #, c-format msgid "Job #%d does not exist." msgstr "任务 #%d 不存在。" #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "任务 #%d 已中止 — 无法取消。" #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "任务 #%d 已取消 — 无法取消。" #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "任务 #%d 已完成 — 无法取消。" #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "任务 #%d 已完成且不可更动。" #, c-format msgid "Job #%d is not complete." msgstr "任务 #%d 未完成。" #, c-format msgid "Job #%d is not held for authentication." msgstr "任务 #%d 未被认证扣留。" #, c-format msgid "Job #%d is not held." msgstr "任务 #%d 未被扣留。" msgid "Job Completed" msgstr "任务已完成" msgid "Job Created" msgstr "任务已创建" msgid "Job Options Changed" msgstr "任务选项更动" msgid "Job Stopped" msgstr "任务已停止" msgid "Job is completed and cannot be changed." msgstr "任务已完成且不能更改。" msgid "Job operation failed" msgstr "任务操作失败" msgid "Job state cannot be changed." msgstr "无法更改任务状态。" msgid "Job subscriptions cannot be renewed." msgstr "无法为任务订阅续期。" msgid "Jobs" msgstr "任务" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR 主机或打印机" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "LPDEST 环境变量所指定的默认目标不存在。" msgid "Label Printer" msgstr "标签打印机" msgid "Label Top" msgstr "标签顶部" #, c-format msgid "Language \"%s\" not supported." msgstr "不支持的语言“%s”。" msgid "Large Address" msgstr "大地址" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet 系列 PCL 4/5" msgid "Letter Oversize" msgstr "信函超大" msgid "Letter Oversize Long Edge" msgstr "信函超大长边缘" msgid "Light" msgstr "轻" msgid "Line longer than the maximum allowed (255 characters)" msgstr "行长度超过允许的最大值(255 字符)" msgid "List Available Printers" msgstr "列出可用打印机" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "已创建本地打印机。" msgid "Long-Edge (Portrait)" msgstr "长边缘(竖直)" msgid "Looking for printer." msgstr "正在寻找打印机。" msgid "Manual Feed" msgstr "手动喂纸" msgid "Media Size" msgstr "媒体大小" msgid "Media Source" msgstr "媒体来源" msgid "Media Tracking" msgstr "媒体跟踪" msgid "Media Type" msgstr "媒体类型" msgid "Medium" msgstr "介质" msgid "Memory allocation error" msgstr "内存分配错误" msgid "Missing CloseGroup" msgstr "缺少 CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "缺少 CloseUI/JCLCloseUI" msgid "Missing PPD-Adobe-4.x header" msgstr "缺少 PPD-Adobe-4.x 文件头" msgid "Missing asterisk in column 1" msgstr "列 1 中缺少星号" msgid "Missing document-number attribute." msgstr "缺少 document-number 属性。" msgid "Missing form variable" msgstr "缺少表单变量" msgid "Missing last-document attribute in request." msgstr "请求中缺少 last-document 属性。" msgid "Missing media or media-col." msgstr "缺少 media 或 media-col。" msgid "Missing media-size in media-col." msgstr "media-col 中缺少 media-size。" msgid "Missing notify-subscription-ids attribute." msgstr "缺少 notify-subscription-ids 属性。" msgid "Missing option keyword" msgstr "缺少选项关键词" msgid "Missing requesting-user-name attribute." msgstr "缺少 requesting-user-name 属性。" #, c-format msgid "Missing required attribute \"%s\"." msgstr "缺少必要的属性“%s”。" msgid "Missing required attributes." msgstr "缺少必要的属性。" msgid "Missing resource in URI" msgstr "URI 中缺少资源" msgid "Missing scheme in URI" msgstr "URI 中缺少方案" msgid "Missing value string" msgstr "缺少值字串。" msgid "Missing x-dimension in media-size." msgstr "media-size 中缺少 x-dimension。" msgid "Missing y-dimension in media-size." msgstr "media-size 中缺少 y-dimension。" #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "型号:\tname = %s\n" "\tnatural_language = %s\n" "\tmake-and-model = %s\n" "\tdevice-id = %s" msgid "Modifiers:" msgstr "修饰符:" msgid "Modify Class" msgstr "修改类" msgid "Modify Printer" msgstr "修改打印机" msgid "Move All Jobs" msgstr "移动所有任务" msgid "Move Job" msgstr "移动任务" msgid "Moved Permanently" msgstr "已永久移动" msgid "NULL PPD file pointer" msgstr "PPD 文件指针为 NULL" msgid "Name OID uses indefinite length" msgstr "名称 OID 使用不定长度" msgid "Nested classes are not allowed." msgstr "不允许嵌套类。" msgid "Never" msgstr "从不" msgid "New credentials are not valid for name." msgstr "新凭据不可用于名称。" msgid "New credentials are older than stored credentials." msgstr "新凭据老于已存储的凭据。" msgid "No" msgstr "否" msgid "No Content" msgstr "无内容" msgid "No IPP attributes." msgstr "无 IPP 属性。" msgid "No PPD name" msgstr "无 PPD 名称" msgid "No VarBind SEQUENCE" msgstr "无 VarBind SEQUENCE" msgid "No active connection" msgstr "无活动连接" msgid "No active connection." msgstr "无活动连接。" #, c-format msgid "No active jobs on %s." msgstr "%s 上无活动任务。" msgid "No attributes in request." msgstr "请求中无属性。" msgid "No authentication information provided." msgstr "未提供认证信息。" msgid "No common name specified." msgstr "未指定通用名称。" msgid "No community name" msgstr "无社群名称" msgid "No default destination." msgstr "无默认目标。" msgid "No default printer." msgstr "无默认打印机。" msgid "No destinations added." msgstr "未添加目标。" msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "argv[0] 或 DEVICE_URI 环境变量中无设备 URI。" msgid "No error-index" msgstr "无 error-index" msgid "No error-status" msgstr "无 error-status" msgid "No file in print request." msgstr "打印请求中无文件。" msgid "No modification time" msgstr "无修改时间" msgid "No name OID" msgstr "无名称 OID" msgid "No pages were found." msgstr "未找到页面。" msgid "No printer name" msgstr "无打印机名称" msgid "No printer-uri found" msgstr "未找到 printer-uri" msgid "No printer-uri found for class" msgstr "未找到类的 print-uri" msgid "No printer-uri in request." msgstr "请求中无 printer-uri。" msgid "No request URI." msgstr "无请求 URI。" msgid "No request protocol version." msgstr "无请求协议版本。" msgid "No request sent." msgstr "未发送请求。" msgid "No request-id" msgstr "无 request-id" msgid "No stored credentials, not valid for name." msgstr "无已存储的凭据,不可用于名称。" msgid "No subscription attributes in request." msgstr "请求中无订阅属性。" msgid "No subscriptions found." msgstr "未找到订阅。" msgid "No variable-bindings SEQUENCE" msgstr "无 variable-bindings SEQUENCE" msgid "No version number" msgstr "无版本号" msgid "Non-continuous (Mark sensing)" msgstr "非连续(标记嗅探)" msgid "Non-continuous (Web sensing)" msgstr "非连续(Web 嗅探)" msgid "None" msgstr "无" msgid "Normal" msgstr "一般" msgid "Not Found" msgstr "未找到" msgid "Not Implemented" msgstr "未实现" msgid "Not Installed" msgstr "未安装" msgid "Not Modified" msgstr "未修改" msgid "Not Supported" msgstr "未支持" msgid "Not allowed to print." msgstr "不允许打印。" msgid "Note" msgstr "注释" msgid "OK" msgstr "确定" msgid "Off (1-Sided)" msgstr "关(单面)" msgid "Oki" msgstr "日冲" msgid "Online Help" msgstr "在线帮助" msgid "Only local users can create a local printer." msgstr "本地打印机只能使用本地用户创建。" #, c-format msgid "Open of %s failed: %s" msgstr "打开 %s 失败:%s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup 缺少前置 CloseGroup" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI 缺少前置 CloseUI/JCLCloseUI" msgid "Operation Policy" msgstr "操作策略" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "选项“%s”不能通过 %%%%IncludeFeature 引用。" msgid "Options Installed" msgstr "已安装选项" msgid "Options:" msgstr "选项:" msgid "Other Media" msgstr "其他介质" msgid "Other Tray" msgstr "其他托盘" msgid "Out of date PPD cache file." msgstr "过时的 PPD 缓存文件。" msgid "Out of memory." msgstr "内存耗尽。" msgid "Output Mode" msgstr "输出模式" msgid "PCL Laser Printer" msgstr "PCL 激光打印机" msgid "PRC16K" msgstr "16 开" msgid "PRC16K Long Edge" msgstr "长边缘 16 开" msgid "PRC32K" msgstr "32 开" msgid "PRC32K Long Edge" msgstr "长边缘 32 开" msgid "PRC32K Oversize" msgstr "超大 32 开" msgid "PRC32K Oversize Long Edge" msgstr "超大长边缘 32 开" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "PRINTER 环境变量所指定的默认目标不存在。" msgid "Packet does not contain a Get-Response-PDU" msgstr "包裹中未包含 Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "包裹未使用 SEQUENCE 开头" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "请输入 %2$s 上 %1$s 的密码 " msgid "Pause Class" msgstr "暂停类" msgid "Pause Printer" msgstr "暂停打印机" msgid "Peel-Off" msgstr "剥片" msgid "Photo" msgstr "照片" msgid "Photo Labels" msgstr "照片标签" msgid "Plain Paper" msgstr "普通纸" msgid "Policies" msgstr "策略" msgid "Port Monitor" msgstr "端口监视器" msgid "PostScript Printer" msgstr "PostScript 打印机" msgid "Postcard" msgstr "明信片" msgid "Postcard Double" msgstr "双面明信片" msgid "Postcard Double Long Edge" msgstr "超长边缘双面明信片" msgid "Postcard Long Edge" msgstr "超长边缘明信片" msgid "Preparing to print." msgstr "正在准备打印。" msgid "Print Density" msgstr "打印密度" msgid "Print Job:" msgstr "打印任务:" msgid "Print Mode" msgstr "打印模式" msgid "Print Quality" msgstr "打印质量" msgid "Print Rate" msgstr "打印频率" msgid "Print Self-Test Page" msgstr "打印自检页" msgid "Print Speed" msgstr "打印速度" msgid "Print Test Page" msgstr "打印测试页" msgid "Print and Cut" msgstr "打印和裁剪" msgid "Print and Tear" msgstr "打印和撕纸" msgid "Print file sent." msgstr "已发送打印文件。" msgid "Print job canceled at printer." msgstr "打印任务在打印机端被取消。" msgid "Print job too large." msgstr "打印任务太大。" msgid "Print job was not accepted." msgstr "打印任务被拒绝。" #, c-format msgid "Printer \"%s\" already exists." msgstr "打印机“%s”已存在。" msgid "Printer Added" msgstr "已添加打印机" msgid "Printer Default" msgstr "打印机默认值" msgid "Printer Deleted" msgstr "已删除打印机" msgid "Printer Modified" msgstr "已编辑打印机" msgid "Printer Paused" msgstr "打印机已暂停" msgid "Printer Settings" msgstr "打印机设置" msgid "Printer cannot print supplied content." msgstr "打印机无法打印所提供的内容。" msgid "Printer cannot print with supplied options." msgstr "打印机无法使用所提供的选项打印。" msgid "Printer does not support required IPP attributes or document formats." msgstr "打印机不支持必要的 IPP 属性或文档格式。" msgid "Printer:" msgstr "打印机:" msgid "Printers" msgstr "打印机" #, c-format msgid "Printing page %d, %u%% complete." msgstr "正在打印第 %d 页,已完成 %u%%。" msgid "Punch" msgstr "冲压" msgid "Quarto" msgstr "四开" msgid "Quota limit reached." msgstr "已达到限额上限。" # Bug report to be opened at upstream: # - Not using Tab for formatting. # - Will mess up on CJK and double-width environments. msgid "Rank Owner Job File(s) Total Size" msgstr "排序 所有者 任务 文件 总大小" msgid "Reject Jobs" msgstr "拒绝任务" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "远程主机未接受控制文件(%d)。" #, c-format msgid "Remote host did not accept data file (%d)." msgstr "远程主机未接受数据文件(%d)。" msgid "Reprint After Error" msgstr "错误后重新打印" msgid "Request Entity Too Large" msgstr "请求的条目过大" msgid "Resolution" msgstr "分辨率" msgid "Resume Class" msgstr "继续类" msgid "Resume Printer" msgstr "继续打印机" msgid "Return Address" msgstr "返回地址" msgid "Rewind" msgstr "回退" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE 使用不定长度" msgid "SSL/TLS Negotiation Error" msgstr "SSL/TLS 协商错误" msgid "See Other" msgstr "查看其他" msgid "See remote printer." msgstr "查看远程打印机。" msgid "Self-signed credentials are blocked." msgstr "禁止使用自签发的凭据。" msgid "Sending data to printer." msgstr "正在向打印机发送数据。" msgid "Server Restarted" msgstr "服务器已重启" msgid "Server Security Auditing" msgstr "服务器安全审计" msgid "Server Started" msgstr "服务器已启动" msgid "Server Stopped" msgstr "服务器已停止" msgid "Server credentials not set." msgstr "未设置服务器凭据。" msgid "Service Unavailable" msgstr "服务不可用" msgid "Set Allowed Users" msgstr "设置允许的用户" msgid "Set As Server Default" msgstr "设置为服务器默认值" msgid "Set Class Options" msgstr "设置类选项" msgid "Set Printer Options" msgstr "设置打印机选项" msgid "Set Publishing" msgstr "设置出版" msgid "Shipping Address" msgstr "邮寄地址" msgid "Short-Edge (Landscape)" msgstr "短边缘(水平)" msgid "Special Paper" msgstr "特殊纸张" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "正在转存任务,已完成 %.0f%%。" msgid "Standard" msgstr "标准" msgid "Staple" msgstr "装订" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "起始横幅" #, c-format msgid "Starting page %d." msgstr "正在开始第 %d 页。" msgid "Statement" msgstr "声明" #, c-format msgid "Subscription #%d does not exist." msgstr "订阅 #%d 不存在。" msgid "Substitutions:" msgstr "替代:" msgid "Super A" msgstr "超大 A" msgid "Super B" msgstr "超大 B" msgid "Super B/A3" msgstr "超大 B/A3" msgid "Switching Protocols" msgstr "正在切换协议" msgid "Tabloid" msgstr "大幅面" msgid "Tabloid Oversize" msgstr "超大幅面" msgid "Tabloid Oversize Long Edge" msgstr "超大幅面长边缘" msgid "Tear" msgstr "撕纸" msgid "Tear-Off" msgstr "撕纸" msgid "Tear-Off Adjust Position" msgstr "调整撕纸位置" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "打印任务必须带有“%s”属性。" #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "属性 %s 不能和 job-id 一同提供。" #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "任务状态属性“%s”不能与任务创建请求一同提供。" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "操作属性“%s”不能与 Create-Job 请求一同提供。" #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "找不到 PPD 文件“%s”。" #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "无法打开 PPD 文件“%s”:%s" msgid "The PPD file could not be opened." msgstr "无法打开 PPD 文件。" msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "类名最多可包含 127 可打印字符,不能包含空格、斜杠(/)或井号(#)。" msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "notify-lease-duration 属性不可用于任务订阅。" #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "notify-user-data 值过大(%d > 63 八位值)。" msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "打印机配置不正确或打印机已不存在。" msgid "The printer did not respond." msgstr "打印机无响应。" msgid "The printer is in use." msgstr "打印机正在使用中。" msgid "The printer is not connected." msgstr "打印机未连接。" msgid "The printer is not responding." msgstr "打印机无响应。" msgid "The printer is now connected." msgstr "打印机已连接。" msgid "The printer is now online." msgstr "打印机在线。" msgid "The printer is offline." msgstr "打印机离线。" msgid "The printer is unreachable at this time." msgstr "打印机暂时无法访问。" msgid "The printer may not exist or is unavailable at this time." 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 "" "打印机名称最多能包含 127 个可打印字符,但不可包含空格,斜杠(/ 或 \\),引号" "(' 或 \"),问号(?)或井号(#)。" msgid "The printer or class does not exist." msgstr "打印机或类不存在。" msgid "The printer or class is not shared." msgstr "打印机或类未共享。" #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "printer-uri“%s”包含无效字符。" msgid "The printer-uri attribute is required." msgstr "必须提供 printer-uri 属性。" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "printer-uri 必须使用如下格式:“ipp://HOSTNAME/classes/CLASSNAME”。" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "printer-uri 必须使用如下格式:“ipp://HOSTNAME/printers/PRINTERNAME”。" msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "网页界面当前被禁用。运行“cupsctl WebInterface=yes”来启用。" #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "不支持的 which-jobs 值“%s”。" msgid "There are too many subscriptions." msgstr "订阅过多。" msgid "There was an unrecoverable USB error." msgstr "遇到了不可恢复的 USB 错误。" msgid "Thermal Transfer Media" msgstr "热敏介质" msgid "Too many active jobs." msgstr "活动任务过多。" #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "job-sheets 值过多(%d > 2)。" #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "printer-state-reasons 值过多(%d > %d)。" msgid "Transparency" msgstr "透明度" msgid "Tray" msgstr "托盘" msgid "Tray 1" msgstr "托盘 1" msgid "Tray 2" msgstr "托盘 2" msgid "Tray 3" msgstr "托盘 3" msgid "Tray 4" msgstr "托盘 4" msgid "Trust on first use is disabled." msgstr "初次使用信任已禁用。" msgid "URI Too Long" msgstr "URI 过长" msgid "URI too large" msgstr "URI 过大" msgid "US Fanfold" msgstr "US 折叠页" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "超大 US Legal" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "长边缘 US Letter" msgid "US Letter Oversize" msgstr "超大 US Letter" msgid "US Letter Oversize Long Edge" msgstr "超大长边缘 US Letter" msgid "US Letter Small" msgstr "小型 US Letter" msgid "Unable to access cupsd.conf file" msgstr "无法访问 cupsd.conf 文件。" msgid "Unable to access help file." msgstr "无法访问帮助文件。" msgid "Unable to add class" msgstr "无法添加类" msgid "Unable to add document to print job." msgstr "无法向打印任务添加文档。" #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "无法向目标“%s”添加任务。" msgid "Unable to add printer" msgstr "无法添加打印机" msgid "Unable to allocate memory for file types." msgstr "无法为文件类型分配内存。" msgid "Unable to allocate memory for page info" msgstr "无法为页面信息分配内存" msgid "Unable to allocate memory for pages array" msgstr "无法为页面组分配内存" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "无法取消打印任务。" msgid "Unable to change printer" msgstr "无法更换打印机" msgid "Unable to change printer-is-shared attribute" msgstr "无法更改 printer-is-shared 属性" msgid "Unable to change server settings" msgstr "无法更改服务器选项" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "无法编译 mimeMediaType 正则表达式:%s。" #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "无法编译 naturalLanguage 正则表达式:%s。" msgid "Unable to configure printer options." msgstr "无法配置打印机选项。" msgid "Unable to connect to host." msgstr "无法连接主机。" msgid "Unable to contact printer, queuing on next printer in class." msgstr "无法联系打印机,已列队于类中的下一台打印机。" #, c-format msgid "Unable to copy PPD file - %s" msgstr "无法复制 PPD 文件 — %s" msgid "Unable to copy PPD file." msgstr "无法复制 PPD 文件。" msgid "Unable to create credentials from array." msgstr "无法从打印组创建服务器凭据。" msgid "Unable to create printer-uri" msgstr "无法创建 printer-uri。" msgid "Unable to create printer." msgstr "无法创建打印机。" msgid "Unable to create server credentials." msgstr "无法创建服务器凭据。" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "无法创建临时文件" msgid "Unable to delete class" msgstr "无法删除类" msgid "Unable to delete printer" msgstr "无法删除打印机" msgid "Unable to do maintenance command" msgstr "无法执行维护命令" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "无法编辑大小超过 1MB 的 cupsd.conf 文件" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "无法建立到主机的安全连接(无效证书链)。" msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "无法建立到主机的安全连接(证书尚未生效)。" msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "无法建立到主机的安全连接(证书已过期)。" msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "无法建立到主机的安全连接(主机名不匹配)。" msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "无法建立到主机的安全连接(对方在回复前断开连接)。" msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "无法建立到主机的安全连接(自签发证书)。" msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "无法建立到主机的安全连接(未信任的证书)。" msgid "Unable to establish a secure connection to host." msgstr "无法建立到主机的安全连接。" #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "找不到任务目的地" msgid "Unable to find printer." msgstr "找不到打印机。" msgid "Unable to find server credentials." msgstr "找不到服务器凭据。" msgid "Unable to get backend exit status." msgstr "无法获取后端退出状态。" msgid "Unable to get class list" msgstr "无法获取类列表" msgid "Unable to get class status" msgstr "无法获取类状态" msgid "Unable to get list of printer drivers" msgstr "无法获取打印机驱动列表" msgid "Unable to get printer attributes" msgstr "无法获取打印机属性" msgid "Unable to get printer list" msgstr "无法获取打印机列表" msgid "Unable to get printer status" msgstr "无法获取打印机状态" msgid "Unable to get printer status." msgstr "无法获取打印机状态。" msgid "Unable to load help index." msgstr "无法载入帮助索引。" #, c-format msgid "Unable to locate printer \"%s\"." msgstr "无法定位打印机“%s”。" msgid "Unable to locate printer." msgstr "无法定位打印机。" msgid "Unable to modify class" msgstr "无法编辑类" msgid "Unable to modify printer" msgstr "无法编辑打印机" msgid "Unable to move job" msgstr "无法移动任务" msgid "Unable to move jobs" msgstr "无法移动任务" msgid "Unable to open PPD file" msgstr "无法打开 PPD 文件" msgid "Unable to open cupsd.conf file:" msgstr "无法打开 cupsd.conf 文件:" msgid "Unable to open device file" msgstr "无法打开设备文件" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "无法打开任务 #%2$d 中的文档 #%1$d。" msgid "Unable to open help file." msgstr "无法打开帮助文件。" msgid "Unable to open print file" msgstr "无法打开打印文件" msgid "Unable to open raster file" msgstr "无法打开栅格文件" msgid "Unable to print test page" msgstr "无法打印测试页" msgid "Unable to read print data." msgstr "无法读取打印数据。" #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "无法重命名任务文档。" msgid "Unable to resolve printer-uri." msgstr "无法解析 printer-uri。" # "Unable to read file" perhaps? msgid "Unable to see in file" msgstr "无法读取文件" msgid "Unable to send command to printer driver" msgstr "无法向打印机驱动发送命令" msgid "Unable to send data to printer." msgstr "无法向打印机发送数据。" msgid "Unable to set options" msgstr "无法设置选项" msgid "Unable to set server default" msgstr "无法设置服务器默认值" msgid "Unable to start backend process." msgstr "无法启动后端进程。" msgid "Unable to upload cupsd.conf file" msgstr "无法上传 cupsd.conf 文件" msgid "Unable to use legacy USB class driver." msgstr "无法使用老式 USB 类驱动。" msgid "Unable to write print data" msgstr "无法写入打印数据" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "无法写入已解包的打印数据:%s" msgid "Unauthorized" msgstr "未认证" msgid "Units" msgstr "单元" msgid "Unknown" msgstr "未知" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "选项“%2$s”带有未知选择“%1$s”。" #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "未知加密选项值:“%s”。" #, c-format msgid "Unknown file order: \"%s\"." msgstr "未知文件排序:“%s”。" #, c-format msgid "Unknown format character: \"%c\"." msgstr "未知格式字符:“%c”。" msgid "Unknown hash algorithm." msgstr "未知哈希值算法。" msgid "Unknown media size name." msgstr "未知介质尺寸名。" #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "带有值“%2$s”的未知选项“%1$s”。" #, c-format msgid "Unknown option \"%s\"." msgstr "未知选项“%s”。" #, c-format msgid "Unknown print mode: \"%s\"." msgstr "未知打印模式:“%s”。" #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "未知 printer-error-policy“%s”。" #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "未知 printer-op-policy“%s”。" msgid "Unknown request method." msgstr "未知请求方式。" msgid "Unknown request version." msgstr "未知请求版本。" msgid "Unknown scheme in URI" msgstr "URI 中含有未知方案" msgid "Unknown service name." msgstr "未知服务名称。" #, c-format msgid "Unknown version option value: \"%s\"." msgstr "未知版本选项值:“%s”。" #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "不支持的“compression”值“%s”。" #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "不支持的“document-format”值“%s”。" msgid "Unsupported 'job-hold-until' value." msgstr "不支持的“job-hold-until”值。" msgid "Unsupported 'job-name' value." msgstr "不支持的“job-name”值。" #, c-format msgid "Unsupported character set \"%s\"." msgstr "不支持的字符集“%s”。" #, c-format msgid "Unsupported compression \"%s\"." msgstr "不支持的压缩算法“%s”。" #, c-format msgid "Unsupported document-format \"%s\"." msgstr "不支持的 document-format“%s”。" #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "不支持的 document-format“%s/%s”。" #, c-format msgid "Unsupported format \"%s\"." msgstr "不支持的格式“%s”。" msgid "Unsupported margins." msgstr "不支持的边界。" msgid "Unsupported media value." msgstr "不支持的介质值。" #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "不支持的 number-up 值 %d,将使用 number-up=1。" #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "不支持的 number-up-layout 值 %s,将使用 number-up-layout=lrtb。" #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "不支持的 page-border 值 %s,将使用 page-border=none。" msgid "Unsupported raster data." msgstr "不支持的栅格化数据。" msgid "Unsupported value type" msgstr "不支持的值类型" msgid "Upgrade Required" msgstr "需要升级" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "用法:%s job-id user title copies options [file]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "用法:cupsctl [options] [param=value ... paramN=valueN]" msgid "Usage: cupsd [options]" msgstr "用法:cupsd [options]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "用法:cupsfilter [ options ] [ -- ] filename" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "用法:\tippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " \tippfind [options] name[.regtype[.domain.]] ... [expression]\n" " \tippfind --help\n" " \tippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "用法:ipptool [options] URI filename [ ... filenameN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "用法:ppdc [options] filename.drv [ ... filenameN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "用法:ppdhtml [options] filename.drv >filename.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "用法:ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "用法:ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "用法:ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "用法:snmp [host-or-ip-address]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Value 使用不定长度" msgid "VarBind uses indefinite length" msgstr "VarBind 使用不定长度" msgid "Version uses indefinite length" msgstr "Version 使用不定长度" msgid "Waiting for job to complete." msgstr "正在等待任务完成。" msgid "Waiting for printer to become available." msgstr "正在等待打印机变得可用。" msgid "Waiting for printer to finish." msgstr "正在等待打印机完成任务。" msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "网页界面被禁用" msgid "Yes" msgstr "是" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "你必须通过此 URL 访问此页面:https://%s:%d%s" msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "ZPL 标签打印机" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "已中止" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "已取消" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "已完成" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "无法执行 cups-deviced。" msgid "cups-driverd failed to execute." msgstr "无法执行 cups-driverd。" #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl:无法连接服务器:%s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl:未知选项“%s”" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl:未知选项“-%c”" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd:“-c”选项后预期配置文件名。" msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "cupsd:“-s”选项后预期 cups-files.conf 文件名。" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "cupsd:未编译按需 (on-demand) 支持,使用一般模式运行。" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd:不允许相对 cups-files.conf 文件名。" msgid "cupsd: Unable to get current directory." msgstr "cupsd:无法获取当前目录。" msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd:无法获取 cups-files.conf 文件的路径。" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd:未知参数“%s”- 已中止。" #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd:未知选项“%c”- 已中止。" #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter:无效文档数 %d。" #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter:无效任务 ID %d。" msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter:只能指定一个文件名。" #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter:无法获取任务文件 — %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd:不能同时使用 -q 和 -v 选项。" msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd:不能同时使用 -v 和 -q 选项。" #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "用于 %s/%s 的设备:%s" #, c-format msgid "device for %s: %s" msgstr "用于 %s 的设备:%s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index 使用不定长度" msgid "error-status uses indefinite length" msgstr "error-status 使用不定长度" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "保持" msgid "help\t\tGet help on commands." msgstr "帮助\t\t获取关于命令的帮助。" msgid "idle" msgstr "空闲" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind:无效的正则表达式:%s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind:不能在 --or 后使用 --and。" #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind:在 %s 后预期键名。" #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind:在 %s 后预期端口范围。" #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind:在 %s 后预期程序。" #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind:在 %s 后预期分号。" msgid "ippfind: Missing close brace in substitution." msgstr "ippfind:替换操作后缺少右花括号。" msgid "ippfind: Missing close parenthesis." msgstr "ippfind:缺少右括号。" msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind:“--and”前缺少表达式。" msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind:“--or”前缺少表达式。" #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind:在 %s 后缺少键名。" #, c-format msgid "ippfind: Missing name after %s." msgstr "ippfind:%s 后缺少名称。" msgid "ippfind: Missing open parenthesis." msgstr "ippfind:缺少左括号。" #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind:在 %s 后缺少程序。" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind:在 %s 后缺少正则表达式。" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind:在 %s 后缺少分号。" msgid "ippfind: Out of memory." msgstr "ippfind:内存不足。" msgid "ippfind: Too many parenthesis." msgstr "ippfind:括号过多。" #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind:无法浏览或解析:%s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind:无法执行“%s”:%s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind:无法使用 Bonjour:%s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind:未知变量“{%s}”。" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "ipptool:“-i”和“-n”不能与“--ippserver”,“-P”和“-X”混用。" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "ipptool:“-i”和“-n”不能与“-P”和“-X”混用。" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "ipptool:无效的 URI “%s”。" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool:“-i”选项后指定的秒数无效。" msgid "ipptool: May only specify a single URI." msgstr "ipptool:只能指定一个 URI。" msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool:“-n”选项后缺少数量。" msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "ipptool:“--ippserver”选项后缺少文件名。" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool:“-f”选项后缺少文件名。" msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool:“-d”选项后缺少 name=value 声明。" msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool:“-i”选项后缺少秒数。" msgid "ipptool: URI required before test file." msgstr "ipptool:测试文件前需要 URI。" #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "缺少 job-printer-uri 属性。" #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin:类名中只能包含可打印字符。" #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "lpadmin:“-%c”选项后预期 PPD。" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin:“-u”选项后预期 allow/deny:userlist 表达式。" msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin:“-r”选项后预期类。" msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin:“-c”选项后预期类名称。" msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin:“-D”选项后预期描述。" msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin:“-v”选项后预期设备 URI。" msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin:“-I”选项后预期文件类型。" msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin:“-h”选项后预期主机名。" msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin:“-L”选项后预期位置。" msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin:“-m”选项后预期型号。" msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin:“-R”选项后预期名称。" msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin:“-o”选项后预期 name=value 表达式。" msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin:“-p”选项后预期打印机。" msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin:“-d”选项后预期打印机名称。" msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin:“-x”选项后预期打印机或类。" msgid "lpadmin: No member names were seen." msgstr "lpadmin:未找到成员名称。" #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin:打印机 %s 已经是类 %s 中的成员。" #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin:打印机 %s 不是类 %s 中的成员。" msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "lpadmin:打印机驱动已被弃用,未来的 CUPS 版本可能破坏其功能性。" msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin:打印机名称中只能包含可打印字符。" msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "lpadmin:原始序列已被弃用,未来的 CUPS 版本可能破坏其功能性。" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "lpadmin:macOS 已不再支持原始序列。" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "lpadmin:由于安全原因,已不再支持 System V 接口脚本。" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin:无法将打印机添加到类:\n" " 你必须先指定打印机名称。" #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin:无法连接到服务器:%s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin:无法创建临时文件" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin:无法删除选项:\n" " 你必须先指定打印机名称。" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "lpadmin:无法打开 PPD“%1$s”:在行 %3$d 中的 %2$s。" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin:无法从类删除打印机:\n" " 你必须先指定打印机名称。" msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin:无法设置打印机选项:\n" " 你必须先指定打印机名称。" #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin:未知允许/拒绝选项“%s”。" #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin:未知参数“%s”。" #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin:未知选项“%c”。" msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "lpadmin:为共享的打印机使用“everywhere”模型。" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin:警告 — 内容类型列表已被忽略。" msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "lpinfo:“--device-id”选项后预期 1284 设备 ID 字串。" msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo:“--language”选项后预期语言。" msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo:“--make-and-model”选项后预期生产商和型号。" msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo:“--product”选项后预期产品。" msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo:“--exclude-schemes”选项后预期方案列表。" msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo:“--include-schemes”选项后预期方案列表。" msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo:“--timeout”选项后预期超时。" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove:无法连接到服务器:%s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove:未知参数“%s”。" msgid "lpoptions: No printers." msgstr "lpoptions:没有打印机。" #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions:无法添加打印机或实例:%s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions:无法为 %s 获取 PPD 文件:%s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions:无法为 %s 打开 PPD 文件。" msgid "lpoptions: Unknown printer or class." msgstr "lpoptions:未知打印机或类。" #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "lpstat:错误 — %s 环境变量指定了不存在的目的地“%s”。" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "类 %s 的成员:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "无条目" msgid "no system default destination" msgstr "无系统默认目标" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "未指定 notify-events。" #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "notify-recipient-uri URI“%s”已被占用。" #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "notify-recipient-uri URI“%s”使用了未知方案。" #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "正在等待" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc:正在添加包含目录“%s”。" #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc:正在从 %s 添加/更新 UI 文本。" #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含无效布里值(%1$s)。" #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc:无效的字体属性:%s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含无效分辨率名称“%1$s”。" #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含无效状态关键词 %1$s。" #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含无效变量替代 %1$c。" #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中找到不带有 Option 的 Choice。" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含重复的为地域 %1$s 提供的 #po。" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期滤镜定义。" #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期程序名。" #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期布里值。" #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Font 声明后预期字符集。" #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期选择代码。" #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期选择名称/文本。" #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 ColorModel 的颜色顺序。" #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 ColorMode 的色彩空间。" #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 ColorMode 的压缩模式。" #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 UIConstraints 的限制字符串。" #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc:共 %2$s 行中的第 %1$d 行中在 DriverType 声明后预期驱动类型关键词。" #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Duplex 声明后预期双工类型。" #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Font 声明后预期编码类型。" #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中在 #po %1$s 声明后预期文件名。" #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期组名称/文本。" #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期引用文件名。" #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期整数。" #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 #po 声明后预期地域值。" #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中在 %1$s 后预期名称。" #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 FileName 声明后预期名称。" #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Font 声明后预期名称。" #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Manufacturer 声明后预期名称。" #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 MediaSize 声明后预期名称。" #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 ModelName 声明后预期名称。" #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 PCFileName 声明后预期名称。" #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中在 %1$s 声明后预期名称/文本。" #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Installable 声明后预期名称/文本。" #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Resolution 声明后预期名称/文本。" #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc:共 %2$s 行中的第 %1$d 行中在 ColorModel 声明后预期名称/文本组合。" #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期选项名称/文本。" #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期选项节。" #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期选项类型。" #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Resolution 声明后预期覆盖项。" #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期引号中的字符串。" #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期实数。" #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc:共 %2$s 行中的第 %1$d 行中在 ColorProfile 声明后预期分辨率/介质类型。" #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc:共 %2$s 行中的第 %1$d 行中在 SimpleColorProfile 声明后预期分辨率/介质类" "型。" #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中在 %1$s 声明后预期选择器。" #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中在 Font 声明后预期状态。" #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 Copyright 声明后的字符串。" #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 Version 声明后的字符串。" #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期两个选项名。" #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中 %1$s 后预期值。" #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中预期 Font 声明后的版本号。" #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc:无效的 #include/#po 文件名“%s”。" #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中滤镜值无效。" #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中滤镜 MIME 类型无效且为空。" #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中滤镜程序名无效且为空。" #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中含有无效选项节“%1$s”。" #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中含有无效选项类型“%1$s”。" #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc:正在载入驱动信息文件“%s”。" #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc:正在载入地域“%s”的消息文本。" #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc:正在从“%s”载入消息文本。" #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc:在“%s”结尾缺少 #endif。" #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中缺少 #if。" #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中,在任何翻译字串前需要 msgid 行。" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc:未给地域 %s 提供消息文本目录。" #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中选项 %1$s 在两个不同的组中被定义。" #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中选项 %1$s 被重定义为另一个类型。" #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中选项制约必须包含 *name 声明。" #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中包含太多嵌套的 #if。" #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc:无法创建 PPD 文件“%s” — %s。" #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc:无法创建输出目录 %s:%s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc:无法创建输出管道:%s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc:无法执行 cupstestppd:%s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中找不到 #po 文件 %1$s。" #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中找不到引用的文件“%1$s”。" #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc:无法为“%s”找到本地化文件 — %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc:无法载入本地化文件“%s” — %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc:无法打开 %s:%s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中含有未定义的变量(%1$s)。" #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc:共 %2$s 行中的第 %1$d 行中含有未预期的文本。" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含未知驱动类型 %1$s。" #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中含有未知双工类型“%1$s”。" #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含未知媒体大小“%1$s”。" #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc:用于“%s”的消息文本目录格式未知。" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中找到未知令牌“%1$s”。" #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中实数“%1$s”后找到未知尾随字符。" #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc:共 %3$s 行中的第 %2$d 行中包含未终止的字符串,开头为 %1$c。" #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc:警告 — 重复的文件名“%s”。" #, c-format msgid "ppdc: Writing %s." msgstr "ppdc:正在写入 %s。" #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc:正在将 PPD 文件写入到路径“%s”。" #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge:在 %2$s 中包含无效的 LanguageVersion“%1$s”。" #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge:正在忽略 PPD 文件 %s。" #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge:无法将 %s 备份至 %s — %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "打印机 %s 从 %s 开始被禁用 -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "打印机 %s 正在保留新任务。从 %s 开始启用" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "打印机 %s 目前空闲。从 %s 开始启用" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "打印机 %s 正在打印 %s-%d。从 %s 开始启用" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "打印机 %s/%s 从 %s 开始被禁用 -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "打印机 %s/%s 目前空闲。从 %s 开始启用" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "打印机 %s/%s 正在打印 %s-%d。从 %s 开始启用" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "正在处理" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "请求 ID 为 %s-%d(%d 个文件)" msgid "request-id uses indefinite length" msgstr "request-id 使用不定长度" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "调度器未运行" msgid "scheduler is running" msgstr "调度器正在运行" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "为 %s 运行 stat 失败:%s" msgid "status\t\tShow status of daemon and queue." msgstr "状态\t\t显示守护程序和队列的状态。" #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "已停止" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "系统默认目标:%s" #, c-format msgid "system default destination: %s/%s" msgstr "系统默认目标:%s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "未知" msgid "untitled" msgstr "无标题" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings 使用不定长度" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "~/.cups/lpoptions 文件所指定的默认目标不存在。" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "需要 Samba 密码以导出打印机驱动" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "需要 Samba 用户名以导出打印机驱动" #~ msgid "Export Printers to Samba" #~ msgstr "将打印机导出到 Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl:无法直接设置 Listen 或 Port 值。" #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin:无法打开 PPD 文件“%s”- %s" cups-2.3.1/locale/cups_fr.po000664 000765 000024 00001122140 13574721672 016040 0ustar00mikestaff000000 000000 # # French message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2012-12-12 11:12+0100\n" "Last-Translator: Stéphane Blondon \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(tous)" msgid "\t\t(none)" msgstr "\t\t(aucun)" #, c-format msgid "\t%d entries" msgstr "" #, c-format msgid "\t%s" msgstr "" msgid "\tAfter fault: continue" msgstr "" #, c-format msgid "\tAlerts: %s" msgstr "" msgid "\tBanner required" msgstr "" msgid "\tCharset sets:" msgstr "" msgid "\tConnection: direct" msgstr "" msgid "\tConnection: remote" msgstr "" msgid "\tContent types: any" msgstr "" msgid "\tDefault page size:" msgstr "" msgid "\tDefault pitch:" msgstr "" msgid "\tDefault port settings:" msgstr "" #, c-format msgid "\tDescription: %s" msgstr "" msgid "\tForm mounted:" msgstr "" msgid "\tForms allowed:" msgstr "" #, c-format msgid "\tInterface: %s.ppd" msgstr "" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "" #, c-format msgid "\tLocation: %s" msgstr "" msgid "\tOn fault: no alert" msgstr "" msgid "\tPrinter types: unknown" msgstr "" #, c-format msgid "\tStatus: %s" msgstr "" msgid "\tUsers allowed:" msgstr "" msgid "\tUsers denied:" msgstr "" msgid "\tdaemon present" msgstr "" msgid "\tno entries" msgstr "" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\timprimante sur le matériel « %s »', vitesse -1" msgid "\tprinting is disabled" msgstr "\tImpression désactivée" msgid "\tprinting is enabled" msgstr "\tImpression activée" #, c-format msgid "\tqueued for %s" msgstr "\tfile d'attente pour %s" msgid "\tqueuing is disabled" msgstr "\tfile désactivée" msgid "\tqueuing is enabled" msgstr "\tfile activée" msgid "\treason unknown" msgstr "\tcause inconnue" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" msgid " REF: Page 15, section 3.1." msgstr " REF: Page 15, section 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Page 15, section 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Page 19, section 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Page 20, section 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Page 27, section 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Page 42, section 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Pages 16-17, section 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Pages 42-45, section 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Pages 45-46, section 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Pages 48-49, section 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Pages 52-54, section 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f octets" #, c-format msgid " PASS Default%s" msgstr "" msgid " PASS DefaultImageableArea" msgstr "" msgid " PASS DefaultPaperDimension" msgstr "" msgid " PASS FileVersion" msgstr "" msgid " PASS FormatVersion" msgstr "" msgid " PASS LanguageEncoding" msgstr "" msgid " PASS LanguageVersion" msgstr "" msgid " PASS Manufacturer" msgstr "" msgid " PASS ModelName" msgstr "" msgid " PASS NickName" msgstr "" msgid " PASS PCFileName" msgstr "" msgid " PASS PSVersion" msgstr "" msgid " PASS PageRegion" msgstr "" msgid " PASS PageSize" msgstr "" msgid " PASS Product" msgstr "" msgid " PASS ShortNickName" msgstr "" #, c-format msgid " WARN %s has no corresponding options." msgstr "" #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" #, c-format msgid " WARN Line %d only contains whitespace." msgstr "" msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s n'existe pas." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr "" #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "" #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsICCProfile %s." msgstr "" #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s Bad language \"%s\"." msgstr "" #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr "" #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr "" #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" #, c-format msgid " %s Default choices conflicting." msgstr "" #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr "" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr "" #, c-format msgid " %s Missing %s file \"%s\"." msgstr "" #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr "" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr "" #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "" #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "" #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr "" #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr "" #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr "" #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" #, c-format msgid " %d ERRORS FOUND" msgstr " %d ERREURS TROUVÉES" msgid " NO ERRORS FOUND" msgstr "" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Fin de ligne avec CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Fin de ligne avec CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr " --lf Fin de ligne avec LF (UNIX/Linux/macOS)." msgid " --list-filters List filters that will be used." msgstr " --list-filters Filtres de liste utilisables." msgid " -D Remove the input file when finished." msgstr "" " -D Suppression du fichier d'entrée une fois terminé." msgid " -D name=value Set named variable to value." msgstr " -D nom=valeur Affecter la variable nom à cette valeur." msgid " -I include-dir Add include directory to search path." msgstr "" " -I rep-inclus Ajouter le répertoire au chemin des recherches." msgid " -P filename.ppd Set PPD file." msgstr " -P fichier.ppd Choisir un fichier PPD." msgid " -U username Specify username." msgstr " -U nom Indiquer le nom d'utilisateur." msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalogue.po Charger le catalogue de messages." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c fichier-cups.conf Utiliser le fichier fichier-cups.conf." msgid " -d output-dir Specify the output directory." msgstr " -d répertoire-sortie Indiquer le répertoire de sortie." msgid " -d printer Use the named printer." msgstr " -d imprimante Utiliser l'imprimante nommée." msgid " -e Use every filter from the PPD file." msgstr " -e Utiliser tous les filtres du fichier PPD." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i mime/type Affecter le type MIME d'entrée (sinon type " "automatique)" msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] Filtrer le fichier N de la tâche indiquée (par " "défaut, c'est le fichier 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr "" " -l lang[,lang,...] Indiquer la(les) langue(s) de sortie (locale)." msgid " -m Use the ModelName value as the filename." msgstr "" msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" msgid " -n copies Set number of copies." msgstr " -n copies Choisir le nombre de copies." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o fichier.drv Affecter le fichier d'infos du pilote (sinon ppdi." "drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o fichier.ppd[.gz] Affecter le fichier de sortie (sinon sortie " "standard)." msgid " -o name=value Set option(s)." msgstr " -o nom=valeur Affecter des option(s)." msgid " -p filename.ppd Set PPD file." msgstr " -p nomFichier.ppd Affecter le fichier PPD." msgid " -t Test PPDs instead of generating them." msgstr " -t Tester les PPDs plutôt que les produire." msgid " -t title Set title." msgstr " -t title Affecter le titre." msgid " -u Remove the PPD file when finished." msgstr " -u Supprimer le fichier PPD, une fois terminé." msgid " -v Be verbose." msgstr " -v Verbeux." msgid " -z Compress PPD files using GNU zip." msgstr " -z Compresser les fichiers PPD avec GNU zip." msgid " FAIL" msgstr " ÉCHEC" msgid " PASS" msgstr "" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f octets" #, c-format msgid "%d x %d mm" msgstr "" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "" #, c-format msgid "%s (%s, %s)" msgstr "" #, c-format msgid "%s (Borderless)" msgstr "%s (Sans bordure)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (Sans bordure, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (Sans bordure, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s accepte des requêtes depuis %s" #, c-format msgid "%s cannot be changed." msgstr "Impossible de modifier « %s »" #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s n'est pas disponible dans la version CUPS de lpc." #, c-format msgid "%s is not ready" msgstr "%s n'est pas prêt" #, c-format msgid "%s is ready" msgstr "%s est prêt" #, c-format msgid "%s is ready and printing" msgstr "%s est prêt et en cours d'impression" #, c-format msgid "%s job-id user title copies options [file]" msgstr "" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s n'accepte plus de requêtes depuis %s" #, c-format msgid "%s not supported." msgstr "%s n'est pas géré." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s accepte des requêtes depuis %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s n'accepte plus de requêtes depuis %s" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s : %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s : %s échec : %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s : mauvaise URI de l'imprimante « %s »." #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s : Mauvaise version %s for « -V »." #, c-format msgid "%s: Don't know what to do." msgstr "%s : ne sait pas quoi faire." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s : erreur - ajouter « /version=1.1 » au nom du serveur." #, c-format msgid "%s: Error - bad job ID." msgstr "%s : erreur - mauvais ID de tâche" #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "%s : erreur - les copies doivent être supérieures ou égales à 1." #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s : erreur - jeu de caractères attendu après l'option « -S »." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s : erreur - type de contenu attendu après l'option « -T »" #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s : erreur - copies attendues après l'option « -# »." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s : erreur - copies attendues après l'option « -n »." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s : erreur - destination attendue après l'option « -P »." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s : erreur - destination attendue après l'option « -d »." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "" #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s : erreur - nom d'hôte attendu après l'option « -H »." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s : erreur - nom d'hôte attendu après l'option « -h »." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s : erreur - nom attendu après l'option « -%c »." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s : erreur - option=valeur attendu après l'option « -o »." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s : erreur - liste de page attendue après l'option « -P »." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s : erreur - priorité attendue après l'option « -%c »." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "" #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s : erreur - titre attendu après l'option « -t »." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s : erreur - nom d'utilisateur attendu après l'option « -U »." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s : erreur - nom d'utilisateur attendu après l'option « -u »." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s : erreur - valeur attendue après l'option « -%c »." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" #, c-format msgid "%s: Error - no default destination available." msgstr "%s : erreur - aucune destination par défaut disponible." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s : erreur - la priorité doit être comprise entre 1 et 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s : erreur - l'ordonnanceur ne répond pas." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s : erreur - trop de fichiers - « %s »." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s : erreur - impossible d'accéder à « %s » - « %s »" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "" #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s : erreur - destination inconnue - « %s »." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s : erreur - destination inconnue - « %s/%s »." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s : erreur - option inconnue - « %c »." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s : erreur - option inconnue - « %s »." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "" #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "" #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s : nom de fichier manquant pour « -P »." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s : délai d'expiration manquant pour « -T »." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s : version manquante pour « -V »." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s : aucun filtre pour convertir %s/%s en %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s : échec de l'opération : %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s : désolé, chiffrement indisponible." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s : impossible de se connecter à « %s/%d » : %s" #, c-format msgid "%s: Unable to connect to server." msgstr "%s : impossible de se connecter au serveur." #, c-format msgid "%s: Unable to contact server." msgstr "%s : impossible de contacter au serveur." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s : impossible de créer le fichier PPD : %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "" #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s : impossible d'ouvrir « %s » : %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s : impossible d'ouvrir %s : %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s : impossible d'ouvrir le fichier PPD : %s sur la ligne %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s : impossible de résoudre « %s »." #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "%s : paramètre inconnu « %s »." #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s : destination inconnue « %s »." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "" #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s : option inconnue « %c »." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s : option inconnue « %s »." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s : option inconnue « -%c »." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "" #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" #, c-format msgid "%s: Warning - character set option ignored." msgstr "" #, c-format msgid "%s: Warning - content type option ignored." msgstr "" #, c-format msgid "%s: Warning - form option ignored." msgstr "" #, c-format msgid "%s: Warning - mode option ignored." msgstr "" msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 po/s" msgid "1.25x0.25\"" msgstr "1,25 x 0,25\"" msgid "1.25x2.25\"" msgstr "1,25 x 2,25\"" msgid "1.5 inch/sec." msgstr "1,5 po/s" msgid "1.50x0.25\"" msgstr "1,50 x 0,25\"" msgid "1.50x0.50\"" msgstr "1,50 x 0,50\"" msgid "1.50x1.00\"" msgstr "1,50 x 1,00\"" msgid "1.50x2.00\"" msgstr "1,50 x 2,00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 po/s" msgid "10 x 11" msgstr "" msgid "10 x 13" msgstr "" msgid "10 x 14" msgstr "" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/s" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 po/s" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 po/s" msgid "12 x 11" msgstr "" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/s" msgid "120x60dpi" msgstr "120 x 60 ppp" msgid "120x72dpi" msgstr "120 x 72 ppp" msgid "13" msgstr "13" msgid "136dpi" msgstr "136 ppp" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/s" msgid "15 x 11" msgstr "" msgid "150 mm/sec." msgstr "150 mm/s" msgid "150dpi" msgstr "150 ppp" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180 ppp" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 po/s" msgid "2-Sided Printing" msgstr "Impression recto-verso" msgid "2.00x0.37\"" msgstr "2,00 x 0,37\"" msgid "2.00x0.50\"" msgstr "2,00 x 0,50\"" msgid "2.00x1.00\"" msgstr "2,00 x 1,00\"" msgid "2.00x1.25\"" msgstr "2,00 x 1,25\"" msgid "2.00x2.00\"" msgstr "2,00 x 2,00\"" msgid "2.00x3.00\"" msgstr "2,00 x 3,00\"" msgid "2.00x4.00\"" msgstr "2,00 x 4,00\"" msgid "2.00x5.50\"" msgstr "2,00 x 5,50\"" msgid "2.25x0.50\"" msgstr "2,25 x 0,50\"" msgid "2.25x1.25\"" msgstr "2,25 x 1,25\"" msgid "2.25x4.00\"" msgstr "2,25 x 4,00\"" msgid "2.25x5.50\"" msgstr "2,25 x 5,50\"" msgid "2.38x5.50\"" msgstr "2,38 x 5,50\"" msgid "2.5 inches/sec." msgstr "2,5 po/s" msgid "2.50x1.00\"" msgstr "2,50 x 1,00\"" msgid "2.50x2.00\"" msgstr "2,50 x 2,00\"" msgid "2.75x1.25\"" msgstr "2,75 x 1,25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/s" msgid "200 mm/sec." msgstr "200 mm/s" msgid "203dpi" msgstr "203 ppp" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "Série 24 broches" msgid "240x72dpi" msgstr "240 x 72 ppp" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/s" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 po/s" msgid "3 x 5" msgstr "" msgid "3.00x1.00\"" msgstr "3,00 x 1,00\"" msgid "3.00x1.25\"" msgstr "3,00 x 1,25\"" msgid "3.00x2.00\"" msgstr "3,00 x 2,00\"" msgid "3.00x3.00\"" msgstr "3,00 x 3,00\"" msgid "3.00x5.00\"" msgstr "3,00 x 5,00\"" msgid "3.25x2.00\"" msgstr "3,25 x 2,00\"" msgid "3.25x5.00\"" msgstr "3,25 x 5,00\"" msgid "3.25x5.50\"" msgstr "3,25 x 5,50\"" msgid "3.25x5.83\"" msgstr "3,25 x 5,83\"" msgid "3.25x7.83\"" msgstr "3,25 x 7,83\"" msgid "3.5 x 5" msgstr "" msgid "3.5\" Disk" msgstr "Disque 3,5\"" msgid "3.50x1.00\"" msgstr "3,50 x 1,00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/s" msgid "300 mm/sec." msgstr "300 mm/s" msgid "300dpi" msgstr "300 ppp" msgid "35" msgstr "35" msgid "360dpi" msgstr "360 ppp" msgid "360x180dpi" msgstr "360 x 180 ppp" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 po/s" msgid "4.00x1.00\"" msgstr "4,00 x 1,00\"" msgid "4.00x13.00\"" msgstr "4,00 x 13,00\"" msgid "4.00x2.00\"" msgstr "4,00 x 2,00\"" msgid "4.00x2.50\"" msgstr "4,00 x 2,50\"" msgid "4.00x3.00\"" msgstr "4,00 x 3,00\"" msgid "4.00x4.00\"" msgstr "4,00 x 4,00\"" msgid "4.00x5.00\"" msgstr "4,00 x 5,00\"" msgid "4.00x6.00\"" msgstr "4,00 x 6,00\"" msgid "4.00x6.50\"" msgstr "4,00 x 6,50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/s" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 po/s" msgid "5 x 7" msgstr "" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 po/s" msgid "6.00x1.00\"" msgstr "6,00 x 1,00\"" msgid "6.00x2.00\"" msgstr "6,00 x 2,00\"" msgid "6.00x3.00\"" msgstr "6,00 x 3,00\"" msgid "6.00x4.00\"" msgstr "6,00 x 4,00\"" msgid "6.00x5.00\"" msgstr "6,00 x 5,00\"" msgid "6.00x6.00\"" msgstr "6,00 x 6,00\"" msgid "6.00x6.50\"" msgstr "6,00 x 6,50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/s" msgid "600dpi" msgstr "600 ppp" msgid "60dpi" msgstr "60 ppp" msgid "60x72dpi" msgstr "" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 po/s" msgid "7 x 9" msgstr "" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 po/s" msgid "8 x 10" msgstr "" msgid "8.00x1.00\"" msgstr "8,00 x 1,00\"" msgid "8.00x2.00\"" msgstr "8,00 x 2,00\"" msgid "8.00x3.00\"" msgstr "8,00 x 3,00\"" msgid "8.00x4.00\"" msgstr "8,00 x 4,00\"" msgid "8.00x5.00\"" msgstr "8,00 x 5,00\"" msgid "8.00x6.00\"" msgstr "8,00 x 6,00\"" msgid "8.00x6.50\"" msgstr "8,00 x 6,50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/s" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 po/s" msgid "9 x 11" msgstr "" msgid "9 x 12" msgstr "" msgid "9-Pin Series" msgstr "Série 9 broches" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "" #, c-format msgid "A class named \"%s\" already exists." msgstr "" #, c-format msgid "A printer named \"%s\" already exists." msgstr "Une imprimante nommée « %s » existe déjà." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 Bord long" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 Bord long" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 Bord long" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 Bord long" msgid "A3 Oversize" msgstr "" msgid "A3 Oversize Long Edge" msgstr "" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 Bord long" msgid "A4 Oversize" msgstr "" msgid "A4 Small" msgstr "" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 Bord long" msgid "A5 Oversize" msgstr "" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 Bord long" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C Bord long" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D Bord long" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E Bord long" msgid "Accept Jobs" msgstr "Accepter les tâches" msgid "Accepted" msgstr "Accepté" msgid "Add Class" msgstr "Ajouter une classe" msgid "Add Printer" msgstr "Ajouter une imprimante" msgid "Address" msgstr "Adresse" msgid "Administration" msgstr "Administration" msgid "Always" msgstr "Toujours" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Applicator" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "" msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Pointeur de dests NULL incorrect" msgid "Bad OpenGroup" msgstr "OpenGroup erroné" msgid "Bad OpenUI/JCLOpenUI" msgstr "OpenUI/JCLOpenUI erroné" msgid "Bad OrderDependency" msgstr "OrderDependency erroné" msgid "Bad PPD cache file." msgstr "" msgid "Bad PPD file." msgstr "Fichier PPD incorrect." msgid "Bad Request" msgstr "Requête incorrecte." msgid "Bad SNMP version number" msgstr "Numéro de version SNMP incorrect" msgid "Bad UIConstraints" msgstr "" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "Paramètres de la fonction incorrects" #, c-format msgid "Bad copies value %d." msgstr "Valeur « %d » incorrecte pour copies." msgid "Bad custom parameter" msgstr "Paramètre personnalisé incorrect" #, c-format msgid "Bad device-uri \"%s\"." msgstr "" #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "" #, c-format msgid "Bad document-format \"%s\"." msgstr "" #, c-format msgid "Bad document-format-default \"%s\"." msgstr "" msgid "Bad filename buffer" msgstr "" msgid "Bad hostname/address in URI" msgstr "" #, c-format msgid "Bad job-name value: %s" msgstr "" msgid "Bad job-name value: Wrong type or count." msgstr "" msgid "Bad job-priority value." msgstr "" #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "" msgid "Bad job-sheets value type." msgstr "" msgid "Bad job-state value." msgstr "" #, c-format msgid "Bad job-uri \"%s\"." msgstr "" #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "" #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "" #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Valeur de number-up %d incorrecte." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Intervalle de pages erroné : %d-%d." msgid "Bad port number in URI" msgstr "Numéro de port incorrect dans l'URI" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "" #, c-format msgid "Bad printer-state value %d." msgstr "" msgid "Bad printer-uri." msgstr "" #, c-format msgid "Bad request ID %d." msgstr "" #, c-format msgid "Bad request version number %d.%d." msgstr "" msgid "Bad resource in URI" msgstr "" msgid "Bad scheme in URI" msgstr "" msgid "Bad username in URI" msgstr "" msgid "Bad value string" msgstr "" msgid "Bad/empty URI" msgstr "" msgid "Banners" msgstr "Bannières" msgid "Bond Paper" msgstr "Papier pour titres" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "" msgid "Buffer overflow detected, aborting." msgstr "" msgid "CMYK" msgstr "CMJN" msgid "CPCL Label Printer" msgstr "Imprimante pour étiquettes CPCL" msgid "Cancel Jobs" msgstr "Annuler les tâches" msgid "Canceling print job." msgstr "Annulation de la tâche d'impression." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "" msgid "Cassette" msgstr "" msgid "Change Settings" msgstr "Modifier les paramètres" #, c-format msgid "Character set \"%s\" not supported." msgstr "Le jeu de caractères \"%s\" n'est pas disponible." msgid "Classes" msgstr "Classes" msgid "Clean Print Heads" msgstr "Nettoyer les têtes d’impression" msgid "Close-Job doesn't support the job-uri attribute." msgstr "" msgid "Color" msgstr "Couleur" msgid "Color Mode" msgstr "Mode de couleur" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" msgid "Community name uses indefinite length" msgstr "Le nom de la communauté s’avère être de longueur indéfinie" msgid "Connected to printer." msgstr "Connecté à l'imprimante." msgid "Connecting to printer." msgstr "Connexion à l'imprimante en cours." msgid "Continue" msgstr "Continuer" msgid "Continuous" msgstr "Continu" msgid "Control file sent successfully." msgstr "" msgid "Copying print data." msgstr "" msgid "Created" msgstr "Créé" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Personnalisation" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Couper" msgid "Cutter" msgstr "Cutter" msgid "Dark" msgstr "Foncé" msgid "Darkness" msgstr "Tons foncés" msgid "Data file sent successfully." msgstr "" msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Supprimer la classe" msgid "Delete Printer" msgstr "Supprimer l’imprimante" msgid "DeskJet Series" msgstr "Série DeskJet" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "La destination « %s » n’accepte pas de tâche." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" msgid "Direct Thermal Media" msgstr "Papier pour impression thermique directe" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "Le répertoire « %s » contient un chemin relatif." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" "Les permissions du répertoire « %s » sont trop souples (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "Le répertoire « %s » est un fichier." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Le répertoire « %s » n'est pas disponible : %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" "Les permissions du répertoire « %s » sont correctes (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Désactivé" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "" msgid "Draft" msgstr "Brouillon" msgid "Duplexer" msgstr "Duplexeur" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Imprimante pour étiquettes EPL1" msgid "EPL2 Label Printer" msgstr "Imprimante pour étiquettes EPL2" msgid "Edit Configuration File" msgstr "Modifier le fichier de configuration" msgid "Encryption is not supported." msgstr "Chiffrement indisponible." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Fin de la bannière" msgid "English" msgstr "French" 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 "" "Entrez votre nom et mot de passe ou ceux de root pour accéder à cette page. " "Si vous utilisez une authentifiation Kerberos, vérifiez que vous disposez " "d'un ticket Kerberos valide." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "" msgid "Envelope #12" msgstr "" msgid "Envelope #14" msgstr "" msgid "Envelope #9" msgstr "" msgid "Envelope B4" msgstr "" msgid "Envelope B5" msgstr "" msgid "Envelope B6" msgstr "" msgid "Envelope C0" msgstr "" msgid "Envelope C1" msgstr "" msgid "Envelope C2" msgstr "" msgid "Envelope C3" msgstr "" msgid "Envelope C4" msgstr "" msgid "Envelope C5" msgstr "" msgid "Envelope C6" msgstr "" msgid "Envelope C65" msgstr "" msgid "Envelope C7" msgstr "" msgid "Envelope Choukei 3" msgstr "" msgid "Envelope Choukei 3 Long Edge" msgstr "" msgid "Envelope Choukei 4" msgstr "" msgid "Envelope Choukei 4 Long Edge" msgstr "" msgid "Envelope DL" msgstr "" msgid "Envelope Feed" msgstr "Alimentation au format enveloppe" msgid "Envelope Invite" msgstr "" msgid "Envelope Italian" msgstr "Enveloppe italienne" msgid "Envelope Kaku2" msgstr "" msgid "Envelope Kaku2 Long Edge" msgstr "" msgid "Envelope Kaku3" msgstr "" msgid "Envelope Kaku3 Long Edge" msgstr "" msgid "Envelope Monarch" msgstr "" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "" msgid "Envelope PRC10" msgstr "" msgid "Envelope PRC10 Long Edge" msgstr "" msgid "Envelope PRC2" msgstr "" msgid "Envelope PRC2 Long Edge" msgstr "" msgid "Envelope PRC3" msgstr "" msgid "Envelope PRC3 Long Edge" msgstr "" msgid "Envelope PRC4" msgstr "" msgid "Envelope PRC4 Long Edge" msgstr "" msgid "Envelope PRC5 Long Edge" msgstr "" msgid "Envelope PRC5PRC5" msgstr "" msgid "Envelope PRC6" msgstr "" msgid "Envelope PRC6 Long Edge" msgstr "" msgid "Envelope PRC7" msgstr "" msgid "Envelope PRC7 Long Edge" msgstr "" msgid "Envelope PRC8" msgstr "" msgid "Envelope PRC8 Long Edge" msgstr "" msgid "Envelope PRC9" msgstr "" msgid "Envelope PRC9 Long Edge" msgstr "" msgid "Envelope Personal" msgstr "" msgid "Envelope You4" msgstr "" msgid "Envelope You4 Long Edge" msgstr "" msgid "Environment Variables:" msgstr "Variables d'environnement :" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Règles d’erreur" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "" msgid "Error: need hostname after \"-h\" option." msgstr "" msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Toutes les 10 étiquettes" msgid "Every 2 Labels" msgstr "Toutes les 2 étiquettes" msgid "Every 3 Labels" msgstr "Toutes les 3 étiquettes" msgid "Every 4 Labels" msgstr "Toutes les 4 étiquettes" msgid "Every 5 Labels" msgstr "Toutes les 5 étiquettes" msgid "Every 6 Labels" msgstr "Toutes les 6 étiquettes" msgid "Every 7 Labels" msgstr "Toutes les 7 étiquettes" msgid "Every 8 Labels" msgstr "Toutes les 8 étiquettes" msgid "Every 9 Labels" msgstr "Toutes les 9 étiquettes" msgid "Every Label" msgstr "Chaque étiquette" msgid "Executive" msgstr "" msgid "Expectation Failed" msgstr "Échec de la condition de valeur attendue" msgid "Expressions:" msgstr "Expressions :" msgid "Fast Grayscale" msgstr "Niveaux de gris rapide" #, c-format msgid "File \"%s\" contains a relative path." msgstr "" #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" #, c-format msgid "File \"%s\" is a directory." msgstr "" #, c-format msgid "File \"%s\" not available: %s" msgstr "" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" #, c-format msgid "Finished page %d." msgstr "" msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Folio" msgid "Forbidden" msgstr "Interdit" msgid "Found" msgstr "" msgid "General" msgstr "Général" msgid "Generic" msgstr "Générique" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU s’avère être de longueur indéfinie" msgid "Glossy Paper" msgstr "Papier brillant" msgid "Got a printer-uri attribute but no job-id." msgstr "" msgid "Grayscale" msgstr "Niveaux de gris" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Dossier suspendu" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "" msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "" msgid "IPP attribute has no name." msgstr "" msgid "IPP attribute is not a member of the message." msgstr "" msgid "IPP begCollection value not 0 bytes." msgstr "" msgid "IPP boolean value not 1 byte." msgstr "" msgid "IPP date value not 11 bytes." msgstr "" msgid "IPP endCollection value not 0 bytes." msgstr "" msgid "IPP enum value not 4 bytes." msgstr "" msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "" msgid "IPP integer value not 4 bytes." msgstr "" msgid "IPP language length overflows value." msgstr "" msgid "IPP language length too large." msgstr "" msgid "IPP member name is not empty." msgstr "" msgid "IPP memberName value is empty." msgstr "" msgid "IPP memberName with no attribute." msgstr "" msgid "IPP name larger than 32767 bytes." msgstr "" msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "" msgid "IPP octetString length too large." msgstr "" msgid "IPP rangeOfInteger value not 8 bytes." msgstr "" msgid "IPP resolution value not 9 bytes." msgstr "" msgid "IPP string length overflows value." msgstr "" msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "" msgid "IPP value larger than 32767 bytes." msgstr "" msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "utf-8" msgid "Illegal control character" msgstr "Caractère de contrôle interdit" msgid "Illegal main keyword string" msgstr "Mot-clé essentiel interdit" msgid "Illegal option keyword string" msgstr "Mot-clé d’option interdit" msgid "Illegal translation string" msgstr "Traduction interdite" msgid "Illegal whitespace character" msgstr "Caractère « espace blanc » interdit" msgid "Installable Options" msgstr "Options installables" msgid "Installed" msgstr "Installée" msgid "IntelliBar Label Printer" msgstr "Imprimante pour étiquettes IntelliBar" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Erreur interne du serveur" msgid "Internal error" msgstr "Erreur interne" msgid "Internet Postage 2-Part" msgstr "Affranchissement Internet en 2 parties" msgid "Internet Postage 3-Part" msgstr "Affranchissement Internet en 3 parties" msgid "Internet Printing Protocol" msgstr "Internet Printing Protocol" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "" msgid "Invalid media size." msgstr "" msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "" msgid "JCL" msgstr "JCL ( Langage de contrôle de tâche )" msgid "JIS B0" msgstr "" msgid "JIS B1" msgstr "" msgid "JIS B10" msgstr "" msgid "JIS B2" msgstr "" msgid "JIS B3" msgstr "" msgid "JIS B4" msgstr "" msgid "JIS B4 Long Edge" msgstr "" msgid "JIS B5" msgstr "" msgid "JIS B5 Long Edge" msgstr "" msgid "JIS B6" msgstr "" msgid "JIS B6 Long Edge" msgstr "" msgid "JIS B7" msgstr "" msgid "JIS B8" msgstr "" msgid "JIS B9" msgstr "" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "" #, c-format msgid "Job #%d does not exist." msgstr "La tâche n°%d n'existe pas." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "La tâche n°%d est déjà abandonnée - impossible de l’annuler." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "La tâche n°%d est déjà annulée - impossible de l’annuler." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "La tâche n°%d est déjà terminée - impossible de l’annuler." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "La tâche n°%d est terminée et ne peut être modifiée." #, c-format msgid "Job #%d is not complete." msgstr "La tâche n°%d n'est pas terminée." #, c-format msgid "Job #%d is not held for authentication." msgstr "" #, c-format msgid "Job #%d is not held." msgstr "" msgid "Job Completed" msgstr "terminée" msgid "Job Created" msgstr "Tâche créée" msgid "Job Options Changed" msgstr "Options de la tâche modifiées" msgid "Job Stopped" msgstr "arrêtée" msgid "Job is completed and cannot be changed." msgstr "La tâche est terminée et ne peut être modifiée." msgid "Job operation failed" msgstr "L’opération sur la tâche a échoué :" msgid "Job state cannot be changed." msgstr "L’état de la tâche ne peut pas être modifié." msgid "Job subscriptions cannot be renewed." msgstr "" msgid "Jobs" msgstr "Tâches" msgid "LPD/LPR Host or Printer" msgstr "Hôte ou imprimante LPD/LPR" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Imprimante pour étiquettes" msgid "Label Top" msgstr "Étiquette supérieure" #, c-format msgid "Language \"%s\" not supported." msgstr "" msgid "Large Address" msgstr "Adresse étendue" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet série PCL 4/5" msgid "Letter Oversize" msgstr "" msgid "Letter Oversize Long Edge" msgstr "" msgid "Light" msgstr "Clair" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Ligne dépassant la longueur maximale autorisée (255 caractères)" msgid "List Available Printers" msgstr "" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "Bord le plus long (Portrait)" msgid "Looking for printer." msgstr "Recherche d'imprimante en cours." msgid "Manual Feed" msgstr "" msgid "Media Size" msgstr "Taille du papier" msgid "Media Source" msgstr "Source du papier" msgid "Media Tracking" msgstr "Crénage du papier" msgid "Media Type" msgstr "Type de papier" msgid "Medium" msgstr "Moyen" msgid "Memory allocation error" msgstr "Erreur d’allocation de mémoire" msgid "Missing CloseGroup" msgstr "" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Entête PPD-Adobe-4.x manquant" msgid "Missing asterisk in column 1" msgstr "Astérisque manquant à la colonne 1" msgid "Missing document-number attribute." msgstr "" msgid "Missing form variable" msgstr "" msgid "Missing last-document attribute in request." msgstr "" msgid "Missing media or media-col." msgstr "" msgid "Missing media-size in media-col." msgstr "" msgid "Missing notify-subscription-ids attribute." msgstr "" msgid "Missing option keyword" msgstr "" msgid "Missing requesting-user-name attribute." msgstr "" #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "" msgid "Missing resource in URI" msgstr "" msgid "Missing scheme in URI" msgstr "" msgid "Missing value string" msgstr "Chaîne de valeur manquante" msgid "Missing x-dimension in media-size." msgstr "" msgid "Missing y-dimension in media-size." msgstr "" #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" msgid "Modifiers:" msgstr "" msgid "Modify Class" msgstr "Modifier la classe" msgid "Modify Printer" msgstr "Modifier l’imprimante" msgid "Move All Jobs" msgstr "Transférer toutes les tâches" msgid "Move Job" msgstr "Transférer la tâche" msgid "Moved Permanently" msgstr "Transférées de façon permanente" msgid "NULL PPD file pointer" msgstr "Pointeur de fichier PPD NULL." msgid "Name OID uses indefinite length" msgstr "L’OID du nom s’avère être de longueur indéfinie" msgid "Nested classes are not allowed." msgstr "" msgid "Never" msgstr "Jamais" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "Non" msgid "No Content" msgstr "Aucun contenu" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "" msgid "No VarBind SEQUENCE" msgstr "Aucune SEQUENCE VarBind" msgid "No active connection" msgstr "Aucune connexion active" msgid "No active connection." msgstr "Aucune connexion active." #, c-format msgid "No active jobs on %s." msgstr "Aucune tâche active sur %s." msgid "No attributes in request." msgstr "" msgid "No authentication information provided." msgstr "" msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Aucun nom de communauté" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "Aucune imprimante par défaut." msgid "No destinations added." msgstr "Aucune destination ajoutée." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" msgid "No error-index" msgstr "Paramètre error-index absent" msgid "No error-status" msgstr "" msgid "No file in print request." msgstr "" msgid "No modification time" msgstr "" msgid "No name OID" msgstr "Aucun OID de nom" msgid "No pages were found." msgstr "" msgid "No printer name" msgstr "" msgid "No printer-uri found" msgstr "" msgid "No printer-uri found for class" msgstr "" msgid "No printer-uri in request." msgstr "" msgid "No request URI." msgstr "" msgid "No request protocol version." msgstr "" msgid "No request sent." msgstr "" msgid "No request-id" msgstr "Paramètre request-id absent" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "" msgid "No subscriptions found." msgstr "Aucun abonnement trouvé." msgid "No variable-bindings SEQUENCE" msgstr "Aucune SEQUENCE variable-bindings" msgid "No version number" msgstr "Aucun numéro de version" msgid "Non-continuous (Mark sensing)" msgstr "Non continu (détection de marque)" msgid "Non-continuous (Web sensing)" msgstr "Non continu (détection Web)" msgid "None" msgstr "Aucun" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "Introuvable" msgid "Not Implemented" msgstr "Non implémentée" msgid "Not Installed" msgstr "Non installée" msgid "Not Modified" msgstr "Non modifiée" msgid "Not Supported" msgstr "Non prise en charge" msgid "Not allowed to print." msgstr "Impression interdite" msgid "Note" msgstr "Remarque" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Désactivé (recto)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Aide en ligne" msgid "Only local users can create a local printer." msgstr "Seuls les utilisateurs locaux peuvent créer des imprimantes locales." #, c-format msgid "Open of %s failed: %s" msgstr "L’ouverture de %s a échoué : %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup sans CloseGroup préalable" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI sans CloseUI/JCLCloseUI préalable" msgid "Operation Policy" msgstr "Règles de fonctionnement" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "" msgid "Options Installed" msgstr "Options installées" msgid "Options:" msgstr "Options" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "" msgid "Out of memory." msgstr "" msgid "Output Mode" msgstr "Mode de sortie" msgid "PCL Laser Printer" msgstr "Imprimante laser PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "" msgid "PRC32K Oversize" msgstr "" msgid "PRC32K Oversize Long Edge" msgstr "" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "Le paquet ne contient aucun paramètre Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Le paquet ne commence pas par SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Mot de passe pour %s sur %s ? " msgid "Pause Class" msgstr "Suspendre la classe" msgid "Pause Printer" msgstr "Suspendre l’imprimante" msgid "Peel-Off" msgstr "Décoller" msgid "Photo" msgstr "Photo" msgid "Photo Labels" msgstr "Étiquettes photo" msgid "Plain Paper" msgstr "" msgid "Policies" msgstr "Règles" msgid "Port Monitor" msgstr "Moniteur de port" msgid "PostScript Printer" msgstr "Imprimante PostScript" msgid "Postcard" msgstr "Carte postale" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "" msgid "Postcard Long Edge" msgstr "" msgid "Preparing to print." msgstr "" msgid "Print Density" msgstr "Densité d’impression" msgid "Print Job:" msgstr "Tâche d’impression :" msgid "Print Mode" msgstr "Mode d’impression" msgid "Print Quality" msgstr "Qualité d'impression" msgid "Print Rate" msgstr "Taux d’impression" msgid "Print Self-Test Page" msgstr "Imprimer une page d’autotest" msgid "Print Speed" msgstr "Vitesse d’impression" msgid "Print Test Page" msgstr "Imprimer la page de test" msgid "Print and Cut" msgstr "Impression à découper" msgid "Print and Tear" msgstr "Impression à détacher" msgid "Print file sent." msgstr "" msgid "Print job canceled at printer." msgstr "" msgid "Print job too large." msgstr "" msgid "Print job was not accepted." msgstr "" #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "ajoutée" msgid "Printer Default" msgstr "par défaut" msgid "Printer Deleted" msgstr "supprimée" msgid "Printer Modified" msgstr "modifiée" msgid "Printer Paused" msgstr "en pause" msgid "Printer Settings" msgstr "Réglages de l’imprimante" msgid "Printer cannot print supplied content." msgstr "" msgid "Printer cannot print with supplied options." msgstr "" msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Imprimante :" msgid "Printers" msgstr "" #, c-format msgid "Printing page %d, %u%% complete." msgstr "" msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "" msgid "Rank Owner Job File(s) Total Size" msgstr "" msgid "Reject Jobs" msgstr "Refuser les tâches" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "" #, c-format msgid "Remote host did not accept data file (%d)." msgstr "" msgid "Reprint After Error" msgstr "Réimprimer après erreur" msgid "Request Entity Too Large" msgstr "Entité de requête trop volumineuse" msgid "Resolution" msgstr "Résolution" msgid "Resume Class" msgstr "Relancer la classe" msgid "Resume Printer" msgstr "Relancer l’imprimante" msgid "Return Address" msgstr "Renvoyer l’adresse" msgid "Rewind" msgstr "Rembobiner" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE s’avère être de longueur indéfinie" msgid "SSL/TLS Negotiation Error" msgstr "Erreur de négotiation SSL/TLS" msgid "See Other" msgstr "Autres" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "" msgid "Server Restarted" msgstr "Le serveur a redémarré" msgid "Server Security Auditing" msgstr "Vérification de la sécurité du serveur" msgid "Server Started" msgstr "Le serveur a démarré" msgid "Server Stopped" msgstr "Le serveur s’est arrêté" msgid "Server credentials not set." msgstr "" msgid "Service Unavailable" msgstr "Service indisponible" msgid "Set Allowed Users" msgstr "Définir les autorisations" msgid "Set As Server Default" msgstr "Définir comme valeur par défaut pour le serveur" msgid "Set Class Options" msgstr "Définir les options de classe" msgid "Set Printer Options" msgstr "Définir les options de l’imprimante" msgid "Set Publishing" msgstr "Définir la publication" msgid "Shipping Address" msgstr "Adresse de livraison" msgid "Short-Edge (Landscape)" msgstr "Bord le plus court (paysage)" msgid "Special Paper" msgstr "Papier spécial" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "" msgid "Standard" msgstr "Standard" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Début de la bannière" #, c-format msgid "Starting page %d." msgstr "" msgid "Statement" msgstr "Déclaration" #, c-format msgid "Subscription #%d does not exist." msgstr "" msgid "Substitutions:" msgstr "" msgid "Super A" msgstr "" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Permuter les protocoles" msgid "Tabloid" msgstr "Tabloïd" msgid "Tabloid Oversize" msgstr "" msgid "Tabloid Oversize Long Edge" msgstr "" msgid "Tear" msgstr "Détacher" msgid "Tear-Off" msgstr "Détacher" msgid "Tear-Off Adjust Position" msgstr "Position d’ajustement du détachement" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "" #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "" #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "Le fichier PPD « %s » n’a pu être trouvé." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "Le fichier PPD « %s » n’a pu être ouvert : %s" msgid "The PPD file could not be opened." msgstr "Le fichier PPD n’a pu être ouvert." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "Le nom de classe doit comporter au plus 127 caractères, tous imprimables, " "sans espace, « / » et « # »." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "L’attribut « notify-lease-duration » ne peut pas être utilisé dans un " "abonnement de tâche." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "" msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" msgid "The printer did not respond." msgstr "" msgid "The printer is in use." msgstr "" msgid "The printer is not connected." msgstr "" msgid "The printer is not responding." msgstr "" msgid "The printer is now connected." msgstr "" msgid "The printer is now online." msgstr "" msgid "The printer is offline." msgstr "" msgid "The printer is unreachable at this time." msgstr "" msgid "The printer may not exist or is unavailable at this time." 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 "" msgid "The printer or class does not exist." msgstr "" msgid "The printer or class is not shared." msgstr "" #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "Le paramètre printer-uri « %s » contient des caractères non valides." msgid "The printer-uri attribute is required." msgstr "" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "L’attribut « printer-uri » doit se présenter sous la forme « ipp://HOSTNAME/" "classes/CLASSNAME »." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "L’attribut « printer-uri » doit se présenter sous la forme « ipp://HOSTNAME/" "printers/PRINTERNAME »." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "" msgid "There are too many subscriptions." msgstr "Les abonnements sont trop nombreux." msgid "There was an unrecoverable USB error." msgstr "" msgid "Thermal Transfer Media" msgstr "Papier pour transfert thermique" msgid "Too many active jobs." msgstr "Trop de tâches en cours." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "" #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "" msgid "Transparency" msgstr "Transparence" msgid "Tray" msgstr "Bac" msgid "Tray 1" msgstr "Bac 1" msgid "Tray 2" msgstr "Bac 2" msgid "Tray 3" msgstr "Bac 3" msgid "Tray 4" msgstr "Bac 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "URI trop long" msgid "URI too large" msgstr "" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Légal" msgid "US Legal Oversize" msgstr "" msgid "US Letter" msgstr "US Lettre" msgid "US Letter Long Edge" msgstr "US Lettre Bord long" msgid "US Letter Oversize" msgstr "" msgid "US Letter Oversize Long Edge" msgstr "" msgid "US Letter Small" msgstr "" msgid "Unable to access cupsd.conf file" msgstr "Impossible d’accéder au fichier cupsd.conf :" msgid "Unable to access help file." msgstr "Impossible d’accéder au fichier d’aide :" msgid "Unable to add class" msgstr "Impossible d’ajouter la classe :" msgid "Unable to add document to print job." msgstr "Impossible d’ajouter le document pour imprimer la tâche :" #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Impossible d’ajouter la tâche à la destination \"%s\"." msgid "Unable to add printer" msgstr "Impossible d’ajouter l’imprimante :" msgid "Unable to allocate memory for file types." msgstr "" msgid "Unable to allocate memory for page info" msgstr "" msgid "Unable to allocate memory for pages array" msgstr "" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "Impossible d’annuler la tâche d'impression." msgid "Unable to change printer" msgstr "Impossible de changer d'imprimante" msgid "Unable to change printer-is-shared attribute" msgstr "Impossible de modifier l’attribut « printer-is-shared » :" msgid "Unable to change server settings" msgstr "Impossible de modifier les réglages du serveur :" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" msgid "Unable to configure printer options." msgstr "Impossible de configurer les options de l'imprimante." msgid "Unable to connect to host." msgstr "Connexion à l’hôte impossible." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" #, c-format msgid "Unable to copy PPD file - %s" msgstr "" msgid "Unable to copy PPD file." msgstr "" msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "Impossible de créer le fichier temporaire :" msgid "Unable to delete class" msgstr "Impossible de supprimer la classe :" msgid "Unable to delete printer" msgstr "Impossible de supprimer l’imprimante :" msgid "Unable to do maintenance command" msgstr "Impossible de lancer la commande de maintenance :" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" msgid "Unable to establish a secure connection to host." msgstr "" #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "" msgid "Unable to find printer." msgstr "" msgid "Unable to find server credentials." msgstr "" msgid "Unable to get backend exit status." msgstr "" msgid "Unable to get class list" msgstr "Impossible d’obtenir la liste des classes :" msgid "Unable to get class status" msgstr "Impossible d’obtenir l’état de la classe :" msgid "Unable to get list of printer drivers" msgstr "Impossible d’obtenir la liste des pilotes d’impression :" msgid "Unable to get printer attributes" msgstr "Impossible de récupérer les attributs de l’imprimante :" msgid "Unable to get printer list" msgstr "Impossible d’obtenir la liste des imprimantes :" msgid "Unable to get printer status" msgstr "Impossible d’obtenir l’état de l’imprimante" msgid "Unable to get printer status." msgstr "Impossible d’obtenir l’état de l’imprimante." msgid "Unable to load help index." msgstr "" #, c-format msgid "Unable to locate printer \"%s\"." msgstr "" msgid "Unable to locate printer." msgstr "" msgid "Unable to modify class" msgstr "Impossible de modifier la classe :" msgid "Unable to modify printer" msgstr "Impossible de modifier l’imprimante :" msgid "Unable to move job" msgstr "Impossible de transférer la tâche." msgid "Unable to move jobs" msgstr "Impossible de transférer les tâches." msgid "Unable to open PPD file" msgstr "" msgid "Unable to open cupsd.conf file:" msgstr "Impossible d’ouvrir le fichier cupsd.conf :" msgid "Unable to open device file" msgstr "" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "" msgid "Unable to open help file." msgstr "" msgid "Unable to open print file" msgstr "" msgid "Unable to open raster file" msgstr "" msgid "Unable to print test page" msgstr "Impossible d’imprimer la page de test :" msgid "Unable to read print data." msgstr "" #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "" msgid "Unable to see in file" msgstr "" msgid "Unable to send command to printer driver" msgstr "" msgid "Unable to send data to printer." msgstr "" msgid "Unable to set options" msgstr "Impossible de définir les options :" msgid "Unable to set server default" msgstr "Impossible de définir la valeur par défaut pour le serveur :" msgid "Unable to start backend process." msgstr "" msgid "Unable to upload cupsd.conf file" msgstr "Impossible de transmettre le fichier cupsd.conf :" msgid "Unable to use legacy USB class driver." msgstr "" msgid "Unable to write print data" msgstr "" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "" msgid "Unauthorized" msgstr "Non autorisé" msgid "Units" msgstr "Unités" msgid "Unknown" msgstr "Inconnu" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "" #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "" #, c-format msgid "Unknown file order: \"%s\"." msgstr "" #, c-format msgid "Unknown format character: \"%c\"." msgstr "" msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "" #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "" #, c-format msgid "Unknown option \"%s\"." msgstr "" #, c-format msgid "Unknown print mode: \"%s\"." msgstr "" #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "Paramètre printer-error-policy « %s » inconnu." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "Paramètre printer-op-policy « %s » inconnu." msgid "Unknown request method." msgstr "" msgid "Unknown request version." msgstr "" msgid "Unknown scheme in URI" msgstr "" msgid "Unknown service name." msgstr "" #, c-format msgid "Unknown version option value: \"%s\"." msgstr "" #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "" #, c-format msgid "Unsupported character set \"%s\"." msgstr "" #, c-format msgid "Unsupported compression \"%s\"." msgstr "" #, c-format msgid "Unsupported document-format \"%s\"." msgstr "" #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "" #, c-format msgid "Unsupported format \"%s\"." msgstr "" msgid "Unsupported margins." msgstr "" msgid "Unsupported media value." msgstr "" #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "" #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" msgid "Unsupported raster data." msgstr "" msgid "Unsupported value type" msgstr "Type de valeur non pris en charge" msgid "Upgrade Required" msgstr "Mise à niveau obligatoire" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" msgid "Usage: cupsd [options]" msgstr "" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: snmp [host-or-ip-address]" msgstr "" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "La valeur s’avère être de longueur indéfinie" msgid "VarBind uses indefinite length" msgstr "VarBind s’avère être de longueur indéfinie" msgid "Version uses indefinite length" msgstr "La version s’avère être de longueur indéfinie" msgid "Waiting for job to complete." msgstr "" msgid "Waiting for printer to become available." msgstr "" msgid "Waiting for printer to finish." msgstr "" msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "" msgid "Yes" msgstr "Oui" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Vous devez accéder à cette page par l’URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Imprimante pour étiquettes ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "abandonnée" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "annulée" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "terminée" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "L’exécution de « cups-deviced » a échoué." msgid "cups-driverd failed to execute." msgstr "L’exécution de « cups-driverd » a échoué." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" msgid "cupsd: Unable to get current directory." msgstr "" msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "" #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "" #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "" #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "" msgid "cupsfilter: Only one filename can be specified." msgstr "" #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "" msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "" #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "matériel pour %s/%s : %s" #, c-format msgid "device for %s: %s" msgstr "matériel pour %s : %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "Le paramètre error-index s’avère être de longueur indéfinie" msgid "error-status uses indefinite length" msgstr "Le paramètre error-status s’avère être de longueur indéfinie" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "retenue" msgid "help\t\tGet help on commands." msgstr "" msgid "idle" msgstr "inactive" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" msgid "ippfind: Cannot use --and after --or." msgstr "" #, c-format msgid "ippfind: Expected key name after %s." msgstr "" #, c-format msgid "ippfind: Expected port range after %s." msgstr "" #, c-format msgid "ippfind: Expected program after %s." msgstr "" #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" msgid "ippfind: Missing close brace in substitution." msgstr "" msgid "ippfind: Missing close parenthesis." msgstr "" msgid "ippfind: Missing expression before \"--and\"." msgstr "" msgid "ippfind: Missing expression before \"--or\"." msgstr "" #, c-format msgid "ippfind: Missing key name after %s." msgstr "" #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "" #, c-format msgid "ippfind: Missing program after %s." msgstr "" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" msgid "ippfind: Out of memory." msgstr "" msgid "ippfind: Too many parenthesis." msgstr "" #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" msgid "ipptool: May only specify a single URI." msgstr "" msgid "ipptool: Missing count for \"-n\"." msgstr "" msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "" msgid "ipptool: Missing name=value for \"-d\"." msgstr "" msgid "ipptool: Missing seconds for \"-i\"." msgstr "" msgid "ipptool: URI required before test file." msgstr "" #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "" #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "" #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" msgid "lpadmin: Expected class after \"-r\" option." msgstr "" msgid "lpadmin: Expected class name after \"-c\" option." msgstr "" msgid "lpadmin: Expected description after \"-D\" option." msgstr "" msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "" msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "" msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "" msgid "lpadmin: Expected location after \"-L\" option." msgstr "" msgid "lpadmin: Expected model after \"-m\" option." msgstr "" msgid "lpadmin: Expected name after \"-R\" option." msgstr "" msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "" msgid "lpadmin: Expected printer after \"-p\" option." msgstr "" msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "" msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "" msgid "lpadmin: No member names were seen." msgstr "" #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "" #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "" msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "" msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "" msgid "lpadmin: Unable to create temporary file" msgstr "" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "" #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "" #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "" msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "" msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" msgid "lpinfo: Expected language after \"--language\"." msgstr "" msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" msgid "lpinfo: Expected product string after \"--product\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "" msgid "lpoptions: No printers." msgstr "" #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "" msgid "lpoptions: Unknown printer or class." msgstr "" #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "" msgid "no system default destination" msgstr "" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "" #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "en attente" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "" #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "" #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "" #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "" #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Writing %s." msgstr "" #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "" #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "" #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "" #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "en cours" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "" msgid "request-id uses indefinite length" msgstr "Le paramètre request-id s’avère être de longueur indéfinie" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "" msgid "scheduler is running" msgstr "" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "stat sur %s a échoué : %s" msgid "status\t\tShow status of daemon and queue." msgstr "" #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "arrêtée" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "" #, c-format msgid "system default destination: %s/%s" msgstr "" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "inconnu" msgid "untitled" msgstr "sans titre" msgid "variable-bindings uses indefinite length" msgstr "" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "Export Printers to Samba" #~ msgstr "Exporter les imprimantes vers SAMBA" cups-2.3.1/locale/cups_cs.po000664 000765 000024 00001101524 13574721672 016041 0ustar00mikestaff000000 000000 # # Czech message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2012-09-14 10:26+0100\n" "Last-Translator: Jan Bartos \n" "Language-Team: Czech\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "" msgid "\t\t(none)" msgstr "" #, c-format msgid "\t%d entries" msgstr "" #, c-format msgid "\t%s" msgstr "" msgid "\tAfter fault: continue" msgstr "" #, c-format msgid "\tAlerts: %s" msgstr "" msgid "\tBanner required" msgstr "" msgid "\tCharset sets:" msgstr "" msgid "\tConnection: direct" msgstr "" msgid "\tConnection: remote" msgstr "" msgid "\tContent types: any" msgstr "" msgid "\tDefault page size:" msgstr "" msgid "\tDefault pitch:" msgstr "" msgid "\tDefault port settings:" msgstr "" #, c-format msgid "\tDescription: %s" msgstr "" msgid "\tForm mounted:" msgstr "" msgid "\tForms allowed:" msgstr "" #, c-format msgid "\tInterface: %s.ppd" msgstr "" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "" #, c-format msgid "\tLocation: %s" msgstr "" msgid "\tOn fault: no alert" msgstr "" msgid "\tPrinter types: unknown" msgstr "" #, c-format msgid "\tStatus: %s" msgstr "" msgid "\tUsers allowed:" msgstr "" msgid "\tUsers denied:" msgstr "" msgid "\tdaemon present" msgstr "" msgid "\tno entries" msgstr "" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "" msgid "\tprinting is disabled" msgstr "" msgid "\tprinting is enabled" msgstr "" #, c-format msgid "\tqueued for %s" msgstr "" msgid "\tqueuing is disabled" msgstr "" msgid "\tqueuing is enabled" msgstr "" msgid "\treason unknown" msgstr "" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" msgid " REF: Page 15, section 3.1." msgstr "" msgid " REF: Page 15, section 3.2." msgstr "" msgid " REF: Page 19, section 3.3." msgstr "" msgid " REF: Page 20, section 3.4." msgstr "" msgid " REF: Page 27, section 3.5." msgstr "" msgid " REF: Page 42, section 5.2." msgstr "" msgid " REF: Pages 16-17, section 3.2." msgstr "" msgid " REF: Pages 42-45, section 5.2." msgstr "" msgid " REF: Pages 45-46, section 5.2." msgstr "" msgid " REF: Pages 48-49, section 5.2." msgstr "" msgid " REF: Pages 52-54, section 5.2." msgstr "" #, c-format msgid " %-39.39s %.0f bytes" msgstr "" #, c-format msgid " PASS Default%s" msgstr "" msgid " PASS DefaultImageableArea" msgstr "" msgid " PASS DefaultPaperDimension" msgstr "" msgid " PASS FileVersion" msgstr "" msgid " PASS FormatVersion" msgstr "" msgid " PASS LanguageEncoding" msgstr "" msgid " PASS LanguageVersion" msgstr "" msgid " PASS Manufacturer" msgstr "" msgid " PASS ModelName" msgstr "" msgid " PASS NickName" msgstr "" msgid " PASS PCFileName" msgstr "" msgid " PASS PSVersion" msgstr "" msgid " PASS PageRegion" msgstr "" msgid " PASS PageSize" msgstr "" msgid " PASS Product" msgstr "" msgid " PASS ShortNickName" msgstr "" #, c-format msgid " WARN %s has no corresponding options." msgstr "" #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" #, c-format msgid " WARN Line %d only contains whitespace." msgstr "" msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" #, c-format msgid " %s %s %s does not exist." msgstr "" #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr "" #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "" #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsICCProfile %s." msgstr "" #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr "" #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s Bad language \"%s\"." msgstr "" #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr "" #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr "" #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" #, c-format msgid " %s Default choices conflicting." msgstr "" #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr "" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr "" #, c-format msgid " %s Missing %s file \"%s\"." msgstr "" #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr "" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr "" #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "" #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "" #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr "" #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr "" #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr "" #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" #, c-format msgid " %d ERRORS FOUND" msgstr "" msgid " NO ERRORS FOUND" msgstr "" msgid " --cr End lines with CR (Mac OS 9)." msgstr "" msgid " --crlf End lines with CR + LF (Windows)." msgstr "" msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr "" msgid " -D Remove the input file when finished." msgstr "" msgid " -D name=value Set named variable to value." msgstr "" msgid " -I include-dir Add include directory to search path." msgstr "" msgid " -P filename.ppd Set PPD file." msgstr "" msgid " -U username Specify username." msgstr "" msgid " -c catalog.po Load the specified message catalog." msgstr "" msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" msgid " -d output-dir Specify the output directory." msgstr "" msgid " -d printer Use the named printer." msgstr "" msgid " -e Use every filter from the PPD file." msgstr "" msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr "" msgid " -m Use the ModelName value as the filename." msgstr "" msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" msgid " -n copies Set number of copies." msgstr "" msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" msgid " -o name=value Set option(s)." msgstr "" msgid " -p filename.ppd Set PPD file." msgstr "" msgid " -t Test PPDs instead of generating them." msgstr "" msgid " -t title Set title." msgstr "" msgid " -u Remove the PPD file when finished." msgstr "" msgid " -v Be verbose." msgstr "" msgid " -z Compress PPD files using GNU zip." msgstr "" msgid " FAIL" msgstr "" msgid " PASS" msgstr "" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "" #, c-format msgid "%d x %d mm" msgstr "" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "" #, c-format msgid "%s (%s, %s)" msgstr "" #, c-format msgid "%s (Borderless)" msgstr "" #, c-format msgid "%s (Borderless, %s)" msgstr "" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "" #, c-format msgid "%s accepting requests since %s" msgstr "" #, c-format msgid "%s cannot be changed." msgstr "%s nelze změnit." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "" #, c-format msgid "%s is not ready" msgstr "" #, c-format msgid "%s is ready" msgstr "" #, c-format msgid "%s is ready and printing" msgstr "" #, c-format msgid "%s job-id user title copies options [file]" msgstr "" #, c-format msgid "%s not accepting requests since %s -" msgstr "" #, c-format msgid "%s not supported." msgstr "" #, c-format msgid "%s/%s accepting requests since %s" msgstr "" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "" #, c-format msgid "%s: %s failed: %s" msgstr "" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "" #, c-format msgid "%s: Don't know what to do." msgstr "" #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" #, c-format msgid "%s: Error - bad job ID." msgstr "" #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "" #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "" #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "" #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "" #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "" #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "" #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "" #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "" #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "" #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "" #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "" #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "" #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "" #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "" #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "" #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "" #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" #, c-format msgid "%s: Error - no default destination available." msgstr "" #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "" #, c-format msgid "%s: Error - scheduler not responding." msgstr "" #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "" #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "" #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "" #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "" #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "" #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "" #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "" #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "" #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "" #, c-format msgid "%s: Missing version for \"-V\"." msgstr "" #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "" #, c-format msgid "%s: Operation failed: %s" msgstr "" #, c-format msgid "%s: Sorry, no encryption support." msgstr "" #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #, c-format msgid "%s: Unable to connect to server." msgstr "" #, c-format msgid "%s: Unable to contact server." msgstr "" #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "" #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" #, c-format msgid "%s: Unable to open %s: %s" msgstr "" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "" #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "" #, c-format msgid "%s: Unknown option \"%c\"." msgstr "" #, c-format msgid "%s: Unknown option \"%s\"." msgstr "" #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "" #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "" #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" #, c-format msgid "%s: Warning - character set option ignored." msgstr "" #, c-format msgid "%s: Warning - content type option ignored." msgstr "" #, c-format msgid "%s: Warning - form option ignored." msgstr "" #, c-format msgid "%s: Warning - mode option ignored." msgstr "" msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 palec/sek." msgid "1.25x0.25\"" msgstr "1.25x0.25\"" msgid "1.25x2.25\"" msgstr "1.25x2.25\"" msgid "1.5 inch/sec." msgstr "1.5 palce/sek." msgid "1.50x0.25\"" msgstr "1.50x0.25\"" msgid "1.50x0.50\"" msgstr "1.50x0.50\"" msgid "1.50x1.00\"" msgstr "1.50x1.00\"" msgid "1.50x2.00\"" msgstr "1.50x2.00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 palců/sek." msgid "10 x 11" msgstr "" msgid "10 x 13" msgstr "" msgid "10 x 14" msgstr "" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/sek." msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 palců/sek." msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 palců/sek." msgid "12 x 11" msgstr "" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/sek." msgid "120x60dpi" msgstr "120x60 dpi" msgid "120x72dpi" msgstr "120x72 dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136 dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/sek." msgid "15 x 11" msgstr "" msgid "150 mm/sec." msgstr "150 mm/sek." msgid "150dpi" msgstr "150 dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180 dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 palce/sek." msgid "2-Sided Printing" msgstr "oboustranný tisk" msgid "2.00x0.37\"" msgstr "2.00x0.37\"" msgid "2.00x0.50\"" msgstr "2.00x0.50\"" msgid "2.00x1.00\"" msgstr "2.00x1.00\"" msgid "2.00x1.25\"" msgstr "2.00x1.25\"" msgid "2.00x2.00\"" msgstr "2.00x2.00\"" msgid "2.00x3.00\"" msgstr "2.00x3.00\"" msgid "2.00x4.00\"" msgstr "2.00x4.00\"" msgid "2.00x5.50\"" msgstr "2.00x5.50\"" msgid "2.25x0.50\"" msgstr "2.25x0.50\"" msgid "2.25x1.25\"" msgstr "2.25x1.25\"" msgid "2.25x4.00\"" msgstr "2.25x4.00\"" msgid "2.25x5.50\"" msgstr "2.25x5.50\"" msgid "2.38x5.50\"" msgstr "2.38x5.50\"" msgid "2.5 inches/sec." msgstr "2.5 palce/sek." msgid "2.50x1.00\"" msgstr "2.50x1.00\"" msgid "2.50x2.00\"" msgstr "2.50x2.00\"" msgid "2.75x1.25\"" msgstr "2.75x1.25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/sek." msgid "200 mm/sec." msgstr "200 mm/sek." msgid "203dpi" msgstr "203 dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24 jehličková" msgid "240x72dpi" msgstr "240x72 dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/sek." msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 palce/sek." msgid "3 x 5" msgstr "" msgid "3.00x1.00\"" msgstr "3.00x1.00\"" msgid "3.00x1.25\"" msgstr "3.00x1.25\"" msgid "3.00x2.00\"" msgstr "3.00x2.00\"" msgid "3.00x3.00\"" msgstr "3.00x3.00\"" msgid "3.00x5.00\"" msgstr "3.00x5.00\"" msgid "3.25x2.00\"" msgstr "3.25x2.00\"" msgid "3.25x5.00\"" msgstr "3.25x5.00\"" msgid "3.25x5.50\"" msgstr "3.25x5.50\"" msgid "3.25x5.83\"" msgstr "3.25x5.83\"" msgid "3.25x7.83\"" msgstr "3.25x7.83\"" msgid "3.5 x 5" msgstr "" msgid "3.5\" Disk" msgstr "3.5\" Disk" msgid "3.50x1.00\"" msgstr "3.50x1.00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/sek." msgid "300 mm/sec." msgstr "300 mm/sek." msgid "300dpi" msgstr "300 dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360 dpi" msgid "360x180dpi" msgstr "360x180 dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 palce/sek." msgid "4.00x1.00\"" msgstr "4.00x1.00\"" msgid "4.00x13.00\"" msgstr "4.00x13.00\"" msgid "4.00x2.00\"" msgstr "4.00x2.00\"" msgid "4.00x2.50\"" msgstr "4.00x2.50\"" msgid "4.00x3.00\"" msgstr "4.00x3.00\"" msgid "4.00x4.00\"" msgstr "4.00x4.00\"" msgid "4.00x5.00\"" msgstr "4.00x5.00\"" msgid "4.00x6.00\"" msgstr "4.00x6.00\"" msgid "4.00x6.50\"" msgstr "4.00x6.50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/sek." msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 palců/sek." msgid "5 x 7" msgstr "" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 palců/sek." msgid "6.00x1.00\"" msgstr "6.00x1.00\"" msgid "6.00x2.00\"" msgstr "6.00x2.00\"" msgid "6.00x3.00\"" msgstr "6.00x3.00\"" msgid "6.00x4.00\"" msgstr "6.00x4.00\"" msgid "6.00x5.00\"" msgstr "6.00x5.00\"" msgid "6.00x6.00\"" msgstr "6.00x6.00\"" msgid "6.00x6.50\"" msgstr "6.00x6.50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/sek." msgid "600dpi" msgstr "600 dpi" msgid "60dpi" msgstr "60 dpi" msgid "60x72dpi" msgstr "" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 palců/sek." msgid "7 x 9" msgstr "" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 palců/sek." msgid "8 x 10" msgstr "" msgid "8.00x1.00\"" msgstr "8.00x1.00\"" msgid "8.00x2.00\"" msgstr "8.00x2.00\"" msgid "8.00x3.00\"" msgstr "8.00x3.00\"" msgid "8.00x4.00\"" msgstr "8.00x4.00\"" msgid "8.00x5.00\"" msgstr "8.00x5.00\"" msgid "8.00x6.00\"" msgstr "8.00x6.00\"" msgid "8.00x6.50\"" msgstr "8.00x6.50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sek." msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 palců/sek." msgid "9 x 11" msgstr "" msgid "9 x 12" msgstr "" msgid "9-Pin Series" msgstr "9 jehličková" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "" #, c-format msgid "A class named \"%s\" already exists." msgstr "" #, c-format msgid "A printer named \"%s\" already exists." msgstr "" msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "" msgid "A3 Oversize" msgstr "" msgid "A3 Oversize Long Edge" msgstr "" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "" msgid "A4 Oversize" msgstr "" msgid "A4 Small" msgstr "" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "" msgid "A5 Oversize" msgstr "" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "" msgid "Accept Jobs" msgstr "Příjem úloh" msgid "Accepted" msgstr "Přijatý" msgid "Add Class" msgstr "Přidat třídu" msgid "Add Printer" msgstr "Přidat tiskárnu" msgid "Address" msgstr "Adresa" msgid "Administration" msgstr "Administrace" msgid "Always" msgstr "Vždy" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Aplikátor" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "" msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Neplatný ukazatel NULL" msgid "Bad OpenGroup" msgstr "Chybný OpenGroup" msgid "Bad OpenUI/JCLOpenUI" msgstr "Chybný OpenUI/JCLOpenUI" msgid "Bad OrderDependency" msgstr "Chybný OrderDependency" msgid "Bad PPD cache file." msgstr "" msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "Chybný požadavek" msgid "Bad SNMP version number" msgstr "Chybná verze SNMP" msgid "Bad UIConstraints" msgstr "Chybný UIConstraints" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "" #, c-format msgid "Bad copies value %d." msgstr "Chybný počet kopií %d." msgid "Bad custom parameter" msgstr "Chybný uživatelský parametr" #, c-format msgid "Bad device-uri \"%s\"." msgstr "" #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "" #, c-format msgid "Bad document-format \"%s\"." msgstr "" #, c-format msgid "Bad document-format-default \"%s\"." msgstr "" msgid "Bad filename buffer" msgstr "" msgid "Bad hostname/address in URI" msgstr "" #, c-format msgid "Bad job-name value: %s" msgstr "" msgid "Bad job-name value: Wrong type or count." msgstr "" msgid "Bad job-priority value." msgstr "" #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "" msgid "Bad job-sheets value type." msgstr "" msgid "Bad job-state value." msgstr "" #, c-format msgid "Bad job-uri \"%s\"." msgstr "" #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "" #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "" #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Chybná hodnota %d." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Chybný rozsah stránek %d-%d." msgid "Bad port number in URI" msgstr "" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "" #, c-format msgid "Bad printer-state value %d." msgstr "" msgid "Bad printer-uri." msgstr "" #, c-format msgid "Bad request ID %d." msgstr "" #, c-format msgid "Bad request version number %d.%d." msgstr "" msgid "Bad resource in URI" msgstr "" msgid "Bad scheme in URI" msgstr "" msgid "Bad username in URI" msgstr "" msgid "Bad value string" msgstr "" msgid "Bad/empty URI" msgstr "" msgid "Banners" msgstr "Banery" msgid "Bond Paper" msgstr "Kancelářský papír" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "" msgid "Buffer overflow detected, aborting." msgstr "" msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "Tiskárna štítků CPCL" msgid "Cancel Jobs" msgstr "" msgid "Canceling print job." msgstr "" msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "" msgid "Cassette" msgstr "" msgid "Change Settings" msgstr "Změna nastavení" #, c-format msgid "Character set \"%s\" not supported." msgstr "" msgid "Classes" msgstr "Třídy" msgid "Clean Print Heads" msgstr "Vyčištění tiskových hlav" msgid "Close-Job doesn't support the job-uri attribute." msgstr "" msgid "Color" msgstr "Barva" msgid "Color Mode" msgstr "Barevný režim" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" msgid "Community name uses indefinite length" msgstr "\"Community-Name\" má neomezenou délku" msgid "Connected to printer." msgstr "" msgid "Connecting to printer." msgstr "" msgid "Continue" msgstr "Pokračovat" msgid "Continuous" msgstr "Souvislý" msgid "Control file sent successfully." msgstr "" msgid "Copying print data." msgstr "" msgid "Created" msgstr "Vytvořeno" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Uživatelský" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Snížit" msgid "Cutter" msgstr "Výstřižek" msgid "Dark" msgstr "Tmavý" msgid "Darkness" msgstr "Tma" msgid "Data file sent successfully." msgstr "" msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Výmaz třídy" msgid "Delete Printer" msgstr "Výmaz tiskárny" msgid "DeskJet Series" msgstr "Řada DeskJet" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "Zařízení \"%s\" nepřijímá úlohy." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" msgid "Direct Thermal Media" msgstr "Termální médium" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "" #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" #, c-format msgid "Directory \"%s\" is a file." msgstr "" #, c-format msgid "Directory \"%s\" not available: %s" msgstr "" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" msgid "Disabled" msgstr "Zakázaný" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "" msgid "Draft" msgstr "" msgid "Duplexer" msgstr "Duplexní jednotka" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Tiskárna štítků EPL1" msgid "EPL2 Label Printer" msgstr "Tiskárna štítků EPL2" msgid "Edit Configuration File" msgstr "Úprava konfiguračního souboru" msgid "Encryption is not supported." msgstr "" #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Ukončení baneru" msgid "English" msgstr "Čeština" 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 "" "Zadejte své uživatelské jméno a heslo, nebo uživatelské jméno a heslo " "administrátora pro přístup na tuto stránku. Pokud používáte ověřování " "Kerberos, ujistěte se, že máte platný ticket Kerberosu." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "" msgid "Envelope #12" msgstr "" msgid "Envelope #14" msgstr "" msgid "Envelope #9" msgstr "" msgid "Envelope B4" msgstr "" msgid "Envelope B5" msgstr "" msgid "Envelope B6" msgstr "" msgid "Envelope C0" msgstr "" msgid "Envelope C1" msgstr "" msgid "Envelope C2" msgstr "" msgid "Envelope C3" msgstr "" msgid "Envelope C4" msgstr "" msgid "Envelope C5" msgstr "" msgid "Envelope C6" msgstr "" msgid "Envelope C65" msgstr "" msgid "Envelope C7" msgstr "" msgid "Envelope Choukei 3" msgstr "" msgid "Envelope Choukei 3 Long Edge" msgstr "" msgid "Envelope Choukei 4" msgstr "" msgid "Envelope Choukei 4 Long Edge" msgstr "" msgid "Envelope DL" msgstr "" msgid "Envelope Feed" msgstr "Podavač obálek" msgid "Envelope Invite" msgstr "" msgid "Envelope Italian" msgstr "" msgid "Envelope Kaku2" msgstr "" msgid "Envelope Kaku2 Long Edge" msgstr "" msgid "Envelope Kaku3" msgstr "" msgid "Envelope Kaku3 Long Edge" msgstr "" msgid "Envelope Monarch" msgstr "" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "" msgid "Envelope PRC10" msgstr "" msgid "Envelope PRC10 Long Edge" msgstr "" msgid "Envelope PRC2" msgstr "" msgid "Envelope PRC2 Long Edge" msgstr "" msgid "Envelope PRC3" msgstr "" msgid "Envelope PRC3 Long Edge" msgstr "" msgid "Envelope PRC4" msgstr "" msgid "Envelope PRC4 Long Edge" msgstr "" msgid "Envelope PRC5 Long Edge" msgstr "" msgid "Envelope PRC5PRC5" msgstr "" msgid "Envelope PRC6" msgstr "" msgid "Envelope PRC6 Long Edge" msgstr "" msgid "Envelope PRC7" msgstr "" msgid "Envelope PRC7 Long Edge" msgstr "" msgid "Envelope PRC8" msgstr "" msgid "Envelope PRC8 Long Edge" msgstr "" msgid "Envelope PRC9" msgstr "" msgid "Envelope PRC9 Long Edge" msgstr "" msgid "Envelope Personal" msgstr "" msgid "Envelope You4" msgstr "" msgid "Envelope You4 Long Edge" msgstr "" msgid "Environment Variables:" msgstr "" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Chování při chybě" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "" msgid "Error: need hostname after \"-h\" option." msgstr "" msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Každých 10 štítků" msgid "Every 2 Labels" msgstr "Každé 2 štítky" msgid "Every 3 Labels" msgstr "Každé 3 štítky" msgid "Every 4 Labels" msgstr "Každé 4 štítky" msgid "Every 5 Labels" msgstr "Každých 5 štítků" msgid "Every 6 Labels" msgstr "Každých 6 štítků" msgid "Every 7 Labels" msgstr "Každých 7 štítků" msgid "Every 8 Labels" msgstr "Každých 8 štítků" msgid "Every 9 Labels" msgstr "Každých 9 štítků" msgid "Every Label" msgstr "Každý štítek" msgid "Executive" msgstr "" msgid "Expectation Failed" msgstr "Očekávané údaje jsou neplatné" msgid "Expressions:" msgstr "" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "" #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" #, c-format msgid "File \"%s\" is a directory." msgstr "" #, c-format msgid "File \"%s\" not available: %s" msgstr "" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" #, c-format msgid "Finished page %d." msgstr "" msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Fólie" msgid "Forbidden" msgstr "Zakázaný" msgid "Found" msgstr "" msgid "General" msgstr "Obecný" msgid "Generic" msgstr "Obecný" msgid "Get-Response-PDU uses indefinite length" msgstr "\"Get-Response-PDU\" má neomezenou délku" msgid "Glossy Paper" msgstr "Lesklý papír" msgid "Got a printer-uri attribute but no job-id." msgstr "" msgid "Grayscale" msgstr "Stupně šedi" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Závěsná složka" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "" msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "" msgid "IPP attribute has no name." msgstr "" msgid "IPP attribute is not a member of the message." msgstr "" msgid "IPP begCollection value not 0 bytes." msgstr "" msgid "IPP boolean value not 1 byte." msgstr "" msgid "IPP date value not 11 bytes." msgstr "" msgid "IPP endCollection value not 0 bytes." msgstr "" msgid "IPP enum value not 4 bytes." msgstr "" msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "" msgid "IPP integer value not 4 bytes." msgstr "" msgid "IPP language length overflows value." msgstr "" msgid "IPP language length too large." msgstr "" msgid "IPP member name is not empty." msgstr "" msgid "IPP memberName value is empty." msgstr "" msgid "IPP memberName with no attribute." msgstr "" msgid "IPP name larger than 32767 bytes." msgstr "" msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "" msgid "IPP octetString length too large." msgstr "" msgid "IPP rangeOfInteger value not 8 bytes." msgstr "" msgid "IPP resolution value not 9 bytes." msgstr "" msgid "IPP string length overflows value." msgstr "" msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "" msgid "IPP value larger than 32767 bytes." msgstr "" msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Neplatný řídící znak" msgid "Illegal main keyword string" msgstr "Neplatné hlavní klíčové slovo řetězce" msgid "Illegal option keyword string" msgstr "Neplatná volba klíčového slova řetězce" msgid "Illegal translation string" msgstr "Neplatný překlad řetězce" msgid "Illegal whitespace character" msgstr "Nedovolený prázdný znak" msgid "Installable Options" msgstr "Možnosti instalace" msgid "Installed" msgstr "Instalovaný" msgid "IntelliBar Label Printer" msgstr "Tiskárna štítků \"IntelliBar\"" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "" msgid "Internal error" msgstr "Vniřní chyba" msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-Part" msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-Part" msgid "Internet Printing Protocol" msgstr "Internetový tiskový protokol" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "" msgid "Invalid media size." msgstr "" msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "" msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "" msgid "JIS B1" msgstr "" msgid "JIS B10" msgstr "" msgid "JIS B2" msgstr "" msgid "JIS B3" msgstr "" msgid "JIS B4" msgstr "" msgid "JIS B4 Long Edge" msgstr "" msgid "JIS B5" msgstr "" msgid "JIS B5 Long Edge" msgstr "" msgid "JIS B6" msgstr "" msgid "JIS B6 Long Edge" msgstr "" msgid "JIS B7" msgstr "" msgid "JIS B8" msgstr "" msgid "JIS B9" msgstr "" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "" #, c-format msgid "Job #%d does not exist." msgstr "" #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Úloha #%d je již zrušena - nelze zrušit." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Úloha #%d je již zrušena - nelze zrušit." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Úloha #%d je již dokončena - nelze zrušit." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "" #, c-format msgid "Job #%d is not complete." msgstr "" #, c-format msgid "Job #%d is not held for authentication." msgstr "" #, c-format msgid "Job #%d is not held." msgstr "" msgid "Job Completed" msgstr "Úloha dokončena" msgid "Job Created" msgstr "Úloha vytvořena" msgid "Job Options Changed" msgstr "Změna parametrů úlohy" msgid "Job Stopped" msgstr "Úloha zastavena" msgid "Job is completed and cannot be changed." msgstr "Úloha je dokončena a nelze ji změnit." msgid "Job operation failed" msgstr "Úloha se nezdařila" msgid "Job state cannot be changed." msgstr "Stav úlohy nelze změnit." msgid "Job subscriptions cannot be renewed." msgstr "" msgid "Jobs" msgstr "Úlohy" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR hostitel nebo tiskárna" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Tiskárna štítků" msgid "Label Top" msgstr "Horní štítek" #, c-format msgid "Language \"%s\" not supported." msgstr "" msgid "Large Address" msgstr "Plná adresa" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Serie PCL 4/5" msgid "Letter Oversize" msgstr "" msgid "Letter Oversize Long Edge" msgstr "" msgid "Light" msgstr "Světlý" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Řádek je delší než maximální povolená velikost (255 znaků)" msgid "List Available Printers" msgstr "Seznam dostupných tiskáren" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "Delší okraj (na výšku)" msgid "Looking for printer." msgstr "" msgid "Manual Feed" msgstr "Ruční podávání" msgid "Media Size" msgstr "Velikost média" msgid "Media Source" msgstr "Zdroj média" msgid "Media Tracking" msgstr "Sledování média" msgid "Media Type" msgstr "Typ média" msgid "Medium" msgstr "Střední" msgid "Memory allocation error" msgstr "Chyba přidělení paměti" msgid "Missing CloseGroup" msgstr "" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Chybějící záhlaví PPD-Adobe-4.x" msgid "Missing asterisk in column 1" msgstr "Chybí hvězdička ve sloupci 1" msgid "Missing document-number attribute." msgstr "" msgid "Missing form variable" msgstr "" msgid "Missing last-document attribute in request." msgstr "" msgid "Missing media or media-col." msgstr "" msgid "Missing media-size in media-col." msgstr "" msgid "Missing notify-subscription-ids attribute." msgstr "" msgid "Missing option keyword" msgstr "" msgid "Missing requesting-user-name attribute." msgstr "" #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "" msgid "Missing resource in URI" msgstr "" msgid "Missing scheme in URI" msgstr "" msgid "Missing value string" msgstr "Chybí hodnota řetězce" msgid "Missing x-dimension in media-size." msgstr "" msgid "Missing y-dimension in media-size." msgstr "" #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" msgid "Modifiers:" msgstr "" msgid "Modify Class" msgstr "Úprava třídy" msgid "Modify Printer" msgstr "Úprava tiskárny" msgid "Move All Jobs" msgstr "Přesun všech úloh" msgid "Move Job" msgstr "Přesun úlohy" msgid "Moved Permanently" msgstr "Trvale přesunuto" msgid "NULL PPD file pointer" msgstr "Prázdný ukazatel PPD souboru" msgid "Name OID uses indefinite length" msgstr "Název \"OID\" má neomezenou délku" msgid "Nested classes are not allowed." msgstr "" msgid "Never" msgstr "Nikdy" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "Ne" msgid "No Content" msgstr "Žádný obsah" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "" msgid "No VarBind SEQUENCE" msgstr "Žádná VarBind SEQUENCE" msgid "No active connection" msgstr "Není aktivní spojení" msgid "No active connection." msgstr "" #, c-format msgid "No active jobs on %s." msgstr "" msgid "No attributes in request." msgstr "" msgid "No authentication information provided." msgstr "" msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Žádný název komunity" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "" msgid "No destinations added." msgstr "Zařízení nepřidáno." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" msgid "No error-index" msgstr "Žádný \"error-index\"" msgid "No error-status" msgstr "Žádný \"error-status\"" msgid "No file in print request." msgstr "" msgid "No modification time" msgstr "" msgid "No name OID" msgstr "Žádný název OID" msgid "No pages were found." msgstr "" msgid "No printer name" msgstr "" msgid "No printer-uri found" msgstr "" msgid "No printer-uri found for class" msgstr "" msgid "No printer-uri in request." msgstr "" msgid "No request URI." msgstr "" msgid "No request protocol version." msgstr "" msgid "No request sent." msgstr "" msgid "No request-id" msgstr "Žádný ID požadavek" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "" msgid "No subscriptions found." msgstr "Nenalezeno předplatné." msgid "No variable-bindings SEQUENCE" msgstr "Žádná \"variable-bindings\" SEQUENCE" msgid "No version number" msgstr "Není číslo verze" msgid "Non-continuous (Mark sensing)" msgstr "Není souvislý (Mark Sensing)" msgid "Non-continuous (Web sensing)" msgstr "Není souvislý (Web Sensing)" msgid "None" msgstr "" msgid "Normal" msgstr "Normální" msgid "Not Found" msgstr "Nebyl nalezen" msgid "Not Implemented" msgstr "Nerealizováno" msgid "Not Installed" msgstr "Nenainstalováno" msgid "Not Modified" msgstr "Nezměněno" msgid "Not Supported" msgstr "Nepodporováno" msgid "Not allowed to print." msgstr "Není povoleno tisknout." msgid "Note" msgstr "Poznámka" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Vypnuto (jednostranný)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Nápověda" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "Otevření %s selhalo: %s" msgid "OpenGroup without a CloseGroup first" msgstr "Opengroup nepředcházelo CloseGroup" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI nepředcházelo CloseUI/JCLCloseUI" msgid "Operation Policy" msgstr "Způsob ověření" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "" msgid "Options Installed" msgstr "Instalované možnosti" msgid "Options:" msgstr "" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "" msgid "Out of memory." msgstr "" msgid "Output Mode" msgstr "Výstupní režim" msgid "PCL Laser Printer" msgstr "PCL laserová tiskárna" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "" msgid "PRC32K Oversize" msgstr "" msgid "PRC32K Oversize Long Edge" msgstr "" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "Packet neobsahuje \"Get-Response-PDU\"" msgid "Packet does not start with SEQUENCE" msgstr "Paket nezačíná SEQUENCÍ" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Heslo pro %s na %s? " msgid "Pause Class" msgstr "Pozastavení třídy" msgid "Pause Printer" msgstr "Pozastavení tiskárny" msgid "Peel-Off" msgstr "Peel-Off" msgid "Photo" msgstr "Fotografie" msgid "Photo Labels" msgstr "Foto-samolepky" msgid "Plain Paper" msgstr "Obyčejný papír" msgid "Policies" msgstr "Pravidla" msgid "Port Monitor" msgstr "Monitorování portu" msgid "PostScript Printer" msgstr "PostScriptová tiskárna" msgid "Postcard" msgstr "Pohlednice" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "" msgid "Postcard Long Edge" msgstr "" msgid "Preparing to print." msgstr "" msgid "Print Density" msgstr "Hustota tisku" msgid "Print Job:" msgstr "Tisk úlohy:" msgid "Print Mode" msgstr "Režim tisku" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "Kvalita tisku" msgid "Print Self-Test Page" msgstr "Tisk \"self-test\" stránky" msgid "Print Speed" msgstr "Rychlost tisku" msgid "Print Test Page" msgstr "Tisk zkušební stránky" msgid "Print and Cut" msgstr "Tisk a vyjmout" msgid "Print and Tear" msgstr "Tisk a odtrhnout" msgid "Print file sent." msgstr "" msgid "Print job canceled at printer." msgstr "" msgid "Print job too large." msgstr "" msgid "Print job was not accepted." msgstr "" #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "Tiskárna přidána" msgid "Printer Default" msgstr "Výchozí tiskárna" msgid "Printer Deleted" msgstr "Tiskárna vymazána" msgid "Printer Modified" msgstr "Tiskárna upravena" msgid "Printer Paused" msgstr "Tiskárna zastavena" msgid "Printer Settings" msgstr "Nastavení tiskárny" msgid "Printer cannot print supplied content." msgstr "" msgid "Printer cannot print with supplied options." msgstr "" msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Tiskárna:" msgid "Printers" msgstr "Tiskárny" #, c-format msgid "Printing page %d, %u%% complete." msgstr "" msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "Kvóta byla překročena." msgid "Rank Owner Job File(s) Total Size" msgstr "" msgid "Reject Jobs" msgstr "Odmítnutí úloh" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "" #, c-format msgid "Remote host did not accept data file (%d)." msgstr "" msgid "Reprint After Error" msgstr "Opakovat tisk po chybě" msgid "Request Entity Too Large" msgstr "Dotaz Entity je příliš dlouhý" msgid "Resolution" msgstr "Rozlišení" msgid "Resume Class" msgstr "Obnovení třídy" msgid "Resume Printer" msgstr "Obnovení tiskárny" msgid "Return Address" msgstr "Návrat adresy" msgid "Rewind" msgstr "Přetočit" msgid "SEQUENCE uses indefinite length" msgstr "\"SEQUENCE\" má neomezenou délku" msgid "SSL/TLS Negotiation Error" msgstr "" msgid "See Other" msgstr "Viz další" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "" msgid "Server Restarted" msgstr "Restart serveru" msgid "Server Security Auditing" msgstr "Audit bezpečnosti serveru" msgid "Server Started" msgstr "Start serveru" msgid "Server Stopped" msgstr "Zastavení serveru" msgid "Server credentials not set." msgstr "" msgid "Service Unavailable" msgstr "Služba je nedostupná" msgid "Set Allowed Users" msgstr "Nastavení přístupu uživatelů" msgid "Set As Server Default" msgstr "Nastavení jako výchozí na serveru" msgid "Set Class Options" msgstr "Nastavení parametrů třídy" msgid "Set Printer Options" msgstr "Nastavení parametrů tiskárny" msgid "Set Publishing" msgstr "Nastavení vydávání" msgid "Shipping Address" msgstr "Doručovací adresa" msgid "Short-Edge (Landscape)" msgstr "Kratší okraj (na šířku)" msgid "Special Paper" msgstr "Speciální papír" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "" msgid "Standard" msgstr "Standardní" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Spuštění baneru" #, c-format msgid "Starting page %d." msgstr "" msgid "Statement" msgstr "Prohlášení" #, c-format msgid "Subscription #%d does not exist." msgstr "" msgid "Substitutions:" msgstr "" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Protokol výměny" msgid "Tabloid" msgstr "Tabloid" msgid "Tabloid Oversize" msgstr "" msgid "Tabloid Oversize Long Edge" msgstr "" msgid "Tear" msgstr "Odtrhnout" msgid "Tear-Off" msgstr "Odtrhnout" msgid "Tear-Off Adjust Position" msgstr "Nastavení pozice odtržení" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "" #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "" #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "Soubor PPD \"%s\" nelze nalézt." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "Soubor PPD \"%s\" nelze otevřít: %s" msgid "The PPD file could not be opened." msgstr "" msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "Název třídy může obsahovat až 127 tisknutelných znaků a nesmí obsahovat " "mezery, lomítka (/), nebo křížek (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "Atribut \"notify-lease-duration\" nelze použít s přihlášenou úlohou." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "" msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" msgid "The printer did not respond." msgstr "" msgid "The printer is in use." msgstr "" msgid "The printer is not connected." msgstr "" msgid "The printer is not responding." msgstr "" msgid "The printer is now connected." msgstr "" msgid "The printer is now online." msgstr "" msgid "The printer is offline." msgstr "" msgid "The printer is unreachable at this time." msgstr "" msgid "The printer may not exist or is unavailable at this time." 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 "" msgid "The printer or class does not exist." msgstr "" msgid "The printer or class is not shared." msgstr "" #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "Tiskárna-URI \"%s\" obsahuje neplatné znaky." msgid "The printer-uri attribute is required." msgstr "" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/classes/CLASSNAME\"." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "" msgid "There are too many subscriptions." msgstr "Existuje příliš mnoho předplatných." msgid "There was an unrecoverable USB error." msgstr "" msgid "Thermal Transfer Media" msgstr "Termální tisková média" msgid "Too many active jobs." msgstr "Příliš mnoho aktivních úloh." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "" #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "" msgid "Transparency" msgstr "Průhlednost" msgid "Tray" msgstr "Podavač" msgid "Tray 1" msgstr "Podavač 1" msgid "Tray 2" msgstr "Podavač 2" msgid "Tray 3" msgstr "Podavač 3" msgid "Tray 4" msgstr "Podavač 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "URI je příliš dlouhá" msgid "URI too large" msgstr "" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "" msgid "US Letter Oversize" msgstr "" msgid "US Letter Oversize Long Edge" msgstr "" msgid "US Letter Small" msgstr "" msgid "Unable to access cupsd.conf file" msgstr "Nelze získat přístup k souboru \"cupsd.conf\"" msgid "Unable to access help file." msgstr "" msgid "Unable to add class" msgstr "Nelze přidat třídu" msgid "Unable to add document to print job." msgstr "" #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "" msgid "Unable to add printer" msgstr "Nelze přidat tiskárnu" msgid "Unable to allocate memory for file types." msgstr "" msgid "Unable to allocate memory for page info" msgstr "" msgid "Unable to allocate memory for pages array" msgstr "" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "" msgid "Unable to change printer" msgstr "Nelze změnit tiskárnu" msgid "Unable to change printer-is-shared attribute" msgstr "Nelze změnit atribut \"sdílení tiskárny\"" msgid "Unable to change server settings" msgstr "Nelze změnit nastavení serveru" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" msgid "Unable to configure printer options." msgstr "" msgid "Unable to connect to host." msgstr "Nelze se připojit k hostiteli." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" #, c-format msgid "Unable to copy PPD file - %s" msgstr "" msgid "Unable to copy PPD file." msgstr "" msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "" msgid "Unable to delete class" msgstr "Nelze vymazat třídu" msgid "Unable to delete printer" msgstr "Nelze vymazat tiskárnu" msgid "Unable to do maintenance command" msgstr "Nelze provést příkaz údržby" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" msgid "Unable to establish a secure connection to host." msgstr "" #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "" msgid "Unable to find printer." msgstr "" msgid "Unable to find server credentials." msgstr "" msgid "Unable to get backend exit status." msgstr "" msgid "Unable to get class list" msgstr "Nelze získat seznam tříd" msgid "Unable to get class status" msgstr "Nelze získat stav třídy" msgid "Unable to get list of printer drivers" msgstr "Nelze získat seznam ovladačů tiskárny" msgid "Unable to get printer attributes" msgstr "Nelze získat atributy tiskárny" msgid "Unable to get printer list" msgstr "Nelze získat seznam tiskáren" msgid "Unable to get printer status" msgstr "" msgid "Unable to get printer status." msgstr "Nelze získat stav tiskárny." msgid "Unable to load help index." msgstr "" #, c-format msgid "Unable to locate printer \"%s\"." msgstr "" msgid "Unable to locate printer." msgstr "" msgid "Unable to modify class" msgstr "Nelze změnit třídu" msgid "Unable to modify printer" msgstr "Nelze změnit tiskárnu" msgid "Unable to move job" msgstr "Nelze přesunout úlohu" msgid "Unable to move jobs" msgstr "Nelze přesunout úlohy" msgid "Unable to open PPD file" msgstr "Nelze otevřít PPD soubor" msgid "Unable to open cupsd.conf file:" msgstr "Nelze otevřít soubor \"cupsd.conf\":" msgid "Unable to open device file" msgstr "" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "" msgid "Unable to open help file." msgstr "" msgid "Unable to open print file" msgstr "" msgid "Unable to open raster file" msgstr "" msgid "Unable to print test page" msgstr "Nelze vytisknout zkušební stránku" msgid "Unable to read print data." msgstr "" #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "" msgid "Unable to see in file" msgstr "" msgid "Unable to send command to printer driver" msgstr "" msgid "Unable to send data to printer." msgstr "" msgid "Unable to set options" msgstr "Nelze nastavit parametry" msgid "Unable to set server default" msgstr "Nelze nastavit výchozí server" msgid "Unable to start backend process." msgstr "" msgid "Unable to upload cupsd.conf file" msgstr "Nelze nahrát soubor \"cupsd.conf\"" msgid "Unable to use legacy USB class driver." msgstr "" msgid "Unable to write print data" msgstr "" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "" msgid "Unauthorized" msgstr "Nepovolený" msgid "Units" msgstr "Jednotky" msgid "Unknown" msgstr "Neznámý" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "" #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "" #, c-format msgid "Unknown file order: \"%s\"." msgstr "" #, c-format msgid "Unknown format character: \"%c\"." msgstr "" msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "" #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "" #, c-format msgid "Unknown option \"%s\"." msgstr "" #, c-format msgid "Unknown print mode: \"%s\"." msgstr "" #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "Neznámá printer-error-policy „%s“." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "Neznámá printer-op-policy „%s“." msgid "Unknown request method." msgstr "" msgid "Unknown request version." msgstr "" msgid "Unknown scheme in URI" msgstr "" msgid "Unknown service name." msgstr "" #, c-format msgid "Unknown version option value: \"%s\"." msgstr "" #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "" #, c-format msgid "Unsupported character set \"%s\"." msgstr "" #, c-format msgid "Unsupported compression \"%s\"." msgstr "" #, c-format msgid "Unsupported document-format \"%s\"." msgstr "" #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "" #, c-format msgid "Unsupported format \"%s\"." msgstr "" msgid "Unsupported margins." msgstr "" msgid "Unsupported media value." msgstr "" #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "" #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" msgid "Unsupported raster data." msgstr "" msgid "Unsupported value type" msgstr "Nepodporovaný typ hodnoty" msgid "Upgrade Required" msgstr "Povinné aktualizace" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" msgid "Usage: cupsd [options]" msgstr "" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" msgid "Usage: snmp [host-or-ip-address]" msgstr "" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Hodnota má neomezenou délku" msgid "VarBind uses indefinite length" msgstr "VarBind má neomezenou délku" msgid "Version uses indefinite length" msgstr "Version má neomezenou délku" msgid "Waiting for job to complete." msgstr "" msgid "Waiting for printer to become available." msgstr "" msgid "Waiting for printer to finish." msgstr "" msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "" msgid "Yes" msgstr "Ano" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Pro přístup k této stránce, použijte adresu URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Tiskárna štítků ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "zrušeno" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "zrušeno" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "dokončeno" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "Nepodařilo se spustit \"cups-deviced\"." msgid "cups-driverd failed to execute." msgstr "Nepodařilo se spustit \"cups-driverd\"." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" msgid "cupsd: Unable to get current directory." msgstr "" msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "" #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "" #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "" #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "" msgid "cupsfilter: Only one filename can be specified." msgstr "" #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "" msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "" #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "" #, c-format msgid "device for %s: %s" msgstr "" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "\"error-index\" má neomezenou délku" msgid "error-status uses indefinite length" msgstr "\"error-status\" má neomezenou délku" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "pozastaveno" msgid "help\t\tGet help on commands." msgstr "" msgid "idle" msgstr "čeká" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" msgid "ippfind: Cannot use --and after --or." msgstr "" #, c-format msgid "ippfind: Expected key name after %s." msgstr "" #, c-format msgid "ippfind: Expected port range after %s." msgstr "" #, c-format msgid "ippfind: Expected program after %s." msgstr "" #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" msgid "ippfind: Missing close brace in substitution." msgstr "" msgid "ippfind: Missing close parenthesis." msgstr "" msgid "ippfind: Missing expression before \"--and\"." msgstr "" msgid "ippfind: Missing expression before \"--or\"." msgstr "" #, c-format msgid "ippfind: Missing key name after %s." msgstr "" #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "" #, c-format msgid "ippfind: Missing program after %s." msgstr "" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" msgid "ippfind: Out of memory." msgstr "" msgid "ippfind: Too many parenthesis." msgstr "" #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" msgid "ipptool: May only specify a single URI." msgstr "" msgid "ipptool: Missing count for \"-n\"." msgstr "" msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "" msgid "ipptool: Missing name=value for \"-d\"." msgstr "" msgid "ipptool: Missing seconds for \"-i\"." msgstr "" msgid "ipptool: URI required before test file." msgstr "" #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "" #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "" #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" msgid "lpadmin: Expected class after \"-r\" option." msgstr "" msgid "lpadmin: Expected class name after \"-c\" option." msgstr "" msgid "lpadmin: Expected description after \"-D\" option." msgstr "" msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "" msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "" msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "" msgid "lpadmin: Expected location after \"-L\" option." msgstr "" msgid "lpadmin: Expected model after \"-m\" option." msgstr "" msgid "lpadmin: Expected name after \"-R\" option." msgstr "" msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "" msgid "lpadmin: Expected printer after \"-p\" option." msgstr "" msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "" msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "" msgid "lpadmin: No member names were seen." msgstr "" #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "" #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "" msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "" msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "" msgid "lpadmin: Unable to create temporary file" msgstr "" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "" #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "" #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "" msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "" msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" msgid "lpinfo: Expected language after \"--language\"." msgstr "" msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" msgid "lpinfo: Expected product string after \"--product\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "" msgid "lpoptions: No printers." msgstr "" #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "" msgid "lpoptions: Unknown printer or class." msgstr "" #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "" msgid "no system default destination" msgstr "" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "" #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "nevyřízený" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "" #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "" #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "" #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "" #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Writing %s." msgstr "" #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "" #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "" #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "" #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "zpracování" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "" msgid "request-id uses indefinite length" msgstr "ID požadavku má neomezenou délku" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "" msgid "scheduler is running" msgstr "" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "stav %s selhalo: %s" msgid "status\t\tShow status of daemon and queue." msgstr "" #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "zastaveno" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "" #, c-format msgid "system default destination: %s/%s" msgstr "" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "neznámý" msgid "untitled" msgstr "nepojmenovaný" msgid "variable-bindings uses indefinite length" msgstr "\"variable-bindings\" má neomezenou délku" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "Export Printers to Samba" #~ msgstr "Export tiskáren do Samby" cups-2.3.1/locale/cups_en.po000664 000765 000024 00001354207 13574721672 016046 0ustar00mikestaff000000 000000 # # English message catalog for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # # Notes for Translators: # # The "checkpo" program located in the "locale" source directory can be used # to verify that your translations do not introduce formatting errors or other # problems. Run with: # # cd locale # ./checkpo cups_LL.po # # where "LL" is your locale. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: CUPS 2.3.0\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\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 \n" "Language-Team: English\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(all)" msgid "\t\t(none)" msgstr "\t\t(none)" #, c-format msgid "\t%d entries" msgstr "\t%d entries" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tAfter fault: continue" #, c-format msgid "\tAlerts: %s" msgstr "\tAlerts: %s" msgid "\tBanner required" msgstr "\tBanner required" msgid "\tCharset sets:" msgstr "\tCharset sets:" msgid "\tConnection: direct" msgstr "\tConnection: direct" msgid "\tConnection: remote" msgstr "\tConnection: remote" msgid "\tContent types: any" msgstr "\tContent types: any" msgid "\tDefault page size:" msgstr "\tDefault page size:" msgid "\tDefault pitch:" msgstr "\tDefault pitch:" msgid "\tDefault port settings:" msgstr "\tDefault port settings:" #, c-format msgid "\tDescription: %s" msgstr "\tDescription: %s" msgid "\tForm mounted:" msgstr "\tForm mounted:" msgid "\tForms allowed:" msgstr "\tForms allowed:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tInterface: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tInterface: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tLocation: %s" msgid "\tOn fault: no alert" msgstr "\tOn fault: no alert" msgid "\tPrinter types: unknown" msgstr "\tPrinter types: unknown" #, c-format msgid "\tStatus: %s" msgstr "\tStatus: %s" msgid "\tUsers allowed:" msgstr "\tUsers allowed:" msgid "\tUsers denied:" msgstr "\tUsers denied:" msgid "\tdaemon present" msgstr "\tdaemon present" msgid "\tno entries" msgstr "\tno entries" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tprinter is on device '%s' speed -1" msgid "\tprinting is disabled" msgstr "\tprinting is disabled" msgid "\tprinting is enabled" msgstr "\tprinting is enabled" #, c-format msgid "\tqueued for %s" msgstr "\tqueued for %s" msgid "\tqueuing is disabled" msgstr "\tqueuing is disabled" msgid "\tqueuing is enabled" msgstr "\tqueuing is enabled" msgid "\treason unknown" msgstr "\treason unknown" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgid " REF: Page 15, section 3.1." msgstr " REF: Page 15, section 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Page 15, section 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Page 19, section 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Page 20, section 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Page 27, section 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Page 42, section 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Pages 16-17, section 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Pages 42-45, section 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Pages 45-46, section 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Pages 48-49, section 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Pages 52-54, section 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f bytes" #, c-format msgid " PASS Default%s" msgstr " PASS Default%s" msgid " PASS DefaultImageableArea" msgstr " PASS DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " PASS DefaultPaperDimension" msgid " PASS FileVersion" msgstr " PASS FileVersion" msgid " PASS FormatVersion" msgstr " PASS FormatVersion" msgid " PASS LanguageEncoding" msgstr " PASS LanguageEncoding" msgid " PASS LanguageVersion" msgstr " PASS LanguageVersion" msgid " PASS Manufacturer" msgstr " PASS Manufacturer" msgid " PASS ModelName" msgstr " PASS ModelName" msgid " PASS NickName" msgstr " PASS NickName" msgid " PASS PCFileName" msgstr " PASS PCFileName" msgid " PASS PSVersion" msgstr " PASS PSVersion" msgid " PASS PageRegion" msgstr " PASS PageRegion" msgid " PASS PageSize" msgstr " PASS PageSize" msgid " PASS Product" msgstr " PASS Product" msgid " PASS ShortNickName" msgstr " PASS ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " WARN %s has no corresponding options." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr " WARN File contains a mix of CR, LF, and CR LF line endings." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " WARN Line %d only contains whitespace." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s does not exist." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s file \"%s\" has the wrong capitalization." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %s Bad UTF-8 \"%s\" translation string for option %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s Bad cupsFilter value \"%s\"." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s Bad cupsFilter2 value \"%s\"." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s Bad cupsICCProfile %s." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s Bad cupsPreFilter value \"%s\"." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s Bad cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s Bad language \"%s\"." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s Bad permissions on %s file \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s Bad spelling of %s - should be %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr " %s Cannot provide both APScanAppPath and APScanAppBundleID." #, c-format msgid " %s Default choices conflicting." msgstr " %s Default choices conflicting." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s Empty cupsUIConstraints %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr " %s Missing \"%s\" translation string for option %s, choice %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s Missing \"%s\" translation string for option %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s Missing %s file \"%s\"." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s Missing cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Missing option %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s No base translation \"%s\" is included in file." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %s Size \"%s\" defined for %s but not for %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s Size \"%s\" has unexpected dimensions (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s Size \"%s\" should be \"%s\"." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr " %s Size \"%s\" should be the Adobe standard name \"%s\"." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s cupsICCProfile %s hash value collides with %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s causes a loop." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" " %s cupsUIResolver %s does not list at least two different options." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr " **FAIL** Bad LanguageVersion %s - must be English." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr " **FAIL** Default option code cannot be interpreted: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr " **FAIL** Group names %s and %s differ only by case." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr " **FAIL** Multiple occurrences of option %s choice name %s." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr " **FAIL** Option %s choice names %s and %s differ only by case." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr " **FAIL** Option names %s and %s differ only by case." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr " **FAIL** Unable to open PPD file - %s on line %d." #, c-format msgid " %d ERRORS FOUND" msgstr " %d ERRORS FOUND" msgid " NO ERRORS FOUND" msgstr " NO ERRORS FOUND" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr End lines with CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf End lines with CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr " --lf End lines with LF (UNIX/Linux/macOS)." msgid " --list-filters List filters that will be used." msgstr " --list-filters List filters that will be used." msgid " -D Remove the input file when finished." msgstr " -D Remove the input file when finished." msgid " -D name=value Set named variable to value." msgstr " -D name=value Set named variable to value." msgid " -I include-dir Add include directory to search path." msgstr " -I include-dir Add include directory to search path." msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd Set PPD file." msgid " -U username Specify username." msgstr " -U username Specify username." msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalog.po Load the specified message catalog." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c cups-files.conf Set cups-files.conf file to use." msgid " -d output-dir Specify the output directory." msgstr " -d output-dir Specify the output directory." msgid " -d printer Use the named printer." msgstr " -d printer Use the named printer." msgid " -e Use every filter from the PPD file." msgstr " -e Use every filter from the PPD file." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr " -i mime/type Set input MIME type (otherwise auto-typed)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] Specify the output language(s) (locale)." msgid " -m Use the ModelName value as the filename." msgstr " -m Use the ModelName value as the filename." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgid " -n copies Set number of copies." msgstr " -n copies Set number of copies." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgid " -o name=value Set option(s)." msgstr " -o name=value Set option(s)." msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd Set PPD file." msgid " -t Test PPDs instead of generating them." msgstr " -t Test PPDs instead of generating them." msgid " -t title Set title." msgstr " -t title Set title." msgid " -u Remove the PPD file when finished." msgstr " -u Remove the PPD file when finished." msgid " -v Be verbose." msgstr " -v Be verbose." msgid " -z Compress PPD files using GNU zip." msgstr " -z Compress PPD files using GNU zip." msgid " FAIL" msgstr " FAIL" msgid " PASS" msgstr " PASS" msgid "! expression Unary NOT of expression" msgstr "! expression Unary NOT of expression" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgid "\"requesting-user-name\" attribute in wrong group." msgstr "\"requesting-user-name\" attribute in wrong group." msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "\"requesting-user-name\" attribute with wrong syntax." #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes" #, c-format msgid "%d x %d mm" msgstr "%d x %d mm" #, c-format msgid "%g x %g \"" msgstr "%g x %g \"" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (Borderless)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (Borderless, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (Borderless, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s accepting requests since %s" #, c-format msgid "%s cannot be changed." msgstr "%s cannot be changed." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s is not implemented by the CUPS version of lpc." #, c-format msgid "%s is not ready" msgstr "%s is not ready" #, c-format msgid "%s is ready" msgstr "%s is ready" #, c-format msgid "%s is ready and printing" msgstr "%s is ready and printing" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s job-id user title copies options [file]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s not accepting requests since %s -" #, c-format msgid "%s not supported." msgstr "%s not supported." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s accepting requests since %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s not accepting requests since %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [job %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s failed: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s: Bad printer URI \"%s\"." #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: Bad version %s for \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: Don't know what to do." #, c-format msgid "%s: Error - %s" msgstr "%s: Error - %s" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: Error - %s environment variable names non-existent destination \"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Error - add '/version=1.1' to server name." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: Error - bad job ID." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "%s: Error - cannot print files and alter jobs simultaneously." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "%s: Error - cannot print from stdin if files or a job ID are provided." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "%s: Error - copies must be 1 or more." #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Error - expected character set after \"-S\" option." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: Error - expected content type after \"-T\" option." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: Error - expected copies after \"-#\" option." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: Error - expected copies after \"-n\" option." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Error - expected destination after \"-P\" option." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: Error - expected destination after \"-d\" option." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Error - expected form after \"-f\" option." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Error - expected hold name after \"-H\" option." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: Error - expected hostname after \"-H\" option." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: Error - expected hostname after \"-h\" option." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Error - expected mode list after \"-y\" option." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: Error - expected name after \"-%c\" option." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Error - expected option=value after \"-o\" option." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: Error - expected page list after \"-P\" option." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Error - expected priority after \"-%c\" option." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: Error - expected reason text after \"-r\" option." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Error - expected title after \"-t\" option." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: Error - expected username after \"-U\" option." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: Error - expected username after \"-u\" option." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: Error - expected value after \"-%c\" option." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: Error - no default destination available." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: Error - priority must be between 1 and 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: Error - scheduler not responding." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: Error - too many files - \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: Error - unable to access \"%s\" - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: Error - unable to queue from stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: Error - unknown destination \"%s\"." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: Error - unknown destination \"%s/%s\"." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: Error - unknown option \"%c\"." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: Error - unknown option \"%s\"." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Expected job ID after \"-i\" option." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: Invalid destination name in list \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: Invalid filter string \"%s\"." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: Missing filename for \"-P\"." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: Missing timeout for \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: Missing version for \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: Need job ID (\"-i jobid\") before \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: No filter to convert from %s/%s to %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: Operation failed: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: Sorry, no encryption support." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s: Unable to connect to \"%s:%d\": %s" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: Unable to connect to server." #, c-format msgid "%s: Unable to contact server." msgstr "%s: Unable to contact server." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s: Unable to create PPD file: %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: Unable to determine MIME type of \"%s\"." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: Unable to open \"%s\": %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: Unable to open %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: Unable to open PPD file: %s on line %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "%s: Unable to query printer: %s" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: Unable to read MIME database from \"%s\" or \"%s\"." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s: Unable to resolve \"%s\"." #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "%s: Unknown argument \"%s\"." #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: Unknown destination \"%s\"." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: Unknown destination MIME type %s/%s." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: Unknown option \"%c\"." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: Unknown option \"%s\"." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: Unknown option \"-%c\"." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: Unknown source MIME type %s/%s." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: Warning - character set option ignored." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: Warning - content type option ignored." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: Warning - form option ignored." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Warning - mode option ignored." msgid "( expressions ) Group expressions" msgstr "( expressions ) Group expressions" msgid "- Cancel all jobs" msgstr "- Cancel all jobs" msgid "-# num-copies Specify the number of copies to print" msgstr "-# num-copies Specify the number of copies to print" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "--[no-]debug-logging Turn debug logging on/off" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "--[no-]remote-admin Turn remote administration on/off" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "--[no-]remote-any Allow/prevent access from the Internet" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "--[no-]share-printers Turn printer sharing on/off" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgid "--domain regex Match domain to regular expression" msgstr "--domain regex Match domain to regular expression" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" "--exec utility [argument ...] ;\n" " Execute program if true" msgid "--false Always false" msgstr "--false Always false" msgid "--help Show program help" msgstr "--help Show program help" msgid "--hold Hold new jobs" msgstr "--hold Hold new jobs" msgid "--host regex Match hostname to regular expression" msgstr "--host regex Match hostname to regular expression" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgid "--ippserver filename Produce ippserver attribute file" msgstr "--ippserver filename Produce ippserver attribute file" msgid "--language locale Show models matching the given locale" msgstr "--language locale Show models matching the given locale" msgid "--local True if service is local" msgstr "--local True if service is local" msgid "--ls List attributes" msgstr "--ls List attributes" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" "--make-and-model name Show models matching the given make and model name" msgid "--name regex Match service name to regular expression" msgstr "--name regex Match service name to regular expression" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "--no-web-forms Disable web forms for media and supplies" msgid "--not expression Unary NOT of expression" msgstr "--not expression Unary NOT of expression" msgid "--path regex Match resource path to regular expression" msgstr "--path regex Match resource path to regular expression" msgid "--port number[-number] Match port to number or range" msgstr "--port number[-number] Match port to number or range" msgid "--print Print URI if true" msgstr "--print Print URI if true" msgid "--print-name Print service name if true" msgstr "--print-name Print service name if true" msgid "" "--product name Show models matching the given PostScript product" msgstr "" "--product name Show models matching the given PostScript product" msgid "--quiet Quietly report match via exit code" msgstr "--quiet Quietly report match via exit code" msgid "--release Release previously held jobs" msgstr "--release Release previously held jobs" msgid "--remote True if service is remote" msgstr "--remote True if service is remote" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgid "--true Always true" msgstr "--true Always true" msgid "--txt key True if the TXT record contains the key" msgstr "--txt key True if the TXT record contains the key" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "--txt-* regex Match TXT record key to regular expression" msgid "--uri regex Match URI to regular expression" msgstr "--uri regex Match URI to regular expression" msgid "--version Show program version" msgstr "--version Show program version" msgid "--version Show version" msgstr "--version Show version" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "-2 Set 2-sided printing support (default=1-sided)" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "-4 Connect using IPv4" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "-6 Connect using IPv6" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "-C Send requests using chunking (default)" msgid "-D description Specify the textual description of the printer" msgstr "-D description Specify the textual description of the printer" msgid "-D device-uri Set the device URI for the printer" msgstr "-D device-uri Set the device URI for the printer" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" "-E Enable and accept jobs on the printer (after -p)" msgid "-E Encrypt the connection to the server" msgstr "-E Encrypt the connection to the server" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "-E Test with encryption using HTTP Upgrade to TLS" msgid "-F Run in the foreground but detach from console." msgstr "-F Run in the foreground but detach from console." msgid "-F output-type/subtype Set the output format for the printer" msgstr "-F output-type/subtype Set the output format for the printer" msgid "-H Show the default server and port" msgstr "-H Show the default server and port" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "-H HH:MM Hold the job until the specified UTC time" msgid "-H hold Hold the job until released/resumed" msgstr "-H hold Hold the job until released/resumed" msgid "-H immediate Print the job as soon as possible" msgstr "-H immediate Print the job as soon as possible" msgid "-H restart Reprint the job" msgstr "-H restart Reprint the job" msgid "-H resume Resume a held job" msgstr "-H resume Resume a held job" msgid "-H server[:port] Connect to the named server and port" msgstr "-H server[:port] Connect to the named server and port" msgid "-I Ignore errors" msgstr "-I Ignore errors" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" "-K keypath Set location of server X.509 certificates and keys." msgid "-L Send requests using content-length" msgstr "-L Send requests using content-length" msgid "-L location Specify the textual location of the printer" msgstr "-L location Specify the textual location of the printer" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "-M manufacturer Set manufacturer name (default=Test)" msgid "-P destination Show status for the specified destination" msgstr "-P destination Show status for the specified destination" msgid "-P destination Specify the destination" msgstr "-P destination Specify the destination" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "-P filename.ppd Load printer attributes from PPD file" msgid "-P number[-number] Match port to number or range" msgstr "-P number[-number] Match port to number or range" msgid "-P page-list Specify a list of pages to print" msgstr "-P page-list Specify a list of pages to print" msgid "-R Show the ranking of jobs" msgstr "-R Show the ranking of jobs" msgid "-R name-default Remove the default value for the named option" msgstr "-R name-default Remove the default value for the named option" msgid "-R root-directory Set alternate root" msgstr "-R root-directory Set alternate root" msgid "-S Test with encryption using HTTPS" msgstr "-S Test with encryption using HTTPS" msgid "-T seconds Set the browse timeout in seconds" msgstr "-T seconds Set the browse timeout in seconds" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "-T seconds Set the receive/send timeout in seconds" msgid "-T title Specify the job title" msgstr "-T title Specify the job title" msgid "-U username Specify the username to use for authentication" msgstr "-U username Specify the username to use for authentication" msgid "-U username Specify username to use for authentication" msgstr "-U username Specify username to use for authentication" msgid "-V version Set default IPP version" msgstr "-V version Set default IPP version" msgid "-W completed Show completed jobs" msgstr "-W completed Show completed jobs" msgid "-W not-completed Show pending jobs" msgstr "-W not-completed Show pending jobs" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgid "-X Produce XML plist instead of plain text" msgstr "-X Produce XML plist instead of plain text" msgid "-a Cancel all jobs" msgstr "-a Cancel all jobs" msgid "-a Show jobs on all destinations" msgstr "-a Show jobs on all destinations" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "-a [destination(s)] Show the accepting state of destinations" msgid "-a filename.conf Load printer attributes from conf file" msgstr "-a filename.conf Load printer attributes from conf file" msgid "-c Make a copy of the print file(s)" msgstr "-c Make a copy of the print file(s)" msgid "-c Produce CSV output" msgstr "-c Produce CSV output" msgid "-c [class(es)] Show classes and their member printers" msgstr "-c [class(es)] Show classes and their member printers" msgid "-c class Add the named destination to a class" msgstr "-c class Add the named destination to a class" msgid "-c command Set print command" msgstr "-c command Set print command" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "-c cupsd.conf Set cupsd.conf file to use." msgid "-d Show the default destination" msgstr "-d Show the default destination" msgid "-d destination Set default destination" msgstr "-d destination Set default destination" msgid "-d destination Set the named destination as the server default" msgstr "" "-d destination Set the named destination as the server default" msgid "-d name=value Set named variable to value" msgstr "-d name=value Set named variable to value" msgid "-d regex Match domain to regular expression" msgstr "-d regex Match domain to regular expression" msgid "-d spool-directory Set spool directory" msgstr "-d spool-directory Set spool directory" msgid "-e Show available destinations on the network" msgstr "-e Show available destinations on the network" msgid "-f Run in the foreground." msgstr "-f Run in the foreground." msgid "-f filename Set default request filename" msgstr "-f filename Set default request filename" msgid "-f type/subtype[,...] Set supported file types" msgstr "-f type/subtype[,...] Set supported file types" msgid "-h Show this usage message." msgstr "-h Show this usage message." msgid "-h Validate HTTP response headers" msgstr "-h Validate HTTP response headers" msgid "-h regex Match hostname to regular expression" msgstr "-h regex Match hostname to regular expression" msgid "-h server[:port] Connect to the named server and port" msgstr "-h server[:port] Connect to the named server and port" msgid "-i iconfile.png Set icon file" msgstr "-i iconfile.png Set icon file" msgid "-i id Specify an existing job ID to modify" msgstr "-i id Specify an existing job ID to modify" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "-i ppd-file Specify a PPD file for the printer" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" "-i seconds Repeat the last file with the given time interval" msgid "-k Keep job spool files" msgstr "-k Keep job spool files" msgid "-l List attributes" msgstr "-l List attributes" msgid "-l Produce plain text output" msgstr "-l Produce plain text output" msgid "-l Run cupsd on demand." msgstr "-l Run cupsd on demand." msgid "-l Show supported options and values" msgstr "-l Show supported options and values" msgid "-l Show verbose (long) output" msgstr "-l Show verbose (long) output" msgid "-l location Set location of printer" msgstr "-l location Set location of printer" msgid "" "-m Send an email notification when the job completes" msgstr "" "-m Send an email notification when the job completes" msgid "-m Show models" msgstr "-m Show models" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgid "-m model Set model name (default=Printer)" msgstr "-m model Set model name (default=Printer)" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" "-m model Specify a standard model/PPD file for the printer" msgid "-n count Repeat the last file the given number of times" msgstr "-n count Repeat the last file the given number of times" msgid "-n hostname Set hostname for printer" msgstr "-n hostname Set hostname for printer" msgid "-n num-copies Specify the number of copies to print" msgstr "-n num-copies Specify the number of copies to print" msgid "-n regex Match service name to regular expression" msgstr "-n regex Match service name to regular expression" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" "-o Name=Value Specify the default value for the named PPD option " msgid "-o [destination(s)] Show jobs" msgstr "-o [destination(s)] Show jobs" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "-o job-page-limit=N Specify the page limit for per-user quotas" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "-o job-quota-period=N Specify the per-user quota period in seconds" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "-o job-sheets=standard Print a banner page with the job" msgid "-o media=size Specify the media size to use" msgstr "-o media=size Specify the media size to use" msgid "-o name-default=value Specify the default value for the named option" msgstr "-o name-default=value Specify the default value for the named option" msgid "-o name[=value] Set default option and value" msgstr "-o name[=value] Set default option and value" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgid "-o option[=value] Specify a printer-specific option" msgstr "-o option[=value] Specify a printer-specific option" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" "-o printer-is-shared=true\n" " Share the printer" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "-o sides=one-sided Specify 1-sided printing" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgid "-p Print URI if true" msgstr "-p Print URI if true" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "-p [printer(s)] Show the processing state of destinations" msgid "-p destination Specify a destination" msgstr "-p destination Specify a destination" msgid "-p destination Specify/add the named destination" msgstr "-p destination Specify/add the named destination" msgid "-p port Set port number for printer" msgstr "-p port Set port number for printer" msgid "-q Quietly report match via exit code" msgstr "-q Quietly report match via exit code" msgid "-q Run silently" msgstr "-q Run silently" msgid "-q Specify the job should be held for printing" msgstr "-q Specify the job should be held for printing" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" "-q priority Specify the priority from low (1) to high (100)" msgid "-r Remove the file(s) after submission" msgstr "-r Remove the file(s) after submission" msgid "-r Show whether the CUPS server is running" msgstr "-r Show whether the CUPS server is running" msgid "-r True if service is remote" msgstr "-r True if service is remote" msgid "-r Use 'relaxed' open mode" msgstr "-r Use 'relaxed' open mode" msgid "-r class Remove the named destination from a class" msgstr "-r class Remove the named destination from a class" msgid "-r reason Specify a reason message that others can see" msgstr "-r reason Specify a reason message that others can see" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "-r subtype,[subtype] Set DNS-SD service subtype" msgid "-s Be silent" msgstr "-s Be silent" msgid "-s Print service name if true" msgstr "-s Print service name if true" msgid "-s Show a status summary" msgstr "-s Show a status summary" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "-s cups-files.conf Set cups-files.conf file to use." msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "-s speed[,color-speed] Set speed in pages per minute" msgid "-t Produce a test report" msgstr "-t Produce a test report" msgid "-t Show all status information" msgstr "-t Show all status information" msgid "-t Test the configuration file." msgstr "-t Test the configuration file." msgid "-t key True if the TXT record contains the key" msgstr "-t key True if the TXT record contains the key" msgid "-t title Specify the job title" msgstr "-t title Specify the job title" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" "-u [user(s)] Show jobs queued by the current or specified users" msgid "-u allow:all Allow all users to print" msgstr "-u allow:all Allow all users to print" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" "-u allow:list Allow the list of users or groups (@name) to print" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" "-u deny:list Prevent the list of users or groups (@name) to print" msgid "-u owner Specify the owner to use for jobs" msgstr "-u owner Specify the owner to use for jobs" msgid "-u regex Match URI to regular expression" msgstr "-u regex Match URI to regular expression" msgid "-v Be verbose" msgstr "-v Be verbose" msgid "-v Show devices" msgstr "-v Show devices" msgid "-v [printer(s)] Show the devices for each destination" msgstr "-v [printer(s)] Show the devices for each destination" msgid "-v device-uri Specify the device URI for the printer" msgstr "-v device-uri Specify the device URI for the printer" msgid "-vv Be very verbose" msgstr "-vv Be very verbose" msgid "-x Purge jobs rather than just canceling" msgstr "-x Purge jobs rather than just canceling" msgid "-x destination Remove default options for destination" msgstr "-x destination Remove default options for destination" msgid "-x destination Remove the named destination" msgstr "-x destination Remove the named destination" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" "-x utility [argument ...] ;\n" " Execute program if true" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" "/etc/cups/lpoptions file names default destination that does not exist." msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 inch/sec." msgid "1.25x0.25\"" msgstr "1.25x0.25\"" msgid "1.25x2.25\"" msgstr "1.25x2.25\"" msgid "1.5 inch/sec." msgstr "1.5 inch/sec." msgid "1.50x0.25\"" msgstr "1.50x0.25\"" msgid "1.50x0.50\"" msgstr "1.50x0.50\"" msgid "1.50x1.00\"" msgstr "1.50x1.00\"" msgid "1.50x2.00\"" msgstr "1.50x2.00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 inches/sec." msgid "10 x 11" msgstr "10 x 11" msgid "10 x 13" msgstr "10 x 13" msgid "10 x 14" msgstr "10 x 14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/sec." msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 inches/sec." msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 inches/sec." msgid "12 x 11" msgstr "12 x 11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/sec." msgid "120x60dpi" msgstr "120x60dpi" msgid "120x72dpi" msgstr "120x72dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/sec." msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/sec." msgid "150dpi" msgstr "150dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 inches/sec." msgid "2-Sided Printing" msgstr "2-Sided Printing" msgid "2.00x0.37\"" msgstr "2.00x0.37\"" msgid "2.00x0.50\"" msgstr "2.00x0.50\"" msgid "2.00x1.00\"" msgstr "2.00x1.00\"" msgid "2.00x1.25\"" msgstr "2.00x1.25\"" msgid "2.00x2.00\"" msgstr "2.00x2.00\"" msgid "2.00x3.00\"" msgstr "2.00x3.00\"" msgid "2.00x4.00\"" msgstr "2.00x4.00\"" msgid "2.00x5.50\"" msgstr "2.00x5.50\"" msgid "2.25x0.50\"" msgstr "2.25x0.50\"" msgid "2.25x1.25\"" msgstr "2.25x1.25\"" msgid "2.25x4.00\"" msgstr "2.25x4.00\"" msgid "2.25x5.50\"" msgstr "2.25x5.50\"" msgid "2.38x5.50\"" msgstr "2.38x5.50\"" msgid "2.5 inches/sec." msgstr "2.5 inches/sec." msgid "2.50x1.00\"" msgstr "2.50x1.00\"" msgid "2.50x2.00\"" msgstr "2.50x2.00\"" msgid "2.75x1.25\"" msgstr "2.75x1.25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/sec." msgid "200 mm/sec." msgstr "200 mm/sec." msgid "203dpi" msgstr "203dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24-Pin Series" msgid "240x72dpi" msgstr "240x72dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/sec." msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 inches/sec." msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00\"" msgid "3.00x1.25\"" msgstr "3.00x1.25\"" msgid "3.00x2.00\"" msgstr "3.00x2.00\"" msgid "3.00x3.00\"" msgstr "3.00x3.00\"" msgid "3.00x5.00\"" msgstr "3.00x5.00\"" msgid "3.25x2.00\"" msgstr "3.25x2.00\"" msgid "3.25x5.00\"" msgstr "3.25x5.00\"" msgid "3.25x5.50\"" msgstr "3.25x5.50\"" msgid "3.25x5.83\"" msgstr "3.25x5.83\"" msgid "3.25x7.83\"" msgstr "3.25x7.83\"" msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "3.5\" Disk" msgid "3.50x1.00\"" msgstr "3.50x1.00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/sec." msgid "300 mm/sec." msgstr "300 mm/sec." msgid "300dpi" msgstr "300dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360dpi" msgid "360x180dpi" msgstr "360x180dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 inches/sec." msgid "4.00x1.00\"" msgstr "4.00x1.00\"" msgid "4.00x13.00\"" msgstr "4.00x13.00\"" msgid "4.00x2.00\"" msgstr "4.00x2.00\"" msgid "4.00x2.50\"" msgstr "4.00x2.50\"" msgid "4.00x3.00\"" msgstr "4.00x3.00\"" msgid "4.00x4.00\"" msgstr "4.00x4.00\"" msgid "4.00x5.00\"" msgstr "4.00x5.00\"" msgid "4.00x6.00\"" msgstr "4.00x6.00\"" msgid "4.00x6.50\"" msgstr "4.00x6.50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/sec." msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 inches/sec." msgid "5 x 7" msgstr "5 x 7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 inches/sec." msgid "6.00x1.00\"" msgstr "6.00x1.00\"" msgid "6.00x2.00\"" msgstr "6.00x2.00\"" msgid "6.00x3.00\"" msgstr "6.00x3.00\"" msgid "6.00x4.00\"" msgstr "6.00x4.00\"" msgid "6.00x5.00\"" msgstr "6.00x5.00\"" msgid "6.00x6.00\"" msgstr "6.00x6.00\"" msgid "6.00x6.50\"" msgstr "6.00x6.50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/sec." msgid "600dpi" msgstr "600dpi" msgid "60dpi" msgstr "60dpi" msgid "60x72dpi" msgstr "60x72dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 inches/sec." msgid "7 x 9" msgstr "7 x 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 inches/sec." msgid "8 x 10" msgstr "8 x 10" msgid "8.00x1.00\"" msgstr "8.00x1.00\"" msgid "8.00x2.00\"" msgstr "8.00x2.00\"" msgid "8.00x3.00\"" msgstr "8.00x3.00\"" msgid "8.00x4.00\"" msgstr "8.00x4.00\"" msgid "8.00x5.00\"" msgstr "8.00x5.00\"" msgid "8.00x6.00\"" msgstr "8.00x6.00\"" msgid "8.00x6.50\"" msgstr "8.00x6.50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sec." msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 inches/sec." msgid "9 x 11" msgstr "9 x 11" msgid "9 x 12" msgstr "9 x 12" msgid "9-Pin Series" msgstr "9-Pin Series" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Invalid help command unknown." #, c-format msgid "A class named \"%s\" already exists." msgstr "A class named \"%s\" already exists." #, c-format msgid "A printer named \"%s\" already exists." msgstr "A printer named \"%s\" already exists." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 Long Edge" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 Long Edge" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 Long Edge" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 Long Edge" msgid "A3 Oversize" msgstr "A3 Oversize" msgid "A3 Oversize Long Edge" msgstr "A3 Oversize Long Edge" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 Long Edge" msgid "A4 Oversize" msgstr "A4 Oversize" msgid "A4 Small" msgstr "A4 Small" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 Long Edge" msgid "A5 Oversize" msgstr "A5 Oversize" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 Long Edge" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C Long Edge" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D Long Edge" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E Long Edge" msgid "Accept Jobs" msgstr "Accept Jobs" msgid "Accepted" msgstr "Accepted" msgid "Add Class" msgstr "Add Class" msgid "Add Printer" msgstr "Add Printer" msgid "Address" msgstr "Address" msgid "Administration" msgstr "Administration" msgid "Always" msgstr "Always" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Applicator" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "Attempt to set %s printer-state to bad value %d." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "Attribute \"%s\" is in the wrong group." #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "Attribute \"%s\" is the wrong value type." #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Attribute groups are out of order (%x < %x)." msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "B5 Oversize" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "Bad \"printer-id\" value %d." #, c-format msgid "Bad '%s' value." msgstr "Bad '%s' value." #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "Bad 'document-format' value \"%s\"." msgid "Bad CloseUI/JCLCloseUI" msgstr "Bad CloseUI/JCLCloseUI" msgid "Bad NULL dests pointer" msgstr "Bad NULL dests pointer" msgid "Bad OpenGroup" msgstr "Bad OpenGroup" msgid "Bad OpenUI/JCLOpenUI" msgstr "Bad OpenUI/JCLOpenUI" msgid "Bad OrderDependency" msgstr "Bad OrderDependency" msgid "Bad PPD cache file." msgstr "Bad PPD cache file." msgid "Bad PPD file." msgstr "Bad PPD file." msgid "Bad Request" msgstr "Bad Request" msgid "Bad SNMP version number" msgstr "Bad SNMP version number" msgid "Bad UIConstraints" msgstr "Bad UIConstraints" msgid "Bad URI." msgstr "Bad URI." msgid "Bad arguments to function" msgstr "Bad arguments to function" #, c-format msgid "Bad copies value %d." msgstr "Bad copies value %d." msgid "Bad custom parameter" msgstr "Bad custom parameter" #, c-format msgid "Bad device-uri \"%s\"." msgstr "Bad device-uri \"%s\"." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Bad device-uri scheme \"%s\"." #, c-format msgid "Bad document-format \"%s\"." msgstr "Bad document-format \"%s\"." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "Bad document-format-default \"%s\"." msgid "Bad filename buffer" msgstr "Bad filename buffer" msgid "Bad hostname/address in URI" msgstr "Bad hostname/address in URI" #, c-format msgid "Bad job-name value: %s" msgstr "Bad job-name value: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Bad job-name value: Wrong type or count." msgid "Bad job-priority value." msgstr "Bad job-priority value." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Bad job-sheets value \"%s\"." msgid "Bad job-sheets value type." msgstr "Bad job-sheets value type." msgid "Bad job-state value." msgstr "Bad job-state value." #, c-format msgid "Bad job-uri \"%s\"." msgstr "Bad job-uri \"%s\"." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "Bad notify-pull-method \"%s\"." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "Bad notify-recipient-uri \"%s\"." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "Bad notify-user-data \"%s\"." #, c-format msgid "Bad number-up value %d." msgstr "Bad number-up value %d." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Bad page-ranges values %d-%d." msgid "Bad port number in URI" msgstr "Bad port number in URI" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "Bad port-monitor \"%s\"." #, c-format msgid "Bad printer-state value %d." msgstr "Bad printer-state value %d." msgid "Bad printer-uri." msgstr "Bad printer-uri." #, c-format msgid "Bad request ID %d." msgstr "Bad request ID %d." #, c-format msgid "Bad request version number %d.%d." msgstr "Bad request version number %d.%d." msgid "Bad resource in URI" msgstr "Bad resource in URI" msgid "Bad scheme in URI" msgstr "Bad scheme in URI" msgid "Bad username in URI" msgstr "Bad username in URI" msgid "Bad value string" msgstr "Bad value string" msgid "Bad/empty URI" msgstr "Bad/empty URI" msgid "Banners" msgstr "Banners" msgid "Bond Paper" msgstr "Bond Paper" msgid "Booklet" msgstr "Booklet" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "Boolean expected for waiteof option \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "Buffer overflow detected, aborting." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "CPCL Label Printer" msgid "Cancel Jobs" msgstr "Cancel Jobs" msgid "Canceling print job." msgstr "Canceling print job." msgid "Cannot change printer-is-shared for remote queues." msgstr "Cannot change printer-is-shared for remote queues." msgid "Cannot share a remote Kerberized printer." msgstr "Cannot share a remote Kerberized printer." msgid "Cassette" msgstr "Cassette" msgid "Change Settings" msgstr "Change Settings" #, c-format msgid "Character set \"%s\" not supported." msgstr "Character set \"%s\" not supported." msgid "Classes" msgstr "Classes" msgid "Clean Print Heads" msgstr "Clean Print Heads" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job doesn't support the job-uri attribute." msgid "Color" msgstr "Color" msgid "Color Mode" msgstr "Color Mode" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Community name uses indefinite length" msgid "Connected to printer." msgstr "Connected to printer." msgid "Connecting to printer." msgstr "Connecting to printer." msgid "Continue" msgstr "Continue" msgid "Continuous" msgstr "Continuous" msgid "Control file sent successfully." msgstr "Control file sent successfully." msgid "Copying print data." msgstr "Copying print data." msgid "Created" msgstr "Created" msgid "Credentials do not validate against site CA certificate." msgstr "Credentials do not validate against site CA certificate." msgid "Credentials have expired." msgstr "Credentials have expired." msgid "Custom" msgstr "Custom" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Cut" msgid "Cutter" msgstr "Cutter" msgid "Dark" msgstr "Dark" msgid "Darkness" msgstr "Darkness" msgid "Data file sent successfully." msgstr "Data file sent successfully." msgid "Deep Color" msgstr "Deep Color" msgid "Deep Gray" msgstr "Deep Gray" msgid "Delete Class" msgstr "Delete Class" msgid "Delete Printer" msgstr "Delete Printer" msgid "DeskJet Series" msgstr "DeskJet Series" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "Destination \"%s\" is not accepting jobs." msgid "Device CMYK" msgstr "Device CMYK" msgid "Device Gray" msgstr "Device Gray" msgid "Device RGB" msgstr "Device RGB" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgid "Direct Thermal Media" msgstr "Direct Thermal Media" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "Directory \"%s\" contains a relative path." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "Directory \"%s\" is a file." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Directory \"%s\" not available: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Disabled" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "Document #%d does not exist in job #%d." msgid "Draft" msgstr "Draft" msgid "Duplexer" msgstr "Duplexer" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "EPL1 Label Printer" msgid "EPL2 Label Printer" msgstr "EPL2 Label Printer" msgid "Edit Configuration File" msgstr "Edit Configuration File" msgid "Encryption is not supported." msgstr "Encryption is not supported." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Ending Banner" msgid "English" msgstr "English" 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 "" "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." msgid "Envelope #10" msgstr "Envelope #10" msgid "Envelope #11" msgstr "Envelope #11" msgid "Envelope #12" msgstr "Envelope #12" msgid "Envelope #14" msgstr "Envelope #14" msgid "Envelope #9" msgstr "Envelope #9" msgid "Envelope B4" msgstr "Envelope B4" msgid "Envelope B5" msgstr "Envelope B5" msgid "Envelope B6" msgstr "Envelope B6" msgid "Envelope C0" msgstr "Envelope C0" msgid "Envelope C1" msgstr "Envelope C1" msgid "Envelope C2" msgstr "Envelope C2" msgid "Envelope C3" msgstr "Envelope C3" msgid "Envelope C4" msgstr "Envelope C4" msgid "Envelope C5" msgstr "Envelope C5" msgid "Envelope C6" msgstr "Envelope C6" msgid "Envelope C65" msgstr "Envelope C65" msgid "Envelope C7" msgstr "Envelope C7" msgid "Envelope Choukei 3" msgstr "Envelope Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Envelope Choukei 3 Long Edge" msgid "Envelope Choukei 4" msgstr "Envelope Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Envelope Choukei 4 Long Edge" msgid "Envelope DL" msgstr "Envelope DL" msgid "Envelope Feed" msgstr "Envelope Feed" msgid "Envelope Invite" msgstr "Envelope Invite" msgid "Envelope Italian" msgstr "Envelope Italian" msgid "Envelope Kaku2" msgstr "Envelope Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Envelope Kaku2 Long Edge" msgid "Envelope Kaku3" msgstr "Envelope Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Envelope Kaku3 Long Edge" msgid "Envelope Monarch" msgstr "Envelope Monarch" msgid "Envelope PRC1" msgstr "Envelope PRC1" msgid "Envelope PRC1 Long Edge" msgstr "Envelope PRC1 Long Edge" msgid "Envelope PRC10" msgstr "Envelope PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Envelope PRC10 Long Edge" msgid "Envelope PRC2" msgstr "Envelope PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Envelope PRC2 Long Edge" msgid "Envelope PRC3" msgstr "Envelope PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Envelope PRC3 Long Edge" msgid "Envelope PRC4" msgstr "Envelope PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Envelope PRC4 Long Edge" msgid "Envelope PRC5 Long Edge" msgstr "Envelope PRC5 Long Edge" msgid "Envelope PRC5PRC5" msgstr "Envelope PRC5PRC5" msgid "Envelope PRC6" msgstr "Envelope PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Envelope PRC6 Long Edge" msgid "Envelope PRC7" msgstr "Envelope PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Envelope PRC7 Long Edge" msgid "Envelope PRC8" msgstr "Envelope PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Envelope PRC8 Long Edge" msgid "Envelope PRC9" msgstr "Envelope PRC9" msgid "Envelope PRC9 Long Edge" msgstr "Envelope PRC9 Long Edge" msgid "Envelope Personal" msgstr "Envelope Personal" msgid "Envelope You4" msgstr "Envelope You4" msgid "Envelope You4 Long Edge" msgstr "Envelope You4 Long Edge" msgid "Environment Variables:" msgstr "Environment Variables:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Error Policy" msgid "Error reading raster data." msgstr "Error reading raster data." msgid "Error sending raster data." msgstr "Error sending raster data." msgid "Error: need hostname after \"-h\" option." msgstr "Error: need hostname after \"-h\" option." msgid "European Fanfold" msgstr "European Fanfold" msgid "European Fanfold Legal" msgstr "European Fanfold Legal" msgid "Every 10 Labels" msgstr "Every 10 Labels" msgid "Every 2 Labels" msgstr "Every 2 Labels" msgid "Every 3 Labels" msgstr "Every 3 Labels" msgid "Every 4 Labels" msgstr "Every 4 Labels" msgid "Every 5 Labels" msgstr "Every 5 Labels" msgid "Every 6 Labels" msgstr "Every 6 Labels" msgid "Every 7 Labels" msgstr "Every 7 Labels" msgid "Every 8 Labels" msgstr "Every 8 Labels" msgid "Every 9 Labels" msgstr "Every 9 Labels" msgid "Every Label" msgstr "Every Label" msgid "Executive" msgstr "Executive" msgid "Expectation Failed" msgstr "Expectation Failed" msgid "Expressions:" msgstr "Expressions:" msgid "Fast Grayscale" msgstr "Fast Grayscale" #, c-format msgid "File \"%s\" contains a relative path." msgstr "File \"%s\" contains a relative path." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "File \"%s\" is a directory." #, c-format msgid "File \"%s\" not available: %s" msgstr "File \"%s\" not available: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "File Folder" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." msgstr "Finished page %d." msgid "Finishing Preset" msgstr "Finishing Preset" msgid "Fold" msgstr "Fold" msgid "Folio" msgstr "Folio" msgid "Forbidden" msgstr "Forbidden" msgid "Found" msgstr "Found" msgid "General" msgstr "General" msgid "Generic" msgstr "Generic" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU uses indefinite length" msgid "Glossy Paper" msgstr "Glossy Paper" msgid "Got a printer-uri attribute but no job-id." msgstr "Got a printer-uri attribute but no job-id." msgid "Grayscale" msgstr "Grayscale" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Hanging Folder" msgid "Hash buffer too small." msgstr "Hash buffer too small." msgid "Help file not in index." msgstr "Help file not in index." msgid "High" msgstr "High" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "IPP 1setOf attribute with incompatible value tags." msgid "IPP attribute has no name." msgstr "IPP attribute has no name." msgid "IPP attribute is not a member of the message." msgstr "IPP attribute is not a member of the message." msgid "IPP begCollection value not 0 bytes." msgstr "IPP begCollection value not 0 bytes." msgid "IPP boolean value not 1 byte." msgstr "IPP boolean value not 1 byte." msgid "IPP date value not 11 bytes." msgstr "IPP date value not 11 bytes." msgid "IPP endCollection value not 0 bytes." msgstr "IPP endCollection value not 0 bytes." msgid "IPP enum value not 4 bytes." msgstr "IPP enum value not 4 bytes." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP extension tag larger than 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "IPP integer value not 4 bytes." msgid "IPP language length overflows value." msgstr "IPP language length overflows value." msgid "IPP language length too large." msgstr "IPP language length too large." msgid "IPP member name is not empty." msgstr "IPP member name is not empty." msgid "IPP memberName value is empty." msgstr "IPP memberName value is empty." msgid "IPP memberName with no attribute." msgstr "IPP memberName with no attribute." msgid "IPP name larger than 32767 bytes." msgstr "IPP name larger than 32767 bytes." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP nameWithLanguage value less than minimum 4 bytes." msgid "IPP octetString length too large." msgstr "IPP octetString length too large." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP rangeOfInteger value not 8 bytes." msgid "IPP resolution value not 9 bytes." msgstr "IPP resolution value not 9 bytes." msgid "IPP string length overflows value." msgstr "IPP string length overflows value." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP textWithLanguage value less than minimum 4 bytes." msgid "IPP value larger than 32767 bytes." msgstr "IPP value larger than 32767 bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "IPPFIND_SERVICE_DOMAIN Domain name" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "IPPFIND_SERVICE_NAME Service instance name" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "IPPFIND_SERVICE_PORT Port number" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "IPPFIND_SERVICE_SCHEME URI scheme" msgid "IPPFIND_SERVICE_URI URI" msgstr "IPPFIND_SERVICE_URI URI" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "IPPFIND_TXT_* Value of TXT record key" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Illegal control character" msgid "Illegal main keyword string" msgstr "Illegal main keyword string" msgid "Illegal option keyword string" msgstr "Illegal option keyword string" msgid "Illegal translation string" msgstr "Illegal translation string" msgid "Illegal whitespace character" msgstr "Illegal whitespace character" msgid "Installable Options" msgstr "Installable Options" msgid "Installed" msgstr "Installed" msgid "IntelliBar Label Printer" msgstr "IntelliBar Label Printer" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Internal Server Error" msgid "Internal error" msgstr "Internal error" msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-Part" msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-Part" msgid "Internet Printing Protocol" msgstr "Internet Printing Protocol" msgid "Invalid group tag." msgstr "Invalid group tag." msgid "Invalid media name arguments." msgstr "Invalid media name arguments." msgid "Invalid media size." msgstr "Invalid media size." msgid "Invalid named IPP attribute in collection." msgstr "Invalid named IPP attribute in collection." msgid "Invalid ppd-name value." msgstr "Invalid ppd-name value." #, c-format msgid "Invalid printer command \"%s\"." msgstr "Invalid printer command \"%s\"." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 Long Edge" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 Long Edge" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 Long Edge" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "Job #%d cannot be restarted - no files." #, c-format msgid "Job #%d does not exist." msgstr "Job #%d does not exist." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Job #%d is already aborted - can't cancel." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Job #%d is already canceled - can't cancel." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Job #%d is already completed - can't cancel." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "Job #%d is finished and cannot be altered." #, c-format msgid "Job #%d is not complete." msgstr "Job #%d is not complete." #, c-format msgid "Job #%d is not held for authentication." msgstr "Job #%d is not held for authentication." #, c-format msgid "Job #%d is not held." msgstr "Job #%d is not held." msgid "Job Completed" msgstr "Job Completed" msgid "Job Created" msgstr "Job Created" msgid "Job Options Changed" msgstr "Job Options Changed" msgid "Job Stopped" msgstr "Job Stopped" msgid "Job is completed and cannot be changed." msgstr "Job is completed and cannot be changed." msgid "Job operation failed" msgstr "Job operation failed" msgid "Job state cannot be changed." msgstr "Job state cannot be changed." msgid "Job subscriptions cannot be renewed." msgstr "Job subscriptions cannot be renewed." msgid "Jobs" msgstr "Jobs" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR Host or Printer" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" "LPDEST environment variable names default destination that does not exist." msgid "Label Printer" msgstr "Label Printer" msgid "Label Top" msgstr "Label Top" #, c-format msgid "Language \"%s\" not supported." msgstr "Language \"%s\" not supported." msgid "Large Address" msgstr "Large Address" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Series PCL 4/5" msgid "Letter Oversize" msgstr "Letter Oversize" msgid "Letter Oversize Long Edge" msgstr "Letter Oversize Long Edge" msgid "Light" msgstr "Light" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Line longer than the maximum allowed (255 characters)" msgid "List Available Printers" msgstr "List Available Printers" #, c-format msgid "Listening on port %d." msgstr "Listening on port %d." msgid "Local printer created." msgstr "Local printer created." msgid "Long-Edge (Portrait)" msgstr "Long-Edge (Portrait)" msgid "Looking for printer." msgstr "Looking for printer." msgid "Manual Feed" msgstr "Manual Feed" msgid "Media Size" msgstr "Media Size" msgid "Media Source" msgstr "Media Source" msgid "Media Tracking" msgstr "Media Tracking" msgid "Media Type" msgstr "Media Type" msgid "Medium" msgstr "Medium" msgid "Memory allocation error" msgstr "Memory allocation error" msgid "Missing CloseGroup" msgstr "Missing CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "Missing CloseUI/JCLCloseUI" msgid "Missing PPD-Adobe-4.x header" msgstr "Missing PPD-Adobe-4.x header" msgid "Missing asterisk in column 1" msgstr "Missing asterisk in column 1" msgid "Missing document-number attribute." msgstr "Missing document-number attribute." msgid "Missing form variable" msgstr "Missing form variable" msgid "Missing last-document attribute in request." msgstr "Missing last-document attribute in request." msgid "Missing media or media-col." msgstr "Missing media or media-col." msgid "Missing media-size in media-col." msgstr "Missing media-size in media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Missing notify-subscription-ids attribute." msgid "Missing option keyword" msgstr "Missing option keyword" msgid "Missing requesting-user-name attribute." msgstr "Missing requesting-user-name attribute." #, c-format msgid "Missing required attribute \"%s\"." msgstr "Missing required attribute \"%s\"." msgid "Missing required attributes." msgstr "Missing required attributes." msgid "Missing resource in URI" msgstr "Missing resource in URI" msgid "Missing scheme in URI" msgstr "Missing scheme in URI" msgid "Missing value string" msgstr "Missing value string" msgid "Missing x-dimension in media-size." msgstr "Missing x-dimension in media-size." msgid "Missing y-dimension in media-size." msgstr "Missing y-dimension in media-size." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgid "Modifiers:" msgstr "Modifiers:" msgid "Modify Class" msgstr "Modify Class" msgid "Modify Printer" msgstr "Modify Printer" msgid "Move All Jobs" msgstr "Move All Jobs" msgid "Move Job" msgstr "Move Job" msgid "Moved Permanently" msgstr "Moved Permanently" msgid "NULL PPD file pointer" msgstr "NULL PPD file pointer" msgid "Name OID uses indefinite length" msgstr "Name OID uses indefinite length" msgid "Nested classes are not allowed." msgstr "Nested classes are not allowed." msgid "Never" msgstr "Never" msgid "New credentials are not valid for name." msgstr "New credentials are not valid for name." msgid "New credentials are older than stored credentials." msgstr "New credentials are older than stored credentials." msgid "No" msgstr "No" msgid "No Content" msgstr "No Content" msgid "No IPP attributes." msgstr "No IPP attributes." msgid "No PPD name" msgstr "No PPD name" msgid "No VarBind SEQUENCE" msgstr "No VarBind SEQUENCE" msgid "No active connection" msgstr "No active connection" msgid "No active connection." msgstr "No active connection." #, c-format msgid "No active jobs on %s." msgstr "No active jobs on %s." msgid "No attributes in request." msgstr "No attributes in request." msgid "No authentication information provided." msgstr "No authentication information provided." msgid "No common name specified." msgstr "No common name specified." msgid "No community name" msgstr "No community name" msgid "No default destination." msgstr "No default destination." msgid "No default printer." msgstr "No default printer." msgid "No destinations added." msgstr "No destinations added." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "No device URI found in argv[0] or in DEVICE_URI environment variable." msgid "No error-index" msgstr "No error-index" msgid "No error-status" msgstr "No error-status" msgid "No file in print request." msgstr "No file in print request." msgid "No modification time" msgstr "No modification time" msgid "No name OID" msgstr "No name OID" msgid "No pages were found." msgstr "No pages were found." msgid "No printer name" msgstr "No printer name" msgid "No printer-uri found" msgstr "No printer-uri found" msgid "No printer-uri found for class" msgstr "No printer-uri found for class" msgid "No printer-uri in request." msgstr "No printer-uri in request." msgid "No request URI." msgstr "No request URI." msgid "No request protocol version." msgstr "No request protocol version." msgid "No request sent." msgstr "No request sent." msgid "No request-id" msgstr "No request-id" msgid "No stored credentials, not valid for name." msgstr "No stored credentials, not valid for name." msgid "No subscription attributes in request." msgstr "No subscription attributes in request." msgid "No subscriptions found." msgstr "No subscriptions found." msgid "No variable-bindings SEQUENCE" msgstr "No variable-bindings SEQUENCE" msgid "No version number" msgstr "No version number" msgid "Non-continuous (Mark sensing)" msgstr "Non-continuous (Mark sensing)" msgid "Non-continuous (Web sensing)" msgstr "Non-continuous (Web sensing)" msgid "None" msgstr "None" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "Not Found" msgid "Not Implemented" msgstr "Not Implemented" msgid "Not Installed" msgstr "Not Installed" msgid "Not Modified" msgstr "Not Modified" msgid "Not Supported" msgstr "Not Supported" msgid "Not allowed to print." msgstr "Not allowed to print." msgid "Note" msgstr "Note" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Off (1-Sided)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Online Help" msgid "Only local users can create a local printer." msgstr "Only local users can create a local printer." #, c-format msgid "Open of %s failed: %s" msgstr "Open of %s failed: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup without a CloseGroup first" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgid "Operation Policy" msgstr "Operation Policy" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "Option \"%s\" cannot be included via %%%%IncludeFeature." msgid "Options Installed" msgstr "Options Installed" msgid "Options:" msgstr "Options:" msgid "Other Media" msgstr "Other Media" msgid "Other Tray" msgstr "Other Tray" msgid "Out of date PPD cache file." msgstr "Out of date PPD cache file." msgid "Out of memory." msgstr "Out of memory." msgid "Output Mode" msgstr "Output Mode" msgid "PCL Laser Printer" msgstr "PCL Laser Printer" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K Long Edge" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K Long Edge" msgid "PRC32K Oversize" msgstr "PRC32K Oversize" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K Oversize Long Edge" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" "PRINTER environment variable names default destination that does not exist." msgid "Packet does not contain a Get-Response-PDU" msgstr "Packet does not contain a Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Packet does not start with SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Password for %s on %s? " msgid "Pause Class" msgstr "Pause Class" msgid "Pause Printer" msgstr "Pause Printer" msgid "Peel-Off" msgstr "Peel-Off" msgid "Photo" msgstr "Photo" msgid "Photo Labels" msgstr "Photo Labels" msgid "Plain Paper" msgstr "Plain Paper" msgid "Policies" msgstr "Policies" msgid "Port Monitor" msgstr "Port Monitor" msgid "PostScript Printer" msgstr "PostScript Printer" msgid "Postcard" msgstr "Postcard" msgid "Postcard Double" msgstr "Postcard Double" msgid "Postcard Double Long Edge" msgstr "Postcard Double Long Edge" msgid "Postcard Long Edge" msgstr "Postcard Long Edge" msgid "Preparing to print." msgstr "Preparing to print." msgid "Print Density" msgstr "Print Density" msgid "Print Job:" msgstr "Print Job:" msgid "Print Mode" msgstr "Print Mode" msgid "Print Quality" msgstr "Print Quality" msgid "Print Rate" msgstr "Print Rate" msgid "Print Self-Test Page" msgstr "Print Self-Test Page" msgid "Print Speed" msgstr "Print Speed" msgid "Print Test Page" msgstr "Print Test Page" msgid "Print and Cut" msgstr "Print and Cut" msgid "Print and Tear" msgstr "Print and Tear" msgid "Print file sent." msgstr "Print file sent." msgid "Print job canceled at printer." msgstr "Print job canceled at printer." msgid "Print job too large." msgstr "Print job too large." msgid "Print job was not accepted." msgstr "Print job was not accepted." #, c-format msgid "Printer \"%s\" already exists." msgstr "Printer \"%s\" already exists." msgid "Printer Added" msgstr "Printer Added" msgid "Printer Default" msgstr "Printer Default" msgid "Printer Deleted" msgstr "Printer Deleted" msgid "Printer Modified" msgstr "Printer Modified" msgid "Printer Paused" msgstr "Printer Paused" msgid "Printer Settings" msgstr "Printer Settings" msgid "Printer cannot print supplied content." msgstr "Printer cannot print supplied content." msgid "Printer cannot print with supplied options." msgstr "Printer cannot print with supplied options." msgid "Printer does not support required IPP attributes or document formats." msgstr "Printer does not support required IPP attributes or document formats." msgid "Printer:" msgstr "Printer:" msgid "Printers" msgstr "Printers" #, c-format msgid "Printing page %d, %u%% complete." msgstr "Printing page %d, %u%% complete." msgid "Punch" msgstr "Punch" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "Quota limit reached." msgid "Rank Owner Job File(s) Total Size" msgstr "Rank Owner Job File(s) Total Size" msgid "Reject Jobs" msgstr "Reject Jobs" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "Remote host did not accept control file (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "Remote host did not accept data file (%d)." msgid "Reprint After Error" msgstr "Reprint After Error" msgid "Request Entity Too Large" msgstr "Request Entity Too Large" msgid "Resolution" msgstr "Resolution" msgid "Resume Class" msgstr "Resume Class" msgid "Resume Printer" msgstr "Resume Printer" msgid "Return Address" msgstr "Return Address" msgid "Rewind" msgstr "Rewind" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE uses indefinite length" msgid "SSL/TLS Negotiation Error" msgstr "SSL/TLS Negotiation Error" msgid "See Other" msgstr "See Other" msgid "See remote printer." msgstr "See remote printer." msgid "Self-signed credentials are blocked." msgstr "Self-signed credentials are blocked." msgid "Sending data to printer." msgstr "Sending data to printer." msgid "Server Restarted" msgstr "Server Restarted" msgid "Server Security Auditing" msgstr "Server Security Auditing" msgid "Server Started" msgstr "Server Started" msgid "Server Stopped" msgstr "Server Stopped" msgid "Server credentials not set." msgstr "Server credentials not set." msgid "Service Unavailable" msgstr "Service Unavailable" msgid "Set Allowed Users" msgstr "Set Allowed Users" msgid "Set As Server Default" msgstr "Set As Server Default" msgid "Set Class Options" msgstr "Set Class Options" msgid "Set Printer Options" msgstr "Set Printer Options" msgid "Set Publishing" msgstr "Set Publishing" msgid "Shipping Address" msgstr "Shipping Address" msgid "Short-Edge (Landscape)" msgstr "Short-Edge (Landscape)" msgid "Special Paper" msgstr "Special Paper" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Spooling job, %.0f%% complete." msgid "Standard" msgstr "Standard" msgid "Staple" msgstr "Staple" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Starting Banner" #, c-format msgid "Starting page %d." msgstr "Starting page %d." msgid "Statement" msgstr "Statement" #, c-format msgid "Subscription #%d does not exist." msgstr "Subscription #%d does not exist." msgid "Substitutions:" msgstr "Substitutions:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Switching Protocols" msgid "Tabloid" msgstr "Tabloid" msgid "Tabloid Oversize" msgstr "Tabloid Oversize" msgid "Tabloid Oversize Long Edge" msgstr "Tabloid Oversize Long Edge" msgid "Tear" msgstr "Tear" msgid "Tear-Off" msgstr "Tear-Off" msgid "Tear-Off Adjust Position" msgstr "Tear-Off Adjust Position" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "The \"%s\" attribute is required for print jobs." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "The %s attribute cannot be provided with job-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" "The '%s' Job Status attribute cannot be supplied in a job creation request." #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "The '%s' operation attribute cannot be supplied in a Create-Job request." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "The PPD file \"%s\" could not be found." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "The PPD file \"%s\" could not be opened: %s" msgid "The PPD file could not be opened." msgstr "The PPD file could not be opened." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "The notify-lease-duration attribute cannot be used with job subscriptions." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "The notify-user-data value is too large (%d > 63 octets)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" "The printer configuration is incorrect or the printer no longer exists." msgid "The printer did not respond." msgstr "The printer did not respond." msgid "The printer is in use." msgstr "The printer is in use." msgid "The printer is not connected." msgstr "The printer is not connected." msgid "The printer is not responding." msgstr "The printer is not responding." msgid "The printer is now connected." msgstr "The printer is now connected." msgid "The printer is now online." msgstr "The printer is now online." msgid "The printer is offline." msgstr "The printer is offline." msgid "The printer is unreachable at this time." msgstr "The printer is unreachable at this time." msgid "The printer may not exist or is unavailable at this time." msgstr "The printer may not exist or is unavailable at this time." 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 "" "The printer name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the " "pound sign (#)." msgid "The printer or class does not exist." msgstr "The printer or class does not exist." msgid "The printer or class is not shared." msgstr "The printer or class is not shared." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "The printer-uri \"%s\" contains invalid characters." msgid "The printer-uri attribute is required." msgstr "The printer-uri attribute is required." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "The which-jobs value \"%s\" is not supported." msgid "There are too many subscriptions." msgstr "There are too many subscriptions." msgid "There was an unrecoverable USB error." msgstr "There was an unrecoverable USB error." msgid "Thermal Transfer Media" msgstr "Thermal Transfer Media" msgid "Too many active jobs." msgstr "Too many active jobs." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Too many job-sheets values (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Too many printer-state-reasons values (%d > %d)." msgid "Transparency" msgstr "Transparency" msgid "Tray" msgstr "Tray" msgid "Tray 1" msgstr "Tray 1" msgid "Tray 2" msgstr "Tray 2" msgid "Tray 3" msgstr "Tray 3" msgid "Tray 4" msgstr "Tray 4" msgid "Trust on first use is disabled." msgstr "Trust on first use is disabled." msgid "URI Too Long" msgstr "URI Too Long" msgid "URI too large" msgstr "URI too large" msgid "US Fanfold" msgstr "US Fanfold" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "US Legal Oversize" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "US Letter Long Edge" msgid "US Letter Oversize" msgstr "US Letter Oversize" msgid "US Letter Oversize Long Edge" msgstr "US Letter Oversize Long Edge" msgid "US Letter Small" msgstr "US Letter Small" msgid "Unable to access cupsd.conf file" msgstr "Unable to access cupsd.conf file" msgid "Unable to access help file." msgstr "Unable to access help file." msgid "Unable to add class" msgstr "Unable to add class" msgid "Unable to add document to print job." msgstr "Unable to add document to print job." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Unable to add job for destination \"%s\"." msgid "Unable to add printer" msgstr "Unable to add printer" msgid "Unable to allocate memory for file types." msgstr "Unable to allocate memory for file types." msgid "Unable to allocate memory for page info" msgstr "Unable to allocate memory for page info" msgid "Unable to allocate memory for pages array" msgstr "Unable to allocate memory for pages array" msgid "Unable to allocate memory for printer" msgstr "Unable to allocate memory for printer" msgid "Unable to cancel print job." msgstr "Unable to cancel print job." msgid "Unable to change printer" msgstr "Unable to change printer" msgid "Unable to change printer-is-shared attribute" msgstr "Unable to change printer-is-shared attribute" msgid "Unable to change server settings" msgstr "Unable to change server settings" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "Unable to compile mimeMediaType regular expression: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "Unable to compile naturalLanguage regular expression: %s." msgid "Unable to configure printer options." msgstr "Unable to configure printer options." msgid "Unable to connect to host." msgstr "Unable to connect to host." msgid "Unable to contact printer, queuing on next printer in class." msgstr "Unable to contact printer, queuing on next printer in class." #, c-format msgid "Unable to copy PPD file - %s" msgstr "Unable to copy PPD file - %s" msgid "Unable to copy PPD file." msgstr "Unable to copy PPD file." msgid "Unable to create credentials from array." msgstr "Unable to create credentials from array." msgid "Unable to create printer-uri" msgstr "Unable to create printer-uri" msgid "Unable to create printer." msgstr "Unable to create printer." msgid "Unable to create server credentials." msgstr "Unable to create server credentials." #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "Unable to create spool directory \"%s\": %s" msgid "Unable to create temporary file" msgstr "Unable to create temporary file" msgid "Unable to delete class" msgstr "Unable to delete class" msgid "Unable to delete printer" msgstr "Unable to delete printer" msgid "Unable to do maintenance command" msgstr "Unable to do maintenance command" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "Unable to edit cupsd.conf files larger than 1MB" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "Unable to establish a secure connection to host (%d)." msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "Unable to establish a secure connection to host (certificate chain invalid)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "Unable to establish a secure connection to host (certificate not yet valid)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "Unable to establish a secure connection to host (expired certificate)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "Unable to establish a secure connection to host (host name mismatch)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "Unable to establish a secure connection to host (self-signed certificate)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "Unable to establish a secure connection to host (untrusted certificate)." msgid "Unable to establish a secure connection to host." msgstr "Unable to establish a secure connection to host." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "Unable to execute command \"%s\": %s" msgid "Unable to find destination for job" msgstr "Unable to find destination for job" msgid "Unable to find printer." msgstr "Unable to find printer." msgid "Unable to find server credentials." msgstr "Unable to find server credentials." msgid "Unable to get backend exit status." msgstr "Unable to get backend exit status." msgid "Unable to get class list" msgstr "Unable to get class list" msgid "Unable to get class status" msgstr "Unable to get class status" msgid "Unable to get list of printer drivers" msgstr "Unable to get list of printer drivers" msgid "Unable to get printer attributes" msgstr "Unable to get printer attributes" msgid "Unable to get printer list" msgstr "Unable to get printer list" msgid "Unable to get printer status" msgstr "Unable to get printer status" msgid "Unable to get printer status." msgstr "Unable to get printer status." msgid "Unable to load help index." msgstr "Unable to load help index." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "Unable to locate printer \"%s\"." msgid "Unable to locate printer." msgstr "Unable to locate printer." msgid "Unable to modify class" msgstr "Unable to modify class" msgid "Unable to modify printer" msgstr "Unable to modify printer" msgid "Unable to move job" msgstr "Unable to move job" msgid "Unable to move jobs" msgstr "Unable to move jobs" msgid "Unable to open PPD file" msgstr "Unable to open PPD file" msgid "Unable to open cupsd.conf file:" msgstr "Unable to open cupsd.conf file:" msgid "Unable to open device file" msgstr "Unable to open device file" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "Unable to open document #%d in job #%d." msgid "Unable to open help file." msgstr "Unable to open help file." msgid "Unable to open print file" msgstr "Unable to open print file" msgid "Unable to open raster file" msgstr "Unable to open raster file" msgid "Unable to print test page" msgstr "Unable to print test page" msgid "Unable to read print data." msgstr "Unable to read print data." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "Unable to register \"%s.%s\": %d" msgid "Unable to rename job document file." msgstr "Unable to rename job document file." msgid "Unable to resolve printer-uri." msgstr "Unable to resolve printer-uri." msgid "Unable to see in file" msgstr "Unable to see in file" msgid "Unable to send command to printer driver" msgstr "Unable to send command to printer driver" msgid "Unable to send data to printer." msgstr "Unable to send data to printer." msgid "Unable to set options" msgstr "Unable to set options" msgid "Unable to set server default" msgstr "Unable to set server default" msgid "Unable to start backend process." msgstr "Unable to start backend process." msgid "Unable to upload cupsd.conf file" msgstr "Unable to upload cupsd.conf file" msgid "Unable to use legacy USB class driver." msgstr "Unable to use legacy USB class driver." msgid "Unable to write print data" msgstr "Unable to write print data" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "Unable to write uncompressed print data: %s" msgid "Unauthorized" msgstr "Unauthorized" msgid "Units" msgstr "Units" msgid "Unknown" msgstr "Unknown" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Unknown choice \"%s\" for option \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "Unknown directive \"%s\" on line %d of \"%s\" ignored." #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Unknown encryption option value: \"%s\"." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Unknown file order: \"%s\"." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Unknown format character: \"%c\"." msgid "Unknown hash algorithm." msgstr "Unknown hash algorithm." msgid "Unknown media size name." msgstr "Unknown media size name." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Unknown option \"%s\" with value \"%s\"." #, c-format msgid "Unknown option \"%s\"." msgstr "Unknown option \"%s\"." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Unknown print mode: \"%s\"." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "Unknown printer-error-policy \"%s\"." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "Unknown printer-op-policy \"%s\"." msgid "Unknown request method." msgstr "Unknown request method." msgid "Unknown request version." msgstr "Unknown request version." msgid "Unknown scheme in URI" msgstr "Unknown scheme in URI" msgid "Unknown service name." msgstr "Unknown service name." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Unknown version option value: \"%s\"." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Unsupported 'compression' value \"%s\"." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Unsupported 'document-format' value \"%s\"." msgid "Unsupported 'job-hold-until' value." msgstr "Unsupported 'job-hold-until' value." msgid "Unsupported 'job-name' value." msgstr "Unsupported 'job-name' value." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Unsupported character set \"%s\"." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Unsupported compression \"%s\"." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "Unsupported document-format \"%s\"." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "Unsupported document-format \"%s/%s\"." #, c-format msgid "Unsupported format \"%s\"." msgstr "Unsupported format \"%s\"." msgid "Unsupported margins." msgstr "Unsupported margins." msgid "Unsupported media value." msgstr "Unsupported media value." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "Unsupported number-up value %d, using number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "Unsupported number-up-layout value %s, using number-up-layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "Unsupported page-border value %s, using page-border=none." msgid "Unsupported raster data." msgstr "Unsupported raster data." msgid "Unsupported value type" msgstr "Unsupported value type" msgid "Upgrade Required" msgstr "Upgrade Required" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "Usage: %s [options] destination(s)" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Usage: %s job-id user title copies options [file]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgid "Usage: cupsd [options]" msgstr "Usage: cupsd [options]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "Usage: cupsfilter [ options ] [ -- ] filename" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "Usage: ippeveprinter [options] \"name\"" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Usage: ipptool [options] URI filename [ ... filenameN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgid "Usage: lpq [options] [+interval]" msgstr "Usage: lpq [options] [+interval]" msgid "Usage: lpr [options] [file(s)]" msgstr "Usage: lpr [options] [file(s)]" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgid "Usage: lpstat [options]" msgstr "Usage: lpstat [options]" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Usage: ppdhtml [options] filename.drv >filename.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Usage: snmp [host-or-ip-address]" #, c-format msgid "Using spool directory \"%s\"." msgstr "Using spool directory \"%s\"." msgid "Value uses indefinite length" msgstr "Value uses indefinite length" msgid "VarBind uses indefinite length" msgstr "VarBind uses indefinite length" msgid "Version uses indefinite length" msgstr "Version uses indefinite length" msgid "Waiting for job to complete." msgstr "Waiting for job to complete." msgid "Waiting for printer to become available." msgstr "Waiting for printer to become available." msgid "Waiting for printer to finish." msgstr "Waiting for printer to finish." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "Warning: This program will be removed in a future version of CUPS." msgid "Web Interface is Disabled" msgstr "Web Interface is Disabled" msgid "Yes" msgstr "Yes" msgid "You cannot access this page." msgstr "You cannot access this page." #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "You must access this page using the URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "Your account does not have the necessary privileges." msgid "ZPL Label Printer" msgstr "ZPL Label Printer" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "aborted" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "Accuracy Units" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "Millimeters" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "Nanometers" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "Micrometers" #. TRANSLATORS: Bale Output msgid "baling" msgstr "Bale Output" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "Bale Using" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "Band" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "Shrink Wrap" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "Wrap" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "Bale After" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "Job" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "Sets" #. TRANSLATORS: Bind Output msgid "binding" msgstr "Bind Output" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "Bind Edge" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "Bottom" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "Left" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "Right" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "Top" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "Binder Type" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "Adhesive" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "Comb" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "Flat" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "Padding" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "Perfect" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "Spiral" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "Tape" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "Velo" msgid "canceled" msgstr "canceled" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "Chamber Humidity" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "Chamber Temperature" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "Print Job Cost" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "Coat Sheets" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "Add Coating To" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "Back" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "Front and Back" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "Front" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "Type of Coating" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "Archival" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "Archival Glossy" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "Archival Matte" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "Archival Semi Gloss" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "Glossy" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "High Gloss" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "Matte" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "Semi-gloss" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "Silicone" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "Translucent" msgid "completed" msgstr "completed" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "Print Confirmation Sheet" #. TRANSLATORS: Copies msgid "copies" msgstr "Copies" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "Back Cover" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "Front Cover" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "Cover Sheet Info" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "Date Time" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "From Name" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "Logo" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "Message" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "Organization" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "Subject" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "To Name" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "Printed Cover" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "No Cover" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "Back Only" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "Front and Back" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "Front Only" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "None" #. TRANSLATORS: Cover Output msgid "covering" msgstr "Cover Output" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "Add Cover" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "Plain" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "Pre-cut" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "Pre-printed" msgid "cups-deviced failed to execute." msgstr "cups-deviced failed to execute." msgid "cups-driverd failed to execute." msgstr "cups-driverd failed to execute." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "cupsctl: Cannot set %s directly." #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: Unable to connect to server: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: Unknown option \"%s\"" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: Unknown option \"-%c\"" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: Expected config filename after \"-c\" option." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "cupsd: Expected cups-files.conf filename after \"-s\" option." msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "cupsd: On-demand support not compiled in, running in normal mode." msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: Relative cups-files.conf filename not allowed." msgid "cupsd: Unable to get current directory." msgstr "cupsd: Unable to get current directory." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: Unable to get path to cups-files.conf file." #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: Unknown argument \"%s\" - aborting." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: Unknown option \"%c\" - aborting." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: Invalid document number %d." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: Invalid job ID %d." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: Only one filename can be specified." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: Unable to get job file - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: The -q option is incompatible with the -v option." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: The -v option is incompatible with the -q option." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "Detailed Status Message" #, c-format msgid "device for %s/%s: %s" msgstr "device for %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "device for %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "Copies" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "Document Privacy Attributes" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "All" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "Default" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "Document Description" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "Document Template" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "None" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "Document Privacy Scope" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "All" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "Default" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "None" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "Owner" #. TRANSLATORS: Document State msgid "document-state" msgstr "Document State" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "Detailed Document State" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "Aborted By System" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "Canceled At Device" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "Canceled By Operator" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "Canceled By User" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "Completed Successfully" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "Completed With Errors" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "Completed With Warnings" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "Compression Error" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "Data Insufficient" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "Digital Signature Did Not Verify" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "Digital Signature Type Not Supported" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "Digital Signature Wait" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "Document Access Error" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "Document Fetchable" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "Document Format Error" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "Document Password Error" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "Document Permission Error" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "Document Security Error" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "Document Unprintable Error" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "Errors Detected" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "Incoming" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "Interpreting" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "None" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "Outgoing" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "Printing" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "Processing To Stop Point" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "Queued" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "Queued For Marker" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "Queued In Device" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "Resources Are Not Ready" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "Resources Are Not Supported" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "Submission Interrupted" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "Transforming" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "Unsupported Compression" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "Unsupported Document Format" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "Warnings Detected" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "Pending" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "Processing" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "Stopped" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "Canceled" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "Aborted" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "Completed" msgid "error-index uses indefinite length" msgstr "error-index uses indefinite length" msgid "error-status uses indefinite length" msgstr "error-status uses indefinite length" msgid "" "expression --and expression\n" " Logical AND" msgstr "" "expression --and expression\n" " Logical AND" msgid "" "expression --or expression\n" " Logical OR" msgstr "" "expression --or expression\n" " Logical OR" msgid "expression expression Logical AND" msgstr "expression expression Logical AND" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "Feed Orientation" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "Long Edge First" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "Short Edge First" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "Fetch Status Code" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "Finishing Template" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "Bale" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "Bind" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "Bind Bottom" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "Bind Left" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "Bind Right" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "Bind Top" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "Booklet Maker" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "Coat" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "Cover" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "Edge Stitch" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "Edge Stitch Bottom" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "Edge Stitch Left" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "Edge Stitch Right" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "Edge Stitch Top" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "Fold" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "Accordion Fold" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "Double Gate Fold" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "Engineering Z Fold" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "Gate Fold" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "Half Fold" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "Half Z Fold" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "Left Gate Fold" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "Letter Fold" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "Parallel Fold" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "Poster Fold" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "Right Gate Fold" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "Z Fold" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "JDF F10-1" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "JDF F10-2" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "JDF F10-3" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "JDF F12-1" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "JDF F12-10" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "JDF F12-11" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "JDF F12-12" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "JDF F12-13" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "JDF F12-14" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "JDF F12-2" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "JDF F12-3" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "JDF F12-4" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "JDF F12-5" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "JDF F12-6" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "JDF F12-7" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "JDF F12-8" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "JDF F12-9" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "JDF F14-1" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "JDF F16-1" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "JDF F16-10" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "JDF F16-11" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "JDF F16-12" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "JDF F16-13" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "JDF F16-14" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "JDF F16-2" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "JDF F16-3" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "JDF F16-4" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "JDF F16-5" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "JDF F16-6" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "JDF F16-7" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "JDF F16-8" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "JDF F16-9" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "JDF F18-1" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "JDF F18-2" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "JDF F18-3" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "JDF F18-4" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "JDF F18-5" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "JDF F18-6" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "JDF F18-7" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "JDF F18-8" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "JDF F18-9" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "JDF F2-1" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "JDF F20-1" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "JDF F20-2" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "JDF F24-1" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "JDF F24-10" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "JDF F24-11" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "JDF F24-2" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "JDF F24-3" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "JDF F24-4" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "JDF F24-5" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "JDF F24-6" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "JDF F24-7" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "JDF F24-8" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "JDF F24-9" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "JDF F28-1" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "JDF F32-1" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "JDF F32-2" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "JDF F32-3" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "JDF F32-4" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "JDF F32-5" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "JDF F32-6" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "JDF F32-7" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "JDF F32-8" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "JDF F32-9" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "JDF F36-1" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "JDF F36-2" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "JDF F4-1" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "JDF F4-2" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "JDF F40-1" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "JDF F48-1" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "JDF F48-2" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "JDF F6-1" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "JDF F6-2" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "JDF F6-3" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "JDF F6-4" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "JDF F6-5" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "JDF F6-6" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "JDF F6-7" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "JDF F6-8" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "JDF F64-1" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "JDF F64-2" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "JDF F8-1" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "JDF F8-2" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "JDF F8-3" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "JDF F8-4" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "JDF F8-5" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "JDF F8-6" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "JDF F8-7" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "Jog Offset" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "Laminate" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "Punch" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "Punch Bottom Left" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "Punch Bottom Right" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "2-hole Punch Bottom" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "2-hole Punch Left" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "2-hole Punch Right" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "2-hole Punch Top" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "Multi-hole Punch Bottom" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "Multi-hole Punch Left" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "Multi-hole Punch Right" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "Multi-hole Punch Top" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "4-hole Punch Bottom" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "4-hole Punch Left" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "4-hole Punch Right" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "4-hole Punch Top" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "Punch Top Left" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "Punch Top Right" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "3-hole Punch Bottom" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "3-hole Punch Left" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "3-hole Punch Right" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "3-hole Punch Top" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "Saddle Stitch" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "Staple" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "Staple Bottom Left" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "Staple Bottom Right" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "2 Staples on Bottom" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "2 Staples on Left" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "2 Staples on Right" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "2 Staples on Top" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "Staple Top Left" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "Staple Top Right" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "3 Staples on Bottom" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "3 Staples on Left" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "3 Staples on Right" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "3 Staples on Top" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "Trim" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "Trim After Every Set" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "Trim After Every Document" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "Trim After Job" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "Trim After Every Page" #. TRANSLATORS: Finishings msgid "finishings" msgstr "Finishings" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "Finishings" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "Fold" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "Z Fold" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "Engineering Z Fold" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "Trim" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "Bale" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "Booklet Maker" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "Jog Offset" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "Coat" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "Laminate" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "Staple Top Left" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "Staple Bottom Left" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "Staple Top Right" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "Staple Bottom Right" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "Edge Stitch Left" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "Edge Stitch Top" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "Edge Stitch Right" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "Edge Stitch Bottom" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "2 Staples on Left" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "2 Staples on Top" #. TRANSLATORS: None msgid "finishings.3" msgstr "None" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "2 Staples on Right" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "2 Staples on Bottom" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "3 Staples on Left" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "3 Staples on Top" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "3 Staples on Right" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "3 Staples on Bottom" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "Staple" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "Punch" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "Bind Left" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "Bind Top" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "Bind Right" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "Bind Bottom" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "Cover" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "Trim Pages" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "Trim Documents" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "Trim Copies" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "Trim Job" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "Bind" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "Punch Top Left" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "Punch Bottom Left" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "Punch Top Right" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "Punch Bottom Right" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "2-hole Punch Left" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "2-hole Punch Top" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "2-hole Punch Right" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "2-hole Punch Bottom" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "3-hole Punch Left" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "3-hole Punch Top" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "Saddle Stitch" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "3-hole Punch Right" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "3-hole Punch Bottom" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "4-hole Punch Left" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "4-hole Punch Top" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "4-hole Punch Right" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "4-hole Punch Bottom" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "Multi-hole Punch Left" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "Multi-hole Punch Top" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "Multi-hole Punch Right" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "Multi-hole Punch Bottom" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "Edge Stitch" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "Accordion Fold" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "Double Gate Fold" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "Gate Fold" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "Half Fold" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "Half Z Fold" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "Left Gate Fold" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "Letter Fold" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "Parallel Fold" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "Poster Fold" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "Right Gate Fold" #. TRANSLATORS: Fold msgid "folding" msgstr "Fold" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "Fold Direction" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "Inward" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "Outward" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "Fold Position" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "Fold Edge" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "Bottom" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "Left" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "Right" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "Top" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "Font Name" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "Font Size" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "Force Front Side" #. TRANSLATORS: From Name msgid "from-name" msgstr "From Name" msgid "held" msgstr "held" msgid "help\t\tGet help on commands." msgstr "help\t\tGet help on commands." msgid "idle" msgstr "idle" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "Imposition Template" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "None" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "Signature" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "Insert Page Number" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "Insert Count" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "Insert Sheet" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "ippeveprinter: Unable to open \"%s\": %s on line %d." #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: Bad regular expression: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: Cannot use --and after --or." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: Expected key name after %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: Expected port range after %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: Expected program after %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: Expected semi-colon after %s." msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: Missing close brace in substitution." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Missing close parenthesis." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: Missing expression before \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: Missing expression before \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: Missing key name after %s." #, c-format msgid "ippfind: Missing name after %s." msgstr "ippfind: Missing name after %s." msgid "ippfind: Missing open parenthesis." msgstr "ippfind: Missing open parenthesis." #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: Missing program after %s." #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: Missing regular expression after %s." #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: Missing semi-colon after %s." msgid "ippfind: Out of memory." msgstr "ippfind: Out of memory." msgid "ippfind: Too many parenthesis." msgstr "ippfind: Too many parenthesis." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: Unable to browse or resolve: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: Unable to execute \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: Unable to use Bonjour: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: Unknown variable \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "ipptool: Bad URI \"%s\"." msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: Invalid seconds for \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "ipptool: May only specify a single URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: Missing count for \"-n\"." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "ipptool: Missing filename for \"--ippserver\"." msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: Missing filename for \"-f\"." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: Missing name=value for \"-d\"." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: Missing seconds for \"-i\"." msgid "ipptool: URI required before test file." msgstr "ipptool: URI required before test file." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "Job Account ID" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "Job Account Type" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "General" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "Group" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "None" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "Job Accounting Output Bin" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "Job Accounting Sheets" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "Type of Job Accounting Sheets" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "None" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "Standard" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "Job Accounting User ID" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "Cancel job after" #. TRANSLATORS: Copies msgid "job-copies" msgstr "Copies" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "Back Cover" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "Front Cover" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "Delay Output Until" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "Delay Output Until" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "Daytime" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "Evening" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "Released" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "Night" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "No Delay" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "Second Shift" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "Third Shift" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "Weekend" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "On Error" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "Abort Job" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "Cancel Job" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "Continue Job" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "Suspend Job" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "Print Error Sheet" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "Type of Error Sheet" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "None" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "Standard" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "Print Error Sheet" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "Always" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "On Error" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "Job Finishings" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "Hold Until" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "Hold Until" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "Daytime" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "Evening" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "Released" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "Night" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "No Hold" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "Second Shift" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "Third Shift" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "Weekend" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "Job Mandatory Attributes" #. TRANSLATORS: Title msgid "job-name" msgstr "Title" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "Job Pages" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "Job Pages" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "Job Phone Number" msgid "job-printer-uri attribute missing." msgstr "job-printer-uri attribute missing." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "Job Priority" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "Job Privacy Attributes" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "All" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "Default" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "Job Description" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "Job Template" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "None" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "Job Privacy Scope" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "All" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "Default" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "None" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "Owner" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "Job Recipient Name" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "Retain job until" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "Retain job until interval" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "Retain job until time" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "End of day" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "End of month" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "End of week" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "Indefinitely" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "Never" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "Job Save Disposition" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "Job Sheet Message" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "Banner Page" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "Banner Page" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "First Page in Document" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "Start and End Sheets" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "End Sheet" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "Start Sheet" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "None" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "Standard" #. TRANSLATORS: Job State msgid "job-state" msgstr "Job State" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "Job State Message" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "Detailed Job State" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "Aborted By System" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "Account Authorization Failed" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "Account Closed" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "Account Info Needed" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "Account Limit Reached" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "Compression Error" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "Conflicting Attributes" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "Connected To Destination" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "Connecting To Destination" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "Destination Uri Failed" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "Digital Signature Did Not Verify" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "Digital Signature Type Not Supported" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "Document Access Error" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "Document Format Error" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "Document Password Error" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "Document Permission Error" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "Document Security Error" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "Document Unprintable Error" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "Errors Detected" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "Job Canceled At Device" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "Job Canceled By Operator" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "Job Canceled By User" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "Job Completed Successfully" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "Job Completed With Errors" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "Job Completed With Warnings" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "Job Data Insufficient" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "Job Delay Output Until Specified" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "Job Digital Signature Wait" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "Job Fetchable" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "Job Held For Review" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "Job Hold Until Specified" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "Job Incoming" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "Job Interpreting" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "Job Outgoing" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "Job Password Wait" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "Job Printed Successfully" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "Job Printed With Errors" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "Job Printed With Warnings" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "Job Printing" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "Job Queued" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "Job Queued For Marker" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "Job Release Wait" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "Job Restartable" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "Job Resuming" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "Job Saved Successfully" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "Job Saved With Errors" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "Job Saved With Warnings" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "Job Saving" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "Job Spooling" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "Job Streaming" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "Job Suspended" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "Job Suspended By Operator" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "Job Suspended By System" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "Job Suspended By User" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "Job Suspending" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "Job Transferring" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "Job Transforming" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "None" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "Printer Stopped" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "Printer Stopped Partly" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "Processing To Stop Point" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "Queued In Device" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "Resources Are Not Ready" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "Resources Are Not Supported" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "Service Off Line" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "Submission Interrupted" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "Unsupported Attributes Or Values" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "Unsupported Compression" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "Unsupported Document Format" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "Waiting For User Action" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "Warnings Detected" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "Pending" #. TRANSLATORS: Held msgid "job-state.4" msgstr "Held" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "Processing" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "Stopped" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "Canceled" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "Aborted" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "Completed" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "Laminate Pages" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "Laminate" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "Back Only" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "Front and Back" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "Front Only" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "Type of Lamination" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "Archival" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "Glossy" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "High Gloss" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "Matte" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "Semi-gloss" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "Translucent" #. TRANSLATORS: Logo msgid "logo" msgstr "Logo" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: Class name can only contain printable characters." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "lpadmin: Expected PPD after \"-%c\" option." msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: Expected class after \"-r\" option." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: Expected class name after \"-c\" option." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: Expected description after \"-D\" option." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: Expected device URI after \"-v\" option." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: Expected file type(s) after \"-I\" option." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: Expected hostname after \"-h\" option." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: Expected location after \"-L\" option." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: Expected model after \"-m\" option." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: Expected name after \"-R\" option." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: Expected name=value after \"-o\" option." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: Expected printer after \"-p\" option." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: Expected printer name after \"-d\" option." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: Expected printer or class after \"-x\" option." msgid "lpadmin: No member names were seen." msgstr "lpadmin: No member names were seen." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: Printer %s is already a member of class %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: Printer %s is not a member of class %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: Printer name can only contain printable characters." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "lpadmin: Raw queues are no longer supported on macOS." msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: Unable to connect to server: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: Unable to create temporary file" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "lpadmin: Unable to open PPD \"%s\": %s" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: Unknown allow/deny option \"%s\"." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: Unknown argument \"%s\"." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: Unknown option \"%c\"." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "lpadmin: Use the 'everywhere' model for shared printers." msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Warning - content type list ignored." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: Expected language after \"--language\"." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: Expected make and model after \"--make-and-model\"." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: Expected product string after \"--product\"." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo: Expected scheme list after \"--include-schemes\"." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: Expected timeout after \"--timeout\"." #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: Unable to connect to server: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: Unknown argument \"%s\"." msgid "lpoptions: No printers." msgstr "lpoptions: No printers." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: Unable to add printer or instance: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: Unable to get PPD file for %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: Unable to open PPD file for %s." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: Unknown printer or class." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "Amount of Material" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "Amount Units" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "Grams" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "Kilograms" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "Liters" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "Meters" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "Milliliters" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "Millimeters" #. TRANSLATORS: Material Color msgid "material-color" msgstr "Material Color" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "Material Diameter" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "Material Diameter Tolerance" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "Material Fill Density" #. TRANSLATORS: Material Name msgid "material-name" msgstr "Material Name" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "Material Nozzle Diameter" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "Use Material For" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "Everything" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "Base" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "In-fill" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "Shell" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "Supports" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "Feed Rate" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "Feed Rate Units" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "Milligrams per second" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "Milliliters per second" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "Millimeters per second" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "Material Retraction" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "Material Shell Thickness" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "Material Temperature" #. TRANSLATORS: Material Type msgid "material-type" msgstr "Material Type" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "ABS" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "Carbon Fiber ABS" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "Carbon Nanotube ABS" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "Chocolate" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "Gold" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "Nylon" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "Pet" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "Photopolymer" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "PLA" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "Conductive PLA" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "Pla Dissolvable" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "Flexible PLA" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "Magnetic PLA" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "Steel PLA" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "Stone PLA" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "Wood PLA" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "Polycarbonate" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "Dissolvable PVA" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "Silver" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "Titanium" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "Wax" #. TRANSLATORS: Materials msgid "materials-col" msgstr "Materials" #. TRANSLATORS: Media msgid "media" msgstr "Media" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "Back Coating of Media" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "Glossy" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "High Gloss" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "Matte" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "None" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "Satin" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "Semi-gloss" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "Media Bottom Margin" #. TRANSLATORS: Media msgid "media-col" msgstr "Media" #. TRANSLATORS: Media Color msgid "media-color" msgstr "Media Color" #. TRANSLATORS: Black msgid "media-color.black" msgstr "Black" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "Blue" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "Brown" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "Buff" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "Clear Black" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "Clear Blue" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "Clear Brown" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "Clear Buff" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "Clear Cyan" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "Clear Gold" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "Clear Goldenrod" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "Clear Gray" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "Clear Green" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "Clear Ivory" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "Clear Magenta" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "Clear Multi Color" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "Clear Mustard" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "Clear Orange" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "Clear Pink" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "Clear Red" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "Clear Silver" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "Clear Turquoise" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "Clear Violet" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "Clear White" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "Clear Yellow" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "Cyan" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "Dark Blue" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "Dark Brown" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "Dark Buff" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "Dark Cyan" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "Dark Gold" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "Dark Goldenrod" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "Dark Gray" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "Dark Green" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "Dark Ivory" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "Dark Magenta" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "Dark Mustard" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "Dark Orange" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "Dark Pink" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "Dark Red" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "Dark Silver" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "Dark Turquoise" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "Dark Violet" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "Dark Yellow" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "Gold" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "Goldenrod" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "Gray" #. TRANSLATORS: Green msgid "media-color.green" msgstr "Green" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "Ivory" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "Light Black" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "Light Blue" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "Light Brown" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "Light Buff" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "Light Cyan" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "Light Gold" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "Light Goldenrod" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "Light Gray" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "Light Green" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "Light Ivory" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "Light Magenta" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "Light Mustard" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "Light Orange" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "Light Pink" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "Light Red" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "Light Silver" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "Light Turquoise" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "Light Violet" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "Light Yellow" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "Magenta" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "Multi-color" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "Mustard" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "No Color" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "Orange" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "Pink" #. TRANSLATORS: Red msgid "media-color.red" msgstr "Red" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "Silver" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "Turquoise" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "Violet" #. TRANSLATORS: White msgid "media-color.white" msgstr "White" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "Yellow" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "Front Coating of Media" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "Media Grain" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "Cross-Feed Direction" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "Feed Direction" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "Media Hole Count" #. TRANSLATORS: Media Info msgid "media-info" msgstr "Media Info" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "Force Media" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "Media Left Margin" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "Pre-printed Media" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "Blank" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "Letterhead" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "Pre-printed" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "Recycled Media" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "None" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "Standard" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "Media Right Margin" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "Media Dimensions" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "Media Name" #. TRANSLATORS: Media Source msgid "media-source" msgstr "Media Source" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "Alternate" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "Alternate Roll" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "Automatic" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "Bottom" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "By-pass Tray" #. TRANSLATORS: Center msgid "media-source.center" msgstr "Center" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "Disc" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "Envelope" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "Hagaki" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "Large Capacity" #. TRANSLATORS: Left msgid "media-source.left" msgstr "Left" #. TRANSLATORS: Main msgid "media-source.main" msgstr "Main" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "Main Roll" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "Manual" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "Middle" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "Photo" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "Rear" #. TRANSLATORS: Right msgid "media-source.right" msgstr "Right" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "Roll 1" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "Roll 10" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "Roll 2" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "Roll 3" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "Roll 4" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "Roll 5" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "Roll 6" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "Roll 7" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "Roll 8" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "Roll 9" #. TRANSLATORS: Side msgid "media-source.side" msgstr "Side" #. TRANSLATORS: Top msgid "media-source.top" msgstr "Top" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "Tray 1" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "Tray 10" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "Tray 11" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "Tray 12" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "Tray 13" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "Tray 14" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "Tray 15" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "Tray 16" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "Tray 17" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "Tray 18" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "Tray 19" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "Tray 2" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "Tray 20" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "Tray 3" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "Tray 4" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "Tray 5" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "Tray 6" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "Tray 7" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "Tray 8" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "Tray 9" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "Media Thickness" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "Media Tooth (Texture)" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "Antique" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "Extra Smooth" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "Coarse" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "Fine" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "Linen" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "Medium" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "Smooth" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "Stipple" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "Rough" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "Vellum" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "Media Top Margin" #. TRANSLATORS: Media Type msgid "media-type" msgstr "Media Type" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "Aluminum" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "Automatic" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "Back Print Film" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "Cardboard" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "Cardstock" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "CD" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "Continuous" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "Continuous Long" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "Continuous Short" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "Corrugated Board" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "Optical Disc" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "Glossy Optical Disc" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "High Gloss Optical Disc" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "Matte Optical Disc" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "Satin Optical Disc" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "Semi-Gloss Optical Disc" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "Double Wall" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "Dry Film" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "DVD" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "Embossing Foil" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "End Board" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "Envelope" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "Archival Envelope" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "Bond Envelope" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "Coated Envelope" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "Cotton Envelope" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "Fine Envelope" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "Heavyweight Envelope" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "Inkjet Envelope" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "Lightweight Envelope" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "Plain Envelope" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "Preprinted Envelope" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "Windowed Envelope" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "Fabric" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "Archival Fabric" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "Glossy Fabric" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "High Gloss Fabric" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "Matte Fabric" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "Semi-Gloss Fabric" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "Waterproof Fabric" #. TRANSLATORS: Film msgid "media-type.film" msgstr "Film" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "Flexo Base" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "Flexo Photo Polymer" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "Flute" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "Foil" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "Full Cut Tabs" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "Glass" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "Glass Colored" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "Glass Opaque" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "Glass Surfaced" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "Glass Textured" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "Gravure Cylinder" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "Image Setter Paper" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "Imaging Cylinder" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "Labels" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "Colored Labels" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "Glossy Labels" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "High Gloss Labels" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "Inkjet Labels" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "Matte Labels" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "Permanent Labels" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "Satin Labels" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "Security Labels" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "Semi-Gloss Labels" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "Laminating Foil" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "Letterhead" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "Metal" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "Metal Glossy" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "Metal High Gloss" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "Metal Matte" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "Metal Satin" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "Metal Semi Gloss" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "Mounting Tape" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "Multi Layer" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "Multi Part Form" #. TRANSLATORS: Other msgid "media-type.other" msgstr "Other" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "Paper" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "Photo Paper" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "Photographic Archival" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "Photo Film" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "Glossy Photo Paper" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "High Gloss Photo Paper" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "Matte Photo Paper" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "Satin Photo Paper" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "Semi-Gloss Photo Paper" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "Plastic" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "Plastic Archival" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "Plastic Colored" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "Plastic Glossy" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "Plastic High Gloss" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "Plastic Matte" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "Plastic Satin" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "Plastic Semi Gloss" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "Plate" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "Polyester" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "Pre Cut Tabs" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "Roll" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "Screen" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "Screen Paged" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "Self Adhesive" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "Self Adhesive Film" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "Shrink Foil" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "Single Face" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "Single Wall" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "Sleeve" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "Stationery" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "Stationery Archival" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "Coated Paper" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "Stationery Cotton" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "Vellum Paper" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "Heavyweight Paper" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "Stationery Heavyweight Coated" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "Stationery Inkjet Paper" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "Letterhead" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "Lightweight Paper" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "Preprinted Paper" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "Punched Paper" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "Tab Stock" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "Tractor" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "Transfer" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "Transparency" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "Triple Wall" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "Wet Film" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "Media Weight (grams per m²)" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "28 x 40″" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "A4 or US Letter" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "2a0" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "A0" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "A0x3" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "A10" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "A1" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "A1x3" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "A1x4" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "A2" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "A2x3" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "A2x4" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "A2x5" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "A3 (Extra)" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "A3" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "A3x3" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "A3x4" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "A3x5" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "A3x6" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "A3x7" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "A4 (Extra)" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "A4 (Tab)" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "A4" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "A4x3" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "A4x4" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "A4x5" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "A4x6" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "A4x7" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "A4x8" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "A4x9" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "A5 (Extra)" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "A5" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "A6" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "A7" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "A8" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "A9" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "B0" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "B10" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "B1" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "B2" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "B3" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "B4" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "B5 (Extra)" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "Envelope B5" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "B6" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "Envelope B6/C4" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "B7" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "B8" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "B9" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "CEnvelope 0" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "CEnvelope 10" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "CEnvelope 1" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "CEnvelope 2" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "CEnvelope 3" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "CEnvelope 4" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "CEnvelope 5" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "CEnvelope 6" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "CEnvelope 6c5" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "CEnvelope 7" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "CEnvelope 7c6" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "CEnvelope 8" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "CEnvelope 9" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "Envelope DL" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "Id-1" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "Id-3" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "ISO RA0" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "ISO RA1" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "ISO RA2" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "ISO RA3" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "ISO RA4" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "ISO SRA0" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "ISO SRA1" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "ISO SRA2" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "ISO SRA3" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "ISO SRA4" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "JIS B0" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "JIS B10" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "JIS B1" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "JIS B2" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "JIS B3" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "JIS B4" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "JIS B5" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "JIS B6" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "JIS B7" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "JIS B8" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "JIS B9" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "JIS Executive" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "Envelope Chou 2" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "Envelope Chou 3" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "Envelope Chou 40" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "Envelope Chou 4" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "Hagaki" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "Envelope Kahu" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "270 x 382mm" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "Envelope Kahu 2" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "216 x 277mm" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "197 x 267mm" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "190 x 240mm" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "142 x 205mm" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "119 x 197mm" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "Oufuku Reply Postcard" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "Envelope You 4" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "10 x 11″" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "10 x 13″" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "10 x 14″" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "10 x 15″" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "11 x 12″" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "11 x 15″" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "12 x 19″" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "5 x 7″" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "6 x 9″" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "7 x 9″" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "9 x 11″" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "Envelope A2" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "9 x 12″" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "12 x 18″" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "18 x 24″" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "24 x 36″" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "26 x 38″" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "27 x 39″" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "36 x 48″" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "12 x 19.17″" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "Envelope C5" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "17 x 22″" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "22 x 34″" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "34 x 44″" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "11 x 14″" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "12 x 14″" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "Executive" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "44 x 68″" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "European Fanfold" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "US Fanfold" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "Foolscap" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "8 x 13″" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "8 x 10″" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "3 x 5″" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "6 x 8″" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "4 x 6″" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "5 x 8″" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "Statement" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "11 x 17″" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "US Legal (Extra)" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "US Legal" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "US Letter (Extra)" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "US Letter (Plus)" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "US Letter" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "Envelope Monarch" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "Envelope #10" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "Envelope #11" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "Envelope #12" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "Envelope #14" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "Envelope #9" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "8.5 x 13.4″" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "Envelope Personal" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "Quarto" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "8.94 x 14″" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "13 x 19″" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "30 x 42″" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "12 x 16″" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "14 x 17″" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "18 x 22″" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "17 x 24″" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "2 x 3.5″" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "10 x 12″" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "20 x 24″" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "3.5 x 5″" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "10 x 15″" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "4 x 4″" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "5 x 5″" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "184 x 260mm" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "195 x 270mm" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "55 x 85mm" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "55 x 91mm" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "54 x 86mm" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "275 x 395mm" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "89 x 119mm" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "Folio" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "Folio (Special)" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "Envelope Invitation" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "Envelope Italian" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "198 x 275mm" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "200 x 300" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "130 x 180mm" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "267 x 389mm" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "Envelope Postfix" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "100 x 150mm" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "89 x 89mm" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "100 x 200mm" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "Envelope Chinese #10" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "Chinese 16k" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "Envelope Chinese #1" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "Envelope Chinese #2" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "Chinese 32k" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "Envelope Chinese #3" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "Envelope Chinese #4" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "Envelope Chinese #5" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "Envelope Chinese #6" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "Envelope Chinese #7" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "Envelope Chinese #8" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "ROC 16k" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "ROC 8k" #, c-format msgid "members of class %s:" msgstr "members of class %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "Multiple Document Handling" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "Separate Documents Collated Copies" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "Separate Documents Uncollated Copies" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "Single Document" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "Single Document New Sheet" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "Multiple Object Handling" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "Multiple Object Handling Actual" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "Automatic" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "Best Fit" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "Best Quality" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "Best Speed" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "One At A Time" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "On Timeout" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "Abort Job" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "Hold Job" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "Process Job" msgid "no entries" msgstr "no entries" msgid "no system default destination" msgstr "no system default destination" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "Noise Removal" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "Notify Attributes" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "Notify Charset" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "Notify Events" msgid "notify-events not specified." msgstr "notify-events not specified." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "Document Completed" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "Document Config Changed" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "Document Created" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "Document Fetchable" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "Document State Changed" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "Document Stopped" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "Job Completed" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "Job Config Changed" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "Job Created" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "Job Fetchable" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "Job Progress" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "Job State Changed" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "Job Stopped" #. TRANSLATORS: None msgid "notify-events.none" msgstr "None" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "Printer Config Changed" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "Printer Finishings Changed" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "Printer Media Changed" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "Printer Queue Order Changed" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "Printer Restarted" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "Printer Shutdown" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "Printer State Changed" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "Printer Stopped" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "Notify Get Interval" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "Notify Lease Duration" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "Notify Natural Language" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "Notify Pull Method" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "Notify Recipient" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "notify-recipient-uri URI \"%s\" is already used." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "notify-recipient-uri URI \"%s\" uses unknown scheme." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "Notify Sequence Numbers" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "Notify Subscription Ids" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "Notify Time Interval" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "Notify User Data" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "Notify Wait" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "Number Of Retries" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "Number-Up" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "Object Offset" #. TRANSLATORS: Object Size msgid "object-size" msgstr "Object Size" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "Organization Name" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "Orientation" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "Portrait" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "Landscape" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "Reverse Landscape" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "Reverse Portrait" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "None" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "Scanned Image Options" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "Output Tray" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "Automatic" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "Bottom" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "Center" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "Face Down" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "Face Up" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "Large Capacity" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "Left" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "Mailbox 1" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "Mailbox 10" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "Mailbox 2" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "Mailbox 3" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "Mailbox 4" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "Mailbox 5" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "Mailbox 6" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "Mailbox 7" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "Mailbox 8" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "Mailbox 9" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "Middle" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "My Mailbox" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "Rear" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "Right" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "Side" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "Stacker 1" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "Stacker 10" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "Stacker 2" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "Stacker 3" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "Stacker 4" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "Stacker 5" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "Stacker 6" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "Stacker 7" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "Stacker 8" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "Stacker 9" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "Top" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "Tray 1" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "Tray 10" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "Tray 2" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "Tray 3" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "Tray 4" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "Tray 5" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "Tray 6" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "Tray 7" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "Tray 8" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "Tray 9" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "Scanned Image Quality" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "Page Delivery" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "Reverse Order Face-down" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "Reverse Order Face-up" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "Same Order Face-down" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "Same Order Face-up" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "System Specified" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "Page Order Received" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "1 To N" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "N To 1" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "Page Ranges" #. TRANSLATORS: Pages msgid "pages" msgstr "Pages" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "Pages Per Subset" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "Pclm Raster Back Side" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "Flipped" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "Normal" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "Rotated" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "Pclm Source Resolution" msgid "pending" msgstr "pending" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "Platform Shape" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "Round" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "Rectangle" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "Platform Temperature" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "Post-dial String" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: Adding include directory \"%s\"." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: Adding/updating UI text from %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: Bad boolean value (%s) on line %d of %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: Bad font attribute: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: Bad resolution name \"%s\" on line %d of %s." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: Bad status keyword %s on line %d of %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc: Bad variable substitution ($%c) on line %d of %s." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc: Choice found on line %d of %s with no Option." #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: Duplicate #po for locale %s on line %d of %s." #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: Expected a filter definition on line %d of %s." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: Expected a program name on line %d of %s." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: Expected boolean value on line %d of %s." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "ppdc: Expected charset after Font on line %d of %s." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: Expected choice code on line %d of %s." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: Expected choice name/text on line %d of %s." #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "ppdc: Expected color order for ColorModel on line %d of %s." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "ppdc: Expected colorspace for ColorModel on line %d of %s." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: Expected compression for ColorModel on line %d of %s." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "ppdc: Expected constraints string for UIConstraints on line %d of %s." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc: Expected duplex type after Duplex on line %d of %s." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: Expected encoding after Font on line %d of %s." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "ppdc: Expected filename after #po %s on line %d of %s." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: Expected group name/text on line %d of %s." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: Expected include filename on line %d of %s." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: Expected integer on line %d of %s." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: Expected locale after #po on line %d of %s." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: Expected name after %s on line %d of %s." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: Expected name after FileName on line %d of %s." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: Expected name after Font on line %d of %s." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: Expected name after Manufacturer on line %d of %s." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: Expected name after MediaSize on line %d of %s." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: Expected name after ModelName on line %d of %s." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: Expected name after PCFileName on line %d of %s." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: Expected name/text after %s on line %d of %s." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "ppdc: Expected name/text after Installable on line %d of %s." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "ppdc: Expected name/text after Resolution on line %d of %s." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "ppdc: Expected name/text combination for ColorModel on line %d of %s." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: Expected option name/text on line %d of %s." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: Expected option section on line %d of %s." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: Expected option type on line %d of %s." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "ppdc: Expected override field after Resolution on line %d of %s." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: Expected quoted string on line %d of %s." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: Expected real number on line %d of %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: Expected selector after %s on line %d of %s." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: Expected status after Font on line %d of %s." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: Expected string after Copyright on line %d of %s." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: Expected string after Version on line %d of %s." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: Expected two option names on line %d of %s." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: Expected value after %s on line %d of %s." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: Expected version after Font on line %d of %s." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: Invalid #include/#po filename \"%s\"." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: Invalid cost for filter on line %d of %s." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc: Invalid empty MIME type for filter on line %d of %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "ppdc: Invalid empty program name for filter on line %d of %s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: Invalid option section \"%s\" on line %d of %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: Invalid option type \"%s\" on line %d of %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: Loading driver information file \"%s\"." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: Loading messages for locale \"%s\"." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: Loading messages from \"%s\"." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: Missing #endif at end of \"%s\"." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: Missing #if on line %d of %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" "ppdc: Need a msgid line before any translation strings on line %d of %s." #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: No message catalog provided for locale %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "ppdc: Option %s defined in two different groups on line %d of %s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "ppdc: Option %s redefined with a different type on line %d of %s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc: Option constraint must *name on line %d of %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: Too many nested #if's on line %d of %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: Unable to create PPD file \"%s\" - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: Unable to create output directory %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: Unable to create output pipes: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: Unable to execute cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: Unable to find #po file %s on line %d of %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "ppdc: Unable to find include file \"%s\" on line %d of %s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: Unable to find localization for \"%s\" - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: Unable to load localization file \"%s\" - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: Unable to open %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: Undefined variable (%s) on line %d of %s." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: Unexpected text on line %d of %s." #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: Unknown driver type %s on line %d of %s." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: Unknown duplex type \"%s\" on line %d of %s." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: Unknown media size \"%s\" on line %d of %s." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: Unknown message catalog format for \"%s\"." #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: Unknown token \"%s\" seen on line %d of %s." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc: Unterminated string starting with %c on line %d of %s." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: Warning - overlapping filename \"%s\"." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: Writing %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: Writing PPD files to directory \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: Bad LanguageVersion \"%s\" in %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: Ignoring PPD file %s." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: Unable to backup %s to %s - %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "Pre-dial String" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "Number-Up Layout" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "Top-bottom, Right-left" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "Top-bottom, Left-right" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "Right-left, Top-bottom" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "Right-left, Bottom-top" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "Left-right, Top-bottom" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "Left-right, Bottom-top" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "Bottom-top, Right-left" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "Bottom-top, Left-right" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "Print Accuracy" #. TRANSLATORS: Print Base msgid "print-base" msgstr "Print Base" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "Print Base Actual" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "Brim" #. TRANSLATORS: None msgid "print-base.none" msgstr "None" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "Raft" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "Skirt" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "Standard" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "Print Color Mode" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "Automatic" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "Auto Monochrome" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "Text" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "Color" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "Highlight" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "Monochrome" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "Process Text" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "Process Monochrome" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "Print Optimization" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "Print Optimization" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "Automatic" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "Graphics" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "Graphics" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "Photo" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "Text" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "Text and Graphics" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "Text and Graphics" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "Print Objects" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "Print Quality" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "Draft" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "Normal" #. TRANSLATORS: High msgid "print-quality.5" msgstr "High" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "Print Rendering Intent" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "Absolute" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "Automatic" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "Perceptual" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "Relative" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "Relative w/Black Point Compensation" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "Saturation" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "Print Scaling" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "Automatic" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "Auto-fit" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "Fill" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "Fit" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "None" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "Print Supports" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "Print Supports Actual" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "With Specified Material" #. TRANSLATORS: None msgid "print-supports.none" msgstr "None" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "Standard" #, c-format msgid "printer %s disabled since %s -" msgstr "printer %s disabled since %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "printer %s is holding new jobs. enabled since %s" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "printer %s is idle. enabled since %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "printer %s now printing %s-%d. enabled since %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "printer %s/%s disabled since %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "printer %s/%s is idle. enabled since %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "printer %s/%s now printing %s-%d. enabled since %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "Printer Kind" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "Disc" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "Document" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "Envelope" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "Label" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "Large format" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "Photo" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "Postcard" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "Receipt" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "Roll" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "Message From Operator" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "Print Resolution" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "Printer State" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "Detailed Printer State" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "Old Alerts Have Been Removed" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "Bander Added" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "Bander Almost Empty" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "Bander Almost Full" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "Bander At Limit" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "Bander Closed" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "Bander Configuration Change" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "Bander Cover Closed" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "Bander Cover Open" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "Bander Empty" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "Bander Full" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "Bander Interlock Closed" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "Bander Interlock Open" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "Bander Jam" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "Bander Life Almost Over" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "Bander Life Over" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "Bander Memory Exhausted" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "Bander Missing" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "Bander Motor Failure" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "Bander Near Limit" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "Bander Offline" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "Bander Opened" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "Bander Over Temperature" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "Bander Power Saver" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "Bander Recoverable Failure" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "Bander Recoverable Storage" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "Bander Removed" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "Bander Resource Added" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "Bander Resource Removed" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "Bander Thermistor Failure" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "Bander Timing Failure" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "Bander Turned Off" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "Bander Turned On" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "Bander Under Temperature" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "Bander Unrecoverable Failure" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "Bander Unrecoverable Storage Error" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "Bander Warming Up" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "Binder Added" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "Binder Almost Empty" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "Binder Almost Full" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "Binder At Limit" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "Binder Closed" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "Binder Configuration Change" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "Binder Cover Closed" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "Binder Cover Open" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "Binder Empty" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "Binder Full" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "Binder Interlock Closed" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "Binder Interlock Open" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "Binder Jam" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "Binder Life Almost Over" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "Binder Life Over" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "Binder Memory Exhausted" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "Binder Missing" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "Binder Motor Failure" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "Binder Near Limit" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "Binder Offline" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "Binder Opened" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "Binder Over Temperature" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "Binder Power Saver" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "Binder Recoverable Failure" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "Binder Recoverable Storage" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "Binder Removed" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "Binder Resource Added" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "Binder Resource Removed" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "Binder Thermistor Failure" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "Binder Timing Failure" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "Binder Turned Off" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "Binder Turned On" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "Binder Under Temperature" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "Binder Unrecoverable Failure" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "Binder Unrecoverable Storage Error" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "Binder Warming Up" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "Camera Failure" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "Chamber Cooling" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "Chamber Failure" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "Chamber Heating" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "Chamber Temperature High" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "Chamber Temperature Low" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "Cleaner Life Almost Over" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "Cleaner Life Over" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "Configuration Change" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "Connecting To Device" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "Cover Open" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "Deactivated" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "Developer Empty" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "Developer Low" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "Die Cutter Added" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "Die Cutter Almost Empty" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "Die Cutter Almost Full" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "Die Cutter At Limit" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "Die Cutter Closed" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "Die Cutter Configuration Change" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "Die Cutter Cover Closed" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "Die Cutter Cover Open" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "Die Cutter Empty" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "Die Cutter Full" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "Die Cutter Interlock Closed" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "Die Cutter Interlock Open" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "Die Cutter Jam" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "Die Cutter Life Almost Over" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "Die Cutter Life Over" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "Die Cutter Memory Exhausted" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "Die Cutter Missing" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "Die Cutter Motor Failure" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "Die Cutter Near Limit" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "Die Cutter Offline" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "Die Cutter Opened" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "Die Cutter Over Temperature" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "Die Cutter Power Saver" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "Die Cutter Recoverable Failure" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "Die Cutter Recoverable Storage" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "Die Cutter Removed" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "Die Cutter Resource Added" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "Die Cutter Resource Removed" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "Die Cutter Thermistor Failure" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "Die Cutter Timing Failure" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "Die Cutter Turned Off" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "Die Cutter Turned On" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "Die Cutter Under Temperature" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "Die Cutter Unrecoverable Failure" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "Die Cutter Unrecoverable Storage Error" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "Die Cutter Warming Up" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "Door Open" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "Extruder Cooling" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "Extruder Failure" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "Extruder Heating" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "Extruder Jam" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "Extruder Temperature High" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "Extruder Temperature Low" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "Fan Failure" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "Fax Modem Life Almost Over" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "Fax Modem Life Over" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "Fax Modem Missing" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "Fax Modem Turned Off" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "Fax Modem Turned On" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "Folder Added" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "Folder Almost Empty" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "Folder Almost Full" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "Folder At Limit" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "Folder Closed" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "Folder Configuration Change" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "Folder Cover Closed" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "Folder Cover Open" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "Folder Empty" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "Folder Full" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "Folder Interlock Closed" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "Folder Interlock Open" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "Folder Jam" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "Folder Life Almost Over" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "Folder Life Over" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "Folder Memory Exhausted" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "Folder Missing" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "Folder Motor Failure" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "Folder Near Limit" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "Folder Offline" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "Folder Opened" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "Folder Over Temperature" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "Folder Power Saver" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "Folder Recoverable Failure" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "Folder Recoverable Storage" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "Folder Removed" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "Folder Resource Added" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "Folder Resource Removed" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "Folder Thermistor Failure" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "Folder Timing Failure" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "Folder Turned Off" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "Folder Turned On" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "Folder Under Temperature" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "Folder Unrecoverable Failure" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "Folder Unrecoverable Storage Error" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "Folder Warming Up" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "Fuser Over Temp" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "Fuser Under Temp" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "Hold New Jobs" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "Identify Printer" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "Imprinter Added" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "Imprinter Almost Empty" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "Imprinter Almost Full" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "Imprinter At Limit" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "Imprinter Closed" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "Imprinter Configuration Change" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "Imprinter Cover Closed" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "Imprinter Cover Open" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "Imprinter Empty" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "Imprinter Full" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "Imprinter Interlock Closed" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "Imprinter Interlock Open" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "Imprinter Jam" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "Imprinter Life Almost Over" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "Imprinter Life Over" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "Imprinter Memory Exhausted" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "Imprinter Missing" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "Imprinter Motor Failure" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "Imprinter Near Limit" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "Imprinter Offline" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "Imprinter Opened" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "Imprinter Over Temperature" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "Imprinter Power Saver" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "Imprinter Recoverable Failure" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "Imprinter Recoverable Storage" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "Imprinter Removed" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "Imprinter Resource Added" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "Imprinter Resource Removed" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "Imprinter Thermistor Failure" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "Imprinter Timing Failure" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "Imprinter Turned Off" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "Imprinter Turned On" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "Imprinter Under Temperature" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "Imprinter Unrecoverable Failure" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "Imprinter Unrecoverable Storage Error" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "Imprinter Warming Up" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "Input Cannot Feed Size Selected" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "Input Manual Input Request" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "Input Media Color Change" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "Input Media Form Parts Change" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "Input Media Size Change" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "Input Media Tray Failure" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "Input Media Tray Feed Error" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "Input Media Tray Jam" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "Input Media Type Change" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "Input Media Weight Change" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "Input Pick Roller Failure" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "Input Pick Roller Life Over" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "Input Pick Roller Life Warn" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "Input Pick Roller Missing" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "Input Tray Elevation Failure" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "Input Tray Missing" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "Input Tray Position Failure" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "Inserter Added" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "Inserter Almost Empty" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "Inserter Almost Full" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "Inserter At Limit" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "Inserter Closed" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "Inserter Configuration Change" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "Inserter Cover Closed" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "Inserter Cover Open" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "Inserter Empty" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "Inserter Full" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "Inserter Interlock Closed" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "Inserter Interlock Open" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "Inserter Jam" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "Inserter Life Almost Over" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "Inserter Life Over" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "Inserter Memory Exhausted" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "Inserter Missing" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "Inserter Motor Failure" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "Inserter Near Limit" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "Inserter Offline" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "Inserter Opened" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "Inserter Over Temperature" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "Inserter Power Saver" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "Inserter Recoverable Failure" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "Inserter Recoverable Storage" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "Inserter Removed" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "Inserter Resource Added" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "Inserter Resource Removed" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "Inserter Thermistor Failure" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "Inserter Timing Failure" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "Inserter Turned Off" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "Inserter Turned On" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "Inserter Under Temperature" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "Inserter Unrecoverable Failure" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "Inserter Unrecoverable Storage Error" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "Inserter Warming Up" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "Interlock Closed" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "Interlock Open" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "Interpreter Cartridge Added" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "Interpreter Cartridge Removed" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "Interpreter Complex Page Encountered" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "Interpreter Memory Decrease" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "Interpreter Memory Increase" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "Interpreter Resource Added" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "Interpreter Resource Deleted" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "Interpreter Resource Unavailable" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "Lamp At End of Life" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "Lamp Failure" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "Lamp Near End of Life" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "Laser At End of Life" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "Laser Failure" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "Laser Near End of Life" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "Envelope Maker Added" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "Envelope Maker Almost Empty" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "Envelope Maker Almost Full" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "Envelope Maker At Limit" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "Envelope Maker Closed" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "Envelope Maker Configuration Change" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "Envelope Maker Cover Closed" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "Envelope Maker Cover Open" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "Envelope Maker Empty" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "Envelope Maker Full" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "Envelope Maker Interlock Closed" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "Envelope Maker Interlock Open" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "Envelope Maker Jam" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "Envelope Maker Life Almost Over" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "Envelope Maker Life Over" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "Envelope Maker Memory Exhausted" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "Envelope Maker Missing" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "Envelope Maker Motor Failure" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "Envelope Maker Near Limit" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "Envelope Maker Offline" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "Envelope Maker Opened" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "Envelope Maker Over Temperature" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "Envelope Maker Power Saver" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "Envelope Maker Recoverable Failure" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "Envelope Maker Recoverable Storage" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "Envelope Maker Removed" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "Envelope Maker Resource Added" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "Envelope Maker Resource Removed" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "Envelope Maker Thermistor Failure" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "Envelope Maker Timing Failure" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "Envelope Maker Turned Off" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "Envelope Maker Turned On" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "Envelope Maker Under Temperature" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "Envelope Maker Unrecoverable Failure" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "Envelope Maker Unrecoverable Storage Error" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "Envelope Maker Warming Up" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "Marker Adjusting Print Quality" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "Marker Cleaner Missing" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "Marker Developer Almost Empty" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "Marker Developer Empty" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "Marker Developer Missing" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "Marker Fuser Missing" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "Marker Fuser Thermistor Failure" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "Marker Fuser Timing Failure" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "Low ink" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "Ink empty" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "Ink missing" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "OPC missing" #. TRANSLATORS: Print ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "Print ribbon Almost Empty" #. TRANSLATORS: Print ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "Print ribbon Empty" #. TRANSLATORS: Print ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "Print ribbon missing" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "Ink/toner almost empty" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "Ink/toner empty" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "Ink/toner low" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "Ink/toner missing" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "Toner cartridge missing" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "Toner missing" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "Ink/toner waste bin almost full" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "Ink/toner waste bin full" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "Marker Waste Ink Receptacle Almost Full" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "Marker Waste Ink Receptacle Full" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "Marker Waste Ink Receptacle Missing" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "Ink/toner waste bin missing" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "Marker Waste Toner Receptacle Almost Full" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "Marker Waste Toner Receptacle Full" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "Marker Waste Toner Receptacle Missing" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "Material Empty" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "Material Low" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "Material Needed" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "Media Drying" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "Media Empty" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "Media Jam" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "Paper tray is almost empty" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "Load paper" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "Media Path Cannot Do 2-Sided Printing" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "Media Path Failure" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "Media Path Input Empty" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "Media Path Input Feed Error" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "Media Path Input Jam" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "Media Path Input Request" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "Media Path Jam" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "Media Path Media Tray Almost Full" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "Media Path Media Tray Full" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "Media Path Media Tray Missing" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "Media Path Output Feed Error" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "Media Path Output Full" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "Media Path Output Jam" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "Media Path Pick Roller Failure" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "Media Path Pick Roller Life Over" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "Media Path Pick Roller Life Warn" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "Media Path Pick Roller Missing" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "Motor Failure" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "Moving To Paused" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "None" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "Optical Photoconductor Life Over" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "Optical Photoconductor Near End-of-life" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "Other" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "Output Area Almost Full" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "Output Area Full" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "Output Mailbox Select Failure" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "Output Media Tray Failure" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "Output Media Tray Feed Error" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "Output Media Tray Jam" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "Output Tray Missing" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "Paused" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "Perforater Added" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "Perforater Almost Empty" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "Perforater Almost Full" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "Perforater At Limit" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "Perforater Closed" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "Perforater Configuration Change" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "Perforater Cover Closed" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "Perforater Cover Open" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "Perforater Empty" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "Perforater Full" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "Perforater Interlock Closed" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "Perforater Interlock Open" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "Perforater Jam" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "Perforater Life Almost Over" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "Perforater Life Over" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "Perforater Memory Exhausted" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "Perforater Missing" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "Perforater Motor Failure" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "Perforater Near Limit" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "Perforater Offline" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "Perforater Opened" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "Perforater Over Temperature" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "Perforater Power Saver" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "Perforater Recoverable Failure" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "Perforater Recoverable Storage" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "Perforater Removed" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "Perforater Resource Added" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "Perforater Resource Removed" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "Perforater Thermistor Failure" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "Perforater Timing Failure" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "Perforater Turned Off" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "Perforater Turned On" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "Perforater Under Temperature" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "Perforater Unrecoverable Failure" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "Perforater Unrecoverable Storage Error" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "Perforater Warming Up" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "Platform Cooling" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "Platform Failure" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "Platform Heating" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "Platform Temperature High" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "Platform Temperature Low" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "Power Down" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "Power Up" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "Printer Reset Manually" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "Printer Reset Remotely" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "Printer Ready To Print" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "Puncher Added" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "Puncher Almost Empty" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "Puncher Almost Full" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "Puncher At Limit" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "Puncher Closed" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "Puncher Configuration Change" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "Puncher Cover Closed" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "Puncher Cover Open" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "Puncher Empty" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "Puncher Full" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "Puncher Interlock Closed" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "Puncher Interlock Open" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "Puncher Jam" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "Puncher Life Almost Over" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "Puncher Life Over" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "Puncher Memory Exhausted" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "Puncher Missing" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "Puncher Motor Failure" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "Puncher Near Limit" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "Puncher Offline" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "Puncher Opened" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "Puncher Over Temperature" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "Puncher Power Saver" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "Puncher Recoverable Failure" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "Puncher Recoverable Storage" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "Puncher Removed" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "Puncher Resource Added" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "Puncher Resource Removed" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "Puncher Thermistor Failure" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "Puncher Timing Failure" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "Puncher Turned Off" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "Puncher Turned On" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "Puncher Under Temperature" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "Puncher Unrecoverable Failure" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "Puncher Unrecoverable Storage Error" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "Puncher Warming Up" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "Separation Cutter Added" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "Separation Cutter Almost Empty" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "Separation Cutter Almost Full" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "Separation Cutter At Limit" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "Separation Cutter Closed" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "Separation Cutter Configuration Change" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "Separation Cutter Cover Closed" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "Separation Cutter Cover Open" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "Separation Cutter Empty" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "Separation Cutter Full" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "Separation Cutter Interlock Closed" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "Separation Cutter Interlock Open" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "Separation Cutter Jam" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "Separation Cutter Life Almost Over" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "Separation Cutter Life Over" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "Separation Cutter Memory Exhausted" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "Separation Cutter Missing" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "Separation Cutter Motor Failure" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "Separation Cutter Near Limit" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "Separation Cutter Offline" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "Separation Cutter Opened" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "Separation Cutter Over Temperature" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "Separation Cutter Power Saver" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "Separation Cutter Recoverable Failure" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "Separation Cutter Recoverable Storage" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "Separation Cutter Removed" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "Separation Cutter Resource Added" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "Separation Cutter Resource Removed" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "Separation Cutter Thermistor Failure" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "Separation Cutter Timing Failure" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "Separation Cutter Turned Off" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "Separation Cutter Turned On" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "Separation Cutter Under Temperature" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "Separation Cutter Unrecoverable Failure" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "Separation Cutter Unrecoverable Storage Error" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "Separation Cutter Warming Up" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "Sheet Rotator Added" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "Sheet Rotator Almost Empty" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "Sheet Rotator Almost Full" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "Sheet Rotator At Limit" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "Sheet Rotator Closed" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "Sheet Rotator Configuration Change" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "Sheet Rotator Cover Closed" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "Sheet Rotator Cover Open" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "Sheet Rotator Empty" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "Sheet Rotator Full" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "Sheet Rotator Interlock Closed" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "Sheet Rotator Interlock Open" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "Sheet Rotator Jam" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "Sheet Rotator Life Almost Over" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "Sheet Rotator Life Over" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "Sheet Rotator Memory Exhausted" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "Sheet Rotator Missing" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "Sheet Rotator Motor Failure" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "Sheet Rotator Near Limit" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "Sheet Rotator Offline" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "Sheet Rotator Opened" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "Sheet Rotator Over Temperature" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "Sheet Rotator Power Saver" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "Sheet Rotator Recoverable Failure" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "Sheet Rotator Recoverable Storage" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "Sheet Rotator Removed" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "Sheet Rotator Resource Added" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "Sheet Rotator Resource Removed" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "Sheet Rotator Thermistor Failure" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "Sheet Rotator Timing Failure" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "Sheet Rotator Turned Off" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "Sheet Rotator Turned On" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "Sheet Rotator Under Temperature" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "Sheet Rotator Unrecoverable Failure" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "Sheet Rotator Unrecoverable Storage Error" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "Sheet Rotator Warming Up" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "Shutdown" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "Slitter Added" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "Slitter Almost Empty" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "Slitter Almost Full" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "Slitter At Limit" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "Slitter Closed" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "Slitter Configuration Change" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "Slitter Cover Closed" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "Slitter Cover Open" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "Slitter Empty" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "Slitter Full" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "Slitter Interlock Closed" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "Slitter Interlock Open" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "Slitter Jam" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "Slitter Life Almost Over" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "Slitter Life Over" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "Slitter Memory Exhausted" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "Slitter Missing" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "Slitter Motor Failure" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "Slitter Near Limit" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "Slitter Offline" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "Slitter Opened" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "Slitter Over Temperature" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "Slitter Power Saver" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "Slitter Recoverable Failure" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "Slitter Recoverable Storage" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "Slitter Removed" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "Slitter Resource Added" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "Slitter Resource Removed" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "Slitter Thermistor Failure" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "Slitter Timing Failure" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "Slitter Turned Off" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "Slitter Turned On" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "Slitter Under Temperature" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "Slitter Unrecoverable Failure" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "Slitter Unrecoverable Storage Error" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "Slitter Warming Up" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "Spool Area Full" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "Stacker Added" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "Stacker Almost Empty" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "Stacker Almost Full" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "Stacker At Limit" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "Stacker Closed" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "Stacker Configuration Change" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "Stacker Cover Closed" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "Stacker Cover Open" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "Stacker Empty" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "Stacker Full" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "Stacker Interlock Closed" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "Stacker Interlock Open" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "Stacker Jam" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "Stacker Life Almost Over" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "Stacker Life Over" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "Stacker Memory Exhausted" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "Stacker Missing" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "Stacker Motor Failure" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "Stacker Near Limit" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "Stacker Offline" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "Stacker Opened" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "Stacker Over Temperature" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "Stacker Power Saver" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "Stacker Recoverable Failure" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "Stacker Recoverable Storage" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "Stacker Removed" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "Stacker Resource Added" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "Stacker Resource Removed" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "Stacker Thermistor Failure" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "Stacker Timing Failure" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "Stacker Turned Off" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "Stacker Turned On" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "Stacker Under Temperature" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "Stacker Unrecoverable Failure" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "Stacker Unrecoverable Storage Error" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "Stacker Warming Up" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "Stapler Added" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "Stapler Almost Empty" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "Stapler Almost Full" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "Stapler At Limit" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "Stapler Closed" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "Stapler Configuration Change" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "Stapler Cover Closed" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "Stapler Cover Open" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "Stapler Empty" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "Stapler Full" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "Stapler Interlock Closed" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "Stapler Interlock Open" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "Stapler Jam" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "Stapler Life Almost Over" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "Stapler Life Over" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "Stapler Memory Exhausted" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "Stapler Missing" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "Stapler Motor Failure" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "Stapler Near Limit" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "Stapler Offline" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "Stapler Opened" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "Stapler Over Temperature" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "Stapler Power Saver" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "Stapler Recoverable Failure" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "Stapler Recoverable Storage" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "Stapler Removed" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "Stapler Resource Added" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "Stapler Resource Removed" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "Stapler Thermistor Failure" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "Stapler Timing Failure" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "Stapler Turned Off" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "Stapler Turned On" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "Stapler Under Temperature" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "Stapler Unrecoverable Failure" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "Stapler Unrecoverable Storage Error" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "Stapler Warming Up" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "Stitcher Added" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "Stitcher Almost Empty" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "Stitcher Almost Full" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "Stitcher At Limit" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "Stitcher Closed" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "Stitcher Configuration Change" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "Stitcher Cover Closed" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "Stitcher Cover Open" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "Stitcher Empty" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "Stitcher Full" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "Stitcher Interlock Closed" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "Stitcher Interlock Open" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "Stitcher Jam" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "Stitcher Life Almost Over" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "Stitcher Life Over" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "Stitcher Memory Exhausted" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "Stitcher Missing" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "Stitcher Motor Failure" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "Stitcher Near Limit" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "Stitcher Offline" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "Stitcher Opened" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "Stitcher Over Temperature" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "Stitcher Power Saver" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "Stitcher Recoverable Failure" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "Stitcher Recoverable Storage" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "Stitcher Removed" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "Stitcher Resource Added" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "Stitcher Resource Removed" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "Stitcher Thermistor Failure" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "Stitcher Timing Failure" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "Stitcher Turned Off" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "Stitcher Turned On" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "Stitcher Under Temperature" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "Stitcher Unrecoverable Failure" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "Stitcher Unrecoverable Storage Error" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "Stitcher Warming Up" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "Stopped Partly" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "Stopping" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "Subunit Added" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "Subunit Almost Empty" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "Subunit Almost Full" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "Subunit At Limit" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "Subunit Closed" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "Subunit Cooling Down" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "Subunit Empty" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "Subunit Full" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "Subunit Life Almost Over" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "Subunit Life Over" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "Subunit Memory Exhausted" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "Subunit Missing" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "Subunit Motor Failure" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "Subunit Near Limit" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "Subunit Offline" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "Subunit Opened" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "Subunit Over Temperature" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "Subunit Power Saver" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "Subunit Recoverable Failure" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "Subunit Recoverable Storage" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "Subunit Removed" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "Subunit Resource Added" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "Subunit Resource Removed" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "Subunit Thermistor Failure" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "Subunit Timing Failure" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "Subunit Turned Off" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "Subunit Turned On" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "Subunit Under Temperature" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "Subunit Unrecoverable Failure" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "Subunit Unrecoverable Storage" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "Subunit Warming Up" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "Timed Out" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "Toner Empty" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "Toner Low" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "Trimmer Added" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "Trimmer Almost Empty" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "Trimmer Almost Full" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "Trimmer At Limit" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "Trimmer Closed" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "Trimmer Configuration Change" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "Trimmer Cover Closed" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "Trimmer Cover Open" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "Trimmer Empty" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "Trimmer Full" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "Trimmer Interlock Closed" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "Trimmer Interlock Open" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "Trimmer Jam" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "Trimmer Life Almost Over" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "Trimmer Life Over" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "Trimmer Memory Exhausted" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "Trimmer Missing" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "Trimmer Motor Failure" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "Trimmer Near Limit" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "Trimmer Offline" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "Trimmer Opened" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "Trimmer Over Temperature" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "Trimmer Power Saver" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "Trimmer Recoverable Failure" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "Trimmer Recoverable Storage" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "Trimmer Removed" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "Trimmer Resource Added" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "Trimmer Resource Removed" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "Trimmer Thermistor Failure" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "Trimmer Timing Failure" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "Trimmer Turned Off" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "Trimmer Turned On" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "Trimmer Under Temperature" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "Trimmer Unrecoverable Failure" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "Trimmer Unrecoverable Storage Error" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "Trimmer Warming Up" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "Unknown" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "Wrapper Added" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "Wrapper Almost Empty" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "Wrapper Almost Full" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "Wrapper At Limit" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "Wrapper Closed" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "Wrapper Configuration Change" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "Wrapper Cover Closed" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "Wrapper Cover Open" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "Wrapper Empty" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "Wrapper Full" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "Wrapper Interlock Closed" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "Wrapper Interlock Open" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "Wrapper Jam" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "Wrapper Life Almost Over" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "Wrapper Life Over" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "Wrapper Memory Exhausted" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "Wrapper Missing" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "Wrapper Motor Failure" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "Wrapper Near Limit" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "Wrapper Offline" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "Wrapper Opened" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "Wrapper Over Temperature" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "Wrapper Power Saver" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "Wrapper Recoverable Failure" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "Wrapper Recoverable Storage" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "Wrapper Removed" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "Wrapper Resource Added" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "Wrapper Resource Removed" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "Wrapper Thermistor Failure" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "Wrapper Timing Failure" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "Wrapper Turned Off" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "Wrapper Turned On" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "Wrapper Under Temperature" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "Wrapper Unrecoverable Failure" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "Wrapper Unrecoverable Storage Error" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "Wrapper Warming Up" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "Idle" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "Processing" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "Stopped" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "Printer Uptime" msgid "processing" msgstr "processing" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "Proof Print" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "Proof Print Copies" #. TRANSLATORS: Punching msgid "punching" msgstr "Punching" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "Punching Locations" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "Punching Offset" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "Punch Edge" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "Bottom" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "Left" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "Right" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "Top" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "request id is %s-%d (%d file(s))" msgid "request-id uses indefinite length" msgstr "request-id uses indefinite length" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "Requested Attributes" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "Retry Interval" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "Retry Timeout" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "Save Disposition" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "None" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "Print and Save" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "Save Only" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "Save Document Format" #. TRANSLATORS: Save Info msgid "save-info" msgstr "Save Info" #. TRANSLATORS: Save Location msgid "save-location" msgstr "Save Location" #. TRANSLATORS: Save Name msgid "save-name" msgstr "Save Name" msgid "scheduler is not running" msgstr "scheduler is not running" msgid "scheduler is running" msgstr "scheduler is running" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "Separator Sheets" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "Type of Separator Sheets" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "Start and End Sheets" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "End Sheet" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "None" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "Slip Sheets" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "Start Sheet" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "2-Sided Printing" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "Off" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "On (Portrait)" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "On (Landscape)" #, c-format msgid "stat of %s failed: %s" msgstr "stat of %s failed: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tShow status of daemon and queue." #. TRANSLATORS: Status Message msgid "status-message" msgstr "Status Message" #. TRANSLATORS: Staple msgid "stitching" msgstr "Staple" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "Stitching Angle" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "Stitching Locations" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "Staple Method" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "Automatic" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "Crimp" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "Wire" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "Stitching Offset" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "Staple Edge" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "Bottom" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "Left" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "Right" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "Top" msgid "stopped" msgstr "stopped" #. TRANSLATORS: Subject msgid "subject" msgstr "Subject" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "Subscription Privacy Attributes" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "All" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "Default" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "None" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "Subscription Description" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "Subscription Template" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "Subscription Privacy Scope" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "All" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "Default" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "None" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "Owner" #, c-format msgid "system default destination: %s" msgstr "system default destination: %s" #, c-format msgid "system default destination: %s/%s" msgstr "system default destination: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "To Name" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "Transmission Status" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "Pending" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "Pending Retry" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "Processing" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "Canceled" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "Aborted" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "Completed" #. TRANSLATORS: Cut msgid "trimming" msgstr "Cut" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "Cut Position" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "Cut Edge" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "Bottom" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "Left" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "Right" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "Top" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "Type of Cut" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "Draw Line" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "Full" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "Partial" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "Perforate" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "Score" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "Tab" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "Cut After" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "Every Document" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "Job" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "Every Set" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "Every Page" msgid "unknown" msgstr "unknown" msgid "untitled" msgstr "untitled" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings uses indefinite length" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "X Accuracy" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "X Dimension" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "X Offset" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "X Origin" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "Y Accuracy" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "Y Dimension" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "Y Offset" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "Y Origin" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "Z Accuracy" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "Z Dimension" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "Z Offset" msgid "{service_domain} Domain name" msgstr "{service_domain} Domain name" msgid "{service_hostname} Fully-qualified domain name" msgstr "{service_hostname} Fully-qualified domain name" msgid "{service_name} Service instance name" msgstr "{service_name} Service instance name" msgid "{service_port} Port number" msgstr "{service_port} Port number" msgid "{service_regtype} DNS-SD registration type" msgstr "{service_regtype} DNS-SD registration type" msgid "{service_scheme} URI scheme" msgstr "{service_scheme} URI scheme" msgid "{service_uri} URI" msgstr "{service_uri} URI" msgid "{txt_*} Value of TXT record key" msgstr "{txt_*} Value of TXT record key" msgid "{} URI" msgstr "{} URI" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "~/.cups/lpoptions file names default destination that does not exist." cups-2.3.1/locale/cups.pot000664 000765 000024 00001437747 13574721672 015563 0ustar00mikestaff000000 000000 # # Message catalog template for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # # Notes for Translators: # # The "checkpo" program located in the "locale" source directory can be used # to verify that your translations do not introduce formatting errors or other # problems. Run with: # # cd locale # ./checkpo cups_LL.po # # where "LL" is your locale. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: CUPS 2.3.0\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\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 \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: systemv/lpstat.c:1871 systemv/lpstat.c:1990 msgid "\t\t(all)" msgstr "" #: systemv/lpstat.c:1874 systemv/lpstat.c:1877 systemv/lpstat.c:1993 #: systemv/lpstat.c:1996 msgid "\t\t(none)" msgstr "" #: berkeley/lpc.c:416 #, c-format msgid "\t%d entries" msgstr "" #: systemv/lpstat.c:812 systemv/lpstat.c:828 #, c-format msgid "\t%s" msgstr "" #: systemv/lpstat.c:1852 systemv/lpstat.c:1971 msgid "\tAfter fault: continue" msgstr "" #: systemv/lpstat.c:1488 systemv/lpstat.c:1825 systemv/lpstat.c:1945 #, c-format msgid "\tAlerts: %s" msgstr "" #: systemv/lpstat.c:1875 systemv/lpstat.c:1994 msgid "\tBanner required" msgstr "" #: systemv/lpstat.c:1876 systemv/lpstat.c:1995 msgid "\tCharset sets:" msgstr "" #: systemv/lpstat.c:1844 systemv/lpstat.c:1963 msgid "\tConnection: direct" msgstr "" #: systemv/lpstat.c:1835 systemv/lpstat.c:1955 msgid "\tConnection: remote" msgstr "" #: systemv/lpstat.c:1801 systemv/lpstat.c:1921 msgid "\tContent types: any" msgstr "" #: systemv/lpstat.c:1879 systemv/lpstat.c:1998 msgid "\tDefault page size:" msgstr "" #: systemv/lpstat.c:1878 systemv/lpstat.c:1997 msgid "\tDefault pitch:" msgstr "" #: systemv/lpstat.c:1880 systemv/lpstat.c:1999 msgid "\tDefault port settings:" msgstr "" #: systemv/lpstat.c:1807 systemv/lpstat.c:1927 #, c-format msgid "\tDescription: %s" msgstr "" #: systemv/lpstat.c:1800 systemv/lpstat.c:1920 msgid "\tForm mounted:" msgstr "" #: systemv/lpstat.c:1873 systemv/lpstat.c:1992 msgid "\tForms allowed:" msgstr "" #: systemv/lpstat.c:1839 systemv/lpstat.c:1959 #, c-format msgid "\tInterface: %s.ppd" msgstr "" #: systemv/lpstat.c:1848 systemv/lpstat.c:1967 #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "" #: systemv/lpstat.c:1830 systemv/lpstat.c:1950 #, c-format msgid "\tLocation: %s" msgstr "" #: systemv/lpstat.c:1851 systemv/lpstat.c:1970 msgid "\tOn fault: no alert" msgstr "" #: systemv/lpstat.c:1802 systemv/lpstat.c:1922 msgid "\tPrinter types: unknown" msgstr "" #: systemv/lpstat.c:1471 #, c-format msgid "\tStatus: %s" msgstr "" #: systemv/lpstat.c:1856 systemv/lpstat.c:1870 systemv/lpstat.c:1975 #: systemv/lpstat.c:1989 msgid "\tUsers allowed:" msgstr "" #: systemv/lpstat.c:1863 systemv/lpstat.c:1982 msgid "\tUsers denied:" msgstr "" #: berkeley/lpc.c:418 msgid "\tdaemon present" msgstr "" #: berkeley/lpc.c:414 msgid "\tno entries" msgstr "" #: berkeley/lpc.c:386 berkeley/lpc.c:398 #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "" #: berkeley/lpc.c:411 msgid "\tprinting is disabled" msgstr "" #: berkeley/lpc.c:409 msgid "\tprinting is enabled" msgstr "" #: systemv/lpstat.c:1491 #, c-format msgid "\tqueued for %s" msgstr "" #: berkeley/lpc.c:406 msgid "\tqueuing is disabled" msgstr "" #: berkeley/lpc.c:404 msgid "\tqueuing is enabled" msgstr "" #: systemv/lpstat.c:1793 systemv/lpstat.c:1913 msgid "\treason unknown" msgstr "" #: systemv/cupstestppd.c:431 msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" #: systemv/cupstestppd.c:387 systemv/cupstestppd.c:392 msgid " REF: Page 15, section 3.1." msgstr "" #: systemv/cupstestppd.c:382 msgid " REF: Page 15, section 3.2." msgstr "" #: systemv/cupstestppd.c:402 msgid " REF: Page 19, section 3.3." msgstr "" #: systemv/cupstestppd.c:355 msgid " REF: Page 20, section 3.4." msgstr "" #: systemv/cupstestppd.c:407 msgid " REF: Page 27, section 3.5." msgstr "" #: systemv/cupstestppd.c:350 msgid " REF: Page 42, section 5.2." msgstr "" #: systemv/cupstestppd.c:397 msgid " REF: Pages 16-17, section 3.2." msgstr "" #: systemv/cupstestppd.c:367 msgid " REF: Pages 42-45, section 5.2." msgstr "" #: systemv/cupstestppd.c:361 msgid " REF: Pages 45-46, section 5.2." msgstr "" #: systemv/cupstestppd.c:372 msgid " REF: Pages 48-49, section 5.2." msgstr "" #: systemv/cupstestppd.c:377 msgid " REF: Pages 52-54, section 5.2." msgstr "" #: berkeley/lpq.c:533 #, c-format msgid " %-39.39s %.0f bytes" msgstr "" #: systemv/cupstestppd.c:566 #, c-format msgid " PASS Default%s" msgstr "" #: systemv/cupstestppd.c:501 msgid " PASS DefaultImageableArea" msgstr "" #: systemv/cupstestppd.c:535 msgid " PASS DefaultPaperDimension" msgstr "" #: systemv/cupstestppd.c:608 msgid " PASS FileVersion" msgstr "" #: systemv/cupstestppd.c:652 msgid " PASS FormatVersion" msgstr "" #: systemv/cupstestppd.c:672 msgid " PASS LanguageEncoding" msgstr "" #: systemv/cupstestppd.c:692 msgid " PASS LanguageVersion" msgstr "" #: systemv/cupstestppd.c:746 msgid " PASS Manufacturer" msgstr "" #: systemv/cupstestppd.c:786 msgid " PASS ModelName" msgstr "" #: systemv/cupstestppd.c:806 msgid " PASS NickName" msgstr "" #: systemv/cupstestppd.c:866 msgid " PASS PCFileName" msgstr "" #: systemv/cupstestppd.c:941 msgid " PASS PSVersion" msgstr "" #: systemv/cupstestppd.c:846 msgid " PASS PageRegion" msgstr "" #: systemv/cupstestppd.c:826 msgid " PASS PageSize" msgstr "" #: systemv/cupstestppd.c:901 msgid " PASS Product" msgstr "" #: systemv/cupstestppd.c:976 msgid " PASS ShortNickName" msgstr "" #: systemv/cupstestppd.c:1351 #, c-format msgid " WARN %s has no corresponding options." msgstr "" #: systemv/cupstestppd.c:1463 #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" #: systemv/cupstestppd.c:1322 #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" #: systemv/cupstestppd.c:1721 msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" #: systemv/cupstestppd.c:1367 msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" #: systemv/cupstestppd.c:1703 #, c-format msgid " WARN Line %d only contains whitespace." msgstr "" #: systemv/cupstestppd.c:1375 msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" #: systemv/cupstestppd.c:1726 msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF." msgstr "" #: systemv/cupstestppd.c:1359 #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" #: systemv/cupstestppd.c:1390 msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" #: systemv/cupstestppd.c:1398 msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" #: systemv/cupstestppd.c:1433 msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" #: systemv/cupstestppd.c:1424 msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" #: systemv/cupstestppd.c:1407 msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" #: systemv/cupstestppd.c:3788 #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" #: systemv/cupstestppd.c:2225 #, c-format msgid " %s %s %s does not exist." msgstr "" #: systemv/cupstestppd.c:3941 #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr "" #: systemv/cupstestppd.c:2295 #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" #: systemv/cupstestppd.c:3548 systemv/cupstestppd.c:3597 #: systemv/cupstestppd.c:3636 #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" #: systemv/cupstestppd.c:3502 #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "" #: systemv/cupstestppd.c:2366 systemv/cupstestppd.c:2388 #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr "" #: systemv/cupstestppd.c:2484 systemv/cupstestppd.c:2506 #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr "" #: systemv/cupstestppd.c:3005 #, c-format msgid " %s Bad cupsICCProfile %s." msgstr "" #: systemv/cupstestppd.c:2612 #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr "" #: systemv/cupstestppd.c:1799 #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr "" #: systemv/cupstestppd.c:3452 #, c-format msgid " %s Bad language \"%s\"." msgstr "" #: systemv/cupstestppd.c:2442 systemv/cupstestppd.c:2570 #: systemv/cupstestppd.c:2656 systemv/cupstestppd.c:2714 #: systemv/cupstestppd.c:2769 systemv/cupstestppd.c:2824 #: systemv/cupstestppd.c:2879 systemv/cupstestppd.c:2932 #: systemv/cupstestppd.c:3054 #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr "" #: systemv/cupstestppd.c:2350 systemv/cupstestppd.c:2468 #: systemv/cupstestppd.c:2596 systemv/cupstestppd.c:2683 #: systemv/cupstestppd.c:2738 systemv/cupstestppd.c:2793 #: systemv/cupstestppd.c:2848 systemv/cupstestppd.c:2903 #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr "" #: systemv/cupstestppd.c:2948 #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" #: systemv/cupstestppd.c:2182 #, c-format msgid " %s Default choices conflicting." msgstr "" #: systemv/cupstestppd.c:1780 #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr "" #: systemv/cupstestppd.c:3580 systemv/cupstestppd.c:3620 #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" #: systemv/cupstestppd.c:3488 #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr "" #: systemv/cupstestppd.c:2427 systemv/cupstestppd.c:2555 #: systemv/cupstestppd.c:2641 systemv/cupstestppd.c:2699 #: systemv/cupstestppd.c:2754 systemv/cupstestppd.c:2809 #: systemv/cupstestppd.c:2864 systemv/cupstestppd.c:2916 #: systemv/cupstestppd.c:3039 #, c-format msgid " %s Missing %s file \"%s\"." msgstr "" #: systemv/cupstestppd.c:3162 #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" #: systemv/cupstestppd.c:3147 #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" #: systemv/cupstestppd.c:1990 systemv/cupstestppd.c:2031 #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #: systemv/cupstestppd.c:1885 #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr "" #: systemv/cupstestppd.c:1817 #, c-format msgid " %s Missing cupsUIResolver %s" msgstr "" #: systemv/cupstestppd.c:1976 systemv/cupstestppd.c:2017 #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #: systemv/cupstestppd.c:1869 #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "" #: systemv/cupstestppd.c:3674 #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr "" #: systemv/cupstestppd.c:2271 #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" #: systemv/cupstestppd.c:3221 systemv/cupstestppd.c:3235 #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "" #: systemv/cupstestppd.c:3201 #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "" #: systemv/cupstestppd.c:3392 #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr "" #: systemv/cupstestppd.c:3341 #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" #: systemv/cupstestppd.c:3082 #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr "" #: systemv/cupstestppd.c:1940 #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr "" #: systemv/cupstestppd.c:1922 #, c-format msgid " %s cupsUIResolver %s does not list at least two different options." msgstr "" #: systemv/cupstestppd.c:1145 #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" #: systemv/cupstestppd.c:557 #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" #: systemv/cupstestppd.c:491 #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" #: systemv/cupstestppd.c:527 #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" #: systemv/cupstestppd.c:600 #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" #: systemv/cupstestppd.c:644 #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" #: systemv/cupstestppd.c:1002 msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" #: systemv/cupstestppd.c:1190 #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" #: systemv/cupstestppd.c:1204 #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" #: systemv/cupstestppd.c:720 systemv/cupstestppd.c:737 #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" #: systemv/cupstestppd.c:777 #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" #: systemv/cupstestppd.c:933 msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" #: systemv/cupstestppd.c:894 msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" #: systemv/cupstestppd.c:968 msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" #: systemv/cupstestppd.c:1126 #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" #: systemv/cupstestppd.c:3815 systemv/cupstestppd.c:3837 #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" #: systemv/cupstestppd.c:1263 #, c-format msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters." msgstr "" #: systemv/cupstestppd.c:1236 #, c-format msgid " **FAIL** Default translation string for option %s contains 8-bit characters." msgstr "" #: systemv/cupstestppd.c:2078 #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" #: systemv/cupstestppd.c:2123 #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" #: systemv/cupstestppd.c:2140 #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" #: systemv/cupstestppd.c:2100 #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" #: systemv/cupstestppd.c:577 #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" #: systemv/cupstestppd.c:476 msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" #: systemv/cupstestppd.c:512 msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" #: systemv/cupstestppd.c:618 msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" #: systemv/cupstestppd.c:662 msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" #: systemv/cupstestppd.c:1053 #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" #: systemv/cupstestppd.c:682 msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" #: systemv/cupstestppd.c:702 msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" #: systemv/cupstestppd.c:756 msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" #: systemv/cupstestppd.c:796 msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" #: systemv/cupstestppd.c:816 msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" #: systemv/cupstestppd.c:876 msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" #: systemv/cupstestppd.c:951 msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" #: systemv/cupstestppd.c:856 msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" #: systemv/cupstestppd.c:1022 msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" #: systemv/cupstestppd.c:836 msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" #: systemv/cupstestppd.c:1075 #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" #: systemv/cupstestppd.c:911 msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" #: systemv/cupstestppd.c:986 msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" #: systemv/cupstestppd.c:311 systemv/cupstestppd.c:330 #: systemv/cupstestppd.c:342 #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" #: systemv/cupstestppd.c:1475 #, c-format msgid " %d ERRORS FOUND" msgstr "" #: systemv/cupstestppd.c:1477 msgid " NO ERRORS FOUND" msgstr "" #: ppdc/ppdc.cxx:444 msgid " --cr End lines with CR (Mac OS 9)." msgstr "" #: ppdc/ppdc.cxx:446 msgid " --crlf End lines with CR + LF (Windows)." msgstr "" #: ppdc/ppdc.cxx:448 msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" #: scheduler/cupsfilter.c:1477 msgid " --list-filters List filters that will be used." msgstr "" #: scheduler/cupsfilter.c:1478 msgid " -D Remove the input file when finished." msgstr "" #: ppdc/ppdc.cxx:427 ppdc/ppdhtml.cxx:174 ppdc/ppdpo.cxx:244 msgid " -D name=value Set named variable to value." msgstr "" #: ppdc/ppdc.cxx:429 ppdc/ppdhtml.cxx:176 ppdc/ppdi.cxx:120 ppdc/ppdpo.cxx:246 msgid " -I include-dir Add include directory to search path." msgstr "" #: scheduler/cupsfilter.c:1479 msgid " -P filename.ppd Set PPD file." msgstr "" #: scheduler/cupsfilter.c:1480 msgid " -U username Specify username." msgstr "" #: ppdc/ppdc.cxx:431 msgid " -c catalog.po Load the specified message catalog." msgstr "" #: scheduler/cupsfilter.c:1481 msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" #: ppdc/ppdc.cxx:433 msgid " -d output-dir Specify the output directory." msgstr "" #: scheduler/cupsfilter.c:1482 msgid " -d printer Use the named printer." msgstr "" #: scheduler/cupsfilter.c:1483 msgid " -e Use every filter from the PPD file." msgstr "" #: scheduler/cupsfilter.c:1484 msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" #: scheduler/cupsfilter.c:1485 msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)." msgstr "" #: ppdc/ppdc.cxx:435 msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr "" #: ppdc/ppdc.cxx:437 msgid " -m Use the ModelName value as the filename." msgstr "" #: scheduler/cupsfilter.c:1486 msgid " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" #: scheduler/cupsfilter.c:1487 msgid " -n copies Set number of copies." msgstr "" #: ppdc/ppdi.cxx:122 msgid " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" #: ppdc/ppdmerge.cxx:357 msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" #: scheduler/cupsfilter.c:1488 msgid " -o name=value Set option(s)." msgstr "" #: scheduler/cupsfilter.c:1489 msgid " -p filename.ppd Set PPD file." msgstr "" #: ppdc/ppdc.cxx:439 msgid " -t Test PPDs instead of generating them." msgstr "" #: scheduler/cupsfilter.c:1490 msgid " -t title Set title." msgstr "" #: scheduler/cupsfilter.c:1491 msgid " -u Remove the PPD file when finished." msgstr "" #: ppdc/ppdc.cxx:441 ppdc/ppdpo.cxx:248 msgid " -v Be verbose." msgstr "" #: ppdc/ppdc.cxx:442 msgid " -z Compress PPD files using GNU zip." msgstr "" #: systemv/cupstestppd.c:309 systemv/cupstestppd.c:328 #: systemv/cupstestppd.c:340 systemv/cupstestppd.c:473 #: systemv/cupstestppd.c:488 systemv/cupstestppd.c:509 #: systemv/cupstestppd.c:524 systemv/cupstestppd.c:554 #: systemv/cupstestppd.c:574 systemv/cupstestppd.c:597 #: systemv/cupstestppd.c:615 systemv/cupstestppd.c:641 #: systemv/cupstestppd.c:659 systemv/cupstestppd.c:679 #: systemv/cupstestppd.c:699 systemv/cupstestppd.c:717 #: systemv/cupstestppd.c:734 systemv/cupstestppd.c:753 #: systemv/cupstestppd.c:774 systemv/cupstestppd.c:793 #: systemv/cupstestppd.c:813 systemv/cupstestppd.c:833 #: systemv/cupstestppd.c:853 systemv/cupstestppd.c:873 #: systemv/cupstestppd.c:891 systemv/cupstestppd.c:908 #: systemv/cupstestppd.c:930 systemv/cupstestppd.c:948 #: systemv/cupstestppd.c:965 systemv/cupstestppd.c:983 #: systemv/cupstestppd.c:999 systemv/cupstestppd.c:1019 #: systemv/cupstestppd.c:1050 systemv/cupstestppd.c:1072 #: systemv/cupstestppd.c:1123 systemv/cupstestppd.c:1142 #: systemv/cupstestppd.c:1186 systemv/cupstestppd.c:1200 #: systemv/cupstestppd.c:1232 systemv/cupstestppd.c:1259 #: systemv/cupstestppd.c:1777 systemv/cupstestppd.c:1796 #: systemv/cupstestppd.c:1814 systemv/cupstestppd.c:1866 #: systemv/cupstestppd.c:1882 systemv/cupstestppd.c:1919 #: systemv/cupstestppd.c:1937 systemv/cupstestppd.c:1973 #: systemv/cupstestppd.c:1987 systemv/cupstestppd.c:2014 #: systemv/cupstestppd.c:2028 systemv/cupstestppd.c:2074 #: systemv/cupstestppd.c:2096 systemv/cupstestppd.c:2119 #: systemv/cupstestppd.c:2136 systemv/cupstestppd.c:2178 #: systemv/cupstestppd.c:2221 systemv/cupstestppd.c:2268 #: systemv/cupstestppd.c:2292 systemv/cupstestppd.c:2346 #: systemv/cupstestppd.c:2362 systemv/cupstestppd.c:2384 #: systemv/cupstestppd.c:2424 systemv/cupstestppd.c:2438 #: systemv/cupstestppd.c:2464 systemv/cupstestppd.c:2480 #: systemv/cupstestppd.c:2502 systemv/cupstestppd.c:2552 #: systemv/cupstestppd.c:2566 systemv/cupstestppd.c:2592 #: systemv/cupstestppd.c:2608 systemv/cupstestppd.c:2638 #: systemv/cupstestppd.c:2652 systemv/cupstestppd.c:2679 #: systemv/cupstestppd.c:2696 systemv/cupstestppd.c:2710 #: systemv/cupstestppd.c:2734 systemv/cupstestppd.c:2751 #: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2789 #: systemv/cupstestppd.c:2806 systemv/cupstestppd.c:2820 #: systemv/cupstestppd.c:2844 systemv/cupstestppd.c:2861 #: systemv/cupstestppd.c:2875 systemv/cupstestppd.c:2899 #: systemv/cupstestppd.c:2913 systemv/cupstestppd.c:2928 #: systemv/cupstestppd.c:2945 systemv/cupstestppd.c:3001 #: systemv/cupstestppd.c:3036 systemv/cupstestppd.c:3050 #: systemv/cupstestppd.c:3078 systemv/cupstestppd.c:3143 #: systemv/cupstestppd.c:3158 systemv/cupstestppd.c:3197 #: systemv/cupstestppd.c:3217 systemv/cupstestppd.c:3231 #: systemv/cupstestppd.c:3448 systemv/cupstestppd.c:3484 #: systemv/cupstestppd.c:3498 systemv/cupstestppd.c:3544 #: systemv/cupstestppd.c:3576 systemv/cupstestppd.c:3593 #: systemv/cupstestppd.c:3616 systemv/cupstestppd.c:3632 #: systemv/cupstestppd.c:3670 systemv/cupstestppd.c:3811 #: systemv/cupstestppd.c:3833 systemv/cupstestppd.c:3937 msgid " FAIL" msgstr "" #: systemv/cupstestppd.c:1283 msgid " PASS" msgstr "" #: tools/ippfind.c:2803 msgid "! expression Unary NOT of expression" msgstr "" #: cups/ipp.c:5045 #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #: cups/ipp.c:5051 #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #: cups/ipp.c:4753 #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #: cups/ipp.c:4747 #, c-format msgid "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #: cups/ipp.c:4768 #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #: cups/ipp.c:5096 #, c-format msgid "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #: cups/ipp.c:5102 #, c-format msgid "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #: cups/ipp.c:4845 #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4851 #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4839 #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4809 #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4833 #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4815 #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4821 #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4803 #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4827 #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #: cups/ipp.c:4779 #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #: cups/ipp.c:5032 #, c-format msgid "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #: cups/ipp.c:5026 #, c-format msgid "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)." msgstr "" #: cups/ipp.c:5187 #, c-format msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)." msgstr "" #: cups/ipp.c:5194 #, c-format msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)." msgstr "" #: cups/ipp.c:5001 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #: cups/ipp.c:4996 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)." msgstr "" #: cups/ipp.c:5008 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #: cups/ipp.c:5142 #, c-format msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)." msgstr "" #: cups/ipp.c:5149 #, c-format msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)." msgstr "" #: cups/ipp.c:4790 #, c-format msgid "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #: cups/ipp.c:4885 #, c-format msgid "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)." msgstr "" #: cups/ipp.c:4874 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)." msgstr "" #: cups/ipp.c:4862 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)." msgstr "" #: cups/ipp.c:4868 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)." msgstr "" #: cups/ipp.c:4946 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #: cups/ipp.c:4941 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)." msgstr "" #: cups/ipp.c:4953 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #: cups/ipp.c:5072 #, c-format msgid "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #: cups/ipp.c:5078 #, c-format msgid "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" #: scheduler/ipp.c:365 msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" #: scheduler/ipp.c:371 scheduler/ipp.c:386 msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #: berkeley/lpq.c:538 #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "" #: cups/dest-localization.c:156 #, c-format msgid "%d x %d mm" msgstr "" #: cups/dest-localization.c:148 #, c-format msgid "%g x %g \"" msgstr "" #: cups/dest-localization.c:189 cups/dest-localization.c:196 #, c-format msgid "%s (%s)" msgstr "" #: cups/dest-localization.c:203 #, c-format msgid "%s (%s, %s)" msgstr "" #: cups/dest-localization.c:180 #, c-format msgid "%s (Borderless)" msgstr "" #: cups/dest-localization.c:187 cups/dest-localization.c:194 #, c-format msgid "%s (Borderless, %s)" msgstr "" #: cups/dest-localization.c:201 #, c-format msgid "%s (Borderless, %s, %s)" msgstr "" #: systemv/lpstat.c:806 #, c-format msgid "%s accepting requests since %s" msgstr "" #: scheduler/ipp.c:10327 #, c-format msgid "%s cannot be changed." msgstr "" #: berkeley/lpc.c:175 #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "" #: berkeley/lpq.c:623 #, c-format msgid "%s is not ready" msgstr "" #: berkeley/lpq.c:616 #, c-format msgid "%s is ready" msgstr "" #: berkeley/lpq.c:619 #, c-format msgid "%s is ready and printing" msgstr "" #: filter/rastertoepson.c:999 filter/rastertohp.c:668 #: filter/rastertolabel.c:1120 #, c-format msgid "%s job-id user title copies options [file]" msgstr "" #: systemv/lpstat.c:810 #, c-format msgid "%s not accepting requests since %s -" msgstr "" #: scheduler/ipp.c:608 #, c-format msgid "%s not supported." msgstr "" #: systemv/lpstat.c:821 #, c-format msgid "%s/%s accepting requests since %s" msgstr "" #: systemv/lpstat.c:826 #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "" #: berkeley/lpq.c:531 #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "" #. TRANSLATORS: Message is "subject: error" #: 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:1599 #, c-format msgid "%s: %s" msgstr "" #: systemv/cancel.c:310 systemv/cancel.c:374 #, c-format msgid "%s: %s failed: %s" msgstr "" #: systemv/lpadmin.c:1209 #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #: tools/ippfind.c:768 tools/ipptool.c:412 #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "" #: systemv/cupsaccept.c:67 #, c-format msgid "%s: Don't know what to do." msgstr "" #: berkeley/lpr.c:354 systemv/lp.c:589 #, c-format msgid "%s: Error - %s" msgstr "" #: berkeley/lpq.c:233 #, c-format msgid "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" #: berkeley/lpq.c:138 berkeley/lpq.c:211 berkeley/lpr.c:234 berkeley/lpr.c:345 #: systemv/lp.c:160 systemv/lp.c:580 systemv/lp.c:677 systemv/lp.c:727 #: systemv/lpstat.c:190 systemv/lpstat.c:235 systemv/lpstat.c:368 #: systemv/lpstat.c:395 systemv/lpstat.c:417 systemv/lpstat.c:477 #: systemv/lpstat.c:543 systemv/lpstat.c:604 systemv/lpstat.c:727 #: systemv/lpstat.c:907 systemv/lpstat.c:1164 systemv/lpstat.c:1356 #: systemv/lpstat.c:1593 #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" #: systemv/lp.c:237 #, c-format msgid "%s: Error - bad job ID." msgstr "" #: systemv/lp.c:226 #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" #: systemv/lp.c:517 #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" #: berkeley/lpr.c:259 systemv/lp.c:279 #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #: systemv/lp.c:469 #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" #: systemv/lp.c:488 #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "" #: berkeley/lpr.c:250 #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "" #: systemv/lp.c:270 #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "" #: berkeley/lpr.c:212 #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "" #: systemv/lp.c:136 #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "" #: systemv/lp.c:177 #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" #: systemv/lp.c:405 #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "" #: berkeley/lpr.c:109 #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "" #: berkeley/lpq.c:172 berkeley/lprm.c:130 systemv/cancel.c:130 #: systemv/cupsaccept.c:133 systemv/lp.c:197 systemv/lpstat.c:304 #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "" #: systemv/lp.c:385 #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" #: berkeley/lpr.c:280 #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "" #: berkeley/lpr.c:161 systemv/lp.c:300 #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" #: systemv/lp.c:448 #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "" #: systemv/lp.c:321 #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "" #: systemv/cupsaccept.c:152 #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "" #: systemv/lp.c:366 #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "" #: berkeley/lpq.c:101 berkeley/lpr.c:89 berkeley/lprm.c:110 #: systemv/cancel.c:100 systemv/cupsaccept.c:110 systemv/lp.c:113 #: systemv/lpadmin.c:439 systemv/lpstat.c:129 #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "" #: systemv/cancel.c:152 #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "" #: berkeley/lpr.c:134 #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "" #: systemv/lpstat.c:149 systemv/lpstat.c:158 #, c-format msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." msgstr "" #: berkeley/lpq.c:238 #, c-format msgid "%s: Error - no default destination available." msgstr "" #: systemv/lp.c:341 #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "" #: berkeley/lpr.c:356 systemv/lp.c:591 #, c-format msgid "%s: Error - scheduler not responding." msgstr "" #: berkeley/lpr.c:321 systemv/lp.c:549 #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "" #: berkeley/lpr.c:303 systemv/lp.c:532 #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "" #: berkeley/lpr.c:398 systemv/lp.c:621 #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "" #: berkeley/lprm.c:92 berkeley/lprm.c:179 systemv/cancel.c:227 #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "" #: berkeley/lpq.c:140 #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "" #: berkeley/lpr.c:289 berkeley/lprm.c:145 systemv/cancel.c:168 #: systemv/cupsaccept.c:161 systemv/lp.c:507 systemv/lpstat.c:487 #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "" #: systemv/lp.c:499 #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "" #: systemv/lp.c:217 #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" #: systemv/lpstat.c:547 systemv/lpstat.c:587 #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "" #: scheduler/cupsfilter.c:573 #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "" #: tools/ipptool.c:334 #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" #: tools/ippfind.c:740 tools/ipptool.c:371 #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "" #: tools/ippfind.c:753 tools/ipptool.c:385 #, c-format msgid "%s: Missing version for \"-V\"." msgstr "" #: systemv/lp.c:425 #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" #: scheduler/cupsfilter.c:445 #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "" #: systemv/cupsaccept.c:195 #, c-format msgid "%s: Operation failed: %s" msgstr "" #: berkeley/lpq.c:86 berkeley/lpr.c:74 berkeley/lprm.c:71 systemv/cancel.c:85 #: systemv/cupsaccept.c:95 systemv/lp.c:98 systemv/lpadmin.c:249 #: systemv/lpinfo.c:192 systemv/lpmove.c:69 systemv/lpstat.c:91 #: tools/ipptool.c:316 tools/ipptool.c:360 #, c-format msgid "%s: Sorry, no encryption support." msgstr "" #: systemv/lpadmin.c:1216 #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #: berkeley/lpq.c:292 scheduler/cupsfilter.c:1269 systemv/cancel.c:250 #, c-format msgid "%s: Unable to connect to server." msgstr "" #: systemv/cancel.c:334 #, c-format msgid "%s: Unable to contact server." msgstr "" #: systemv/lpadmin.c:1246 #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #: scheduler/cupsfilter.c:410 #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "" #: tools/ipptool.c:277 tools/ipptool.c:343 #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" #: ppdc/ppdmerge.cxx:86 #, c-format msgid "%s: Unable to open %s: %s" msgstr "" #: scheduler/cupsfilter.c:668 ppdc/ppdmerge.cxx:102 #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "" #: systemv/lpadmin.c:1231 #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #: scheduler/cupsfilter.c:377 #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" #: systemv/lpadmin.c:1200 #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #: systemv/lpinfo.c:238 #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #: berkeley/lpq.c:142 systemv/lpstat.c:608 #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "" #: scheduler/cupsfilter.c:422 #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "" #: scheduler/cupsfilter.c:1473 systemv/lpinfo.c:231 systemv/lpmove.c:94 #, c-format msgid "%s: Unknown option \"%c\"." msgstr "" #: tools/ippeveprinter.c:381 tools/ippeveprinter.c:566 tools/ippfind.c:627 #, c-format msgid "%s: Unknown option \"%s\"." msgstr "" #: tools/ippeveprinter.c:555 tools/ippfind.c:919 tools/ipptool.c:606 #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "" #: scheduler/cupsfilter.c:402 #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "" #: berkeley/lpr.c:147 #, c-format msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct." msgstr "" #: systemv/lp.c:474 #, c-format msgid "%s: Warning - character set option ignored." msgstr "" #: systemv/lp.c:493 #, c-format msgid "%s: Warning - content type option ignored." msgstr "" #: systemv/lp.c:182 #, c-format msgid "%s: Warning - form option ignored." msgstr "" #: systemv/lp.c:390 #, c-format msgid "%s: Warning - mode option ignored." msgstr "" #: tools/ippfind.c:2802 msgid "( expressions ) Group expressions" msgstr "" #: berkeley/lprm.c:233 msgid "- Cancel all jobs" msgstr "" #: berkeley/lpr.c:432 msgid "-# num-copies Specify the number of copies to print" msgstr "" #: systemv/cupsctl.c:236 msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" #: systemv/cupsctl.c:237 msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" #: systemv/cupsctl.c:238 msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" #: systemv/cupsctl.c:239 msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" #: systemv/cupsctl.c:240 msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" #: systemv/lpinfo.c:504 msgid "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" #: tools/ippfind.c:2785 msgid "--domain regex Match domain to regular expression" msgstr "" #: systemv/lpinfo.c:505 msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" #: tools/ippfind.c:2786 msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" #: tools/ippfind.c:2805 msgid "--false Always false" msgstr "" #: tools/ippeveprinter.c:7665 msgid "--help Show program help" msgstr "" #: systemv/cupsaccept.c:249 msgid "--hold Hold new jobs" msgstr "" #: tools/ippfind.c:2788 msgid "--host regex Match hostname to regular expression" msgstr "" #: systemv/lpinfo.c:507 msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" #: tools/ipptool.c:4308 msgid "--ippserver filename Produce ippserver attribute file" msgstr "" #: systemv/lpinfo.c:509 msgid "--language locale Show models matching the given locale" msgstr "" #: tools/ippfind.c:2790 msgid "--local True if service is local" msgstr "" #: tools/ippfind.c:2789 msgid "--ls List attributes" msgstr "" #: systemv/lpinfo.c:510 msgid "--make-and-model name Show models matching the given make and model name" msgstr "" #: tools/ippfind.c:2791 msgid "--name regex Match service name to regular expression" msgstr "" #: tools/ippeveprinter.c:7666 msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" #: tools/ippfind.c:2804 msgid "--not expression Unary NOT of expression" msgstr "" #: tools/ippfind.c:2792 msgid "--path regex Match resource path to regular expression" msgstr "" #: tools/ippfind.c:2793 msgid "--port number[-number] Match port to number or range" msgstr "" #: tools/ippfind.c:2794 msgid "--print Print URI if true" msgstr "" #: tools/ippfind.c:2795 msgid "--print-name Print service name if true" msgstr "" #: systemv/lpinfo.c:511 msgid "--product name Show models matching the given PostScript product" msgstr "" #: tools/ippfind.c:2796 msgid "--quiet Quietly report match via exit code" msgstr "" #: systemv/cupsaccept.c:251 msgid "--release Release previously held jobs" msgstr "" #: tools/ippfind.c:2797 msgid "--remote True if service is remote" msgstr "" #: tools/ipptool.c:4309 msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" #: systemv/lpinfo.c:512 msgid "--timeout seconds Specify the maximum number of seconds to discover devices" msgstr "" #: tools/ippfind.c:2806 msgid "--true Always true" msgstr "" #: tools/ippfind.c:2798 msgid "--txt key True if the TXT record contains the key" msgstr "" #: tools/ippfind.c:2799 msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" #: tools/ippfind.c:2800 msgid "--uri regex Match URI to regular expression" msgstr "" #: tools/ippeveprinter.c:7667 tools/ippfind.c:2770 msgid "--version Show program version" msgstr "" #: tools/ipptool.c:4311 msgid "--version Show version" msgstr "" #: ppdc/sample.c:305 msgid "-1" msgstr "" #: ppdc/sample.c:296 msgid "-10" msgstr "" #: ppdc/sample.c:388 msgid "-100" msgstr "" #: ppdc/sample.c:387 msgid "-105" msgstr "" #: ppdc/sample.c:295 msgid "-11" msgstr "" #: ppdc/sample.c:386 msgid "-110" msgstr "" #: ppdc/sample.c:385 msgid "-115" msgstr "" #: ppdc/sample.c:294 msgid "-12" msgstr "" #: ppdc/sample.c:384 msgid "-120" msgstr "" #: ppdc/sample.c:293 msgid "-13" msgstr "" #: ppdc/sample.c:292 msgid "-14" msgstr "" #: ppdc/sample.c:291 msgid "-15" msgstr "" #: ppdc/sample.c:304 msgid "-2" msgstr "" #: tools/ippeveprinter.c:7668 msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" #: ppdc/sample.c:404 msgid "-20" msgstr "" #: ppdc/sample.c:403 msgid "-25" msgstr "" #: ppdc/sample.c:303 msgid "-3" msgstr "" #: ppdc/sample.c:402 msgid "-30" msgstr "" #: ppdc/sample.c:401 msgid "-35" msgstr "" #: ppdc/sample.c:302 msgid "-4" msgstr "" #: tools/ippfind.c:2766 tools/ipptool.c:4312 msgid "-4 Connect using IPv4" msgstr "" #: ppdc/sample.c:400 msgid "-40" msgstr "" #: ppdc/sample.c:399 msgid "-45" msgstr "" #: ppdc/sample.c:301 msgid "-5" msgstr "" #: ppdc/sample.c:398 msgid "-50" msgstr "" #: ppdc/sample.c:397 msgid "-55" msgstr "" #: ppdc/sample.c:300 msgid "-6" msgstr "" #: tools/ippfind.c:2767 tools/ipptool.c:4313 msgid "-6 Connect using IPv6" msgstr "" #: ppdc/sample.c:396 msgid "-60" msgstr "" #: ppdc/sample.c:395 msgid "-65" msgstr "" #: ppdc/sample.c:299 msgid "-7" msgstr "" #: ppdc/sample.c:394 msgid "-70" msgstr "" #: ppdc/sample.c:393 msgid "-75" msgstr "" #: ppdc/sample.c:298 msgid "-8" msgstr "" #: ppdc/sample.c:392 msgid "-80" msgstr "" #: ppdc/sample.c:391 msgid "-85" msgstr "" #: ppdc/sample.c:297 msgid "-9" msgstr "" #: ppdc/sample.c:390 msgid "-90" msgstr "" #: ppdc/sample.c:389 msgid "-95" msgstr "" #: tools/ipptool.c:4314 msgid "-C Send requests using chunking (default)" msgstr "" #: systemv/lpadmin.c:1623 msgid "-D description Specify the textual description of the printer" msgstr "" #: tools/ippeveprinter.c:7669 msgid "-D device-uri Set the device URI for the printer" msgstr "" #: 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: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 "" #: tools/ipptool.c:4315 msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" #: scheduler/main.c:2136 msgid "-F Run in the foreground but detach from console." msgstr "" #: tools/ippeveprinter.c:7670 msgid "-F output-type/subtype Set the output format for the printer" msgstr "" #: systemv/lpstat.c:2050 msgid "-H Show the default server and port" msgstr "" #: systemv/lp.c:754 msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" #: systemv/lp.c:755 msgid "-H hold Hold the job until released/resumed" msgstr "" #: systemv/lp.c:756 msgid "-H immediate Print the job as soon as possible" msgstr "" #: systemv/lp.c:757 msgid "-H restart Reprint the job" msgstr "" #: systemv/lp.c:758 msgid "-H resume Resume a held job" msgstr "" #: berkeley/lpr.c:434 msgid "-H server[:port] Connect to the named server and port" msgstr "" #: tools/ipptool.c:4316 msgid "-I Ignore errors" msgstr "" #: systemv/cupstestppd.c:3858 msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" #: tools/ippeveprinter.c:7672 msgid "-K keypath Set location of server X.509 certificates and keys." msgstr "" #: tools/ipptool.c:4317 msgid "-L Send requests using content-length" msgstr "" #: systemv/lpadmin.c:1628 msgid "-L location Specify the textual location of the printer" msgstr "" #: tools/ippeveprinter.c:7674 msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" #: berkeley/lpq.c:647 msgid "-P destination Show status for the specified destination" msgstr "" #: berkeley/lpr.c:450 berkeley/lprm.c:236 msgid "-P destination Specify the destination" msgstr "" #: tools/ipptool.c:4318 msgid "-P filename.plist Produce XML plist to a file and test report to standard output" msgstr "" #: tools/ippeveprinter.c:7675 msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" #: tools/ippfind.c:2772 msgid "-P number[-number] Match port to number or range" msgstr "" #: systemv/lp.c:774 msgid "-P page-list Specify a list of pages to print" msgstr "" #: systemv/lpstat.c:2060 msgid "-R Show the ranking of jobs" msgstr "" #: systemv/lpadmin.c:1648 msgid "-R name-default Remove the default value for the named option" msgstr "" #: systemv/cupstestppd.c:3860 msgid "-R root-directory Set alternate root" msgstr "" #: tools/ipptool.c:4319 msgid "-S Test with encryption using HTTPS" msgstr "" #: tools/ippfind.c:2768 msgid "-T seconds Set the browse timeout in seconds" msgstr "" #: tools/ipptool.c:4320 msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" #: berkeley/lpr.c:451 msgid "-T title Specify the job title" 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: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 "" #: systemv/cupsctl.c:235 msgid "-U username Specify username to use for authentication" msgstr "" #: tools/ippeveprinter.c:7676 tools/ippfind.c:2769 tools/ipptool.c:4321 msgid "-V version Set default IPP version" msgstr "" #: systemv/lpstat.c:2051 msgid "-W completed Show completed jobs" msgstr "" #: systemv/lpstat.c:2052 msgid "-W not-completed Show pending jobs" msgstr "" #: systemv/cupstestppd.c:3861 msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}\n" " Issue warnings instead of errors" msgstr "" #: tools/ipptool.c:4322 msgid "-X Produce XML plist instead of plain text" msgstr "" #: systemv/cancel.c:402 msgid "-a Cancel all jobs" msgstr "" #: berkeley/lpq.c:643 msgid "-a Show jobs on all destinations" msgstr "" #: systemv/lpstat.c:2053 msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" #: tools/ippeveprinter.c:7677 msgid "-a filename.conf Load printer attributes from conf file" msgstr "" #: systemv/lp.c:751 msgid "-c Make a copy of the print file(s)" msgstr "" #: tools/ipptool.c:4323 msgid "-c Produce CSV output" msgstr "" #: systemv/lpstat.c:2054 msgid "-c [class(es)] Show classes and their member printers" msgstr "" #: systemv/lpadmin.c:1621 msgid "-c class Add the named destination to a class" msgstr "" #: tools/ippeveprinter.c:7678 msgid "-c command Set print command" msgstr "" #: scheduler/main.c:2134 msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" #: systemv/lpstat.c:2055 msgid "-d Show the default destination" msgstr "" #: systemv/lpoptions.c:539 msgid "-d destination Set default destination" msgstr "" #: systemv/lpadmin.c:1622 msgid "-d destination Set the named destination as the server default" msgstr "" #: tools/ipptool.c:4324 msgid "-d name=value Set named variable to value" msgstr "" #: tools/ippfind.c:2773 msgid "-d regex Match domain to regular expression" msgstr "" #: tools/ippeveprinter.c:7679 msgid "-d spool-directory Set spool directory" msgstr "" #: systemv/lpstat.c:2056 msgid "-e Show available destinations on the network" msgstr "" #: scheduler/main.c:2135 msgid "-f Run in the foreground." msgstr "" #: tools/ipptool.c:4325 msgid "-f filename Set default request filename" msgstr "" #: tools/ippeveprinter.c:7680 msgid "-f type/subtype[,...] Set supported file types" msgstr "" #: scheduler/main.c:2137 msgid "-h Show this usage message." msgstr "" #: tools/ipptool.c:4326 msgid "-h Validate HTTP response headers" msgstr "" #: tools/ippfind.c:2774 msgid "-h regex Match hostname to regular expression" 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: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 "" #: tools/ippeveprinter.c:7681 msgid "-i iconfile.png Set icon file" msgstr "" #: systemv/lp.c:759 msgid "-i id Specify an existing job ID to modify" msgstr "" #: systemv/lpadmin.c:1627 msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" #: tools/ipptool.c:4327 msgid "-i seconds Repeat the last file with the given time interval" msgstr "" #: tools/ippeveprinter.c:7682 msgid "-k Keep job spool files" msgstr "" #: tools/ippfind.c:2775 msgid "-l List attributes" msgstr "" #: tools/ipptool.c:4328 msgid "-l Produce plain text output" msgstr "" #: scheduler/main.c:2139 msgid "-l Run cupsd on demand." msgstr "" #: systemv/lpoptions.c:542 msgid "-l Show supported options and values" msgstr "" #: berkeley/lpq.c:646 systemv/lpinfo.c:500 systemv/lpstat.c:2047 msgid "-l Show verbose (long) output" msgstr "" #: tools/ippeveprinter.c:7683 msgid "-l location Set location of printer" msgstr "" #: berkeley/lpr.c:435 systemv/lp.c:760 msgid "-m Send an email notification when the job completes" msgstr "" #: systemv/lpinfo.c:501 msgid "-m Show models" msgstr "" #: systemv/lpadmin.c:1630 msgid "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" #: tools/ippeveprinter.c:7684 msgid "-m model Set model name (default=Printer)" msgstr "" #: systemv/lpadmin.c:1629 msgid "-m model Specify a standard model/PPD file for the printer" msgstr "" #: tools/ipptool.c:4329 msgid "-n count Repeat the last file the given number of times" msgstr "" #: tools/ippeveprinter.c:7685 msgid "-n hostname Set hostname for printer" msgstr "" #: systemv/lp.c:761 msgid "-n num-copies Specify the number of copies to print" msgstr "" #: tools/ippfind.c:2776 msgid "-n regex Match service name to regular expression" msgstr "" #: systemv/lpadmin.c:1632 msgid "-o Name=Value Specify the default value for the named PPD option " msgstr "" #: systemv/lpstat.c:2057 msgid "-o [destination(s)] Show jobs" msgstr "" #: systemv/lpadmin.c:1633 msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" #: systemv/lpadmin.c:1635 msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" #: systemv/lpadmin.c:1637 msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" #: systemv/lpadmin.c:1638 msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" #: systemv/lpadmin.c:1639 msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" #: berkeley/lpr.c:437 systemv/lp.c:763 msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" #: berkeley/lpr.c:438 systemv/lp.c:764 msgid "-o media=size Specify the media size to use" msgstr "" #: systemv/lpadmin.c:1631 msgid "-o name-default=value Specify the default value for the named option" msgstr "" #: systemv/lpoptions.c:543 msgid "-o name[=value] Set default option and value" msgstr "" #: berkeley/lpr.c:439 systemv/lp.c:765 msgid "-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)" msgstr "" #: berkeley/lpr.c:436 systemv/lp.c:762 msgid "-o option[=value] Specify a printer-specific option" msgstr "" #: berkeley/lpr.c:440 systemv/lp.c:766 msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" #: berkeley/lpr.c:442 systemv/lp.c:768 msgid "-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)" msgstr "" #: systemv/lpadmin.c:1640 msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" #: systemv/lpadmin.c:1642 msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" #: systemv/lpadmin.c:1644 msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" #: berkeley/lpr.c:443 systemv/lp.c:769 msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" #: berkeley/lpr.c:444 systemv/lp.c:770 msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" #: berkeley/lpr.c:446 systemv/lp.c:772 msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" #: tools/ippfind.c:2777 msgid "-p Print URI if true" msgstr "" #: systemv/lpstat.c:2058 msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" #: systemv/lpoptions.c:544 msgid "-p destination Specify a destination" msgstr "" #: systemv/lpadmin.c:1646 msgid "-p destination Specify/add the named destination" msgstr "" #: tools/ippeveprinter.c:7686 msgid "-p port Set port number for printer" msgstr "" #: tools/ippfind.c:2778 msgid "-q Quietly report match via exit code" msgstr "" #: systemv/cupstestppd.c:3863 tools/ipptool.c:4330 msgid "-q Run silently" msgstr "" #: berkeley/lpr.c:448 msgid "-q Specify the job should be held for printing" msgstr "" #: systemv/lp.c:775 msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" #: berkeley/lpr.c:449 msgid "-r Remove the file(s) after submission" msgstr "" #: systemv/lpstat.c:2059 msgid "-r Show whether the CUPS server is running" msgstr "" #: tools/ippfind.c:2779 msgid "-r True if service is remote" msgstr "" #: systemv/cupstestppd.c:3864 msgid "-r Use 'relaxed' open mode" msgstr "" #: systemv/lpadmin.c:1647 msgid "-r class Remove the named destination from a class" msgstr "" #: systemv/cupsaccept.c:246 msgid "-r reason Specify a reason message that others can see" msgstr "" #: tools/ippeveprinter.c:7687 msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" #: systemv/lp.c:776 msgid "-s Be silent" msgstr "" #: tools/ippfind.c:2780 msgid "-s Print service name if true" msgstr "" #: systemv/lpstat.c:2061 msgid "-s Show a status summary" msgstr "" #: scheduler/main.c:2141 msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" #: tools/ippeveprinter.c:7688 msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" #: tools/ipptool.c:4331 msgid "-t Produce a test report" msgstr "" #: systemv/lpstat.c:2062 msgid "-t Show all status information" msgstr "" #: scheduler/main.c:2142 msgid "-t Test the configuration file." msgstr "" #: tools/ippfind.c:2781 msgid "-t key True if the TXT record contains the key" msgstr "" #: systemv/lp.c:777 msgid "-t title Specify the job title" msgstr "" #: systemv/lpstat.c:2063 msgid "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" #: systemv/lpadmin.c:1649 msgid "-u allow:all Allow all users to print" msgstr "" #: systemv/lpadmin.c:1650 msgid "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" #: systemv/lpadmin.c:1651 msgid "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" #: systemv/cancel.c:405 msgid "-u owner Specify the owner to use for jobs" msgstr "" #: tools/ippfind.c:2782 msgid "-u regex Match URI to regular expression" msgstr "" #: systemv/cupstestppd.c:3865 tools/ippeveprinter.c:7689 tools/ipptool.c:4332 msgid "-v Be verbose" msgstr "" #: systemv/lpinfo.c:503 msgid "-v Show devices" msgstr "" #: systemv/lpstat.c:2064 msgid "-v [printer(s)] Show the devices for each destination" msgstr "" #: systemv/lpadmin.c:1653 msgid "-v device-uri Specify the device URI for the printer" msgstr "" #: systemv/cupstestppd.c:3866 msgid "-vv Be very verbose" msgstr "" #: systemv/cancel.c:407 msgid "-x Purge jobs rather than just canceling" msgstr "" #: systemv/lpoptions.c:546 msgid "-x destination Remove default options for destination" msgstr "" #: systemv/lpadmin.c:1654 msgid "-x destination Remove the named destination" msgstr "" #: tools/ippfind.c:2783 msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" #: cups/dest.c:1868 msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" #: ppdc/sample.c:306 msgid "0" msgstr "" #: ppdc/sample.c:307 msgid "1" msgstr "" #: ppdc/sample.c:379 msgid "1 inch/sec." msgstr "" #: ppdc/sample.c:172 msgid "1.25x0.25\"" msgstr "" #: ppdc/sample.c:173 msgid "1.25x2.25\"" msgstr "" #: ppdc/sample.c:427 msgid "1.5 inch/sec." msgstr "" #: ppdc/sample.c:174 msgid "1.50x0.25\"" msgstr "" #: ppdc/sample.c:175 msgid "1.50x0.50\"" msgstr "" #: ppdc/sample.c:176 msgid "1.50x1.00\"" msgstr "" #: ppdc/sample.c:177 msgid "1.50x2.00\"" msgstr "" #: ppdc/sample.c:316 msgid "10" msgstr "" #: ppdc/sample.c:438 msgid "10 inches/sec." msgstr "" #: ppdc/sample.c:6 msgid "10 x 11" msgstr "" #: ppdc/sample.c:7 msgid "10 x 13" msgstr "" #: ppdc/sample.c:8 msgid "10 x 14" msgstr "" #: ppdc/sample.c:418 msgid "100" msgstr "" #: ppdc/sample.c:329 msgid "100 mm/sec." msgstr "" #: ppdc/sample.c:419 msgid "105" msgstr "" #: ppdc/sample.c:317 msgid "11" msgstr "" #: ppdc/sample.c:439 msgid "11 inches/sec." msgstr "" #: ppdc/sample.c:420 msgid "110" msgstr "" #: ppdc/sample.c:421 msgid "115" msgstr "" #: ppdc/sample.c:318 msgid "12" msgstr "" #: ppdc/sample.c:440 msgid "12 inches/sec." msgstr "" #: ppdc/sample.c:9 msgid "12 x 11" msgstr "" #: ppdc/sample.c:422 msgid "120" msgstr "" #: ppdc/sample.c:330 msgid "120 mm/sec." msgstr "" #: ppdc/sample.c:243 msgid "120x60dpi" msgstr "" #: ppdc/sample.c:249 msgid "120x72dpi" msgstr "" #: ppdc/sample.c:319 msgid "13" msgstr "" #: ppdc/sample.c:232 msgid "136dpi" msgstr "" #: ppdc/sample.c:320 msgid "14" msgstr "" #: ppdc/sample.c:321 msgid "15" msgstr "" #: ppdc/sample.c:323 msgid "15 mm/sec." msgstr "" #: ppdc/sample.c:10 msgid "15 x 11" msgstr "" #: ppdc/sample.c:331 msgid "150 mm/sec." msgstr "" #: ppdc/sample.c:278 msgid "150dpi" msgstr "" #: ppdc/sample.c:363 msgid "16" msgstr "" #: ppdc/sample.c:364 msgid "17" msgstr "" #: ppdc/sample.c:365 msgid "18" msgstr "" #: ppdc/sample.c:244 msgid "180dpi" msgstr "" #: ppdc/sample.c:366 msgid "19" msgstr "" #: ppdc/sample.c:308 msgid "2" msgstr "" #: ppdc/sample.c:380 msgid "2 inches/sec." msgstr "" #: cups/ppd-cache.c:3872 ppdc/sample.c:262 msgid "2-Sided Printing" msgstr "" #: ppdc/sample.c:178 msgid "2.00x0.37\"" msgstr "" #: ppdc/sample.c:179 msgid "2.00x0.50\"" msgstr "" #: ppdc/sample.c:180 msgid "2.00x1.00\"" msgstr "" #: ppdc/sample.c:181 msgid "2.00x1.25\"" msgstr "" #: ppdc/sample.c:182 msgid "2.00x2.00\"" msgstr "" #: ppdc/sample.c:183 msgid "2.00x3.00\"" msgstr "" #: ppdc/sample.c:184 msgid "2.00x4.00\"" msgstr "" #: ppdc/sample.c:185 msgid "2.00x5.50\"" msgstr "" #: ppdc/sample.c:186 msgid "2.25x0.50\"" msgstr "" #: ppdc/sample.c:187 msgid "2.25x1.25\"" msgstr "" #: ppdc/sample.c:188 msgid "2.25x4.00\"" msgstr "" #: ppdc/sample.c:189 msgid "2.25x5.50\"" msgstr "" #: ppdc/sample.c:190 msgid "2.38x5.50\"" msgstr "" #: ppdc/sample.c:428 msgid "2.5 inches/sec." msgstr "" #: ppdc/sample.c:191 msgid "2.50x1.00\"" msgstr "" #: ppdc/sample.c:192 msgid "2.50x2.00\"" msgstr "" #: ppdc/sample.c:193 msgid "2.75x1.25\"" msgstr "" #: ppdc/sample.c:194 msgid "2.9 x 1\"" msgstr "" #: ppdc/sample.c:367 msgid "20" msgstr "" #: ppdc/sample.c:324 msgid "20 mm/sec." msgstr "" #: ppdc/sample.c:332 msgid "200 mm/sec." msgstr "" #: ppdc/sample.c:233 msgid "203dpi" msgstr "" #: ppdc/sample.c:368 msgid "21" msgstr "" #: ppdc/sample.c:369 msgid "22" msgstr "" #: ppdc/sample.c:370 msgid "23" msgstr "" #: ppdc/sample.c:371 msgid "24" msgstr "" #: ppdc/sample.c:241 msgid "24-Pin Series" msgstr "" #: ppdc/sample.c:250 msgid "240x72dpi" msgstr "" #: ppdc/sample.c:372 msgid "25" msgstr "" #: ppdc/sample.c:333 msgid "250 mm/sec." msgstr "" #: ppdc/sample.c:373 msgid "26" msgstr "" #: ppdc/sample.c:374 msgid "27" msgstr "" #: ppdc/sample.c:375 msgid "28" msgstr "" #: ppdc/sample.c:376 msgid "29" msgstr "" #: ppdc/sample.c:309 msgid "3" msgstr "" #: ppdc/sample.c:381 msgid "3 inches/sec." msgstr "" #: ppdc/sample.c:3 msgid "3 x 5" msgstr "" #: ppdc/sample.c:195 msgid "3.00x1.00\"" msgstr "" #: ppdc/sample.c:196 msgid "3.00x1.25\"" msgstr "" #: ppdc/sample.c:197 msgid "3.00x2.00\"" msgstr "" #: ppdc/sample.c:198 msgid "3.00x3.00\"" msgstr "" #: ppdc/sample.c:199 msgid "3.00x5.00\"" msgstr "" #: ppdc/sample.c:200 msgid "3.25x2.00\"" msgstr "" #: ppdc/sample.c:201 msgid "3.25x5.00\"" msgstr "" #: ppdc/sample.c:202 msgid "3.25x5.50\"" msgstr "" #: ppdc/sample.c:203 msgid "3.25x5.83\"" msgstr "" #: ppdc/sample.c:204 msgid "3.25x7.83\"" msgstr "" #: ppdc/sample.c:4 msgid "3.5 x 5" msgstr "" #: ppdc/sample.c:171 msgid "3.5\" Disk" msgstr "" #: ppdc/sample.c:205 msgid "3.50x1.00\"" msgstr "" #: ppdc/sample.c:377 msgid "30" msgstr "" #: ppdc/sample.c:325 msgid "30 mm/sec." msgstr "" #: ppdc/sample.c:334 msgid "300 mm/sec." msgstr "" #: ppdc/sample.c:234 msgid "300dpi" msgstr "" #: ppdc/sample.c:405 msgid "35" msgstr "" #: ppdc/sample.c:246 msgid "360dpi" msgstr "" #: ppdc/sample.c:245 msgid "360x180dpi" msgstr "" #: ppdc/sample.c:310 msgid "4" msgstr "" #: ppdc/sample.c:382 msgid "4 inches/sec." msgstr "" #: ppdc/sample.c:206 msgid "4.00x1.00\"" msgstr "" #: ppdc/sample.c:214 msgid "4.00x13.00\"" msgstr "" #: ppdc/sample.c:207 msgid "4.00x2.00\"" msgstr "" #: ppdc/sample.c:208 msgid "4.00x2.50\"" msgstr "" #: ppdc/sample.c:209 msgid "4.00x3.00\"" msgstr "" #: ppdc/sample.c:210 msgid "4.00x4.00\"" msgstr "" #: ppdc/sample.c:211 msgid "4.00x5.00\"" msgstr "" #: ppdc/sample.c:212 msgid "4.00x6.00\"" msgstr "" #: ppdc/sample.c:213 msgid "4.00x6.50\"" msgstr "" #: ppdc/sample.c:406 msgid "40" msgstr "" #: ppdc/sample.c:326 msgid "40 mm/sec." msgstr "" #: ppdc/sample.c:407 msgid "45" msgstr "" #: ppdc/sample.c:311 msgid "5" msgstr "" #: ppdc/sample.c:432 msgid "5 inches/sec." msgstr "" #: ppdc/sample.c:5 msgid "5 x 7" msgstr "" #: ppdc/sample.c:408 msgid "50" msgstr "" #: ppdc/sample.c:409 msgid "55" msgstr "" #: ppdc/sample.c:312 msgid "6" msgstr "" #: ppdc/sample.c:433 msgid "6 inches/sec." msgstr "" #: ppdc/sample.c:215 msgid "6.00x1.00\"" msgstr "" #: ppdc/sample.c:216 msgid "6.00x2.00\"" msgstr "" #: ppdc/sample.c:217 msgid "6.00x3.00\"" msgstr "" #: ppdc/sample.c:218 msgid "6.00x4.00\"" msgstr "" #: ppdc/sample.c:219 msgid "6.00x5.00\"" msgstr "" #: ppdc/sample.c:220 msgid "6.00x6.00\"" msgstr "" #: ppdc/sample.c:221 msgid "6.00x6.50\"" msgstr "" #: ppdc/sample.c:410 msgid "60" msgstr "" #: ppdc/sample.c:327 msgid "60 mm/sec." msgstr "" #: ppdc/sample.c:253 msgid "600dpi" msgstr "" #: ppdc/sample.c:242 msgid "60dpi" msgstr "" #: ppdc/sample.c:248 msgid "60x72dpi" msgstr "" #: ppdc/sample.c:411 msgid "65" msgstr "" #: ppdc/sample.c:313 msgid "7" msgstr "" #: ppdc/sample.c:435 msgid "7 inches/sec." msgstr "" #: ppdc/sample.c:11 msgid "7 x 9" msgstr "" #: ppdc/sample.c:412 msgid "70" msgstr "" #: ppdc/sample.c:413 msgid "75" msgstr "" #: ppdc/sample.c:314 msgid "8" msgstr "" #: ppdc/sample.c:436 msgid "8 inches/sec." msgstr "" #: ppdc/sample.c:12 msgid "8 x 10" msgstr "" #: ppdc/sample.c:222 msgid "8.00x1.00\"" msgstr "" #: ppdc/sample.c:223 msgid "8.00x2.00\"" msgstr "" #: ppdc/sample.c:224 msgid "8.00x3.00\"" msgstr "" #: ppdc/sample.c:225 msgid "8.00x4.00\"" msgstr "" #: ppdc/sample.c:226 msgid "8.00x5.00\"" msgstr "" #: ppdc/sample.c:227 msgid "8.00x6.00\"" msgstr "" #: ppdc/sample.c:228 msgid "8.00x6.50\"" msgstr "" #: ppdc/sample.c:414 msgid "80" msgstr "" #: ppdc/sample.c:328 msgid "80 mm/sec." msgstr "" #: ppdc/sample.c:415 msgid "85" msgstr "" #: ppdc/sample.c:315 msgid "9" msgstr "" #: ppdc/sample.c:437 msgid "9 inches/sec." msgstr "" #: ppdc/sample.c:13 msgid "9 x 11" msgstr "" #: ppdc/sample.c:14 msgid "9 x 12" msgstr "" #: ppdc/sample.c:247 msgid "9-Pin Series" msgstr "" #: ppdc/sample.c:416 msgid "90" msgstr "" #: ppdc/sample.c:417 msgid "95" msgstr "" #: berkeley/lpc.c:199 msgid "?Invalid help command unknown." msgstr "" #: scheduler/ipp.c:2283 #, c-format msgid "A class named \"%s\" already exists." msgstr "" #: scheduler/ipp.c:890 #, c-format msgid "A printer named \"%s\" already exists." msgstr "" #: ppdc/sample.c:15 msgid "A0" msgstr "" #: ppdc/sample.c:16 msgid "A0 Long Edge" msgstr "" #: ppdc/sample.c:17 msgid "A1" msgstr "" #: ppdc/sample.c:18 msgid "A1 Long Edge" msgstr "" #: ppdc/sample.c:37 msgid "A10" msgstr "" #: ppdc/sample.c:19 msgid "A2" msgstr "" #: ppdc/sample.c:20 msgid "A2 Long Edge" msgstr "" #: ppdc/sample.c:21 msgid "A3" msgstr "" #: ppdc/sample.c:22 msgid "A3 Long Edge" msgstr "" #: ppdc/sample.c:23 msgid "A3 Oversize" msgstr "" #: ppdc/sample.c:24 msgid "A3 Oversize Long Edge" msgstr "" #: ppdc/sample.c:25 msgid "A4" msgstr "" #: ppdc/sample.c:27 msgid "A4 Long Edge" msgstr "" #: ppdc/sample.c:26 msgid "A4 Oversize" msgstr "" #: ppdc/sample.c:28 msgid "A4 Small" msgstr "" #: ppdc/sample.c:29 msgid "A5" msgstr "" #: ppdc/sample.c:31 msgid "A5 Long Edge" msgstr "" #: ppdc/sample.c:30 msgid "A5 Oversize" msgstr "" #: ppdc/sample.c:32 msgid "A6" msgstr "" #: ppdc/sample.c:33 msgid "A6 Long Edge" msgstr "" #: ppdc/sample.c:34 msgid "A7" msgstr "" #: ppdc/sample.c:35 msgid "A8" msgstr "" #: ppdc/sample.c:36 msgid "A9" msgstr "" #: ppdc/sample.c:38 msgid "ANSI A" msgstr "" #: ppdc/sample.c:39 msgid "ANSI B" msgstr "" #: ppdc/sample.c:40 msgid "ANSI C" msgstr "" #: ppdc/sample.c:41 msgid "ANSI D" msgstr "" #: ppdc/sample.c:42 msgid "ANSI E" msgstr "" #: ppdc/sample.c:47 msgid "ARCH C" msgstr "" #: ppdc/sample.c:48 msgid "ARCH C Long Edge" msgstr "" #: ppdc/sample.c:49 msgid "ARCH D" msgstr "" #: ppdc/sample.c:50 msgid "ARCH D Long Edge" msgstr "" #: ppdc/sample.c:51 msgid "ARCH E" msgstr "" #: ppdc/sample.c:52 msgid "ARCH E Long Edge" msgstr "" #: cgi-bin/classes.c:155 cgi-bin/printers.c:158 msgid "Accept Jobs" msgstr "" #: cups/http-support.c:1494 msgid "Accepted" msgstr "" #: cgi-bin/admin.c:336 msgid "Add Class" msgstr "" #: cgi-bin/admin.c:649 msgid "Add Printer" msgstr "" #: ppdc/sample.c:163 msgid "Address" msgstr "" #: cgi-bin/admin.c:172 cgi-bin/admin.c:246 cgi-bin/admin.c:2249 msgid "Administration" msgstr "" #: ppdc/sample.c:424 msgid "Always" msgstr "" #: backend/socket.c:113 msgid "AppSocket/HP JetDirect" msgstr "" #: ppdc/sample.c:445 msgid "Applicator" msgstr "" #: scheduler/ipp.c:987 #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" #: scheduler/ipp.c:5422 scheduler/ipp.c:5448 #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #: scheduler/ipp.c:5424 scheduler/ipp.c:5450 #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #: scheduler/ipp.c:227 #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "" #: ppdc/sample.c:126 msgid "B0" msgstr "" #: ppdc/sample.c:127 msgid "B1" msgstr "" #: ppdc/sample.c:137 msgid "B10" msgstr "" #: ppdc/sample.c:128 msgid "B2" msgstr "" #: ppdc/sample.c:129 msgid "B3" msgstr "" #: ppdc/sample.c:130 msgid "B4" msgstr "" #: ppdc/sample.c:131 msgid "B5" msgstr "" #: ppdc/sample.c:132 msgid "B5 Oversize" msgstr "" #: ppdc/sample.c:133 msgid "B6" msgstr "" #: ppdc/sample.c:134 msgid "B7" msgstr "" #: ppdc/sample.c:135 msgid "B8" msgstr "" #: ppdc/sample.c:136 msgid "B9" msgstr "" #: scheduler/ipp.c:7504 #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #: scheduler/ipp.c:10336 #, c-format msgid "Bad '%s' value." msgstr "" #: scheduler/ipp.c:11284 #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" #: cups/ppd.c:307 msgid "Bad CloseUI/JCLCloseUI" msgstr "" #: cups/dest.c:1661 msgid "Bad NULL dests pointer" msgstr "" #: cups/ppd.c:290 msgid "Bad OpenGroup" msgstr "" #: cups/ppd.c:292 msgid "Bad OpenUI/JCLOpenUI" msgstr "" #: cups/ppd.c:294 msgid "Bad OrderDependency" msgstr "" #: cups/ppd-cache.c:483 cups/ppd-cache.c:530 cups/ppd-cache.c:564 #: cups/ppd-cache.c:570 cups/ppd-cache.c:586 cups/ppd-cache.c:602 #: cups/ppd-cache.c:611 cups/ppd-cache.c:619 cups/ppd-cache.c:636 #: cups/ppd-cache.c:644 cups/ppd-cache.c:659 cups/ppd-cache.c:667 #: cups/ppd-cache.c:688 cups/ppd-cache.c:700 cups/ppd-cache.c:715 #: cups/ppd-cache.c:727 cups/ppd-cache.c:749 cups/ppd-cache.c:757 #: cups/ppd-cache.c:775 cups/ppd-cache.c:783 cups/ppd-cache.c:798 #: cups/ppd-cache.c:806 cups/ppd-cache.c:824 cups/ppd-cache.c:832 #: cups/ppd-cache.c:859 cups/ppd-cache.c:934 cups/ppd-cache.c:942 #: cups/ppd-cache.c:950 msgid "Bad PPD cache file." msgstr "" #: scheduler/ipp.c:2659 msgid "Bad PPD file." msgstr "" #: cups/http-support.c:1512 msgid "Bad Request" msgstr "" #: cups/snmp.c:956 msgid "Bad SNMP version number" msgstr "" #: cups/ppd.c:295 msgid "Bad UIConstraints" msgstr "" #: cups/dest.c:1195 msgid "Bad URI." msgstr "" #: cups/hash.c:48 cups/http-support.c:1606 msgid "Bad arguments to function" msgstr "" #: scheduler/ipp.c:1372 #, c-format msgid "Bad copies value %d." msgstr "" #: cups/ppd.c:303 msgid "Bad custom parameter" msgstr "" #: cups/http-support.c:1746 scheduler/ipp.c:2365 #, c-format msgid "Bad device-uri \"%s\"." msgstr "" #: scheduler/ipp.c:2410 #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "" #: scheduler/ipp.c:8486 scheduler/ipp.c:8504 scheduler/ipp.c:9732 #, c-format msgid "Bad document-format \"%s\"." msgstr "" #: scheduler/ipp.c:9750 #, c-format msgid "Bad document-format-default \"%s\"." msgstr "" #: cups/ppd-util.c:169 msgid "Bad filename buffer" msgstr "" #: cups/http-support.c:1615 msgid "Bad hostname/address in URI" msgstr "" #: scheduler/ipp.c:1554 #, c-format msgid "Bad job-name value: %s" msgstr "" #: scheduler/ipp.c:1540 msgid "Bad job-name value: Wrong type or count." msgstr "" #: scheduler/ipp.c:10374 msgid "Bad job-priority value." msgstr "" #: scheduler/ipp.c:1402 #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "" #: scheduler/ipp.c:1386 msgid "Bad job-sheets value type." msgstr "" #: scheduler/ipp.c:10404 msgid "Bad job-state value." msgstr "" #: 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:2049 scheduler/ipp.c:5773 #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "" #: scheduler/ipp.c:2014 scheduler/ipp.c:5737 #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "" #: scheduler/ipp.c:5848 #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #: scheduler/ipp.c:1418 #, c-format msgid "Bad number-up value %d." msgstr "" #: scheduler/ipp.c:1435 #, c-format msgid "Bad page-ranges values %d-%d." msgstr "" #: cups/http-support.c:1612 msgid "Bad port number in URI" msgstr "" #: scheduler/ipp.c:2456 #, c-format msgid "Bad port-monitor \"%s\"." msgstr "" #: scheduler/ipp.c:2537 #, c-format msgid "Bad printer-state value %d." msgstr "" #: cups/dest.c:678 cups/dest.c:1245 msgid "Bad printer-uri." msgstr "" #: scheduler/ipp.c:201 #, c-format msgid "Bad request ID %d." msgstr "" #: scheduler/ipp.c:191 #, c-format msgid "Bad request version number %d.%d." msgstr "" #: cups/http-support.c:1609 msgid "Bad resource in URI" msgstr "" #: cups/http-support.c:1621 msgid "Bad scheme in URI" msgstr "" #: cups/http-support.c:1618 msgid "Bad username in URI" msgstr "" #: cups/ppd.c:305 msgid "Bad value string" msgstr "" #: cups/http-support.c:1624 msgid "Bad/empty URI" msgstr "" #: cgi-bin/admin.c:2794 cgi-bin/admin.c:3043 msgid "Banners" msgstr "" #: ppdc/sample.c:282 msgid "Bond Paper" msgstr "" #: cups/ppd-cache.c:4152 msgid "Booklet" msgstr "" #: backend/usb-darwin.c:2008 #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "" #: filter/pstops.c:2026 msgid "Buffer overflow detected, aborting." msgstr "" #: ppdc/sample.c:277 msgid "CMYK" msgstr "" #: ppdc/sample.c:358 msgid "CPCL Label Printer" msgstr "" #: cgi-bin/classes.c:159 cgi-bin/printers.c:162 msgid "Cancel Jobs" msgstr "" #: backend/ipp.c:2287 msgid "Canceling print job." msgstr "" #: scheduler/ipp.c:963 scheduler/ipp.c:2512 msgid "Cannot change printer-is-shared for remote queues." msgstr "" #: scheduler/ipp.c:2499 msgid "Cannot share a remote Kerberized printer." msgstr "" #: ppdc/sample.c:271 msgid "Cassette" msgstr "" #: cgi-bin/admin.c:1347 cgi-bin/admin.c:1489 cgi-bin/admin.c:1502 #: cgi-bin/admin.c:1513 msgid "Change Settings" msgstr "" #: scheduler/ipp.c:2061 scheduler/ipp.c:5785 #, c-format msgid "Character set \"%s\" not supported." msgstr "" #: cgi-bin/classes.c:181 cgi-bin/classes.c:307 msgid "Classes" msgstr "" #: cgi-bin/printers.c:168 msgid "Clean Print Heads" msgstr "" #: scheduler/ipp.c:3920 msgid "Close-Job doesn't support the job-uri attribute." msgstr "" #: cups/ppd-cache.c:3790 ppdc/sample.c:276 msgid "Color" msgstr "" #: cups/ppd-cache.c:3751 ppdc/sample.c:274 msgid "Color Mode" msgstr "" #: berkeley/lpc.c:190 msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" #: cups/snmp.c:960 msgid "Community name uses indefinite length" msgstr "" #: backend/ipp.c:865 backend/lpd.c:929 backend/socket.c:375 msgid "Connected to printer." msgstr "" #: backend/ipp.c:701 backend/lpd.c:753 backend/socket.c:295 msgid "Connecting to printer." msgstr "" #: cups/http-support.c:1482 msgid "Continue" msgstr "" #: ppdc/sample.c:360 msgid "Continuous" msgstr "" #: backend/lpd.c:1078 backend/lpd.c:1210 msgid "Control file sent successfully." msgstr "" #: backend/ipp.c:1396 backend/lpd.c:445 msgid "Copying print data." msgstr "" #: cups/http-support.c:1491 msgid "Created" msgstr "" #: cups/tls-darwin.c:748 cups/tls-gnutls.c:582 msgid "Credentials do not validate against site CA certificate." msgstr "" #: cups/tls-darwin.c:759 cups/tls-gnutls.c:599 msgid "Credentials have expired." msgstr "" #: cups/ppd.c:1133 cups/ppd.c:1173 cups/ppd.c:1382 cups/ppd.c:1485 msgid "Custom" msgstr "" #: ppdc/sample.c:354 msgid "CustominCutInterval" msgstr "" #: ppdc/sample.c:352 msgid "CustominTearInterval" msgstr "" #: ppdc/sample.c:338 msgid "Cut" msgstr "" #: ppdc/sample.c:446 msgid "Cutter" msgstr "" #: ppdc/sample.c:239 msgid "Dark" msgstr "" #: ppdc/sample.c:235 msgid "Darkness" msgstr "" #: backend/lpd.c:1163 msgid "Data file sent successfully." msgstr "" #: cups/ppd-cache.c:3798 cups/ppd-cache.c:3807 msgid "Deep Color" msgstr "" #: cups/ppd-cache.c:3784 msgid "Deep Gray" msgstr "" #: cgi-bin/admin.c:1786 cgi-bin/admin.c:1797 cgi-bin/admin.c:1842 msgid "Delete Class" msgstr "" #: cgi-bin/admin.c:1871 cgi-bin/admin.c:1882 cgi-bin/admin.c:1927 msgid "Delete Printer" msgstr "" #: ppdc/sample.c:273 msgid "DeskJet Series" msgstr "" #: scheduler/ipp.c:1301 #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "" #: cups/ppd-cache.c:3828 cups/ppd-cache.c:3834 msgid "Device CMYK" msgstr "" #: cups/ppd-cache.c:3816 cups/ppd-cache.c:3822 msgid "Device Gray" msgstr "" #: cups/ppd-cache.c:3840 cups/ppd-cache.c:3846 msgid "Device RGB" msgstr "" #: systemv/lpinfo.c:273 #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" #: ppdc/sample.c:431 msgid "Direct Thermal Media" msgstr "" #: cups/file.c:285 #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "" #: cups/file.c:257 #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" #: cups/file.c:274 #, c-format msgid "Directory \"%s\" is a file." msgstr "" #: cups/file.c:245 #, c-format msgid "Directory \"%s\" not available: %s" msgstr "" #: cups/file.c:230 #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" #: ppdc/sample.c:340 msgid "Disabled" msgstr "" #: scheduler/ipp.c:6302 #, c-format msgid "Document #%d does not exist in job #%d." msgstr "" #: cups/ppd-cache.c:4283 cups/ppd-cache.c:4285 cups/ppd-cache.c:4348 #: cups/ppd-cache.c:4385 msgid "Draft" msgstr "" #: ppdc/sample.c:267 msgid "Duplexer" msgstr "" #: ppdc/sample.c:229 msgid "Dymo" msgstr "" #: ppdc/sample.c:426 msgid "EPL1 Label Printer" msgstr "" #: ppdc/sample.c:429 msgid "EPL2 Label Printer" msgstr "" #: cgi-bin/admin.c:1541 cgi-bin/admin.c:1553 cgi-bin/admin.c:1607 #: cgi-bin/admin.c:1614 cgi-bin/admin.c:1649 cgi-bin/admin.c:1662 #: cgi-bin/admin.c:1686 cgi-bin/admin.c:1759 msgid "Edit Configuration File" msgstr "" #: cups/http.c:4649 msgid "Encryption is not supported." msgstr "" #. TRANSLATORS: Banner/cover sheet after the print job. #: cgi-bin/admin.c:3068 msgid "Ending Banner" msgstr "" #: ppdc/sample.c:2 msgid "English" msgstr "" #: 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 "" #: ppdc/sample.c:73 msgid "Envelope #10" msgstr "" #: ppdc/sample.c:74 msgid "Envelope #11" msgstr "" #: ppdc/sample.c:75 msgid "Envelope #12" msgstr "" #: ppdc/sample.c:76 msgid "Envelope #14" msgstr "" #: ppdc/sample.c:77 msgid "Envelope #9" msgstr "" #: ppdc/sample.c:89 msgid "Envelope B4" msgstr "" #: ppdc/sample.c:90 msgid "Envelope B5" msgstr "" #: ppdc/sample.c:91 msgid "Envelope B6" msgstr "" #: ppdc/sample.c:78 msgid "Envelope C0" msgstr "" #: ppdc/sample.c:79 msgid "Envelope C1" msgstr "" #: ppdc/sample.c:80 msgid "Envelope C2" msgstr "" #: ppdc/sample.c:81 msgid "Envelope C3" msgstr "" #: ppdc/sample.c:67 msgid "Envelope C4" msgstr "" #: ppdc/sample.c:68 msgid "Envelope C5" msgstr "" #: ppdc/sample.c:69 msgid "Envelope C6" msgstr "" #: ppdc/sample.c:82 msgid "Envelope C65" msgstr "" #: ppdc/sample.c:83 msgid "Envelope C7" msgstr "" #: ppdc/sample.c:84 msgid "Envelope Choukei 3" msgstr "" #: ppdc/sample.c:85 msgid "Envelope Choukei 3 Long Edge" msgstr "" #: ppdc/sample.c:86 msgid "Envelope Choukei 4" msgstr "" #: ppdc/sample.c:87 msgid "Envelope Choukei 4 Long Edge" msgstr "" #: ppdc/sample.c:70 msgid "Envelope DL" msgstr "" #: ppdc/sample.c:261 msgid "Envelope Feed" msgstr "" #: ppdc/sample.c:88 msgid "Envelope Invite" msgstr "" #: ppdc/sample.c:92 msgid "Envelope Italian" msgstr "" #: ppdc/sample.c:93 msgid "Envelope Kaku2" msgstr "" #: ppdc/sample.c:94 msgid "Envelope Kaku2 Long Edge" msgstr "" #: ppdc/sample.c:95 msgid "Envelope Kaku3" msgstr "" #: ppdc/sample.c:96 msgid "Envelope Kaku3 Long Edge" msgstr "" #: ppdc/sample.c:97 msgid "Envelope Monarch" msgstr "" #: ppdc/sample.c:99 msgid "Envelope PRC1" msgstr "" #: ppdc/sample.c:100 msgid "Envelope PRC1 Long Edge" msgstr "" #: ppdc/sample.c:117 msgid "Envelope PRC10" msgstr "" #: ppdc/sample.c:118 msgid "Envelope PRC10 Long Edge" msgstr "" #: ppdc/sample.c:101 msgid "Envelope PRC2" msgstr "" #: ppdc/sample.c:102 msgid "Envelope PRC2 Long Edge" msgstr "" #: ppdc/sample.c:103 msgid "Envelope PRC3" msgstr "" #: ppdc/sample.c:104 msgid "Envelope PRC3 Long Edge" msgstr "" #: ppdc/sample.c:105 msgid "Envelope PRC4" msgstr "" #: ppdc/sample.c:106 msgid "Envelope PRC4 Long Edge" msgstr "" #: ppdc/sample.c:108 msgid "Envelope PRC5 Long Edge" msgstr "" #: ppdc/sample.c:107 msgid "Envelope PRC5PRC5" msgstr "" #: ppdc/sample.c:109 msgid "Envelope PRC6" msgstr "" #: ppdc/sample.c:110 msgid "Envelope PRC6 Long Edge" msgstr "" #: ppdc/sample.c:111 msgid "Envelope PRC7" msgstr "" #: ppdc/sample.c:112 msgid "Envelope PRC7 Long Edge" msgstr "" #: ppdc/sample.c:113 msgid "Envelope PRC8" msgstr "" #: ppdc/sample.c:114 msgid "Envelope PRC8 Long Edge" msgstr "" #: ppdc/sample.c:115 msgid "Envelope PRC9" msgstr "" #: ppdc/sample.c:116 msgid "Envelope PRC9 Long Edge" msgstr "" #: ppdc/sample.c:98 msgid "Envelope Personal" msgstr "" #: ppdc/sample.c:119 msgid "Envelope You4" msgstr "" #: ppdc/sample.c:120 msgid "Envelope You4 Long Edge" msgstr "" #: tools/ippfind.c:2822 msgid "Environment Variables:" msgstr "" #: ppdc/sample.c:240 msgid "Epson" msgstr "" #: cgi-bin/admin.c:3111 msgid "Error Policy" msgstr "" #: filter/rastertopwg.c:452 msgid "Error reading raster data." msgstr "" #: filter/rastertopwg.c:421 filter/rastertopwg.c:442 filter/rastertopwg.c:460 #: filter/rastertopwg.c:471 msgid "Error sending raster data." msgstr "" #: systemv/lpinfo.c:208 systemv/lpmove.c:85 msgid "Error: need hostname after \"-h\" option." msgstr "" #: ppdc/sample.c:122 msgid "European Fanfold" msgstr "" #: ppdc/sample.c:123 msgid "European Fanfold Legal" msgstr "" #: ppdc/sample.c:350 msgid "Every 10 Labels" msgstr "" #: ppdc/sample.c:342 msgid "Every 2 Labels" msgstr "" #: ppdc/sample.c:343 msgid "Every 3 Labels" msgstr "" #: ppdc/sample.c:344 msgid "Every 4 Labels" msgstr "" #: ppdc/sample.c:345 msgid "Every 5 Labels" msgstr "" #: ppdc/sample.c:346 msgid "Every 6 Labels" msgstr "" #: ppdc/sample.c:347 msgid "Every 7 Labels" msgstr "" #: ppdc/sample.c:348 msgid "Every 8 Labels" msgstr "" #: ppdc/sample.c:349 msgid "Every 9 Labels" msgstr "" #: ppdc/sample.c:341 msgid "Every Label" msgstr "" #: ppdc/sample.c:121 msgid "Executive" msgstr "" #: cups/http-support.c:1540 msgid "Expectation Failed" msgstr "" #: tools/ippfind.c:2771 msgid "Expressions:" msgstr "" #: cups/ppd-cache.c:3758 msgid "Fast Grayscale" msgstr "" #: cups/file.c:289 #, c-format msgid "File \"%s\" contains a relative path." msgstr "" #: cups/file.c:264 #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" #: cups/file.c:278 #, c-format msgid "File \"%s\" is a directory." msgstr "" #: cups/file.c:250 #, c-format msgid "File \"%s\" not available: %s" msgstr "" #: cups/file.c:236 #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" #: ppdc/sample.c:169 msgid "File Folder" msgstr "" #: 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:1259 #, c-format msgid "Finished page %d." msgstr "" #: cups/ppd-cache.c:4171 msgid "Finishing Preset" msgstr "" #: cups/ppd-cache.c:4061 msgid "Fold" msgstr "" #: ppdc/sample.c:125 msgid "Folio" msgstr "" #: cups/http-support.c:1519 msgid "Forbidden" msgstr "" #: cups/http-support.c:1503 msgid "Found" msgstr "" #: cups/ppd.c:757 cups/ppd.c:1286 msgid "General" msgstr "" #: ppdc/sample.c:251 msgid "Generic" msgstr "" #: cups/snmp.c:970 msgid "Get-Response-PDU uses indefinite length" msgstr "" #: ppdc/sample.c:285 msgid "Glossy Paper" msgstr "" #: 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 "" #: cups/ppd-cache.c:3767 cups/ppd-cache.c:3778 ppdc/sample.c:275 msgid "Grayscale" msgstr "" #: ppdc/sample.c:272 msgid "HP" msgstr "" #: ppdc/sample.c:170 msgid "Hanging Folder" msgstr "" #: cups/hash.c:292 msgid "Hash buffer too small." msgstr "" #: cgi-bin/help.c:133 msgid "Help file not in index." msgstr "" #: cups/ppd-cache.c:4290 cups/ppd-cache.c:4359 cups/ppd-cache.c:4390 msgid "High" msgstr "" #: cups/ipp.c:3094 cups/ipp.c:3121 cups/ipp.c:3144 msgid "IPP 1setOf attribute with incompatible value tags." msgstr "" #: cups/ipp.c:3057 msgid "IPP attribute has no name." msgstr "" #: cups/ipp.c:6802 msgid "IPP attribute is not a member of the message." msgstr "" #: cups/ipp.c:3507 msgid "IPP begCollection value not 0 bytes." msgstr "" #: cups/ipp.c:3285 msgid "IPP boolean value not 1 byte." msgstr "" #: cups/ipp.c:3350 msgid "IPP date value not 11 bytes." msgstr "" #: cups/ipp.c:3528 msgid "IPP endCollection value not 0 bytes." msgstr "" #: cups/ipp.c:3260 msgid "IPP enum value not 4 bytes." msgstr "" #: cups/ipp.c:2975 msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "" #: cups/ipp.c:3257 msgid "IPP integer value not 4 bytes." msgstr "" #: cups/ipp.c:3460 msgid "IPP language length overflows value." msgstr "" #: cups/ipp.c:3469 msgid "IPP language length too large." msgstr "" #: cups/ipp.c:3171 msgid "IPP member name is not empty." msgstr "" #: cups/ipp.c:3554 msgid "IPP memberName value is empty." msgstr "" #: cups/ipp.c:3546 msgid "IPP memberName with no attribute." msgstr "" #: cups/ipp.c:3035 msgid "IPP name larger than 32767 bytes." msgstr "" #: cups/ipp.c:3427 msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "" #: cups/ipp.c:3585 msgid "IPP octetString length too large." msgstr "" #: cups/ipp.c:3395 msgid "IPP rangeOfInteger value not 8 bytes." msgstr "" #: cups/ipp.c:3368 msgid "IPP resolution value not 9 bytes." msgstr "" #: cups/ipp.c:3487 msgid "IPP string length overflows value." msgstr "" #: cups/ipp.c:3423 msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "" #: cups/ipp.c:3243 msgid "IPP value larger than 32767 bytes." msgstr "" #: tools/ippfind.c:2823 msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" #: tools/ippfind.c:2824 msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" #: tools/ippfind.c:2826 msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" #: tools/ippfind.c:2827 msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" #: tools/ippfind.c:2828 msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" #: tools/ippfind.c:2829 msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" #: tools/ippfind.c:2830 msgid "IPPFIND_SERVICE_URI URI" msgstr "" #: tools/ippfind.c:2831 msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" #: ppdc/sample.c:1 msgid "ISOLatin1" msgstr "" #: cups/ppd.c:298 msgid "Illegal control character" msgstr "" #: cups/ppd.c:299 msgid "Illegal main keyword string" msgstr "" #: cups/ppd.c:300 msgid "Illegal option keyword string" msgstr "" #: cups/ppd.c:301 msgid "Illegal translation string" msgstr "" #: cups/ppd.c:302 msgid "Illegal whitespace character" msgstr "" #: ppdc/sample.c:266 msgid "Installable Options" msgstr "" #: ppdc/sample.c:269 msgid "Installed" msgstr "" #: ppdc/sample.c:288 msgid "IntelliBar Label Printer" msgstr "" #: ppdc/sample.c:287 msgid "Intellitech" msgstr "" #: cups/http-support.c:1546 msgid "Internal Server Error" msgstr "" #: cups/ppd.c:289 msgid "Internal error" msgstr "" #: ppdc/sample.c:167 msgid "Internet Postage 2-Part" msgstr "" #: ppdc/sample.c:168 msgid "Internet Postage 3-Part" msgstr "" #: backend/ipp.c:319 msgid "Internet Printing Protocol" msgstr "" #: cups/ipp.c:2995 msgid "Invalid group tag." msgstr "" #: cups/pwg-media.c:288 cups/pwg-media.c:307 msgid "Invalid media name arguments." msgstr "" #: cups/dest-options.c:1232 msgid "Invalid media size." msgstr "" #: 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 "" #: filter/commandtops.c:108 #, c-format msgid "Invalid printer command \"%s\"." msgstr "" #: cups/ppd.c:1404 msgid "JCL" msgstr "" #: ppdc/sample.c:53 msgid "JIS B0" msgstr "" #: ppdc/sample.c:55 msgid "JIS B1" msgstr "" #: ppdc/sample.c:54 msgid "JIS B10" msgstr "" #: ppdc/sample.c:56 msgid "JIS B2" msgstr "" #: ppdc/sample.c:57 msgid "JIS B3" msgstr "" #: ppdc/sample.c:58 msgid "JIS B4" msgstr "" #: ppdc/sample.c:59 msgid "JIS B4 Long Edge" msgstr "" #: ppdc/sample.c:60 msgid "JIS B5" msgstr "" #: ppdc/sample.c:61 msgid "JIS B5 Long Edge" msgstr "" #: ppdc/sample.c:62 msgid "JIS B6" msgstr "" #: ppdc/sample.c:63 msgid "JIS B6 Long Edge" msgstr "" #: ppdc/sample.c:64 msgid "JIS B7" msgstr "" #: ppdc/sample.c:65 msgid "JIS B8" msgstr "" #: ppdc/sample.c:66 msgid "JIS B9" msgstr "" #: scheduler/ipp.c:9324 #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "" #: 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:3528 #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "" #: scheduler/ipp.c:3522 #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "" #: scheduler/ipp.c:3534 #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "" #: 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:9306 #, c-format msgid "Job #%d is not complete." msgstr "" #: scheduler/ipp.c:3039 #, c-format msgid "Job #%d is not held for authentication." msgstr "" #: scheduler/ipp.c:9082 #, c-format msgid "Job #%d is not held." msgstr "" #: cgi-bin/ipp-var.c:1032 msgid "Job Completed" msgstr "" #: cgi-bin/ipp-var.c:1030 msgid "Job Created" msgstr "" #: cgi-bin/ipp-var.c:1036 msgid "Job Options Changed" msgstr "" #: cgi-bin/ipp-var.c:1034 msgid "Job Stopped" msgstr "" #: scheduler/ipp.c:10382 msgid "Job is completed and cannot be changed." msgstr "" #: cgi-bin/jobs.c:186 msgid "Job operation failed" msgstr "" #: scheduler/ipp.c:10418 scheduler/ipp.c:10435 scheduler/ipp.c:10446 msgid "Job state cannot be changed." msgstr "" #: scheduler/ipp.c:9172 msgid "Job subscriptions cannot be renewed." msgstr "" #: cgi-bin/jobs.c:91 cgi-bin/jobs.c:102 cgi-bin/jobs.c:183 msgid "Jobs" msgstr "" #: backend/lpd.c:162 msgid "LPD/LPR Host or Printer" msgstr "" #: cups/dest.c:1856 msgid "LPDEST environment variable names default destination that does not exist." msgstr "" #: ppdc/sample.c:230 msgid "Label Printer" msgstr "" #: ppdc/sample.c:441 msgid "Label Top" msgstr "" #: scheduler/ipp.c:2070 scheduler/ipp.c:5794 #, c-format msgid "Language \"%s\" not supported." msgstr "" #: ppdc/sample.c:164 msgid "Large Address" msgstr "" #: ppdc/sample.c:286 msgid "LaserJet Series PCL 4/5" msgstr "" #: ppdc/sample.c:43 msgid "Letter Oversize" msgstr "" #: ppdc/sample.c:44 msgid "Letter Oversize Long Edge" msgstr "" #: ppdc/sample.c:236 msgid "Light" msgstr "" #: cups/ppd.c:297 msgid "Line longer than the maximum allowed (255 characters)" msgstr "" #: cgi-bin/admin.c:1950 msgid "List Available Printers" msgstr "" #: tools/ippeveprinter.c:604 #, c-format msgid "Listening on port %d." msgstr "" #: scheduler/ipp.c:5503 msgid "Local printer created." msgstr "" #: cups/ppd-cache.c:3872 ppdc/sample.c:264 msgid "Long-Edge (Portrait)" msgstr "" #: cups/http-support.c:1870 msgid "Looking for printer." msgstr "" #: ppdc/sample.c:260 msgid "Manual Feed" msgstr "" #: cups/ppd.c:804 cups/ppd.c:1341 msgid "Media Size" msgstr "" #: cups/ppd.c:808 cups/ppd.c:1345 ppdc/sample.c:254 msgid "Media Source" msgstr "" #: ppdc/sample.c:359 msgid "Media Tracking" msgstr "" #: cups/ppd.c:806 cups/ppd.c:1343 ppdc/sample.c:280 msgid "Media Type" msgstr "" #: ppdc/sample.c:237 msgid "Medium" msgstr "" #: cups/ppd.c:286 msgid "Memory allocation error" msgstr "" #: cups/ppd.c:306 msgid "Missing CloseGroup" msgstr "" #: cups/ppd.c:308 msgid "Missing CloseUI/JCLCloseUI" msgstr "" #: cups/ppd.c:287 msgid "Missing PPD-Adobe-4.x header" msgstr "" #: cups/ppd.c:296 msgid "Missing asterisk in column 1" msgstr "" #: 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:3367 msgid "Missing form variable" msgstr "" #: scheduler/ipp.c:9698 msgid "Missing last-document attribute in request." msgstr "" #: cups/pwg-media.c:547 msgid "Missing media or media-col." msgstr "" #: cups/pwg-media.c:466 msgid "Missing media-size in media-col." msgstr "" #: scheduler/ipp.c:6895 msgid "Missing notify-subscription-ids attribute." msgstr "" #: cups/ppd.c:304 msgid "Missing option keyword" msgstr "" #: scheduler/ipp.c:3165 scheduler/ipp.c:3190 msgid "Missing requesting-user-name attribute." msgstr "" #: scheduler/ipp.c:5420 scheduler/ipp.c:5446 #, c-format msgid "Missing required attribute \"%s\"." msgstr "" #: scheduler/ipp.c:347 msgid "Missing required attributes." msgstr "" #: cups/http-support.c:1636 msgid "Missing resource in URI" msgstr "" #: cups/http-support.c:1630 msgid "Missing scheme in URI" msgstr "" #: cups/ppd.c:288 msgid "Missing value string" msgstr "" #: cups/pwg-media.c:454 msgid "Missing x-dimension in media-size." msgstr "" #: cups/pwg-media.c:460 msgid "Missing y-dimension in media-size." msgstr "" #: systemv/lpinfo.c:443 systemv/lpinfo.c:467 #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" #: tools/ippfind.c:2801 msgid "Modifiers:" msgstr "" #: cgi-bin/admin.c:336 msgid "Modify Class" msgstr "" #: cgi-bin/admin.c:649 msgid "Modify Printer" msgstr "" #: cgi-bin/ipp-var.c:407 cgi-bin/ipp-var.c:498 msgid "Move All Jobs" msgstr "" #: cgi-bin/ipp-var.c:346 cgi-bin/ipp-var.c:405 cgi-bin/ipp-var.c:496 msgid "Move Job" msgstr "" #: cups/http-support.c:1500 msgid "Moved Permanently" msgstr "" #: cups/ppd.c:285 msgid "NULL PPD file pointer" msgstr "" #: cups/snmp.c:1007 msgid "Name OID uses indefinite length" msgstr "" #: scheduler/ipp.c:1056 msgid "Nested classes are not allowed." msgstr "" #: ppdc/sample.c:425 msgid "Never" msgstr "" #: cups/tls-darwin.c:690 cups/tls-gnutls.c:524 msgid "New credentials are not valid for name." msgstr "" #: cups/tls-darwin.c:680 cups/tls-gnutls.c:514 msgid "New credentials are older than stored credentials." msgstr "" #: cups/ppd.c:1974 msgid "No" msgstr "" #: cups/http-support.c:1497 msgid "No Content" msgstr "" #: cups/ppd-cache.c:3076 msgid "No IPP attributes." msgstr "" #: cups/ppd-util.c:489 msgid "No PPD name" msgstr "" #: cups/snmp.c:1001 msgid "No VarBind SEQUENCE" msgstr "" #: cups/request.c:548 cups/request.c:920 msgid "No active connection" msgstr "" #: cups/request.c:329 msgid "No active connection." msgstr "" #: scheduler/ipp.c:3445 #, c-format msgid "No active jobs on %s." msgstr "" #: scheduler/ipp.c:207 msgid "No attributes in request." msgstr "" #: scheduler/ipp.c:3066 msgid "No authentication information provided." msgstr "" #: cups/tls-darwin.c:630 cups/tls-gnutls.c:461 msgid "No common name specified." msgstr "" #: cups/snmp.c:958 msgid "No community name" msgstr "" #: cups/dest.c:1860 cups/dest.c:1872 msgid "No default destination." msgstr "" #: scheduler/ipp.c:6094 msgid "No default printer." msgstr "" #: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7476 msgid "No destinations added." msgstr "" #: backend/usb.c:187 msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" #: cups/snmp.c:988 msgid "No error-index" msgstr "" #: cups/snmp.c:980 msgid "No error-status" msgstr "" #: scheduler/ipp.c:8448 scheduler/ipp.c:9712 msgid "No file in print request." msgstr "" #: cups/ppd-util.c:162 msgid "No modification time" msgstr "" #: cups/snmp.c:1005 msgid "No name OID" msgstr "" #: filter/rastertoepson.c:1161 filter/rastertohp.c:833 #: filter/rastertolabel.c:1288 msgid "No pages were found." msgstr "" #: cups/ppd-util.c:155 msgid "No printer name" msgstr "" #: cups/ppd-util.c:658 msgid "No printer-uri found" msgstr "" #: cups/ppd-util.c:642 msgid "No printer-uri found for class" msgstr "" #: scheduler/ipp.c:6501 msgid "No printer-uri in request." msgstr "" #: cups/http.c:2217 msgid "No request URI." msgstr "" #: cups/http.c:2234 msgid "No request protocol version." msgstr "" #: cups/request.c:337 msgid "No request sent." msgstr "" #: cups/snmp.c:972 msgid "No request-id" msgstr "" #: cups/tls-darwin.c:710 cups/tls-gnutls.c:544 msgid "No stored credentials, not valid for name." msgstr "" #: scheduler/ipp.c:5679 msgid "No subscription attributes in request." msgstr "" #: scheduler/ipp.c:7829 msgid "No subscriptions found." msgstr "" #: cups/snmp.c:996 msgid "No variable-bindings SEQUENCE" msgstr "" #: cups/snmp.c:951 msgid "No version number" msgstr "" #: ppdc/sample.c:362 msgid "Non-continuous (Mark sensing)" msgstr "" #: ppdc/sample.c:361 msgid "Non-continuous (Web sensing)" msgstr "" #: cups/ppd-cache.c:4014 cups/ppd-cache.c:4064 cups/ppd-cache.c:4114 #: cups/ppd-cache.c:4174 msgid "None" msgstr "" #: cups/ppd-cache.c:4287 cups/ppd-cache.c:4353 cups/ppd-cache.c:4387 #: ppdc/sample.c:238 msgid "Normal" msgstr "" #: cups/http-support.c:1522 msgid "Not Found" msgstr "" #: cups/http-support.c:1534 msgid "Not Implemented" msgstr "" #: ppdc/sample.c:268 msgid "Not Installed" msgstr "" #: cups/http-support.c:1509 msgid "Not Modified" msgstr "" #: cups/http-support.c:1537 msgid "Not Supported" msgstr "" #: scheduler/ipp.c:1510 scheduler/ipp.c:10979 msgid "Not allowed to print." msgstr "" #: ppdc/sample.c:146 msgid "Note" msgstr "" #: cups/http-support.c:1488 cups/http-support.c:1627 cups/ppd.c:283 msgid "OK" msgstr "" #: cups/ppd-cache.c:3872 ppdc/sample.c:263 msgid "Off (1-Sided)" msgstr "" #: ppdc/sample.c:356 msgid "Oki" msgstr "" #: cgi-bin/help.c:81 cgi-bin/help.c:122 cgi-bin/help.c:132 cgi-bin/help.c:162 msgid "Online Help" msgstr "" #: scheduler/ipp.c:5399 msgid "Only local users can create a local printer." msgstr "" #: cups/adminutil.c:202 #, c-format msgid "Open of %s failed: %s" msgstr "" #: cups/ppd.c:291 msgid "OpenGroup without a CloseGroup first" msgstr "" #: cups/ppd.c:293 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "" #: cgi-bin/admin.c:3138 msgid "Operation Policy" msgstr "" #: filter/pstops.c:2174 #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "" #: cgi-bin/admin.c:2785 cgi-bin/admin.c:2869 msgid "Options Installed" msgstr "" #: berkeley/lpq.c:642 berkeley/lpr.c:431 berkeley/lprm.c:232 #: 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: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 #: ppdc/ppdmerge.cxx:356 ppdc/ppdpo.cxx:243 msgid "Options:" msgstr "" #: cups/dest-localization.c:169 msgid "Other Media" msgstr "" #: cups/dest-localization.c:167 msgid "Other Tray" msgstr "" #: cups/ppd-cache.c:491 msgid "Out of date PPD cache file." msgstr "" #: cups/ppd-cache.c:1934 msgid "Out of memory." msgstr "" #: cups/ppd.c:810 cups/ppd.c:1347 msgid "Output Mode" msgstr "" #: ppdc/sample.c:252 msgid "PCL Laser Printer" msgstr "" #: ppdc/sample.c:149 msgid "PRC16K" msgstr "" #: ppdc/sample.c:150 msgid "PRC16K Long Edge" msgstr "" #: ppdc/sample.c:151 msgid "PRC32K" msgstr "" #: ppdc/sample.c:154 msgid "PRC32K Long Edge" msgstr "" #: ppdc/sample.c:152 msgid "PRC32K Oversize" msgstr "" #: ppdc/sample.c:153 msgid "PRC32K Oversize Long Edge" msgstr "" #: cups/dest.c:1858 msgid "PRINTER environment variable names default destination that does not exist." msgstr "" #: cups/snmp.c:968 msgid "Packet does not contain a Get-Response-PDU" msgstr "" #: cups/snmp.c:947 msgid "Packet does not start with SEQUENCE" msgstr "" #: ppdc/sample.c:355 msgid "ParamCustominCutInterval" msgstr "" #: ppdc/sample.c:353 msgid "ParamCustominTearInterval" msgstr "" #: cups/auth.c:235 cups/auth.c:394 #, c-format msgid "Password for %s on %s? " msgstr "" #: cgi-bin/classes.c:153 msgid "Pause Class" msgstr "" #: cgi-bin/printers.c:156 msgid "Pause Printer" msgstr "" #: ppdc/sample.c:443 msgid "Peel-Off" msgstr "" #: ppdc/sample.c:160 msgid "Photo" msgstr "" #: ppdc/sample.c:161 msgid "Photo Labels" msgstr "" #: ppdc/sample.c:281 msgid "Plain Paper" msgstr "" #: cgi-bin/admin.c:2803 cgi-bin/admin.c:3087 msgid "Policies" msgstr "" #: cgi-bin/admin.c:2810 cgi-bin/admin.c:3156 cgi-bin/admin.c:3169 msgid "Port Monitor" msgstr "" #: ppdc/sample.c:270 msgid "PostScript Printer" msgstr "" #: ppdc/sample.c:147 msgid "Postcard" msgstr "" #: ppdc/sample.c:71 msgid "Postcard Double" msgstr "" #: ppdc/sample.c:72 msgid "Postcard Double Long Edge" msgstr "" #: ppdc/sample.c:148 msgid "Postcard Long Edge" msgstr "" #: backend/ipp.c:973 backend/ipp.c:981 msgid "Preparing to print." msgstr "" #: ppdc/sample.c:290 msgid "Print Density" msgstr "" #: cups/notify.c:69 msgid "Print Job:" msgstr "" #: ppdc/sample.c:335 msgid "Print Mode" msgstr "" #: cups/ppd-cache.c:4281 cups/ppd-cache.c:4343 cups/ppd-cache.c:4383 msgid "Print Quality" msgstr "" #: ppdc/sample.c:378 msgid "Print Rate" msgstr "" #: cgi-bin/printers.c:165 msgid "Print Self-Test Page" msgstr "" #: ppdc/sample.c:322 msgid "Print Speed" msgstr "" #: cgi-bin/ipp-var.c:774 msgid "Print Test Page" msgstr "" #: ppdc/sample.c:351 msgid "Print and Cut" msgstr "" #: ppdc/sample.c:339 msgid "Print and Tear" msgstr "" #: backend/socket.c:406 backend/usb-unix.c:177 msgid "Print file sent." msgstr "" #: backend/ipp.c:2261 msgid "Print job canceled at printer." msgstr "" #: backend/ipp.c:2253 msgid "Print job too large." msgstr "" #: backend/ipp.c:1721 msgid "Print job was not accepted." msgstr "" #: scheduler/ipp.c:5465 #, c-format msgid "Printer \"%s\" already exists." msgstr "" #: cgi-bin/ipp-var.c:1024 msgid "Printer Added" msgstr "" #: ppdc/sample.c:255 msgid "Printer Default" msgstr "" #: cgi-bin/ipp-var.c:1028 msgid "Printer Deleted" msgstr "" #: cgi-bin/ipp-var.c:1026 msgid "Printer Modified" msgstr "" #: cgi-bin/ipp-var.c:1022 msgid "Printer Paused" msgstr "" #: ppdc/sample.c:289 msgid "Printer Settings" msgstr "" #: backend/ipp.c:2256 msgid "Printer cannot print supplied content." msgstr "" #: backend/ipp.c:2259 msgid "Printer cannot print with supplied options." msgstr "" #: cups/ppd-cache.c:4556 msgid "Printer does not support required IPP attributes or document formats." msgstr "" #: cups/notify.c:113 msgid "Printer:" msgstr "" #: cgi-bin/printers.c:190 cgi-bin/printers.c:317 msgid "Printers" msgstr "" #: filter/rastertoepson.c:1107 filter/rastertohp.c:774 #: filter/rastertolabel.c:1235 #, c-format msgid "Printing page %d, %u%% complete." msgstr "" #: cups/ppd-cache.c:4111 msgid "Punch" msgstr "" #: ppdc/sample.c:155 msgid "Quarto" msgstr "" #: scheduler/ipp.c:1505 scheduler/ipp.c:10974 msgid "Quota limit reached." msgstr "" #: berkeley/lpq.c:495 msgid "Rank Owner Job File(s) Total Size" msgstr "" #: cgi-bin/classes.c:157 cgi-bin/printers.c:160 msgid "Reject Jobs" msgstr "" #: backend/lpd.c:1074 backend/lpd.c:1206 #, c-format msgid "Remote host did not accept control file (%d)." msgstr "" #: backend/lpd.c:1159 #, c-format msgid "Remote host did not accept data file (%d)." msgstr "" #: ppdc/sample.c:423 msgid "Reprint After Error" msgstr "" #: cups/http-support.c:1525 msgid "Request Entity Too Large" msgstr "" #: cups/ppd.c:812 cups/ppd.c:1349 ppdc/sample.c:231 msgid "Resolution" msgstr "" #: cgi-bin/classes.c:151 msgid "Resume Class" msgstr "" #: cgi-bin/printers.c:153 msgid "Resume Printer" msgstr "" #: ppdc/sample.c:165 msgid "Return Address" msgstr "" #: ppdc/sample.c:444 msgid "Rewind" msgstr "" #: cups/snmp.c:949 msgid "SEQUENCE uses indefinite length" msgstr "" #: cups/http-support.c:1549 msgid "SSL/TLS Negotiation Error" msgstr "" #: cups/http-support.c:1506 msgid "See Other" msgstr "" #: scheduler/ipp.c:7099 scheduler/ipp.c:7118 msgid "See remote printer." msgstr "" #: cups/tls-darwin.c:765 cups/tls-gnutls.c:606 msgid "Self-signed credentials are blocked." msgstr "" #: backend/usb-darwin.c:566 backend/usb-libusb.c:343 msgid "Sending data to printer." msgstr "" #: cgi-bin/ipp-var.c:1038 msgid "Server Restarted" msgstr "" #: cgi-bin/ipp-var.c:1044 msgid "Server Security Auditing" msgstr "" #: cgi-bin/ipp-var.c:1040 msgid "Server Started" msgstr "" #: cgi-bin/ipp-var.c:1042 msgid "Server Stopped" msgstr "" #: cups/tls-darwin.c:1275 cups/tls-gnutls.c:1298 msgid "Server credentials not set." msgstr "" #: cups/http-support.c:1543 msgid "Service Unavailable" msgstr "" #: cgi-bin/admin.c:2290 cgi-bin/admin.c:2336 cgi-bin/admin.c:2493 #: cgi-bin/admin.c:2512 msgid "Set Allowed Users" msgstr "" #: cgi-bin/admin.c:2539 msgid "Set As Server Default" msgstr "" #: cgi-bin/admin.c:2639 msgid "Set Class Options" msgstr "" #: cgi-bin/admin.c:2639 cgi-bin/admin.c:2813 cgi-bin/admin.c:3198 msgid "Set Printer Options" msgstr "" #: cgi-bin/admin.c:3368 cgi-bin/admin.c:3412 cgi-bin/admin.c:3430 msgid "Set Publishing" msgstr "" #: ppdc/sample.c:166 msgid "Shipping Address" msgstr "" #: cups/ppd-cache.c:3872 ppdc/sample.c:265 msgid "Short-Edge (Landscape)" msgstr "" #: ppdc/sample.c:283 msgid "Special Paper" msgstr "" #: backend/lpd.c:1115 #, c-format msgid "Spooling job, %.0f%% complete." msgstr "" #: ppdc/sample.c:336 msgid "Standard" msgstr "" #: cups/ppd-cache.c:4011 msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. #: cgi-bin/admin.c:3059 msgid "Starting Banner" msgstr "" #: filter/rastertoepson.c:1083 filter/rastertohp.c:750 #: filter/rastertolabel.c:1211 #, c-format msgid "Starting page %d." msgstr "" #: ppdc/sample.c:156 msgid "Statement" msgstr "" #: 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 "" #: tools/ippfind.c:2812 msgid "Substitutions:" msgstr "" #: ppdc/sample.c:157 msgid "Super A" msgstr "" #: ppdc/sample.c:158 msgid "Super B" msgstr "" #: ppdc/sample.c:162 msgid "Super B/A3" msgstr "" #: cups/http-support.c:1485 msgid "Switching Protocols" msgstr "" #: ppdc/sample.c:159 msgid "Tabloid" msgstr "" #: ppdc/sample.c:45 msgid "Tabloid Oversize" msgstr "" #: ppdc/sample.c:46 msgid "Tabloid Oversize Long Edge" msgstr "" #: ppdc/sample.c:337 msgid "Tear" msgstr "" #: ppdc/sample.c:442 msgid "Tear-Off" msgstr "" #: ppdc/sample.c:383 msgid "Tear-Off Adjust Position" msgstr "" #: scheduler/ipp.c:1341 #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "" #: 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 "" #: scheduler/ipp.c:1320 #, c-format msgid "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #: scheduler/ipp.c:5194 #, c-format msgid "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" #: scheduler/ipp.c:7141 #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "" #: 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:1175 msgid "The PPD file could not be opened." msgstr "" #: cgi-bin/admin.c:515 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:2097 msgid "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" #: scheduler/ipp.c:2080 scheduler/ipp.c:5804 #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "" #: backend/ipp.c:993 msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" #: backend/lpd.c:678 backend/lpd.c:1067 backend/lpd.c:1149 backend/lpd.c:1199 msgid "The printer did not respond." msgstr "" #: backend/ipp.c:766 backend/ipp.c:956 backend/ipp.c:1070 backend/ipp.c:1523 #: backend/ipp.c:1693 backend/lpd.c:886 backend/socket.c:354 #: backend/usb-unix.c:117 backend/usb-unix.c:407 backend/usb-unix.c:490 msgid "The printer is in use." msgstr "" #: backend/runloop.c:236 backend/runloop.c:356 msgid "The printer is not connected." msgstr "" #: backend/ipp.c:744 backend/ipp.c:777 backend/ipp.c:952 backend/lpd.c:865 #: backend/lpd.c:906 backend/socket.c:333 backend/socket.c:366 msgid "The printer is not responding." msgstr "" #: backend/runloop.c:378 msgid "The printer is now connected." msgstr "" #: backend/usb-darwin.c:1342 msgid "The printer is now online." msgstr "" #: backend/usb-darwin.c:1381 msgid "The printer is offline." msgstr "" #: backend/ipp.c:760 backend/lpd.c:880 backend/socket.c:348 msgid "The printer is unreachable at this time." msgstr "" #: backend/ipp.c:753 backend/lpd.c:873 backend/socket.c:341 msgid "The printer may not exist or is unavailable at this time." msgstr "" #: cgi-bin/admin.c:698 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: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 "" #: scheduler/ipp.c:1259 msgid "The printer or class is not shared." msgstr "" #: scheduler/ipp.c:868 scheduler/ipp.c:2261 #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "" #: scheduler/ipp.c:3207 msgid "The printer-uri attribute is required." msgstr "" #: scheduler/ipp.c:852 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" #: scheduler/ipp.c:2245 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" #: scheduler/client.c:2003 msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." msgstr "" #: scheduler/ipp.c:6636 #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "" #: scheduler/ipp.c:5901 msgid "There are too many subscriptions." msgstr "" #: backend/usb-darwin.c:398 backend/usb-darwin.c:464 backend/usb-darwin.c:528 #: backend/usb-darwin.c:549 backend/usb-libusb.c:268 backend/usb-libusb.c:322 msgid "There was an unrecoverable USB error." msgstr "" #: ppdc/sample.c:430 msgid "Thermal Transfer Media" msgstr "" #: scheduler/ipp.c:1499 msgid "Too many active jobs." msgstr "" #: scheduler/ipp.c:1393 #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "" #: scheduler/ipp.c:2574 #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "" #: ppdc/sample.c:284 msgid "Transparency" msgstr "" #: ppdc/sample.c:279 msgid "Tray" msgstr "" #: ppdc/sample.c:256 msgid "Tray 1" msgstr "" #: ppdc/sample.c:257 msgid "Tray 2" msgstr "" #: ppdc/sample.c:258 msgid "Tray 3" msgstr "" #: ppdc/sample.c:259 msgid "Tray 4" msgstr "" #: cups/tls-darwin.c:670 cups/tls-darwin.c:752 cups/tls-gnutls.c:504 #: cups/tls-gnutls.c:586 msgid "Trust on first use is disabled." msgstr "" #: cups/http-support.c:1528 msgid "URI Too Long" msgstr "" #: cups/http-support.c:1603 msgid "URI too large" msgstr "" #: ppdc/sample.c:124 msgid "US Fanfold" msgstr "" #: ppdc/sample.c:138 msgid "US Ledger" msgstr "" #: ppdc/sample.c:139 msgid "US Legal" msgstr "" #: ppdc/sample.c:140 msgid "US Legal Oversize" msgstr "" #: ppdc/sample.c:141 msgid "US Letter" msgstr "" #: ppdc/sample.c:142 msgid "US Letter Long Edge" msgstr "" #: ppdc/sample.c:143 msgid "US Letter Oversize" msgstr "" #: ppdc/sample.c:144 msgid "US Letter Oversize Long Edge" msgstr "" #: ppdc/sample.c:145 msgid "US Letter Small" msgstr "" #: cgi-bin/admin.c:1651 cgi-bin/admin.c:1664 cgi-bin/admin.c:1688 msgid "Unable to access cupsd.conf file" msgstr "" #: cgi-bin/help.c:123 msgid "Unable to access help file." msgstr "" #: cgi-bin/admin.c:580 msgid "Unable to add class" msgstr "" #: backend/ipp.c:1880 msgid "Unable to add document to print job." msgstr "" #: scheduler/ipp.c:1574 #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "" #: cgi-bin/admin.c:823 cgi-bin/admin.c:1193 msgid "Unable to add printer" msgstr "" #: scheduler/ipp.c:1177 msgid "Unable to allocate memory for file types." msgstr "" #: filter/pstops.c:415 msgid "Unable to allocate memory for page info" msgstr "" #: filter/pstops.c:409 msgid "Unable to allocate memory for pages array" msgstr "" #: tools/ippeveprinter.c:1486 msgid "Unable to allocate memory for printer" msgstr "" #: backend/ipp.c:2165 backend/ipp.c:2696 msgid "Unable to cancel print job." msgstr "" #: cgi-bin/admin.c:2494 msgid "Unable to change printer" msgstr "" #: cgi-bin/admin.c:3413 msgid "Unable to change printer-is-shared attribute" msgstr "" #: cgi-bin/admin.c:1349 cgi-bin/admin.c:1491 msgid "Unable to change server settings" msgstr "" #: cups/ipp.c:5179 #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" #: cups/ipp.c:5134 #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" #: filter/commandtops.c:401 msgid "Unable to configure printer options." msgstr "" #: cups/adminutil.c:158 cups/request.c:1057 msgid "Unable to connect to host." msgstr "" #: backend/ipp.c:723 backend/ipp.c:1275 backend/lpd.c:846 backend/socket.c:314 #: backend/usb-unix.c:103 msgid "Unable to contact printer, queuing on next printer in class." msgstr "" #: scheduler/ipp.c:2676 #, c-format msgid "Unable to copy PPD file - %s" msgstr "" #: scheduler/ipp.c:2721 msgid "Unable to copy PPD file." msgstr "" #: cups/tls-darwin.c:636 cups/tls-gnutls.c:467 msgid "Unable to create credentials from array." msgstr "" #: cups/ppd-util.c:573 cups/util.c:478 msgid "Unable to create printer-uri" msgstr "" #: scheduler/ipp.c:5475 msgid "Unable to create printer." msgstr "" #: cups/tls-darwin.c:1566 cups/tls-gnutls.c:1510 msgid "Unable to create server credentials." msgstr "" #: tools/ippeveprinter.c:626 #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" #: cgi-bin/admin.c:1542 cgi-bin/admin.c:1554 scheduler/cupsfilter.c:1284 msgid "Unable to create temporary file" msgstr "" #: cgi-bin/admin.c:1845 msgid "Unable to delete class" msgstr "" #: cgi-bin/admin.c:1930 msgid "Unable to delete printer" msgstr "" #: cgi-bin/classes.c:246 cgi-bin/printers.c:255 msgid "Unable to do maintenance command" msgstr "" #: cgi-bin/admin.c:1666 msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "" #: cups/tls-darwin.c:1793 #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" #: cups/tls-darwin.c:1754 msgid "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" #: cups/tls-darwin.c:1744 msgid "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" #: cups/tls-darwin.c:1739 msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" #: cups/tls-darwin.c:1749 msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" #: cups/tls-darwin.c:1759 msgid "Unable to establish a secure connection to host (peer dropped connection before responding)." msgstr "" #: cups/tls-darwin.c:1734 msgid "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" #: cups/tls-darwin.c:1729 msgid "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" #: cups/tls-sspi.c:1277 cups/tls-sspi.c:1294 msgid "Unable to establish a secure connection to host." msgstr "" #: tools/ippeveprinter.c:1461 tools/ippeveprinter.c:1471 #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" #: cgi-bin/ipp-var.c:347 msgid "Unable to find destination for job" msgstr "" #: cups/http-support.c:2094 msgid "Unable to find printer." msgstr "" #: cups/tls-darwin.c:1579 msgid "Unable to find server credentials." msgstr "" #: backend/ipp.c:3359 msgid "Unable to get backend exit status." msgstr "" #: cgi-bin/classes.c:426 msgid "Unable to get class list" msgstr "" #: cgi-bin/classes.c:525 msgid "Unable to get class status" msgstr "" #: cgi-bin/admin.c:1087 msgid "Unable to get list of printer drivers" msgstr "" #: cgi-bin/admin.c:2344 msgid "Unable to get printer attributes" msgstr "" #: cgi-bin/printers.c:443 msgid "Unable to get printer list" msgstr "" #: cgi-bin/printers.c:545 msgid "Unable to get printer status" msgstr "" #: backend/ipp.c:1017 msgid "Unable to get printer status." msgstr "" #: cgi-bin/help.c:82 msgid "Unable to load help index." msgstr "" #: backend/network.c:69 #, c-format msgid "Unable to locate printer \"%s\"." msgstr "" #: backend/dnssd.c:752 backend/ipp.c:336 backend/lpd.c:181 #: backend/socket.c:155 msgid "Unable to locate printer." msgstr "" #: cgi-bin/admin.c:579 msgid "Unable to modify class" msgstr "" #: cgi-bin/admin.c:822 cgi-bin/admin.c:1192 msgid "Unable to modify printer" msgstr "" #: cgi-bin/ipp-var.c:414 cgi-bin/ipp-var.c:503 msgid "Unable to move job" msgstr "" #: cgi-bin/ipp-var.c:416 cgi-bin/ipp-var.c:505 msgid "Unable to move jobs" msgstr "" #: cgi-bin/admin.c:2690 cups/ppd.c:284 msgid "Unable to open PPD file" msgstr "" #: cgi-bin/admin.c:2161 msgid "Unable to open cupsd.conf file:" msgstr "" #: backend/usb-unix.c:127 msgid "Unable to open device file" msgstr "" #: scheduler/ipp.c:6315 #, c-format msgid "Unable to open document #%d in job #%d." msgstr "" #: cgi-bin/help.c:356 msgid "Unable to open help file." msgstr "" #: backend/ipp.c:377 backend/ipp.c:1620 backend/ipp.c:1833 backend/lpd.c:469 #: backend/socket.c:142 backend/usb.c:224 filter/gziptoany.c:65 #: filter/pstops.c:262 msgid "Unable to open print file" msgstr "" #: filter/rastertoepson.c:1012 filter/rastertohp.c:681 #: filter/rastertolabel.c:1133 msgid "Unable to open raster file" msgstr "" #: cgi-bin/ipp-var.c:777 msgid "Unable to print test page" msgstr "" #: backend/runloop.c:78 backend/runloop.c:307 backend/usb-darwin.c:636 #: backend/usb-darwin.c:680 backend/usb-libusb.c:413 backend/usb-libusb.c:448 msgid "Unable to read print data." msgstr "" #: tools/ippeveprinter.c:6613 tools/ippeveprinter.c:6631 #: tools/ippeveprinter.c:6650 tools/ippeveprinter.c:6664 #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" #: scheduler/ipp.c:8622 scheduler/ipp.c:9865 msgid "Unable to rename job document file." msgstr "" #: cups/dest.c:3265 msgid "Unable to resolve printer-uri." msgstr "" #: filter/pstops.c:527 msgid "Unable to see in file" msgstr "" #: cgi-bin/ipp-var.c:580 cgi-bin/ipp-var.c:600 msgid "Unable to send command to printer driver" msgstr "" #: backend/usb-darwin.c:758 backend/usb-libusb.c:524 msgid "Unable to send data to printer." msgstr "" #: cgi-bin/admin.c:3314 msgid "Unable to set options" msgstr "" #: cgi-bin/admin.c:2581 msgid "Unable to set server default" msgstr "" #: backend/ipp.c:3218 backend/ipp.c:3295 backend/ipp.c:3303 msgid "Unable to start backend process." msgstr "" #: cgi-bin/admin.c:1604 msgid "Unable to upload cupsd.conf file" msgstr "" #: backend/usb-darwin.c:2148 backend/usb-darwin.c:2172 msgid "Unable to use legacy USB class driver." msgstr "" #: backend/runloop.c:107 backend/runloop.c:362 msgid "Unable to write print data" msgstr "" #: filter/gziptoany.c:84 #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "" #: cups/http-support.c:1516 msgid "Unauthorized" msgstr "" #: cgi-bin/admin.c:3010 msgid "Units" msgstr "" #: cups/http-support.c:1556 cups/http-support.c:1640 cups/ppd.c:313 msgid "Unknown" msgstr "" #: filter/pstops.c:2182 #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "" #: tools/ippeveprinter.c:3848 #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #: backend/ipp.c:519 #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "" #: backend/lpd.c:327 #, c-format msgid "Unknown file order: \"%s\"." msgstr "" #: backend/lpd.c:298 #, c-format msgid "Unknown format character: \"%c\"." msgstr "" #: cups/hash.c:278 msgid "Unknown hash algorithm." msgstr "" #: cups/dest-options.c:1157 msgid "Unknown media size name." msgstr "" #: backend/ipp.c:583 #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "" #: filter/pstops.c:2165 #, c-format msgid "Unknown option \"%s\"." msgstr "" #: backend/lpd.c:313 #, c-format msgid "Unknown print mode: \"%s\"." msgstr "" #: scheduler/ipp.c:10806 #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "" #: scheduler/ipp.c:10789 #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "" #: cups/http.c:2266 msgid "Unknown request method." msgstr "" #: cups/http.c:2286 msgid "Unknown request version." msgstr "" #: cups/http-support.c:1633 msgid "Unknown scheme in URI" msgstr "" #: cups/http-addrlist.c:824 msgid "Unknown service name." msgstr "" #: backend/ipp.c:548 #, c-format msgid "Unknown version option value: \"%s\"." msgstr "" #: scheduler/ipp.c:11265 #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" #: scheduler/ipp.c:11295 #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" #: scheduler/ipp.c:7969 scheduler/ipp.c:10348 scheduler/ipp.c:11309 msgid "Unsupported 'job-hold-until' value." msgstr "" #: scheduler/ipp.c:11325 msgid "Unsupported 'job-name' value." msgstr "" #: scheduler/ipp.c:298 #, c-format msgid "Unsupported character set \"%s\"." msgstr "" #: scheduler/ipp.c:8429 scheduler/ipp.c:9677 #, c-format msgid "Unsupported compression \"%s\"." msgstr "" #: scheduler/ipp.c:8565 scheduler/ipp.c:9830 #, c-format msgid "Unsupported document-format \"%s\"." msgstr "" #: scheduler/ipp.c:9813 #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "" #: scheduler/ipp.c:1359 #, c-format msgid "Unsupported format \"%s\"." msgstr "" #: scheduler/ipp.c:1457 msgid "Unsupported margins." msgstr "" #: cups/pwg-media.c:541 msgid "Unsupported media value." msgstr "" #: filter/pstops.c:2447 #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "" #: filter/pstops.c:2481 #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" #: filter/pstops.c:2532 #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" #: filter/rastertopwg.c:132 filter/rastertopwg.c:168 filter/rastertopwg.c:176 #: filter/rastertopwg.c:185 msgid "Unsupported raster data." msgstr "" #: cups/snmp.c:1066 msgid "Unsupported value type" msgstr "" #: cups/http-support.c:1531 msgid "Upgrade Required" msgstr "" #: systemv/cupsaccept.c:242 #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #: backend/dnssd.c:192 backend/ipp.c:325 backend/lpd.c:168 #: backend/socket.c:119 backend/usb.c:170 filter/commandtops.c:57 #: filter/gziptoany.c:38 filter/pstops.c:223 monitor/bcp.c:48 #: monitor/tbcp.c:47 #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "" #: systemv/cancel.c:398 msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" #: systemv/cupsctl.c:231 msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" #: scheduler/main.c:2132 msgid "Usage: cupsd [options]" msgstr "" #: scheduler/cupsfilter.c:1475 msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" #: systemv/cupstestppd.c:3855 msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" #: tools/ippeveprinter.c:7663 msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" #: tools/ippfind.c:2759 msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" #: tools/ipptool.c:4306 msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" #: systemv/lp.c:748 msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" #: systemv/lpadmin.c:1615 msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" #: systemv/lpinfo.c:495 msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" #: systemv/lpmove.c:214 msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" #: systemv/lpoptions.c:534 msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" #: berkeley/lpq.c:641 msgid "Usage: lpq [options] [+interval]" msgstr "" #: berkeley/lpr.c:430 msgid "Usage: lpr [options] [file(s)]" msgstr "" #: berkeley/lprm.c:230 msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" #: systemv/lpstat.c:2043 msgid "Usage: lpstat [options]" msgstr "" #: ppdc/ppdc.cxx:424 msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "" #: ppdc/ppdhtml.cxx:171 msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "" #: ppdc/ppdi.cxx:117 msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" #: ppdc/ppdmerge.cxx:354 msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" #: ppdc/ppdpo.cxx:241 msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" #: backend/snmp.c:185 msgid "Usage: snmp [host-or-ip-address]" msgstr "" #: tools/ippeveprinter.c:631 #, c-format msgid "Using spool directory \"%s\"." msgstr "" #: cups/snmp.c:1018 msgid "Value uses indefinite length" msgstr "" #: cups/snmp.c:1003 msgid "VarBind uses indefinite length" msgstr "" #: cups/snmp.c:953 msgid "Version uses indefinite length" msgstr "" #: backend/ipp.c:2000 msgid "Waiting for job to complete." msgstr "" #: backend/usb-darwin.c:429 backend/usb-darwin.c:483 backend/usb-libusb.c:220 msgid "Waiting for printer to become available." msgstr "" #: backend/socket.c:417 msgid "Waiting for printer to finish." msgstr "" #: systemv/cupstestppd.c:3854 msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" #: cups/http-support.c:1552 msgid "Web Interface is Disabled" msgstr "" #: cups/ppd.c:1972 msgid "Yes" msgstr "" #: scheduler/client.c:1991 msgid "You cannot access this page." msgstr "" #: scheduler/client.c:1997 #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "" #: scheduler/client.c:1989 msgid "Your account does not have the necessary privileges." msgstr "" #: ppdc/sample.c:434 msgid "ZPL Label Printer" msgstr "" #: ppdc/sample.c:357 msgid "Zebra" msgstr "" #: cups/notify.c:89 msgid "aborted" msgstr "" #. TRANSLATORS: Accuracy Units #: locale/ipp-strings.c:2 msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters #: locale/ipp-strings.c:4 msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers #: locale/ipp-strings.c:6 msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers #: locale/ipp-strings.c:8 msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output #: locale/ipp-strings.c:10 msgid "baling" msgstr "" #. TRANSLATORS: Bale Using #: locale/ipp-strings.c:12 msgid "baling-type" msgstr "" #. TRANSLATORS: Band #: locale/ipp-strings.c:14 msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap #: locale/ipp-strings.c:16 msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap #: locale/ipp-strings.c:18 msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After #: locale/ipp-strings.c:20 msgid "baling-when" msgstr "" #. TRANSLATORS: Job #: locale/ipp-strings.c:22 msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets #: locale/ipp-strings.c:24 msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output #: locale/ipp-strings.c:26 msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge #: locale/ipp-strings.c:28 msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:30 msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:32 msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:34 msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:36 msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type #: locale/ipp-strings.c:38 msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive #: locale/ipp-strings.c:40 msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb #: locale/ipp-strings.c:42 msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat #: locale/ipp-strings.c:44 msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding #: locale/ipp-strings.c:46 msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect #: locale/ipp-strings.c:48 msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral #: locale/ipp-strings.c:50 msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape #: locale/ipp-strings.c:52 msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo #: locale/ipp-strings.c:54 msgid "binding-type.velo" msgstr "" #: cups/notify.c:86 msgid "canceled" msgstr "" #. TRANSLATORS: Chamber Humidity #: locale/ipp-strings.c:56 msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature #: locale/ipp-strings.c:58 msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost #: locale/ipp-strings.c:60 msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets #: locale/ipp-strings.c:62 msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To #: locale/ipp-strings.c:64 msgid "coating-sides" msgstr "" #. TRANSLATORS: Back #: locale/ipp-strings.c:66 msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back #: locale/ipp-strings.c:68 msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front #: locale/ipp-strings.c:70 msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating #: locale/ipp-strings.c:72 msgid "coating-type" msgstr "" #. TRANSLATORS: Archival #: locale/ipp-strings.c:74 msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy #: locale/ipp-strings.c:76 msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte #: locale/ipp-strings.c:78 msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss #: locale/ipp-strings.c:80 msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy #: locale/ipp-strings.c:82 msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss #: locale/ipp-strings.c:84 msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte #: locale/ipp-strings.c:86 msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss #: locale/ipp-strings.c:88 msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone #: locale/ipp-strings.c:90 msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent #: locale/ipp-strings.c:92 msgid "coating-type.translucent" msgstr "" #: cups/notify.c:92 msgid "completed" msgstr "" #. TRANSLATORS: Print Confirmation Sheet #: locale/ipp-strings.c:94 msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies #: locale/ipp-strings.c:96 msgid "copies" msgstr "" #. TRANSLATORS: Back Cover #: locale/ipp-strings.c:98 msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover #: locale/ipp-strings.c:100 msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info #: locale/ipp-strings.c:102 msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time #: locale/ipp-strings.c:104 msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name #: locale/ipp-strings.c:106 msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo #: locale/ipp-strings.c:108 msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message #: locale/ipp-strings.c:110 msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization #: locale/ipp-strings.c:112 msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject #: locale/ipp-strings.c:114 msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name #: locale/ipp-strings.c:116 msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover #: locale/ipp-strings.c:118 msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover #: locale/ipp-strings.c:120 msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only #: locale/ipp-strings.c:122 msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back #: locale/ipp-strings.c:124 msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only #: locale/ipp-strings.c:126 msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:128 msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output #: locale/ipp-strings.c:130 msgid "covering" msgstr "" #. TRANSLATORS: Add Cover #: locale/ipp-strings.c:132 msgid "covering-name" msgstr "" #. TRANSLATORS: Plain #: locale/ipp-strings.c:134 msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut #: locale/ipp-strings.c:136 msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed #: locale/ipp-strings.c:138 msgid "covering-name.pre-printed" msgstr "" #: scheduler/ipp.c:6187 msgid "cups-deviced failed to execute." msgstr "" #: scheduler/ipp.c:7073 scheduler/ipp.c:7312 msgid "cups-driverd failed to execute." msgstr "" #: systemv/cupsctl.c:170 #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #: systemv/cupsctl.c:183 #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "" #: systemv/cupsctl.c:226 #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "" #: systemv/cupsctl.c:228 #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "" #: scheduler/main.c:174 msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" #: scheduler/main.c:270 msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" #: scheduler/main.c:244 msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" #: scheduler/main.c:281 msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" #: scheduler/main.c:205 scheduler/main.c:212 msgid "cupsd: Unable to get current directory." msgstr "" #: scheduler/main.c:340 scheduler/main.c:350 msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" #: scheduler/main.c:321 #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "" #: scheduler/main.c:312 #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "" #: scheduler/cupsfilter.c:1257 #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "" #: scheduler/cupsfilter.c:1251 #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "" #: scheduler/cupsfilter.c:342 msgid "cupsfilter: Only one filename can be specified." msgstr "" #: scheduler/cupsfilter.c:1299 #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "" #: systemv/cupstestppd.c:238 msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "" #: systemv/cupstestppd.c:254 msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "" #. TRANSLATORS: Detailed Status Message #: locale/ipp-strings.c:140 msgid "detailed-status-message" msgstr "" #: systemv/lpstat.c:1253 systemv/lpstat.c:1256 systemv/lpstat.c:1259 #, c-format msgid "device for %s/%s: %s" msgstr "" #: systemv/lpstat.c:1239 systemv/lpstat.c:1242 systemv/lpstat.c:1245 #, c-format msgid "device for %s: %s" msgstr "" #. TRANSLATORS: Copies #: locale/ipp-strings.c:142 msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes #: locale/ipp-strings.c:144 msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:146 msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:148 msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description #: locale/ipp-strings.c:150 msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template #: locale/ipp-strings.c:152 msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:154 msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope #: locale/ipp-strings.c:156 msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:158 msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:160 msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:162 msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner #: locale/ipp-strings.c:164 msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State #: locale/ipp-strings.c:166 msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State #: locale/ipp-strings.c:168 msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System #: locale/ipp-strings.c:170 msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device #: locale/ipp-strings.c:172 msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator #: locale/ipp-strings.c:174 msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User #: locale/ipp-strings.c:176 msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully #: locale/ipp-strings.c:178 msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors #: locale/ipp-strings.c:180 msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings #: locale/ipp-strings.c:182 msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error #: locale/ipp-strings.c:184 msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient #: locale/ipp-strings.c:186 msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify #: locale/ipp-strings.c:188 msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported #: locale/ipp-strings.c:190 msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait #: locale/ipp-strings.c:192 msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error #: locale/ipp-strings.c:194 msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable #: locale/ipp-strings.c:196 msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error #: locale/ipp-strings.c:198 msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error #: locale/ipp-strings.c:200 msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error #: locale/ipp-strings.c:202 msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error #: locale/ipp-strings.c:204 msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error #: locale/ipp-strings.c:206 msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected #: locale/ipp-strings.c:208 msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming #: locale/ipp-strings.c:210 msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting #: locale/ipp-strings.c:212 msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:214 msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing #: locale/ipp-strings.c:216 msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing #: locale/ipp-strings.c:218 msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point #: locale/ipp-strings.c:220 msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued #: locale/ipp-strings.c:222 msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker #: locale/ipp-strings.c:224 msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device #: locale/ipp-strings.c:226 msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready #: locale/ipp-strings.c:228 msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported #: locale/ipp-strings.c:230 msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted #: locale/ipp-strings.c:232 msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming #: locale/ipp-strings.c:234 msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression #: locale/ipp-strings.c:236 msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format #: locale/ipp-strings.c:238 msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected #: locale/ipp-strings.c:240 msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending #: locale/ipp-strings.c:242 msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing #: locale/ipp-strings.c:244 msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped #: locale/ipp-strings.c:246 msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled #: locale/ipp-strings.c:248 msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted #: locale/ipp-strings.c:250 msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed #: locale/ipp-strings.c:252 msgid "document-state.9" msgstr "" #: cups/snmp.c:990 msgid "error-index uses indefinite length" msgstr "" #: cups/snmp.c:982 msgid "error-status uses indefinite length" msgstr "" #: tools/ippfind.c:2808 msgid "" "expression --and expression\n" " Logical AND" msgstr "" #: tools/ippfind.c:2810 msgid "" "expression --or expression\n" " Logical OR" msgstr "" #: tools/ippfind.c:2807 msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation #: locale/ipp-strings.c:254 msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First #: locale/ipp-strings.c:256 msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First #: locale/ipp-strings.c:258 msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code #: locale/ipp-strings.c:260 msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template #: locale/ipp-strings.c:262 msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale #: locale/ipp-strings.c:264 msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind #: locale/ipp-strings.c:266 msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom #: locale/ipp-strings.c:268 msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left #: locale/ipp-strings.c:270 msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right #: locale/ipp-strings.c:272 msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top #: locale/ipp-strings.c:274 msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker #: locale/ipp-strings.c:276 msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat #: locale/ipp-strings.c:278 msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover #: locale/ipp-strings.c:280 msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch #: locale/ipp-strings.c:282 msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom #: locale/ipp-strings.c:284 msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left #: locale/ipp-strings.c:286 msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right #: locale/ipp-strings.c:288 msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top #: locale/ipp-strings.c:290 msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold #: locale/ipp-strings.c:292 msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold #: locale/ipp-strings.c:294 msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold #: locale/ipp-strings.c:296 msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold #: locale/ipp-strings.c:298 msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold #: locale/ipp-strings.c:300 msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold #: locale/ipp-strings.c:302 msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold #: locale/ipp-strings.c:304 msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold #: locale/ipp-strings.c:306 msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold #: locale/ipp-strings.c:308 msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold #: locale/ipp-strings.c:310 msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold #: locale/ipp-strings.c:312 msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold #: locale/ipp-strings.c:314 msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold #: locale/ipp-strings.c:316 msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 #: locale/ipp-strings.c:318 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 #: locale/ipp-strings.c:320 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 #: locale/ipp-strings.c:322 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 #: locale/ipp-strings.c:324 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 #: locale/ipp-strings.c:326 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 #: locale/ipp-strings.c:328 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 #: locale/ipp-strings.c:330 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 #: locale/ipp-strings.c:332 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 #: locale/ipp-strings.c:334 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 #: locale/ipp-strings.c:336 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 #: locale/ipp-strings.c:338 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 #: locale/ipp-strings.c:340 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 #: locale/ipp-strings.c:342 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 #: locale/ipp-strings.c:344 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 #: locale/ipp-strings.c:346 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 #: locale/ipp-strings.c:348 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 #: locale/ipp-strings.c:350 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 #: locale/ipp-strings.c:352 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 #: locale/ipp-strings.c:354 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 #: locale/ipp-strings.c:356 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 #: locale/ipp-strings.c:358 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 #: locale/ipp-strings.c:360 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 #: locale/ipp-strings.c:362 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 #: locale/ipp-strings.c:364 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 #: locale/ipp-strings.c:366 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 #: locale/ipp-strings.c:368 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 #: locale/ipp-strings.c:370 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 #: locale/ipp-strings.c:372 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 #: locale/ipp-strings.c:374 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 #: locale/ipp-strings.c:376 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 #: locale/ipp-strings.c:378 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 #: locale/ipp-strings.c:380 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 #: locale/ipp-strings.c:382 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 #: locale/ipp-strings.c:384 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 #: locale/ipp-strings.c:386 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 #: locale/ipp-strings.c:388 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 #: locale/ipp-strings.c:390 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 #: locale/ipp-strings.c:392 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 #: locale/ipp-strings.c:394 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 #: locale/ipp-strings.c:396 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 #: locale/ipp-strings.c:398 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 #: locale/ipp-strings.c:400 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 #: locale/ipp-strings.c:402 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 #: locale/ipp-strings.c:404 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 #: locale/ipp-strings.c:406 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 #: locale/ipp-strings.c:408 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 #: locale/ipp-strings.c:410 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 #: locale/ipp-strings.c:412 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 #: locale/ipp-strings.c:414 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 #: locale/ipp-strings.c:416 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 #: locale/ipp-strings.c:418 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 #: locale/ipp-strings.c:420 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 #: locale/ipp-strings.c:422 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 #: locale/ipp-strings.c:424 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 #: locale/ipp-strings.c:426 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 #: locale/ipp-strings.c:428 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 #: locale/ipp-strings.c:430 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 #: locale/ipp-strings.c:432 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 #: locale/ipp-strings.c:434 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 #: locale/ipp-strings.c:436 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 #: locale/ipp-strings.c:438 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 #: locale/ipp-strings.c:440 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 #: locale/ipp-strings.c:442 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 #: locale/ipp-strings.c:444 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 #: locale/ipp-strings.c:446 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 #: locale/ipp-strings.c:448 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 #: locale/ipp-strings.c:450 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 #: locale/ipp-strings.c:452 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 #: locale/ipp-strings.c:454 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 #: locale/ipp-strings.c:456 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 #: locale/ipp-strings.c:458 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 #: locale/ipp-strings.c:460 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 #: locale/ipp-strings.c:462 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 #: locale/ipp-strings.c:464 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 #: locale/ipp-strings.c:466 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 #: locale/ipp-strings.c:468 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 #: locale/ipp-strings.c:470 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 #: locale/ipp-strings.c:472 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 #: locale/ipp-strings.c:474 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 #: locale/ipp-strings.c:476 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 #: locale/ipp-strings.c:478 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 #: locale/ipp-strings.c:480 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 #: locale/ipp-strings.c:482 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 #: locale/ipp-strings.c:484 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 #: locale/ipp-strings.c:486 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 #: locale/ipp-strings.c:488 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 #: locale/ipp-strings.c:490 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 #: locale/ipp-strings.c:492 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 #: locale/ipp-strings.c:494 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset #: locale/ipp-strings.c:496 msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate #: locale/ipp-strings.c:498 msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch #: locale/ipp-strings.c:500 msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left #: locale/ipp-strings.c:502 msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right #: locale/ipp-strings.c:504 msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom #: locale/ipp-strings.c:506 msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left #: locale/ipp-strings.c:508 msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right #: locale/ipp-strings.c:510 msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top #: locale/ipp-strings.c:512 msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom #: locale/ipp-strings.c:514 msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left #: locale/ipp-strings.c:516 msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right #: locale/ipp-strings.c:518 msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top #: locale/ipp-strings.c:520 msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom #: locale/ipp-strings.c:522 msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left #: locale/ipp-strings.c:524 msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right #: locale/ipp-strings.c:526 msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top #: locale/ipp-strings.c:528 msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left #: locale/ipp-strings.c:530 msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right #: locale/ipp-strings.c:532 msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom #: locale/ipp-strings.c:534 msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left #: locale/ipp-strings.c:536 msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right #: locale/ipp-strings.c:538 msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top #: locale/ipp-strings.c:540 msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch #: locale/ipp-strings.c:542 msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple #: locale/ipp-strings.c:544 msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left #: locale/ipp-strings.c:546 msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right #: locale/ipp-strings.c:548 msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom #: locale/ipp-strings.c:550 msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left #: locale/ipp-strings.c:552 msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right #: locale/ipp-strings.c:554 msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top #: locale/ipp-strings.c:556 msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left #: locale/ipp-strings.c:558 msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right #: locale/ipp-strings.c:560 msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom #: locale/ipp-strings.c:562 msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left #: locale/ipp-strings.c:564 msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right #: locale/ipp-strings.c:566 msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top #: locale/ipp-strings.c:568 msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim #: locale/ipp-strings.c:570 msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set #: locale/ipp-strings.c:572 msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document #: locale/ipp-strings.c:574 msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job #: locale/ipp-strings.c:576 msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page #: locale/ipp-strings.c:578 msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings #: locale/ipp-strings.c:580 msgid "finishings" msgstr "" #. TRANSLATORS: Finishings #: locale/ipp-strings.c:582 msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold #: locale/ipp-strings.c:584 msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold #: locale/ipp-strings.c:586 msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold #: locale/ipp-strings.c:588 msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim #: locale/ipp-strings.c:590 msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale #: locale/ipp-strings.c:592 msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker #: locale/ipp-strings.c:594 msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset #: locale/ipp-strings.c:596 msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat #: locale/ipp-strings.c:598 msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate #: locale/ipp-strings.c:600 msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left #: locale/ipp-strings.c:602 msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left #: locale/ipp-strings.c:604 msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right #: locale/ipp-strings.c:606 msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right #: locale/ipp-strings.c:608 msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left #: locale/ipp-strings.c:610 msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top #: locale/ipp-strings.c:612 msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right #: locale/ipp-strings.c:614 msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom #: locale/ipp-strings.c:616 msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left #: locale/ipp-strings.c:618 msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top #: locale/ipp-strings.c:620 msgid "finishings.29" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:622 msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right #: locale/ipp-strings.c:624 msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom #: locale/ipp-strings.c:626 msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left #: locale/ipp-strings.c:628 msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top #: locale/ipp-strings.c:630 msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right #: locale/ipp-strings.c:632 msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom #: locale/ipp-strings.c:634 msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple #: locale/ipp-strings.c:636 msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch #: locale/ipp-strings.c:638 msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left #: locale/ipp-strings.c:640 msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top #: locale/ipp-strings.c:642 msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right #: locale/ipp-strings.c:644 msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom #: locale/ipp-strings.c:646 msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover #: locale/ipp-strings.c:648 msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages #: locale/ipp-strings.c:650 msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents #: locale/ipp-strings.c:652 msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies #: locale/ipp-strings.c:654 msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job #: locale/ipp-strings.c:656 msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind #: locale/ipp-strings.c:658 msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left #: locale/ipp-strings.c:660 msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left #: locale/ipp-strings.c:662 msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right #: locale/ipp-strings.c:664 msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right #: locale/ipp-strings.c:666 msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left #: locale/ipp-strings.c:668 msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top #: locale/ipp-strings.c:670 msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right #: locale/ipp-strings.c:672 msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom #: locale/ipp-strings.c:674 msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left #: locale/ipp-strings.c:676 msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top #: locale/ipp-strings.c:678 msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch #: locale/ipp-strings.c:680 msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right #: locale/ipp-strings.c:682 msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom #: locale/ipp-strings.c:684 msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left #: locale/ipp-strings.c:686 msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top #: locale/ipp-strings.c:688 msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right #: locale/ipp-strings.c:690 msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom #: locale/ipp-strings.c:692 msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left #: locale/ipp-strings.c:694 msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top #: locale/ipp-strings.c:696 msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right #: locale/ipp-strings.c:698 msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom #: locale/ipp-strings.c:700 msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch #: locale/ipp-strings.c:702 msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold #: locale/ipp-strings.c:704 msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold #: locale/ipp-strings.c:706 msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold #: locale/ipp-strings.c:708 msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold #: locale/ipp-strings.c:710 msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold #: locale/ipp-strings.c:712 msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold #: locale/ipp-strings.c:714 msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold #: locale/ipp-strings.c:716 msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold #: locale/ipp-strings.c:718 msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold #: locale/ipp-strings.c:720 msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold #: locale/ipp-strings.c:722 msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold #: locale/ipp-strings.c:724 msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction #: locale/ipp-strings.c:726 msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward #: locale/ipp-strings.c:728 msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward #: locale/ipp-strings.c:730 msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position #: locale/ipp-strings.c:732 msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge #: locale/ipp-strings.c:734 msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:736 msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:738 msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:740 msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:742 msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name #: locale/ipp-strings.c:744 msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size #: locale/ipp-strings.c:746 msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side #: locale/ipp-strings.c:748 msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name #: locale/ipp-strings.c:750 msgid "from-name" msgstr "" #: cups/notify.c:77 msgid "held" msgstr "" #: berkeley/lpc.c:195 msgid "help\t\tGet help on commands." msgstr "" #: cups/notify.c:118 msgid "idle" msgstr "" #. TRANSLATORS: Imposition Template #: locale/ipp-strings.c:752 msgid "imposition-template" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:754 msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature #: locale/ipp-strings.c:756 msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number #: locale/ipp-strings.c:758 msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count #: locale/ipp-strings.c:760 msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet #: locale/ipp-strings.c:762 msgid "insert-sheet" msgstr "" #: tools/ippeveprinter.c:4702 #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #: tools/ippfind.c:2478 #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" #: tools/ippfind.c:295 msgid "ippfind: Cannot use --and after --or." msgstr "" #: tools/ippfind.c:580 #, c-format msgid "ippfind: Expected key name after %s." msgstr "" #: tools/ippfind.c:530 tools/ippfind.c:725 #, c-format msgid "ippfind: Expected port range after %s." msgstr "" #: tools/ippfind.c:328 #, c-format msgid "ippfind: Expected program after %s." msgstr "" #: tools/ippfind.c:345 #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" #: tools/ippfind.c:1981 msgid "ippfind: Missing close brace in substitution." msgstr "" #: tools/ippfind.c:1044 msgid "ippfind: Missing close parenthesis." msgstr "" #: tools/ippfind.c:302 msgid "ippfind: Missing expression before \"--and\"." msgstr "" #: tools/ippfind.c:427 msgid "ippfind: Missing expression before \"--or\"." msgstr "" #: tools/ippfind.c:862 #, c-format msgid "ippfind: Missing key name after %s." msgstr "" #: tools/ippfind.c:396 tools/ippfind.c:712 #, c-format msgid "ippfind: Missing name after %s." msgstr "" #: tools/ippfind.c:1015 msgid "ippfind: Missing open parenthesis." msgstr "" #: tools/ippfind.c:892 #, c-format msgid "ippfind: Missing program after %s." msgstr "" #: tools/ippfind.c:314 tools/ippfind.c:368 tools/ippfind.c:409 #: tools/ippfind.c:515 tools/ippfind.c:597 tools/ippfind.c:612 #: tools/ippfind.c:779 tools/ippfind.c:794 tools/ippfind.c:817 #: tools/ippfind.c:877 #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" #: tools/ippfind.c:910 #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" #: tools/ippfind.c:1928 tools/ippfind.c:1953 msgid "ippfind: Out of memory." msgstr "" #: tools/ippfind.c:988 msgid "ippfind: Too many parenthesis." msgstr "" #: tools/ippfind.c:1287 tools/ippfind.c:1415 tools/ippfind.c:2570 #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" #: tools/ippfind.c:2051 tools/ippfind.c:2078 #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" #: tools/ippfind.c:1134 tools/ippfind.c:1142 tools/ippfind.c:1153 #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" #: tools/ippfind.c:2010 #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" #: tools/ipptool.c:566 tools/ipptool.c:588 msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"." msgstr "" #: tools/ipptool.c:351 tools/ipptool.c:422 msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #: tools/ipptool.c:634 #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" #: tools/ipptool.c:559 msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" #: tools/ipptool.c:623 msgid "ipptool: May only specify a single URI." msgstr "" #: tools/ipptool.c:580 msgid "ipptool: Missing count for \"-n\"." msgstr "" #: tools/ipptool.c:268 msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" #: tools/ipptool.c:456 msgid "ipptool: Missing filename for \"-f\"." msgstr "" #: tools/ipptool.c:437 msgid "ipptool: Missing name=value for \"-d\"." msgstr "" #: tools/ipptool.c:551 msgid "ipptool: Missing seconds for \"-i\"." msgstr "" #: tools/ipptool.c:649 msgid "ipptool: URI required before test file." msgstr "" #. TRANSLATORS: Job Account ID #: locale/ipp-strings.c:764 msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type #: locale/ipp-strings.c:766 msgid "job-account-type" msgstr "" #. TRANSLATORS: General #: locale/ipp-strings.c:768 msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group #: locale/ipp-strings.c:770 msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:772 msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin #: locale/ipp-strings.c:774 msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets #: locale/ipp-strings.c:776 msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets #: locale/ipp-strings.c:778 msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:780 msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:782 msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID #: locale/ipp-strings.c:784 msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After #: locale/ipp-strings.c:786 msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies #: locale/ipp-strings.c:788 msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover #: locale/ipp-strings.c:790 msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover #: locale/ipp-strings.c:792 msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until #: locale/ipp-strings.c:794 msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until #: locale/ipp-strings.c:796 msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime #: locale/ipp-strings.c:798 msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening #: locale/ipp-strings.c:800 msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released #: locale/ipp-strings.c:802 msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night #: locale/ipp-strings.c:804 msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay #: locale/ipp-strings.c:806 msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift #: locale/ipp-strings.c:808 msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift #: locale/ipp-strings.c:810 msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend #: locale/ipp-strings.c:812 msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error #: locale/ipp-strings.c:814 msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job #: locale/ipp-strings.c:816 msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job #: locale/ipp-strings.c:818 msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job #: locale/ipp-strings.c:820 msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job #: locale/ipp-strings.c:822 msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet #: locale/ipp-strings.c:824 msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet #: locale/ipp-strings.c:826 msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:828 msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:830 msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet #: locale/ipp-strings.c:832 msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always #: locale/ipp-strings.c:834 msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error #: locale/ipp-strings.c:836 msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings #: locale/ipp-strings.c:838 msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until #: locale/ipp-strings.c:840 msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until #: locale/ipp-strings.c:842 msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime #: locale/ipp-strings.c:844 msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening #: locale/ipp-strings.c:846 msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released #: locale/ipp-strings.c:848 msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night #: locale/ipp-strings.c:850 msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold #: locale/ipp-strings.c:852 msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift #: locale/ipp-strings.c:854 msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift #: locale/ipp-strings.c:856 msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend #: locale/ipp-strings.c:858 msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes #: locale/ipp-strings.c:860 msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title #: locale/ipp-strings.c:862 msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages #: locale/ipp-strings.c:864 msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages #: locale/ipp-strings.c:866 msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number #: locale/ipp-strings.c:868 msgid "job-phone-number" msgstr "" #: scheduler/ipp.c:8095 msgid "job-printer-uri attribute missing." msgstr "" #. TRANSLATORS: Job Priority #: locale/ipp-strings.c:870 msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes #: locale/ipp-strings.c:872 msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:874 msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:876 msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description #: locale/ipp-strings.c:878 msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template #: locale/ipp-strings.c:880 msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:882 msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope #: locale/ipp-strings.c:884 msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:886 msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:888 msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:890 msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner #: locale/ipp-strings.c:892 msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name #: locale/ipp-strings.c:894 msgid "job-recipient-name" msgstr "" #. 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:912 msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message #: locale/ipp-strings.c:914 msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page #: locale/ipp-strings.c:916 msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page #: locale/ipp-strings.c:918 msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document #: locale/ipp-strings.c:920 msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets #: locale/ipp-strings.c:922 msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet #: locale/ipp-strings.c:924 msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet #: locale/ipp-strings.c:926 msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:928 msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:930 msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State #: locale/ipp-strings.c:932 msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message #: locale/ipp-strings.c:934 msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State #: locale/ipp-strings.c:936 msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping #: locale/ipp-strings.c:938 msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed #: locale/ipp-strings.c:940 msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed #: locale/ipp-strings.c:942 msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed #: locale/ipp-strings.c:944 msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached #: locale/ipp-strings.c:946 msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error #: locale/ipp-strings.c:948 msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes #: locale/ipp-strings.c:950 msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination #: locale/ipp-strings.c:952 msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination #: locale/ipp-strings.c:954 msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed #: locale/ipp-strings.c:956 msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify #: 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:960 msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error #: locale/ipp-strings.c:962 msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error #: locale/ipp-strings.c:964 msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error #: locale/ipp-strings.c:966 msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error #: locale/ipp-strings.c:968 msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error #: locale/ipp-strings.c:970 msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error #: locale/ipp-strings.c:972 msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected #: locale/ipp-strings.c:974 msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer #: locale/ipp-strings.c:976 msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator #: locale/ipp-strings.c:978 msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user #: locale/ipp-strings.c:980 msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: #: locale/ipp-strings.c:982 msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors #: locale/ipp-strings.c:984 msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings #: locale/ipp-strings.c:986 msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. 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:990 msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait #: locale/ipp-strings.c:992 msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable #: locale/ipp-strings.c:994 msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review #: locale/ipp-strings.c:996 msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held #: locale/ipp-strings.c:998 msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming #: locale/ipp-strings.c:1000 msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting #: locale/ipp-strings.c:1002 msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing #: locale/ipp-strings.c:1004 msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait #: locale/ipp-strings.c:1006 msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully #: locale/ipp-strings.c:1008 msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors #: locale/ipp-strings.c:1010 msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings #: locale/ipp-strings.c:1012 msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing #: locale/ipp-strings.c:1014 msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print #: locale/ipp-strings.c:1016 msgid "job-state-reasons.job-queued" msgstr "" #. 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:1020 msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable #: locale/ipp-strings.c:1022 msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming #: locale/ipp-strings.c:1024 msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully #: locale/ipp-strings.c:1026 msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors #: locale/ipp-strings.c:1028 msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings #: locale/ipp-strings.c:1030 msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving #: locale/ipp-strings.c:1032 msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling #: locale/ipp-strings.c:1034 msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming #: locale/ipp-strings.c:1036 msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended #: locale/ipp-strings.c:1038 msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator #: locale/ipp-strings.c:1040 msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System #: locale/ipp-strings.c:1042 msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User #: locale/ipp-strings.c:1044 msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending #: locale/ipp-strings.c:1046 msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring #: locale/ipp-strings.c:1048 msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming #: locale/ipp-strings.c:1050 msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:1052 msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline #: locale/ipp-strings.c:1054 msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped #: locale/ipp-strings.c:1056 msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping #: locale/ipp-strings.c:1058 msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready #: locale/ipp-strings.c:1060 msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready #: locale/ipp-strings.c:1062 msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported #: locale/ipp-strings.c:1064 msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline #: locale/ipp-strings.c:1066 msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted #: locale/ipp-strings.c:1068 msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values #: locale/ipp-strings.c:1070 msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression #: locale/ipp-strings.c:1072 msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format #: locale/ipp-strings.c:1074 msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action #: locale/ipp-strings.c:1076 msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected #: locale/ipp-strings.c:1078 msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending #: locale/ipp-strings.c:1080 msgid "job-state.3" msgstr "" #. TRANSLATORS: Held #: locale/ipp-strings.c:1082 msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing #: locale/ipp-strings.c:1084 msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped #: locale/ipp-strings.c:1086 msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled #: locale/ipp-strings.c:1088 msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted #: locale/ipp-strings.c:1090 msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed #: locale/ipp-strings.c:1092 msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages #: locale/ipp-strings.c:1094 msgid "laminating" msgstr "" #. TRANSLATORS: Laminate #: locale/ipp-strings.c:1096 msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only #: locale/ipp-strings.c:1098 msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back #: locale/ipp-strings.c:1100 msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only #: locale/ipp-strings.c:1102 msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination #: locale/ipp-strings.c:1104 msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival #: locale/ipp-strings.c:1106 msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy #: locale/ipp-strings.c:1108 msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss #: locale/ipp-strings.c:1110 msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte #: locale/ipp-strings.c:1112 msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss #: locale/ipp-strings.c:1114 msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent #: locale/ipp-strings.c:1116 msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo #: locale/ipp-strings.c:1118 msgid "logo" msgstr "" #: systemv/lpadmin.c:123 systemv/lpadmin.c:378 msgid "lpadmin: Class name can only contain printable characters." msgstr "" #: systemv/lpadmin.c:213 #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" #: systemv/lpadmin.c:459 msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" #: systemv/lpadmin.c:369 msgid "lpadmin: Expected class after \"-r\" option." msgstr "" #: systemv/lpadmin.c:113 msgid "lpadmin: Expected class name after \"-c\" option." msgstr "" #: systemv/lpadmin.c:553 msgid "lpadmin: Expected description after \"-D\" option." msgstr "" #: systemv/lpadmin.c:489 msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "" #: systemv/lpadmin.c:566 msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "" #: systemv/lpadmin.c:192 msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "" #: systemv/lpadmin.c:585 msgid "lpadmin: Expected location after \"-L\" option." msgstr "" #: systemv/lpadmin.c:282 msgid "lpadmin: Expected model after \"-m\" option." msgstr "" #: systemv/lpadmin.c:417 msgid "lpadmin: Expected name after \"-R\" option." msgstr "" #: systemv/lpadmin.c:302 msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "" #: systemv/lpadmin.c:322 msgid "lpadmin: Expected printer after \"-p\" option." msgstr "" #: systemv/lpadmin.c:155 msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "" #: systemv/lpadmin.c:522 msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "" #: systemv/lpadmin.c:958 msgid "lpadmin: No member names were seen." msgstr "" #: systemv/lpadmin.c:752 #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "" #: systemv/lpadmin.c:972 #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "" #: systemv/lpadmin.c:637 msgid "lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS." msgstr "" #: systemv/lpadmin.c:164 systemv/lpadmin.c:331 systemv/lpadmin.c:531 msgid "lpadmin: Printer name can only contain printable characters." msgstr "" #: systemv/lpadmin.c:618 msgid "lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS." msgstr "" #: systemv/lpadmin.c:616 msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" #: systemv/lpadmin.c:231 msgid "lpadmin: System V interface scripts are no longer supported for security reasons." msgstr "" #: systemv/lpadmin.c:97 msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" #: systemv/lpadmin.c:89 systemv/lpadmin.c:139 systemv/lpadmin.c:261 #: systemv/lpadmin.c:344 systemv/lpadmin.c:393 systemv/lpadmin.c:505 #: systemv/lpadmin.c:656 #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "" #: systemv/lpadmin.c:1442 msgid "lpadmin: Unable to create temporary file" msgstr "" #: systemv/lpadmin.c:401 msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" #: systemv/lpadmin.c:1453 #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #: systemv/lpadmin.c:1433 #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" #: systemv/lpadmin.c:353 msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" #: systemv/lpadmin.c:645 msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" #: systemv/lpadmin.c:472 #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "" #: systemv/lpadmin.c:601 #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "" #: systemv/lpadmin.c:594 #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "" #: systemv/lpadmin.c:622 msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" #: systemv/lpadmin.c:570 msgid "lpadmin: Warning - content type list ignored." msgstr "" #: berkeley/lpc.c:62 berkeley/lpc.c:90 berkeley/lpc.c:126 msgid "lpc> " msgstr "" #: systemv/lpinfo.c:80 msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" #: systemv/lpinfo.c:129 msgid "lpinfo: Expected language after \"--language\"." msgstr "" #: systemv/lpinfo.c:144 msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" #: systemv/lpinfo.c:159 msgid "lpinfo: Expected product string after \"--product\"." msgstr "" #: systemv/lpinfo.c:96 msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" #: systemv/lpinfo.c:114 msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" #: systemv/lpinfo.c:174 msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" #: systemv/lpmove.c:129 #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "" #: systemv/lpmove.c:117 #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "" #: systemv/lpoptions.c:149 systemv/lpoptions.c:167 systemv/lpoptions.c:246 msgid "lpoptions: No printers." msgstr "" #: systemv/lpoptions.c:223 #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "" #: systemv/lpoptions.c:492 systemv/lpoptions.c:501 #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "" #: systemv/lpoptions.c:511 #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "" #: systemv/lpoptions.c:95 msgid "lpoptions: Unknown printer or class." msgstr "" #: systemv/lpstat.c:1099 #, c-format msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"." msgstr "" #. TRANSLATORS: Amount of Material #: locale/ipp-strings.c:1120 msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units #: locale/ipp-strings.c:1122 msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams #: locale/ipp-strings.c:1124 msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms #: locale/ipp-strings.c:1126 msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters #: locale/ipp-strings.c:1128 msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters #: locale/ipp-strings.c:1130 msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters #: locale/ipp-strings.c:1132 msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters #: locale/ipp-strings.c:1134 msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color #: locale/ipp-strings.c:1136 msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter #: locale/ipp-strings.c:1138 msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance #: locale/ipp-strings.c:1140 msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density #: locale/ipp-strings.c:1142 msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name #: locale/ipp-strings.c:1144 msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter #: locale/ipp-strings.c:1146 msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For #: locale/ipp-strings.c:1148 msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything #: locale/ipp-strings.c:1150 msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base #: locale/ipp-strings.c:1152 msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill #: locale/ipp-strings.c:1154 msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell #: locale/ipp-strings.c:1156 msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports #: locale/ipp-strings.c:1158 msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate #: locale/ipp-strings.c:1160 msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units #: locale/ipp-strings.c:1162 msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second #: locale/ipp-strings.c:1164 msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second #: locale/ipp-strings.c:1166 msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second #: locale/ipp-strings.c:1168 msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction #: locale/ipp-strings.c:1170 msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness #: locale/ipp-strings.c:1172 msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature #: locale/ipp-strings.c:1174 msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type #: locale/ipp-strings.c:1176 msgid "material-type" msgstr "" #. TRANSLATORS: ABS #: locale/ipp-strings.c:1178 msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS #: locale/ipp-strings.c:1180 msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS #: locale/ipp-strings.c:1182 msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate #: locale/ipp-strings.c:1184 msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold #: locale/ipp-strings.c:1186 msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon #: locale/ipp-strings.c:1188 msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet #: locale/ipp-strings.c:1190 msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer #: locale/ipp-strings.c:1192 msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA #: locale/ipp-strings.c:1194 msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA #: locale/ipp-strings.c:1196 msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable #: locale/ipp-strings.c:1198 msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA #: locale/ipp-strings.c:1200 msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA #: locale/ipp-strings.c:1202 msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA #: locale/ipp-strings.c:1204 msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA #: locale/ipp-strings.c:1206 msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA #: locale/ipp-strings.c:1208 msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate #: locale/ipp-strings.c:1210 msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA #: locale/ipp-strings.c:1212 msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver #: locale/ipp-strings.c:1214 msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium #: locale/ipp-strings.c:1216 msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax #: locale/ipp-strings.c:1218 msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials #: locale/ipp-strings.c:1220 msgid "materials-col" msgstr "" #. TRANSLATORS: Media #: locale/ipp-strings.c:1222 msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media #: locale/ipp-strings.c:1224 msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy #: locale/ipp-strings.c:1226 msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss #: locale/ipp-strings.c:1228 msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte #: locale/ipp-strings.c:1230 msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:1232 msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin #: locale/ipp-strings.c:1234 msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss #: locale/ipp-strings.c:1236 msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin #: locale/ipp-strings.c:1238 msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media #: locale/ipp-strings.c:1240 msgid "media-col" msgstr "" #. TRANSLATORS: Media Color #: locale/ipp-strings.c:1242 msgid "media-color" msgstr "" #. TRANSLATORS: Black #: locale/ipp-strings.c:1244 msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue #: locale/ipp-strings.c:1246 msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown #: locale/ipp-strings.c:1248 msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff #: locale/ipp-strings.c:1250 msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black #: locale/ipp-strings.c:1252 msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue #: locale/ipp-strings.c:1254 msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown #: locale/ipp-strings.c:1256 msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff #: locale/ipp-strings.c:1258 msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan #: locale/ipp-strings.c:1260 msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold #: locale/ipp-strings.c:1262 msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod #: locale/ipp-strings.c:1264 msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray #: locale/ipp-strings.c:1266 msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green #: locale/ipp-strings.c:1268 msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory #: locale/ipp-strings.c:1270 msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta #: locale/ipp-strings.c:1272 msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color #: locale/ipp-strings.c:1274 msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard #: locale/ipp-strings.c:1276 msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange #: locale/ipp-strings.c:1278 msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink #: locale/ipp-strings.c:1280 msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red #: locale/ipp-strings.c:1282 msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver #: locale/ipp-strings.c:1284 msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise #: locale/ipp-strings.c:1286 msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet #: locale/ipp-strings.c:1288 msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White #: locale/ipp-strings.c:1290 msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow #: locale/ipp-strings.c:1292 msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan #: locale/ipp-strings.c:1294 msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue #: locale/ipp-strings.c:1296 msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown #: locale/ipp-strings.c:1298 msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff #: locale/ipp-strings.c:1300 msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan #: locale/ipp-strings.c:1302 msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold #: locale/ipp-strings.c:1304 msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod #: locale/ipp-strings.c:1306 msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray #: locale/ipp-strings.c:1308 msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green #: locale/ipp-strings.c:1310 msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory #: locale/ipp-strings.c:1312 msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta #: locale/ipp-strings.c:1314 msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard #: locale/ipp-strings.c:1316 msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange #: locale/ipp-strings.c:1318 msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink #: locale/ipp-strings.c:1320 msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red #: locale/ipp-strings.c:1322 msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver #: locale/ipp-strings.c:1324 msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise #: locale/ipp-strings.c:1326 msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet #: locale/ipp-strings.c:1328 msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow #: locale/ipp-strings.c:1330 msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold #: locale/ipp-strings.c:1332 msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod #: locale/ipp-strings.c:1334 msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray #: locale/ipp-strings.c:1336 msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green #: locale/ipp-strings.c:1338 msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory #: locale/ipp-strings.c:1340 msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black #: locale/ipp-strings.c:1342 msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue #: locale/ipp-strings.c:1344 msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown #: locale/ipp-strings.c:1346 msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff #: locale/ipp-strings.c:1348 msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan #: locale/ipp-strings.c:1350 msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold #: locale/ipp-strings.c:1352 msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod #: locale/ipp-strings.c:1354 msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray #: locale/ipp-strings.c:1356 msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green #: locale/ipp-strings.c:1358 msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory #: locale/ipp-strings.c:1360 msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta #: locale/ipp-strings.c:1362 msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard #: locale/ipp-strings.c:1364 msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange #: locale/ipp-strings.c:1366 msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink #: locale/ipp-strings.c:1368 msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red #: locale/ipp-strings.c:1370 msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver #: locale/ipp-strings.c:1372 msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise #: locale/ipp-strings.c:1374 msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet #: locale/ipp-strings.c:1376 msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow #: locale/ipp-strings.c:1378 msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta #: locale/ipp-strings.c:1380 msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color #: locale/ipp-strings.c:1382 msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard #: locale/ipp-strings.c:1384 msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color #: locale/ipp-strings.c:1386 msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange #: locale/ipp-strings.c:1388 msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink #: locale/ipp-strings.c:1390 msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red #: locale/ipp-strings.c:1392 msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver #: locale/ipp-strings.c:1394 msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise #: locale/ipp-strings.c:1396 msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet #: locale/ipp-strings.c:1398 msgid "media-color.violet" msgstr "" #. TRANSLATORS: White #: locale/ipp-strings.c:1400 msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow #: locale/ipp-strings.c:1402 msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media #: locale/ipp-strings.c:1404 msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain #: locale/ipp-strings.c:1406 msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction #: locale/ipp-strings.c:1408 msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction #: locale/ipp-strings.c:1410 msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count #: locale/ipp-strings.c:1412 msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info #: locale/ipp-strings.c:1414 msgid "media-info" msgstr "" #. TRANSLATORS: Force Media #: locale/ipp-strings.c:1416 msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin #: locale/ipp-strings.c:1418 msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media #: locale/ipp-strings.c:1420 msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank #: locale/ipp-strings.c:1422 msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead #: locale/ipp-strings.c:1424 msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed #: locale/ipp-strings.c:1426 msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media #: locale/ipp-strings.c:1428 msgid "media-recycled" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:1430 msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:1432 msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin #: locale/ipp-strings.c:1434 msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions #: locale/ipp-strings.c:1436 msgid "media-size" msgstr "" #. TRANSLATORS: Media Name #: locale/ipp-strings.c:1438 msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source #: locale/ipp-strings.c:1440 msgid "media-source" msgstr "" #. TRANSLATORS: Alternate #: locale/ipp-strings.c:1442 msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll #: locale/ipp-strings.c:1444 msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:1446 msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:1448 msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray #: locale/ipp-strings.c:1450 msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center #: locale/ipp-strings.c:1452 msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc #: locale/ipp-strings.c:1454 msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope #: locale/ipp-strings.c:1456 msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki #: locale/ipp-strings.c:1458 msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity #: locale/ipp-strings.c:1460 msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:1462 msgid "media-source.left" msgstr "" #. TRANSLATORS: Main #: locale/ipp-strings.c:1464 msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll #: locale/ipp-strings.c:1466 msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual #: locale/ipp-strings.c:1468 msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle #: locale/ipp-strings.c:1470 msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo #: locale/ipp-strings.c:1472 msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear #: locale/ipp-strings.c:1474 msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:1476 msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 #: locale/ipp-strings.c:1478 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 #: locale/ipp-strings.c:1480 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 #: locale/ipp-strings.c:1482 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 #: locale/ipp-strings.c:1484 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 #: locale/ipp-strings.c:1486 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 #: locale/ipp-strings.c:1488 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 #: locale/ipp-strings.c:1490 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 #: locale/ipp-strings.c:1492 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 #: locale/ipp-strings.c:1494 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 #: locale/ipp-strings.c:1496 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side #: locale/ipp-strings.c:1498 msgid "media-source.side" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:1500 msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 #: locale/ipp-strings.c:1502 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 #: locale/ipp-strings.c:1504 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 #: locale/ipp-strings.c:1506 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 #: locale/ipp-strings.c:1508 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 #: locale/ipp-strings.c:1510 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 #: locale/ipp-strings.c:1512 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 #: locale/ipp-strings.c:1514 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 #: locale/ipp-strings.c:1516 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 #: locale/ipp-strings.c:1518 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 #: locale/ipp-strings.c:1520 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 #: locale/ipp-strings.c:1522 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 #: locale/ipp-strings.c:1524 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 #: locale/ipp-strings.c:1526 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 #: locale/ipp-strings.c:1528 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 #: locale/ipp-strings.c:1530 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 #: locale/ipp-strings.c:1532 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 #: locale/ipp-strings.c:1534 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 #: locale/ipp-strings.c:1536 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 #: locale/ipp-strings.c:1538 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 #: locale/ipp-strings.c:1540 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness #: locale/ipp-strings.c:1542 msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) #: locale/ipp-strings.c:1544 msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique #: locale/ipp-strings.c:1546 msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth #: locale/ipp-strings.c:1548 msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse #: locale/ipp-strings.c:1550 msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine #: locale/ipp-strings.c:1552 msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen #: locale/ipp-strings.c:1554 msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium #: locale/ipp-strings.c:1556 msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth #: locale/ipp-strings.c:1558 msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple #: locale/ipp-strings.c:1560 msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough #: locale/ipp-strings.c:1562 msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum #: locale/ipp-strings.c:1564 msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin #: locale/ipp-strings.c:1566 msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type #: locale/ipp-strings.c:1568 msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum #: locale/ipp-strings.c:1570 msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:1572 msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film #: locale/ipp-strings.c:1574 msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard #: locale/ipp-strings.c:1576 msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock #: locale/ipp-strings.c:1578 msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD #: locale/ipp-strings.c:1580 msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous #: locale/ipp-strings.c:1582 msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long #: locale/ipp-strings.c:1584 msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short #: locale/ipp-strings.c:1586 msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board #: locale/ipp-strings.c:1588 msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc #: locale/ipp-strings.c:1590 msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc #: locale/ipp-strings.c:1592 msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc #: locale/ipp-strings.c:1594 msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc #: locale/ipp-strings.c:1596 msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc #: locale/ipp-strings.c:1598 msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc #: locale/ipp-strings.c:1600 msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall #: locale/ipp-strings.c:1602 msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film #: locale/ipp-strings.c:1604 msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD #: locale/ipp-strings.c:1606 msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil #: locale/ipp-strings.c:1608 msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board #: locale/ipp-strings.c:1610 msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope #: locale/ipp-strings.c:1612 msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope #: locale/ipp-strings.c:1614 msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope #: locale/ipp-strings.c:1616 msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope #: locale/ipp-strings.c:1618 msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope #: locale/ipp-strings.c:1620 msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope #: locale/ipp-strings.c:1622 msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope #: locale/ipp-strings.c:1624 msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope #: locale/ipp-strings.c:1626 msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope #: locale/ipp-strings.c:1628 msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope #: locale/ipp-strings.c:1630 msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope #: locale/ipp-strings.c:1632 msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope #: locale/ipp-strings.c:1634 msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric #: locale/ipp-strings.c:1636 msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric #: locale/ipp-strings.c:1638 msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric #: locale/ipp-strings.c:1640 msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric #: locale/ipp-strings.c:1642 msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric #: locale/ipp-strings.c:1644 msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric #: locale/ipp-strings.c:1646 msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric #: locale/ipp-strings.c:1648 msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film #: locale/ipp-strings.c:1650 msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base #: locale/ipp-strings.c:1652 msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer #: locale/ipp-strings.c:1654 msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute #: locale/ipp-strings.c:1656 msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil #: locale/ipp-strings.c:1658 msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs #: locale/ipp-strings.c:1660 msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass #: locale/ipp-strings.c:1662 msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored #: locale/ipp-strings.c:1664 msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque #: locale/ipp-strings.c:1666 msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced #: locale/ipp-strings.c:1668 msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured #: locale/ipp-strings.c:1670 msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder #: locale/ipp-strings.c:1672 msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper #: locale/ipp-strings.c:1674 msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder #: locale/ipp-strings.c:1676 msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels #: locale/ipp-strings.c:1678 msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels #: locale/ipp-strings.c:1680 msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels #: locale/ipp-strings.c:1682 msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels #: locale/ipp-strings.c:1684 msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels #: locale/ipp-strings.c:1686 msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels #: locale/ipp-strings.c:1688 msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels #: locale/ipp-strings.c:1690 msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels #: locale/ipp-strings.c:1692 msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels #: locale/ipp-strings.c:1694 msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels #: locale/ipp-strings.c:1696 msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil #: locale/ipp-strings.c:1698 msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead #: locale/ipp-strings.c:1700 msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal #: locale/ipp-strings.c:1702 msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy #: locale/ipp-strings.c:1704 msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss #: locale/ipp-strings.c:1706 msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte #: locale/ipp-strings.c:1708 msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin #: locale/ipp-strings.c:1710 msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss #: locale/ipp-strings.c:1712 msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape #: locale/ipp-strings.c:1714 msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer #: locale/ipp-strings.c:1716 msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form #: locale/ipp-strings.c:1718 msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other #: locale/ipp-strings.c:1720 msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper #: locale/ipp-strings.c:1722 msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper #: locale/ipp-strings.c:1724 msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival #: locale/ipp-strings.c:1726 msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film #: locale/ipp-strings.c:1728 msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper #: locale/ipp-strings.c:1730 msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper #: locale/ipp-strings.c:1732 msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper #: locale/ipp-strings.c:1734 msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper #: locale/ipp-strings.c:1736 msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper #: locale/ipp-strings.c:1738 msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic #: locale/ipp-strings.c:1740 msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival #: locale/ipp-strings.c:1742 msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored #: locale/ipp-strings.c:1744 msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy #: locale/ipp-strings.c:1746 msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss #: locale/ipp-strings.c:1748 msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte #: locale/ipp-strings.c:1750 msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin #: locale/ipp-strings.c:1752 msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss #: locale/ipp-strings.c:1754 msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate #: locale/ipp-strings.c:1756 msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester #: locale/ipp-strings.c:1758 msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs #: locale/ipp-strings.c:1760 msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll #: locale/ipp-strings.c:1762 msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen #: locale/ipp-strings.c:1764 msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged #: locale/ipp-strings.c:1766 msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive #: locale/ipp-strings.c:1768 msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film #: locale/ipp-strings.c:1770 msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil #: locale/ipp-strings.c:1772 msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face #: locale/ipp-strings.c:1774 msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall #: locale/ipp-strings.c:1776 msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve #: locale/ipp-strings.c:1778 msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery #: locale/ipp-strings.c:1780 msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival #: locale/ipp-strings.c:1782 msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper #: locale/ipp-strings.c:1784 msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton #: locale/ipp-strings.c:1786 msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper #: locale/ipp-strings.c:1788 msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper #: locale/ipp-strings.c:1790 msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated #: locale/ipp-strings.c:1792 msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper #: locale/ipp-strings.c:1794 msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead #: locale/ipp-strings.c:1796 msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper #: locale/ipp-strings.c:1798 msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper #: locale/ipp-strings.c:1800 msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper #: locale/ipp-strings.c:1802 msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock #: locale/ipp-strings.c:1804 msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor #: locale/ipp-strings.c:1806 msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer #: locale/ipp-strings.c:1808 msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency #: locale/ipp-strings.c:1810 msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall #: locale/ipp-strings.c:1812 msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film #: locale/ipp-strings.c:1814 msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) #: locale/ipp-strings.c:1816 msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ #: locale/ipp-strings.c:1818 msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter #: locale/ipp-strings.c:1820 msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 #: locale/ipp-strings.c:1822 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 #: locale/ipp-strings.c:1824 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 #: locale/ipp-strings.c:1826 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 #: locale/ipp-strings.c:1828 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 #: locale/ipp-strings.c:1830 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 #: locale/ipp-strings.c:1832 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 #: locale/ipp-strings.c:1834 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 #: locale/ipp-strings.c:1836 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 #: locale/ipp-strings.c:1838 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 #: locale/ipp-strings.c:1840 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 #: locale/ipp-strings.c:1842 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) #: locale/ipp-strings.c:1844 msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 #: locale/ipp-strings.c:1846 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 #: locale/ipp-strings.c:1848 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 #: locale/ipp-strings.c:1850 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 #: locale/ipp-strings.c:1852 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 #: locale/ipp-strings.c:1854 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 #: locale/ipp-strings.c:1856 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) #: locale/ipp-strings.c:1858 msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) #: locale/ipp-strings.c:1860 msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 #: locale/ipp-strings.c:1862 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 #: locale/ipp-strings.c:1864 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 #: locale/ipp-strings.c:1866 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 #: locale/ipp-strings.c:1868 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 #: locale/ipp-strings.c:1870 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 #: locale/ipp-strings.c:1872 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 #: locale/ipp-strings.c:1874 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 #: locale/ipp-strings.c:1876 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) #: locale/ipp-strings.c:1878 msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 #: locale/ipp-strings.c:1880 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 #: locale/ipp-strings.c:1882 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 #: locale/ipp-strings.c:1884 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 #: locale/ipp-strings.c:1886 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 #: locale/ipp-strings.c:1888 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 #: locale/ipp-strings.c:1890 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 #: locale/ipp-strings.c:1892 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 #: locale/ipp-strings.c:1894 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 #: locale/ipp-strings.c:1896 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 #: locale/ipp-strings.c:1898 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 #: locale/ipp-strings.c:1900 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) #: locale/ipp-strings.c:1902 msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 #: locale/ipp-strings.c:1904 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 #: locale/ipp-strings.c:1906 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 #: locale/ipp-strings.c:1908 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 #: locale/ipp-strings.c:1910 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 #: locale/ipp-strings.c:1912 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 #: locale/ipp-strings.c:1914 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 #: locale/ipp-strings.c:1916 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 #: locale/ipp-strings.c:1918 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 #: locale/ipp-strings.c:1920 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 #: locale/ipp-strings.c:1922 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 #: locale/ipp-strings.c:1924 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 #: locale/ipp-strings.c:1926 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 #: locale/ipp-strings.c:1928 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 #: locale/ipp-strings.c:1930 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 #: locale/ipp-strings.c:1932 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 #: locale/ipp-strings.c:1934 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 #: locale/ipp-strings.c:1936 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 #: locale/ipp-strings.c:1938 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 #: locale/ipp-strings.c:1940 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL #: locale/ipp-strings.c:1942 msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 #: locale/ipp-strings.c:1944 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 #: locale/ipp-strings.c:1946 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 #: locale/ipp-strings.c:1948 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 #: locale/ipp-strings.c:1950 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 #: locale/ipp-strings.c:1952 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 #: locale/ipp-strings.c:1954 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 #: locale/ipp-strings.c:1956 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 #: locale/ipp-strings.c:1958 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 #: locale/ipp-strings.c:1960 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 #: locale/ipp-strings.c:1962 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 #: locale/ipp-strings.c:1964 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 #: locale/ipp-strings.c:1966 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 #: locale/ipp-strings.c:1968 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 #: locale/ipp-strings.c:1970 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 #: locale/ipp-strings.c:1972 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 #: locale/ipp-strings.c:1974 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 #: locale/ipp-strings.c:1976 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 #: locale/ipp-strings.c:1978 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 #: locale/ipp-strings.c:1980 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 #: locale/ipp-strings.c:1982 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 #: locale/ipp-strings.c:1984 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 #: locale/ipp-strings.c:1986 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 #: locale/ipp-strings.c:1988 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive #: locale/ipp-strings.c:1990 msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 #: locale/ipp-strings.c:1992 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 #: locale/ipp-strings.c:1994 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 #: locale/ipp-strings.c:1996 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 #: locale/ipp-strings.c:1998 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki #: locale/ipp-strings.c:2000 msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu #: locale/ipp-strings.c:2002 msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm #: locale/ipp-strings.c:2004 msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 #: locale/ipp-strings.c:2006 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm #: locale/ipp-strings.c:2008 msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm #: locale/ipp-strings.c:2010 msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm #: locale/ipp-strings.c:2012 msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm #: locale/ipp-strings.c:2014 msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm #: locale/ipp-strings.c:2016 msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard #: locale/ipp-strings.c:2018 msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 #: locale/ipp-strings.c:2020 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ #: locale/ipp-strings.c:2022 msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ #: locale/ipp-strings.c:2024 msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ #: locale/ipp-strings.c:2026 msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ #: locale/ipp-strings.c:2028 msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ #: locale/ipp-strings.c:2030 msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ #: locale/ipp-strings.c:2032 msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ #: locale/ipp-strings.c:2034 msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ #: locale/ipp-strings.c:2036 msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ #: locale/ipp-strings.c:2038 msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ #: locale/ipp-strings.c:2040 msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ #: locale/ipp-strings.c:2042 msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 #: locale/ipp-strings.c:2044 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ #: locale/ipp-strings.c:2046 msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ #: locale/ipp-strings.c:2048 msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ #: locale/ipp-strings.c:2050 msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ #: locale/ipp-strings.c:2052 msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ #: locale/ipp-strings.c:2054 msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ #: locale/ipp-strings.c:2056 msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ #: locale/ipp-strings.c:2058 msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ #: locale/ipp-strings.c:2060 msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 #: locale/ipp-strings.c:2062 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ #: locale/ipp-strings.c:2064 msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ #: locale/ipp-strings.c:2066 msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ #: locale/ipp-strings.c:2068 msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ #: locale/ipp-strings.c:2070 msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ #: locale/ipp-strings.c:2072 msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive #: locale/ipp-strings.c:2074 msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ #: locale/ipp-strings.c:2076 msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold #: locale/ipp-strings.c:2078 msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold #: locale/ipp-strings.c:2080 msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap #: locale/ipp-strings.c:2082 msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ #: locale/ipp-strings.c:2084 msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ #: locale/ipp-strings.c:2086 msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ #: locale/ipp-strings.c:2088 msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ #: locale/ipp-strings.c:2090 msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ #: locale/ipp-strings.c:2092 msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ #: locale/ipp-strings.c:2094 msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement #: locale/ipp-strings.c:2096 msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ #: locale/ipp-strings.c:2098 msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) #: locale/ipp-strings.c:2100 msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal #: locale/ipp-strings.c:2102 msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) #: locale/ipp-strings.c:2104 msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) #: locale/ipp-strings.c:2106 msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter #: locale/ipp-strings.c:2108 msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch #: locale/ipp-strings.c:2110 msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 #: locale/ipp-strings.c:2112 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 #: locale/ipp-strings.c:2114 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 #: locale/ipp-strings.c:2116 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 #: locale/ipp-strings.c:2118 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 #: locale/ipp-strings.c:2120 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ #: locale/ipp-strings.c:2122 msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal #: locale/ipp-strings.c:2124 msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto #: locale/ipp-strings.c:2126 msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ #: locale/ipp-strings.c:2128 msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ #: locale/ipp-strings.c:2130 msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ #: locale/ipp-strings.c:2132 msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ #: locale/ipp-strings.c:2134 msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ #: locale/ipp-strings.c:2136 msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ #: locale/ipp-strings.c:2138 msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ #: locale/ipp-strings.c:2140 msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ #: locale/ipp-strings.c:2142 msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ #: locale/ipp-strings.c:2144 msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ #: locale/ipp-strings.c:2146 msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ #: locale/ipp-strings.c:2148 msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ #: locale/ipp-strings.c:2150 msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ #: locale/ipp-strings.c:2152 msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ #: locale/ipp-strings.c:2154 msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm #: locale/ipp-strings.c:2156 msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm #: locale/ipp-strings.c:2158 msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm #: locale/ipp-strings.c:2160 msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm #: locale/ipp-strings.c:2162 msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm #: locale/ipp-strings.c:2164 msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm #: locale/ipp-strings.c:2166 msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm #: locale/ipp-strings.c:2168 msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio #: locale/ipp-strings.c:2170 msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) #: locale/ipp-strings.c:2172 msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation #: locale/ipp-strings.c:2174 msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian #: locale/ipp-strings.c:2176 msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm #: locale/ipp-strings.c:2178 msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 #: locale/ipp-strings.c:2180 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm #: locale/ipp-strings.c:2182 msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm #: locale/ipp-strings.c:2184 msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix #: locale/ipp-strings.c:2186 msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm #: locale/ipp-strings.c:2188 msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm #: locale/ipp-strings.c:2190 msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm #: locale/ipp-strings.c:2192 msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 #: locale/ipp-strings.c:2194 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k #: locale/ipp-strings.c:2196 msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 #: locale/ipp-strings.c:2198 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 #: locale/ipp-strings.c:2200 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k #: locale/ipp-strings.c:2202 msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 #: locale/ipp-strings.c:2204 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 #: locale/ipp-strings.c:2206 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 #: locale/ipp-strings.c:2208 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 #: locale/ipp-strings.c:2210 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 #: locale/ipp-strings.c:2212 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 #: locale/ipp-strings.c:2214 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k #: locale/ipp-strings.c:2216 msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k #: locale/ipp-strings.c:2218 msgid "media.roc_8k_10.75x15.5in" msgstr "" #: systemv/lpstat.c:1035 #, c-format msgid "members of class %s:" msgstr "" #. TRANSLATORS: Multiple Document Handling #: locale/ipp-strings.c:2220 msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies #: locale/ipp-strings.c:2222 msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies #: locale/ipp-strings.c:2224 msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document #: locale/ipp-strings.c:2226 msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet #: locale/ipp-strings.c:2228 msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling #: locale/ipp-strings.c:2230 msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual #: locale/ipp-strings.c:2232 msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2234 msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit #: locale/ipp-strings.c:2236 msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality #: locale/ipp-strings.c:2238 msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed #: locale/ipp-strings.c:2240 msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time #: locale/ipp-strings.c:2242 msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout #: locale/ipp-strings.c:2244 msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job #: locale/ipp-strings.c:2246 msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job #: locale/ipp-strings.c:2248 msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job #: locale/ipp-strings.c:2250 msgid "multiple-operation-time-out-action.process-job" msgstr "" #: berkeley/lpq.c:554 msgid "no entries" msgstr "" #: systemv/lpstat.c:1103 msgid "no system default destination" msgstr "" #. TRANSLATORS: Noise Removal #: locale/ipp-strings.c:2252 msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes #: locale/ipp-strings.c:2254 msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset #: locale/ipp-strings.c:2256 msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events #: locale/ipp-strings.c:2258 msgid "notify-events" msgstr "" #: scheduler/ipp.c:5872 msgid "notify-events not specified." msgstr "" #. TRANSLATORS: Document Completed #: locale/ipp-strings.c:2260 msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed #: locale/ipp-strings.c:2262 msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created #: locale/ipp-strings.c:2264 msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable #: locale/ipp-strings.c:2266 msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed #: locale/ipp-strings.c:2268 msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped #: locale/ipp-strings.c:2270 msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed #: locale/ipp-strings.c:2272 msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed #: locale/ipp-strings.c:2274 msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created #: locale/ipp-strings.c:2276 msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable #: locale/ipp-strings.c:2278 msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress #: locale/ipp-strings.c:2280 msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed #: locale/ipp-strings.c:2282 msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped #: locale/ipp-strings.c:2284 msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:2286 msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed #: locale/ipp-strings.c:2288 msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed #: locale/ipp-strings.c:2290 msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed #: locale/ipp-strings.c:2292 msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed #: locale/ipp-strings.c:2294 msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted #: locale/ipp-strings.c:2296 msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown #: locale/ipp-strings.c:2298 msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed #: locale/ipp-strings.c:2300 msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped #: locale/ipp-strings.c:2302 msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval #: locale/ipp-strings.c:2304 msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration #: locale/ipp-strings.c:2306 msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language #: locale/ipp-strings.c:2308 msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method #: locale/ipp-strings.c:2310 msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient #: locale/ipp-strings.c:2312 msgid "notify-recipient-uri" msgstr "" #: scheduler/ipp.c:2034 scheduler/ipp.c:5758 #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" #: scheduler/ipp.c:2024 scheduler/ipp.c:5748 #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" #. TRANSLATORS: Notify Sequence Numbers #: locale/ipp-strings.c:2314 msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids #: locale/ipp-strings.c:2316 msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval #: locale/ipp-strings.c:2318 msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data #: locale/ipp-strings.c:2320 msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait #: locale/ipp-strings.c:2322 msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries #: locale/ipp-strings.c:2324 msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up #: locale/ipp-strings.c:2326 msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset #: locale/ipp-strings.c:2328 msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size #: locale/ipp-strings.c:2330 msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name #: locale/ipp-strings.c:2332 msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation #: locale/ipp-strings.c:2334 msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait #: locale/ipp-strings.c:2336 msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape #: locale/ipp-strings.c:2338 msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape #: locale/ipp-strings.c:2340 msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait #: locale/ipp-strings.c:2342 msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:2344 msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options #: locale/ipp-strings.c:2346 msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray #: locale/ipp-strings.c:2348 msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2350 msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:2352 msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center #: locale/ipp-strings.c:2354 msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down #: locale/ipp-strings.c:2356 msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up #: locale/ipp-strings.c:2358 msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity #: locale/ipp-strings.c:2360 msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:2362 msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 #: locale/ipp-strings.c:2364 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 #: locale/ipp-strings.c:2366 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 #: locale/ipp-strings.c:2368 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 #: locale/ipp-strings.c:2370 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 #: locale/ipp-strings.c:2372 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 #: locale/ipp-strings.c:2374 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 #: locale/ipp-strings.c:2376 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 #: locale/ipp-strings.c:2378 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 #: locale/ipp-strings.c:2380 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 #: locale/ipp-strings.c:2382 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle #: locale/ipp-strings.c:2384 msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox #: locale/ipp-strings.c:2386 msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear #: locale/ipp-strings.c:2388 msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:2390 msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side #: locale/ipp-strings.c:2392 msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 #: locale/ipp-strings.c:2394 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 #: locale/ipp-strings.c:2396 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 #: locale/ipp-strings.c:2398 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 #: locale/ipp-strings.c:2400 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 #: locale/ipp-strings.c:2402 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 #: locale/ipp-strings.c:2404 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 #: locale/ipp-strings.c:2406 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 #: locale/ipp-strings.c:2408 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 #: locale/ipp-strings.c:2410 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 #: locale/ipp-strings.c:2412 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:2414 msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 #: locale/ipp-strings.c:2416 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 #: locale/ipp-strings.c:2418 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 #: locale/ipp-strings.c:2420 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 #: locale/ipp-strings.c:2422 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 #: locale/ipp-strings.c:2424 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 #: locale/ipp-strings.c:2426 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 #: locale/ipp-strings.c:2428 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 #: locale/ipp-strings.c:2430 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 #: locale/ipp-strings.c:2432 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 #: locale/ipp-strings.c:2434 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality #: locale/ipp-strings.c:2436 msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery #: locale/ipp-strings.c:2438 msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down #: locale/ipp-strings.c:2440 msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up #: locale/ipp-strings.c:2442 msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down #: locale/ipp-strings.c:2444 msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up #: locale/ipp-strings.c:2446 msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified #: locale/ipp-strings.c:2448 msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received #: locale/ipp-strings.c:2450 msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N #: locale/ipp-strings.c:2452 msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 #: locale/ipp-strings.c:2454 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges #: locale/ipp-strings.c:2456 msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages #: locale/ipp-strings.c:2458 msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset #: locale/ipp-strings.c:2460 msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side #: locale/ipp-strings.c:2462 msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped #: locale/ipp-strings.c:2464 msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal #: locale/ipp-strings.c:2466 msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated #: locale/ipp-strings.c:2468 msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution #: locale/ipp-strings.c:2470 msgid "pclm-source-resolution" msgstr "" #: cups/notify.c:74 msgid "pending" msgstr "" #. TRANSLATORS: Platform Shape #: locale/ipp-strings.c:2472 msgid "platform-shape" msgstr "" #. TRANSLATORS: Round #: locale/ipp-strings.c:2474 msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle #: locale/ipp-strings.c:2476 msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature #: locale/ipp-strings.c:2478 msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String #: locale/ipp-strings.c:2480 msgid "post-dial-string" msgstr "" #: ppdc/ppdc.cxx:102 ppdc/ppdpo.cxx:81 #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "" #: ppdc/ppdpo.cxx:124 #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "" #: ppdc/ppdc-source.cxx:362 #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "" #: ppdc/ppdc-import.cxx:253 #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "" #: ppdc/ppdc-source.cxx:1748 #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1065 #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1985 #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2671 #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" #: ppdc/ppdc-source.cxx:1650 #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:884 #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:907 #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:346 #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1045 #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:399 #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:387 #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:455 #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:444 #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:466 #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:647 #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2857 #, c-format msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:778 #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1029 #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1641 #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1157 #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2570 #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1454 #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1633 #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:305 #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3229 #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1010 #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3060 #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3093 #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3183 #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3246 #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1108 #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1197 #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1734 #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:431 #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1526 #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1560 #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1538 #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1717 #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" #: ppdc/ppdc-catalog.cxx:385 ppdc/ppdc-catalog.cxx:397 #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:956 #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:524 #, c-format msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1815 #, c-format msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:313 #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1053 #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2746 #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3349 #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:680 #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:324 #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1037 #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:179 #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "" #: ppdc/ppdc-source.cxx:924 #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:916 #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:932 #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1580 #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1552 #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc.cxx:240 ppdc/ppdpo.cxx:111 #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "" #: ppdc/ppdc.cxx:176 #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "" #: ppdc/ppdc.cxx:115 #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "" #: ppdc/ppdc-source.cxx:2363 ppdc/ppdc-source.cxx:2595 #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "" #: ppdc/ppdc-source.cxx:2464 ppdc/ppdc-source.cxx:2499 #: ppdc/ppdc-source.cxx:2529 #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "" #: ppdc/ppdc-catalog.cxx:462 #, c-format msgid "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" #: ppdc/ppdc-driver.cxx:707 #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "" #: ppdc/ppdc-source.cxx:1603 ppdc/ppdc-source.cxx:2834 #: ppdc/ppdc-source.cxx:2920 ppdc/ppdc-source.cxx:3013 #: ppdc/ppdc-source.cxx:3146 ppdc/ppdc-source.cxx:3279 #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:1596 #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:657 #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2446 #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "" #: ppdc/ppdc.cxx:363 #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "" #: ppdc/ppdc.cxx:255 #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "" #: ppdc/ppdc.cxx:276 #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "" #: ppdc/ppdc.cxx:292 ppdc/ppdc.cxx:298 #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "" #: ppdc/ppdc-source.cxx:1682 #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2602 #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc.cxx:187 #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "" #: ppdc/ppdc.cxx:124 #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "" #: ppdc/ppdc-file.cxx:37 #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "" #: ppdc/ppdc-source.cxx:2006 #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "" #: ppdc/ppdc-catalog.cxx:479 #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2876 #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:858 #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:3106 #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc-catalog.cxx:507 #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "" #: ppdc/ppdc-source.cxx:3360 #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:966 #, c-format msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" #: ppdc/ppdc-source.cxx:2116 #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" #: ppdc/ppdc.cxx:354 #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "" #: ppdc/ppdc.cxx:369 #, c-format msgid "ppdc: Writing %s." msgstr "" #: ppdc/ppdc.cxx:137 #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "" #: ppdc/ppdmerge.cxx:126 #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "" #: ppdc/ppdmerge.cxx:163 #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "" #: ppdc/ppdmerge.cxx:147 #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "" #. TRANSLATORS: Pre-dial String #: locale/ipp-strings.c:2482 msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout #: locale/ipp-strings.c:2484 msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left #: locale/ipp-strings.c:2486 msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right #: locale/ipp-strings.c:2488 msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom #: locale/ipp-strings.c:2490 msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top #: locale/ipp-strings.c:2492 msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom #: locale/ipp-strings.c:2494 msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top #: locale/ipp-strings.c:2496 msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left #: locale/ipp-strings.c:2498 msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right #: locale/ipp-strings.c:2500 msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy #: locale/ipp-strings.c:2502 msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base #: locale/ipp-strings.c:2504 msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual #: locale/ipp-strings.c:2506 msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim #: locale/ipp-strings.c:2508 msgid "print-base.brim" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:2510 msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft #: locale/ipp-strings.c:2512 msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt #: locale/ipp-strings.c:2514 msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:2516 msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode #: locale/ipp-strings.c:2518 msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2520 msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome #: locale/ipp-strings.c:2522 msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text #: locale/ipp-strings.c:2524 msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color #: locale/ipp-strings.c:2526 msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight #: locale/ipp-strings.c:2528 msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome #: locale/ipp-strings.c:2530 msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text #: locale/ipp-strings.c:2532 msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome #: locale/ipp-strings.c:2534 msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization #: locale/ipp-strings.c:2536 msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual #: locale/ipp-strings.c:2538 msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2540 msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics #: locale/ipp-strings.c:2542 msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics #: locale/ipp-strings.c:2544 msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo #: locale/ipp-strings.c:2546 msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text #: locale/ipp-strings.c:2548 msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics #: locale/ipp-strings.c:2550 msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics #: locale/ipp-strings.c:2552 msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects #: locale/ipp-strings.c:2554 msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality #: locale/ipp-strings.c:2556 msgid "print-quality" msgstr "" #. TRANSLATORS: Draft #: locale/ipp-strings.c:2558 msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal #: locale/ipp-strings.c:2560 msgid "print-quality.4" msgstr "" #. TRANSLATORS: High #: locale/ipp-strings.c:2562 msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent #: locale/ipp-strings.c:2564 msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute #: locale/ipp-strings.c:2566 msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2568 msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual #: locale/ipp-strings.c:2570 msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative #: locale/ipp-strings.c:2572 msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation #: locale/ipp-strings.c:2574 msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation #: locale/ipp-strings.c:2576 msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling #: locale/ipp-strings.c:2578 msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:2580 msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit #: locale/ipp-strings.c:2582 msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill #: locale/ipp-strings.c:2584 msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit #: locale/ipp-strings.c:2586 msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:2588 msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports #: locale/ipp-strings.c:2590 msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual #: locale/ipp-strings.c:2592 msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material #: locale/ipp-strings.c:2594 msgid "print-supports.material" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:2596 msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard #: locale/ipp-strings.c:2598 msgid "print-supports.standard" msgstr "" #: systemv/lpstat.c:1786 #, c-format msgid "printer %s disabled since %s -" msgstr "" #: systemv/lpstat.c:1778 #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #: systemv/lpstat.c:1780 #, c-format msgid "printer %s is idle. enabled since %s" msgstr "" #: systemv/lpstat.c:1783 #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "" #: systemv/lpstat.c:1904 #, c-format msgid "printer %s/%s disabled since %s -" msgstr "" #: systemv/lpstat.c:1890 #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "" #: systemv/lpstat.c:1897 #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "" #. TRANSLATORS: Printer Kind #: locale/ipp-strings.c:2600 msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc #: locale/ipp-strings.c:2602 msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document #: locale/ipp-strings.c:2604 msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope #: locale/ipp-strings.c:2606 msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label #: locale/ipp-strings.c:2608 msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format #: locale/ipp-strings.c:2610 msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo #: locale/ipp-strings.c:2612 msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard #: locale/ipp-strings.c:2614 msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt #: locale/ipp-strings.c:2616 msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll #: locale/ipp-strings.c:2618 msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator #: locale/ipp-strings.c:2620 msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution #: locale/ipp-strings.c:2622 msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State #: locale/ipp-strings.c:2624 msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State #: locale/ipp-strings.c:2626 msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed #: locale/ipp-strings.c:2628 msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added #: locale/ipp-strings.c:2630 msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty #: locale/ipp-strings.c:2632 msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full #: locale/ipp-strings.c:2634 msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit #: locale/ipp-strings.c:2636 msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed #: locale/ipp-strings.c:2638 msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change #: locale/ipp-strings.c:2640 msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed #: locale/ipp-strings.c:2642 msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open #: locale/ipp-strings.c:2644 msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty #: locale/ipp-strings.c:2646 msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full #: locale/ipp-strings.c:2648 msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed #: locale/ipp-strings.c:2650 msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open #: locale/ipp-strings.c:2652 msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam #: locale/ipp-strings.c:2654 msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over #: locale/ipp-strings.c:2656 msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over #: locale/ipp-strings.c:2658 msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted #: locale/ipp-strings.c:2660 msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing #: locale/ipp-strings.c:2662 msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure #: locale/ipp-strings.c:2664 msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit #: locale/ipp-strings.c:2666 msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline #: locale/ipp-strings.c:2668 msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened #: locale/ipp-strings.c:2670 msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature #: locale/ipp-strings.c:2672 msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver #: locale/ipp-strings.c:2674 msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure #: locale/ipp-strings.c:2676 msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage #: locale/ipp-strings.c:2678 msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed #: locale/ipp-strings.c:2680 msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added #: locale/ipp-strings.c:2682 msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed #: locale/ipp-strings.c:2684 msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure #: locale/ipp-strings.c:2686 msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure #: locale/ipp-strings.c:2688 msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off #: locale/ipp-strings.c:2690 msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On #: locale/ipp-strings.c:2692 msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature #: locale/ipp-strings.c:2694 msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure #: locale/ipp-strings.c:2696 msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error #: locale/ipp-strings.c:2698 msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up #: locale/ipp-strings.c:2700 msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added #: locale/ipp-strings.c:2702 msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty #: locale/ipp-strings.c:2704 msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full #: locale/ipp-strings.c:2706 msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit #: locale/ipp-strings.c:2708 msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed #: locale/ipp-strings.c:2710 msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change #: locale/ipp-strings.c:2712 msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed #: locale/ipp-strings.c:2714 msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open #: locale/ipp-strings.c:2716 msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty #: locale/ipp-strings.c:2718 msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full #: locale/ipp-strings.c:2720 msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed #: locale/ipp-strings.c:2722 msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open #: locale/ipp-strings.c:2724 msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam #: locale/ipp-strings.c:2726 msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over #: locale/ipp-strings.c:2728 msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over #: locale/ipp-strings.c:2730 msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted #: locale/ipp-strings.c:2732 msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing #: locale/ipp-strings.c:2734 msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure #: locale/ipp-strings.c:2736 msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit #: locale/ipp-strings.c:2738 msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline #: locale/ipp-strings.c:2740 msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened #: locale/ipp-strings.c:2742 msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature #: locale/ipp-strings.c:2744 msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver #: locale/ipp-strings.c:2746 msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure #: locale/ipp-strings.c:2748 msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage #: locale/ipp-strings.c:2750 msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed #: locale/ipp-strings.c:2752 msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added #: locale/ipp-strings.c:2754 msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed #: locale/ipp-strings.c:2756 msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure #: locale/ipp-strings.c:2758 msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure #: locale/ipp-strings.c:2760 msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off #: locale/ipp-strings.c:2762 msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On #: locale/ipp-strings.c:2764 msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature #: locale/ipp-strings.c:2766 msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure #: locale/ipp-strings.c:2768 msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error #: locale/ipp-strings.c:2770 msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up #: locale/ipp-strings.c:2772 msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure #: locale/ipp-strings.c:2774 msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling #: locale/ipp-strings.c:2776 msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure #: locale/ipp-strings.c:2778 msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating #: locale/ipp-strings.c:2780 msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High #: locale/ipp-strings.c:2782 msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low #: locale/ipp-strings.c:2784 msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over #: locale/ipp-strings.c:2786 msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over #: locale/ipp-strings.c:2788 msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change #: locale/ipp-strings.c:2790 msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device #: locale/ipp-strings.c:2792 msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open #: locale/ipp-strings.c:2794 msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated #: locale/ipp-strings.c:2796 msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty #: locale/ipp-strings.c:2798 msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low #: locale/ipp-strings.c:2800 msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added #: locale/ipp-strings.c:2802 msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty #: locale/ipp-strings.c:2804 msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full #: locale/ipp-strings.c:2806 msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit #: locale/ipp-strings.c:2808 msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed #: locale/ipp-strings.c:2810 msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change #: locale/ipp-strings.c:2812 msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed #: locale/ipp-strings.c:2814 msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open #: locale/ipp-strings.c:2816 msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty #: locale/ipp-strings.c:2818 msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full #: locale/ipp-strings.c:2820 msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed #: locale/ipp-strings.c:2822 msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open #: locale/ipp-strings.c:2824 msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam #: locale/ipp-strings.c:2826 msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over #: locale/ipp-strings.c:2828 msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over #: locale/ipp-strings.c:2830 msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted #: locale/ipp-strings.c:2832 msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing #: locale/ipp-strings.c:2834 msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure #: locale/ipp-strings.c:2836 msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit #: locale/ipp-strings.c:2838 msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline #: locale/ipp-strings.c:2840 msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened #: locale/ipp-strings.c:2842 msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature #: locale/ipp-strings.c:2844 msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver #: locale/ipp-strings.c:2846 msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure #: locale/ipp-strings.c:2848 msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage #: locale/ipp-strings.c:2850 msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed #: locale/ipp-strings.c:2852 msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added #: locale/ipp-strings.c:2854 msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed #: locale/ipp-strings.c:2856 msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure #: locale/ipp-strings.c:2858 msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure #: locale/ipp-strings.c:2860 msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off #: locale/ipp-strings.c:2862 msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On #: locale/ipp-strings.c:2864 msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature #: locale/ipp-strings.c:2866 msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure #: locale/ipp-strings.c:2868 msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error #: locale/ipp-strings.c:2870 msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up #: locale/ipp-strings.c:2872 msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open #: locale/ipp-strings.c:2874 msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling #: locale/ipp-strings.c:2876 msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure #: locale/ipp-strings.c:2878 msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating #: locale/ipp-strings.c:2880 msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam #: locale/ipp-strings.c:2882 msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High #: locale/ipp-strings.c:2884 msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low #: locale/ipp-strings.c:2886 msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure #: locale/ipp-strings.c:2888 msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over #: locale/ipp-strings.c:2890 msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over #: locale/ipp-strings.c:2892 msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing #: locale/ipp-strings.c:2894 msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off #: locale/ipp-strings.c:2896 msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On #: locale/ipp-strings.c:2898 msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added #: locale/ipp-strings.c:2900 msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty #: locale/ipp-strings.c:2902 msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full #: locale/ipp-strings.c:2904 msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit #: locale/ipp-strings.c:2906 msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed #: locale/ipp-strings.c:2908 msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change #: locale/ipp-strings.c:2910 msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed #: locale/ipp-strings.c:2912 msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open #: locale/ipp-strings.c:2914 msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty #: locale/ipp-strings.c:2916 msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full #: locale/ipp-strings.c:2918 msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed #: locale/ipp-strings.c:2920 msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open #: locale/ipp-strings.c:2922 msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam #: locale/ipp-strings.c:2924 msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over #: locale/ipp-strings.c:2926 msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over #: locale/ipp-strings.c:2928 msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted #: locale/ipp-strings.c:2930 msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing #: locale/ipp-strings.c:2932 msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure #: locale/ipp-strings.c:2934 msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit #: locale/ipp-strings.c:2936 msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline #: locale/ipp-strings.c:2938 msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened #: locale/ipp-strings.c:2940 msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature #: locale/ipp-strings.c:2942 msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver #: locale/ipp-strings.c:2944 msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure #: locale/ipp-strings.c:2946 msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage #: locale/ipp-strings.c:2948 msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed #: locale/ipp-strings.c:2950 msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added #: locale/ipp-strings.c:2952 msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed #: locale/ipp-strings.c:2954 msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure #: locale/ipp-strings.c:2956 msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure #: locale/ipp-strings.c:2958 msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off #: locale/ipp-strings.c:2960 msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On #: locale/ipp-strings.c:2962 msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature #: locale/ipp-strings.c:2964 msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure #: locale/ipp-strings.c:2966 msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error #: locale/ipp-strings.c:2968 msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up #: locale/ipp-strings.c:2970 msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high #: locale/ipp-strings.c:2972 msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low #: locale/ipp-strings.c:2974 msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs #: locale/ipp-strings.c:2976 msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer #: locale/ipp-strings.c:2978 msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added #: locale/ipp-strings.c:2980 msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty #: locale/ipp-strings.c:2982 msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full #: locale/ipp-strings.c:2984 msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit #: locale/ipp-strings.c:2986 msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed #: locale/ipp-strings.c:2988 msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change #: locale/ipp-strings.c:2990 msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed #: locale/ipp-strings.c:2992 msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open #: locale/ipp-strings.c:2994 msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty #: locale/ipp-strings.c:2996 msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full #: locale/ipp-strings.c:2998 msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed #: locale/ipp-strings.c:3000 msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open #: locale/ipp-strings.c:3002 msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam #: locale/ipp-strings.c:3004 msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over #: locale/ipp-strings.c:3006 msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over #: locale/ipp-strings.c:3008 msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted #: locale/ipp-strings.c:3010 msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing #: locale/ipp-strings.c:3012 msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure #: locale/ipp-strings.c:3014 msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit #: locale/ipp-strings.c:3016 msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline #: locale/ipp-strings.c:3018 msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened #: locale/ipp-strings.c:3020 msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature #: locale/ipp-strings.c:3022 msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver #: locale/ipp-strings.c:3024 msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure #: locale/ipp-strings.c:3026 msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage #: locale/ipp-strings.c:3028 msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed #: locale/ipp-strings.c:3030 msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added #: locale/ipp-strings.c:3032 msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed #: locale/ipp-strings.c:3034 msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure #: locale/ipp-strings.c:3036 msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure #: locale/ipp-strings.c:3038 msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off #: locale/ipp-strings.c:3040 msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On #: locale/ipp-strings.c:3042 msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature #: locale/ipp-strings.c:3044 msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure #: locale/ipp-strings.c:3046 msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error #: locale/ipp-strings.c:3048 msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up #: locale/ipp-strings.c:3050 msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected #: locale/ipp-strings.c:3052 msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request #: locale/ipp-strings.c:3054 msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change #: locale/ipp-strings.c:3056 msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change #: locale/ipp-strings.c:3058 msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change #: locale/ipp-strings.c:3060 msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure #: locale/ipp-strings.c:3062 msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error #: locale/ipp-strings.c:3064 msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam #: locale/ipp-strings.c:3066 msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change #: locale/ipp-strings.c:3068 msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change #: locale/ipp-strings.c:3070 msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure #: locale/ipp-strings.c:3072 msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over #: locale/ipp-strings.c:3074 msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn #: locale/ipp-strings.c:3076 msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing #: locale/ipp-strings.c:3078 msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure #: locale/ipp-strings.c:3080 msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing #: locale/ipp-strings.c:3082 msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure #: locale/ipp-strings.c:3084 msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added #: locale/ipp-strings.c:3086 msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty #: locale/ipp-strings.c:3088 msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full #: locale/ipp-strings.c:3090 msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit #: locale/ipp-strings.c:3092 msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed #: locale/ipp-strings.c:3094 msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change #: locale/ipp-strings.c:3096 msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed #: locale/ipp-strings.c:3098 msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open #: locale/ipp-strings.c:3100 msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty #: locale/ipp-strings.c:3102 msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full #: locale/ipp-strings.c:3104 msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed #: locale/ipp-strings.c:3106 msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open #: locale/ipp-strings.c:3108 msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam #: locale/ipp-strings.c:3110 msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over #: locale/ipp-strings.c:3112 msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over #: locale/ipp-strings.c:3114 msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted #: locale/ipp-strings.c:3116 msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing #: locale/ipp-strings.c:3118 msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure #: locale/ipp-strings.c:3120 msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit #: locale/ipp-strings.c:3122 msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline #: locale/ipp-strings.c:3124 msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened #: locale/ipp-strings.c:3126 msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature #: locale/ipp-strings.c:3128 msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver #: locale/ipp-strings.c:3130 msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure #: locale/ipp-strings.c:3132 msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage #: locale/ipp-strings.c:3134 msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed #: locale/ipp-strings.c:3136 msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added #: locale/ipp-strings.c:3138 msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed #: locale/ipp-strings.c:3140 msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure #: locale/ipp-strings.c:3142 msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure #: locale/ipp-strings.c:3144 msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off #: locale/ipp-strings.c:3146 msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On #: locale/ipp-strings.c:3148 msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature #: locale/ipp-strings.c:3150 msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure #: locale/ipp-strings.c:3152 msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error #: locale/ipp-strings.c:3154 msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up #: locale/ipp-strings.c:3156 msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed #: locale/ipp-strings.c:3158 msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open #: locale/ipp-strings.c:3160 msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added #: locale/ipp-strings.c:3162 msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed #: locale/ipp-strings.c:3164 msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered #: locale/ipp-strings.c:3166 msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease #: locale/ipp-strings.c:3168 msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase #: locale/ipp-strings.c:3170 msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added #: locale/ipp-strings.c:3172 msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted #: locale/ipp-strings.c:3174 msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable #: locale/ipp-strings.c:3176 msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life #: locale/ipp-strings.c:3178 msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure #: locale/ipp-strings.c:3180 msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life #: locale/ipp-strings.c:3182 msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life #: locale/ipp-strings.c:3184 msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure #: locale/ipp-strings.c:3186 msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life #: locale/ipp-strings.c:3188 msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added #: locale/ipp-strings.c:3190 msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty #: locale/ipp-strings.c:3192 msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full #: locale/ipp-strings.c:3194 msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit #: locale/ipp-strings.c:3196 msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed #: locale/ipp-strings.c:3198 msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change #: locale/ipp-strings.c:3200 msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed #: locale/ipp-strings.c:3202 msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open #: locale/ipp-strings.c:3204 msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty #: locale/ipp-strings.c:3206 msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full #: locale/ipp-strings.c:3208 msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed #: locale/ipp-strings.c:3210 msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open #: locale/ipp-strings.c:3212 msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam #: locale/ipp-strings.c:3214 msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over #: locale/ipp-strings.c:3216 msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over #: locale/ipp-strings.c:3218 msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted #: locale/ipp-strings.c:3220 msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing #: locale/ipp-strings.c:3222 msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure #: locale/ipp-strings.c:3224 msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit #: locale/ipp-strings.c:3226 msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline #: locale/ipp-strings.c:3228 msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened #: locale/ipp-strings.c:3230 msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature #: locale/ipp-strings.c:3232 msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver #: locale/ipp-strings.c:3234 msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure #: locale/ipp-strings.c:3236 msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage #: locale/ipp-strings.c:3238 msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed #: locale/ipp-strings.c:3240 msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added #: locale/ipp-strings.c:3242 msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed #: locale/ipp-strings.c:3244 msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure #: locale/ipp-strings.c:3246 msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure #: locale/ipp-strings.c:3248 msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off #: locale/ipp-strings.c:3250 msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On #: locale/ipp-strings.c:3252 msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature #: locale/ipp-strings.c:3254 msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure #: locale/ipp-strings.c:3256 msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error #: locale/ipp-strings.c:3258 msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up #: locale/ipp-strings.c:3260 msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality #: locale/ipp-strings.c:3262 msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing #: locale/ipp-strings.c:3264 msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty #: locale/ipp-strings.c:3266 msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty #: locale/ipp-strings.c:3268 msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing #: locale/ipp-strings.c:3270 msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing #: locale/ipp-strings.c:3272 msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure #: locale/ipp-strings.c:3274 msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure #: locale/ipp-strings.c:3276 msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty #: locale/ipp-strings.c:3278 msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty #: locale/ipp-strings.c:3280 msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing #: locale/ipp-strings.c:3282 msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing #: locale/ipp-strings.c:3284 msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty #: locale/ipp-strings.c:3286 msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty #: locale/ipp-strings.c:3288 msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing #: locale/ipp-strings.c:3290 msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty #: locale/ipp-strings.c:3292 msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty #: locale/ipp-strings.c:3294 msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low #: locale/ipp-strings.c:3296 msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing #: locale/ipp-strings.c:3298 msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing #: locale/ipp-strings.c:3300 msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing #: locale/ipp-strings.c:3302 msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full #: locale/ipp-strings.c:3304 msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full #: locale/ipp-strings.c:3306 msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full #: locale/ipp-strings.c:3308 msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full #: locale/ipp-strings.c:3310 msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing #: locale/ipp-strings.c:3312 msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing #: locale/ipp-strings.c:3314 msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full #: locale/ipp-strings.c:3316 msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full #: locale/ipp-strings.c:3318 msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing #: locale/ipp-strings.c:3320 msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty #: locale/ipp-strings.c:3322 msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low #: locale/ipp-strings.c:3324 msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed #: locale/ipp-strings.c:3326 msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying #: locale/ipp-strings.c:3328 msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty #: locale/ipp-strings.c:3330 msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam #: locale/ipp-strings.c:3332 msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty #: locale/ipp-strings.c:3334 msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper #: locale/ipp-strings.c:3336 msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing #: locale/ipp-strings.c:3338 msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure #: locale/ipp-strings.c:3340 msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty #: locale/ipp-strings.c:3342 msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error #: locale/ipp-strings.c:3344 msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam #: locale/ipp-strings.c:3346 msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request #: locale/ipp-strings.c:3348 msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam #: locale/ipp-strings.c:3350 msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full #: locale/ipp-strings.c:3352 msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full #: locale/ipp-strings.c:3354 msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing #: locale/ipp-strings.c:3356 msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error #: locale/ipp-strings.c:3358 msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full #: locale/ipp-strings.c:3360 msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam #: locale/ipp-strings.c:3362 msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure #: locale/ipp-strings.c:3364 msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over #: locale/ipp-strings.c:3366 msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn #: locale/ipp-strings.c:3368 msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing #: locale/ipp-strings.c:3370 msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure #: locale/ipp-strings.c:3372 msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline #: locale/ipp-strings.c:3374 msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:3376 msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over #: locale/ipp-strings.c:3378 msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life #: locale/ipp-strings.c:3380 msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors #: locale/ipp-strings.c:3382 msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full #: locale/ipp-strings.c:3384 msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full #: locale/ipp-strings.c:3386 msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure #: locale/ipp-strings.c:3388 msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure #: locale/ipp-strings.c:3390 msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error #: locale/ipp-strings.c:3392 msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam #: locale/ipp-strings.c:3394 msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing #: locale/ipp-strings.c:3396 msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused #: locale/ipp-strings.c:3398 msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added #: locale/ipp-strings.c:3400 msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty #: locale/ipp-strings.c:3402 msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full #: locale/ipp-strings.c:3404 msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit #: locale/ipp-strings.c:3406 msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed #: locale/ipp-strings.c:3408 msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change #: locale/ipp-strings.c:3410 msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed #: locale/ipp-strings.c:3412 msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open #: locale/ipp-strings.c:3414 msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty #: locale/ipp-strings.c:3416 msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full #: locale/ipp-strings.c:3418 msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed #: locale/ipp-strings.c:3420 msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open #: locale/ipp-strings.c:3422 msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam #: locale/ipp-strings.c:3424 msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over #: locale/ipp-strings.c:3426 msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over #: locale/ipp-strings.c:3428 msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted #: locale/ipp-strings.c:3430 msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing #: locale/ipp-strings.c:3432 msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure #: locale/ipp-strings.c:3434 msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit #: locale/ipp-strings.c:3436 msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline #: locale/ipp-strings.c:3438 msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened #: locale/ipp-strings.c:3440 msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature #: locale/ipp-strings.c:3442 msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver #: locale/ipp-strings.c:3444 msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure #: locale/ipp-strings.c:3446 msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage #: locale/ipp-strings.c:3448 msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed #: locale/ipp-strings.c:3450 msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added #: locale/ipp-strings.c:3452 msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed #: locale/ipp-strings.c:3454 msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure #: locale/ipp-strings.c:3456 msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure #: locale/ipp-strings.c:3458 msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off #: locale/ipp-strings.c:3460 msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On #: locale/ipp-strings.c:3462 msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature #: locale/ipp-strings.c:3464 msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure #: locale/ipp-strings.c:3466 msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error #: locale/ipp-strings.c:3468 msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up #: locale/ipp-strings.c:3470 msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling #: locale/ipp-strings.c:3472 msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure #: locale/ipp-strings.c:3474 msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating #: locale/ipp-strings.c:3476 msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High #: locale/ipp-strings.c:3478 msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low #: locale/ipp-strings.c:3480 msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down #: locale/ipp-strings.c:3482 msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up #: locale/ipp-strings.c:3484 msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually #: locale/ipp-strings.c:3486 msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely #: locale/ipp-strings.c:3488 msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print #: locale/ipp-strings.c:3490 msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added #: locale/ipp-strings.c:3492 msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty #: locale/ipp-strings.c:3494 msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full #: locale/ipp-strings.c:3496 msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit #: locale/ipp-strings.c:3498 msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed #: locale/ipp-strings.c:3500 msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change #: locale/ipp-strings.c:3502 msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed #: locale/ipp-strings.c:3504 msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open #: locale/ipp-strings.c:3506 msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty #: locale/ipp-strings.c:3508 msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full #: locale/ipp-strings.c:3510 msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed #: locale/ipp-strings.c:3512 msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open #: locale/ipp-strings.c:3514 msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam #: locale/ipp-strings.c:3516 msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over #: locale/ipp-strings.c:3518 msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over #: locale/ipp-strings.c:3520 msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted #: locale/ipp-strings.c:3522 msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing #: locale/ipp-strings.c:3524 msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure #: locale/ipp-strings.c:3526 msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit #: locale/ipp-strings.c:3528 msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline #: locale/ipp-strings.c:3530 msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened #: locale/ipp-strings.c:3532 msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature #: locale/ipp-strings.c:3534 msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver #: locale/ipp-strings.c:3536 msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure #: locale/ipp-strings.c:3538 msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage #: locale/ipp-strings.c:3540 msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed #: locale/ipp-strings.c:3542 msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added #: locale/ipp-strings.c:3544 msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed #: locale/ipp-strings.c:3546 msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure #: locale/ipp-strings.c:3548 msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure #: locale/ipp-strings.c:3550 msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off #: locale/ipp-strings.c:3552 msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On #: locale/ipp-strings.c:3554 msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature #: locale/ipp-strings.c:3556 msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure #: locale/ipp-strings.c:3558 msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error #: locale/ipp-strings.c:3560 msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up #: locale/ipp-strings.c:3562 msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added #: locale/ipp-strings.c:3564 msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty #: locale/ipp-strings.c:3566 msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full #: locale/ipp-strings.c:3568 msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit #: locale/ipp-strings.c:3570 msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed #: locale/ipp-strings.c:3572 msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change #: locale/ipp-strings.c:3574 msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed #: locale/ipp-strings.c:3576 msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open #: locale/ipp-strings.c:3578 msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty #: locale/ipp-strings.c:3580 msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full #: locale/ipp-strings.c:3582 msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed #: locale/ipp-strings.c:3584 msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open #: locale/ipp-strings.c:3586 msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam #: locale/ipp-strings.c:3588 msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over #: locale/ipp-strings.c:3590 msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over #: locale/ipp-strings.c:3592 msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted #: locale/ipp-strings.c:3594 msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing #: locale/ipp-strings.c:3596 msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure #: locale/ipp-strings.c:3598 msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit #: locale/ipp-strings.c:3600 msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline #: locale/ipp-strings.c:3602 msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened #: locale/ipp-strings.c:3604 msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature #: locale/ipp-strings.c:3606 msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver #: locale/ipp-strings.c:3608 msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure #: locale/ipp-strings.c:3610 msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage #: locale/ipp-strings.c:3612 msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed #: locale/ipp-strings.c:3614 msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added #: locale/ipp-strings.c:3616 msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed #: locale/ipp-strings.c:3618 msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure #: locale/ipp-strings.c:3620 msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure #: locale/ipp-strings.c:3622 msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off #: locale/ipp-strings.c:3624 msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On #: locale/ipp-strings.c:3626 msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature #: locale/ipp-strings.c:3628 msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure #: locale/ipp-strings.c:3630 msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error #: locale/ipp-strings.c:3632 msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up #: locale/ipp-strings.c:3634 msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added #: locale/ipp-strings.c:3636 msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty #: locale/ipp-strings.c:3638 msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full #: locale/ipp-strings.c:3640 msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit #: locale/ipp-strings.c:3642 msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed #: locale/ipp-strings.c:3644 msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change #: locale/ipp-strings.c:3646 msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed #: locale/ipp-strings.c:3648 msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open #: locale/ipp-strings.c:3650 msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty #: locale/ipp-strings.c:3652 msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full #: locale/ipp-strings.c:3654 msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed #: locale/ipp-strings.c:3656 msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open #: locale/ipp-strings.c:3658 msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam #: locale/ipp-strings.c:3660 msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over #: locale/ipp-strings.c:3662 msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over #: locale/ipp-strings.c:3664 msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted #: locale/ipp-strings.c:3666 msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing #: locale/ipp-strings.c:3668 msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure #: locale/ipp-strings.c:3670 msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit #: locale/ipp-strings.c:3672 msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline #: locale/ipp-strings.c:3674 msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened #: locale/ipp-strings.c:3676 msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature #: locale/ipp-strings.c:3678 msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver #: locale/ipp-strings.c:3680 msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure #: locale/ipp-strings.c:3682 msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage #: locale/ipp-strings.c:3684 msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed #: locale/ipp-strings.c:3686 msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added #: locale/ipp-strings.c:3688 msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed #: locale/ipp-strings.c:3690 msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure #: locale/ipp-strings.c:3692 msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure #: locale/ipp-strings.c:3694 msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off #: locale/ipp-strings.c:3696 msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On #: locale/ipp-strings.c:3698 msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature #: locale/ipp-strings.c:3700 msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure #: locale/ipp-strings.c:3702 msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error #: locale/ipp-strings.c:3704 msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up #: locale/ipp-strings.c:3706 msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline #: locale/ipp-strings.c:3708 msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added #: locale/ipp-strings.c:3710 msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty #: locale/ipp-strings.c:3712 msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full #: locale/ipp-strings.c:3714 msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit #: locale/ipp-strings.c:3716 msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed #: locale/ipp-strings.c:3718 msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change #: locale/ipp-strings.c:3720 msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed #: locale/ipp-strings.c:3722 msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open #: locale/ipp-strings.c:3724 msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty #: locale/ipp-strings.c:3726 msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full #: locale/ipp-strings.c:3728 msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed #: locale/ipp-strings.c:3730 msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open #: locale/ipp-strings.c:3732 msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam #: locale/ipp-strings.c:3734 msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over #: locale/ipp-strings.c:3736 msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over #: locale/ipp-strings.c:3738 msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted #: locale/ipp-strings.c:3740 msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing #: locale/ipp-strings.c:3742 msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure #: locale/ipp-strings.c:3744 msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit #: locale/ipp-strings.c:3746 msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline #: locale/ipp-strings.c:3748 msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened #: locale/ipp-strings.c:3750 msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature #: locale/ipp-strings.c:3752 msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver #: locale/ipp-strings.c:3754 msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure #: locale/ipp-strings.c:3756 msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage #: locale/ipp-strings.c:3758 msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed #: locale/ipp-strings.c:3760 msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added #: locale/ipp-strings.c:3762 msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed #: locale/ipp-strings.c:3764 msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure #: locale/ipp-strings.c:3766 msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure #: locale/ipp-strings.c:3768 msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off #: locale/ipp-strings.c:3770 msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On #: locale/ipp-strings.c:3772 msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature #: locale/ipp-strings.c:3774 msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure #: locale/ipp-strings.c:3776 msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error #: locale/ipp-strings.c:3778 msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up #: locale/ipp-strings.c:3780 msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full #: locale/ipp-strings.c:3782 msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added #: locale/ipp-strings.c:3784 msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty #: locale/ipp-strings.c:3786 msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full #: locale/ipp-strings.c:3788 msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit #: locale/ipp-strings.c:3790 msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed #: locale/ipp-strings.c:3792 msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change #: locale/ipp-strings.c:3794 msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed #: locale/ipp-strings.c:3796 msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open #: locale/ipp-strings.c:3798 msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty #: locale/ipp-strings.c:3800 msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full #: locale/ipp-strings.c:3802 msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed #: locale/ipp-strings.c:3804 msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open #: locale/ipp-strings.c:3806 msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam #: locale/ipp-strings.c:3808 msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over #: locale/ipp-strings.c:3810 msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over #: locale/ipp-strings.c:3812 msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted #: locale/ipp-strings.c:3814 msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing #: locale/ipp-strings.c:3816 msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure #: locale/ipp-strings.c:3818 msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit #: locale/ipp-strings.c:3820 msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline #: locale/ipp-strings.c:3822 msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened #: locale/ipp-strings.c:3824 msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature #: locale/ipp-strings.c:3826 msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver #: locale/ipp-strings.c:3828 msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure #: locale/ipp-strings.c:3830 msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage #: locale/ipp-strings.c:3832 msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed #: locale/ipp-strings.c:3834 msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added #: locale/ipp-strings.c:3836 msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed #: locale/ipp-strings.c:3838 msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure #: locale/ipp-strings.c:3840 msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure #: locale/ipp-strings.c:3842 msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off #: locale/ipp-strings.c:3844 msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On #: locale/ipp-strings.c:3846 msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature #: locale/ipp-strings.c:3848 msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure #: locale/ipp-strings.c:3850 msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error #: locale/ipp-strings.c:3852 msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up #: locale/ipp-strings.c:3854 msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added #: locale/ipp-strings.c:3856 msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty #: locale/ipp-strings.c:3858 msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full #: locale/ipp-strings.c:3860 msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit #: locale/ipp-strings.c:3862 msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed #: locale/ipp-strings.c:3864 msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change #: locale/ipp-strings.c:3866 msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed #: locale/ipp-strings.c:3868 msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open #: locale/ipp-strings.c:3870 msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty #: locale/ipp-strings.c:3872 msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full #: locale/ipp-strings.c:3874 msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed #: locale/ipp-strings.c:3876 msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open #: locale/ipp-strings.c:3878 msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam #: locale/ipp-strings.c:3880 msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over #: locale/ipp-strings.c:3882 msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over #: locale/ipp-strings.c:3884 msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted #: locale/ipp-strings.c:3886 msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing #: locale/ipp-strings.c:3888 msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure #: locale/ipp-strings.c:3890 msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit #: locale/ipp-strings.c:3892 msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline #: locale/ipp-strings.c:3894 msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened #: locale/ipp-strings.c:3896 msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature #: locale/ipp-strings.c:3898 msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver #: locale/ipp-strings.c:3900 msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure #: locale/ipp-strings.c:3902 msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage #: locale/ipp-strings.c:3904 msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed #: locale/ipp-strings.c:3906 msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added #: locale/ipp-strings.c:3908 msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed #: locale/ipp-strings.c:3910 msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure #: locale/ipp-strings.c:3912 msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure #: locale/ipp-strings.c:3914 msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off #: locale/ipp-strings.c:3916 msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On #: locale/ipp-strings.c:3918 msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature #: locale/ipp-strings.c:3920 msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure #: locale/ipp-strings.c:3922 msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error #: locale/ipp-strings.c:3924 msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up #: locale/ipp-strings.c:3926 msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added #: locale/ipp-strings.c:3928 msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty #: locale/ipp-strings.c:3930 msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full #: locale/ipp-strings.c:3932 msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit #: locale/ipp-strings.c:3934 msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed #: locale/ipp-strings.c:3936 msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change #: locale/ipp-strings.c:3938 msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed #: locale/ipp-strings.c:3940 msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open #: locale/ipp-strings.c:3942 msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty #: locale/ipp-strings.c:3944 msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full #: locale/ipp-strings.c:3946 msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed #: locale/ipp-strings.c:3948 msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open #: locale/ipp-strings.c:3950 msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam #: locale/ipp-strings.c:3952 msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over #: locale/ipp-strings.c:3954 msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over #: locale/ipp-strings.c:3956 msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted #: locale/ipp-strings.c:3958 msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing #: locale/ipp-strings.c:3960 msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure #: locale/ipp-strings.c:3962 msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit #: locale/ipp-strings.c:3964 msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline #: locale/ipp-strings.c:3966 msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened #: locale/ipp-strings.c:3968 msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature #: locale/ipp-strings.c:3970 msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver #: locale/ipp-strings.c:3972 msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure #: locale/ipp-strings.c:3974 msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage #: locale/ipp-strings.c:3976 msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed #: locale/ipp-strings.c:3978 msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added #: locale/ipp-strings.c:3980 msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed #: locale/ipp-strings.c:3982 msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure #: locale/ipp-strings.c:3984 msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure #: locale/ipp-strings.c:3986 msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off #: locale/ipp-strings.c:3988 msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On #: locale/ipp-strings.c:3990 msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature #: locale/ipp-strings.c:3992 msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure #: locale/ipp-strings.c:3994 msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error #: locale/ipp-strings.c:3996 msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up #: locale/ipp-strings.c:3998 msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped #: locale/ipp-strings.c:4000 msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping #: locale/ipp-strings.c:4002 msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added #: locale/ipp-strings.c:4004 msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty #: locale/ipp-strings.c:4006 msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full #: locale/ipp-strings.c:4008 msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit #: locale/ipp-strings.c:4010 msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed #: locale/ipp-strings.c:4012 msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down #: locale/ipp-strings.c:4014 msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty #: locale/ipp-strings.c:4016 msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full #: locale/ipp-strings.c:4018 msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over #: locale/ipp-strings.c:4020 msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over #: locale/ipp-strings.c:4022 msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted #: locale/ipp-strings.c:4024 msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing #: locale/ipp-strings.c:4026 msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure #: locale/ipp-strings.c:4028 msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit #: locale/ipp-strings.c:4030 msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline #: locale/ipp-strings.c:4032 msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened #: locale/ipp-strings.c:4034 msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature #: locale/ipp-strings.c:4036 msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver #: locale/ipp-strings.c:4038 msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure #: locale/ipp-strings.c:4040 msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage #: locale/ipp-strings.c:4042 msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed #: locale/ipp-strings.c:4044 msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added #: locale/ipp-strings.c:4046 msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed #: locale/ipp-strings.c:4048 msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure #: locale/ipp-strings.c:4050 msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure #: locale/ipp-strings.c:4052 msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off #: locale/ipp-strings.c:4054 msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On #: locale/ipp-strings.c:4056 msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature #: locale/ipp-strings.c:4058 msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure #: locale/ipp-strings.c:4060 msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage #: locale/ipp-strings.c:4062 msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up #: locale/ipp-strings.c:4064 msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding #: locale/ipp-strings.c:4066 msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner #: locale/ipp-strings.c:4068 msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low #: locale/ipp-strings.c:4070 msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added #: locale/ipp-strings.c:4072 msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty #: locale/ipp-strings.c:4074 msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full #: locale/ipp-strings.c:4076 msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit #: locale/ipp-strings.c:4078 msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed #: locale/ipp-strings.c:4080 msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change #: locale/ipp-strings.c:4082 msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed #: locale/ipp-strings.c:4084 msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open #: locale/ipp-strings.c:4086 msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty #: locale/ipp-strings.c:4088 msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full #: locale/ipp-strings.c:4090 msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed #: locale/ipp-strings.c:4092 msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open #: locale/ipp-strings.c:4094 msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam #: locale/ipp-strings.c:4096 msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over #: locale/ipp-strings.c:4098 msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over #: locale/ipp-strings.c:4100 msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted #: locale/ipp-strings.c:4102 msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing #: locale/ipp-strings.c:4104 msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure #: locale/ipp-strings.c:4106 msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit #: locale/ipp-strings.c:4108 msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline #: locale/ipp-strings.c:4110 msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened #: locale/ipp-strings.c:4112 msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature #: locale/ipp-strings.c:4114 msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver #: locale/ipp-strings.c:4116 msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure #: locale/ipp-strings.c:4118 msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage #: locale/ipp-strings.c:4120 msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed #: locale/ipp-strings.c:4122 msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added #: locale/ipp-strings.c:4124 msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed #: locale/ipp-strings.c:4126 msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure #: locale/ipp-strings.c:4128 msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure #: locale/ipp-strings.c:4130 msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off #: locale/ipp-strings.c:4132 msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On #: locale/ipp-strings.c:4134 msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature #: locale/ipp-strings.c:4136 msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure #: locale/ipp-strings.c:4138 msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error #: locale/ipp-strings.c:4140 msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up #: locale/ipp-strings.c:4142 msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown #: locale/ipp-strings.c:4144 msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added #: locale/ipp-strings.c:4146 msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty #: locale/ipp-strings.c:4148 msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full #: locale/ipp-strings.c:4150 msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit #: locale/ipp-strings.c:4152 msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed #: locale/ipp-strings.c:4154 msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change #: locale/ipp-strings.c:4156 msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed #: locale/ipp-strings.c:4158 msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open #: locale/ipp-strings.c:4160 msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty #: locale/ipp-strings.c:4162 msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full #: locale/ipp-strings.c:4164 msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed #: locale/ipp-strings.c:4166 msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open #: locale/ipp-strings.c:4168 msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam #: locale/ipp-strings.c:4170 msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over #: locale/ipp-strings.c:4172 msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over #: locale/ipp-strings.c:4174 msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted #: locale/ipp-strings.c:4176 msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing #: locale/ipp-strings.c:4178 msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure #: locale/ipp-strings.c:4180 msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit #: locale/ipp-strings.c:4182 msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline #: locale/ipp-strings.c:4184 msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened #: locale/ipp-strings.c:4186 msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature #: locale/ipp-strings.c:4188 msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver #: locale/ipp-strings.c:4190 msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure #: locale/ipp-strings.c:4192 msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage #: locale/ipp-strings.c:4194 msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed #: locale/ipp-strings.c:4196 msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added #: locale/ipp-strings.c:4198 msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed #: locale/ipp-strings.c:4200 msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure #: locale/ipp-strings.c:4202 msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure #: locale/ipp-strings.c:4204 msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off #: locale/ipp-strings.c:4206 msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On #: locale/ipp-strings.c:4208 msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature #: locale/ipp-strings.c:4210 msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure #: locale/ipp-strings.c:4212 msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error #: locale/ipp-strings.c:4214 msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up #: locale/ipp-strings.c:4216 msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle #: locale/ipp-strings.c:4218 msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing #: locale/ipp-strings.c:4220 msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped #: locale/ipp-strings.c:4222 msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime #: locale/ipp-strings.c:4224 msgid "printer-up-time" msgstr "" #: cups/notify.c:80 cups/notify.c:121 msgid "processing" msgstr "" #. TRANSLATORS: Proof Print #: locale/ipp-strings.c:4226 msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies #: locale/ipp-strings.c:4228 msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching #: locale/ipp-strings.c:4230 msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations #: locale/ipp-strings.c:4232 msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset #: locale/ipp-strings.c:4234 msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge #: locale/ipp-strings.c:4236 msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:4238 msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:4240 msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:4242 msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:4244 msgid "punching-reference-edge.top" msgstr "" #: systemv/lp.c:642 #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "" #: cups/snmp.c:974 msgid "request-id uses indefinite length" msgstr "" #. TRANSLATORS: Requested Attributes #: locale/ipp-strings.c:4246 msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval #: locale/ipp-strings.c:4248 msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout #: locale/ipp-strings.c:4250 msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition #: locale/ipp-strings.c:4252 msgid "save-disposition" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:4254 msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save #: locale/ipp-strings.c:4256 msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only #: locale/ipp-strings.c:4258 msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format #: locale/ipp-strings.c:4260 msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info #: locale/ipp-strings.c:4262 msgid "save-info" msgstr "" #. TRANSLATORS: Save Location #: locale/ipp-strings.c:4264 msgid "save-location" msgstr "" #. TRANSLATORS: Save Name #: locale/ipp-strings.c:4266 msgid "save-name" msgstr "" #: systemv/lpstat.c:2032 msgid "scheduler is not running" msgstr "" #: systemv/lpstat.c:2028 msgid "scheduler is running" msgstr "" #. TRANSLATORS: Separator Sheets #: locale/ipp-strings.c:4268 msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets #: locale/ipp-strings.c:4270 msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets #: locale/ipp-strings.c:4272 msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet #: locale/ipp-strings.c:4274 msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:4276 msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets #: locale/ipp-strings.c:4278 msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet #: locale/ipp-strings.c:4280 msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing #: locale/ipp-strings.c:4282 msgid "sides" msgstr "" #. TRANSLATORS: Off #: locale/ipp-strings.c:4284 msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) #: locale/ipp-strings.c:4286 msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) #: locale/ipp-strings.c:4288 msgid "sides.two-sided-short-edge" msgstr "" #: cups/adminutil.c:1384 #, c-format msgid "stat of %s failed: %s" msgstr "" #: berkeley/lpc.c:197 msgid "status\t\tShow status of daemon and queue." msgstr "" #. TRANSLATORS: Status Message #: locale/ipp-strings.c:4290 msgid "status-message" msgstr "" #. TRANSLATORS: Staple #: locale/ipp-strings.c:4292 msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle #: locale/ipp-strings.c:4294 msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations #: locale/ipp-strings.c:4296 msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method #: locale/ipp-strings.c:4298 msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic #: locale/ipp-strings.c:4300 msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp #: locale/ipp-strings.c:4302 msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire #: locale/ipp-strings.c:4304 msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset #: locale/ipp-strings.c:4306 msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge #: locale/ipp-strings.c:4308 msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:4310 msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:4312 msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:4314 msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:4316 msgid "stitching-reference-edge.top" msgstr "" #: cups/notify.c:83 cups/notify.c:124 msgid "stopped" msgstr "" #. TRANSLATORS: Subject #: locale/ipp-strings.c:4318 msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes #: locale/ipp-strings.c:4320 msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:4322 msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:4324 msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:4326 msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description #: locale/ipp-strings.c:4328 msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template #: locale/ipp-strings.c:4330 msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope #: locale/ipp-strings.c:4332 msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All #: locale/ipp-strings.c:4334 msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default #: locale/ipp-strings.c:4336 msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None #: locale/ipp-strings.c:4338 msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner #: locale/ipp-strings.c:4340 msgid "subscription-privacy-scope.owner" msgstr "" #: systemv/lpstat.c:1077 #, c-format msgid "system default destination: %s" msgstr "" #: systemv/lpstat.c:1074 #, c-format msgid "system default destination: %s/%s" msgstr "" #. TRANSLATORS: T33 Subaddress #: locale/ipp-strings.c:4342 msgid "t33-subaddress" msgstr "" #. TRANSLATORS: To Name #: locale/ipp-strings.c:4344 msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status #: locale/ipp-strings.c:4346 msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending #: locale/ipp-strings.c:4348 msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry #: locale/ipp-strings.c:4350 msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing #: locale/ipp-strings.c:4352 msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled #: locale/ipp-strings.c:4354 msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted #: locale/ipp-strings.c:4356 msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed #: locale/ipp-strings.c:4358 msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut #: locale/ipp-strings.c:4360 msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position #: locale/ipp-strings.c:4362 msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge #: locale/ipp-strings.c:4364 msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom #: locale/ipp-strings.c:4366 msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left #: locale/ipp-strings.c:4368 msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right #: locale/ipp-strings.c:4370 msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top #: locale/ipp-strings.c:4372 msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut #: locale/ipp-strings.c:4374 msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line #: locale/ipp-strings.c:4376 msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full #: locale/ipp-strings.c:4378 msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial #: locale/ipp-strings.c:4380 msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate #: locale/ipp-strings.c:4382 msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score #: locale/ipp-strings.c:4384 msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab #: locale/ipp-strings.c:4386 msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After #: locale/ipp-strings.c:4388 msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document #: locale/ipp-strings.c:4390 msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job #: locale/ipp-strings.c:4392 msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set #: locale/ipp-strings.c:4394 msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page #: locale/ipp-strings.c:4396 msgid "trimming-when.after-sheets" msgstr "" #: cups/notify.c:95 cups/notify.c:127 msgid "unknown" msgstr "" #: cups/notify.c:104 msgid "untitled" msgstr "" #: cups/snmp.c:999 msgid "variable-bindings uses indefinite length" msgstr "" #. TRANSLATORS: X Accuracy #: locale/ipp-strings.c:4398 msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension #: locale/ipp-strings.c:4400 msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset #: locale/ipp-strings.c:4402 msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin #: locale/ipp-strings.c:4404 msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy #: locale/ipp-strings.c:4406 msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension #: locale/ipp-strings.c:4408 msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset #: locale/ipp-strings.c:4410 msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin #: locale/ipp-strings.c:4412 msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy #: locale/ipp-strings.c:4414 msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension #: locale/ipp-strings.c:4416 msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset #: locale/ipp-strings.c:4418 msgid "z-offset" msgstr "" #: tools/ippfind.c:2814 msgid "{service_domain} Domain name" msgstr "" #: tools/ippfind.c:2815 msgid "{service_hostname} Fully-qualified domain name" msgstr "" #: tools/ippfind.c:2816 msgid "{service_name} Service instance name" msgstr "" #: tools/ippfind.c:2817 msgid "{service_port} Port number" msgstr "" #: tools/ippfind.c:2818 msgid "{service_regtype} DNS-SD registration type" msgstr "" #: tools/ippfind.c:2819 msgid "{service_scheme} URI scheme" msgstr "" #: tools/ippfind.c:2820 msgid "{service_uri} URI" msgstr "" #: tools/ippfind.c:2821 msgid "{txt_*} Value of TXT record key" msgstr "" #: tools/ippfind.c:2813 msgid "{} URI" msgstr "" #: cups/dest.c:1864 msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" cups-2.3.1/locale/cups_es.po000664 000765 000024 00001232025 13574721672 016044 0ustar00mikestaff000000 000000 # # Spanish message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2016-06-26 21:17+0100\n" "Last-Translator: Juan Pablo González Riopedre \n" "Language-Team: Spanish\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" msgid "\t\t(all)" msgstr "\t\t(todos)" msgid "\t\t(none)" msgstr "\t\t(ninguno)" #, c-format msgid "\t%d entries" msgstr "\t%d entradas" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tTras fallo: continuar" #, c-format msgid "\tAlerts: %s" msgstr "\tAlertas: %s" msgid "\tBanner required" msgstr "\tSe necesita un rótulo" msgid "\tCharset sets:" msgstr "\tJuegos de caracteres:" msgid "\tConnection: direct" msgstr "\tConexión: directa" msgid "\tConnection: remote" msgstr "\tConexión: remota" msgid "\tContent types: any" msgstr "\tTipos de contenido: cualesquiera" msgid "\tDefault page size:" msgstr "\tTamaño de página predeterminado:" msgid "\tDefault pitch:" msgstr "\tPaso predeterminado:" msgid "\tDefault port settings:" msgstr "\tAjustes del puerto predeterminados:" #, c-format msgid "\tDescription: %s" msgstr "\tDescripción: %s" msgid "\tForm mounted:" msgstr "\tFormulario montado:" msgid "\tForms allowed:" msgstr "\tFormularios permitidos:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tInterfaz: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tInterfaz: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tUbicación: %s" msgid "\tOn fault: no alert" msgstr "\tEn fallo: no alertar" msgid "\tPrinter types: unknown" msgstr "\tTipos de impresora: desconocidos" #, c-format msgid "\tStatus: %s" msgstr "\tEstado: %s" msgid "\tUsers allowed:" msgstr "\tUsuarios permitidos:" msgid "\tUsers denied:" msgstr "\tUsuarios denegados:" msgid "\tdaemon present" msgstr "\tdemonio presente" msgid "\tno entries" msgstr "\tno hay entradas" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tla impresora está conectada a '%s' velocidad -1" msgid "\tprinting is disabled" msgstr "\tla impresión está desactivada" msgid "\tprinting is enabled" msgstr "\tla impresión está activada" #, c-format msgid "\tqueued for %s" msgstr "\ten cola para %s" msgid "\tqueuing is disabled" msgstr "\tla cola está desactivada" msgid "\tqueuing is enabled" msgstr "\tla cola está activada" msgid "\treason unknown" msgstr "\trazón desconocida" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " RESULTADOS DETALLADOS DE LA PRUEBA DE CONFORMIDAD" msgid " REF: Page 15, section 3.1." msgstr " REF: Página 15, sección 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Página 15, sección 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Página 19, sección 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Página 20, sección 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Página 27, sección 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Página 42, sección 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Páginas 16-17, sección 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Páginas 42-45, sección 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Páginas 45-46, sección 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Páginas 48-49, sección 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Páginas 52-54, sección 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f bytes" #, c-format msgid " PASS Default%s" msgstr " PASA Default%s" msgid " PASS DefaultImageableArea" msgstr " PASA DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " PASA DefaultPaperDimension" msgid " PASS FileVersion" msgstr " PASA FileVersion" msgid " PASS FormatVersion" msgstr " PASA FormatVersion" msgid " PASS LanguageEncoding" msgstr " PASA LanguageEncoding" msgid " PASS LanguageVersion" msgstr " PASA LanguageVersion" msgid " PASS Manufacturer" msgstr " PASA Manufacturer" msgid " PASS ModelName" msgstr " PASA ModelName" msgid " PASS NickName" msgstr " PASA NickName" msgid " PASS PCFileName" msgstr " PASA PCFileName" msgid " PASS PSVersion" msgstr " PASA PSVersion" msgid " PASS PageRegion" msgstr " PASA PageRegion" msgid " PASS PageSize" msgstr " PASA PageSize" msgid " PASS Product" msgstr " PASA Product" msgid " PASS ShortNickName" msgstr " PASA ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " ADVERTENCIA %s tiene opciones que no corresponden." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " ADVERTENCIA %s comparte un prefijo común con %s\n" " REF: Página 15, sección 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " ADVERTENCIA La clave de opción Duplex %s puede que no funcione " "como se espera y debería llamarse Duplex.\n" " REF: Página 122, sección 5.17." msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" " ADVERTENCIA El archivo contiene una mezcla de líneas acabadas en " "CR, LF y CR LF." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " ADVERTENCIA Se necesita LanguageEncoding por especificación de " "PPD 4.3.\n" " REF: Páginas 56-57, sección 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " ADVERTENCIA La línea %d solo contiene espacios en blanco." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " ADVERTENCIA Se necesita fabricante por especificación de PPD " "4.3.\n" " REF: Páginas 58-59, sección 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " ADVERTENCIA Los archivos PPD que no sean de Windows deben tener " "líneas que acaben sólo en LF, no en CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " ADVERTENCIA Versión de PPD %.1f anticuada.\n" " REF: Página 42, sección 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " ADVERTENCIA PCFileName es mas largo que 8.3 violando la " "especificación PPD.\n" " REF: Páginas 61-62, sección 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " ADVERTENCIA PCFileName debe contener un único nombre de archivo.\n" " REF: Páginas 61-62, sección 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " ADVERTENCIA Los protocolos contienen PJL pero no se especifican " "los atributos JCL.\n" " REF: Páginas 78-79, sección 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " ADVERTENCIA Los protocolos contienen a ambos, PJL y BCP; se " "esperaba TBCP.\n" " REF: Páginas 78-79, sección 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " ADVERTENCIA Se necesita ShortNickName por especificación de PPD " "4.3.\n" " REF: Páginas 64-65, sección 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" está en conflicto con \"%s %s\"\n" " (restricción=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s no existe." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s archivo \"%s\" tiene las mayúsculas equivocadas." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s Incorrecto %s preferencia %s.\n" " REF: Página 122, sección 5.17." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, " "preferencia %s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %s Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s Valor cupsFilter \"%s\" incorrecto." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s Valor cupsFilter2 \"%s\" incorrecto." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s cupsICCProfile %s incorrecto." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s Valor cupsPreFilter \"%s\" incorrecto." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s cupsUIConstraints %s: \"%s\" incorrecto" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s Idioma incorrecto \"%s\"." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s Permisos incorrectos en el archivo %s \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s %s mal escrito - debería ser %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr " %s No puede proporcionar APScanAppPath y APScanAppBundleID." #, c-format msgid " %s Default choices conflicting." msgstr " %s Las preferencias predeterminadas están en conflicto." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s cupsUIConstraints vacío %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" " %s Falta cadena de traducción \"%s\" para opción %s, preferencia %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s Falta cadena de traducción \"%s\" para opción %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s Falta archivo %s \"%s\"." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s Falta la opción NECESARIA PageRegion.\n" " REF: Página 100, sección 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s Falta la opción NECESARIA PageSize.\n" " REF: Página 99, sección 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" " %s Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s Falta cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Falta la opción %s en UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Falta la opción %s en cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s No hay traducción base \"%s\" incluida en el archivo." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s NECESARIO %s no define la preferencia None.\n" " REF: Página 122, sección 5.17." #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %s Tamaño \"%s\" definido para %s pero no para %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s El tamaño \"%s\" tiene dimensiones inesperadas (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s Tamaño \"%s\" debería ser \"%s\"." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" " %s Tamaño \"%s\" debería ser el nombre estandar de Adobe \"%s\"." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s Valor hash de cupsICCProfile %s colisiona con %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s genera un bucle." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr " %s cupsUIResolver %s no lista al menos dos opciones diferentes." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **FALLO** %s debería ser 1284DeviceID.\n" " REF: Página 72, sección 5.5." #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **FALLO** Default%s %s incorrecto\n" " REF: Página 40, sección 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **FALLO** DefaultImageableArea %s incorrecto\n" " REF: Página 102, sección 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **FALLO** DefaultPaperDimension %s incorrecto\n" " REF: Página 103, sección 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FALLO** FileVersion \"%s\" incorrecto\n" " REF: Página 56, sección 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FALLO** FormatVersion \"%s\" incorrecto\n" " REF: Página 56, sección 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **FALLO** Atributo JobPatchFile en archivo, incorrecto\n" " REF: Página 24, sección 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" " **FALLO** LanguageEncoding %s incorrecto: debería ser ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" " **FALLO** LanguageVersion %s incorrecto: debería ser English (Inglés)." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **FALLO** Fabricante incorrecto (debería ser \"%s\")\n" " REF: Página 211, tabla D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FALLO** ModelName incorrecto - \"%c\" no permitido en la cadena.\n" " REF: Páginas 59-60, sección 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FALLO** PSVersion incorrecto - no es \"(string) int\".\n" " REF: Páginas 62-64, sección 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **FALLO** Product incorrecto - no es \"(string)\".\n" " REF: Página 62, sección 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **FALLO** ShortNickName incorrecto - mayor de 31 caracteres.\n" " REF: Páginas 64-65, sección 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **FALLO** Opción incorrecta %s preferencia %s\n" " REF: Página 84, sección 5.9." #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" " **FALLO** El código de opción predeterminado no puede ser " "interpretado: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **FALLO** Cadena de traducción predeterminada para opción %s " "preferencia %s contiene caracteres de 8-bits." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **FALLO** Cadena de traducción predeterminada para opción %s contiene " "caracteres de 8-bits." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" " **FALLO** Nombres de grupo %s y %s se diferencian sólo en la " "capitalización." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" " **FALLO** Múltiples apariciones de opción %s nombre de preferencia %s." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" " **FALLO** Opción %s nombres de preferencia %s y %s se diferencian " "sólo en la capitalización." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" " **FALLO** Nombres de opción %s y %s se diferencian sólo en la " "capitalización." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **FALLO** NECESARIO Default%s\n" " REF: Página 40, sección 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **FALLO** NECESARIO DefaultImageableArea\n" " REF: Página 102, sección 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **FALLO** NECESARIO DefaultPaperDimension\n" " REF: Página 103, sección 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FALLO** NECESARIO FileVersion\n" " REF: Página 56, sección 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FALLO** NECESARIO FormatVersion\n" " REF: Página 56, sección 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **FALLO** NECESARIO ImageableArea para PageSize %s\n" " REF: Página 41, sección 5.\n" " REF: Página 102, sección 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **FALLO** NECESARIO LanguageEncoding\n" " REF: Páginas 56-57, sección 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **FALLO** NECESARIO LanguageVersion\n" " REF: Páginas 57-58, sección 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **FALLO** NECESARIO Manufacturer\n" " REF: Páginas 58-59, sección 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FALLO** NECESARIO ModelName\n" " REF: Páginas 59-60, sección 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **FALLO** NECESARIO NickName\n" " REF: Página 60, sección 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **FALLO** NECESARIO PCFileName\n" " REF: Páginas 61-62, sección 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FALLO** NECESARIO PSVersion\n" " REF: Páginas 62-64, sección 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **FALLO** NECESARIO PageRegion\n" " REF: Página 100, sección 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **FALLO** NECESARIO PageSize\n" " REF: Página 41, sección 5.\n" " REF: Página 99, sección 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **FALLO** NECESARIO PageSize\n" " REF: Páginas 99-100, sección 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **FALLO** NECESARIO PaperDimension para PageSize %s\n" " REF: Página 41, sección 5.\n" " REF: Página 103, sección 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **FALLO** NECESARIO Product\n" " REF: Página 62, sección 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **FALLO** NECESARIO ShortNickName\n" " REF: Páginas 64-65, sección 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" " **FALLO** No se ha podido abrir el archivo PPD - %s en la línea %d." #, c-format msgid " %d ERRORS FOUND" msgstr " %d ERRORES ENCONTRADOS" msgid " NO ERRORS FOUND" msgstr " NO SE HAN ENCONTRADO ERRORES" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Finalizar líneas con CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Finalizar líneas con CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr " --lf Finalizar líneas con LF (UNIX/Linux/macOS)." msgid " --list-filters List filters that will be used." msgstr " --list-filters Listar los filtros a usar." msgid " -D Remove the input file when finished." msgstr " -D Eliminar el archivo de entrada al terminar." msgid " -D name=value Set named variable to value." msgstr " -D nombre=valor Establece la variable nombre al valor." msgid " -I include-dir Add include directory to search path." msgstr "" " -I include-dir Añade directorio include a la ruta de búsqueda." msgid " -P filename.ppd Set PPD file." msgstr " -P nombre_archivo.ppd Establece archivo PPD." msgid " -U username Specify username." msgstr " -U nombre_usuario Especifica el nombre de usuario." msgid " -c catalog.po Load the specified message catalog." msgstr " -c catálogo.po Carga el catálogo de mensajes especificado." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr " -c cups-files.conf Establece el archivo cups-files.conf a usar." msgid " -d output-dir Specify the output directory." msgstr " -d dir-salida Especifica el directorio de salida." msgid " -d printer Use the named printer." msgstr " -d impresora Usa la impresora especificada." msgid " -e Use every filter from the PPD file." msgstr " -e Usa cada filtro desde el archivo PPD." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i tipo/mime Establece el tipo MIME de entrada (si no, auto-" "typed)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j id-trabajo[,N] Filtra el archivo N desde el trabajo especificado " "(predeterminado archivo 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr "" " -l idioma[,idioma,...] Especifica los idiomas de salida (código regional)." msgid " -m Use the ModelName value as the filename." msgstr "" " -m Usa el valor ModelName como nombre de archivo." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m tipo/mime Establece el tipo MIME de salida (si no, " "application/pdf)." msgid " -n copies Set number of copies." msgstr " -n copias Establece el número de copias." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o nombre_archivo.drv Establece el archivo de información del " "controlador (si no, ppdi.drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o nombre_archivo.ppd[.gz] Establece el archivo de salida (si no, stdout)." msgid " -o name=value Set option(s)." msgstr " -o nombre=valor Establece opciones." msgid " -p filename.ppd Set PPD file." msgstr " -p nombre_archivo.ppd Establece archivo PPD." msgid " -t Test PPDs instead of generating them." msgstr " -t Prueba los PPDs en vez de generarlos." msgid " -t title Set title." msgstr " -t título Establece título." msgid " -u Remove the PPD file when finished." msgstr " -u Borra el archivo PPD tras terminar." msgid " -v Be verbose." msgstr " -v Ser detallado." msgid " -z Compress PPD files using GNU zip." msgstr " -z Comprimir archivos PPD usando GNU zip." msgid " FAIL" msgstr " FALLO" msgid " PASS" msgstr " PASA" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes" #, c-format msgid "%d x %d mm" msgstr "%d x %d mm" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (Sin bordes)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (Sin bordes, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (Sin bordes, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s aceptando peticiones desde %s" #, c-format msgid "%s cannot be changed." msgstr "%s no puede ser cambiado." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s no está implementado en la versión de CUPS de lpc." #, c-format msgid "%s is not ready" msgstr "%s no está preparada" #, c-format msgid "%s is ready" msgstr "%s está preparada" #, c-format msgid "%s is ready and printing" msgstr "%s está preparada e imprimiendo" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s job-id usuario título copias opciones [archivo]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s no acepta peticiones desde %s -" #, c-format msgid "%s not supported." msgstr "%s no está implementado." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s aceptando peticiones desde %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s no acepta peticiones desde %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [trabajo %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s ha fallado: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s: URI de impresora \"%s\" no válida." #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: Versión %s incorrecta para \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: No sé que hay que hacer." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Error - añada '/version=1.1' al nombre del servidor." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: Error - ID de trabajo incorrecta." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo " "tiempo." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o " "una ID de trabajo." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "%s: Error - número de copias debe ser 1 o más." #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Error - se esperaba un juego de caracteres tras la opción \"-S\"." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: Error - se esperaba un tipo de contenido tras la opción \"-T\"." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: Error - se esperaba número de copias tras la opción \"-#\"." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: Error - se esperaba número de copias tras la opción \"-n\"." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Error - se esperaba un destino tras la opción \"-P\"." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Error - se esperaba un formulario tras la opción \"-f\"." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Error - se esperaba un nombre de retención tras la opción \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: Error - se esperaba un nombre de equipo tras la opción \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: Error - se esperaba un nombre de equipo tras la opción \"-h\"." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Error - se esperaba una lista de modos tras la opción \"-y\"." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: Error - se esperaba un nombre tras la opción \"-%c\"." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Error - se esperaba opción=valor tras la opción \"-o\"." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: Error - se esperaba una lista de páginas tras la opción \"-P\"." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Error - se esperaba un valor de prioridad tras la opción \"-%c\"." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: Error - se esperaba un texto con una razón tras la opción \"-r\"." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Error - se esperaba un título tras la opción \"-t\"." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: Error - se esperaba un nombre de usuario tras la opción \"-U\"." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: Error - se esperaba un nombre de usuario tras la opción \"-u\"." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: Error - se esperaba un valor tras la opción \"-%c\"." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la " "opción \"-W\"." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: Error - destino predeterminado no disponible." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: Error - la prioridad debe estar entre 1 y 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: Error - el programa planificador de tareas no responde." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: Error - demasiados archivos - \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: Error - no se ha podido acceder a \"%s\" - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: Error - no se ha podido poner en cola desde stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: Error - destino \"%s\" desconocido." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: Error - destino \"%s/%s\" desconocido." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: Error - opción \"%c\" desconocida." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: Error - opción \"%s\" desconocida." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Se esperaba una ID de trabajo tras la opción \"-i\"." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: Nombre de destino no válido en la lista \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: Cadena de filtro \"%s\" no válida." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: Falta el nombre del archivo para \"-P\"." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: Falta el tiempo de espera para \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: Falta la versión para \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" "%s: Se necesita un ID de trabajo (\"-i id_trabajo\") antes de \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: No hay ningún filtro para convertir de %s/%s a %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: La operación ha fallado: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: Lo siento, no está implementado el cifrado." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s: No se ha podido conectar a \"%s:%d\": %s" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: No se ha podido conectar al servidor." #, c-format msgid "%s: Unable to contact server." msgstr "%s: No se ha podido contactar con el servidor." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s: No se ha podido crear el archivo PPD: %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: No se ha podido determinar el tipo MIME de \"%s\"." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: No se pudo abrir \"%s\": %s" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: No se pudo abrir %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: No se ha podido abrir el archivo PPD: %s en la línea %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: No se pudo leer base de datos MIME desde \"%s\" o \"%s\"." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s: No se ha podido resolver \"%s\"." #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "%s: Argumento \"%s\" desconocido." #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: Destino \"%s\" desconocido." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: Tipo MIME de destino %s/%s desconocido." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: Opción \"%c\" desconocida." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: Opción \"%s\" desconocida." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: Opción \"-%c\" desconocida." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: Tipo MIME de origen %s/%s desconocido." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: Advertencia - no se admite el uso del modificador de formato \"%c\" - la " "salida puede no ser correcta." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: Advertencia - opción de juego de caracteres no tenida en cuenta." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: Advertencia - opción de tipo de contenido no tenida en cuenta." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: Advertencia - opción de formulario no tenida en cuenta." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Advertencia - opción de modo no tenida en cuenta." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 pulg./seg" msgid "1.25x0.25\"" msgstr "1.25x0.25 pulg." msgid "1.25x2.25\"" msgstr "1.25x2.25 pulg." msgid "1.5 inch/sec." msgstr "1.5 pulg./seg" msgid "1.50x0.25\"" msgstr "1.50x0.25 pulg." msgid "1.50x0.50\"" msgstr "1.50x0.50 pulg." msgid "1.50x1.00\"" msgstr "1.50x1.00 pulg." msgid "1.50x2.00\"" msgstr "1.50x2.00 pulg." msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 pulg./seg" msgid "10 x 11" msgstr "10 x 11" msgid "10 x 13" msgstr "10 x 13" msgid "10 x 14" msgstr "10 x 14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/seg" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 pulg./seg" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 pulg./seg" msgid "12 x 11" msgstr "12 x 11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/seg" msgid "120x60dpi" msgstr "120x60ppp" msgid "120x72dpi" msgstr "120x72ppp" msgid "13" msgstr "13" msgid "136dpi" msgstr "136ppp" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/seg" msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/seg" msgid "150dpi" msgstr "150ppp" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180ppp" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 pulg./seg" msgid "2-Sided Printing" msgstr "Dúplex" msgid "2.00x0.37\"" msgstr "2.00x0.37 pulg." msgid "2.00x0.50\"" msgstr "2.00x0.50 pulg." msgid "2.00x1.00\"" msgstr "2.00x1.00 pulg." msgid "2.00x1.25\"" msgstr "2.00x1.25 pulg." msgid "2.00x2.00\"" msgstr "2.00x2.00 pulg." msgid "2.00x3.00\"" msgstr "2.00x3.00 pulg." msgid "2.00x4.00\"" msgstr "2.00x4.00 pulg." msgid "2.00x5.50\"" msgstr "2.00x5.50 pulg." msgid "2.25x0.50\"" msgstr "2.25x0.50 pulg." msgid "2.25x1.25\"" msgstr "2.25x1.25 pulg." msgid "2.25x4.00\"" msgstr "2.25x4.00 pulg." msgid "2.25x5.50\"" msgstr "2.25x5.50 pulg." msgid "2.38x5.50\"" msgstr "2.38x5.50 pulg." msgid "2.5 inches/sec." msgstr "2.5 pulg./seg" msgid "2.50x1.00\"" msgstr "2.50x1.00 pulg." msgid "2.50x2.00\"" msgstr "2.50x2.00 pulg." msgid "2.75x1.25\"" msgstr "2.75x1.25 pulg." msgid "2.9 x 1\"" msgstr "2.9 x 1 pulg." msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/seg" msgid "200 mm/sec." msgstr "200 mm/seg" msgid "203dpi" msgstr "203ppp" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24-Pin Series" msgid "240x72dpi" msgstr "240x72ppp" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/seg" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 pulg./seg" msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00 pulg." msgid "3.00x1.25\"" msgstr "3.00x1.25 pulg." msgid "3.00x2.00\"" msgstr "3.00x2.00 pulg." msgid "3.00x3.00\"" msgstr "3.00x3.00 pulg." msgid "3.00x5.00\"" msgstr "3.00x5.00 pulg." msgid "3.25x2.00\"" msgstr "3.25x2.00 pulg." msgid "3.25x5.00\"" msgstr "3.25x5.00 pulg." msgid "3.25x5.50\"" msgstr "3.25x5.50 pulg." msgid "3.25x5.83\"" msgstr "3.25x5.83 pulg." msgid "3.25x7.83\"" msgstr "3.25x7.83 pulg." msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "Disco de 3.5 pulg." msgid "3.50x1.00\"" msgstr "3.50x1.00 pulg." msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/seg" msgid "300 mm/sec." msgstr "300 mm/seg" msgid "300dpi" msgstr "300ppp" msgid "35" msgstr "35" msgid "360dpi" msgstr "360ppp" msgid "360x180dpi" msgstr "360x180ppp" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 pulg./seg" msgid "4.00x1.00\"" msgstr "4.00x1.00 pulg." msgid "4.00x13.00\"" msgstr "4.00x13.00 pulg." msgid "4.00x2.00\"" msgstr "4.00x2.00 pulg." msgid "4.00x2.50\"" msgstr "4.00x2.50 pulg." msgid "4.00x3.00\"" msgstr "4.00x3.00 pulg." msgid "4.00x4.00\"" msgstr "4.00x4.00 pulg." msgid "4.00x5.00\"" msgstr "4.00x5.00 pulg." msgid "4.00x6.00\"" msgstr "4.00x6.00 pulg." msgid "4.00x6.50\"" msgstr "4.00x6.50 pulg." msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/seg" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 pulg./seg" msgid "5 x 7" msgstr "5 x 7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 pulg./seg" msgid "6.00x1.00\"" msgstr "6.00x1.00 pulg." msgid "6.00x2.00\"" msgstr "6.00x2.00 pulg." msgid "6.00x3.00\"" msgstr "6.00x3.00 pulg." msgid "6.00x4.00\"" msgstr "6.00x4.00 pulg." msgid "6.00x5.00\"" msgstr "6.00x5.00 pulg." msgid "6.00x6.00\"" msgstr "6.00x6.00 pulg." msgid "6.00x6.50\"" msgstr "6.00x6.50 pulg." msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/seg" msgid "600dpi" msgstr "600ppp" msgid "60dpi" msgstr "60ppp" msgid "60x72dpi" msgstr "60x72ppp" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 pulg./seg" msgid "7 x 9" msgstr "7 x 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 pulg./seg" msgid "8 x 10" msgstr "8 x 10" msgid "8.00x1.00\"" msgstr "8.00x1.00 pulg." msgid "8.00x2.00\"" msgstr "8.00x2.00 pulg." msgid "8.00x3.00\"" msgstr "8.00x3.00 pulg." msgid "8.00x4.00\"" msgstr "8.00x4.00 pulg." msgid "8.00x5.00\"" msgstr "8.00x5.00 pulg." msgid "8.00x6.00\"" msgstr "8.00x6.00 pulg." msgid "8.00x6.50\"" msgstr "8.00x6.50 pulg." msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/seg" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 pulg./seg" msgid "9 x 11" msgstr "9 x 11" msgid "9 x 12" msgstr "9 x 12" msgid "9-Pin Series" msgstr "9-Pin Series" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Comando de ayuda no válido desconocido." #, c-format msgid "A class named \"%s\" already exists." msgstr "Ya existe una clase llamada \"%s\"." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Ya existe una impresora llamada \"%s\"." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 lado largo" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 lado largo" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 lado largo" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 lado largo" msgid "A3 Oversize" msgstr "A3 Extragrande" msgid "A3 Oversize Long Edge" msgstr "A3 Extragrande lado largo" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 lado largo" msgid "A4 Oversize" msgstr "A4 Extragrande" msgid "A4 Small" msgstr "A4 Pequeño" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 lado largo" msgid "A5 Oversize" msgstr "A5 Extragrande" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 lado largo" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C lado largo" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D lado largo" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E lado largo" msgid "Accept Jobs" msgstr "Aceptar trabajos" msgid "Accepted" msgstr "Aceptado" msgid "Add Class" msgstr "Añadir clase" msgid "Add Printer" msgstr "Añadir impresora" msgid "Address" msgstr "Dirección" msgid "Administration" msgstr "Administración" msgid "Always" msgstr "Siempre" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Aplicador" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" "Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto " "%d." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "El atributo \"%s\" está en el grupo equivocado." #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "El atributo \"%s\" es el tipo de valor equivocado." #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Los grupos de atributos están desordenados (%x < %x)." msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "A5 Extragrande" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "Valor 'document-format' \"%s\" incorrecto." msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Puntero destino NULLincorrecto" msgid "Bad OpenGroup" msgstr "OpenGroup incorrecto" msgid "Bad OpenUI/JCLOpenUI" msgstr "OpenUI/JCLOpenUI incorrecto" msgid "Bad OrderDependency" msgstr "OrderDependency incorrecto" msgid "Bad PPD cache file." msgstr "Archivo de caché PPD incorrecto." msgid "Bad PPD file." msgstr "Archivo PPD incorrecto." msgid "Bad Request" msgstr "Petición incorrecta" msgid "Bad SNMP version number" msgstr "Número de versión SNMP incorrecto" msgid "Bad UIConstraints" msgstr "UIConstraints incorrecto" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "Argumentos de la función incorrectos" #, c-format msgid "Bad copies value %d." msgstr "Valor de copias %d incorrecto." msgid "Bad custom parameter" msgstr "Parámetro a medida incorrecto" #, c-format msgid "Bad device-uri \"%s\"." msgstr "device-uri \"%s\" incorrecto." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Esquema device-uri \"%s\" incorrecto." #, c-format msgid "Bad document-format \"%s\"." msgstr "document-format \"%s\" incorrecto." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "document-format-default \"%s\" incorrecto." msgid "Bad filename buffer" msgstr "Nombre de archivo del búfer incorrecto" msgid "Bad hostname/address in URI" msgstr "Nombre de equipo/dirección incorrecto en la URI" #, c-format msgid "Bad job-name value: %s" msgstr "Valor job-name incorrecto: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Valor job-name incorrecto: tipo o contador equivocado." msgid "Bad job-priority value." msgstr "Valor job-priority incorrecto." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Valor de job-sheets \"%s\" incorrecto." msgid "Bad job-sheets value type." msgstr "Tipo de valor de job-sheets incorrecto." msgid "Bad job-state value." msgstr "Valor job-state incorrecto." #, c-format msgid "Bad job-uri \"%s\"." msgstr "job-uri \"%s\" incorrecto." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "notify-pull-method \"%s\" incorrecto." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "notify-recipient-uri \"%s\" incorrecto." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Valor number-up (páginas por hoja) %d incorrecto." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Valores de page-ranges %d-%d incorrectos." msgid "Bad port number in URI" msgstr "Número de puerto incorrecto en URI" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "port-monitor \"%s\" incorrecto." #, c-format msgid "Bad printer-state value %d." msgstr "Valor printer-state %d incorrecto." msgid "Bad printer-uri." msgstr "printer-uri incorrecto." #, c-format msgid "Bad request ID %d." msgstr "Petición incorrecta de ID %d." #, c-format msgid "Bad request version number %d.%d." msgstr "Petición incorrecta de número de versión %d.%d." msgid "Bad resource in URI" msgstr "Recurso incorrecto en URI" msgid "Bad scheme in URI" msgstr "Esquema incorrecto en URI" msgid "Bad username in URI" msgstr "Nombre de usuario incorrecto en URI" msgid "Bad value string" msgstr "Cadena de valores incorrecta" msgid "Bad/empty URI" msgstr "URI incorrecta/vacía" msgid "Banners" msgstr "Rótulos" msgid "Bond Paper" msgstr "Papel de cartas" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "Se esperaba un valor lógico para la opción waiteof \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "Se ha detectado un desbordamiento de buffer, cancelando." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "Impresora de etiquetas CPCL" msgid "Cancel Jobs" msgstr "Cancelar trabajos" msgid "Canceling print job." msgstr "Cancelando trabajo de impresión." msgid "Cannot change printer-is-shared for remote queues." msgstr "No se ha podido cambiar printer-is-shared para colas remotas" msgid "Cannot share a remote Kerberized printer." msgstr "No se puede compartir una impresora remota Kerberizada." msgid "Cassette" msgstr "Casete" msgid "Change Settings" msgstr "Cambiar configuración" #, c-format msgid "Character set \"%s\" not supported." msgstr "No se admite el juego de caracteres \"%s\"." msgid "Classes" msgstr "Clases" msgid "Clean Print Heads" msgstr "Limpiar cabezales de impresión" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job no admite el atributo job-uri." msgid "Color" msgstr "Color" msgid "Color Mode" msgstr "Modo de color" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Los comandos se pueden abreviar. Los comandos son:exit help quit " "status ?" msgid "Community name uses indefinite length" msgstr "Nombre de comunidad usa una longitud indefinida" msgid "Connected to printer." msgstr "Conectado a la impresora." msgid "Connecting to printer." msgstr "Conectando a la impresora." msgid "Continue" msgstr "Continuar" msgid "Continuous" msgstr "Continuo" msgid "Control file sent successfully." msgstr "Archivo de control enviado correctamente." msgid "Copying print data." msgstr "Copiando datos de impresión." msgid "Created" msgstr "Creado" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "A medida" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Cortar" msgid "Cutter" msgstr "Cortadora" msgid "Dark" msgstr "Oscuro" msgid "Darkness" msgstr "Oscuridad" msgid "Data file sent successfully." msgstr "Archivo de datos enviado correctamente." msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Borrar clase" msgid "Delete Printer" msgstr "Borrar impresora" msgid "DeskJet Series" msgstr "DeskJet Series" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "El destino %s no acepta trabajos." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Dispositivo: uri = %s\n" " clase = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " ubicación: %s" msgid "Direct Thermal Media" msgstr "Soporte térmico directo" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "El directorio \"%s\" contiene una ruta relativa." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "El directorio \"%s\" tiene permisos no seguros (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "El directorio \"%s\" es un archivo." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Directorio \"%s\" no disponible: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Permisos del directorio \"%s\" OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Deshabilitado" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "El documento #%d no existe en el trabajo #%d." msgid "Draft" msgstr "Borrador" msgid "Duplexer" msgstr "Unidad de impresión dúplex" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Impresora de etiquetas EPL1" msgid "EPL2 Label Printer" msgstr "Impresora de etiquetas EPL2" msgid "Edit Configuration File" msgstr "Editar archivo de configuración" msgid "Encryption is not supported." msgstr "El cifrado no está implementado." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Rótulo final" msgid "English" msgstr "Spanish" 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 "" "Introduzca su nombre de usuario y contraseña o el nombre de usuario y " "contraseña de root para poder acceder a esta página. Si está usando " "autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido." msgid "Envelope #10" msgstr "Sobre #10" msgid "Envelope #11" msgstr "Sobre #11" msgid "Envelope #12" msgstr "Sobre #12" msgid "Envelope #14" msgstr "Sobre #14" msgid "Envelope #9" msgstr "Sobre #9" msgid "Envelope B4" msgstr "Sobre B4" msgid "Envelope B5" msgstr "Sobre B5" msgid "Envelope B6" msgstr "Sobre B6" msgid "Envelope C0" msgstr "Sobre C0" msgid "Envelope C1" msgstr "Sobre C1" msgid "Envelope C2" msgstr "Sobre C2" msgid "Envelope C3" msgstr "Sobre C3" msgid "Envelope C4" msgstr "Sobre C4" msgid "Envelope C5" msgstr "Sobre C5" msgid "Envelope C6" msgstr "Sobre C6" msgid "Envelope C65" msgstr "Sobre C65" msgid "Envelope C7" msgstr "Sobre C7" msgid "Envelope Choukei 3" msgstr "Sobre Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Sobre Choukei 3 lado largo" msgid "Envelope Choukei 4" msgstr "Sobre Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Sobre Choukei 4 lado largo" msgid "Envelope DL" msgstr "Sobre DL" msgid "Envelope Feed" msgstr "Alimentador de sobre" msgid "Envelope Invite" msgstr "Sobre Invitación" msgid "Envelope Italian" msgstr "Sobre Italiano" msgid "Envelope Kaku2" msgstr "Sobre Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Sobre Kaku2 lado largo" msgid "Envelope Kaku3" msgstr "Sobre Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Sobre Kaku3 lado largo" msgid "Envelope Monarch" msgstr "Sobre Monarch" msgid "Envelope PRC1" msgstr "Sobre PRC1" msgid "Envelope PRC1 Long Edge" msgstr "Sobre PRC1 lado largo" msgid "Envelope PRC10" msgstr "Sobre PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Sobre PRC10 lado largo" msgid "Envelope PRC2" msgstr "Sobre PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Sobre PRC2 lado largo" msgid "Envelope PRC3" msgstr "Sobre PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Sobre PRC3 lado largo" msgid "Envelope PRC4" msgstr "Sobre PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Sobre PRC4 lado largo" msgid "Envelope PRC5 Long Edge" msgstr "Sobre PRC5 lado largo" msgid "Envelope PRC5PRC5" msgstr "Sobre PRC5PRC5" msgid "Envelope PRC6" msgstr "Sobre PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Sobre PRC6 lado largo" msgid "Envelope PRC7" msgstr "Sobre PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Sobre PRC7 lado largo" msgid "Envelope PRC8" msgstr "Sobre PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Sobre PRC8 lado largo" msgid "Envelope PRC9" msgstr "Sobre PRC9" msgid "Envelope PRC9 Long Edge" msgstr "Sobre PRC9 lado largo" msgid "Envelope Personal" msgstr "Sobre Personal" msgid "Envelope You4" msgstr "Sobre You4" msgid "Envelope You4 Long Edge" msgstr "Sobre You4 lado largo" msgid "Environment Variables:" msgstr "Variables de entorno:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Directiva de error" msgid "Error reading raster data." msgstr "Error leyendo trama de datos (raster)." msgid "Error sending raster data." msgstr "Error enviando trama de datos (raster)." msgid "Error: need hostname after \"-h\" option." msgstr "Error: se necesita un nombre de equipo tras la opción \"-h\"." msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Cada 10 etiquetas" msgid "Every 2 Labels" msgstr "Cada 2 etiquetas" msgid "Every 3 Labels" msgstr "Cada 3 etiquetas" msgid "Every 4 Labels" msgstr "Cada 4 etiquetas" msgid "Every 5 Labels" msgstr "Cada 5 etiquetas" msgid "Every 6 Labels" msgstr "Cada 6 etiquetas" msgid "Every 7 Labels" msgstr "Cada 7 etiquetas" msgid "Every 8 Labels" msgstr "Cada 8 etiquetas" msgid "Every 9 Labels" msgstr "Cada 9 etiquetas" msgid "Every Label" msgstr "Cada etiqueta" msgid "Executive" msgstr "Ejecutivo" msgid "Expectation Failed" msgstr "Lo que se esperaba, falló." msgid "Expressions:" msgstr "Expresiones:" msgid "Fast Grayscale" msgstr "Escala de grises rápida" #, c-format msgid "File \"%s\" contains a relative path." msgstr "El archivo \"%s\" contiene una ruta relativa." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "El archivo \"%s\" tiene permisos no seguros (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "El archivo \"%s\" es un directorio." #, c-format msgid "File \"%s\" not available: %s" msgstr "Archivo \"%s\" no disponible: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Permisos del archivo \"%s\" OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "Carpeta de archivo" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "Los URIs del dispositivo de archivo han sido deshabilitados. Para " "habilitarlos, vea la directiva FileDevice en \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." msgstr "Acabada la página %d." msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "Plegado" msgid "Folio" msgstr "Folio" msgid "Forbidden" msgstr "Prohibido" msgid "Found" msgstr "" msgid "General" msgstr "General" msgid "Generic" msgstr "Genérico" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU usa una longitud indefinida" msgid "Glossy Paper" msgstr "Papel brillante" msgid "Got a printer-uri attribute but no job-id." msgstr "Se ha obtenido el atributo printer-uri pero no el job-id." msgid "Grayscale" msgstr "Escale de grises" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Carpeta colgante" msgid "Hash buffer too small." msgstr "Memoria temporal hash demasiado pequeña." msgid "Help file not in index." msgstr "El archivo de ayuda no está en el índice." msgid "High" msgstr "Alta" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "Atributo IPP 1setOf con etiquetas de valor incompatibles." msgid "IPP attribute has no name." msgstr "Atributo IPP sin nombre." msgid "IPP attribute is not a member of the message." msgstr "El atributo IPP no es un miembro del mensaje." msgid "IPP begCollection value not 0 bytes." msgstr "IPP el valor begCollection no es de 0 bytes." msgid "IPP boolean value not 1 byte." msgstr "IPP el valor lógico no es de 1 byte." msgid "IPP date value not 11 bytes." msgstr "IPP el valor de fecha no es de 11 bytes." msgid "IPP endCollection value not 0 bytes." msgstr "IPP el valor endCollection no es de 0 bytes." msgid "IPP enum value not 4 bytes." msgstr "IPP el valor enum no es de 4 bytes." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP etiqueta de extensión mayor de 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "IPP el valor entero no es de 4 bytes." msgid "IPP language length overflows value." msgstr "IPP la longitud del idioma sobrepasa el valor." msgid "IPP language length too large." msgstr "Longitud de idioma IPP demasiado larga." msgid "IPP member name is not empty." msgstr "IPP el nombre del miembro no está vacío." msgid "IPP memberName value is empty." msgstr "IPP el valor memberName está vacío." msgid "IPP memberName with no attribute." msgstr "IPP memberName sin atributo." msgid "IPP name larger than 32767 bytes." msgstr "IPP nombre mayor de 32767 bytes." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP el valor nameWithLanguage menor del mínimo de 4 bytes." msgid "IPP octetString length too large." msgstr "Longitud de IPP octetString demasiado larga." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP el valor rangeOfInteger no es de 8 bytes." msgid "IPP resolution value not 9 bytes." msgstr "IPP el valor de la resolución no es de 9 bytes." msgid "IPP string length overflows value." msgstr "IPP la longitud de la cadena sobrepasa el valor." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP el valor textWithLanguage menor del mínimo de 4 bytes." msgid "IPP value larger than 32767 bytes." msgstr "IPP valor mayor de 32767 bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Carácter de control ilegal" msgid "Illegal main keyword string" msgstr "Cadena de clave principal ilegal" msgid "Illegal option keyword string" msgstr "Cadena de clave de opción ilegal" msgid "Illegal translation string" msgstr "Cadena de traducción ilegal" msgid "Illegal whitespace character" msgstr "Carácter de espacio en blanco ilegal" msgid "Installable Options" msgstr "Opciones instalables" msgid "Installed" msgstr "Instalada" msgid "IntelliBar Label Printer" msgstr "Impresora de etiquetas IntelliBar" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Error interno del servidor" msgid "Internal error" msgstr "Error interno" msgid "Internet Postage 2-Part" msgstr "Correo por Internet Parte-2" msgid "Internet Postage 3-Part" msgstr "Correo por Internet Parte-3" msgid "Internet Printing Protocol" msgstr "Protocolo de Impresión de Internet IPP" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "Argumentos del nombre del papel no válidos." msgid "Invalid media size." msgstr "Tamaño de papel no válido." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "Valor ppd-name' no válido." #, c-format msgid "Invalid printer command \"%s\"." msgstr "Comando de impresora \"%s\" no válido." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 lado largo" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 lado largo" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 lado largo" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "El trabajo #%d no puede ser reiniciado - no hay archivos." #, c-format msgid "Job #%d does not exist." msgstr "El trabajo #%d no existe." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "El trabajo #%d ya está anulado - no se puede cancelar." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "El trabajo #%d ya está cancelado - no se puede cancelar." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "El trabajo #%d ya ha sido completado - no se puede cancelar." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "El trabajo #%d ha terminado y no puede ser modificado." #, c-format msgid "Job #%d is not complete." msgstr "El trabajo #%d no ha sido completado." #, c-format msgid "Job #%d is not held for authentication." msgstr "El trabajo #%d no está retenido para autentificación." #, c-format msgid "Job #%d is not held." msgstr "El trabajo #%d no está retenido." msgid "Job Completed" msgstr "Trabajo completado" msgid "Job Created" msgstr "Trabajo creado" msgid "Job Options Changed" msgstr "Opciones de trabajo cambiadas" msgid "Job Stopped" msgstr "Trabajo detenido" msgid "Job is completed and cannot be changed." msgstr "El trabajo está terminado y no puede ser cambiado." msgid "Job operation failed" msgstr "La operación del trabajo ha fallado" msgid "Job state cannot be changed." msgstr "No se puede cambiar el estado del trabajo." msgid "Job subscriptions cannot be renewed." msgstr "Las suscripciones de trabajos no han podido ser renovadas." msgid "Jobs" msgstr "Trabajos" msgid "LPD/LPR Host or Printer" msgstr "Equipo o impresora LPD/LPR" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Impresora de etiquetas" msgid "Label Top" msgstr "Parte superior de la etiqueta" #, c-format msgid "Language \"%s\" not supported." msgstr "No se admite el uso del idioma \"%s\"." msgid "Large Address" msgstr "Dirección grande" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Series PCL 4/5" msgid "Letter Oversize" msgstr "Carta Extragrande" msgid "Letter Oversize Long Edge" msgstr "Carta Extragrande lado largo" msgid "Light" msgstr "Ligero" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Línea más larga que el máximo permitido (255 caracteres)" msgid "List Available Printers" msgstr "Listar impresoras disponibles" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "Impresora creada localmente." msgid "Long-Edge (Portrait)" msgstr "Lado largo (retrato)" msgid "Looking for printer." msgstr "" msgid "Manual Feed" msgstr "Alimentación manual" msgid "Media Size" msgstr "Tamaño de papel" msgid "Media Source" msgstr "Fuente del papel" msgid "Media Tracking" msgstr "Seguimiento del medio" msgid "Media Type" msgstr "Tipo de papel" msgid "Medium" msgstr "Media" msgid "Memory allocation error" msgstr "Error de reserva de memoria" msgid "Missing CloseGroup" msgstr "Falta CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Falta cabecera PPD-Adobe-4.x" msgid "Missing asterisk in column 1" msgstr "Falta un asterisco en la columna 1" msgid "Missing document-number attribute." msgstr "Falta el atributo document-number." msgid "Missing form variable" msgstr "Falta una variable de formulario" msgid "Missing last-document attribute in request." msgstr "Falta el atributo last-document en la petición." msgid "Missing media or media-col." msgstr "Falta media o media-col." msgid "Missing media-size in media-col." msgstr "Falta media-size en media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Falta el atributo notify-subscription-ids." msgid "Missing option keyword" msgstr "Falta cadena de clave de opción" msgid "Missing requesting-user-name attribute." msgstr "Falta el atributo requesting-user-name." #, c-format msgid "Missing required attribute \"%s\"." msgstr "Falta atributo necesario \"%s\"." msgid "Missing required attributes." msgstr "Faltan atributos necesarios." msgid "Missing resource in URI" msgstr "Falta recurso en URI" msgid "Missing scheme in URI" msgstr "Falta esquema en URI" msgid "Missing value string" msgstr "Falta cadena de valores" msgid "Missing x-dimension in media-size." msgstr "Falta x-dimension en media-size." msgid "Missing y-dimension in media-size." msgstr "Falta y-dimension en media-size." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Modelo: nombre = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgid "Modifiers:" msgstr "Modificadores:" msgid "Modify Class" msgstr "Modificar clase" msgid "Modify Printer" msgstr "Modificar impresora" msgid "Move All Jobs" msgstr "Mover todos los trabajos" msgid "Move Job" msgstr "Mover trabajo" msgid "Moved Permanently" msgstr "Movido permanentemente" msgid "NULL PPD file pointer" msgstr "Puntero de archivo PPD NULO" msgid "Name OID uses indefinite length" msgstr "Nombre OID usa una longitud indefinida" msgid "Nested classes are not allowed." msgstr "No se permiten clases anidadas." msgid "Never" msgstr "Nunca" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "No" msgid "No Content" msgstr "No hay contenido" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "No hay nombre de PPD" msgid "No VarBind SEQUENCE" msgstr "No hay Varbind SEQUENCE" msgid "No active connection" msgstr "No hay conexión activa" msgid "No active connection." msgstr "No hay conexión activa." #, c-format msgid "No active jobs on %s." msgstr "No hay trabajos activos en %s." msgid "No attributes in request." msgstr "No hay atributos en la solicitud." msgid "No authentication information provided." msgstr "No se ha proporcionado información de autentificación." msgid "No common name specified." msgstr "" msgid "No community name" msgstr "No hay nombre de comunidad" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "No hay impresora predeterminada." msgid "No destinations added." msgstr "No se han añadido destinos." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "No se ha encontrado el URI del dispositivo en argv[0] o en la variable de " "entorno DEVICE_URI." msgid "No error-index" msgstr "No hay error-index" msgid "No error-status" msgstr "No hay error-status" msgid "No file in print request." msgstr "No hay ningún archivo en la solicitud de impresión." msgid "No modification time" msgstr "No hay tiempo de modificación" msgid "No name OID" msgstr "No hay nombre OID" msgid "No pages were found." msgstr "No se han encontrado páginas." msgid "No printer name" msgstr "No hay nombre de impresora" msgid "No printer-uri found" msgstr "No se encontró printer-uri" msgid "No printer-uri found for class" msgstr "No se encontró printer-uri para la clase" msgid "No printer-uri in request." msgstr "No hay printer-uri en la solicitud." msgid "No request URI." msgstr "No se ha solicitado URI." msgid "No request protocol version." msgstr "No se ha solicitado versión del protocolo." msgid "No request sent." msgstr "No se ha enviado solicitud." msgid "No request-id" msgstr "No hay request-id" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "No hay atributos de subscripción en la solicitud." msgid "No subscriptions found." msgstr "No se han encontrado subscripciones." msgid "No variable-bindings SEQUENCE" msgstr "No hay variable-bindings SEQUENCE" msgid "No version number" msgstr "No hay número de versión" msgid "Non-continuous (Mark sensing)" msgstr "No continuo (sensible a señal)" msgid "Non-continuous (Web sensing)" msgstr "No continuo (sensible a web)" msgid "None" msgstr "" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "No encontrado" msgid "Not Implemented" msgstr "No implementado" msgid "Not Installed" msgstr "No instalado" msgid "Not Modified" msgstr "No modificado" msgid "Not Supported" msgstr "No implementado" msgid "Not allowed to print." msgstr "No se permite imprimir." msgid "Note" msgstr "Nota" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Desactivado (1 cara)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Ayuda en línea" msgid "Only local users can create a local printer." msgstr "Sólo usuarios locales pueden crear una impresora local." #, c-format msgid "Open of %s failed: %s" msgstr "La apertura de %s ha fallado: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup sin un CloseGroup previo" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI sin un CloseUI/JCLCloseUI previo" msgid "Operation Policy" msgstr "Directiva de operación" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "La opción \"%s\" no puede incluirse via %%%%IncludeFeature." msgid "Options Installed" msgstr "Opciones instaladas" msgid "Options:" msgstr "Opciones:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "Archivo de caché PPD obsoleto." msgid "Out of memory." msgstr "Sin memoria." msgid "Output Mode" msgstr "Modo de salida" msgid "PCL Laser Printer" msgstr "Impresora Laser PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K lado largo" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K lado largo" msgid "PRC32K Oversize" msgstr "PRC32K Extragrande" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K Extragrande lado largo" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "El paquete no contiene un Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "El paquete no empieza por SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "¿Contraseña de %s en %s? " msgid "Pause Class" msgstr "Pausar clase" msgid "Pause Printer" msgstr "Pausar impresora" msgid "Peel-Off" msgstr "Despegar" msgid "Photo" msgstr "Foto" msgid "Photo Labels" msgstr "Foto pequeña" msgid "Plain Paper" msgstr "Papel normal" msgid "Policies" msgstr "Reglas" msgid "Port Monitor" msgstr "Monitor de puerto" msgid "PostScript Printer" msgstr "Impresora PostScript" msgid "Postcard" msgstr "Postal" msgid "Postcard Double" msgstr "Postal doble" msgid "Postcard Double Long Edge" msgstr "Postal doble lado largo" msgid "Postcard Long Edge" msgstr "Postal lado largo" msgid "Preparing to print." msgstr "Preparando la impresión." msgid "Print Density" msgstr "Densidad de impresión" msgid "Print Job:" msgstr "Imprimir trabajo:" msgid "Print Mode" msgstr "Modo de impresión" msgid "Print Quality" msgstr "Calidad de impresión" msgid "Print Rate" msgstr "Tasa de impresión" msgid "Print Self-Test Page" msgstr "Imprimir página de auto-prueba" msgid "Print Speed" msgstr "Velocidad de impresión" msgid "Print Test Page" msgstr "Imprimir página de prueba" msgid "Print and Cut" msgstr "Imprimir y cortar" msgid "Print and Tear" msgstr "Imprimir y romper" msgid "Print file sent." msgstr "Archivo de impresión enviado." msgid "Print job canceled at printer." msgstr "Trabajo de impresión cancelado en la impresora." msgid "Print job too large." msgstr "Trabajo de impresión demasiado grande." msgid "Print job was not accepted." msgstr "No se acepta el trabajo de impresión." #, c-format msgid "Printer \"%s\" already exists." msgstr "Ya existe la impresora \"%s\"." msgid "Printer Added" msgstr "Impresora añadida" msgid "Printer Default" msgstr "Predeterminado de la impresora" msgid "Printer Deleted" msgstr "Impresora borrada" msgid "Printer Modified" msgstr "Impresora modificada" msgid "Printer Paused" msgstr "Impresora en pausa" msgid "Printer Settings" msgstr "Configuración de la impresora" msgid "Printer cannot print supplied content." msgstr "La impresora no puede imprimir el contenido suministrado." msgid "Printer cannot print with supplied options." msgstr "La impresora no puede imprimir con las opciones suministradas." msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Impresora:" msgid "Printers" msgstr "Impresoras" #, c-format msgid "Printing page %d, %u%% complete." msgstr "Imprimiendo página %d, %u%% completado." msgid "Punch" msgstr "Perforadora" msgid "Quarto" msgstr "Libro en cuarto" msgid "Quota limit reached." msgstr "Se ha alcanzado el límite de cuota." msgid "Rank Owner Job File(s) Total Size" msgstr "Rango Propiet. Trabajo Archivo(s) Tamaño total" msgid "Reject Jobs" msgstr "Rechazar trabajos" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "El equipo remoto no ha aceptado el archivo de control (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "El equipo remoto no ha aceptado el archivo de datos (%d)." msgid "Reprint After Error" msgstr "Volver a imprimir tras un error" msgid "Request Entity Too Large" msgstr "La entidad requerida es demasiado larga" msgid "Resolution" msgstr "Resolución" msgid "Resume Class" msgstr "Reanudar clase" msgid "Resume Printer" msgstr "Reanudar impresora" msgid "Return Address" msgstr "Remite" msgid "Rewind" msgstr "Rebobinar" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE usa una longitud indefinida" msgid "SSL/TLS Negotiation Error" msgstr "Error en negociación SSL/TLS" msgid "See Other" msgstr "Ver otros" msgid "See remote printer." msgstr "Ver impresora remota." msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "Enviando datos a la impresora." msgid "Server Restarted" msgstr "Servidor reiniciado" msgid "Server Security Auditing" msgstr "Auditoría de seguridad del servidor" msgid "Server Started" msgstr "Servidor iniciado" msgid "Server Stopped" msgstr "Servidor parado" msgid "Server credentials not set." msgstr "Credenciales del servidor no establecidas." msgid "Service Unavailable" msgstr "Servicio no disponible" msgid "Set Allowed Users" msgstr "Establecer usuarios permitidos" msgid "Set As Server Default" msgstr "Establecer como predeterminada del servidor" msgid "Set Class Options" msgstr "Cambiar opciones clase" msgid "Set Printer Options" msgstr "Cambiar opciones impresora" msgid "Set Publishing" msgstr "Hacer pública" msgid "Shipping Address" msgstr "Dirección de envío" msgid "Short-Edge (Landscape)" msgstr "Lado corto (apaisado)" msgid "Special Paper" msgstr "Papel especial" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Guardando trabajo en cola, %.0f%% completado." msgid "Standard" msgstr "Estándar" msgid "Staple" msgstr "Grapa" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Rótulo inicial" #, c-format msgid "Starting page %d." msgstr "Iniciando página %d." msgid "Statement" msgstr "Declaración" #, c-format msgid "Subscription #%d does not exist." msgstr "Subscripción #%d no existe." msgid "Substitutions:" msgstr "Substituciones:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B (13 x 19 pulg.)" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Protocolos de conexión" msgid "Tabloid" msgstr "Tabloide" msgid "Tabloid Oversize" msgstr "Tabloide extragrande" msgid "Tabloid Oversize Long Edge" msgstr "Tabloide extragrande lado largo" msgid "Tear" msgstr "Pestaña" msgid "Tear-Off" msgstr "Pestaña desprendible" msgid "Tear-Off Adjust Position" msgstr "Ajuste de posición de la pestaña desprendible" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "Se necesita el atributo \"%s\" para los trabajos de impresión." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "El atributo %s no puede ser usado con jobs-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" "El atributo de estado de trabajo '%s' no puede ser suministrado en una " "solicitud de creación de trabajo." #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "El atributo de operación '%s' no puede ser suministrado en una petición " "Create-Job." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "No se ha podido encontrar el archivo PPD \"%s\"." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "No se ha podido abrir el archivo PPD \"%s\": %s" msgid "The PPD file could not be opened." msgstr "No se ha podido abrir el archivo PPD." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y " "no puede contener espacios, barras (/), o la almohadilla (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "El atributo notify-lease-duration no puede ser usado con subscripciones de " "trabajos." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" "La configuración de la impresora es incorrecta o la impresora ya no existe." msgid "The printer did not respond." msgstr "La impresora no respondió." msgid "The printer is in use." msgstr "La impresora está en uso." msgid "The printer is not connected." msgstr "La impresora no está conectada." msgid "The printer is not responding." msgstr "La impresora no responde." msgid "The printer is now connected." msgstr "La impresora está ahora conectada." msgid "The printer is now online." msgstr "La impresora está ahora en línea." msgid "The printer is offline." msgstr "La impresora está fuera de línea." msgid "The printer is unreachable at this time." msgstr "La impresora es inalcanzable en este momento." msgid "The printer may not exist or is unavailable at this time." msgstr "La impresora puede no existir o no estar disponible en este momento." 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 "" msgid "The printer or class does not exist." msgstr "La impresora o clase no existe." msgid "The printer or class is not shared." msgstr "La impresora o clase no está compartida." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "El printer-uri \"%s\" contiene caracteres no válidos." msgid "The printer-uri attribute is required." msgstr "Se necesita el atributo printer-uri." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "El printer-uri debe ser de la forma \"ipp://NOMBRE_EQUIPO/classes/" "NOMBRE_CLASE\"." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "El printer-uri debe ser de la forma \"ipp://NOMBRE_EQUIPO/printers/" "NOMBRE_IMPRESORA\"." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "La interfaz web está desactivada en este momento. Ejecute \"cupsctl " "WebInterface=yes\" para activarla." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "No se admite el uso del valor which-jobs \"%s\"." msgid "There are too many subscriptions." msgstr "Hay demasiadas subscripciones." msgid "There was an unrecoverable USB error." msgstr "Ha habido un error USB irrecuperable." msgid "Thermal Transfer Media" msgstr "Soporte de transferencia térmica" msgid "Too many active jobs." msgstr "Demasiados trabajos activos." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Demasiados valores de job-sheets (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Demasiados valores printer-state-reasons (%d > %d)." msgid "Transparency" msgstr "Transparencia" msgid "Tray" msgstr "Bandeja" msgid "Tray 1" msgstr "Bandeja 1" msgid "Tray 2" msgstr "Bandeja 2" msgid "Tray 3" msgstr "Bandeja 3" msgid "Tray 4" msgstr "Bandeja 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "URI demasiado largo" msgid "URI too large" msgstr "URI demasiado grande" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "Libro Mayor, 17 x 11 pulg." msgid "US Legal" msgstr "Legal EE.UU." msgid "US Legal Oversize" msgstr "Legal EE.UU. Extragrande" msgid "US Letter" msgstr "Carta EE.UU." msgid "US Letter Long Edge" msgstr "Carta EE.UU. lado largo" msgid "US Letter Oversize" msgstr "Carta EE.UU. Extragrande" msgid "US Letter Oversize Long Edge" msgstr "Carta EE.UU. Extragrande lado largo" msgid "US Letter Small" msgstr "Carta EE.UU. Pequeña" msgid "Unable to access cupsd.conf file" msgstr "No se ha podido acceder al archivo cupsd.conf" msgid "Unable to access help file." msgstr "No se ha podido acceder al archivo de ayuda." msgid "Unable to add class" msgstr "No se ha podido añadir la clase" msgid "Unable to add document to print job." msgstr "No se ha podido añadir el documento al trabajo de impresión." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "No se ha podido añadir el trabajo para el destino \"%s\"." msgid "Unable to add printer" msgstr "No se ha podido añadir la impresora" msgid "Unable to allocate memory for file types." msgstr "No se ha podido reservar memoria para tipos de archivo." msgid "Unable to allocate memory for page info" msgstr "No se ha podido reservar memoria para la información de página." msgid "Unable to allocate memory for pages array" msgstr "No se ha podido reservar memoria para la secuencia de páginas" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "No se ha podido cancelar el trabajo de impresión." msgid "Unable to change printer" msgstr "No se ha podido cambiar la impresora" msgid "Unable to change printer-is-shared attribute" msgstr "No se ha podido cambiar el atributo printer-is-shared" msgid "Unable to change server settings" msgstr "No se ha podido cambiar la configuración del servidor" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "No se ha podido compilar la expresión regular mimeMediaType: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "No se ha podido compilar la expresión regular naturalLanguage: %s." msgid "Unable to configure printer options." msgstr "No se han podido configurar las opciones de impresión." msgid "Unable to connect to host." msgstr "No se ha podido conectar al equipo." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "No se ha podido contactar con la impresora; poniendo en cola en la siguiente " "impresora de la clase." #, c-format msgid "Unable to copy PPD file - %s" msgstr "No se ha podido copiar el archivo PPD - %s" msgid "Unable to copy PPD file." msgstr "No se ha podido copiar el archivo PPD." msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "No se ha podido crear printer-uri" msgid "Unable to create printer." msgstr "No se ha podido crear la impresora." msgid "Unable to create server credentials." msgstr "No se han podido crear las credenciales del servidor." #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "No se ha podido crear el archivo temporal" msgid "Unable to delete class" msgstr "No se ha podido borrar la clase" msgid "Unable to delete printer" msgstr "No se ha podido borrar la impresora" msgid "Unable to do maintenance command" msgstr "No se ha podido realizar el comando de mantenimiento" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "No se pueden editar archivos cupsd.conf mayores de 1MB" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (cadena " "certificado incorrecta)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (el certificado " "aún no es válido)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (certificado " "caducado)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (el nombre de " "equipo no coincide)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (el par cortó " "la conexión antes de responder)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (certificado " "auto-firmado)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "No se ha podido establecer una conexión segura con el equipo (certificado no " "seguro)." msgid "Unable to establish a secure connection to host." msgstr "No se ha podido establecer una conexión segura al equipo." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "No se ha podido encontrar destino para el trabajo" msgid "Unable to find printer." msgstr "No se ha podido encontrar la impresora." msgid "Unable to find server credentials." msgstr "No se han podido encontrar las credenciales del servidor." msgid "Unable to get backend exit status." msgstr "No se ha podido obtener el estado de salida del programa backend." msgid "Unable to get class list" msgstr "No se ha podido obtener la lista de clases" msgid "Unable to get class status" msgstr "No se ha podido obtener el estado de la clase" msgid "Unable to get list of printer drivers" msgstr "No se ha podido obtener la lista de controladores de impresora" msgid "Unable to get printer attributes" msgstr "No se han podido obtener los atributos de la impresora" msgid "Unable to get printer list" msgstr "No se ha podido obtener la lista de impresoras" msgid "Unable to get printer status" msgstr "No se ha podido obtener el estado de la impresora" msgid "Unable to get printer status." msgstr "No se ha podido obtener el estado de la impresora." msgid "Unable to load help index." msgstr "No se ha podido cargar el índice de ayuda." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "No se ha podido localizar la impresora \"%s\"." msgid "Unable to locate printer." msgstr "No se ha podido localizar la impresora." msgid "Unable to modify class" msgstr "No se ha podido modificar la clase" msgid "Unable to modify printer" msgstr "No se ha podido modificar la impresora" msgid "Unable to move job" msgstr "No se ha podido mover el trabajo" msgid "Unable to move jobs" msgstr "No se han podido mover los trabajos" msgid "Unable to open PPD file" msgstr "No se ha podido abrir el archivo PPD" msgid "Unable to open cupsd.conf file:" msgstr "No se ha podido abrir el archivo cupsd.conf:" msgid "Unable to open device file" msgstr "No se ha podido abrir el archivo de dispositivo" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "No se ha podido abrir el documento #%d del trabajo #%d." msgid "Unable to open help file." msgstr "No se ha podido abrir el archivo de ayuda." msgid "Unable to open print file" msgstr "No se ha podido abrir el archivo de impresión" msgid "Unable to open raster file" msgstr "No se ha podido abrir el archivo de trama de datos (raster)" msgid "Unable to print test page" msgstr "No se ha podido imprimir la página de prueba" msgid "Unable to read print data." msgstr "No se han podido leer los datos de impresión." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "No se ha podido renombrar el archivo del documento de trabajo." msgid "Unable to resolve printer-uri." msgstr "No se ha podido resolver printer-uri." msgid "Unable to see in file" msgstr "No se ha podido mirar en el archivo" msgid "Unable to send command to printer driver" msgstr "No se ha podido enviar un comando al controlador de la impresora" msgid "Unable to send data to printer." msgstr "No se han podido enviar datos a la impresora." msgid "Unable to set options" msgstr "No se han podido cambiar las opciones" msgid "Unable to set server default" msgstr "No se ha podido establecer el servidor predeterminado" msgid "Unable to start backend process." msgstr "No se ha podido iniciar el proceso backend." msgid "Unable to upload cupsd.conf file" msgstr "No se ha podido enviar el archivo cupsd.conf" msgid "Unable to use legacy USB class driver." msgstr "" "No se ha podido usar el controlador de dispositivo de clase USB obsoleto." msgid "Unable to write print data" msgstr "No se han podido escribir los datos de impresión" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "No se han podido escribir los datos de impresión sin comprimir: %s" msgid "Unauthorized" msgstr "No autorizado" msgid "Units" msgstr "Unidades" msgid "Unknown" msgstr "Desconocido" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Preferencia \"%s\" desconocida para la opción \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Valor de opción de cifrado \"%s\" desconocida." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Orden de archivos \"%s\" desconocido." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Carácter de formato \"%c\" desconocido." msgid "Unknown hash algorithm." msgstr "Algoritmo de hash desconocido." msgid "Unknown media size name." msgstr "Nombre de tamaño de papel desconocido." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Opción \"%s\" con valor \"%s\" desconocida." #, c-format msgid "Unknown option \"%s\"." msgstr "Opción \"%s\" desconocida." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Modo de impresión \"%s\" desconocido." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "printer-error-policy \"%s\" incorrecto." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "printer-op-policy \"%s\" incorrecto." msgid "Unknown request method." msgstr "Método de solicitud desconocido." msgid "Unknown request version." msgstr "Versión de solicitud desconocida." msgid "Unknown scheme in URI" msgstr "Esquema en URI desconocido" msgid "Unknown service name." msgstr "Nombre de servicio desconocido." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Valor de opción de versión \"%s\" desconocida." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Valor 'compression' \"%s\" no implementado." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Valor 'document-format' \"%s\" no implementado." msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "Valor 'job-name' no implementado." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Juego de caracteres \"%s\" no implementado." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Compresión \"%s\" no implementada." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "document-format \"%s\" no implementado." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "document-format \"%s/%s\" no implementado." #, c-format msgid "Unsupported format \"%s\"." msgstr "Formato \"%s\" no implementado." msgid "Unsupported margins." msgstr "Márgenes no implementados." msgid "Unsupported media value." msgstr "Valor del medio no implementado." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "" "Valor de number-up (páginas por hoja) %d no implementado; usando number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "Valor de number-up-layout (disposición de páginas por hoja) %s no " "implementado; usando number-up-layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" "Valor de page-border (borde de página) %s no implementado; usando page-" "border=none (ninguno)." msgid "Unsupported raster data." msgstr "Trama de datos no implementados." msgid "Unsupported value type" msgstr "Tipo de valor no implementado" msgid "Upgrade Required" msgstr "Se requiere actualización" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Uso: %s job-id usuario título copias opciones [archivo]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Uso: cupsctl [opciones] [param=valor ... paramN=valorN]" msgid "Usage: cupsd [options]" msgstr "Uso: cupsd [opciones]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "Uso: cupsfilter [ opciones ] [ -- ] nombre_archivo" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "Uso: ippfind [opciones] regtipo[,subtipo][.dominio.] ... [expresión]\n" " ippfind [opciones] nombre[.regtipo[.dominio.]] ... [expresión]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Uso: ipptool [opciones] URI nombre_archivo [ ... nombre_archivoN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Uso: ppdc [opciones] nombre_archivo.drv [ ... nombre_archivoN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Uso: ppdhtml [opciones] nombre_archivo.drv >nombre_archivo.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Uso: ppdi [opciones] nombre_archivo.ppd [ ... nombre_archivoN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "" "Uso: ppdmerge [opciones] nombre_archivo.ppd [ ... nombre_archivoN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... " "nombre_archivoN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Uso: snmp [equipo-o-dirección-ip]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Valor usa una longitud indefinida" msgid "VarBind uses indefinite length" msgstr "VarBind usa una longitud indefinida" msgid "Version uses indefinite length" msgstr "Versión usa una longitud indefinida" msgid "Waiting for job to complete." msgstr "Esperando a que finalice el trabajo." msgid "Waiting for printer to become available." msgstr "Esperando a que la impresora esté disponible." msgid "Waiting for printer to finish." msgstr "Esperando a que finalice la impresora." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "La interfaz web está desactivada." msgid "Yes" msgstr "Si" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Debe acceder a esta página usando el URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Impresora de etiquetas ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "cancelado" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "cancelado" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "completado" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "Ha fallado al ejecutarse cups-deviced." msgid "cups-driverd failed to execute." msgstr "Ha fallado al ejecutarse cups-driverd." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: No se ha podido conectar al servidor: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: Opción \"%s\" desconocida" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: Opción \"-%c\" desconocida" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" "cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c" "\"." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" "cupsd: Se esperaba el nombre de archivo cups-files.conf tras la opción \"-s" "\"." msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" "cupsd: El uso bajo-demanda no está compilado. Funcionando en modo normal." msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: No se permite nombre de archivo cups-files.conf relativo." msgid "cupsd: Unable to get current directory." msgstr "cupsd: No se ha podido obtener el directorio actual." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: No se ha podido obtener la ruta al archivo cups-files.conf." #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: Argumento \"%s\" desconocido - cancelando." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: Opción \"%c\" desconocida - cancelando." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: Número de documento %d no válido." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: ID de trabajo %d no válida." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: Solo se puede especificar un nombre de archivo." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: No se ha podido obtener el archivo del trabajo - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: La opción -q es incompatible con la opción -v." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: La opción -v es incompatible con la opción -q." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "dispositivo para %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "dispositivo para %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index usa una longitud indefinida" msgid "error-status uses indefinite length" msgstr "error-status usa una longitud indefinida" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "retenido" msgid "help\t\tGet help on commands." msgstr "help\t\tProporciona ayuda sobre los comandos." msgid "idle" msgstr "inactiva" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: Expresión regular incorrecta: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: No se puede usar --and tras --or." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: Se esperaba un nombre de clave tras %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: Se esperaba un intervalo de puertos tras %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: Se esperaba un programa tras %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: Se esperaba un punto y coma tras %s." msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: Falta la llave de cierre en la substitución." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Falta el paréntesis de cierre." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: Falta una expresión antes de \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: Falta una expresión antes de \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: Falta un nombre de clave tras %s." #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "ippfind: Falta el paréntesis de apertura." #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: Falta un programa tras %s." #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: Falta una expresión regular tras %s." #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: Falta un punto y coma tras %s." msgid "ippfind: Out of memory." msgstr "ippfind: Sin memoria." msgid "ippfind: Too many parenthesis." msgstr "ippfind: Demasiados paréntesis." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: No se ha podido examinar o resolver: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: No se ha podido ejecutar \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: No se ha podido usar Bonjour: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: Variable desconocida \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "ipptool: \"-i\" y \"-n\" no son compatibles con \"-P\" y \"-X\"." #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: Número de segundos no válido para \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "ipptool: Sólo se puede especificar un URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: Falta el contador para \"-n\"." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: Falta el nombre del archivo para \"-f\"." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: Falta un nombre=valor para \"-d\"." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: Falta el número de segundos para \"-i\"." msgid "ipptool: URI required before test file." msgstr "ipptool: Se requiere un URI antes del archivo de prueba." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "Falta el atributo job-printer-uri." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "" "lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "lpadmin: Se esperaba un PPD tras la opción \"-%c\"." msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin: Se esperaba allow/deny:lista_usuarios tras la opción \"-u\"." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: Se esperaba una clase tras la opción \"-r\"." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: Se esperaba un nombre de clase tras la opción \"-c\"." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: Se esperaba una descripción tras la opción \"-D\"." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: Se esperaba un URI de dispositivo tras la opción \"-v\"." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: Se esperaba(n) tipo(s) de archivo(s) tras la opción \"-l\"." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: Se esperaba un nombre de equipo tras la opción \"-h\"." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: Se esperaba una ubicación tras la opción \"-L\"." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: Se esperaba un modelo tras la opción \"-m\"." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: Se esperaba un nombre tras la opción \"-R\"." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: Se esperaba un nombre=valor tras la opción \"-o\"." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: Se esperaba una impresora tras la opción \"-p\"." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: Se esperaba un nombre de impresora tras la opción \"-d\"." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: Se esperaba una impresora o clase tras la opción \"-x\"." msgid "lpadmin: No member names were seen." msgstr "lpadmin: No se han visto nombres de miembros." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: La impresora %s ya es miembro de la clase %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: La impresora %s no es miembro de la clase %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "" "lpadmin: El nombre de la impresora sólo puede contener caracteres " "imprimibles." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: No se ha podido añadir una impresora a la clase:\n" " Debe especificar un nombre de impresora primero." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: No se ha podido conectar al servidor: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: No se ha podido crear el archivo temporal" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: No se ha podido borrar la opción:\n" " Debe especificar un nombre de impresora primero." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" "lpadmin: No se ha podido abrir el archivo PPD: \"%s\": %s en la línea %d." msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: No se ha podido quitar una impresora de la clase:\n" " Debe especificar un nombre de impresora primero." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: No se han podido establecer las opciones de la impresora:\n" " Debe especificar un nombre de impresora primero." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: Opción allow/deny desconocida \"%s\"." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: Argumento \"%s\" desconocido." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: Opción \"%c\" desconocida." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" "lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras \"--device-id\"." msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: Se esperaba un idioma tras \"--language\"." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: Se esperaba marca y modelo tras \"--make-and-model\"." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: Se esperaba una cadena de producto tras \"--product\"." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo: Se esperaba una lista de esquemas tras \"--exclude-schemes\"." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo: Se esperaba una lista de esquemas tras \"--include-schemes\"." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: Se esperaba un tiempo de espera tras \"--timeout\"." #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: No se ha podido conectar al servidor: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: Argumento \"%s\" desconocido." msgid "lpoptions: No printers." msgstr "lpoptions: No hay impresoras." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: No se ha podido añadir la impresora o la instancia: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: No se ha podido obtener el archivo PPD para %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: No se ha podido abrir el archivo PPD para %s." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: Impresora o clase desconocida." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: error - Los nombre de variable de entorno %s no existen en el " "destino \"%s\"." #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "miembros de la clase %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "no hay entradas" msgid "no system default destination" msgstr "no hay un destino predeterminado del sistema" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "notify-events no especificado." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "El URI notify-recipient-uri \"%s\" ya está usado." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "El URI notify-recipient-uri \"%s\" usa un esquema desconocido." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "pendiente" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: Añadiendo directorio include \"%s\"." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: Añadiendo/actualizando texto UI desde %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: Valor lógico (%s) incorrecto en línea %d de %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: Atributo de fuente incorrecto: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: Resolución de nombre \"%s\" incorrecta en línea %d de %s." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: Clave de estado %s incorrecta en línea %d de %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "ppdc: Sustitución de variable ($%c) errónea en la línea %d de %s." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc: Selección encontrada en línea %d de %s sin opciones." #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: #po duplicado para código regional %s en línea %d de %s." #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: Se esperaba una definición de filtro en la línea %d de %s." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: Se esperaba un nombre de programa en la línea %d de %s." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: Se esperaba un valor lógico en la línea %d de %s." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" "ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: Se esperaba un código apropiado en la línea %d de %s." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: Se esperaba un nombre/texto apropiado en la línea %d de %s." #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" "ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "ppdc: Se esperaba colorspace para ColorModel en la línea %d de %s." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: Se esperaba compresión para ColorModel en la línea %d de %s." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea " "%d de %s." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la " "línea %d de %s." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc: Se esperaba un tipo dúplex tras Duplex en la línea %d de %s." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: Se esperaba una codificación tras Font en la línea %d de %s." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" "ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: Se esperaba un nombre/texto de grupo en la línea %d de %s." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: Se esperaba un nombre de archivo include en la línea %d de %s." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: Se esperaba un número entero en la línea %d de %s." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: Se esperaba un código regional tras #po en la línea %d de %s." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras %s en la línea %d de %s." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras FileName en la línea %d de %s." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras Font en la línea %d de %s." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras Manufacturer en la línea %d de %s." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras MediaSize en la línea %d de %s." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras ModelName en la línea %d de %s." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: Se esperaba un nombre tras PCFileName en la línea %d de %s." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: Se esperaba un nombre/texto tras %s en la línea %d de %s." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" "ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" "ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea " "%d de %s." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: Se esperaba una opción de nombre/texto en la línea %d de %s." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: Se esperaba una sección de opciones en la línea %d de %s." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: Se esperaba un tipo de opción en la línea %d de %s." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %s." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: Se esperaba una cadena entrecomillada en la línea %d de %s." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: Se esperaba un número real en la línea %d de %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea " "%d de %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la " "línea %d de %s." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: Se esperaba un selector tras %s en la línea %d de %s." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: Se esperaba un estado tras Font en la línea %d de %s." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: Se esperaba una cadena tras Copyright en la línea %d de %s." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: Se esperaba una cadena tras Version en la línea %d de %s." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: Se esperaban dos nombres de opciones en la línea %d de %s." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: Se esperaba un valor tras %s en la línea %d de %s." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: Se esperaba una versión tras Font en la línea %d de %s." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: Nombre de archivo #include/#po incorrecto \"%s\"." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: Coste incorrecto para el filtro en la línea %d de %s." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" "ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de " "%s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: Sección de opción incorrecta \"%s\" en la línea %d de %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: Tipo de opción incorrecta \"%s\" en la línea %d de %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: Cargando archivo de información de controlador \"%s\"." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: Cargando mensajes del idioma \"%s\"." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: Cargando mensajes desde \"%s\"." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: Falta un #endif al final de \"%s\"." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: Falta un #if en la línea %d de %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" "ppdc: Se necesita una línea msgid antes de cualquier cadena de traducción en " "línea %d de %s." #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: No se ha proporcionado catálogo de mensajes para el idioma %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" "ppdc: Opción %s definida en dos diferentes grupos en la línea %d de %s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "ppdc: Opción %s redefinida con un tipo diferente en la línea %d de %s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc: Opción de restricción debe *name en línea %d de %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: Demasiados #if anidados en la línea %d de %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: No se ha podido crear el archivo PPD \"%s\" - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: No se ha podido crear el directorio de salida %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: No se han podido crear canales (pipes) de salida: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: No se ha podido ejecutar cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" "ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" "ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de " "%s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: No se ha podido encontrar localización para \"%s\" - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: No se ha podido cargar el archivo de localización \"%s\" - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: No se pudo abrir %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: Variable no definida (%s) en la línea %d de %s." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: Texto inesperado en la línea %d del %s." #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: Tipo de controlador desconocido %s en la línea %d de %s." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: Tipo dúplex desconocido \"%s\" en la línea %d de %s." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: Tamaño de papel desconocido \"%s\" en la línea %d de %s." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: Formato del catálogo de mensajes para \"%s\" desconocido." #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: Elemento desconocido \"%s\" visto en la línea %d de %s." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea " "%d de %s." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc: Cadena que comienza por %c sin terminar en la línea %d de %s." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: Advertencia - nombre de archivo superpuesto \"%s\"." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: Escribiendo %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: Escribiendo archivos PPD al directorio \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: LanguageVersion \"%s\" incorrecto en %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: Ignorando archivo PPD %s." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: No se ha podido hacer copia de respaldo de %s a %s - %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "la impresora %s está deshabilitada desde %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "la impresora %s está inactiva. activada desde %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "la impresora %s está ahora imprimiendo %s-%d. activada desde %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "la impresora %s/%s está desactivada desde %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "la impresora %s/%s está inactiva. activada desde %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "la impresora %s/%s está ahora imprimiendo %s-%d. activada desde %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "en proceso" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "la id solicitada es %s-%d (%d archivo(s))" msgid "request-id uses indefinite length" msgstr "request-id usa una longitud indefinida" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "el planificador de tareas no se está ejecutando" msgid "scheduler is running" msgstr "el planificador de tareas se está ejecutando" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "estado de %s ha fallado: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tMuestra el estado del demonio (daemon) y la cola." #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "parada" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "destino predeterminado del sistema: %s" #, c-format msgid "system default destination: %s/%s" msgstr "destino predeterminado del sistema: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "desconocido" msgid "untitled" msgstr "sin título" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings usa una longitud indefinida" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "" #~ "Se requiere una contraseña Samba para exportar los controladores de " #~ "impresora" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "Se requiere un nombre de usuario Samba para exportar los controladores de " #~ "impresora" #~ msgid "Export Printers to Samba" #~ msgstr "Exportar impresoras a Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: No se puede establecer Listen o Port directamente." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: No se ha podido abrir el archivo PPD \"%s\" - %s" cups-2.3.1/locale/cups_it.po000664 000765 000024 00001225067 13574721672 016061 0ustar00mikestaff000000 000000 # # Italian message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Giovanni Scafora , 2013. msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2013-07-14 12:00+0200\n" "Last-Translator: Giovanni Scafora \n" "Language-Team: Italian - Arch Linux Italian Team \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(tutti)" msgid "\t\t(none)" msgstr "\t\t(nessuno)" #, c-format msgid "\t%d entries" msgstr "\t%d voci" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tDopo un errore: continua" #, c-format msgid "\tAlerts: %s" msgstr "\tAvvisi: %s" msgid "\tBanner required" msgstr "\tBanner richiesto" msgid "\tCharset sets:" msgstr "\tSet di caratteri:" msgid "\tConnection: direct" msgstr "\tConnessione: diretta" msgid "\tConnection: remote" msgstr "\tConnessione: remota" msgid "\tContent types: any" msgstr "\tTipi di contenuto: qualsiasi" msgid "\tDefault page size:" msgstr "\tDimensione predefinite della pagina:" msgid "\tDefault pitch:" msgstr "\tTono predefinito:" msgid "\tDefault port settings:" msgstr "\tImpostazioni predefinite della porta:" #, c-format msgid "\tDescription: %s" msgstr "\tDescrizione: %s" msgid "\tForm mounted:" msgstr "\tModulo installato:" msgid "\tForms allowed:" msgstr "\tModuli consentiti:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tInterfaccia: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tInterfaccia: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tPosizione: %s" msgid "\tOn fault: no alert" msgstr "\tIn caso di errore: nessun avviso" msgid "\tPrinter types: unknown" msgstr "\tTipi di stampanti: sconosciuto" #, c-format msgid "\tStatus: %s" msgstr "\tStato: %s" msgid "\tUsers allowed:" msgstr "\tUtenti autorizzati:" msgid "\tUsers denied:" msgstr "\tUtenti non autorizzati:" msgid "\tdaemon present" msgstr "\tdemone presente" msgid "\tno entries" msgstr "\tnessuna voce" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tla stampante è sul dispositivo '%s' velocità -1" msgid "\tprinting is disabled" msgstr "\tla stampa è disabilitata" msgid "\tprinting is enabled" msgstr "\tla stampa è abilitata" #, c-format msgid "\tqueued for %s" msgstr "\tin coda per %s" msgid "\tqueuing is disabled" msgstr "\tla coda è disabilitata" msgid "\tqueuing is enabled" msgstr "\tla coda è abilitata" msgid "\treason unknown" msgstr "\tmotivo sconosciuto" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " RISULTATI DETTAGLIATI DEL TEST DI CONFORMITÀ" msgid " REF: Page 15, section 3.1." msgstr " RIF: pagina 15, sezione 3.1." msgid " REF: Page 15, section 3.2." msgstr " RIF: pagina 15, sezione 3.2." msgid " REF: Page 19, section 3.3." msgstr " RIF: pagina 19, sezione 3.3." msgid " REF: Page 20, section 3.4." msgstr " RIF: pagina 20, sezione 3.4." msgid " REF: Page 27, section 3.5." msgstr " RIF: pagina 27, sezione 3.5." msgid " REF: Page 42, section 5.2." msgstr " RIF: pagina 42, sezione 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " RIF: pagine 16-17, sezione 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " RIF: pagine 42-45, sezione 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " RIF: pagine 45-46, sezione 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " RIF: pagine 48-49, sezione 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " RIF: pagine 52-54, sezione 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f byte" #, c-format msgid " PASS Default%s" msgstr " PASS Default%s" msgid " PASS DefaultImageableArea" msgstr " PASS DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " PASS DefaultPaperDimension" msgid " PASS FileVersion" msgstr " PASS FileVersion" msgid " PASS FormatVersion" msgstr " PASS FormatVersion" msgid " PASS LanguageEncoding" msgstr " PASS LanguageEncoding" msgid " PASS LanguageVersion" msgstr " PASS LanguageVersion" msgid " PASS Manufacturer" msgstr " PASS Manufacturer" msgid " PASS ModelName" msgstr " PASS ModelName" msgid " PASS NickName" msgstr " PASS NickName" msgid " PASS PCFileName" msgstr " PASS PCFileName" msgid " PASS PSVersion" msgstr " PASS PSVersion" msgid " PASS PageRegion" msgstr " PASS PageRegion" msgid " PASS PageSize" msgstr " PASS PageSize" msgid " PASS Product" msgstr " PASS Product" msgid " PASS ShortNickName" msgstr " PASS ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " WARN %s non ha opzioni corrispondenti." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " WARN %s condivide un prefisso comune con %s\n" " RIF: pagina 15, sezione 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " WARN La parola chiave dell'opzione duplex %s potrebbe non " "funzionare come previsto e dovrebbe essere chiamata Duplex.\n" " RIF: pagina 122, sezione 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" " WARN Il file contiene un insieme di righe che terminano con CR, " "LF e CR LF." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " WARN LanguageEncoding è richiesto dalle specifiche PPD 4.3.\n" " RIF: pagine 56-57, sezione 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " WARN La riga %d contiene solo spazi." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " WARN Manufacturer è richiesto dalle specifiche PPD 4.3.\n" " RIF: pagine 58-59, sezione 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " WARN I file PPD per sistemi diversi da Windows dovrebbero " "utilizzare solo righe terminanti con LF e non con CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " WARN Versione obsoleta di PPD %.1f.\n" " RIF: pagina 42, sezione 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " WARN PCFileName più lungo di 8.3 vìola le specifiche PPD.\n" " RIF: pagine 61-62, sezione 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " WARN PCFileName dovrebbe contenere un nome del file unico.\n" " RIF: pagine 61-62, sezione 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " WARN Il protocollo contiene PJL ma gli attributi di JCL non sono " "impostati.\n" " RIF: pagine 78-79, sezione 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " WARN Il protocollo contiene entrambi PJL e BCP; è previsto TBCP.\n" " RIF: pagine 78-79, sezione 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " WARN ShortNickName richiesto dalle specifiche di PPD 4.3.\n" " RIF: pagine 64-65, sezione 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" confligge con \"%s %s\"\n" " (vincolo=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s non esiste." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s file \"%s\" ha la capitalizzazione sbagliata." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s errata %s scelta %s.\n" " RIF: pagina 122, sezione 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s UTF-8 non è valido \"%s\" la string di traduzione dell'opzione %s, " "scelta %s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "" " %s UTF-8 non è valido \"%s\" la stringa di traduzione dell'opzione %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s valore di cupsFilter non è valido \"%s\"." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s il valore di cupsFilter2 non è valido \"%s\"." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s il valore di cupsICCProfile non è valido %s." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s il valore di cupsPreFilter non è valido \"%s\"." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s il valore di cupsUIConstraints non è valido %s: \"%s\"" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s la lingua non è valida \"%s\"." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s permessi errati sul file %s \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s ortografia errata di %s - dovrebbe essere %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" " %s non è possibile passare entrambi APScanAppPath e APScanAppBundleID." #, c-format msgid " %s Default choices conflicting." msgstr " %s le scelte predefinite confliggono." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s cupsUIConstraints è vuota %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr "" " %s manca \"%s\" la stringa di traduzione dell'opzione %s, scelta %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s manca \"%s\" la stringa di traduzione dell'opzione %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s manca il file %s \"%s\"." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s manca l'opzione RICHIESTA PageRegion.\n" " RIF: pagina 100, sezione 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s manca l'opzione RICHIESTA PageSize.\n" " RIF: pagina 99, sezione 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s manca la scelta *%s %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s manca la scelta *%s %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s manca cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s manca l'opzione %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %s manca l'opzione %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s Nessuna traduzione base \"%s\" è inclusa nel file." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s RICHIESTA %s non definisce la scelta None.\n" " RIF: pagina 122, sezione 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %s dimensione \"%s\" definita per %s ma non per %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "" " %s dimensione \"%s\" presenta delle dimensioni inaspettate (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s dimensione \"%s\" dovrebbe essere \"%s\"." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" " %s dimensione \"%s\" dovrebbe essere il nome standard di Adobe \"%s\"." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s cupsICCProfile %s il valore dell'hash collide con %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s causa un loop." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr " %s cupsUIResolver %s non elenca almeno due opzioni differenti." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **FAIL** %s deve essere 1284DeviceID\n" " RIF: pagina 72, sezione 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **FAIL** Valore predefinito errato%s %s\n" " RIF: pagina 40, sezione 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** DefaultImageableArea non è valido %s\n" " RIF: pagina 102, sezione 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** DefaultPaperDimension non è valido %s\n" " RIF: pagina 103, sezione 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** FileVersion non è valido \"%s\"\n" " RIF: pagina 56, sezione 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** FormatVersion non è valido \"%s\"\n" " RIF: pagina 56, sezione 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **FAIL** l'attributo di JobPatchFile nel file non è valido\n" " RIF: pagina 24, sezione 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" " **FAIL** LanguageEncoding non è valido %s - deve essere ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr " **FAIL** LanguageVersion non è valido %s - deve essere Inglese." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **FAIL** Manufacturer non è valido (dovrebbe essere \"%s\")\n" " RIF: pagina 211, tabella D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FAIL** ModelName non è valido - \"%c\" non consentito nella " "stringa.\n" " RIF: pagine 59-60, sezione 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FAIL** PSVersion non è valido - non è una \"(stringa) intera\".\n" " RIF: pagine 62-64, sezione 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **FAIL** Product non è valido - non è una \"(stringa)\".\n" " RIF: pagina 62, sezione 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **FAIL** ShortNickName non è valido - più lungo di 31 caratteri.\n" " RIF: pagine 64-65, sezione 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **FAIL** L'opzione %s non è valida scelta %s\n" " RIF: pagina 84, sezione 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" " **FAIL** Il codice dell'opzione predefinita non può essere " "interpretato: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **FAIL** La stringa di traduzione predefinita dell'opzione %s scelta " "%s contiene caratteri a 8-bit." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **FAIL** La stringa di traduzione predefinita dell'opzione %s " "contiene caratteri a 8-bit." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr " **FAIL** I nomi dei gruppi %s e %s differiscono solo per caso." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" " **FAIL** Occorrenze multiple dell'opzione %s nome della scelta %s." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" " **FAIL** I nomi delle scelte %s e %s dell'opzione %s differiscono " "solo per caso." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" " **FAIL** I nomi delle opzioni %s e %s differiscono solo per caso." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **FAIL** RICHIESTA predefinita%s\n" " RIF: pagina 40, sezione 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** RICHIESTA DefaultImageableArea\n" " RIF: pagina 102, sezione 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** RICHIESTA DefaultPaperDimension\n" " RIF: pagina 103, sezione 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** RICHIESTA FileVersion\n" " RIF: pagina 56, sezione 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **FAIL** RICHIESTA FormatVersion\n" " RIF: pagina 56, sezione 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **FAIL** RICHIESTA ImageableArea per PageSize %s\n" " RIF: pagina 41, sezione 5.\n" " RIF: pagina 102, sezione 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **FAIL** RICHIESTA LanguageEncoding\n" " RIF: pagina 56-57, sezione 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **FAIL** RICHIESTA LanguageVersion\n" " RIF: pagine 57-58, sezione 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **FAIL** RICHIESTA Manufacturer\n" " RIF: pagine 58-59, sezione 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **FAIL** RICHIESTA ModelName\n" " RIF: pagine 59-60, sezione 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **FAIL** RICHIESTA NickName\n" " RIF: pagina 60, sezione 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **FAIL** RICHIESTA PCFileName\n" " RIF: pagine 61-62, sezione 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **FAIL** RICHIESTA PSVersion\n" " RIF: pagine 62-64, sezione 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **FAIL** RICHIESTA PageRegion\n" " RIF: pagina 100, sezione 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **FAIL** RICHIESTA PageSize\n" " RIF: pagina 41, sezione 5.\n" " RIF: pagina 99, sezione 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **FAIL** RICHIESTA PageSize\n" " RIF: pagine 99-100, sezione 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **FAIL** RICHIESTA PaperDimension per PageSize %s\n" " RIF: pagina 41, sezione 5.\n" " RIF: pagina 103, sezione 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **FAIL** RICHIESTA Product\n" " RIF: pagina 62, sezione 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **FAIL** RICHIESTA ShortNickName\n" " RIF: pagina 64-65, sezione 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr " **FAIL** Non è possibile aprire il file PPD - %s alla riga %d." #, c-format msgid " %d ERRORS FOUND" msgstr " %d SONO STATI TROVATI DEGLI ERRORI" msgid " NO ERRORS FOUND" msgstr " NON SONO STATI TROVATI ERRORI" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Termina righe con CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Termina righe con CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr "" msgid " -D Remove the input file when finished." msgstr "" " -D Rimuovi il file di input una volta terminato." msgid " -D name=value Set named variable to value." msgstr " -D name=value Imposta la variabile chiamata al valore." msgid " -I include-dir Add include directory to search path." msgstr "" " -I include-dir Aggiunge la directory include al percorso della " "ricerca." msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd Imposta il file PPD." msgid " -U username Specify username." msgstr " -U username Specifica l'username." msgid " -c catalog.po Load the specified message catalog." msgstr "" " -c catalog.po Carica il catalogo del messaggio specificato." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" msgid " -d output-dir Specify the output directory." msgstr " -d output-dir Specifica la directory di output." msgid " -d printer Use the named printer." msgstr " -d printer Utilizza la stampante specificata." msgid " -e Use every filter from the PPD file." msgstr " -e Utilizza tutti i filtri dal file PPD." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i mime/type Imposta il tipo di MIME di input (altrimenti auto-" "typed)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j job-id[,N] File del filtro N dal processo specificato (quello " "predefinito è il file 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] Specifica la lingua(e) (locale) di output." msgid " -m Use the ModelName value as the filename." msgstr " -m Utilizza il valore di ModelName come file." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type Imposta il tipo di MIME di output (altrimenti " "application/pdf)." msgid " -n copies Set number of copies." msgstr " -n copies Imposta il numero di copie." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr " -o filename.drv Imposta un driver (altrimenti ppdi.drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o filename.ppd[.gz] Imposta il file di output (altrimenti stdout)." msgid " -o name=value Set option(s)." msgstr " -o nome=valore Imposta opzione(i)." msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd Imposta il file PPD." msgid " -t Test PPDs instead of generating them." msgstr " -t Prova i PPD invece di generarli." msgid " -t title Set title." msgstr " -t title Imposta il titolo." msgid " -u Remove the PPD file when finished." msgstr " -u Rimuove il file PPD una volta terminato." msgid " -v Be verbose." msgstr " -v Fornisce maggiori dettagli." msgid " -z Compress PPD files using GNU zip." msgstr "" " -z Il file PPD compresso sta utilizzando GNU zip." msgid " FAIL" msgstr " OPERAZIONE NON RIUSCITA CORRETTAMENTE" msgid " PASS" msgstr " OPERAZIONE RIUSCITA CON SUCCESSO" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte" #, c-format msgid "%d x %d mm" msgstr "" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "" #, c-format msgid "%s (%s, %s)" msgstr "" #, c-format msgid "%s (Borderless)" msgstr "" #, c-format msgid "%s (Borderless, %s)" msgstr "" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "" #, c-format msgid "%s accepting requests since %s" msgstr "%s sta accettando richieste da %s" #, c-format msgid "%s cannot be changed." msgstr "%s non può essere modificato" #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s non è implementato dalla versione di CUPS di lpc." #, c-format msgid "%s is not ready" msgstr "%s non è pronta" #, c-format msgid "%s is ready" msgstr "%s è pronta" #, c-format msgid "%s is ready and printing" msgstr "%s è pronta e sta stampando" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s job-id titolo dell'utente opzioni delle copie [file]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s non sta accettando richieste da %s -" #, c-format msgid "%s not supported." msgstr "%s non è supportato." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s sta accettando richieste da %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s non sta accettando richieste da %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [processo %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s non riuscito correttamente: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: la versione %s non è valida per \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: non so cosa fare." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: errore - %s destinazione inesistente dei nomi delle variabili di " "ambiente \"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: errore - aggiungere '/version=1.1' al nome del server." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: errore - l'ID del processo non è valido." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: errore - non è possibile stampare file e alterare le stampe " "simultaneamente." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: errore - non è possibile stampare da stdin se non si fornisce un file o " "un ID del processo." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: errore - è previsto un set di caratteri dopo l'opzione \"-S\"." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: errore - è previsto il tipo di contenuto dopo l'opzione \"-T\"." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: errore - sono previste delle copie dopo l'opzione \"-#\"." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: errore - sono previste delle copie dopo l'opzione \"-n\"." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-P\"." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-d\"." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: errore - è previsto un modulo dopo l'opzione \"-f\"." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: errore - è previsto un nome dopo l'opzione \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: errore - è previsto un hostname dopo l'opzione \"-H\"." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: errore - è previsto un hostname dopo l'opzione \"-h\"." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" "%s: errore - è prevista una lista di modalità di attesa dopo l'opzione \"-y" "\"." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: errore - è previsto un nome dopo l'opzione \"-%c\"." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: errore - è previsto un opzione=valore dopo l'opzione \"-o\"." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: errore - è previsto un elenco di pagine dopo l'opzione \"-P\"." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: errore - è prevista una priorità dopo l'opzione \"-%c\"." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: errore - è previsto un testo del motivo dopo l'opzione \"-r\"." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: errore - è previsto un titolo dopo l'opzione \"-t\"." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: errore - è previsto un username dopo l'opzione \"-U\"." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: errore - è previsto un username dopo l'opzione \"-u\"." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: errore - è previsto un valore dopo l'opzione \"-%c\"." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: errore - deve seguire \"completed\", \"non-completed\" oppure \"all\" " "dopo l'opzione \"-W\"." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: errore - nessuna destinazione predefinita disponibile." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: errore- la priorità deve essere compresa tra 1 e 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: errore - lo scheduler non sta rispondendo." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: errore - troppi file - \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: errore - non è possibile accedere a \"%s\" - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: errore - non è possibile mettere in coda da stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: errore - destinazione sconosciuta \"%s\"." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: errore - destinazione sconosciuta \"%s/%s\"." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: errore - opzione sconosciuta \"%c\"." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: errore - opzione sconosciuta \"%s\"." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: è previsto un ID del processo dopo l'opzione \"-i\"." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: il nome della destinazione non è valido nella lista \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: la stringa del filtro non è valida \"%s\"." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: manca il timeout di \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: manca la versione di \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" "%s: è necessario un ID del processo (\"-i jobid\") prima di \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: nessun filtro per convertire da %s/%s a %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: operazione non riuscita correttamente: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: spiacenti, nessun supporto per la crittografia." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: non è possibile connettersi al server." #, c-format msgid "%s: Unable to contact server." msgstr "%s: non è possibile contattare il server." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: non è possibile determinare il tipo di MIME di \"%s\"." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: non è possibile aprire %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: non è possibile aprire il file PPD: %s alla riga %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" "%s: non è possibile leggere il database del MIME da \"%s\" oppure da \"%s\"." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: destinazione sconosciuta \"%s\"." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: destinazione sconosciuta del tipo di MIME %s/%s." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: opzione sconosciuta \"%c\"." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: opzione sconosciuta \"%s\"." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: opzione sconosciuta \"-%c\"." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: sorgente sconosciuto del tipo di MIME %s/%s." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: attenzione - \"%c\" il formato del modificatore non è supportato - " "l'output potrebbe non essere corretto." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: attenzione - l'opzione del set dei caratteri è stata ignorata." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: attenzione - l'opzione del tipo di contenuto è stata ignorata." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: attenzione - l'opzione del modulo è stata ignorata." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: attenzione - l'opzione modalità è stata ignorata." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 inch/sec." msgid "1.25x0.25\"" msgstr "1.25x0.25\"" msgid "1.25x2.25\"" msgstr "1.25x2.25\"" msgid "1.5 inch/sec." msgstr "1.5 inch/sec." msgid "1.50x0.25\"" msgstr "1.50x0.25\"" msgid "1.50x0.50\"" msgstr "1.50x0.50\"" msgid "1.50x1.00\"" msgstr "1.50x1.00\"" msgid "1.50x2.00\"" msgstr "1.50x2.00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 inches/sec." msgid "10 x 11" msgstr "10 x 11" msgid "10 x 13" msgstr "10 x 13" msgid "10 x 14" msgstr "10 x 14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/sec." msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 inches/sec." msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 inches/sec." msgid "12 x 11" msgstr "12 x 11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/sec." msgid "120x60dpi" msgstr "120x60dpi" msgid "120x72dpi" msgstr "120x72dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/sec." msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/sec." msgid "150dpi" msgstr "150dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 inches/sec." msgid "2-Sided Printing" msgstr "2-Sided Printing" msgid "2.00x0.37\"" msgstr "2.00x0.37\"" msgid "2.00x0.50\"" msgstr "2.00x0.50\"" msgid "2.00x1.00\"" msgstr "2.00x1.00\"" msgid "2.00x1.25\"" msgstr "2.00x1.25\"" msgid "2.00x2.00\"" msgstr "2.00x2.00\"" msgid "2.00x3.00\"" msgstr "2.00x3.00\"" msgid "2.00x4.00\"" msgstr "2.00x4.00\"" msgid "2.00x5.50\"" msgstr "2.00x5.50\"" msgid "2.25x0.50\"" msgstr "2.25x0.50\"" msgid "2.25x1.25\"" msgstr "2.25x1.25\"" msgid "2.25x4.00\"" msgstr "2.25x4.00\"" msgid "2.25x5.50\"" msgstr "2.25x5.50\"" msgid "2.38x5.50\"" msgstr "2.38x5.50\"" msgid "2.5 inches/sec." msgstr "2.5 inches/sec." msgid "2.50x1.00\"" msgstr "2.50x1.00\"" msgid "2.50x2.00\"" msgstr "2.50x2.00\"" msgid "2.75x1.25\"" msgstr "2.75x1.25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/sec." msgid "200 mm/sec." msgstr "200 mm/sec." msgid "203dpi" msgstr "203dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24-Pin Series" msgid "240x72dpi" msgstr "240x72dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/sec." msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 inches/sec." msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00\"" msgid "3.00x1.25\"" msgstr "3.00x1.25\"" msgid "3.00x2.00\"" msgstr "3.00x2.00\"" msgid "3.00x3.00\"" msgstr "3.00x3.00\"" msgid "3.00x5.00\"" msgstr "3.00x5.00\"" msgid "3.25x2.00\"" msgstr "3.25x2.00\"" msgid "3.25x5.00\"" msgstr "3.25x5.00\"" msgid "3.25x5.50\"" msgstr "3.25x5.50\"" msgid "3.25x5.83\"" msgstr "3.25x5.83\"" msgid "3.25x7.83\"" msgstr "3.25x7.83\"" msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "3.5\" Disk" msgid "3.50x1.00\"" msgstr "3.50x1.00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/sec." msgid "300 mm/sec." msgstr "300 mm/sec." msgid "300dpi" msgstr "300dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360dpi" msgid "360x180dpi" msgstr "360x180dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 inches/sec." msgid "4.00x1.00\"" msgstr "4.00x1.00\"" msgid "4.00x13.00\"" msgstr "4.00x13.00\"" msgid "4.00x2.00\"" msgstr "4.00x2.00\"" msgid "4.00x2.50\"" msgstr "4.00x2.50\"" msgid "4.00x3.00\"" msgstr "4.00x3.00\"" msgid "4.00x4.00\"" msgstr "4.00x4.00\"" msgid "4.00x5.00\"" msgstr "4.00x5.00\"" msgid "4.00x6.00\"" msgstr "4.00x6.00\"" msgid "4.00x6.50\"" msgstr "4.00x6.50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/sec." msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 inches/sec." msgid "5 x 7" msgstr "5 x 7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 inches/sec." msgid "6.00x1.00\"" msgstr "6.00x1.00\"" msgid "6.00x2.00\"" msgstr "6.00x2.00\"" msgid "6.00x3.00\"" msgstr "6.00x3.00\"" msgid "6.00x4.00\"" msgstr "6.00x4.00\"" msgid "6.00x5.00\"" msgstr "6.00x5.00\"" msgid "6.00x6.00\"" msgstr "6.00x6.00\"" msgid "6.00x6.50\"" msgstr "6.00x6.50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/sec." msgid "600dpi" msgstr "600dpi" msgid "60dpi" msgstr "60dpi" msgid "60x72dpi" msgstr "60x72dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 inches/sec." msgid "7 x 9" msgstr "7 x 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 inches/sec." msgid "8 x 10" msgstr "8 x 10" msgid "8.00x1.00\"" msgstr "8.00x1.00\"" msgid "8.00x2.00\"" msgstr "8.00x2.00\"" msgid "8.00x3.00\"" msgstr "8.00x3.00\"" msgid "8.00x4.00\"" msgstr "8.00x4.00\"" msgid "8.00x5.00\"" msgstr "8.00x5.00\"" msgid "8.00x6.00\"" msgstr "8.00x6.00\"" msgid "8.00x6.50\"" msgstr "8.00x6.50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sec." msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 inches/sec." msgid "9 x 11" msgstr "9 x 11" msgid "9 x 12" msgstr "9 x 12" msgid "9-Pin Series" msgstr "9-Pin Series" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Aiuto non valido comando sconosciuto." #, c-format msgid "A class named \"%s\" already exists." msgstr "Una classe denominata \"%s\" già esiste." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Una stampante denominata \"%s\" già esiste." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 Long Edge" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 Long Edge" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 Long Edge" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 Long Edge" msgid "A3 Oversize" msgstr "A3 Oversize" msgid "A3 Oversize Long Edge" msgstr "A3 Oversize Long Edge" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 Long Edge" msgid "A4 Oversize" msgstr "A4 Oversize" msgid "A4 Small" msgstr "A4 Small" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 Long Edge" msgid "A5 Oversize" msgstr "A5 Oversize" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 Long Edge" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C Long Edge" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D Long Edge" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E Long Edge" msgid "Accept Jobs" msgstr "Accetta le stampe" msgid "Accepted" msgstr "Accettato" msgid "Add Class" msgstr "Aggiungi una classe" msgid "Add Printer" msgstr "Aggiungi una stampante" msgid "Address" msgstr "Indirizzo" msgid "Administration" msgstr "Amministrazione" msgid "Always" msgstr "Sempre" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Applicatore" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "Tentativo di impostare %s printer-state al valore non valido %d." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "I gruppi degli attributi sono fuori uso (%x < %x)." msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "B5 Oversize" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "Il valore di 'document-format' non è valido \"%s\"." msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Le destinazioni del puntatore NULL non sono valide" msgid "Bad OpenGroup" msgstr "OpenGroup non è valido" msgid "Bad OpenUI/JCLOpenUI" msgstr "OpenUI/JCLOpenUI non è valido" msgid "Bad OrderDependency" msgstr "OrderDependency non è valido" msgid "Bad PPD cache file." msgstr "Il file della cache del PPD non è valido." msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "La richiesta non è valida" msgid "Bad SNMP version number" msgstr "Il numero di versione di SNMP non è valido" msgid "Bad UIConstraints" msgstr "UIConstraints non è valido" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "" #, c-format msgid "Bad copies value %d." msgstr "Il valore %d delle copie non è valido." msgid "Bad custom parameter" msgstr "Il parametro personalizzato non è valido" #, c-format msgid "Bad device-uri \"%s\"." msgstr "Il device-uri \"%s\" non è valido." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Lo schema del device-uri \"%s\" non è valido." #, c-format msgid "Bad document-format \"%s\"." msgstr "Il document-format \"%s\" non è valido." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "Il document-format-default \"%s\" non è valido." msgid "Bad filename buffer" msgstr "Il buffer del file non è valido" msgid "Bad hostname/address in URI" msgstr "" #, c-format msgid "Bad job-name value: %s" msgstr "Il valore di job-name non è valido: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Il valore di job-name non è valido: tipo o conteggio errato." msgid "Bad job-priority value." msgstr "Il valore di job-priority non è valido." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Il valore di job-sheets \"%s\" non è valido." msgid "Bad job-sheets value type." msgstr "Il tipo di valore di job-sheets non è valido." msgid "Bad job-state value." msgstr "Il valore di job-state non è valido." #, c-format msgid "Bad job-uri \"%s\"." msgstr "Il valore di job-uri \"%s\" non è valido." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "Il valore di notify-pull-method \"%s\" non è valido." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "Il valore di notify-recipient-uri \"%s\" non è valido." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Il valore di number-up %d non è valido." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Il valore di page-ranges %d-%d non è valido." msgid "Bad port number in URI" msgstr "" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "Il valore di port-monitor \"%s\" non è valido." #, c-format msgid "Bad printer-state value %d." msgstr "Il valore di printer-state %d non è valido." msgid "Bad printer-uri." msgstr "" #, c-format msgid "Bad request ID %d." msgstr "L'ID della richiesta %d non è valido." #, c-format msgid "Bad request version number %d.%d." msgstr "Il numero della versione richiesta %d.%d non è valido." msgid "Bad resource in URI" msgstr "" msgid "Bad scheme in URI" msgstr "" msgid "Bad username in URI" msgstr "" msgid "Bad value string" msgstr "La stringa ha un valore che non è valido" msgid "Bad/empty URI" msgstr "" msgid "Banners" msgstr "Banner" msgid "Bond Paper" msgstr "Carta per scrivere" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "È previsto un valore booleano per l'opzione waiteof \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "È stato individuato un buffer overflow, operazione annullata." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "CPCL Label Printer" msgid "Cancel Jobs" msgstr "" msgid "Canceling print job." msgstr "Eliminazione del processo di stampa in corso." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "Non è possibile condividere una stampante remota kerberizzata." msgid "Cassette" msgstr "Caricatore" msgid "Change Settings" msgstr "Modifica le impostazioni" #, c-format msgid "Character set \"%s\" not supported." msgstr "Il set di caratteri \"%s\" non è supportato." msgid "Classes" msgstr "Classi" msgid "Clean Print Heads" msgstr "Pulisci le testine della stampante" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job non supporta l'attributo job-uri." msgid "Color" msgstr "Colore" msgid "Color Mode" msgstr "Modalità colore" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "I comandi possono essere abbreviati. I comandi sono:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Il nome della comunità utilizza una lunghezza indefinita" msgid "Connected to printer." msgstr "Connesso alla stampante." msgid "Connecting to printer." msgstr "Connessione alla stampante in corso." msgid "Continue" msgstr "Continua" msgid "Continuous" msgstr "Continuo" msgid "Control file sent successfully." msgstr "Il file del controllo è stato inviato con successo." msgid "Copying print data." msgstr "Copia dei dati di stampa in corso." msgid "Created" msgstr "Creato" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Personalizzato" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Taglia" msgid "Cutter" msgstr "Taglierino" msgid "Dark" msgstr "Scuro" msgid "Darkness" msgstr "Oscurità" msgid "Data file sent successfully." msgstr "I dati sono stati inviati con successo." msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Elimina la classe" msgid "Delete Printer" msgstr "Elimina la stampante" msgid "DeskJet Series" msgstr "DeskJet Series" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "La destinazione \"%s\" non sta accettando le stampe." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Dispositivo: uri = %s\n" " classe = %s\n" " info = %s\n" " marca-e-modello = %s\n" " device-id = %s\n" " posizione = %s" msgid "Direct Thermal Media" msgstr "Direct Thermal Media" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "La directory \"%s\" contiene un path relativo." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "" "La directory \"%s\" presenta dei permessi non sicuri (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "La directory \"%s\" è un file." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "La directory \"%s\" non è disponibile: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Directory \"%s\" permessi OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Disabilitato" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "Il documento #%d non esiste nel processo #%d." msgid "Draft" msgstr "" msgid "Duplexer" msgstr "Duplexer" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "EPL1 Label Printer" msgid "EPL2 Label Printer" msgstr "EPL2 Label Printer" msgid "Edit Configuration File" msgstr "Edita il file di configurazione" msgid "Encryption is not supported." msgstr "" #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Termine del banner" msgid "English" msgstr "Inglese" 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 "" "Digitare la username e la password oppure l'username di root e la password " "per accedere a questa pagina. Se si utilizza l'autenticazione Kerberos, " "assicurarsi di disporre di un ticket di Kerberos valido." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "Envelope #11" msgid "Envelope #12" msgstr "Envelope #12" msgid "Envelope #14" msgstr "Envelope #14" msgid "Envelope #9" msgstr "Envelope #9" msgid "Envelope B4" msgstr "Envelope B4" msgid "Envelope B5" msgstr "Envelope B5" msgid "Envelope B6" msgstr "Envelope B6" msgid "Envelope C0" msgstr "Envelope C0" msgid "Envelope C1" msgstr "Envelope C1" msgid "Envelope C2" msgstr "Envelope C2" msgid "Envelope C3" msgstr "Envelope C3" msgid "Envelope C4" msgstr "Envelope C4" msgid "Envelope C5" msgstr "Envelope C5" msgid "Envelope C6" msgstr "Envelope C6" msgid "Envelope C65" msgstr "Envelope C65" msgid "Envelope C7" msgstr "Envelope C7" msgid "Envelope Choukei 3" msgstr "Envelope Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Envelope Choukei 3 Long Edge" msgid "Envelope Choukei 4" msgstr "Envelope Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Envelope Choukei 4 Long Edge" msgid "Envelope DL" msgstr "Envelope DL" msgid "Envelope Feed" msgstr "Envelope Feed" msgid "Envelope Invite" msgstr "Envelope Invite" msgid "Envelope Italian" msgstr "Envelope Italian" msgid "Envelope Kaku2" msgstr "Envelope Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Envelope Kaku2 Long Edge" msgid "Envelope Kaku3" msgstr "Envelope Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Envelope Kaku3 Long Edge" msgid "Envelope Monarch" msgstr "Envelope Monarch" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "Envelope PRC1 Long Edge" msgid "Envelope PRC10" msgstr "Envelope PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Envelope PRC10 Long Edge" msgid "Envelope PRC2" msgstr "Envelope PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Envelope PRC2 Long Edge" msgid "Envelope PRC3" msgstr "Envelope PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Envelope PRC3 Long Edge" msgid "Envelope PRC4" msgstr "Envelope PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Envelope PRC4 Long Edge" msgid "Envelope PRC5 Long Edge" msgstr "Envelope PRC5 Long Edge" msgid "Envelope PRC5PRC5" msgstr "Envelope PRC5PRC5" msgid "Envelope PRC6" msgstr "Envelope PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Envelope PRC6 Long Edge" msgid "Envelope PRC7" msgstr "Envelope PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Envelope PRC7 Long Edge" msgid "Envelope PRC8" msgstr "Envelope PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Envelope PRC8 Long Edge" msgid "Envelope PRC9" msgstr "Envelope PRC9" msgid "Envelope PRC9 Long Edge" msgstr "Envelope PRC9 Long Edge" msgid "Envelope Personal" msgstr "Envelope Personal" msgid "Envelope You4" msgstr "Envelope You4" msgid "Envelope You4 Long Edge" msgstr "Envelope You4 Long Edge" msgid "Environment Variables:" msgstr "Variabili d'ambiente:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Policy dell'errore" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "Si è verificato un errore durante l'invio dei dati raster." msgid "Error: need hostname after \"-h\" option." msgstr "Errore: è necessario l'hostname dopo l'opzione \"-h\"." msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Ogni 10 etichette" msgid "Every 2 Labels" msgstr "Ogni 2 etichette" msgid "Every 3 Labels" msgstr "Ogni 3 etichette" msgid "Every 4 Labels" msgstr "Ogni 4 etichette" msgid "Every 5 Labels" msgstr "Ogni 5 etichette" msgid "Every 6 Labels" msgstr "Ogni 6 etichette" msgid "Every 7 Labels" msgstr "Ogni 7 etichette" msgid "Every 8 Labels" msgstr "Ogni 8 etichette" msgid "Every 9 Labels" msgstr "Ogni 9 etichette" msgid "Every Label" msgstr "Ogni etichetta" msgid "Executive" msgstr "Esecutivo" msgid "Expectation Failed" msgstr "Aspettativa non riuscita" msgid "Expressions:" msgstr "Espressioni:" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "Il file \"%s\" contiene un path relativo." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "il file \"%s\" presenta dei permessi non sicuri (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "Il file \"%s\" è una directory." #, c-format msgid "File \"%s\" not available: %s" msgstr "Il file \"%s\" non è disponibile: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "File \"%s\" permessi OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" "I file del dispositivo URI sono stati disabilitati. Per abilitare, vedere la " "direttiva FileDevice in \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." msgstr "Finito pagina %d." msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Foglio" msgid "Forbidden" msgstr "Vietato" msgid "Found" msgstr "" msgid "General" msgstr "Generale" msgid "Generic" msgstr "Generico" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU utilizza una lunghezza indefinita" msgid "Glossy Paper" msgstr "Carta lucida" msgid "Got a printer-uri attribute but no job-id." msgstr "Esiste un attributo printer-uri ma nessun job-id." msgid "Grayscale" msgstr "Scala di grigi" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Directory appesa" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "Il file di aiuto non è nell'indice." msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "L'attributo IPP 1setOf con tag di valore incompatibile." msgid "IPP attribute has no name." msgstr "L'attributo dell'IPP non ha nessun nome." msgid "IPP attribute is not a member of the message." msgstr "L'attributo IPP non è un membro del messaggio." msgid "IPP begCollection value not 0 bytes." msgstr "Il valore di IPP begCollection non è di 0 byte." msgid "IPP boolean value not 1 byte." msgstr "Il valore booleano di IPP non è di 1 byte." msgid "IPP date value not 11 bytes." msgstr "Il valore IPP date non è di 11 byte." msgid "IPP endCollection value not 0 bytes." msgstr "Il valore di IPP endCollection non è di 0 byte." msgid "IPP enum value not 4 bytes." msgstr "Il valore di IPP enum non è di 4 byte." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "Il tag dell'estensione di IPP è maggiore di 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "Il valore intero di IPP non è di 4 byte." msgid "IPP language length overflows value." msgstr "Valore di overflow della lunghezza della lingua di IPP." msgid "IPP language length too large." msgstr "La lunghezza della lingua di IPP è troppo grande." msgid "IPP member name is not empty." msgstr "Il nome del membro IPP non è vuoto." msgid "IPP memberName value is empty." msgstr "Il valore di IPP memberName è vuoto." msgid "IPP memberName with no attribute." msgstr "IPP memberName con nessun attributo." msgid "IPP name larger than 32767 bytes." msgstr "Il nome dell'IPP è più grande di 32767 byte." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "Il valore di IPP nameWithLanguage è inferiore al minimo di 4 byte." msgid "IPP octetString length too large." msgstr "La lunghezza di IPP octetString è troppo grande." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "Il valore di IPP rangeOfInteger non è di 8 byte." msgid "IPP resolution value not 9 bytes." msgstr "Il valore di IPP resolution non è di 9 byte." msgid "IPP string length overflows value." msgstr "Valore di overflow della lunghezza della stringa di IPP." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "Il valore di textWithLanguage dell'IPP è inferiore a 4 byte." msgid "IPP value larger than 32767 bytes." msgstr "Il valore di IPP è più grande di 32767 byte." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Il carattere di controllo è illegale" msgid "Illegal main keyword string" msgstr "La stringa della parola chiave principale è illegale" msgid "Illegal option keyword string" msgstr "La stringa della parola chiave dell'opzione è illegale" msgid "Illegal translation string" msgstr "La stringa della traduzione è illegale" msgid "Illegal whitespace character" msgstr "Il carattere spazio è illegale" msgid "Installable Options" msgstr "Opzioni installabili" msgid "Installed" msgstr "Installato" msgid "IntelliBar Label Printer" msgstr "IntelliBar Label Printer" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Errore interno del server" msgid "Internal error" msgstr "Errore interno" msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-Part" msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-Part" msgid "Internet Printing Protocol" msgstr "Internet Printing Protocol" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "Gli argomenti del nome del supporto non sono validi." msgid "Invalid media size." msgstr "La dimensione del supporto non è valida." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "Il comando della stampante non è valido \"%s\"." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 Long Edge" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 Long Edge" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 Long Edge" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "Il processo #%d non può essere riavviato, nessun file." #, c-format msgid "Job #%d does not exist." msgstr "Il processo #%d non esiste." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Il processo #%d è già stato interrotto - non è possibile eliminarlo." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Il processo #%d è già stato eliminato, impossibile eliminarlo." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Il processo #%d è già completato, non è possibile eliminarlo." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "Il processo #%d è terminato e non può essere alterato." #, c-format msgid "Job #%d is not complete." msgstr "Il processo #%d non è stato completato." #, c-format msgid "Job #%d is not held for authentication." msgstr "Il processo #%d non è stato eseguito per l'autenticazione." #, c-format msgid "Job #%d is not held." msgstr "Il processo #%d non è stato eseguito." msgid "Job Completed" msgstr "Il processo è stato completato" msgid "Job Created" msgstr "Il processo è stato creato" msgid "Job Options Changed" msgstr "Le opzioni del processo sono state modificate" msgid "Job Stopped" msgstr "Il processo è stato fermato" msgid "Job is completed and cannot be changed." msgstr "Il processo è stato completato e non può essere modificato." msgid "Job operation failed" msgstr "L'operazione del processo non è andata a buon fine" msgid "Job state cannot be changed." msgstr "Lo stato del processo non può essere modificato." msgid "Job subscriptions cannot be renewed." msgstr "Le sottoscrizioni del processo non possono essere rinnovate." msgid "Jobs" msgstr "Stampe" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR Host o stampante" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Label Printer" msgid "Label Top" msgstr "Label Top" #, c-format msgid "Language \"%s\" not supported." msgstr "La lingua \"%s\" non è supportata." msgid "Large Address" msgstr "Large Address" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Series PCL 4/5" msgid "Letter Oversize" msgstr "Letter Oversize" msgid "Letter Oversize Long Edge" msgstr "Letter Oversize Long Edge" msgid "Light" msgstr "Luce" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Linea più lunga di quella massima consentita (255 caratteri)" msgid "List Available Printers" msgstr "Elenco delle stampanti disponibili" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "Long-Edge (Portrait)" msgid "Looking for printer." msgstr "Cerca una stampante." msgid "Manual Feed" msgstr "Alimentazione manuale" msgid "Media Size" msgstr "Dimensione del supporto" msgid "Media Source" msgstr "Sorgente multimediale" msgid "Media Tracking" msgstr "Monitoraggio del supporto" msgid "Media Type" msgstr "Tipo di supporto" msgid "Medium" msgstr "Supporto" msgid "Memory allocation error" msgstr "Errore di allocazione della memoria" msgid "Missing CloseGroup" msgstr "Manca CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Manca la libreria di PPD-Adobe-4.x" msgid "Missing asterisk in column 1" msgstr "Manca l'asterisco nella colonna 1" msgid "Missing document-number attribute." msgstr "Manca l'attributo di document-number." msgid "Missing form variable" msgstr "Manca la variabile del modulo" msgid "Missing last-document attribute in request." msgstr "Manca l'attributo last-document nella richiesta." msgid "Missing media or media-col." msgstr "Manca media o media-col." msgid "Missing media-size in media-col." msgstr "Manca media-size in media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Manca l'attributo notify-subscription-ids." msgid "Missing option keyword" msgstr "Manca la parola chiave dell'opzione" msgid "Missing requesting-user-name attribute." msgstr "Manca l'attributo di requesting-user-name." #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "Mancano gli attributi richiesti." msgid "Missing resource in URI" msgstr "" msgid "Missing scheme in URI" msgstr "" msgid "Missing value string" msgstr "Manca la stringa del valore" msgid "Missing x-dimension in media-size." msgstr "Manca x-dimension in media-size." msgid "Missing y-dimension in media-size." msgstr "Manca y-dimension in media-size." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Modello: nome = %s\n" " lingua_naturale = %s\n" " marca-e-modello = %s\n" " device-id = %s" msgid "Modifiers:" msgstr "Modificatori:" msgid "Modify Class" msgstr "Modifica la classe" msgid "Modify Printer" msgstr "Modifica la stampante" msgid "Move All Jobs" msgstr "Sposta tutti le stampe" msgid "Move Job" msgstr "Sposta il processo" msgid "Moved Permanently" msgstr "Spostato in modo permanente" msgid "NULL PPD file pointer" msgstr "Puntatore del file PPD NULL" msgid "Name OID uses indefinite length" msgstr "Il nome OID utilizza una lunghezza indefinita" msgid "Nested classes are not allowed." msgstr "Le classi nidificate non sono consentite." msgid "Never" msgstr "Mai" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "No" msgid "No Content" msgstr "Nessun contenuto" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "Nessun nome del PPD" msgid "No VarBind SEQUENCE" msgstr "Nessuna SEQUENZA di VarBind" msgid "No active connection" msgstr "Nessuna connessione attiva" msgid "No active connection." msgstr "" #, c-format msgid "No active jobs on %s." msgstr "Nessun processo attivo su %s." msgid "No attributes in request." msgstr "Nessun attributo nella richiesta." msgid "No authentication information provided." msgstr "Nessuna informazione di autenticazione fornita." msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Nessun nome della comunità" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "Nessuna stampante predefinita." msgid "No destinations added." msgstr "Nessuna destinazione aggiunta." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "Non è stato trovato nessun dispositivo URI in argv[0] o nella variabile di " "ambiente DEVICE_URI." msgid "No error-index" msgstr "Nessin error-index" msgid "No error-status" msgstr "Nessun error-status" msgid "No file in print request." msgstr "Nessun file nella richiesta di stampa." msgid "No modification time" msgstr "Nessun orario di modifica" msgid "No name OID" msgstr "Nessun nome OID" msgid "No pages were found." msgstr "Nessuna pagina è stata trovata." msgid "No printer name" msgstr "Nessun nome della stampante" msgid "No printer-uri found" msgstr "Non è stato trovato printer-uri" msgid "No printer-uri found for class" msgstr "Non è stato trovato printer-uri per la classe" msgid "No printer-uri in request." msgstr "Nessun printer-uri nella richiesta." msgid "No request URI." msgstr "" msgid "No request protocol version." msgstr "" msgid "No request sent." msgstr "" msgid "No request-id" msgstr "Nessun request-id" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "Nessun attributo della sottoscrizione nella richiesta." msgid "No subscriptions found." msgstr "Non è stata trovata nessuna sottoscrizione." msgid "No variable-bindings SEQUENCE" msgstr "Nessuna SEQUENZA di variable-bindings" msgid "No version number" msgstr "Nessun numero di versione" msgid "Non-continuous (Mark sensing)" msgstr "Non-continuous (Mark sensing)" msgid "Non-continuous (Web sensing)" msgstr "Non-continuous (Web sensing)" msgid "None" msgstr "" msgid "Normal" msgstr "Normale" msgid "Not Found" msgstr "Non trovato" msgid "Not Implemented" msgstr "Non implementato" msgid "Not Installed" msgstr "Non installato" msgid "Not Modified" msgstr "Non modificato" msgid "Not Supported" msgstr "Non supportato" msgid "Not allowed to print." msgstr "Non autorizzato a stampare." msgid "Note" msgstr "Nota" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Off (1-Sided)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Guida in linea" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "L'apertura di %s non è andata a buon fine: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup senza prima un CloseGroup" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI senza prima un CloseUI/JCLCloseUI" msgid "Operation Policy" msgstr "Policy dell'operazione" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "L'opzione \"%s\" non può essere inclusa tramite %%%%IncludeFeature." msgid "Options Installed" msgstr "Opzioni installate" msgid "Options:" msgstr "Opzioni:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "Il file della cache del PPD non è aggiornato." msgid "Out of memory." msgstr "Memoria insufficiente." msgid "Output Mode" msgstr "Modalità di output" msgid "PCL Laser Printer" msgstr "Stampante laser PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K Long Edge" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K Long Edge" msgid "PRC32K Oversize" msgstr "PRC32K Oversize" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K Oversize Long Edge" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "Il pacchetto non contiene un Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Il pacchetto non inizia con SEQUENZA" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Password di %s su %s? " msgid "Pause Class" msgstr "Metti in pausa la classe" msgid "Pause Printer" msgstr "Metti in pausa la stampante" msgid "Peel-Off" msgstr "Peel-Off" msgid "Photo" msgstr "Foto" msgid "Photo Labels" msgstr "Etichette delle foto" msgid "Plain Paper" msgstr "Carta comune" msgid "Policies" msgstr "Policy" msgid "Port Monitor" msgstr "Controllo della porta" msgid "PostScript Printer" msgstr "Stampante PostScript" msgid "Postcard" msgstr "Postcard" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "Postcard Double Long Edge" msgid "Postcard Long Edge" msgstr "Postcard Long Edge" msgid "Preparing to print." msgstr "Preparazione per la stampa." msgid "Print Density" msgstr "Densità di stampa" msgid "Print Job:" msgstr "Processo di stampa:" msgid "Print Mode" msgstr "Modalità di stampa" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "Velocità di stampa" msgid "Print Self-Test Page" msgstr "Stampa la pagina Self-Test" msgid "Print Speed" msgstr "Velocità di stampa" msgid "Print Test Page" msgstr "Stampa pagina di prova" msgid "Print and Cut" msgstr "Stampa e taglia" msgid "Print and Tear" msgstr "Stampa e strappa" msgid "Print file sent." msgstr "Il file di stampa è stato inviato." msgid "Print job canceled at printer." msgstr "Il processo di stampa è stato annullato." msgid "Print job too large." msgstr "Il processo di stampa è troppo grande." msgid "Print job was not accepted." msgstr "Il processo di stampa non è stato accettato." #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "La stampante è stata aggiunta" msgid "Printer Default" msgstr "Stampante predefinita" msgid "Printer Deleted" msgstr "La stampante è stata eliminata" msgid "Printer Modified" msgstr "La stampante è stata modificata" msgid "Printer Paused" msgstr "La stampante è stata messa in pausa" msgid "Printer Settings" msgstr "Impostazioni della stampante" msgid "Printer cannot print supplied content." msgstr "La stampante non può stampare il contenuto fornito." msgid "Printer cannot print with supplied options." msgstr "La stampante non può stampare con le opzioni fornite." msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Stampante:" msgid "Printers" msgstr "Stampanti" #, c-format msgid "Printing page %d, %u%% complete." msgstr "" msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quarto" msgid "Quota limit reached." msgstr "Il limite della quota è stato raggiunto." msgid "Rank Owner Job File(s) Total Size" msgstr "Rank Owner Job File(s) Total Size" msgid "Reject Jobs" msgstr "Stampe rifiutate" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "L'host remosto non ha accettato il controllo (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "L'host remoto non ha accettato i dati (%d)." msgid "Reprint After Error" msgstr "Ristampa dopo un errore" msgid "Request Entity Too Large" msgstr "Entità della richiesta troppo grande" msgid "Resolution" msgstr "Risoluzione" msgid "Resume Class" msgstr "Riprendi la classe" msgid "Resume Printer" msgstr "Riprendi la stampante" msgid "Return Address" msgstr "Ritorna l'indirizzo" msgid "Rewind" msgstr "Ricarica" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENZA utilizza una lunghezza indefinita" msgid "SSL/TLS Negotiation Error" msgstr "Errore di negoziazione SSL/TLS" msgid "See Other" msgstr "Vedi altro" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "Invio dei dati alla stampante." msgid "Server Restarted" msgstr "Il server è stato riavviato" msgid "Server Security Auditing" msgstr "Revisione della sicurezza del server" msgid "Server Started" msgstr "Il server è stato avviato" msgid "Server Stopped" msgstr "Il server è stato fermato" msgid "Server credentials not set." msgstr "" msgid "Service Unavailable" msgstr "Servizio non disponibile" msgid "Set Allowed Users" msgstr "Imposta gli utenti autorizzati" msgid "Set As Server Default" msgstr "Imposta come server predefinito" msgid "Set Class Options" msgstr "Imposta le opzioni della classe" msgid "Set Printer Options" msgstr "Imposta le opzioni della stampante" msgid "Set Publishing" msgstr "Imposta la pubblicazione" msgid "Shipping Address" msgstr "Indirizzo di spedizione" msgid "Short-Edge (Landscape)" msgstr "Short-Edge (Landscape)" msgid "Special Paper" msgstr "Carta speciale" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Processo di spooling, %.0f%% completato." msgid "Standard" msgstr "Standard" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Inizio del banner" #, c-format msgid "Starting page %d." msgstr "Pagina iniziale %d." msgid "Statement" msgstr "Rapporto" #, c-format msgid "Subscription #%d does not exist." msgstr "La sottoscrizione #%d non esiste." msgid "Substitutions:" msgstr "Sottoscrizioni:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Protocolli di commutazione" msgid "Tabloid" msgstr "Tabloid" msgid "Tabloid Oversize" msgstr "Tabloid Oversize" msgid "Tabloid Oversize Long Edge" msgstr "Tabloid Oversize Long Edge" msgid "Tear" msgstr "Tear" msgid "Tear-Off" msgstr "Tear-Off" msgid "Tear-Off Adjust Position" msgstr "Tear-Off Adjust Position" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "L'attributo \"%s\" è richiesto per i processi di stampa." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "L'attributo %s non può essere fornito con job-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "L'attributo dell'operazione '%s' non può essere fornito in una richiesta " "Create-Job." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "Il file PPD \"%s\" non è stato trovato." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "Non è possibile aprire il file PPD \"%s\": %s" msgid "The PPD file could not be opened." msgstr "Il file PPD non può essere aperto." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "Il nome della classe può contenere fino a 127 caratteri stampabili e non può " "contenere spazi, barre (/) o cancelletto (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "L'attributo notify-lease-duration non può essere utilizzato con le " "sottoscrizioni del processo." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "Il valore di notify-user-data è troppo grande (%d > 63 ottetti)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" "La configurazione della stampante è errata oppure la stampante non esiste " "più." msgid "The printer did not respond." msgstr "La stampante non ha risposto." msgid "The printer is in use." msgstr "La stampante è in uso." msgid "The printer is not connected." msgstr "La stampante non è connessa." msgid "The printer is not responding." msgstr "La stampante non risponde." msgid "The printer is now connected." msgstr "Adesso la stampante è connessa." msgid "The printer is now online." msgstr "Adesso la stampante è online." msgid "The printer is offline." msgstr "La stampante è offline." msgid "The printer is unreachable at this time." msgstr "In questo momento la stampante non è raggiungibile." msgid "The printer may not exist or is unavailable at this time." msgstr "" "La stampante potrebbe non esistere oppure non è disponibile in questo " "momento." 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 "" msgid "The printer or class does not exist." msgstr "Non esiste la stampante o la classe." msgid "The printer or class is not shared." msgstr "La stampante o la classe non è condivisa." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "Il printer-uri \"%s\" contiene caratteri non validi." msgid "The printer-uri attribute is required." msgstr "L'attributo printer-uri è richiesto." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "Il printer-uri deve essere del formato \"ipp://HOSTNAME/classes/CLASSNAME\"." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "Il printer-uri deve essere del formato \"ipp://HOSTNAME/printers/PRINTERNAME" "\"." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "L'interfaccia web è attualmente disabilitata. Avviare \"cupsctl " "WebInterface=yes\" per abilitarla." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "Il valore which-jobs \"%s\" non è supportato." msgid "There are too many subscriptions." msgstr "Ci sono troppe sottoscrizioni." msgid "There was an unrecoverable USB error." msgstr "Si è verificato un errore irreversibile sulla porta USB." msgid "Thermal Transfer Media" msgstr "Trasferimento termico" msgid "Too many active jobs." msgstr "Troppe stampe attive." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Troppi valori di job-sheets (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Troppi valori di printer-state-reasons (%d > %d)." msgid "Transparency" msgstr "Trasparenza" msgid "Tray" msgstr "Vassoio" msgid "Tray 1" msgstr "Vassoio 1" msgid "Tray 2" msgstr "Vassoio 2" msgid "Tray 3" msgstr "Vassoio 3" msgid "Tray 4" msgstr "Vassoio 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "L'URI è troppo lungo" msgid "URI too large" msgstr "" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Legal" msgid "US Legal Oversize" msgstr "US Legal Oversize" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "US Letter Long Edge" msgid "US Letter Oversize" msgstr "US Letter Oversize" msgid "US Letter Oversize Long Edge" msgstr "US Letter Oversize Long Edge" msgid "US Letter Small" msgstr "US Letter Small" msgid "Unable to access cupsd.conf file" msgstr "Non è possibile accedere al file cupsd.conf" msgid "Unable to access help file." msgstr "Non è possibile accedere al file help." msgid "Unable to add class" msgstr "Non è possibile aggiungere la classe" msgid "Unable to add document to print job." msgstr "Non è possibile aggiungere il documento al processo di stampa." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Non è possibile aggiungere il processo alla destinazione \"%s\"." msgid "Unable to add printer" msgstr "Non è possibile aggiungere la stampante" msgid "Unable to allocate memory for file types." msgstr "Non è possibile allocare la memoria per i tipi di file." msgid "Unable to allocate memory for page info" msgstr "Non è possibile allocare la memoria per le info della pagina" msgid "Unable to allocate memory for pages array" msgstr "Non è possibile allocare memoria per array di pagine" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "Non è possibile eliminare il processo di stampa." msgid "Unable to change printer" msgstr "Non è possibile modificare la stampante" msgid "Unable to change printer-is-shared attribute" msgstr "Non è possibile modificare l'attributo printer-is-shared" msgid "Unable to change server settings" msgstr "Non è possibile modificare le impostazioni del server" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "Non è possibile compilare l'espressione regolare mimeMediaType: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "Non è possibile compilare l'espressione regolare naturalLanguage: %s." msgid "Unable to configure printer options." msgstr "Non è possibile configurare le opzioni della stampante." msgid "Unable to connect to host." msgstr "Non è possibile connettersi all'host." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "Non è possibile contattare la stampante, in coda nella classe della " "stampante successiva." #, c-format msgid "Unable to copy PPD file - %s" msgstr "Non è possibile copiare il file PPD - %s" msgid "Unable to copy PPD file." msgstr "Non è possibile copiare il file PPD." msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "Non è possibile creare il printer-uri" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "Non è possibile creare un file temporaneo" msgid "Unable to delete class" msgstr "Non è possibile eliminare la classe" msgid "Unable to delete printer" msgstr "Non è possibile eliminare la stampante" msgid "Unable to do maintenance command" msgstr "Non è possibile avviare il comando della manutenzione" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "Non è possibile editare i file cupsd.conf più grandi di 1MB" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (catena di " "certificati non validi)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (il certificato " "non è ancora valido)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (il certificato è " "scaduto)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (il nome dell'host " "non corrisponde)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (peer ha chiuso la " "connessione prima di rispondere)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (certificato " "autofirmato)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "Non è possibile stabilire una connessione sicura all'host (certificato non " "verificato)." msgid "Unable to establish a secure connection to host." msgstr "Non è possibile stabilire una connessione sicura all'host." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "Non è possibile trovare la destinazione del processo" msgid "Unable to find printer." msgstr "Non è possibile trovare la stampante." msgid "Unable to find server credentials." msgstr "" msgid "Unable to get backend exit status." msgstr "Non è possibile ottenere lo stato del backend." msgid "Unable to get class list" msgstr "Non è possibile ottenere la lista della classe" msgid "Unable to get class status" msgstr "Non è possibile ottenere lo stato della classe" msgid "Unable to get list of printer drivers" msgstr "Non è possibile ottenere i driver della stampante" msgid "Unable to get printer attributes" msgstr "Non è possibile ottenere gli attributi della stampante" msgid "Unable to get printer list" msgstr "Non è possibile ottenere la lista della stampante" msgid "Unable to get printer status" msgstr "Non è possibile ottenere lo stato della stampante" msgid "Unable to get printer status." msgstr "Non è possibile ottenere lo stato della stampante" msgid "Unable to load help index." msgstr "Non è possibile caricare l'indice dell'aiuto." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "Non è possibile localizzare la stampante \"%s\"." msgid "Unable to locate printer." msgstr "Non è possibile localizzare la stampante." msgid "Unable to modify class" msgstr "Non è possibile modificare la classe" msgid "Unable to modify printer" msgstr "Non è possibile modificare la stampante" msgid "Unable to move job" msgstr "Non è possibile spostare il processo" msgid "Unable to move jobs" msgstr "Non è possibile spostare le stampe" msgid "Unable to open PPD file" msgstr "Non è possibile aprire il file PPD" msgid "Unable to open cupsd.conf file:" msgstr "Non è possibile aprire il file cupsd.conf:" msgid "Unable to open device file" msgstr "Non è possibile aprire il file del dispositivo:" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "Non è possibile aprire il documento #%d nel processo #%d." msgid "Unable to open help file." msgstr "Non è possibile aprire il file dell'aiuto." msgid "Unable to open print file" msgstr "Non è possibile aprire il file della stampa" msgid "Unable to open raster file" msgstr "non è possibile aprire il file del raster" msgid "Unable to print test page" msgstr "Non è possibile stampare la pagina di prova" msgid "Unable to read print data." msgstr "Non è possibile leggere i dati della stampa." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "" msgid "Unable to see in file" msgstr "Non è possibile vedere nel file" msgid "Unable to send command to printer driver" msgstr "Non è possibile inviare il comando al driver della stampante" msgid "Unable to send data to printer." msgstr "Non è possibile inviare i dati alla stampante." msgid "Unable to set options" msgstr "Non è possibile impostare le opzioni" msgid "Unable to set server default" msgstr "Non è possibile impostare il server predefinito" msgid "Unable to start backend process." msgstr "Non è possibile avviare il processo del backend." msgid "Unable to upload cupsd.conf file" msgstr "Non è possibile caricare il file cupsd.conf" msgid "Unable to use legacy USB class driver." msgstr "Non è possibile utilizzare il driver legacy della classe USB. " msgid "Unable to write print data" msgstr "Non è possibile scrivere i dati della stampa" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "Non è possibile scrivere i dati della stampa non compressi: %s" msgid "Unauthorized" msgstr "Non autorizzato" msgid "Units" msgstr "Unità" msgid "Unknown" msgstr "Sconosciuto" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Scelta sconosciuta \"%s\" dell'opzione \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Valore sconosciuto dell'opzione di crittografia: \"%s\"." #, c-format msgid "Unknown file order: \"%s\"." msgstr "ordine del file sconosciuto: \"%s\"." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Formato del carattere sconosciuto: \"%c\"." msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "Nome del formato del supporto sconosciuto." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Opzione sconosciuta \"%s\" con il valore \"%s\"." #, c-format msgid "Unknown option \"%s\"." msgstr "Opzione sconosciuta \"%s\"." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Modalità di stampa sconosciuta: \"%s\"." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "printer-error-policy sconosciuta \"%s\"." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "printer-op-policy sconosciuta \"%s\"." msgid "Unknown request method." msgstr "" msgid "Unknown request version." msgstr "" msgid "Unknown scheme in URI" msgstr "" msgid "Unknown service name." msgstr "Nome del servizio sconosciuto." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Valore sconosciuto dell'opzione versione: \"%s\"." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Valore di 'compressione' non supportato \"%s\"." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Valore di 'document-format' non supportato \"%s\"." msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "Valore di 'job-name' non supportato." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Il set dei caratteri \"%s\" non è supportato." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Compressione non supportata \"%s\"." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "Il formato del documento \"%s\" non è supportato." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "Il formato del documento \"%s/%s\" non è supportato." #, c-format msgid "Unsupported format \"%s\"." msgstr "Il formato \"%s\" non è supportato." msgid "Unsupported margins." msgstr "Margini non supportati." msgid "Unsupported media value." msgstr "Il valore del supporto non è supportato." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "Il valore %d di number-up non è supportato, usare number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "Il valore %s di number-up-layout non è supportato, usare number-up-" "layout=1rtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "Il valore %s di page-border non è supportato, usare page-border=none." msgid "Unsupported raster data." msgstr "I dati del raster non sono supportati." msgid "Unsupported value type" msgstr "Tipo di valore non supportato" msgid "Upgrade Required" msgstr "È richiesto l'aggiornamento" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Uso: %s job-id utente titolo copie opzioni [file]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Uso: cupsctl [opzioni] [param=valore ... paramN=valoreN]" msgid "Usage: cupsd [options]" msgstr "Uso: cupsd [opzioni]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" "Uso: ippfind [opzioni] regtype[,subtype][.dominio.] ... [espressione]\n" " ippfind [opzioni] nome[.regtype[.dominio.]] ... [espressione]\n" " ippfind --help\n" " ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Uso: ipptool [opzioni] URI file [ ... fileN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Uso: ppdc [opzioni] file.drv [ ... fileN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Uso: ppdhtml [opzioni] file.drv >file.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Uso: ppdi [opzioni] file.ppd [ ... fileN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Uso: ppdmerge [opzioni] file.ppd [ ... fileN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "Uso: ppdpo [opzioni] -o file.po file.drv [ ... fileN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Uso: snmp [host-o-indirizzo-ip]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Il valore utilizza una lunghezza indefinita" msgid "VarBind uses indefinite length" msgstr "VarBind utilizza una lunghezza indefinita" msgid "Version uses indefinite length" msgstr "Version utilizza una lunghezza indefinita" msgid "Waiting for job to complete." msgstr "In attesa di lavoro da completare." msgid "Waiting for printer to become available." msgstr "In attesa che la stampante ritorni disponibile." msgid "Waiting for printer to finish." msgstr "In attesa che la stampante finisca." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "L'interfaccia web è stata disabilitata" msgid "Yes" msgstr "Sì" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Bisogna accedere a questa pagina, usando l'URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "ZPL Label Printer" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "interrotto" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "eliminato" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "completato" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "cups-deviced ha smesso di funzionare." msgid "cups-driverd failed to execute." msgstr "cups-driverd ha smesso di funzionare." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: non è possibile connettersi al server: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: opzione sconosciuta \"%s\"" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: opzione sconosciuta \"-%c\"" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: dopo l'opzione \"-c\" è previsto il file di configurazione." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "cupsd: dopo l'opzione \"-s\" è previsto il file cups-files.conf." msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: non è consentito il file relativo cups-files.conf." msgid "cupsd: Unable to get current directory." msgstr "cupsd: non è possibile ottenere la directory corrente." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: non è possibile ottenere il path del file cups-files.conf." #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: argomento sconosciuto \"%s\" - operazione interrotta." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: opzione sconosciuta \"%c\" - operazione interrotta." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: il numero del documento non è valido %d." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: l'ID del processo non è valido %d." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: può essere specificato solo un nome del file." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: non è possibile ottenere il file del processo - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: l'opzione -q non è compatibile con l'opzione -v." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: l'opzione -v è incompatibile con l'opzione -q." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "dispositivo per %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "dispositivo per %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index utilizza una lunghezza indefinita" msgid "error-status uses indefinite length" msgstr "error-status utilizza una lunghezza indefinita" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "svolto" msgid "help\t\tGet help on commands." msgstr "help\t\tOttenere un aiuto per i comandi." msgid "idle" msgstr "inattiva" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: l'espressione regolare non è valida: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: non è possibile usare --and dopo --or." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: è previsto il nome della chiave dopo %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: è previsto un intervallo di porte dopo %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: è previsto un programma dopo %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: è previsto un punto e virgola dopo %s. " msgid "ippfind: Missing close brace in substitution." msgstr "ippfind: manca parentesi graffa di chiusura in sostituzione." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: mancano le parentesi chiuse." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: manca l'espressione prima di \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: manca l'espressione prima di \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "ippfind: manca il nome della chiave dopo %s." #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "ippfind: mancano le parentesi aperte." #, c-format msgid "ippfind: Missing program after %s." msgstr "ippfind: manca il programma dopo %s." #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "ippfind: manca l'espressione regolare dopo %s." #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "ippfind: manca il punto e virgola dopo %s." msgid "ippfind: Out of memory." msgstr "ippfind: memoria insufficiente." msgid "ippfind: Too many parenthesis." msgstr "ippfind: troppe parentesi." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: non è possibile visualizzare oppure risolvere: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "ippfind: non è possibile eseguire \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "ippfind: non è possibile utilizzare Bonjour: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "ippfind: variabile sconosciuta \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: secondi non validi per \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "ipptool: può specificare solo un singolo URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: conteggio mancante per \"-n\"." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: manca il file per \"-f\"." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: manca nome=valore per \"-d\"." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: mancano i secondi per \"-i\"." msgid "ipptool: URI required before test file." msgstr "ipptool: l'URI è richiesto prima del file di testo." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "manca l'attributo di job-printer-uri." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: il nome della classe può contenere solo caratteri stampabili." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin: è previsto allow/deny:listautente dopo l'opzione \"-u\"." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: è prevista la classe dopo l'opzione \"-r\"." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: è previsto il nome della classe dopo l'opzione \"-c\"." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: è prevista la descrizione dopo l'opzione \"-D\"." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: è previsto l'URI del dispositivo dopo l'opzione \"-v\"." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: è previsto il tipo del(i) file dopo l'opzione \"-I\"." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: è previsto l'hostname dopo l'opzione \"-h\"." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: è prevista la posizione dopo l'opzione \"-L\"." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: è previsto il modello dopo l'opzione \"-m\"." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: è previsto il nome dopo l'opzione \"-R\"." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: è previsto nome=valore dopo l'opzione \"-o\"." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: è prevista la stampante dopo l'opzione \"-p\"." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: è previsto il nome della stampante dopo l'opzione \"-d\"." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: è prevista la stampante o la classe dopo l'opzione \"-x\"." msgid "lpadmin: No member names were seen." msgstr "lpadmin: nessun nome dei membri è stato visto." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: la stampante %s è già un membro della classe %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: la stampante %s non è un membro della classe %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "" "lpadmin: il nome della stampante può contenere solo caratteri stampabili." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: non è possibile aggiungere una stampante alla classe:\n" " Bisogna specificare prima un nome per la stampante." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: non è possibile connettersi al server: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: non è possibile creare il file temporaneo" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: non è possibile eliminare l'opzione:\n" " Bisogna specificare prima un nome per la stampante." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: non è possibile rimuovere una stampante dalla classe:\n" " Bisogna specificare prima un nome per la stampante." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: non è possibile impostare le opzioni della stampante:\n" " Bisogna specificare prima un nome per la stampante." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: opzione sconosciuta allow/deny \"%s\"." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: argomento sconosciuto \"%s\"." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: opzione sconosciuta \"%c\"." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: attenzione - contenuto nell'elenco tipo ignorato." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" "lpinfo: è prevista la stringa ID del dispositivo 1284 dopo \"--device-id\"." msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: è prevista la lingua dopo \"--language\"." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: è prevista marca e modello dopo \"--make-and-model\"." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: è prevista la stringa del prodotto dopo \"--product\"." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "lpinfo: è prevista la lista dello schema dopo \"--exclude-schemes\"." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "lpinfo: è prevista la lista dello schema dopo \"--include-schemes\"." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: è previsto un timeout dopo \"--timeout\"." #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: non è possibile connettersi al server: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: argomento sconosciuto \"%s\"." msgid "lpoptions: No printers." msgstr "lpoptions: nessuna stampante." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: non è possibile aggiungere la stampante o l'istanza: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: non è possibile ottenere il file PPD per %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: non è possibile aprire il file PPD per %s." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: stampante o classe sconosciuta." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: errore - destinazione inesistente \"%s\" dei nomi delle variabili di " "ambiente %s." #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "membri della classe %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "nessuna voce" msgid "no system default destination" msgstr "nessuna destinazione predefinita di sistema" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "notify-events non è stato specificato." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "notify-recipient-uri URI \"%s\" è già stato utilizzato." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "notify-recipient-uri URI \"%s\" utilizza uno schema sconosciuto." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "in attesa" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: aggiunta della directory \"%s\"." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: aggiunto/aggiornato il testo della UI da %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: il valore booleano non è valido (%s) alla riga %d di %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: l'attributo del carattere non è valido: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" "ppdc: il nome della risoluzione non è valido \"%s\" alla riga %d di %s." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: lo stato della parola chiave non è valido %s alla riga %d di %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" "ppdc: la sostituzione della variabile ($%c) non è valida alla riga %d di %s." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc: trovata scelta senza opzione alla riga %d di %s." #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: #po duplicato per il locale %s alla riga %d di %s." #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: è prevista una definizione del filtro alla riga %d di %s." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: è previsto il nome del programma alla riga %d di %s." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: è previsto un valore booleano alla riga %d di %s." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "ppdc: è previsto un set di caratteri dopo Font alla riga %d di %s." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: è previsto un codice di scelta alla riga %d di %s." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: è previsto un nome/testo di scelta alla riga %d di %s. " #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "ppdc: è previsto un colore per ColorModel alla riga %d di %s." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" "ppdc: è previsto uno spazio di colore per ColorModel alla riga %d di %s." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: è prevista una compressione per ColorModel alla riga %d di %s." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: è prevista una stringa di vincoli per UIConstraints alla riga %d di %s." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: è previsto un driver della parola chiave tipo che segue DriverType " "alla riga %d di %s." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "ppdc: è previsto il tipo duplex dopo Duplex alla riga %d di %s." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: è prevista una codifica dopo Font alla riga %d di %s." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "ppdc: è previsto un file dopo #po %s alla riga %d di %s." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: è previsto un nome/testo del gruppo alla riga %d di %s." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: è previsto un file da includere alla riga %d di %s." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: è previsto un intero alla riga %d di %s." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: è previsto un locale dopo #po alla riga %d di %s." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: è previsto un nome dopo %s alla riga %d di %s." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: è previsto un nome dopo FileName alla riga %d di %s." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: è previsto un nome dopo Font alla riga %d di %s." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: è previsto un nome dopo Manufacturer alla riga %d di %s." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: è previsto un nome dopo MediaSize alla riga %d di %s." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: è previsto un nome dopo ModelName alla riga %d di %s." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: è previsto un nome dopo PCFileName alla riga %d di %s." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: è previsto un nome/testo dopo %s alla riga %d di %s." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "ppdc: è previsto un nome/testo dopo Installable alla riga %d di %s." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "ppdc: è previsto un nome/testo dopo Resolution alla riga %d di %s." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: è prevista una combinazione nome/testo per ColorModel alla riga %d di " "%s." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: è prevista l'opzione nome/testo alla riga %d di %s." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: è prevista la sezione dell'opzione alla riga %d di %s." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: è previsto il tipo di opzione alla riga %d di %s." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: è previsto sovrascrivere il campo dopo Resolution alla riga %d di %s." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: è prevista una stringa tra virgolette alla riga %d di %s." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: è previsto un numero reale alla riga %d di %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: è previsto risoluzione/mediatype dopo ColorProfile alla riga %d di %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: è previsto risoluzione/mediatype dopo SimpleColorProfile alla riga %d " "di %s." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: è previsto un selettore %s alla riga %d di %s." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: è previsto uno stato dopo Font alla riga %d di %s." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: è prevista una stringa dopo Copyright alla riga %d di %s." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: è prevista una stringa dopo Version alla riga %d di %s." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: sono previsti due nomi di opzioni alla riga %d di %s." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: è previsto un valore dopo %s alla riga %d di %s." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: è prevista una versione dopo Font alla riga %d di %s." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: il file #include/#po non è valido \"%s\"." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: il costo non è valido per il filtro alla riga %d di %s." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" "ppdc: il tipo di MIME vuoto non è valido per il filtro alla riga %d di %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" "ppdc: il nome del programma vuoto non è valido per il filtro alla riga %d di " "%s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: la sezione dell'opzione \"%s\" non è valida alla riga %d di %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: il tipo di opzione \"%s\" non è valido alla riga %d di %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: caricamento in corso delle informazioni del driver \"%s\"." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: caricamento in corso dei messaggi per locale \"%s\"." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: caricamento in corso da \"%s\"." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc. manca #endif alla fine di \"%s\"." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: manca #if alla riga %d di %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" "ppdc: è necessaria la riga msgid prima di ogni stringa di traduzione alla " "riga %d di %s." #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: Nessun catalogo dei messaggi fornito per locale %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" "ppdc: l'opzione %s è stata definita in due differenti gruppi alla riga %d di " "%s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" "ppdc: l'opzione %s è stata ridefinita con un tipo differente alla riga %d di " "%s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc: il vincolo dell'opzione deve *citare alla riga %d di %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: troppi #if sono nidificati alla riga %d di %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: non è possibile creare il file PPD \"%s\" - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: non è possibile creare la directory di output %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: non è possibile creare la pipe di output: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: non è possibile eseguire cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: non è possibile trovare il file #po %s alla riga %d di %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" "ppdc: non è possibile trovare il file di include \"%s\" alla riga %d di %s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: non è possibile trovare la localizzazione di \"%s\" - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "" "ppdc: non è possibile caricare il file della localizzazione \"%s\" - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: non è possibile aprire %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: variabile non definita (%s) alla riga %d di %s." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: testo non previsto alla riga %d di %s." #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: tipo di driver sconosciuto %s alla riga %d di %s." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: tipo duplex sconosciuto \"%s\" alla riga %d di %s." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: dimensione sconosciuta del supporto \"%s\" alla riga %d di %s." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: formato dei cataloghi sconosciuto per \"%s\"." #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: c'è un token sconosciuto \"%s\" alla riga %d di %s." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: caratteri finali sconosciuti in un numero reale \"%s\" alla riga %d di " "%s." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "ppdc: stringa senza terminazione che inizia per %c alla riga %d di %s." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: attenzione - sovrapposizione del file \"%s\"." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: scrittura in corso di %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: scrittura in corso dei file PPD nella directory \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: LanguageVersion non è valido \"%s\" in %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: il file PPD %s è stato ignorato." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: non è possibile salvare %s in %s - %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "la stampante %s è stata disabilitata da %s" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "la stampante %s è inattiva. è stata abilitata da %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "la stampante %s sta stampando %s-%d. è stata abilitata da %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "la stampante %s/%s è stata disabilitata da %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "la stampante %s/%s è inattiva. è stata abilitata da %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "la stampante %s/%s sta stampando %s-%d. è stata abilitata da %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "elaborazione in corso" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "request id è %s-%d (%d file(s))" msgid "request-id uses indefinite length" msgstr "request-id utilizza una lunghezza indefinita" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "lo scheduler non è in funzione" msgid "scheduler is running" msgstr "lo scheduler è in funzione" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "stat di %s non riuscito: %s" msgid "status\t\tShow status of daemon and queue." msgstr "stato\t\tMostra lo stato del demone e della coda." #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "fermato" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "destinazione predefinita del sistema: %s" #, c-format msgid "system default destination: %s/%s" msgstr "destinazione predefinita del sistema: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "sconosciuto" msgid "untitled" msgstr "senza titolo" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings utilizza una lunghezza indefinita" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "" #~ "Per esportare i driver della stampante è richiesta una password di Samba." #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "Per esportare i driver della stampante è richiesto un username di Samba" #~ msgid "Export Printers to Samba" #~ msgstr "Esporta le stampanti per Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: non è possibile impostare direttamente Listen o Port." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: non è possibile aprile il file PPD \"%s\" - %s" cups-2.3.1/locale/cups.strings000664 000765 000024 00001211630 13574721672 016427 0ustar00mikestaff000000 000000 "\t\t(all)" = "\t\t(all)"; "\t\t(none)" = "\t\t(none)"; "\t%d entries" = "\t%d entries"; "\t%s" = "\t%s"; "\tAfter fault: continue" = "\tAfter fault: continue"; "\tAlerts: %s" = "\tAlerts: %s"; "\tBanner required" = "\tBanner required"; "\tCharset sets:" = "\tCharset sets:"; "\tConnection: direct" = "\tConnection: direct"; "\tConnection: remote" = "\tConnection: remote"; "\tContent types: any" = "\tContent types: any"; "\tDefault page size:" = "\tDefault page size:"; "\tDefault pitch:" = "\tDefault pitch:"; "\tDefault port settings:" = "\tDefault port settings:"; "\tDescription: %s" = "\tDescription: %s"; "\tForm mounted:" = "\tForm mounted:"; "\tForms allowed:" = "\tForms allowed:"; "\tInterface: %s.ppd" = "\tInterface: %s.ppd"; "\tInterface: %s/ppd/%s.ppd" = "\tInterface: %s/ppd/%s.ppd"; "\tLocation: %s" = "\tLocation: %s"; "\tOn fault: no alert" = "\tOn fault: no alert"; "\tPrinter types: unknown" = "\tPrinter types: unknown"; "\tStatus: %s" = "\tStatus: %s"; "\tUsers allowed:" = "\tUsers allowed:"; "\tUsers denied:" = "\tUsers denied:"; "\tdaemon present" = "\tdaemon present"; "\tno entries" = "\tno entries"; "\tprinter is on device '%s' speed -1" = "\tprinter is on device ‘%s’ speed -1"; "\tprinting is disabled" = "\tprinting is disabled"; "\tprinting is enabled" = "\tprinting is enabled"; "\tqueued for %s" = "\tqueued for %s"; "\tqueuing is disabled" = "\tqueuing is disabled"; "\tqueuing is enabled" = "\tqueuing is enabled"; "\treason unknown" = "\treason unknown"; "\n DETAILED CONFORMANCE TEST RESULTS" = "\n DETAILED CONFORMANCE TEST RESULTS"; " REF: Page 15, section 3.1." = " REF: Page 15, section 3.1."; " REF: Page 15, section 3.2." = " REF: Page 15, section 3.2."; " REF: Page 19, section 3.3." = " REF: Page 19, section 3.3."; " REF: Page 20, section 3.4." = " REF: Page 20, section 3.4."; " REF: Page 27, section 3.5." = " REF: Page 27, section 3.5."; " REF: Page 42, section 5.2." = " REF: Page 42, section 5.2."; " REF: Pages 16-17, section 3.2." = " REF: Pages 16-17, section 3.2."; " REF: Pages 42-45, section 5.2." = " REF: Pages 42-45, section 5.2."; " REF: Pages 45-46, section 5.2." = " REF: Pages 45-46, section 5.2."; " REF: Pages 48-49, section 5.2." = " REF: Pages 48-49, section 5.2."; " REF: Pages 52-54, section 5.2." = " REF: Pages 52-54, section 5.2."; " %-39.39s %.0f bytes" = " %-39.39s %.0f bytes"; " PASS Default%s" = " PASS Default%s"; " PASS DefaultImageableArea" = " PASS DefaultImageableArea"; " PASS DefaultPaperDimension" = " PASS DefaultPaperDimension"; " PASS FileVersion" = " PASS FileVersion"; " PASS FormatVersion" = " PASS FormatVersion"; " PASS LanguageEncoding" = " PASS LanguageEncoding"; " PASS LanguageVersion" = " PASS LanguageVersion"; " PASS Manufacturer" = " PASS Manufacturer"; " PASS ModelName" = " PASS ModelName"; " PASS NickName" = " PASS NickName"; " PASS PCFileName" = " PASS PCFileName"; " PASS PSVersion" = " PASS PSVersion"; " PASS PageRegion" = " PASS PageRegion"; " PASS PageSize" = " PASS PageSize"; " PASS Product" = " PASS Product"; " PASS ShortNickName" = " PASS ShortNickName"; " WARN %s has no corresponding options." = " WARN %s has no corresponding options."; " WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2." = " WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2."; " WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n REF: Page 122, section 5.17" = " WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n REF: Page 122, section 5.17"; " WARN File contains a mix of CR, LF, and CR LF line endings." = " WARN File contains a mix of CR, LF, and CR LF line endings."; " WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3." = " WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3."; " WARN Line %d only contains whitespace." = " WARN Line %d only contains whitespace."; " WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3." = " WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3."; " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF." = " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF."; " WARN Obsolete PPD version %.1f.\n REF: Page 42, section 5.2." = " WARN Obsolete PPD version %.1f.\n REF: Page 42, section 5.2."; " WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3." = " WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3."; " WARN PCFileName should contain a unique filename.\n REF: Pages 61-62, section 5.3." = " WARN PCFileName should contain a unique filename.\n REF: Pages 61-62, section 5.3."; " WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7." = " WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7."; " WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7." = " WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7."; " WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3." = " WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3."; " %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")." = " %s “%s %s” conflicts with “%s %s”\n (constraint=“%s %s %s %s”)."; " %s %s %s does not exist." = " %s %s %s does not exist."; " %s %s file \"%s\" has the wrong capitalization." = " %s %s file “%s” has the wrong capitalization."; " %s Bad %s choice %s.\n REF: Page 122, section 5.17" = " %s Bad %s choice %s.\n REF: Page 122, section 5.17"; " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." = " %s Bad UTF-8 “%s” translation string for option %s, choice %s."; " %s Bad UTF-8 \"%s\" translation string for option %s." = " %s Bad UTF-8 “%s” translation string for option %s."; " %s Bad cupsFilter value \"%s\"." = " %s Bad cupsFilter value “%s”."; " %s Bad cupsFilter2 value \"%s\"." = " %s Bad cupsFilter2 value “%s”."; " %s Bad cupsICCProfile %s." = " %s Bad cupsICCProfile %s."; " %s Bad cupsPreFilter value \"%s\"." = " %s Bad cupsPreFilter value “%s”."; " %s Bad cupsUIConstraints %s: \"%s\"" = " %s Bad cupsUIConstraints %s: “%s”"; " %s Bad language \"%s\"." = " %s Bad language “%s”."; " %s Bad permissions on %s file \"%s\"." = " %s Bad permissions on %s file “%s”."; " %s Bad spelling of %s - should be %s." = " %s Bad spelling of %s - should be %s."; " %s Cannot provide both APScanAppPath and APScanAppBundleID." = " %s Cannot provide both APScanAppPath and APScanAppBundleID."; " %s Default choices conflicting." = " %s Default choices conflicting."; " %s Empty cupsUIConstraints %s" = " %s Empty cupsUIConstraints %s"; " %s Missing \"%s\" translation string for option %s, choice %s." = " %s Missing “%s” translation string for option %s, choice %s."; " %s Missing \"%s\" translation string for option %s." = " %s Missing “%s” translation string for option %s."; " %s Missing %s file \"%s\"." = " %s Missing %s file “%s”."; " %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14." = " %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14."; " %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14." = " %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14."; " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing choice *%s %s in UIConstraints “*%s %s *%s %s”."; " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" = " %s Missing choice *%s %s in cupsUIConstraints %s: “%s”"; " %s Missing cupsUIResolver %s" = " %s Missing cupsUIResolver %s"; " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing option %s in UIConstraints “*%s %s *%s %s”."; " %s Missing option %s in cupsUIConstraints %s: \"%s\"" = " %s Missing option %s in cupsUIConstraints %s: “%s”"; " %s No base translation \"%s\" is included in file." = " %s No base translation “%s” is included in file."; " %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17" = " %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17"; " %s Size \"%s\" defined for %s but not for %s." = " %s Size “%s” defined for %s but not for %s."; " %s Size \"%s\" has unexpected dimensions (%gx%g)." = " %s Size “%s” has unexpected dimensions (%gx%g)."; " %s Size \"%s\" should be \"%s\"." = " %s Size “%s” should be “%s”."; " %s Size \"%s\" should be the Adobe standard name \"%s\"." = " %s Size “%s” should be the Adobe standard name “%s”."; " %s cupsICCProfile %s hash value collides with %s." = " %s cupsICCProfile %s hash value collides with %s."; " %s cupsUIResolver %s causes a loop." = " %s cupsUIResolver %s causes a loop."; " %s cupsUIResolver %s does not list at least two different options." = " %s cupsUIResolver %s does not list at least two different options."; " **FAIL** %s must be 1284DeviceID\n REF: Page 72, section 5.5" = " **FAIL** %s must be 1284DeviceID\n REF: Page 72, section 5.5"; " **FAIL** Bad Default%s %s\n REF: Page 40, section 4.5." = " **FAIL** Bad Default%s %s\n REF: Page 40, section 4.5."; " **FAIL** Bad DefaultImageableArea %s\n REF: Page 102, section 5.15." = " **FAIL** Bad DefaultImageableArea %s\n REF: Page 102, section 5.15."; " **FAIL** Bad DefaultPaperDimension %s\n REF: Page 103, section 5.15." = " **FAIL** Bad DefaultPaperDimension %s\n REF: Page 103, section 5.15."; " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FileVersion “%s”\n REF: Page 56, section 5.3."; " **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FormatVersion “%s”\n REF: Page 56, section 5.3."; " **FAIL** Bad JobPatchFile attribute in file\n REF: Page 24, section 3.4." = " **FAIL** Bad JobPatchFile attribute in file\n REF: Page 24, section 3.4."; " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." = " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."; " **FAIL** Bad LanguageVersion %s - must be English." = " **FAIL** Bad LanguageVersion %s - must be English."; " **FAIL** Bad Manufacturer (should be \"%s\")\n REF: Page 211, table D.1." = " **FAIL** Bad Manufacturer (should be “%s”)\n REF: Page 211, table D.1."; " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3." = " **FAIL** Bad ModelName - “%c” not allowed in string.\n REF: Pages 59-60, section 5.3."; " **FAIL** Bad PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3." = " **FAIL** Bad PSVersion - not “(string) int”.\n REF: Pages 62-64, section 5.3."; " **FAIL** Bad Product - not \"(string)\".\n REF: Page 62, section 5.3." = " **FAIL** Bad Product - not “(string)”.\n REF: Page 62, section 5.3."; " **FAIL** Bad ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3." = " **FAIL** Bad ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3."; " **FAIL** Bad option %s choice %s\n REF: Page 84, section 5.9" = " **FAIL** Bad option %s choice %s\n REF: Page 84, section 5.9"; " **FAIL** Default option code cannot be interpreted: %s" = " **FAIL** Default option code cannot be interpreted: %s"; " **FAIL** Default translation string for option %s choice %s contains 8-bit characters." = " **FAIL** Default translation string for option %s choice %s contains 8-bit characters."; " **FAIL** Default translation string for option %s contains 8-bit characters." = " **FAIL** Default translation string for option %s contains 8-bit characters."; " **FAIL** Group names %s and %s differ only by case." = " **FAIL** Group names %s and %s differ only by case."; " **FAIL** Multiple occurrences of option %s choice name %s." = " **FAIL** Multiple occurrences of option %s choice name %s."; " **FAIL** Option %s choice names %s and %s differ only by case." = " **FAIL** Option %s choice names %s and %s differ only by case."; " **FAIL** Option names %s and %s differ only by case." = " **FAIL** Option names %s and %s differ only by case."; " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5." = " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5."; " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15." = " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15."; " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15." = " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15."; " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3." = " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3."; " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3." = " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3."; " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15." = " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15."; " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3." = " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3."; " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3." = " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3."; " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3." = " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3."; " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3." = " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3."; " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3." = " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3."; " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3." = " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3."; " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3." = " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3."; " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14." = " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14."; " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14." = " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14."; " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14." = " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14."; " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15." = " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15."; " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3." = " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3."; " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3." = " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3."; " **FAIL** Unable to open PPD file - %s on line %d." = " **FAIL** Unable to open PPD file - %s on line %d."; " %d ERRORS FOUND" = " %d ERRORS FOUND"; " NO ERRORS FOUND" = " NO ERRORS FOUND"; " --cr End lines with CR (Mac OS 9)." = " --cr End lines with CR (Mac OS 9)."; " --crlf End lines with CR + LF (Windows)." = " --crlf End lines with CR + LF (Windows)."; " --lf End lines with LF (UNIX/Linux/macOS)." = " --lf End lines with LF (UNIX/Linux/macOS)."; " --list-filters List filters that will be used." = " --list-filters List filters that will be used."; " -D Remove the input file when finished." = " -D Remove the input file when finished."; " -D name=value Set named variable to value." = " -D name=value Set named variable to value."; " -I include-dir Add include directory to search path." = " -I include-dir Add include directory to search path."; " -P filename.ppd Set PPD file." = " -P filename.ppd Set PPD file."; " -U username Specify username." = " -U username Specify username."; " -c catalog.po Load the specified message catalog." = " -c catalog.po Load the specified message catalog."; " -c cups-files.conf Set cups-files.conf file to use." = " -c cups-files.conf Set cups-files.conf file to use."; " -d output-dir Specify the output directory." = " -d output-dir Specify the output directory."; " -d printer Use the named printer." = " -d printer Use the named printer."; " -e Use every filter from the PPD file." = " -e Use every filter from the PPD file."; " -i mime/type Set input MIME type (otherwise auto-typed)." = " -i mime/type Set input MIME type (otherwise auto-typed)."; " -j job-id[,N] Filter file N from the specified job (default is file 1)." = " -j job-id[,N] Filter file N from the specified job (default is file 1)."; " -l lang[,lang,...] Specify the output language(s) (locale)." = " -l lang[,lang,…] Specify the output language(s) (locale)."; " -m Use the ModelName value as the filename." = " -m Use the ModelName value as the filename."; " -m mime/type Set output MIME type (otherwise application/pdf)." = " -m mime/type Set output MIME type (otherwise application/pdf)."; " -n copies Set number of copies." = " -n copies Set number of copies."; " -o filename.drv Set driver information file (otherwise ppdi.drv)." = " -o filename.drv Set driver information file (otherwise ppdi.drv)."; " -o filename.ppd[.gz] Set output file (otherwise stdout)." = " -o filename.ppd[.gz] Set output file (otherwise stdout)."; " -o name=value Set option(s)." = " -o name=value Set option(s)."; " -p filename.ppd Set PPD file." = " -p filename.ppd Set PPD file."; " -t Test PPDs instead of generating them." = " -t Test PPDs instead of generating them."; " -t title Set title." = " -t title Set title."; " -u Remove the PPD file when finished." = " -u Remove the PPD file when finished."; " -v Be verbose." = " -v Be verbose."; " -z Compress PPD files using GNU zip." = " -z Compress PPD files using GNU zip."; " FAIL" = " FAIL"; " PASS" = " PASS"; "! expression Unary NOT of expression" = "! expression Unary NOT of expression"; "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." = "“%s”: Bad URI value “%s” - %s (RFC 8011 section 5.1.6)."; "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." = "“%s”: Bad URI value “%s” - bad length %d (RFC 8011 section 5.1.6)."; "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." = "“%s”: Bad attribute name - bad length %d (RFC 8011 section 5.1.4)."; "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." = "“%s”: Bad attribute name - invalid character (RFC 8011 section 5.1.4)."; "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." = "“%s”: Bad boolean value %d (RFC 8011 section 5.1.21)."; "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." = "“%s”: Bad charset value “%s” - bad characters (RFC 8011 section 5.1.8)."; "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." = "“%s”: Bad charset value “%s” - bad length %d (RFC 8011 section 5.1.8)."; "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime UTC sign ‘%c’ (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime day %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime hours %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime minutes %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime month %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." = "“%s”: Bad dateTime seconds %u (RFC 8011 section 5.1.15)."; "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." = "“%s”: Bad enum value %d - out of range (RFC 8011 section 5.1.5)."; "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." = "“%s”: Bad keyword value “%s” - bad length %d (RFC 8011 section 5.1.4)."; "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)." = "“%s”: Bad keyword value “%s” - invalid character (RFC 8011 section 5.1.4)."; "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)." = "“%s”: Bad mimeMediaType value “%s” - bad characters (RFC 8011 section 5.1.10)."; "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)." = "“%s”: Bad mimeMediaType value “%s” - bad length %d (RFC 8011 section 5.1.10)."; "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." = "“%s”: Bad name value “%s” - bad UTF-8 sequence (RFC 8011 section 5.1.3)."; "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)." = "“%s”: Bad name value “%s” - bad control character (PWG 5100.14 section 8.1)."; "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." = "“%s”: Bad name value “%s” - bad length %d (RFC 8011 section 5.1.3)."; "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)." = "“%s”: Bad naturalLanguage value “%s” - bad characters (RFC 8011 section 5.1.9)."; "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)." = "“%s”: Bad naturalLanguage value “%s” - bad length %d (RFC 8011 section 5.1.9)."; "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." = "“%s”: Bad octetString value - bad length %d (RFC 8011 section 5.1.20)."; "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)." = "“%s”: Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)."; "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)." = "“%s”: Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)."; "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)." = "“%s”: Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)."; "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)." = "“%s”: Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)."; "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." = "“%s”: Bad text value “%s” - bad UTF-8 sequence (RFC 8011 section 5.1.2)."; "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)." = "“%s”: Bad text value “%s” - bad control character (PWG 5100.14 section 8.3)."; "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." = "“%s”: Bad text value “%s” - bad length %d (RFC 8011 section 5.1.2)."; "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." = "“%s”: Bad uriScheme value “%s” - bad characters (RFC 8011 section 5.1.7)."; "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." = "“%s”: Bad uriScheme value “%s” - bad length %d (RFC 8011 section 5.1.7)."; "\"requesting-user-name\" attribute in wrong group." = "“requesting-user-name” attribute in wrong group."; "\"requesting-user-name\" attribute with wrong syntax." = "“requesting-user-name” attribute with wrong syntax."; "%-7s %-7.7s %-7d %-31.31s %.0f bytes" = "%-7s %-7.7s %-7d %-31.31s %.0f bytes"; "%d x %d mm" = "%d x %d mm"; "%g x %g \"" = "%g x %g ″"; "%s (%s)" = "%s (%s)"; "%s (%s, %s)" = "%s (%s, %s)"; "%s (Borderless)" = "%s (Borderless)"; "%s (Borderless, %s)" = "%s (Borderless, %s)"; "%s (Borderless, %s, %s)" = "%s (Borderless, %s, %s)"; "%s accepting requests since %s" = "%s accepting requests since %s"; "%s cannot be changed." = "%s cannot be changed."; "%s is not implemented by the CUPS version of lpc." = "%s is not implemented by the CUPS version of lpc."; "%s is not ready" = "%s is not ready"; "%s is ready" = "%s is ready"; "%s is ready and printing" = "%s is ready and printing"; "%s job-id user title copies options [file]" = "%s job-id user title copies options [file]"; "%s not accepting requests since %s -" = "%s not accepting requests since %s -"; "%s not supported." = "%s not supported."; "%s/%s accepting requests since %s" = "%s/%s accepting requests since %s"; "%s/%s not accepting requests since %s -" = "%s/%s not accepting requests since %s -"; "%s: %-33.33s [job %d localhost]" = "%s: %-33.33s [job %d localhost]"; // TRANSLATORS: Message is "subject: error" "%s: %s" = "%s: %s"; "%s: %s failed: %s" = "%s: %s failed: %s"; "%s: Bad printer URI \"%s\"." = "%s: Bad printer URI “%s”."; "%s: Bad version %s for \"-V\"." = "%s: Bad version %s for “-V”."; "%s: Don't know what to do." = "%s: Don’t know what to do."; "%s: Error - %s" = "%s: Error - %s"; "%s: Error - %s environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination “%s”."; "%s: Error - add '/version=1.1' to server name." = "%s: Error - add ‘/version=1.1’ to server name."; "%s: Error - bad job ID." = "%s: Error - bad job ID."; "%s: Error - cannot print files and alter jobs simultaneously." = "%s: Error - cannot print files and alter jobs simultaneously."; "%s: Error - cannot print from stdin if files or a job ID are provided." = "%s: Error - cannot print from stdin if files or a job ID are provided."; "%s: Error - copies must be 1 or more." = "%s: Error - copies must be 1 or more."; "%s: Error - expected character set after \"-S\" option." = "%s: Error - expected character set after “-S” option."; "%s: Error - expected content type after \"-T\" option." = "%s: Error - expected content type after “-T” option."; "%s: Error - expected copies after \"-#\" option." = "%s: Error - expected copies after “-#” option."; "%s: Error - expected copies after \"-n\" option." = "%s: Error - expected copies after “-n” option."; "%s: Error - expected destination after \"-P\" option." = "%s: Error - expected destination after “-P” option."; "%s: Error - expected destination after \"-d\" option." = "%s: Error - expected destination after “-d” option."; "%s: Error - expected form after \"-f\" option." = "%s: Error - expected form after “-f” option."; "%s: Error - expected hold name after \"-H\" option." = "%s: Error - expected hold name after “-H” option."; "%s: Error - expected hostname after \"-H\" option." = "%s: Error - expected hostname after “-H” option."; "%s: Error - expected hostname after \"-h\" option." = "%s: Error - expected hostname after “-h” option."; "%s: Error - expected mode list after \"-y\" option." = "%s: Error - expected mode list after “-y” option."; "%s: Error - expected name after \"-%c\" option." = "%s: Error - expected name after “-%c” option."; "%s: Error - expected option=value after \"-o\" option." = "%s: Error - expected option=value after “-o” option."; "%s: Error - expected page list after \"-P\" option." = "%s: Error - expected page list after “-P” option."; "%s: Error - expected priority after \"-%c\" option." = "%s: Error - expected priority after “-%c” option."; "%s: Error - expected reason text after \"-r\" option." = "%s: Error - expected reason text after “-r” option."; "%s: Error - expected title after \"-t\" option." = "%s: Error - expected title after “-t” option."; "%s: Error - expected username after \"-U\" option." = "%s: Error - expected username after “-U” option."; "%s: Error - expected username after \"-u\" option." = "%s: Error - expected username after “-u” option."; "%s: Error - expected value after \"-%c\" option." = "%s: Error - expected value after “-%c” option."; "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." = "%s: Error - need “completed”, “not-completed”, or “all” after “-W” option."; "%s: Error - no default destination available." = "%s: Error - no default destination available."; "%s: Error - priority must be between 1 and 100." = "%s: Error - priority must be between 1 and 100."; "%s: Error - scheduler not responding." = "%s: Error - scheduler not responding."; "%s: Error - too many files - \"%s\"." = "%s: Error - too many files - “%s”."; "%s: Error - unable to access \"%s\" - %s" = "%s: Error - unable to access “%s” - %s"; "%s: Error - unable to queue from stdin - %s." = "%s: Error - unable to queue from stdin - %s."; "%s: Error - unknown destination \"%s\"." = "%s: Error - unknown destination “%s”."; "%s: Error - unknown destination \"%s/%s\"." = "%s: Error - unknown destination “%s/%s”."; "%s: Error - unknown option \"%c\"." = "%s: Error - unknown option “%c”."; "%s: Error - unknown option \"%s\"." = "%s: Error - unknown option “%s”."; "%s: Expected job ID after \"-i\" option." = "%s: Expected job ID after “-i” option."; "%s: Invalid destination name in list \"%s\"." = "%s: Invalid destination name in list “%s”."; "%s: Invalid filter string \"%s\"." = "%s: Invalid filter string “%s”."; "%s: Missing filename for \"-P\"." = "%s: Missing filename for “-P”."; "%s: Missing timeout for \"-T\"." = "%s: Missing timeout for “-T”."; "%s: Missing version for \"-V\"." = "%s: Missing version for “-V”."; "%s: Need job ID (\"-i jobid\") before \"-H restart\"." = "%s: Need job ID (“-i jobid”) before “-H restart”."; "%s: No filter to convert from %s/%s to %s/%s." = "%s: No filter to convert from %s/%s to %s/%s."; "%s: Operation failed: %s" = "%s: Operation failed: %s"; "%s: Sorry, no encryption support." = "%s: Sorry, no encryption support."; "%s: Unable to connect to \"%s:%d\": %s" = "%s: Unable to connect to “%s:%d”: %s"; "%s: Unable to connect to server." = "%s: Unable to connect to server."; "%s: Unable to contact server." = "%s: Unable to contact server."; "%s: Unable to create PPD file: %s" = "%s: Unable to create PPD file: %s"; "%s: Unable to determine MIME type of \"%s\"." = "%s: Unable to determine MIME type of “%s”."; "%s: Unable to open \"%s\": %s" = "%s: Unable to open “%s”: %s"; "%s: Unable to open %s: %s" = "%s: Unable to open %s: %s"; "%s: Unable to open PPD file: %s on line %d." = "%s: Unable to open PPD file: %s on line %d."; "%s: Unable to query printer: %s" = "%s: Unable to query printer: %s"; "%s: Unable to read MIME database from \"%s\" or \"%s\"." = "%s: Unable to read MIME database from “%s” or “%s”."; "%s: Unable to resolve \"%s\"." = "%s: Unable to resolve “%s”."; "%s: Unknown argument \"%s\"." = "%s: Unknown argument “%s”."; "%s: Unknown destination \"%s\"." = "%s: Unknown destination “%s”."; "%s: Unknown destination MIME type %s/%s." = "%s: Unknown destination MIME type %s/%s."; "%s: Unknown option \"%c\"." = "%s: Unknown option “%c”."; "%s: Unknown option \"%s\"." = "%s: Unknown option “%s”."; "%s: Unknown option \"-%c\"." = "%s: Unknown option “-%c”."; "%s: Unknown source MIME type %s/%s." = "%s: Unknown source MIME type %s/%s."; "%s: Warning - \"%c\" format modifier not supported - output may not be correct." = "%s: Warning - “%c” format modifier not supported - output may not be correct."; "%s: Warning - character set option ignored." = "%s: Warning - character set option ignored."; "%s: Warning - content type option ignored." = "%s: Warning - content type option ignored."; "%s: Warning - form option ignored." = "%s: Warning - form option ignored."; "%s: Warning - mode option ignored." = "%s: Warning - mode option ignored."; "( expressions ) Group expressions" = "( expressions ) Group expressions"; "- Cancel all jobs" = "- Cancel all jobs"; "-# num-copies Specify the number of copies to print" = "-# num-copies Specify the number of copies to print"; "--[no-]debug-logging Turn debug logging on/off" = "--[no-]debug-logging Turn debug logging on/off"; "--[no-]remote-admin Turn remote administration on/off" = "--[no-]remote-admin Turn remote administration on/off"; "--[no-]remote-any Allow/prevent access from the Internet" = "--[no-]remote-any Allow/prevent access from the Internet"; "--[no-]share-printers Turn printer sharing on/off" = "--[no-]share-printers Turn printer sharing on/off"; "--[no-]user-cancel-any Allow/prevent users to cancel any job" = "--[no-]user-cancel-any Allow/prevent users to cancel any job"; "--device-id device-id Show models matching the given IEEE 1284 device ID" = "--device-id device-id Show models matching the given IEEE 1284 device ID"; "--domain regex Match domain to regular expression" = "--domain regex Match domain to regular expression"; "--exclude-schemes scheme-list\n Exclude the specified URI schemes" = "--exclude-schemes scheme-list\n Exclude the specified URI schemes"; "--exec utility [argument ...] ;\n Execute program if true" = "--exec utility [argument …] ;\n Execute program if true"; "--false Always false" = "--false Always false"; "--help Show program help" = "--help Show program help"; "--hold Hold new jobs" = "--hold Hold new jobs"; "--host regex Match hostname to regular expression" = "--host regex Match hostname to regular expression"; "--include-schemes scheme-list\n Include only the specified URI schemes" = "--include-schemes scheme-list\n Include only the specified URI schemes"; "--ippserver filename Produce ippserver attribute file" = "--ippserver filename Produce ippserver attribute file"; "--language locale Show models matching the given locale" = "--language locale Show models matching the given locale"; "--local True if service is local" = "--local True if service is local"; "--ls List attributes" = "--ls List attributes"; "--make-and-model name Show models matching the given make and model name" = "--make-and-model name Show models matching the given make and model name"; "--name regex Match service name to regular expression" = "--name regex Match service name to regular expression"; "--no-web-forms Disable web forms for media and supplies" = "--no-web-forms Disable web forms for media and supplies"; "--not expression Unary NOT of expression" = "--not expression Unary NOT of expression"; "--path regex Match resource path to regular expression" = "--path regex Match resource path to regular expression"; "--port number[-number] Match port to number or range" = "--port number[-number] Match port to number or range"; "--print Print URI if true" = "--print Print URI if true"; "--print-name Print service name if true" = "--print-name Print service name if true"; "--product name Show models matching the given PostScript product" = "--product name Show models matching the given PostScript product"; "--quiet Quietly report match via exit code" = "--quiet Quietly report match via exit code"; "--release Release previously held jobs" = "--release Release previously held jobs"; "--remote True if service is remote" = "--remote True if service is remote"; "--stop-after-include-error\n Stop tests after a failed INCLUDE" = "--stop-after-include-error\n Stop tests after a failed INCLUDE"; "--timeout seconds Specify the maximum number of seconds to discover devices" = "--timeout seconds Specify the maximum number of seconds to discover devices"; "--true Always true" = "--true Always true"; "--txt key True if the TXT record contains the key" = "--txt key True if the TXT record contains the key"; "--txt-* regex Match TXT record key to regular expression" = "--txt-* regex Match TXT record key to regular expression"; "--uri regex Match URI to regular expression" = "--uri regex Match URI to regular expression"; "--version Show program version" = "--version Show program version"; "--version Show version" = "--version Show version"; "-1" = "-1"; "-10" = "-10"; "-100" = "-100"; "-105" = "-105"; "-11" = "-11"; "-110" = "-110"; "-115" = "-115"; "-12" = "-12"; "-120" = "-120"; "-13" = "-13"; "-14" = "-14"; "-15" = "-15"; "-2" = "-2"; "-2 Set 2-sided printing support (default=1-sided)" = "-2 Set 2-sided printing support (default=1-sided)"; "-20" = "-20"; "-25" = "-25"; "-3" = "-3"; "-30" = "-30"; "-35" = "-35"; "-4" = "-4"; "-4 Connect using IPv4" = "-4 Connect using IPv4"; "-40" = "-40"; "-45" = "-45"; "-5" = "-5"; "-50" = "-50"; "-55" = "-55"; "-6" = "-6"; "-6 Connect using IPv6" = "-6 Connect using IPv6"; "-60" = "-60"; "-65" = "-65"; "-7" = "-7"; "-70" = "-70"; "-75" = "-75"; "-8" = "-8"; "-80" = "-80"; "-85" = "-85"; "-9" = "-9"; "-90" = "-90"; "-95" = "-95"; "-C Send requests using chunking (default)" = "-C Send requests using chunking (default)"; "-D description Specify the textual description of the printer" = "-D description Specify the textual description of the printer"; "-D device-uri Set the device URI for the printer" = "-D device-uri Set the device URI for the printer"; "-E Enable and accept jobs on the printer (after -p)" = "-E Enable and accept jobs on the printer (after -p)"; "-E Encrypt the connection to the server" = "-E Encrypt the connection to the server"; "-E Test with encryption using HTTP Upgrade to TLS" = "-E Test with encryption using HTTP Upgrade to TLS"; "-F Run in the foreground but detach from console." = "-F Run in the foreground but detach from console."; "-F output-type/subtype Set the output format for the printer" = "-F output-type/subtype Set the output format for the printer"; "-H Show the default server and port" = "-H Show the default server and port"; "-H HH:MM Hold the job until the specified UTC time" = "-H HH:MM Hold the job until the specified UTC time"; "-H hold Hold the job until released/resumed" = "-H hold Hold the job until released/resumed"; "-H immediate Print the job as soon as possible" = "-H immediate Print the job as soon as possible"; "-H restart Reprint the job" = "-H restart Reprint the job"; "-H resume Resume a held job" = "-H resume Resume a held job"; "-H server[:port] Connect to the named server and port" = "-H server[:port] Connect to the named server and port"; "-I Ignore errors" = "-I Ignore errors"; "-I {filename,filters,none,profiles}\n Ignore specific warnings" = "-I {filename,filters,none,profiles}\n Ignore specific warnings"; "-K keypath Set location of server X.509 certificates and keys." = "-K keypath Set location of server X.509 certificates and keys."; "-L Send requests using content-length" = "-L Send requests using content-length"; "-L location Specify the textual location of the printer" = "-L location Specify the textual location of the printer"; "-M manufacturer Set manufacturer name (default=Test)" = "-M manufacturer Set manufacturer name (default=Test)"; "-P destination Show status for the specified destination" = "-P destination Show status for the specified destination"; "-P destination Specify the destination" = "-P destination Specify the destination"; "-P filename.plist Produce XML plist to a file and test report to standard output" = "-P filename.plist Produce XML plist to a file and test report to standard output"; "-P filename.ppd Load printer attributes from PPD file" = "-P filename.ppd Load printer attributes from PPD file"; "-P number[-number] Match port to number or range" = "-P number[-number] Match port to number or range"; "-P page-list Specify a list of pages to print" = "-P page-list Specify a list of pages to print"; "-R Show the ranking of jobs" = "-R Show the ranking of jobs"; "-R name-default Remove the default value for the named option" = "-R name-default Remove the default value for the named option"; "-R root-directory Set alternate root" = "-R root-directory Set alternate root"; "-S Test with encryption using HTTPS" = "-S Test with encryption using HTTPS"; "-T seconds Set the browse timeout in seconds" = "-T seconds Set the browse timeout in seconds"; "-T seconds Set the receive/send timeout in seconds" = "-T seconds Set the receive/send timeout in seconds"; "-T title Specify the job title" = "-T title Specify the job title"; "-U username Specify the username to use for authentication" = "-U username Specify the username to use for authentication"; "-U username Specify username to use for authentication" = "-U username Specify username to use for authentication"; "-V version Set default IPP version" = "-V version Set default IPP version"; "-W completed Show completed jobs" = "-W completed Show completed jobs"; "-W not-completed Show pending jobs" = "-W not-completed Show pending jobs"; "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}\n Issue warnings instead of errors" = "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}\n Issue warnings instead of errors"; "-X Produce XML plist instead of plain text" = "-X Produce XML plist instead of plain text"; "-a Cancel all jobs" = "-a Cancel all jobs"; "-a Show jobs on all destinations" = "-a Show jobs on all destinations"; "-a [destination(s)] Show the accepting state of destinations" = "-a [destination(s)] Show the accepting state of destinations"; "-a filename.conf Load printer attributes from conf file" = "-a filename.conf Load printer attributes from conf file"; "-c Make a copy of the print file(s)" = "-c Make a copy of the print file(s)"; "-c Produce CSV output" = "-c Produce CSV output"; "-c [class(es)] Show classes and their member printers" = "-c [class(es)] Show classes and their member printers"; "-c class Add the named destination to a class" = "-c class Add the named destination to a class"; "-c command Set print command" = "-c command Set print command"; "-c cupsd.conf Set cupsd.conf file to use." = "-c cupsd.conf Set cupsd.conf file to use."; "-d Show the default destination" = "-d Show the default destination"; "-d destination Set default destination" = "-d destination Set default destination"; "-d destination Set the named destination as the server default" = "-d destination Set the named destination as the server default"; "-d name=value Set named variable to value" = "-d name=value Set named variable to value"; "-d regex Match domain to regular expression" = "-d regex Match domain to regular expression"; "-d spool-directory Set spool directory" = "-d spool-directory Set spool directory"; "-e Show available destinations on the network" = "-e Show available destinations on the network"; "-f Run in the foreground." = "-f Run in the foreground."; "-f filename Set default request filename" = "-f filename Set default request filename"; "-f type/subtype[,...] Set supported file types" = "-f type/subtype[,…] Set supported file types"; "-h Show this usage message." = "-h Show this usage message."; "-h Validate HTTP response headers" = "-h Validate HTTP response headers"; "-h regex Match hostname to regular expression" = "-h regex Match hostname to regular expression"; "-h server[:port] Connect to the named server and port" = "-h server[:port] Connect to the named server and port"; "-i iconfile.png Set icon file" = "-i iconfile.png Set icon file"; "-i id Specify an existing job ID to modify" = "-i id Specify an existing job ID to modify"; "-i ppd-file Specify a PPD file for the printer" = "-i ppd-file Specify a PPD file for the printer"; "-i seconds Repeat the last file with the given time interval" = "-i seconds Repeat the last file with the given time interval"; "-k Keep job spool files" = "-k Keep job spool files"; "-l List attributes" = "-l List attributes"; "-l Produce plain text output" = "-l Produce plain text output"; "-l Run cupsd on demand." = "-l Run cupsd on demand."; "-l Show supported options and values" = "-l Show supported options and values"; "-l Show verbose (long) output" = "-l Show verbose (long) output"; "-l location Set location of printer" = "-l location Set location of printer"; "-m Send an email notification when the job completes" = "-m Send an email notification when the job completes"; "-m Show models" = "-m Show models"; "-m everywhere Specify the printer is compatible with IPP Everywhere" = "-m everywhere Specify the printer is compatible with IPP Everywhere"; "-m model Set model name (default=Printer)" = "-m model Set model name (default=Printer)"; "-m model Specify a standard model/PPD file for the printer" = "-m model Specify a standard model/PPD file for the printer"; "-n count Repeat the last file the given number of times" = "-n count Repeat the last file the given number of times"; "-n hostname Set hostname for printer" = "-n hostname Set hostname for printer"; "-n num-copies Specify the number of copies to print" = "-n num-copies Specify the number of copies to print"; "-n regex Match service name to regular expression" = "-n regex Match service name to regular expression"; "-o Name=Value Specify the default value for the named PPD option " = "-o Name=Value Specify the default value for the named PPD option "; "-o [destination(s)] Show jobs" = "-o [destination(s)] Show jobs"; "-o cupsIPPSupplies=false\n Disable supply level reporting via IPP" = "-o cupsIPPSupplies=false\n Disable supply level reporting via IPP"; "-o cupsSNMPSupplies=false\n Disable supply level reporting via SNMP" = "-o cupsSNMPSupplies=false\n Disable supply level reporting via SNMP"; "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" = "-o job-k-limit=N Specify the kilobyte limit for per-user quotas"; "-o job-page-limit=N Specify the page limit for per-user quotas" = "-o job-page-limit=N Specify the page limit for per-user quotas"; "-o job-quota-period=N Specify the per-user quota period in seconds" = "-o job-quota-period=N Specify the per-user quota period in seconds"; "-o job-sheets=standard Print a banner page with the job" = "-o job-sheets=standard Print a banner page with the job"; "-o media=size Specify the media size to use" = "-o media=size Specify the media size to use"; "-o name-default=value Specify the default value for the named option" = "-o name-default=value Specify the default value for the named option"; "-o name[=value] Set default option and value" = "-o name[=value] Set default option and value"; "-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)" = "-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)"; "-o option[=value] Specify a printer-specific option" = "-o option[=value] Specify a printer-specific option"; "-o orientation-requested=N\n Specify portrait (3) or landscape (4) orientation" = "-o orientation-requested=N\n Specify portrait (3) or landscape (4) orientation"; "-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)" = "-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)"; "-o printer-error-policy=name\n Specify the printer error policy" = "-o printer-error-policy=name\n Specify the printer error policy"; "-o printer-is-shared=true\n Share the printer" = "-o printer-is-shared=true\n Share the printer"; "-o printer-op-policy=name\n Specify the printer operation policy" = "-o printer-op-policy=name\n Specify the printer operation policy"; "-o sides=one-sided Specify 1-sided printing" = "-o sides=one-sided Specify 1-sided printing"; "-o sides=two-sided-long-edge\n Specify 2-sided portrait printing" = "-o sides=two-sided-long-edge\n Specify 2-sided portrait printing"; "-o sides=two-sided-short-edge\n Specify 2-sided landscape printing" = "-o sides=two-sided-short-edge\n Specify 2-sided landscape printing"; "-p Print URI if true" = "-p Print URI if true"; "-p [printer(s)] Show the processing state of destinations" = "-p [printer(s)] Show the processing state of destinations"; "-p destination Specify a destination" = "-p destination Specify a destination"; "-p destination Specify/add the named destination" = "-p destination Specify/add the named destination"; "-p port Set port number for printer" = "-p port Set port number for printer"; "-q Quietly report match via exit code" = "-q Quietly report match via exit code"; "-q Run silently" = "-q Run silently"; "-q Specify the job should be held for printing" = "-q Specify the job should be held for printing"; "-q priority Specify the priority from low (1) to high (100)" = "-q priority Specify the priority from low (1) to high (100)"; "-r Remove the file(s) after submission" = "-r Remove the file(s) after submission"; "-r Show whether the CUPS server is running" = "-r Show whether the CUPS server is running"; "-r True if service is remote" = "-r True if service is remote"; "-r Use 'relaxed' open mode" = "-r Use ‘relaxed’ open mode"; "-r class Remove the named destination from a class" = "-r class Remove the named destination from a class"; "-r reason Specify a reason message that others can see" = "-r reason Specify a reason message that others can see"; "-r subtype,[subtype] Set DNS-SD service subtype" = "-r subtype,[subtype] Set DNS-SD service subtype"; "-s Be silent" = "-s Be silent"; "-s Print service name if true" = "-s Print service name if true"; "-s Show a status summary" = "-s Show a status summary"; "-s cups-files.conf Set cups-files.conf file to use." = "-s cups-files.conf Set cups-files.conf file to use."; "-s speed[,color-speed] Set speed in pages per minute" = "-s speed[,color-speed] Set speed in pages per minute"; "-t Produce a test report" = "-t Produce a test report"; "-t Show all status information" = "-t Show all status information"; "-t Test the configuration file." = "-t Test the configuration file."; "-t key True if the TXT record contains the key" = "-t key True if the TXT record contains the key"; "-t title Specify the job title" = "-t title Specify the job title"; "-u [user(s)] Show jobs queued by the current or specified users" = "-u [user(s)] Show jobs queued by the current or specified users"; "-u allow:all Allow all users to print" = "-u allow:all Allow all users to print"; "-u allow:list Allow the list of users or groups (@name) to print" = "-u allow:list Allow the list of users or groups (@name) to print"; "-u deny:list Prevent the list of users or groups (@name) to print" = "-u deny:list Prevent the list of users or groups (@name) to print"; "-u owner Specify the owner to use for jobs" = "-u owner Specify the owner to use for jobs"; "-u regex Match URI to regular expression" = "-u regex Match URI to regular expression"; "-v Be verbose" = "-v Be verbose"; "-v Show devices" = "-v Show devices"; "-v [printer(s)] Show the devices for each destination" = "-v [printer(s)] Show the devices for each destination"; "-v device-uri Specify the device URI for the printer" = "-v device-uri Specify the device URI for the printer"; "-vv Be very verbose" = "-vv Be very verbose"; "-x Purge jobs rather than just canceling" = "-x Purge jobs rather than just canceling"; "-x destination Remove default options for destination" = "-x destination Remove default options for destination"; "-x destination Remove the named destination" = "-x destination Remove the named destination"; "-x utility [argument ...] ;\n Execute program if true" = "-x utility [argument …] ;\n Execute program if true"; "/etc/cups/lpoptions file names default destination that does not exist." = "/etc/cups/lpoptions file names default destination that does not exist."; "0" = "0"; "1" = "1"; "1 inch/sec." = "1 inch/sec."; "1.25x0.25\"" = "1.25x0.25″"; "1.25x2.25\"" = "1.25x2.25″"; "1.5 inch/sec." = "1.5 inch/sec."; "1.50x0.25\"" = "1.50x0.25″"; "1.50x0.50\"" = "1.50x0.50″"; "1.50x1.00\"" = "1.50x1.00″"; "1.50x2.00\"" = "1.50x2.00″"; "10" = "10"; "10 inches/sec." = "10 inches/sec."; "10 x 11" = "10 x 11"; "10 x 13" = "10 x 13"; "10 x 14" = "10 x 14"; "100" = "100"; "100 mm/sec." = "100 mm/sec."; "105" = "105"; "11" = "11"; "11 inches/sec." = "11 inches/sec."; "110" = "110"; "115" = "115"; "12" = "12"; "12 inches/sec." = "12 inches/sec."; "12 x 11" = "12 x 11"; "120" = "120"; "120 mm/sec." = "120 mm/sec."; "120x60dpi" = "120x60dpi"; "120x72dpi" = "120x72dpi"; "13" = "13"; "136dpi" = "136dpi"; "14" = "14"; "15" = "15"; "15 mm/sec." = "15 mm/sec."; "15 x 11" = "15 x 11"; "150 mm/sec." = "150 mm/sec."; "150dpi" = "150dpi"; "16" = "16"; "17" = "17"; "18" = "18"; "180dpi" = "180dpi"; "19" = "19"; "2" = "2"; "2 inches/sec." = "2 inches/sec."; "2-Sided Printing" = "2-Sided Printing"; "2.00x0.37\"" = "2.00x0.37″"; "2.00x0.50\"" = "2.00x0.50″"; "2.00x1.00\"" = "2.00x1.00″"; "2.00x1.25\"" = "2.00x1.25″"; "2.00x2.00\"" = "2.00x2.00″"; "2.00x3.00\"" = "2.00x3.00″"; "2.00x4.00\"" = "2.00x4.00″"; "2.00x5.50\"" = "2.00x5.50″"; "2.25x0.50\"" = "2.25x0.50″"; "2.25x1.25\"" = "2.25x1.25″"; "2.25x4.00\"" = "2.25x4.00″"; "2.25x5.50\"" = "2.25x5.50″"; "2.38x5.50\"" = "2.38x5.50″"; "2.5 inches/sec." = "2.5 inches/sec."; "2.50x1.00\"" = "2.50x1.00″"; "2.50x2.00\"" = "2.50x2.00″"; "2.75x1.25\"" = "2.75x1.25″"; "2.9 x 1\"" = "2.9 x 1″"; "20" = "20"; "20 mm/sec." = "20 mm/sec."; "200 mm/sec." = "200 mm/sec."; "203dpi" = "203dpi"; "21" = "21"; "22" = "22"; "23" = "23"; "24" = "24"; "24-Pin Series" = "24-Pin Series"; "240x72dpi" = "240x72dpi"; "25" = "25"; "250 mm/sec." = "250 mm/sec."; "26" = "26"; "27" = "27"; "28" = "28"; "29" = "29"; "3" = "3"; "3 inches/sec." = "3 inches/sec."; "3 x 5" = "3 x 5"; "3.00x1.00\"" = "3.00x1.00″"; "3.00x1.25\"" = "3.00x1.25″"; "3.00x2.00\"" = "3.00x2.00″"; "3.00x3.00\"" = "3.00x3.00″"; "3.00x5.00\"" = "3.00x5.00″"; "3.25x2.00\"" = "3.25x2.00″"; "3.25x5.00\"" = "3.25x5.00″"; "3.25x5.50\"" = "3.25x5.50″"; "3.25x5.83\"" = "3.25x5.83″"; "3.25x7.83\"" = "3.25x7.83″"; "3.5 x 5" = "3.5 x 5"; "3.5\" Disk" = "3.5″ Disk"; "3.50x1.00\"" = "3.50x1.00″"; "30" = "30"; "30 mm/sec." = "30 mm/sec."; "300 mm/sec." = "300 mm/sec."; "300dpi" = "300dpi"; "35" = "35"; "360dpi" = "360dpi"; "360x180dpi" = "360x180dpi"; "4" = "4"; "4 inches/sec." = "4 inches/sec."; "4.00x1.00\"" = "4.00x1.00″"; "4.00x13.00\"" = "4.00x13.00″"; "4.00x2.00\"" = "4.00x2.00″"; "4.00x2.50\"" = "4.00x2.50″"; "4.00x3.00\"" = "4.00x3.00″"; "4.00x4.00\"" = "4.00x4.00″"; "4.00x5.00\"" = "4.00x5.00″"; "4.00x6.00\"" = "4.00x6.00″"; "4.00x6.50\"" = "4.00x6.50″"; "40" = "40"; "40 mm/sec." = "40 mm/sec."; "45" = "45"; "5" = "5"; "5 inches/sec." = "5 inches/sec."; "5 x 7" = "5 x 7"; "50" = "50"; "55" = "55"; "6" = "6"; "6 inches/sec." = "6 inches/sec."; "6.00x1.00\"" = "6.00x1.00″"; "6.00x2.00\"" = "6.00x2.00″"; "6.00x3.00\"" = "6.00x3.00″"; "6.00x4.00\"" = "6.00x4.00″"; "6.00x5.00\"" = "6.00x5.00″"; "6.00x6.00\"" = "6.00x6.00″"; "6.00x6.50\"" = "6.00x6.50″"; "60" = "60"; "60 mm/sec." = "60 mm/sec."; "600dpi" = "600dpi"; "60dpi" = "60dpi"; "60x72dpi" = "60x72dpi"; "65" = "65"; "7" = "7"; "7 inches/sec." = "7 inches/sec."; "7 x 9" = "7 x 9"; "70" = "70"; "75" = "75"; "8" = "8"; "8 inches/sec." = "8 inches/sec."; "8 x 10" = "8 x 10"; "8.00x1.00\"" = "8.00x1.00″"; "8.00x2.00\"" = "8.00x2.00″"; "8.00x3.00\"" = "8.00x3.00″"; "8.00x4.00\"" = "8.00x4.00″"; "8.00x5.00\"" = "8.00x5.00″"; "8.00x6.00\"" = "8.00x6.00″"; "8.00x6.50\"" = "8.00x6.50″"; "80" = "80"; "80 mm/sec." = "80 mm/sec."; "85" = "85"; "9" = "9"; "9 inches/sec." = "9 inches/sec."; "9 x 11" = "9 x 11"; "9 x 12" = "9 x 12"; "9-Pin Series" = "9-Pin Series"; "90" = "90"; "95" = "95"; "?Invalid help command unknown." = "?Invalid help command unknown."; "A class named \"%s\" already exists." = "A class named “%s” already exists."; "A printer named \"%s\" already exists." = "A printer named “%s” already exists."; "A0" = "A0"; "A0 Long Edge" = "A0 Long Edge"; "A1" = "A1"; "A1 Long Edge" = "A1 Long Edge"; "A10" = "A10"; "A2" = "A2"; "A2 Long Edge" = "A2 Long Edge"; "A3" = "A3"; "A3 Long Edge" = "A3 Long Edge"; "A3 Oversize" = "A3 Oversize"; "A3 Oversize Long Edge" = "A3 Oversize Long Edge"; "A4" = "A4"; "A4 Long Edge" = "A4 Long Edge"; "A4 Oversize" = "A4 Oversize"; "A4 Small" = "A4 Small"; "A5" = "A5"; "A5 Long Edge" = "A5 Long Edge"; "A5 Oversize" = "A5 Oversize"; "A6" = "A6"; "A6 Long Edge" = "A6 Long Edge"; "A7" = "A7"; "A8" = "A8"; "A9" = "A9"; "ANSI A" = "ANSI A"; "ANSI B" = "ANSI B"; "ANSI C" = "ANSI C"; "ANSI D" = "ANSI D"; "ANSI E" = "ANSI E"; "ARCH C" = "ARCH C"; "ARCH C Long Edge" = "ARCH C Long Edge"; "ARCH D" = "ARCH D"; "ARCH D Long Edge" = "ARCH D Long Edge"; "ARCH E" = "ARCH E"; "ARCH E Long Edge" = "ARCH E Long Edge"; "Accept Jobs" = "Accept Jobs"; "Accepted" = "Accepted"; "Add Class" = "Add Class"; "Add Printer" = "Add Printer"; "Address" = "Address"; "Administration" = "Administration"; "Always" = "Always"; "AppSocket/HP JetDirect" = "AppSocket/HP JetDirect"; "Applicator" = "Applicator"; "Attempt to set %s printer-state to bad value %d." = "Attempt to set %s printer-state to bad value %d."; "Attribute \"%s\" is in the wrong group." = "Attribute “%s” is in the wrong group."; "Attribute \"%s\" is the wrong value type." = "Attribute “%s” is the wrong value type."; "Attribute groups are out of order (%x < %x)." = "Attribute groups are out of order (%x < %x)."; "B0" = "B0"; "B1" = "B1"; "B10" = "B10"; "B2" = "B2"; "B3" = "B3"; "B4" = "B4"; "B5" = "B5"; "B5 Oversize" = "B5 Oversize"; "B6" = "B6"; "B7" = "B7"; "B8" = "B8"; "B9" = "B9"; "Bad \"printer-id\" value %d." = "Bad “printer-id” value %d."; "Bad '%s' value." = "Bad ‘%s’ value."; "Bad 'document-format' value \"%s\"." = "Bad ‘document-format’ value “%s”."; "Bad CloseUI/JCLCloseUI" = "Bad CloseUI/JCLCloseUI"; "Bad NULL dests pointer" = "Bad NULL dests pointer"; "Bad OpenGroup" = "Bad OpenGroup"; "Bad OpenUI/JCLOpenUI" = "Bad OpenUI/JCLOpenUI"; "Bad OrderDependency" = "Bad OrderDependency"; "Bad PPD cache file." = "Bad PPD cache file."; "Bad PPD file." = "Bad PPD file."; "Bad Request" = "Bad Request"; "Bad SNMP version number" = "Bad SNMP version number"; "Bad UIConstraints" = "Bad UIConstraints"; "Bad URI." = "Bad URI."; "Bad arguments to function" = "Bad arguments to function"; "Bad copies value %d." = "Bad copies value %d."; "Bad custom parameter" = "Bad custom parameter"; "Bad device-uri \"%s\"." = "Bad device-uri “%s”."; "Bad device-uri scheme \"%s\"." = "Bad device-uri scheme “%s”."; "Bad document-format \"%s\"." = "Bad document-format “%s”."; "Bad document-format-default \"%s\"." = "Bad document-format-default “%s”."; "Bad filename buffer" = "Bad filename buffer"; "Bad hostname/address in URI" = "Bad hostname/address in URI"; "Bad job-name value: %s" = "Bad job-name value: %s"; "Bad job-name value: Wrong type or count." = "Bad job-name value: Wrong type or count."; "Bad job-priority value." = "Bad job-priority value."; "Bad job-sheets value \"%s\"." = "Bad job-sheets value “%s”."; "Bad job-sheets value type." = "Bad job-sheets value type."; "Bad job-state value." = "Bad job-state value."; "Bad job-uri \"%s\"." = "Bad job-uri “%s”."; "Bad notify-pull-method \"%s\"." = "Bad notify-pull-method “%s”."; "Bad notify-recipient-uri \"%s\"." = "Bad notify-recipient-uri “%s”."; "Bad notify-user-data \"%s\"." = "Bad notify-user-data “%s”."; "Bad number-up value %d." = "Bad number-up value %d."; "Bad page-ranges values %d-%d." = "Bad page-ranges values %d-%d."; "Bad port number in URI" = "Bad port number in URI"; "Bad port-monitor \"%s\"." = "Bad port-monitor “%s”."; "Bad printer-state value %d." = "Bad printer-state value %d."; "Bad printer-uri." = "Bad printer-uri."; "Bad request ID %d." = "Bad request ID %d."; "Bad request version number %d.%d." = "Bad request version number %d.%d."; "Bad resource in URI" = "Bad resource in URI"; "Bad scheme in URI" = "Bad scheme in URI"; "Bad username in URI" = "Bad username in URI"; "Bad value string" = "Bad value string"; "Bad/empty URI" = "Bad/empty URI"; "Banners" = "Banners"; "Bond Paper" = "Bond Paper"; "Booklet" = "Booklet"; "Boolean expected for waiteof option \"%s\"." = "Boolean expected for waiteof option “%s”."; "Buffer overflow detected, aborting." = "Buffer overflow detected, aborting."; "CMYK" = "CMYK"; "CPCL Label Printer" = "CPCL Label Printer"; "Cancel Jobs" = "Cancel Jobs"; "Canceling print job." = "Canceling print job."; "Cannot change printer-is-shared for remote queues." = "Cannot change printer-is-shared for remote queues."; "Cannot share a remote Kerberized printer." = "Cannot share a remote Kerberized printer."; "Cassette" = "Cassette"; "Change Settings" = "Change Settings"; "Character set \"%s\" not supported." = "Character set “%s” not supported."; "Classes" = "Classes"; "Clean Print Heads" = "Clean Print Heads"; "Close-Job doesn't support the job-uri attribute." = "Close-Job doesn’t support the job-uri attribute."; "Color" = "Color"; "Color Mode" = "Color Mode"; "Commands may be abbreviated. Commands are:\n\nexit help quit status ?" = "Commands may be abbreviated. Commands are:\n\nexit help quit status ?"; "Community name uses indefinite length" = "Community name uses indefinite length"; "Connected to printer." = "Connected to printer."; "Connecting to printer." = "Connecting to printer."; "Continue" = "Continue"; "Continuous" = "Continuous"; "Control file sent successfully." = "Control file sent successfully."; "Copying print data." = "Copying print data."; "Created" = "Created"; "Credentials do not validate against site CA certificate." = "Credentials do not validate against site CA certificate."; "Credentials have expired." = "Credentials have expired."; "Custom" = "Custom"; "CustominCutInterval" = "CustominCutInterval"; "CustominTearInterval" = "CustominTearInterval"; "Cut" = "Cut"; "Cutter" = "Cutter"; "Dark" = "Dark"; "Darkness" = "Darkness"; "Data file sent successfully." = "Data file sent successfully."; "Deep Color" = "Deep Color"; "Deep Gray" = "Deep Gray"; "Delete Class" = "Delete Class"; "Delete Printer" = "Delete Printer"; "DeskJet Series" = "DeskJet Series"; "Destination \"%s\" is not accepting jobs." = "Destination “%s” is not accepting jobs."; "Device CMYK" = "Device CMYK"; "Device Gray" = "Device Gray"; "Device RGB" = "Device RGB"; "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s" = "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s"; "Direct Thermal Media" = "Direct Thermal Media"; "Directory \"%s\" contains a relative path." = "Directory “%s” contains a relative path."; "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "Directory “%s” has insecure permissions (0%o/uid=%d/gid=%d)."; "Directory \"%s\" is a file." = "Directory “%s” is a file."; "Directory \"%s\" not available: %s" = "Directory “%s” not available: %s"; "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "Directory “%s” permissions OK (0%o/uid=%d/gid=%d)."; "Disabled" = "Disabled"; "Document #%d does not exist in job #%d." = "Document #%d does not exist in job #%d."; "Draft" = "Draft"; "Duplexer" = "Duplexer"; "Dymo" = "Dymo"; "EPL1 Label Printer" = "EPL1 Label Printer"; "EPL2 Label Printer" = "EPL2 Label Printer"; "Edit Configuration File" = "Edit Configuration File"; "Encryption is not supported." = "Encryption is not supported."; // TRANSLATORS: Banner/cover sheet after the print job. "Ending Banner" = "Ending Banner"; "English" = "English"; "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." = "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."; "Envelope #10" = "Envelope #10"; "Envelope #11" = "Envelope #11"; "Envelope #12" = "Envelope #12"; "Envelope #14" = "Envelope #14"; "Envelope #9" = "Envelope #9"; "Envelope B4" = "Envelope B4"; "Envelope B5" = "Envelope B5"; "Envelope B6" = "Envelope B6"; "Envelope C0" = "Envelope C0"; "Envelope C1" = "Envelope C1"; "Envelope C2" = "Envelope C2"; "Envelope C3" = "Envelope C3"; "Envelope C4" = "Envelope C4"; "Envelope C5" = "Envelope C5"; "Envelope C6" = "Envelope C6"; "Envelope C65" = "Envelope C65"; "Envelope C7" = "Envelope C7"; "Envelope Choukei 3" = "Envelope Choukei 3"; "Envelope Choukei 3 Long Edge" = "Envelope Choukei 3 Long Edge"; "Envelope Choukei 4" = "Envelope Choukei 4"; "Envelope Choukei 4 Long Edge" = "Envelope Choukei 4 Long Edge"; "Envelope DL" = "Envelope DL"; "Envelope Feed" = "Envelope Feed"; "Envelope Invite" = "Envelope Invite"; "Envelope Italian" = "Envelope Italian"; "Envelope Kaku2" = "Envelope Kaku2"; "Envelope Kaku2 Long Edge" = "Envelope Kaku2 Long Edge"; "Envelope Kaku3" = "Envelope Kaku3"; "Envelope Kaku3 Long Edge" = "Envelope Kaku3 Long Edge"; "Envelope Monarch" = "Envelope Monarch"; "Envelope PRC1" = "Envelope PRC1"; "Envelope PRC1 Long Edge" = "Envelope PRC1 Long Edge"; "Envelope PRC10" = "Envelope PRC10"; "Envelope PRC10 Long Edge" = "Envelope PRC10 Long Edge"; "Envelope PRC2" = "Envelope PRC2"; "Envelope PRC2 Long Edge" = "Envelope PRC2 Long Edge"; "Envelope PRC3" = "Envelope PRC3"; "Envelope PRC3 Long Edge" = "Envelope PRC3 Long Edge"; "Envelope PRC4" = "Envelope PRC4"; "Envelope PRC4 Long Edge" = "Envelope PRC4 Long Edge"; "Envelope PRC5 Long Edge" = "Envelope PRC5 Long Edge"; "Envelope PRC5PRC5" = "Envelope PRC5PRC5"; "Envelope PRC6" = "Envelope PRC6"; "Envelope PRC6 Long Edge" = "Envelope PRC6 Long Edge"; "Envelope PRC7" = "Envelope PRC7"; "Envelope PRC7 Long Edge" = "Envelope PRC7 Long Edge"; "Envelope PRC8" = "Envelope PRC8"; "Envelope PRC8 Long Edge" = "Envelope PRC8 Long Edge"; "Envelope PRC9" = "Envelope PRC9"; "Envelope PRC9 Long Edge" = "Envelope PRC9 Long Edge"; "Envelope Personal" = "Envelope Personal"; "Envelope You4" = "Envelope You4"; "Envelope You4 Long Edge" = "Envelope You4 Long Edge"; "Environment Variables:" = "Environment Variables:"; "Epson" = "Epson"; "Error Policy" = "Error Policy"; "Error reading raster data." = "Error reading raster data."; "Error sending raster data." = "Error sending raster data."; "Error: need hostname after \"-h\" option." = "Error: need hostname after “-h” option."; "European Fanfold" = "European Fanfold"; "European Fanfold Legal" = "European Fanfold Legal"; "Every 10 Labels" = "Every 10 Labels"; "Every 2 Labels" = "Every 2 Labels"; "Every 3 Labels" = "Every 3 Labels"; "Every 4 Labels" = "Every 4 Labels"; "Every 5 Labels" = "Every 5 Labels"; "Every 6 Labels" = "Every 6 Labels"; "Every 7 Labels" = "Every 7 Labels"; "Every 8 Labels" = "Every 8 Labels"; "Every 9 Labels" = "Every 9 Labels"; "Every Label" = "Every Label"; "Executive" = "Executive"; "Expectation Failed" = "Expectation Failed"; "Expressions:" = "Expressions:"; "Fast Grayscale" = "Fast Grayscale"; "File \"%s\" contains a relative path." = "File “%s” contains a relative path."; "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "File “%s” has insecure permissions (0%o/uid=%d/gid=%d)."; "File \"%s\" is a directory." = "File “%s” is a directory."; "File \"%s\" not available: %s" = "File “%s” not available: %s"; "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "File “%s” permissions OK (0%o/uid=%d/gid=%d)."; "File Folder" = "File Folder"; "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." = "File device URIs have been disabled. To enable, see the FileDevice directive in “%s/cups-files.conf”."; "Finished page %d." = "Finished page %d."; "Finishing Preset" = "Finishing Preset"; "Fold" = "Fold"; "Folio" = "Folio"; "Forbidden" = "Forbidden"; "Found" = "Found"; "General" = "General"; "Generic" = "Generic"; "Get-Response-PDU uses indefinite length" = "Get-Response-PDU uses indefinite length"; "Glossy Paper" = "Glossy Paper"; "Got a printer-uri attribute but no job-id." = "Got a printer-uri attribute but no job-id."; "Grayscale" = "Grayscale"; "HP" = "HP"; "Hanging Folder" = "Hanging Folder"; "Hash buffer too small." = "Hash buffer too small."; "Help file not in index." = "Help file not in index."; "High" = "High"; "IPP 1setOf attribute with incompatible value tags." = "IPP 1setOf attribute with incompatible value tags."; "IPP attribute has no name." = "IPP attribute has no name."; "IPP attribute is not a member of the message." = "IPP attribute is not a member of the message."; "IPP begCollection value not 0 bytes." = "IPP begCollection value not 0 bytes."; "IPP boolean value not 1 byte." = "IPP boolean value not 1 byte."; "IPP date value not 11 bytes." = "IPP date value not 11 bytes."; "IPP endCollection value not 0 bytes." = "IPP endCollection value not 0 bytes."; "IPP enum value not 4 bytes." = "IPP enum value not 4 bytes."; "IPP extension tag larger than 0x7FFFFFFF." = "IPP extension tag larger than 0x7FFFFFFF."; "IPP integer value not 4 bytes." = "IPP integer value not 4 bytes."; "IPP language length overflows value." = "IPP language length overflows value."; "IPP language length too large." = "IPP language length too large."; "IPP member name is not empty." = "IPP member name is not empty."; "IPP memberName value is empty." = "IPP memberName value is empty."; "IPP memberName with no attribute." = "IPP memberName with no attribute."; "IPP name larger than 32767 bytes." = "IPP name larger than 32767 bytes."; "IPP nameWithLanguage value less than minimum 4 bytes." = "IPP nameWithLanguage value less than minimum 4 bytes."; "IPP octetString length too large." = "IPP octetString length too large."; "IPP rangeOfInteger value not 8 bytes." = "IPP rangeOfInteger value not 8 bytes."; "IPP resolution value not 9 bytes." = "IPP resolution value not 9 bytes."; "IPP string length overflows value." = "IPP string length overflows value."; "IPP textWithLanguage value less than minimum 4 bytes." = "IPP textWithLanguage value less than minimum 4 bytes."; "IPP value larger than 32767 bytes." = "IPP value larger than 32767 bytes."; "IPPFIND_SERVICE_DOMAIN Domain name" = "IPPFIND_SERVICE_DOMAIN Domain name"; "IPPFIND_SERVICE_HOSTNAME\n Fully-qualified domain name" = "IPPFIND_SERVICE_HOSTNAME\n Fully-qualified domain name"; "IPPFIND_SERVICE_NAME Service instance name" = "IPPFIND_SERVICE_NAME Service instance name"; "IPPFIND_SERVICE_PORT Port number" = "IPPFIND_SERVICE_PORT Port number"; "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" = "IPPFIND_SERVICE_REGTYPE DNS-SD registration type"; "IPPFIND_SERVICE_SCHEME URI scheme" = "IPPFIND_SERVICE_SCHEME URI scheme"; "IPPFIND_SERVICE_URI URI" = "IPPFIND_SERVICE_URI URI"; "IPPFIND_TXT_* Value of TXT record key" = "IPPFIND_TXT_* Value of TXT record key"; "ISOLatin1" = "ISOLatin1"; "Illegal control character" = "Illegal control character"; "Illegal main keyword string" = "Illegal main keyword string"; "Illegal option keyword string" = "Illegal option keyword string"; "Illegal translation string" = "Illegal translation string"; "Illegal whitespace character" = "Illegal whitespace character"; "Installable Options" = "Installable Options"; "Installed" = "Installed"; "IntelliBar Label Printer" = "IntelliBar Label Printer"; "Intellitech" = "Intellitech"; "Internal Server Error" = "Internal Server Error"; "Internal error" = "Internal error"; "Internet Postage 2-Part" = "Internet Postage 2-Part"; "Internet Postage 3-Part" = "Internet Postage 3-Part"; "Internet Printing Protocol" = "Internet Printing Protocol"; "Invalid group tag." = "Invalid group tag."; "Invalid media name arguments." = "Invalid media name arguments."; "Invalid media size." = "Invalid media size."; "Invalid named IPP attribute in collection." = "Invalid named IPP attribute in collection."; "Invalid ppd-name value." = "Invalid ppd-name value."; "Invalid printer command \"%s\"." = "Invalid printer command “%s”."; "JCL" = "JCL"; "JIS B0" = "JIS B0"; "JIS B1" = "JIS B1"; "JIS B10" = "JIS B10"; "JIS B2" = "JIS B2"; "JIS B3" = "JIS B3"; "JIS B4" = "JIS B4"; "JIS B4 Long Edge" = "JIS B4 Long Edge"; "JIS B5" = "JIS B5"; "JIS B5 Long Edge" = "JIS B5 Long Edge"; "JIS B6" = "JIS B6"; "JIS B6 Long Edge" = "JIS B6 Long Edge"; "JIS B7" = "JIS B7"; "JIS B8" = "JIS B8"; "JIS B9" = "JIS B9"; "Job #%d cannot be restarted - no files." = "Job #%d cannot be restarted - no files."; "Job #%d does not exist." = "Job #%d does not exist."; "Job #%d is already aborted - can't cancel." = "Job #%d is already aborted - can’t cancel."; "Job #%d is already canceled - can't cancel." = "Job #%d is already canceled - can’t cancel."; "Job #%d is already completed - can't cancel." = "Job #%d is already completed - can’t cancel."; "Job #%d is finished and cannot be altered." = "Job #%d is finished and cannot be altered."; "Job #%d is not complete." = "Job #%d is not complete."; "Job #%d is not held for authentication." = "Job #%d is not held for authentication."; "Job #%d is not held." = "Job #%d is not held."; "Job Completed" = "Job Completed"; "Job Created" = "Job Created"; "Job Options Changed" = "Job Options Changed"; "Job Stopped" = "Job Stopped"; "Job is completed and cannot be changed." = "Job is completed and cannot be changed."; "Job operation failed" = "Job operation failed"; "Job state cannot be changed." = "Job state cannot be changed."; "Job subscriptions cannot be renewed." = "Job subscriptions cannot be renewed."; "Jobs" = "Jobs"; "LPD/LPR Host or Printer" = "LPD/LPR Host or Printer"; "LPDEST environment variable names default destination that does not exist." = "LPDEST environment variable names default destination that does not exist."; "Label Printer" = "Label Printer"; "Label Top" = "Label Top"; "Language \"%s\" not supported." = "Language “%s” not supported."; "Large Address" = "Large Address"; "LaserJet Series PCL 4/5" = "LaserJet Series PCL 4/5"; "Letter Oversize" = "Letter Oversize"; "Letter Oversize Long Edge" = "Letter Oversize Long Edge"; "Light" = "Light"; "Line longer than the maximum allowed (255 characters)" = "Line longer than the maximum allowed (255 characters)"; "List Available Printers" = "List Available Printers"; "Listening on port %d." = "Listening on port %d."; "Local printer created." = "Local printer created."; "Long-Edge (Portrait)" = "Long-Edge (Portrait)"; "Looking for printer." = "Looking for printer."; "Manual Feed" = "Manual Feed"; "Media Size" = "Media Size"; "Media Source" = "Media Source"; "Media Tracking" = "Media Tracking"; "Media Type" = "Media Type"; "Medium" = "Medium"; "Memory allocation error" = "Memory allocation error"; "Missing CloseGroup" = "Missing CloseGroup"; "Missing CloseUI/JCLCloseUI" = "Missing CloseUI/JCLCloseUI"; "Missing PPD-Adobe-4.x header" = "Missing PPD-Adobe-4.x header"; "Missing asterisk in column 1" = "Missing asterisk in column 1"; "Missing document-number attribute." = "Missing document-number attribute."; "Missing form variable" = "Missing form variable"; "Missing last-document attribute in request." = "Missing last-document attribute in request."; "Missing media or media-col." = "Missing media or media-col."; "Missing media-size in media-col." = "Missing media-size in media-col."; "Missing notify-subscription-ids attribute." = "Missing notify-subscription-ids attribute."; "Missing option keyword" = "Missing option keyword"; "Missing requesting-user-name attribute." = "Missing requesting-user-name attribute."; "Missing required attribute \"%s\"." = "Missing required attribute “%s”."; "Missing required attributes." = "Missing required attributes."; "Missing resource in URI" = "Missing resource in URI"; "Missing scheme in URI" = "Missing scheme in URI"; "Missing value string" = "Missing value string"; "Missing x-dimension in media-size." = "Missing x-dimension in media-size."; "Missing y-dimension in media-size." = "Missing y-dimension in media-size."; "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s" = "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s"; "Modifiers:" = "Modifiers:"; "Modify Class" = "Modify Class"; "Modify Printer" = "Modify Printer"; "Move All Jobs" = "Move All Jobs"; "Move Job" = "Move Job"; "Moved Permanently" = "Moved Permanently"; "NULL PPD file pointer" = "NULL PPD file pointer"; "Name OID uses indefinite length" = "Name OID uses indefinite length"; "Nested classes are not allowed." = "Nested classes are not allowed."; "Never" = "Never"; "New credentials are not valid for name." = "New credentials are not valid for name."; "New credentials are older than stored credentials." = "New credentials are older than stored credentials."; "No" = "No"; "No Content" = "No Content"; "No IPP attributes." = "No IPP attributes."; "No PPD name" = "No PPD name"; "No VarBind SEQUENCE" = "No VarBind SEQUENCE"; "No active connection" = "No active connection"; "No active connection." = "No active connection."; "No active jobs on %s." = "No active jobs on %s."; "No attributes in request." = "No attributes in request."; "No authentication information provided." = "No authentication information provided."; "No common name specified." = "No common name specified."; "No community name" = "No community name"; "No default destination." = "No default destination."; "No default printer." = "No default printer."; "No destinations added." = "No destinations added."; "No device URI found in argv[0] or in DEVICE_URI environment variable." = "No device URI found in argv[0] or in DEVICE_URI environment variable."; "No error-index" = "No error-index"; "No error-status" = "No error-status"; "No file in print request." = "No file in print request."; "No modification time" = "No modification time"; "No name OID" = "No name OID"; "No pages were found." = "No pages were found."; "No printer name" = "No printer name"; "No printer-uri found" = "No printer-uri found"; "No printer-uri found for class" = "No printer-uri found for class"; "No printer-uri in request." = "No printer-uri in request."; "No request URI." = "No request URI."; "No request protocol version." = "No request protocol version."; "No request sent." = "No request sent."; "No request-id" = "No request-id"; "No stored credentials, not valid for name." = "No stored credentials, not valid for name."; "No subscription attributes in request." = "No subscription attributes in request."; "No subscriptions found." = "No subscriptions found."; "No variable-bindings SEQUENCE" = "No variable-bindings SEQUENCE"; "No version number" = "No version number"; "Non-continuous (Mark sensing)" = "Non-continuous (Mark sensing)"; "Non-continuous (Web sensing)" = "Non-continuous (Web sensing)"; "None" = "None"; "Normal" = "Normal"; "Not Found" = "Not Found"; "Not Implemented" = "Not Implemented"; "Not Installed" = "Not Installed"; "Not Modified" = "Not Modified"; "Not Supported" = "Not Supported"; "Not allowed to print." = "Not allowed to print."; "Note" = "Note"; "OK" = "OK"; "Off (1-Sided)" = "Off (1-Sided)"; "Oki" = "Oki"; "Online Help" = "Online Help"; "Only local users can create a local printer." = "Only local users can create a local printer."; "Open of %s failed: %s" = "Open of %s failed: %s"; "OpenGroup without a CloseGroup first" = "OpenGroup without a CloseGroup first"; "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" = "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"; "Operation Policy" = "Operation Policy"; "Option \"%s\" cannot be included via %%%%IncludeFeature." = "Option “%s” cannot be included via %%%%IncludeFeature."; "Options Installed" = "Options Installed"; "Options:" = "Options:"; "Other Media" = "Other Media"; "Other Tray" = "Other Tray"; "Out of date PPD cache file." = "Out of date PPD cache file."; "Out of memory." = "Out of memory."; "Output Mode" = "Output Mode"; "PCL Laser Printer" = "PCL Laser Printer"; "PRC16K" = "PRC16K"; "PRC16K Long Edge" = "PRC16K Long Edge"; "PRC32K" = "PRC32K"; "PRC32K Long Edge" = "PRC32K Long Edge"; "PRC32K Oversize" = "PRC32K Oversize"; "PRC32K Oversize Long Edge" = "PRC32K Oversize Long Edge"; "PRINTER environment variable names default destination that does not exist." = "PRINTER environment variable names default destination that does not exist."; "Packet does not contain a Get-Response-PDU" = "Packet does not contain a Get-Response-PDU"; "Packet does not start with SEQUENCE" = "Packet does not start with SEQUENCE"; "ParamCustominCutInterval" = "ParamCustominCutInterval"; "ParamCustominTearInterval" = "ParamCustominTearInterval"; "Password for %s on %s? " = "Password for %s on %s? "; "Pause Class" = "Pause Class"; "Pause Printer" = "Pause Printer"; "Peel-Off" = "Peel-Off"; "Photo" = "Photo"; "Photo Labels" = "Photo Labels"; "Plain Paper" = "Plain Paper"; "Policies" = "Policies"; "Port Monitor" = "Port Monitor"; "PostScript Printer" = "PostScript Printer"; "Postcard" = "Postcard"; "Postcard Double" = "Postcard Double"; "Postcard Double Long Edge" = "Postcard Double Long Edge"; "Postcard Long Edge" = "Postcard Long Edge"; "Preparing to print." = "Preparing to print."; "Print Density" = "Print Density"; "Print Job:" = "Print Job:"; "Print Mode" = "Print Mode"; "Print Quality" = "Print Quality"; "Print Rate" = "Print Rate"; "Print Self-Test Page" = "Print Self-Test Page"; "Print Speed" = "Print Speed"; "Print Test Page" = "Print Test Page"; "Print and Cut" = "Print and Cut"; "Print and Tear" = "Print and Tear"; "Print file sent." = "Print file sent."; "Print job canceled at printer." = "Print job canceled at printer."; "Print job too large." = "Print job too large."; "Print job was not accepted." = "Print job was not accepted."; "Printer \"%s\" already exists." = "Printer “%s” already exists."; "Printer Added" = "Printer Added"; "Printer Default" = "Printer Default"; "Printer Deleted" = "Printer Deleted"; "Printer Modified" = "Printer Modified"; "Printer Paused" = "Printer Paused"; "Printer Settings" = "Printer Settings"; "Printer cannot print supplied content." = "Printer cannot print supplied content."; "Printer cannot print with supplied options." = "Printer cannot print with supplied options."; "Printer does not support required IPP attributes or document formats." = "Printer does not support required IPP attributes or document formats."; "Printer:" = "Printer:"; "Printers" = "Printers"; "Printing page %d, %u%% complete." = "Printing page %d, %u%% complete."; "Punch" = "Punch"; "Quarto" = "Quarto"; "Quota limit reached." = "Quota limit reached."; "Rank Owner Job File(s) Total Size" = "Rank Owner Job File(s) Total Size"; "Reject Jobs" = "Reject Jobs"; "Remote host did not accept control file (%d)." = "Remote host did not accept control file (%d)."; "Remote host did not accept data file (%d)." = "Remote host did not accept data file (%d)."; "Reprint After Error" = "Reprint After Error"; "Request Entity Too Large" = "Request Entity Too Large"; "Resolution" = "Resolution"; "Resume Class" = "Resume Class"; "Resume Printer" = "Resume Printer"; "Return Address" = "Return Address"; "Rewind" = "Rewind"; "SEQUENCE uses indefinite length" = "SEQUENCE uses indefinite length"; "SSL/TLS Negotiation Error" = "SSL/TLS Negotiation Error"; "See Other" = "See Other"; "See remote printer." = "See remote printer."; "Self-signed credentials are blocked." = "Self-signed credentials are blocked."; "Sending data to printer." = "Sending data to printer."; "Server Restarted" = "Server Restarted"; "Server Security Auditing" = "Server Security Auditing"; "Server Started" = "Server Started"; "Server Stopped" = "Server Stopped"; "Server credentials not set." = "Server credentials not set."; "Service Unavailable" = "Service Unavailable"; "Set Allowed Users" = "Set Allowed Users"; "Set As Server Default" = "Set As Server Default"; "Set Class Options" = "Set Class Options"; "Set Printer Options" = "Set Printer Options"; "Set Publishing" = "Set Publishing"; "Shipping Address" = "Shipping Address"; "Short-Edge (Landscape)" = "Short-Edge (Landscape)"; "Special Paper" = "Special Paper"; "Spooling job, %.0f%% complete." = "Spooling job, %.0f%% complete."; "Standard" = "Standard"; "Staple" = "Staple"; // TRANSLATORS: Banner/cover sheet before the print job. "Starting Banner" = "Starting Banner"; "Starting page %d." = "Starting page %d."; "Statement" = "Statement"; "Subscription #%d does not exist." = "Subscription #%d does not exist."; "Substitutions:" = "Substitutions:"; "Super A" = "Super A"; "Super B" = "Super B"; "Super B/A3" = "Super B/A3"; "Switching Protocols" = "Switching Protocols"; "Tabloid" = "Tabloid"; "Tabloid Oversize" = "Tabloid Oversize"; "Tabloid Oversize Long Edge" = "Tabloid Oversize Long Edge"; "Tear" = "Tear"; "Tear-Off" = "Tear-Off"; "Tear-Off Adjust Position" = "Tear-Off Adjust Position"; "The \"%s\" attribute is required for print jobs." = "The “%s” attribute is required for print jobs."; "The %s attribute cannot be provided with job-ids." = "The %s attribute cannot be provided with job-ids."; "The '%s' Job Status attribute cannot be supplied in a job creation request." = "The ‘%s’ Job Status attribute cannot be supplied in a job creation request."; "The '%s' operation attribute cannot be supplied in a Create-Job request." = "The ‘%s’ operation attribute cannot be supplied in a Create-Job request."; "The PPD file \"%s\" could not be found." = "The PPD file “%s” could not be found."; "The PPD file \"%s\" could not be opened: %s" = "The PPD file “%s” could not be opened: %s"; "The PPD file could not be opened." = "The PPD file could not be opened."; "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." = "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."; "The notify-lease-duration attribute cannot be used with job subscriptions." = "The notify-lease-duration attribute cannot be used with job subscriptions."; "The notify-user-data value is too large (%d > 63 octets)." = "The notify-user-data value is too large (%d > 63 octets)."; "The printer configuration is incorrect or the printer no longer exists." = "The printer configuration is incorrect or the printer no longer exists."; "The printer did not respond." = "The printer did not respond."; "The printer is in use." = "The printer is in use."; "The printer is not connected." = "The printer is not connected."; "The printer is not responding." = "The printer is not responding."; "The printer is now connected." = "The printer is now connected."; "The printer is now online." = "The printer is now online."; "The printer is offline." = "The printer is offline."; "The printer is unreachable at this time." = "The printer is unreachable at this time."; "The printer may not exist or is unavailable at this time." = "The printer may not exist or is unavailable at this time."; "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the pound sign (#)." = "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (’ ″), question mark (?), or the pound sign (#)."; "The printer or class does not exist." = "The printer or class does not exist."; "The printer or class is not shared." = "The printer or class is not shared."; "The printer-uri \"%s\" contains invalid characters." = "The printer-uri “%s” contains invalid characters."; "The printer-uri attribute is required." = "The printer-uri attribute is required."; "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." = "The printer-uri must be of the form “ipp://HOSTNAME/classes/CLASSNAME”."; "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." = "The printer-uri must be of the form “ipp://HOSTNAME/printers/PRINTERNAME”."; "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." = "The web interface is currently disabled. Run “cupsctl WebInterface=yes” to enable it."; "The which-jobs value \"%s\" is not supported." = "The which-jobs value “%s” is not supported."; "There are too many subscriptions." = "There are too many subscriptions."; "There was an unrecoverable USB error." = "There was an unrecoverable USB error."; "Thermal Transfer Media" = "Thermal Transfer Media"; "Too many active jobs." = "Too many active jobs."; "Too many job-sheets values (%d > 2)." = "Too many job-sheets values (%d > 2)."; "Too many printer-state-reasons values (%d > %d)." = "Too many printer-state-reasons values (%d > %d)."; "Transparency" = "Transparency"; "Tray" = "Tray"; "Tray 1" = "Tray 1"; "Tray 2" = "Tray 2"; "Tray 3" = "Tray 3"; "Tray 4" = "Tray 4"; "Trust on first use is disabled." = "Trust on first use is disabled."; "URI Too Long" = "URI Too Long"; "URI too large" = "URI too large"; "US Fanfold" = "US Fanfold"; "US Ledger" = "US Ledger"; "US Legal" = "US Legal"; "US Legal Oversize" = "US Legal Oversize"; "US Letter" = "US Letter"; "US Letter Long Edge" = "US Letter Long Edge"; "US Letter Oversize" = "US Letter Oversize"; "US Letter Oversize Long Edge" = "US Letter Oversize Long Edge"; "US Letter Small" = "US Letter Small"; "Unable to access cupsd.conf file" = "Unable to access cupsd.conf file"; "Unable to access help file." = "Unable to access help file."; "Unable to add class" = "Unable to add class"; "Unable to add document to print job." = "Unable to add document to print job."; "Unable to add job for destination \"%s\"." = "Unable to add job for destination “%s”."; "Unable to add printer" = "Unable to add printer"; "Unable to allocate memory for file types." = "Unable to allocate memory for file types."; "Unable to allocate memory for page info" = "Unable to allocate memory for page info"; "Unable to allocate memory for pages array" = "Unable to allocate memory for pages array"; "Unable to allocate memory for printer" = "Unable to allocate memory for printer"; "Unable to cancel print job." = "Unable to cancel print job."; "Unable to change printer" = "Unable to change printer"; "Unable to change printer-is-shared attribute" = "Unable to change printer-is-shared attribute"; "Unable to change server settings" = "Unable to change server settings"; "Unable to compile mimeMediaType regular expression: %s." = "Unable to compile mimeMediaType regular expression: %s."; "Unable to compile naturalLanguage regular expression: %s." = "Unable to compile naturalLanguage regular expression: %s."; "Unable to configure printer options." = "Unable to configure printer options."; "Unable to connect to host." = "Unable to connect to host."; "Unable to contact printer, queuing on next printer in class." = "Unable to contact printer, queuing on next printer in class."; "Unable to copy PPD file - %s" = "Unable to copy PPD file - %s"; "Unable to copy PPD file." = "Unable to copy PPD file."; "Unable to create credentials from array." = "Unable to create credentials from array."; "Unable to create printer-uri" = "Unable to create printer-uri"; "Unable to create printer." = "Unable to create printer."; "Unable to create server credentials." = "Unable to create server credentials."; "Unable to create spool directory \"%s\": %s" = "Unable to create spool directory “%s”: %s"; "Unable to create temporary file" = "Unable to create temporary file"; "Unable to delete class" = "Unable to delete class"; "Unable to delete printer" = "Unable to delete printer"; "Unable to do maintenance command" = "Unable to do maintenance command"; "Unable to edit cupsd.conf files larger than 1MB" = "Unable to edit cupsd.conf files larger than 1MB"; "Unable to establish a secure connection to host (%d)." = "Unable to establish a secure connection to host (%d)."; "Unable to establish a secure connection to host (certificate chain invalid)." = "Unable to establish a secure connection to host (certificate chain invalid)."; "Unable to establish a secure connection to host (certificate not yet valid)." = "Unable to establish a secure connection to host (certificate not yet valid)."; "Unable to establish a secure connection to host (expired certificate)." = "Unable to establish a secure connection to host (expired certificate)."; "Unable to establish a secure connection to host (host name mismatch)." = "Unable to establish a secure connection to host (host name mismatch)."; "Unable to establish a secure connection to host (peer dropped connection before responding)." = "Unable to establish a secure connection to host (peer dropped connection before responding)."; "Unable to establish a secure connection to host (self-signed certificate)." = "Unable to establish a secure connection to host (self-signed certificate)."; "Unable to establish a secure connection to host (untrusted certificate)." = "Unable to establish a secure connection to host (untrusted certificate)."; "Unable to establish a secure connection to host." = "Unable to establish a secure connection to host."; "Unable to execute command \"%s\": %s" = "Unable to execute command “%s”: %s"; "Unable to find destination for job" = "Unable to find destination for job"; "Unable to find printer." = "Unable to find printer."; "Unable to find server credentials." = "Unable to find server credentials."; "Unable to get backend exit status." = "Unable to get backend exit status."; "Unable to get class list" = "Unable to get class list"; "Unable to get class status" = "Unable to get class status"; "Unable to get list of printer drivers" = "Unable to get list of printer drivers"; "Unable to get printer attributes" = "Unable to get printer attributes"; "Unable to get printer list" = "Unable to get printer list"; "Unable to get printer status" = "Unable to get printer status"; "Unable to get printer status." = "Unable to get printer status."; "Unable to load help index." = "Unable to load help index."; "Unable to locate printer \"%s\"." = "Unable to locate printer “%s”."; "Unable to locate printer." = "Unable to locate printer."; "Unable to modify class" = "Unable to modify class"; "Unable to modify printer" = "Unable to modify printer"; "Unable to move job" = "Unable to move job"; "Unable to move jobs" = "Unable to move jobs"; "Unable to open PPD file" = "Unable to open PPD file"; "Unable to open cupsd.conf file:" = "Unable to open cupsd.conf file:"; "Unable to open device file" = "Unable to open device file"; "Unable to open document #%d in job #%d." = "Unable to open document #%d in job #%d."; "Unable to open help file." = "Unable to open help file."; "Unable to open print file" = "Unable to open print file"; "Unable to open raster file" = "Unable to open raster file"; "Unable to print test page" = "Unable to print test page"; "Unable to read print data." = "Unable to read print data."; "Unable to register \"%s.%s\": %d" = "Unable to register “%s.%s”: %d"; "Unable to rename job document file." = "Unable to rename job document file."; "Unable to resolve printer-uri." = "Unable to resolve printer-uri."; "Unable to see in file" = "Unable to see in file"; "Unable to send command to printer driver" = "Unable to send command to printer driver"; "Unable to send data to printer." = "Unable to send data to printer."; "Unable to set options" = "Unable to set options"; "Unable to set server default" = "Unable to set server default"; "Unable to start backend process." = "Unable to start backend process."; "Unable to upload cupsd.conf file" = "Unable to upload cupsd.conf file"; "Unable to use legacy USB class driver." = "Unable to use legacy USB class driver."; "Unable to write print data" = "Unable to write print data"; "Unable to write uncompressed print data: %s" = "Unable to write uncompressed print data: %s"; "Unauthorized" = "Unauthorized"; "Units" = "Units"; "Unknown" = "Unknown"; "Unknown choice \"%s\" for option \"%s\"." = "Unknown choice “%s” for option “%s”."; "Unknown directive \"%s\" on line %d of \"%s\" ignored." = "Unknown directive “%s” on line %d of “%s” ignored."; "Unknown encryption option value: \"%s\"." = "Unknown encryption option value: “%s”."; "Unknown file order: \"%s\"." = "Unknown file order: “%s”."; "Unknown format character: \"%c\"." = "Unknown format character: “%c”."; "Unknown hash algorithm." = "Unknown hash algorithm."; "Unknown media size name." = "Unknown media size name."; "Unknown option \"%s\" with value \"%s\"." = "Unknown option “%s” with value “%s”."; "Unknown option \"%s\"." = "Unknown option “%s”."; "Unknown print mode: \"%s\"." = "Unknown print mode: “%s”."; "Unknown printer-error-policy \"%s\"." = "Unknown printer-error-policy “%s”."; "Unknown printer-op-policy \"%s\"." = "Unknown printer-op-policy “%s”."; "Unknown request method." = "Unknown request method."; "Unknown request version." = "Unknown request version."; "Unknown scheme in URI" = "Unknown scheme in URI"; "Unknown service name." = "Unknown service name."; "Unknown version option value: \"%s\"." = "Unknown version option value: “%s”."; "Unsupported 'compression' value \"%s\"." = "Unsupported ‘compression’ value “%s”."; "Unsupported 'document-format' value \"%s\"." = "Unsupported ‘document-format’ value “%s”."; "Unsupported 'job-hold-until' value." = "Unsupported ‘job-hold-until’ value."; "Unsupported 'job-name' value." = "Unsupported ‘job-name’ value."; "Unsupported character set \"%s\"." = "Unsupported character set “%s”."; "Unsupported compression \"%s\"." = "Unsupported compression “%s”."; "Unsupported document-format \"%s\"." = "Unsupported document-format “%s”."; "Unsupported document-format \"%s/%s\"." = "Unsupported document-format “%s/%s”."; "Unsupported format \"%s\"." = "Unsupported format “%s”."; "Unsupported margins." = "Unsupported margins."; "Unsupported media value." = "Unsupported media value."; "Unsupported number-up value %d, using number-up=1." = "Unsupported number-up value %d, using number-up=1."; "Unsupported number-up-layout value %s, using number-up-layout=lrtb." = "Unsupported number-up-layout value %s, using number-up-layout=lrtb."; "Unsupported page-border value %s, using page-border=none." = "Unsupported page-border value %s, using page-border=none."; "Unsupported raster data." = "Unsupported raster data."; "Unsupported value type" = "Unsupported value type"; "Upgrade Required" = "Upgrade Required"; "Usage: %s [options] destination(s)" = "Usage: %s [options] destination(s)"; "Usage: %s job-id user title copies options [file]" = "Usage: %s job-id user title copies options [file]"; "Usage: cancel [options] [id]\n cancel [options] [destination]\n cancel [options] [destination-id]" = "Usage: cancel [options] [id]\n cancel [options] [destination]\n cancel [options] [destination-id]"; "Usage: cupsctl [options] [param=value ... paramN=valueN]" = "Usage: cupsctl [options] [param=value … paramN=valueN]"; "Usage: cupsd [options]" = "Usage: cupsd [options]"; "Usage: cupsfilter [ options ] [ -- ] filename" = "Usage: cupsfilter [ options ] [ -- ] filename"; "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n program | cupstestppd [options] -" = "Usage: cupstestppd [options] filename1.ppd[.gz] [… filenameN.ppd[.gz]]\n program | cupstestppd [options] -"; "Usage: ippeveprinter [options] \"name\"" = "Usage: ippeveprinter [options] “name”"; "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n ippfind [options] name[.regtype[.domain.]] ... [expression]\n ippfind --help\n ippfind --version" = "Usage: ippfind [options] regtype[,subtype][.domain.] … [expression]\n ippfind [options] name[.regtype[.domain.]] … [expression]\n ippfind --help\n ippfind --version"; "Usage: ipptool [options] URI filename [ ... filenameN ]" = "Usage: ipptool [options] URI filename [ … filenameN ]"; "Usage: lp [options] [--] [file(s)]\n lp [options] -i id" = "Usage: lp [options] [--] [file(s)]\n lp [options] -i id"; "Usage: lpadmin [options] -d destination\n lpadmin [options] -p destination\n lpadmin [options] -p destination -c class\n lpadmin [options] -p destination -r class\n lpadmin [options] -x destination" = "Usage: lpadmin [options] -d destination\n lpadmin [options] -p destination\n lpadmin [options] -p destination -c class\n lpadmin [options] -p destination -r class\n lpadmin [options] -x destination"; "Usage: lpinfo [options] -m\n lpinfo [options] -v" = "Usage: lpinfo [options] -m\n lpinfo [options] -v"; "Usage: lpmove [options] job destination\n lpmove [options] source-destination destination" = "Usage: lpmove [options] job destination\n lpmove [options] source-destination destination"; "Usage: lpoptions [options] -d destination\n lpoptions [options] [-p destination] [-l]\n lpoptions [options] [-p destination] -o option[=value]\n lpoptions [options] -x destination" = "Usage: lpoptions [options] -d destination\n lpoptions [options] [-p destination] [-l]\n lpoptions [options] [-p destination] -o option[=value]\n lpoptions [options] -x destination"; "Usage: lpq [options] [+interval]" = "Usage: lpq [options] [+interval]"; "Usage: lpr [options] [file(s)]" = "Usage: lpr [options] [file(s)]"; "Usage: lprm [options] [id]\n lprm [options] -" = "Usage: lprm [options] [id]\n lprm [options] -"; "Usage: lpstat [options]" = "Usage: lpstat [options]"; "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" = "Usage: ppdc [options] filename.drv [ … filenameN.drv ]"; "Usage: ppdhtml [options] filename.drv >filename.html" = "Usage: ppdhtml [options] filename.drv >filename.html"; "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdi [options] filename.ppd [ … filenameN.ppd ]"; "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdmerge [options] filename.ppd [ … filenameN.ppd ]"; "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" = "Usage: ppdpo [options] -o filename.po filename.drv [ … filenameN.drv ]"; "Usage: snmp [host-or-ip-address]" = "Usage: snmp [host-or-ip-address]"; "Using spool directory \"%s\"." = "Using spool directory “%s”."; "Value uses indefinite length" = "Value uses indefinite length"; "VarBind uses indefinite length" = "VarBind uses indefinite length"; "Version uses indefinite length" = "Version uses indefinite length"; "Waiting for job to complete." = "Waiting for job to complete."; "Waiting for printer to become available." = "Waiting for printer to become available."; "Waiting for printer to finish." = "Waiting for printer to finish."; "Warning: This program will be removed in a future version of CUPS." = "Warning: This program will be removed in a future version of CUPS."; "Web Interface is Disabled" = "Web Interface is Disabled"; "Yes" = "Yes"; "You cannot access this page." = "You cannot access this page."; "You must access this page using the URL https://%s:%d%s." = "You must access this page using the URL https://%s:%d%s."; "Your account does not have the necessary privileges." = "Your account does not have the necessary privileges."; "ZPL Label Printer" = "ZPL Label Printer"; "Zebra" = "Zebra"; "aborted" = "aborted"; // TRANSLATORS: Accuracy Units "accuracy-units" = "Accuracy Units"; // TRANSLATORS: Millimeters "accuracy-units.mm" = "Millimeters"; // TRANSLATORS: Nanometers "accuracy-units.nm" = "Nanometers"; // TRANSLATORS: Micrometers "accuracy-units.um" = "Micrometers"; // TRANSLATORS: Bale Output "baling" = "Bale Output"; // TRANSLATORS: Bale Using "baling-type" = "Bale Using"; // TRANSLATORS: Band "baling-type.band" = "Band"; // TRANSLATORS: Shrink Wrap "baling-type.shrink-wrap" = "Shrink Wrap"; // TRANSLATORS: Wrap "baling-type.wrap" = "Wrap"; // TRANSLATORS: Bale After "baling-when" = "Bale After"; // TRANSLATORS: Job "baling-when.after-job" = "Job"; // TRANSLATORS: Sets "baling-when.after-sets" = "Sets"; // TRANSLATORS: Bind Output "binding" = "Bind Output"; // TRANSLATORS: Bind Edge "binding-reference-edge" = "Bind Edge"; // TRANSLATORS: Bottom "binding-reference-edge.bottom" = "Bottom"; // TRANSLATORS: Left "binding-reference-edge.left" = "Left"; // TRANSLATORS: Right "binding-reference-edge.right" = "Right"; // TRANSLATORS: Top "binding-reference-edge.top" = "Top"; // TRANSLATORS: Binder Type "binding-type" = "Binder Type"; // TRANSLATORS: Adhesive "binding-type.adhesive" = "Adhesive"; // TRANSLATORS: Comb "binding-type.comb" = "Comb"; // TRANSLATORS: Flat "binding-type.flat" = "Flat"; // TRANSLATORS: Padding "binding-type.padding" = "Padding"; // TRANSLATORS: Perfect "binding-type.perfect" = "Perfect"; // TRANSLATORS: Spiral "binding-type.spiral" = "Spiral"; // TRANSLATORS: Tape "binding-type.tape" = "Tape"; // TRANSLATORS: Velo "binding-type.velo" = "Velo"; "canceled" = "canceled"; // TRANSLATORS: Chamber Humidity "chamber-humidity" = "Chamber Humidity"; // TRANSLATORS: Chamber Temperature "chamber-temperature" = "Chamber Temperature"; // TRANSLATORS: Print Job Cost "charge-info-message" = "Print Job Cost"; // TRANSLATORS: Coat Sheets "coating" = "Coat Sheets"; // TRANSLATORS: Add Coating To "coating-sides" = "Add Coating To"; // TRANSLATORS: Back "coating-sides.back" = "Back"; // TRANSLATORS: Front and Back "coating-sides.both" = "Front and Back"; // TRANSLATORS: Front "coating-sides.front" = "Front"; // TRANSLATORS: Type of Coating "coating-type" = "Type of Coating"; // TRANSLATORS: Archival "coating-type.archival" = "Archival"; // TRANSLATORS: Archival Glossy "coating-type.archival-glossy" = "Archival Glossy"; // TRANSLATORS: Archival Matte "coating-type.archival-matte" = "Archival Matte"; // TRANSLATORS: Archival Semi Gloss "coating-type.archival-semi-gloss" = "Archival Semi Gloss"; // TRANSLATORS: Glossy "coating-type.glossy" = "Glossy"; // TRANSLATORS: High Gloss "coating-type.high-gloss" = "High Gloss"; // TRANSLATORS: Matte "coating-type.matte" = "Matte"; // TRANSLATORS: Semi-gloss "coating-type.semi-gloss" = "Semi-gloss"; // TRANSLATORS: Silicone "coating-type.silicone" = "Silicone"; // TRANSLATORS: Translucent "coating-type.translucent" = "Translucent"; "completed" = "completed"; // TRANSLATORS: Print Confirmation Sheet "confirmation-sheet-print" = "Print Confirmation Sheet"; // TRANSLATORS: Copies "copies" = "Copies"; // TRANSLATORS: Back Cover "cover-back" = "Back Cover"; // TRANSLATORS: Front Cover "cover-front" = "Front Cover"; // TRANSLATORS: Cover Sheet Info "cover-sheet-info" = "Cover Sheet Info"; // TRANSLATORS: Date Time "cover-sheet-info-supported.date-time" = "Date Time"; // TRANSLATORS: From Name "cover-sheet-info-supported.from-name" = "From Name"; // TRANSLATORS: Logo "cover-sheet-info-supported.logo" = "Logo"; // TRANSLATORS: Message "cover-sheet-info-supported.message" = "Message"; // TRANSLATORS: Organization "cover-sheet-info-supported.organization" = "Organization"; // TRANSLATORS: Subject "cover-sheet-info-supported.subject" = "Subject"; // TRANSLATORS: To Name "cover-sheet-info-supported.to-name" = "To Name"; // TRANSLATORS: Printed Cover "cover-type" = "Printed Cover"; // TRANSLATORS: No Cover "cover-type.no-cover" = "No Cover"; // TRANSLATORS: Back Only "cover-type.print-back" = "Back Only"; // TRANSLATORS: Front and Back "cover-type.print-both" = "Front and Back"; // TRANSLATORS: Front Only "cover-type.print-front" = "Front Only"; // TRANSLATORS: None "cover-type.print-none" = "None"; // TRANSLATORS: Cover Output "covering" = "Cover Output"; // TRANSLATORS: Add Cover "covering-name" = "Add Cover"; // TRANSLATORS: Plain "covering-name.plain" = "Plain"; // TRANSLATORS: Pre-cut "covering-name.pre-cut" = "Pre-cut"; // TRANSLATORS: Pre-printed "covering-name.pre-printed" = "Pre-printed"; "cups-deviced failed to execute." = "cups-deviced failed to execute."; "cups-driverd failed to execute." = "cups-driverd failed to execute."; "cupsctl: Cannot set %s directly." = "cupsctl: Cannot set %s directly."; "cupsctl: Unable to connect to server: %s" = "cupsctl: Unable to connect to server: %s"; "cupsctl: Unknown option \"%s\"" = "cupsctl: Unknown option “%s”"; "cupsctl: Unknown option \"-%c\"" = "cupsctl: Unknown option “-%c”"; "cupsd: Expected config filename after \"-c\" option." = "cupsd: Expected config filename after “-c” option."; "cupsd: Expected cups-files.conf filename after \"-s\" option." = "cupsd: Expected cups-files.conf filename after “-s” option."; "cupsd: On-demand support not compiled in, running in normal mode." = "cupsd: On-demand support not compiled in, running in normal mode."; "cupsd: Relative cups-files.conf filename not allowed." = "cupsd: Relative cups-files.conf filename not allowed."; "cupsd: Unable to get current directory." = "cupsd: Unable to get current directory."; "cupsd: Unable to get path to cups-files.conf file." = "cupsd: Unable to get path to cups-files.conf file."; "cupsd: Unknown argument \"%s\" - aborting." = "cupsd: Unknown argument “%s” - aborting."; "cupsd: Unknown option \"%c\" - aborting." = "cupsd: Unknown option “%c” - aborting."; "cupsfilter: Invalid document number %d." = "cupsfilter: Invalid document number %d."; "cupsfilter: Invalid job ID %d." = "cupsfilter: Invalid job ID %d."; "cupsfilter: Only one filename can be specified." = "cupsfilter: Only one filename can be specified."; "cupsfilter: Unable to get job file - %s" = "cupsfilter: Unable to get job file - %s"; "cupstestppd: The -q option is incompatible with the -v option." = "cupstestppd: The -q option is incompatible with the -v option."; "cupstestppd: The -v option is incompatible with the -q option." = "cupstestppd: The -v option is incompatible with the -q option."; // TRANSLATORS: Detailed Status Message "detailed-status-message" = "Detailed Status Message"; "device for %s/%s: %s" = "device for %s/%s: %s"; "device for %s: %s" = "device for %s: %s"; // TRANSLATORS: Copies "document-copies" = "Copies"; // TRANSLATORS: Document Privacy Attributes "document-privacy-attributes" = "Document Privacy Attributes"; // TRANSLATORS: All "document-privacy-attributes.all" = "All"; // TRANSLATORS: Default "document-privacy-attributes.default" = "Default"; // TRANSLATORS: Document Description "document-privacy-attributes.document-description" = "Document Description"; // TRANSLATORS: Document Template "document-privacy-attributes.document-template" = "Document Template"; // TRANSLATORS: None "document-privacy-attributes.none" = "None"; // TRANSLATORS: Document Privacy Scope "document-privacy-scope" = "Document Privacy Scope"; // TRANSLATORS: All "document-privacy-scope.all" = "All"; // TRANSLATORS: Default "document-privacy-scope.default" = "Default"; // TRANSLATORS: None "document-privacy-scope.none" = "None"; // TRANSLATORS: Owner "document-privacy-scope.owner" = "Owner"; // TRANSLATORS: Document State "document-state" = "Document State"; // TRANSLATORS: Detailed Document State "document-state-reasons" = "Detailed Document State"; // TRANSLATORS: Aborted By System "document-state-reasons.aborted-by-system" = "Aborted By System"; // TRANSLATORS: Canceled At Device "document-state-reasons.canceled-at-device" = "Canceled At Device"; // TRANSLATORS: Canceled By Operator "document-state-reasons.canceled-by-operator" = "Canceled By Operator"; // TRANSLATORS: Canceled By User "document-state-reasons.canceled-by-user" = "Canceled By User"; // TRANSLATORS: Completed Successfully "document-state-reasons.completed-successfully" = "Completed Successfully"; // TRANSLATORS: Completed With Errors "document-state-reasons.completed-with-errors" = "Completed With Errors"; // TRANSLATORS: Completed With Warnings "document-state-reasons.completed-with-warnings" = "Completed With Warnings"; // TRANSLATORS: Compression Error "document-state-reasons.compression-error" = "Compression Error"; // TRANSLATORS: Data Insufficient "document-state-reasons.data-insufficient" = "Data Insufficient"; // TRANSLATORS: Digital Signature Did Not Verify "document-state-reasons.digital-signature-did-not-verify" = "Digital Signature Did Not Verify"; // TRANSLATORS: Digital Signature Type Not Supported "document-state-reasons.digital-signature-type-not-supported" = "Digital Signature Type Not Supported"; // TRANSLATORS: Digital Signature Wait "document-state-reasons.digital-signature-wait" = "Digital Signature Wait"; // TRANSLATORS: Document Access Error "document-state-reasons.document-access-error" = "Document Access Error"; // TRANSLATORS: Document Fetchable "document-state-reasons.document-fetchable" = "Document Fetchable"; // TRANSLATORS: Document Format Error "document-state-reasons.document-format-error" = "Document Format Error"; // TRANSLATORS: Document Password Error "document-state-reasons.document-password-error" = "Document Password Error"; // TRANSLATORS: Document Permission Error "document-state-reasons.document-permission-error" = "Document Permission Error"; // TRANSLATORS: Document Security Error "document-state-reasons.document-security-error" = "Document Security Error"; // TRANSLATORS: Document Unprintable Error "document-state-reasons.document-unprintable-error" = "Document Unprintable Error"; // TRANSLATORS: Errors Detected "document-state-reasons.errors-detected" = "Errors Detected"; // TRANSLATORS: Incoming "document-state-reasons.incoming" = "Incoming"; // TRANSLATORS: Interpreting "document-state-reasons.interpreting" = "Interpreting"; // TRANSLATORS: None "document-state-reasons.none" = "None"; // TRANSLATORS: Outgoing "document-state-reasons.outgoing" = "Outgoing"; // TRANSLATORS: Printing "document-state-reasons.printing" = "Printing"; // TRANSLATORS: Processing To Stop Point "document-state-reasons.processing-to-stop-point" = "Processing To Stop Point"; // TRANSLATORS: Queued "document-state-reasons.queued" = "Queued"; // TRANSLATORS: Queued For Marker "document-state-reasons.queued-for-marker" = "Queued For Marker"; // TRANSLATORS: Queued In Device "document-state-reasons.queued-in-device" = "Queued In Device"; // TRANSLATORS: Resources Are Not Ready "document-state-reasons.resources-are-not-ready" = "Resources Are Not Ready"; // TRANSLATORS: Resources Are Not Supported "document-state-reasons.resources-are-not-supported" = "Resources Are Not Supported"; // TRANSLATORS: Submission Interrupted "document-state-reasons.submission-interrupted" = "Submission Interrupted"; // TRANSLATORS: Transforming "document-state-reasons.transforming" = "Transforming"; // TRANSLATORS: Unsupported Compression "document-state-reasons.unsupported-compression" = "Unsupported Compression"; // TRANSLATORS: Unsupported Document Format "document-state-reasons.unsupported-document-format" = "Unsupported Document Format"; // TRANSLATORS: Warnings Detected "document-state-reasons.warnings-detected" = "Warnings Detected"; // TRANSLATORS: Pending "document-state.3" = "Pending"; // TRANSLATORS: Processing "document-state.5" = "Processing"; // TRANSLATORS: Stopped "document-state.6" = "Stopped"; // TRANSLATORS: Canceled "document-state.7" = "Canceled"; // TRANSLATORS: Aborted "document-state.8" = "Aborted"; // TRANSLATORS: Completed "document-state.9" = "Completed"; "error-index uses indefinite length" = "error-index uses indefinite length"; "error-status uses indefinite length" = "error-status uses indefinite length"; "expression --and expression\n Logical AND" = "expression --and expression\n Logical AND"; "expression --or expression\n Logical OR" = "expression --or expression\n Logical OR"; "expression expression Logical AND" = "expression expression Logical AND"; // TRANSLATORS: Feed Orientation "feed-orientation" = "Feed Orientation"; // TRANSLATORS: Long Edge First "feed-orientation.long-edge-first" = "Long Edge First"; // TRANSLATORS: Short Edge First "feed-orientation.short-edge-first" = "Short Edge First"; // TRANSLATORS: Fetch Status Code "fetch-status-code" = "Fetch Status Code"; // TRANSLATORS: Finishing Template "finishing-template" = "Finishing Template"; // TRANSLATORS: Bale "finishing-template.bale" = "Bale"; // TRANSLATORS: Bind "finishing-template.bind" = "Bind"; // TRANSLATORS: Bind Bottom "finishing-template.bind-bottom" = "Bind Bottom"; // TRANSLATORS: Bind Left "finishing-template.bind-left" = "Bind Left"; // TRANSLATORS: Bind Right "finishing-template.bind-right" = "Bind Right"; // TRANSLATORS: Bind Top "finishing-template.bind-top" = "Bind Top"; // TRANSLATORS: Booklet Maker "finishing-template.booklet-maker" = "Booklet Maker"; // TRANSLATORS: Coat "finishing-template.coat" = "Coat"; // TRANSLATORS: Cover "finishing-template.cover" = "Cover"; // TRANSLATORS: Edge Stitch "finishing-template.edge-stitch" = "Edge Stitch"; // TRANSLATORS: Edge Stitch Bottom "finishing-template.edge-stitch-bottom" = "Edge Stitch Bottom"; // TRANSLATORS: Edge Stitch Left "finishing-template.edge-stitch-left" = "Edge Stitch Left"; // TRANSLATORS: Edge Stitch Right "finishing-template.edge-stitch-right" = "Edge Stitch Right"; // TRANSLATORS: Edge Stitch Top "finishing-template.edge-stitch-top" = "Edge Stitch Top"; // TRANSLATORS: Fold "finishing-template.fold" = "Fold"; // TRANSLATORS: Accordion Fold "finishing-template.fold-accordion" = "Accordion Fold"; // TRANSLATORS: Double Gate Fold "finishing-template.fold-double-gate" = "Double Gate Fold"; // TRANSLATORS: Engineering Z Fold "finishing-template.fold-engineering-z" = "Engineering Z Fold"; // TRANSLATORS: Gate Fold "finishing-template.fold-gate" = "Gate Fold"; // TRANSLATORS: Half Fold "finishing-template.fold-half" = "Half Fold"; // TRANSLATORS: Half Z Fold "finishing-template.fold-half-z" = "Half Z Fold"; // TRANSLATORS: Left Gate Fold "finishing-template.fold-left-gate" = "Left Gate Fold"; // TRANSLATORS: Letter Fold "finishing-template.fold-letter" = "Letter Fold"; // TRANSLATORS: Parallel Fold "finishing-template.fold-parallel" = "Parallel Fold"; // TRANSLATORS: Poster Fold "finishing-template.fold-poster" = "Poster Fold"; // TRANSLATORS: Right Gate Fold "finishing-template.fold-right-gate" = "Right Gate Fold"; // TRANSLATORS: Z Fold "finishing-template.fold-z" = "Z Fold"; // TRANSLATORS: JDF F10-1 "finishing-template.jdf-f10-1" = "JDF F10-1"; // TRANSLATORS: JDF F10-2 "finishing-template.jdf-f10-2" = "JDF F10-2"; // TRANSLATORS: JDF F10-3 "finishing-template.jdf-f10-3" = "JDF F10-3"; // TRANSLATORS: JDF F12-1 "finishing-template.jdf-f12-1" = "JDF F12-1"; // TRANSLATORS: JDF F12-10 "finishing-template.jdf-f12-10" = "JDF F12-10"; // TRANSLATORS: JDF F12-11 "finishing-template.jdf-f12-11" = "JDF F12-11"; // TRANSLATORS: JDF F12-12 "finishing-template.jdf-f12-12" = "JDF F12-12"; // TRANSLATORS: JDF F12-13 "finishing-template.jdf-f12-13" = "JDF F12-13"; // TRANSLATORS: JDF F12-14 "finishing-template.jdf-f12-14" = "JDF F12-14"; // TRANSLATORS: JDF F12-2 "finishing-template.jdf-f12-2" = "JDF F12-2"; // TRANSLATORS: JDF F12-3 "finishing-template.jdf-f12-3" = "JDF F12-3"; // TRANSLATORS: JDF F12-4 "finishing-template.jdf-f12-4" = "JDF F12-4"; // TRANSLATORS: JDF F12-5 "finishing-template.jdf-f12-5" = "JDF F12-5"; // TRANSLATORS: JDF F12-6 "finishing-template.jdf-f12-6" = "JDF F12-6"; // TRANSLATORS: JDF F12-7 "finishing-template.jdf-f12-7" = "JDF F12-7"; // TRANSLATORS: JDF F12-8 "finishing-template.jdf-f12-8" = "JDF F12-8"; // TRANSLATORS: JDF F12-9 "finishing-template.jdf-f12-9" = "JDF F12-9"; // TRANSLATORS: JDF F14-1 "finishing-template.jdf-f14-1" = "JDF F14-1"; // TRANSLATORS: JDF F16-1 "finishing-template.jdf-f16-1" = "JDF F16-1"; // TRANSLATORS: JDF F16-10 "finishing-template.jdf-f16-10" = "JDF F16-10"; // TRANSLATORS: JDF F16-11 "finishing-template.jdf-f16-11" = "JDF F16-11"; // TRANSLATORS: JDF F16-12 "finishing-template.jdf-f16-12" = "JDF F16-12"; // TRANSLATORS: JDF F16-13 "finishing-template.jdf-f16-13" = "JDF F16-13"; // TRANSLATORS: JDF F16-14 "finishing-template.jdf-f16-14" = "JDF F16-14"; // TRANSLATORS: JDF F16-2 "finishing-template.jdf-f16-2" = "JDF F16-2"; // TRANSLATORS: JDF F16-3 "finishing-template.jdf-f16-3" = "JDF F16-3"; // TRANSLATORS: JDF F16-4 "finishing-template.jdf-f16-4" = "JDF F16-4"; // TRANSLATORS: JDF F16-5 "finishing-template.jdf-f16-5" = "JDF F16-5"; // TRANSLATORS: JDF F16-6 "finishing-template.jdf-f16-6" = "JDF F16-6"; // TRANSLATORS: JDF F16-7 "finishing-template.jdf-f16-7" = "JDF F16-7"; // TRANSLATORS: JDF F16-8 "finishing-template.jdf-f16-8" = "JDF F16-8"; // TRANSLATORS: JDF F16-9 "finishing-template.jdf-f16-9" = "JDF F16-9"; // TRANSLATORS: JDF F18-1 "finishing-template.jdf-f18-1" = "JDF F18-1"; // TRANSLATORS: JDF F18-2 "finishing-template.jdf-f18-2" = "JDF F18-2"; // TRANSLATORS: JDF F18-3 "finishing-template.jdf-f18-3" = "JDF F18-3"; // TRANSLATORS: JDF F18-4 "finishing-template.jdf-f18-4" = "JDF F18-4"; // TRANSLATORS: JDF F18-5 "finishing-template.jdf-f18-5" = "JDF F18-5"; // TRANSLATORS: JDF F18-6 "finishing-template.jdf-f18-6" = "JDF F18-6"; // TRANSLATORS: JDF F18-7 "finishing-template.jdf-f18-7" = "JDF F18-7"; // TRANSLATORS: JDF F18-8 "finishing-template.jdf-f18-8" = "JDF F18-8"; // TRANSLATORS: JDF F18-9 "finishing-template.jdf-f18-9" = "JDF F18-9"; // TRANSLATORS: JDF F2-1 "finishing-template.jdf-f2-1" = "JDF F2-1"; // TRANSLATORS: JDF F20-1 "finishing-template.jdf-f20-1" = "JDF F20-1"; // TRANSLATORS: JDF F20-2 "finishing-template.jdf-f20-2" = "JDF F20-2"; // TRANSLATORS: JDF F24-1 "finishing-template.jdf-f24-1" = "JDF F24-1"; // TRANSLATORS: JDF F24-10 "finishing-template.jdf-f24-10" = "JDF F24-10"; // TRANSLATORS: JDF F24-11 "finishing-template.jdf-f24-11" = "JDF F24-11"; // TRANSLATORS: JDF F24-2 "finishing-template.jdf-f24-2" = "JDF F24-2"; // TRANSLATORS: JDF F24-3 "finishing-template.jdf-f24-3" = "JDF F24-3"; // TRANSLATORS: JDF F24-4 "finishing-template.jdf-f24-4" = "JDF F24-4"; // TRANSLATORS: JDF F24-5 "finishing-template.jdf-f24-5" = "JDF F24-5"; // TRANSLATORS: JDF F24-6 "finishing-template.jdf-f24-6" = "JDF F24-6"; // TRANSLATORS: JDF F24-7 "finishing-template.jdf-f24-7" = "JDF F24-7"; // TRANSLATORS: JDF F24-8 "finishing-template.jdf-f24-8" = "JDF F24-8"; // TRANSLATORS: JDF F24-9 "finishing-template.jdf-f24-9" = "JDF F24-9"; // TRANSLATORS: JDF F28-1 "finishing-template.jdf-f28-1" = "JDF F28-1"; // TRANSLATORS: JDF F32-1 "finishing-template.jdf-f32-1" = "JDF F32-1"; // TRANSLATORS: JDF F32-2 "finishing-template.jdf-f32-2" = "JDF F32-2"; // TRANSLATORS: JDF F32-3 "finishing-template.jdf-f32-3" = "JDF F32-3"; // TRANSLATORS: JDF F32-4 "finishing-template.jdf-f32-4" = "JDF F32-4"; // TRANSLATORS: JDF F32-5 "finishing-template.jdf-f32-5" = "JDF F32-5"; // TRANSLATORS: JDF F32-6 "finishing-template.jdf-f32-6" = "JDF F32-6"; // TRANSLATORS: JDF F32-7 "finishing-template.jdf-f32-7" = "JDF F32-7"; // TRANSLATORS: JDF F32-8 "finishing-template.jdf-f32-8" = "JDF F32-8"; // TRANSLATORS: JDF F32-9 "finishing-template.jdf-f32-9" = "JDF F32-9"; // TRANSLATORS: JDF F36-1 "finishing-template.jdf-f36-1" = "JDF F36-1"; // TRANSLATORS: JDF F36-2 "finishing-template.jdf-f36-2" = "JDF F36-2"; // TRANSLATORS: JDF F4-1 "finishing-template.jdf-f4-1" = "JDF F4-1"; // TRANSLATORS: JDF F4-2 "finishing-template.jdf-f4-2" = "JDF F4-2"; // TRANSLATORS: JDF F40-1 "finishing-template.jdf-f40-1" = "JDF F40-1"; // TRANSLATORS: JDF F48-1 "finishing-template.jdf-f48-1" = "JDF F48-1"; // TRANSLATORS: JDF F48-2 "finishing-template.jdf-f48-2" = "JDF F48-2"; // TRANSLATORS: JDF F6-1 "finishing-template.jdf-f6-1" = "JDF F6-1"; // TRANSLATORS: JDF F6-2 "finishing-template.jdf-f6-2" = "JDF F6-2"; // TRANSLATORS: JDF F6-3 "finishing-template.jdf-f6-3" = "JDF F6-3"; // TRANSLATORS: JDF F6-4 "finishing-template.jdf-f6-4" = "JDF F6-4"; // TRANSLATORS: JDF F6-5 "finishing-template.jdf-f6-5" = "JDF F6-5"; // TRANSLATORS: JDF F6-6 "finishing-template.jdf-f6-6" = "JDF F6-6"; // TRANSLATORS: JDF F6-7 "finishing-template.jdf-f6-7" = "JDF F6-7"; // TRANSLATORS: JDF F6-8 "finishing-template.jdf-f6-8" = "JDF F6-8"; // TRANSLATORS: JDF F64-1 "finishing-template.jdf-f64-1" = "JDF F64-1"; // TRANSLATORS: JDF F64-2 "finishing-template.jdf-f64-2" = "JDF F64-2"; // TRANSLATORS: JDF F8-1 "finishing-template.jdf-f8-1" = "JDF F8-1"; // TRANSLATORS: JDF F8-2 "finishing-template.jdf-f8-2" = "JDF F8-2"; // TRANSLATORS: JDF F8-3 "finishing-template.jdf-f8-3" = "JDF F8-3"; // TRANSLATORS: JDF F8-4 "finishing-template.jdf-f8-4" = "JDF F8-4"; // TRANSLATORS: JDF F8-5 "finishing-template.jdf-f8-5" = "JDF F8-5"; // TRANSLATORS: JDF F8-6 "finishing-template.jdf-f8-6" = "JDF F8-6"; // TRANSLATORS: JDF F8-7 "finishing-template.jdf-f8-7" = "JDF F8-7"; // TRANSLATORS: Jog Offset "finishing-template.jog-offset" = "Jog Offset"; // TRANSLATORS: Laminate "finishing-template.laminate" = "Laminate"; // TRANSLATORS: Punch "finishing-template.punch" = "Punch"; // TRANSLATORS: Punch Bottom Left "finishing-template.punch-bottom-left" = "Punch Bottom Left"; // TRANSLATORS: Punch Bottom Right "finishing-template.punch-bottom-right" = "Punch Bottom Right"; // TRANSLATORS: 2-hole Punch Bottom "finishing-template.punch-dual-bottom" = "2-hole Punch Bottom"; // TRANSLATORS: 2-hole Punch Left "finishing-template.punch-dual-left" = "2-hole Punch Left"; // TRANSLATORS: 2-hole Punch Right "finishing-template.punch-dual-right" = "2-hole Punch Right"; // TRANSLATORS: 2-hole Punch Top "finishing-template.punch-dual-top" = "2-hole Punch Top"; // TRANSLATORS: Multi-hole Punch Bottom "finishing-template.punch-multiple-bottom" = "Multi-hole Punch Bottom"; // TRANSLATORS: Multi-hole Punch Left "finishing-template.punch-multiple-left" = "Multi-hole Punch Left"; // TRANSLATORS: Multi-hole Punch Right "finishing-template.punch-multiple-right" = "Multi-hole Punch Right"; // TRANSLATORS: Multi-hole Punch Top "finishing-template.punch-multiple-top" = "Multi-hole Punch Top"; // TRANSLATORS: 4-hole Punch Bottom "finishing-template.punch-quad-bottom" = "4-hole Punch Bottom"; // TRANSLATORS: 4-hole Punch Left "finishing-template.punch-quad-left" = "4-hole Punch Left"; // TRANSLATORS: 4-hole Punch Right "finishing-template.punch-quad-right" = "4-hole Punch Right"; // TRANSLATORS: 4-hole Punch Top "finishing-template.punch-quad-top" = "4-hole Punch Top"; // TRANSLATORS: Punch Top Left "finishing-template.punch-top-left" = "Punch Top Left"; // TRANSLATORS: Punch Top Right "finishing-template.punch-top-right" = "Punch Top Right"; // TRANSLATORS: 3-hole Punch Bottom "finishing-template.punch-triple-bottom" = "3-hole Punch Bottom"; // TRANSLATORS: 3-hole Punch Left "finishing-template.punch-triple-left" = "3-hole Punch Left"; // TRANSLATORS: 3-hole Punch Right "finishing-template.punch-triple-right" = "3-hole Punch Right"; // TRANSLATORS: 3-hole Punch Top "finishing-template.punch-triple-top" = "3-hole Punch Top"; // TRANSLATORS: Saddle Stitch "finishing-template.saddle-stitch" = "Saddle Stitch"; // TRANSLATORS: Staple "finishing-template.staple" = "Staple"; // TRANSLATORS: Staple Bottom Left "finishing-template.staple-bottom-left" = "Staple Bottom Left"; // TRANSLATORS: Staple Bottom Right "finishing-template.staple-bottom-right" = "Staple Bottom Right"; // TRANSLATORS: 2 Staples on Bottom "finishing-template.staple-dual-bottom" = "2 Staples on Bottom"; // TRANSLATORS: 2 Staples on Left "finishing-template.staple-dual-left" = "2 Staples on Left"; // TRANSLATORS: 2 Staples on Right "finishing-template.staple-dual-right" = "2 Staples on Right"; // TRANSLATORS: 2 Staples on Top "finishing-template.staple-dual-top" = "2 Staples on Top"; // TRANSLATORS: Staple Top Left "finishing-template.staple-top-left" = "Staple Top Left"; // TRANSLATORS: Staple Top Right "finishing-template.staple-top-right" = "Staple Top Right"; // TRANSLATORS: 3 Staples on Bottom "finishing-template.staple-triple-bottom" = "3 Staples on Bottom"; // TRANSLATORS: 3 Staples on Left "finishing-template.staple-triple-left" = "3 Staples on Left"; // TRANSLATORS: 3 Staples on Right "finishing-template.staple-triple-right" = "3 Staples on Right"; // TRANSLATORS: 3 Staples on Top "finishing-template.staple-triple-top" = "3 Staples on Top"; // TRANSLATORS: Trim "finishing-template.trim" = "Trim"; // TRANSLATORS: Trim After Every Set "finishing-template.trim-after-copies" = "Trim After Every Set"; // TRANSLATORS: Trim After Every Document "finishing-template.trim-after-documents" = "Trim After Every Document"; // TRANSLATORS: Trim After Job "finishing-template.trim-after-job" = "Trim After Job"; // TRANSLATORS: Trim After Every Page "finishing-template.trim-after-pages" = "Trim After Every Page"; // TRANSLATORS: Finishings "finishings" = "Finishings"; // TRANSLATORS: Finishings "finishings-col" = "Finishings"; // TRANSLATORS: Fold "finishings.10" = "Fold"; // TRANSLATORS: Z Fold "finishings.100" = "Z Fold"; // TRANSLATORS: Engineering Z Fold "finishings.101" = "Engineering Z Fold"; // TRANSLATORS: Trim "finishings.11" = "Trim"; // TRANSLATORS: Bale "finishings.12" = "Bale"; // TRANSLATORS: Booklet Maker "finishings.13" = "Booklet Maker"; // TRANSLATORS: Jog Offset "finishings.14" = "Jog Offset"; // TRANSLATORS: Coat "finishings.15" = "Coat"; // TRANSLATORS: Laminate "finishings.16" = "Laminate"; // TRANSLATORS: Staple Top Left "finishings.20" = "Staple Top Left"; // TRANSLATORS: Staple Bottom Left "finishings.21" = "Staple Bottom Left"; // TRANSLATORS: Staple Top Right "finishings.22" = "Staple Top Right"; // TRANSLATORS: Staple Bottom Right "finishings.23" = "Staple Bottom Right"; // TRANSLATORS: Edge Stitch Left "finishings.24" = "Edge Stitch Left"; // TRANSLATORS: Edge Stitch Top "finishings.25" = "Edge Stitch Top"; // TRANSLATORS: Edge Stitch Right "finishings.26" = "Edge Stitch Right"; // TRANSLATORS: Edge Stitch Bottom "finishings.27" = "Edge Stitch Bottom"; // TRANSLATORS: 2 Staples on Left "finishings.28" = "2 Staples on Left"; // TRANSLATORS: 2 Staples on Top "finishings.29" = "2 Staples on Top"; // TRANSLATORS: None "finishings.3" = "None"; // TRANSLATORS: 2 Staples on Right "finishings.30" = "2 Staples on Right"; // TRANSLATORS: 2 Staples on Bottom "finishings.31" = "2 Staples on Bottom"; // TRANSLATORS: 3 Staples on Left "finishings.32" = "3 Staples on Left"; // TRANSLATORS: 3 Staples on Top "finishings.33" = "3 Staples on Top"; // TRANSLATORS: 3 Staples on Right "finishings.34" = "3 Staples on Right"; // TRANSLATORS: 3 Staples on Bottom "finishings.35" = "3 Staples on Bottom"; // TRANSLATORS: Staple "finishings.4" = "Staple"; // TRANSLATORS: Punch "finishings.5" = "Punch"; // TRANSLATORS: Bind Left "finishings.50" = "Bind Left"; // TRANSLATORS: Bind Top "finishings.51" = "Bind Top"; // TRANSLATORS: Bind Right "finishings.52" = "Bind Right"; // TRANSLATORS: Bind Bottom "finishings.53" = "Bind Bottom"; // TRANSLATORS: Cover "finishings.6" = "Cover"; // TRANSLATORS: Trim Pages "finishings.60" = "Trim Pages"; // TRANSLATORS: Trim Documents "finishings.61" = "Trim Documents"; // TRANSLATORS: Trim Copies "finishings.62" = "Trim Copies"; // TRANSLATORS: Trim Job "finishings.63" = "Trim Job"; // TRANSLATORS: Bind "finishings.7" = "Bind"; // TRANSLATORS: Punch Top Left "finishings.70" = "Punch Top Left"; // TRANSLATORS: Punch Bottom Left "finishings.71" = "Punch Bottom Left"; // TRANSLATORS: Punch Top Right "finishings.72" = "Punch Top Right"; // TRANSLATORS: Punch Bottom Right "finishings.73" = "Punch Bottom Right"; // TRANSLATORS: 2-hole Punch Left "finishings.74" = "2-hole Punch Left"; // TRANSLATORS: 2-hole Punch Top "finishings.75" = "2-hole Punch Top"; // TRANSLATORS: 2-hole Punch Right "finishings.76" = "2-hole Punch Right"; // TRANSLATORS: 2-hole Punch Bottom "finishings.77" = "2-hole Punch Bottom"; // TRANSLATORS: 3-hole Punch Left "finishings.78" = "3-hole Punch Left"; // TRANSLATORS: 3-hole Punch Top "finishings.79" = "3-hole Punch Top"; // TRANSLATORS: Saddle Stitch "finishings.8" = "Saddle Stitch"; // TRANSLATORS: 3-hole Punch Right "finishings.80" = "3-hole Punch Right"; // TRANSLATORS: 3-hole Punch Bottom "finishings.81" = "3-hole Punch Bottom"; // TRANSLATORS: 4-hole Punch Left "finishings.82" = "4-hole Punch Left"; // TRANSLATORS: 4-hole Punch Top "finishings.83" = "4-hole Punch Top"; // TRANSLATORS: 4-hole Punch Right "finishings.84" = "4-hole Punch Right"; // TRANSLATORS: 4-hole Punch Bottom "finishings.85" = "4-hole Punch Bottom"; // TRANSLATORS: Multi-hole Punch Left "finishings.86" = "Multi-hole Punch Left"; // TRANSLATORS: Multi-hole Punch Top "finishings.87" = "Multi-hole Punch Top"; // TRANSLATORS: Multi-hole Punch Right "finishings.88" = "Multi-hole Punch Right"; // TRANSLATORS: Multi-hole Punch Bottom "finishings.89" = "Multi-hole Punch Bottom"; // TRANSLATORS: Edge Stitch "finishings.9" = "Edge Stitch"; // TRANSLATORS: Accordion Fold "finishings.90" = "Accordion Fold"; // TRANSLATORS: Double Gate Fold "finishings.91" = "Double Gate Fold"; // TRANSLATORS: Gate Fold "finishings.92" = "Gate Fold"; // TRANSLATORS: Half Fold "finishings.93" = "Half Fold"; // TRANSLATORS: Half Z Fold "finishings.94" = "Half Z Fold"; // TRANSLATORS: Left Gate Fold "finishings.95" = "Left Gate Fold"; // TRANSLATORS: Letter Fold "finishings.96" = "Letter Fold"; // TRANSLATORS: Parallel Fold "finishings.97" = "Parallel Fold"; // TRANSLATORS: Poster Fold "finishings.98" = "Poster Fold"; // TRANSLATORS: Right Gate Fold "finishings.99" = "Right Gate Fold"; // TRANSLATORS: Fold "folding" = "Fold"; // TRANSLATORS: Fold Direction "folding-direction" = "Fold Direction"; // TRANSLATORS: Inward "folding-direction.inward" = "Inward"; // TRANSLATORS: Outward "folding-direction.outward" = "Outward"; // TRANSLATORS: Fold Position "folding-offset" = "Fold Position"; // TRANSLATORS: Fold Edge "folding-reference-edge" = "Fold Edge"; // TRANSLATORS: Bottom "folding-reference-edge.bottom" = "Bottom"; // TRANSLATORS: Left "folding-reference-edge.left" = "Left"; // TRANSLATORS: Right "folding-reference-edge.right" = "Right"; // TRANSLATORS: Top "folding-reference-edge.top" = "Top"; // TRANSLATORS: Font Name "font-name-requested" = "Font Name"; // TRANSLATORS: Font Size "font-size-requested" = "Font Size"; // TRANSLATORS: Force Front Side "force-front-side" = "Force Front Side"; // TRANSLATORS: From Name "from-name" = "From Name"; "held" = "held"; "help\t\tGet help on commands." = "help\t\tGet help on commands."; "idle" = "idle"; // TRANSLATORS: Imposition Template "imposition-template" = "Imposition Template"; // TRANSLATORS: None "imposition-template.none" = "None"; // TRANSLATORS: Signature "imposition-template.signature" = "Signature"; // TRANSLATORS: Insert Page Number "insert-after-page-number" = "Insert Page Number"; // TRANSLATORS: Insert Count "insert-count" = "Insert Count"; // TRANSLATORS: Insert Sheet "insert-sheet" = "Insert Sheet"; "ippeveprinter: Unable to open \"%s\": %s on line %d." = "ippeveprinter: Unable to open “%s”: %s on line %d."; "ippfind: Bad regular expression: %s" = "ippfind: Bad regular expression: %s"; "ippfind: Cannot use --and after --or." = "ippfind: Cannot use --and after --or."; "ippfind: Expected key name after %s." = "ippfind: Expected key name after %s."; "ippfind: Expected port range after %s." = "ippfind: Expected port range after %s."; "ippfind: Expected program after %s." = "ippfind: Expected program after %s."; "ippfind: Expected semi-colon after %s." = "ippfind: Expected semi-colon after %s."; "ippfind: Missing close brace in substitution." = "ippfind: Missing close brace in substitution."; "ippfind: Missing close parenthesis." = "ippfind: Missing close parenthesis."; "ippfind: Missing expression before \"--and\"." = "ippfind: Missing expression before “--and”."; "ippfind: Missing expression before \"--or\"." = "ippfind: Missing expression before “--or”."; "ippfind: Missing key name after %s." = "ippfind: Missing key name after %s."; "ippfind: Missing name after %s." = "ippfind: Missing name after %s."; "ippfind: Missing open parenthesis." = "ippfind: Missing open parenthesis."; "ippfind: Missing program after %s." = "ippfind: Missing program after %s."; "ippfind: Missing regular expression after %s." = "ippfind: Missing regular expression after %s."; "ippfind: Missing semi-colon after %s." = "ippfind: Missing semi-colon after %s."; "ippfind: Out of memory." = "ippfind: Out of memory."; "ippfind: Too many parenthesis." = "ippfind: Too many parenthesis."; "ippfind: Unable to browse or resolve: %s" = "ippfind: Unable to browse or resolve: %s"; "ippfind: Unable to execute \"%s\": %s" = "ippfind: Unable to execute “%s”: %s"; "ippfind: Unable to use Bonjour: %s" = "ippfind: Unable to use Bonjour: %s"; "ippfind: Unknown variable \"{%s}\"." = "ippfind: Unknown variable “{%s}”."; "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"." = "ipptool: “-i” and “-n” are incompatible with “--ippserver”, “-P”, and “-X”."; "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." = "ipptool: “-i” and “-n” are incompatible with “-P” and “-X”."; "ipptool: Bad URI \"%s\"." = "ipptool: Bad URI “%s”."; "ipptool: Invalid seconds for \"-i\"." = "ipptool: Invalid seconds for “-i”."; "ipptool: May only specify a single URI." = "ipptool: May only specify a single URI."; "ipptool: Missing count for \"-n\"." = "ipptool: Missing count for “-n”."; "ipptool: Missing filename for \"--ippserver\"." = "ipptool: Missing filename for “--ippserver”."; "ipptool: Missing filename for \"-f\"." = "ipptool: Missing filename for “-f”."; "ipptool: Missing name=value for \"-d\"." = "ipptool: Missing name=value for “-d”."; "ipptool: Missing seconds for \"-i\"." = "ipptool: Missing seconds for “-i”."; "ipptool: URI required before test file." = "ipptool: URI required before test file."; // TRANSLATORS: Job Account ID "job-account-id" = "Job Account ID"; // TRANSLATORS: Job Account Type "job-account-type" = "Job Account Type"; // TRANSLATORS: General "job-account-type.general" = "General"; // TRANSLATORS: Group "job-account-type.group" = "Group"; // TRANSLATORS: None "job-account-type.none" = "None"; // TRANSLATORS: Job Accounting Output Bin "job-accounting-output-bin" = "Job Accounting Output Bin"; // TRANSLATORS: Job Accounting Sheets "job-accounting-sheets" = "Job Accounting Sheets"; // TRANSLATORS: Type of Job Accounting Sheets "job-accounting-sheets-type" = "Type of Job Accounting Sheets"; // TRANSLATORS: None "job-accounting-sheets-type.none" = "None"; // TRANSLATORS: Standard "job-accounting-sheets-type.standard" = "Standard"; // TRANSLATORS: Job Accounting User ID "job-accounting-user-id" = "Job Accounting User ID"; // TRANSLATORS: Job Cancel After "job-cancel-after" = "job-cancel-after"; // TRANSLATORS: Copies "job-copies" = "Copies"; // TRANSLATORS: Back Cover "job-cover-back" = "Back Cover"; // TRANSLATORS: Front Cover "job-cover-front" = "Front Cover"; // TRANSLATORS: Delay Output Until "job-delay-output-until" = "Delay Output Until"; // TRANSLATORS: Delay Output Until "job-delay-output-until-time" = "Delay Output Until"; // TRANSLATORS: Daytime "job-delay-output-until.day-time" = "Daytime"; // TRANSLATORS: Evening "job-delay-output-until.evening" = "Evening"; // TRANSLATORS: Released "job-delay-output-until.indefinite" = "Released"; // TRANSLATORS: Night "job-delay-output-until.night" = "Night"; // TRANSLATORS: No Delay "job-delay-output-until.no-delay-output" = "No Delay"; // TRANSLATORS: Second Shift "job-delay-output-until.second-shift" = "Second Shift"; // TRANSLATORS: Third Shift "job-delay-output-until.third-shift" = "Third Shift"; // TRANSLATORS: Weekend "job-delay-output-until.weekend" = "Weekend"; // TRANSLATORS: On Error "job-error-action" = "On Error"; // TRANSLATORS: Abort Job "job-error-action.abort-job" = "Abort Job"; // TRANSLATORS: Cancel Job "job-error-action.cancel-job" = "Cancel Job"; // TRANSLATORS: Continue Job "job-error-action.continue-job" = "Continue Job"; // TRANSLATORS: Suspend Job "job-error-action.suspend-job" = "Suspend Job"; // TRANSLATORS: Print Error Sheet "job-error-sheet" = "Print Error Sheet"; // TRANSLATORS: Type of Error Sheet "job-error-sheet-type" = "Type of Error Sheet"; // TRANSLATORS: None "job-error-sheet-type.none" = "None"; // TRANSLATORS: Standard "job-error-sheet-type.standard" = "Standard"; // TRANSLATORS: Print Error Sheet "job-error-sheet-when" = "Print Error Sheet"; // TRANSLATORS: Always "job-error-sheet-when.always" = "Always"; // TRANSLATORS: On Error "job-error-sheet-when.on-error" = "On Error"; // TRANSLATORS: Job Finishings "job-finishings" = "Job Finishings"; // TRANSLATORS: Hold Until "job-hold-until" = "Hold Until"; // TRANSLATORS: Hold Until "job-hold-until-time" = "Hold Until"; // TRANSLATORS: Daytime "job-hold-until.day-time" = "Daytime"; // TRANSLATORS: Evening "job-hold-until.evening" = "Evening"; // TRANSLATORS: Released "job-hold-until.indefinite" = "Released"; // TRANSLATORS: Night "job-hold-until.night" = "Night"; // TRANSLATORS: No Hold "job-hold-until.no-hold" = "No Hold"; // TRANSLATORS: Second Shift "job-hold-until.second-shift" = "Second Shift"; // TRANSLATORS: Third Shift "job-hold-until.third-shift" = "Third Shift"; // TRANSLATORS: Weekend "job-hold-until.weekend" = "Weekend"; // TRANSLATORS: Job Mandatory Attributes "job-mandatory-attributes" = "Job Mandatory Attributes"; // TRANSLATORS: Title "job-name" = "Title"; // TRANSLATORS: Job Pages "job-pages" = "Job Pages"; // TRANSLATORS: Job Pages "job-pages-col" = "Job Pages"; // TRANSLATORS: Job Phone Number "job-phone-number" = "Job Phone Number"; "job-printer-uri attribute missing." = "job-printer-uri attribute missing."; // TRANSLATORS: Job Priority "job-priority" = "Job Priority"; // TRANSLATORS: Job Privacy Attributes "job-privacy-attributes" = "Job Privacy Attributes"; // TRANSLATORS: All "job-privacy-attributes.all" = "All"; // TRANSLATORS: Default "job-privacy-attributes.default" = "Default"; // TRANSLATORS: Job Description "job-privacy-attributes.job-description" = "Job Description"; // TRANSLATORS: Job Template "job-privacy-attributes.job-template" = "Job Template"; // TRANSLATORS: None "job-privacy-attributes.none" = "None"; // TRANSLATORS: Job Privacy Scope "job-privacy-scope" = "Job Privacy Scope"; // TRANSLATORS: All "job-privacy-scope.all" = "All"; // TRANSLATORS: Default "job-privacy-scope.default" = "Default"; // TRANSLATORS: None "job-privacy-scope.none" = "None"; // TRANSLATORS: Owner "job-privacy-scope.owner" = "Owner"; // TRANSLATORS: Job Recipient Name "job-recipient-name" = "Job Recipient Name"; // TRANSLATORS: Job Retain Until "job-retain-until" = "job-retain-until"; // TRANSLATORS: Job Retain Until Interval "job-retain-until-interval" = "job-retain-until-interval"; // TRANSLATORS: Job Retain Until Time "job-retain-until-time" = "job-retain-until-time"; // TRANSLATORS: End Of Day "job-retain-until.end-of-day" = "job-retain-until.end-of-day"; // TRANSLATORS: End Of Month "job-retain-until.end-of-month" = "job-retain-until.end-of-month"; // TRANSLATORS: End Of Week "job-retain-until.end-of-week" = "job-retain-until.end-of-week"; // TRANSLATORS: Indefinite "job-retain-until.indefinite" = "job-retain-until.indefinite"; // TRANSLATORS: None "job-retain-until.none" = "job-retain-until.none"; // TRANSLATORS: Job Save Disposition "job-save-disposition" = "Job Save Disposition"; // TRANSLATORS: Job Sheet Message "job-sheet-message" = "Job Sheet Message"; // TRANSLATORS: Banner Page "job-sheets" = "Banner Page"; // TRANSLATORS: Banner Page "job-sheets-col" = "Banner Page"; // TRANSLATORS: First Page in Document "job-sheets.first-print-stream-page" = "First Page in Document"; // TRANSLATORS: Start and End Sheets "job-sheets.job-both-sheet" = "Start and End Sheets"; // TRANSLATORS: End Sheet "job-sheets.job-end-sheet" = "End Sheet"; // TRANSLATORS: Start Sheet "job-sheets.job-start-sheet" = "Start Sheet"; // TRANSLATORS: None "job-sheets.none" = "None"; // TRANSLATORS: Standard "job-sheets.standard" = "Standard"; // TRANSLATORS: Job State "job-state" = "Job State"; // TRANSLATORS: Job State Message "job-state-message" = "Job State Message"; // TRANSLATORS: Detailed Job State "job-state-reasons" = "Detailed Job State"; // TRANSLATORS: Stopping "job-state-reasons.aborted-by-system" = "Aborted By System"; // TRANSLATORS: Account Authorization Failed "job-state-reasons.account-authorization-failed" = "Account Authorization Failed"; // TRANSLATORS: Account Closed "job-state-reasons.account-closed" = "Account Closed"; // TRANSLATORS: Account Info Needed "job-state-reasons.account-info-needed" = "Account Info Needed"; // TRANSLATORS: Account Limit Reached "job-state-reasons.account-limit-reached" = "Account Limit Reached"; // TRANSLATORS: Decompression error "job-state-reasons.compression-error" = "Compression Error"; // TRANSLATORS: Conflicting Attributes "job-state-reasons.conflicting-attributes" = "Conflicting Attributes"; // TRANSLATORS: Connected To Destination "job-state-reasons.connected-to-destination" = "Connected To Destination"; // TRANSLATORS: Connecting To Destination "job-state-reasons.connecting-to-destination" = "Connecting To Destination"; // TRANSLATORS: Destination Uri Failed "job-state-reasons.destination-uri-failed" = "Destination Uri Failed"; // TRANSLATORS: Digital Signature Did Not Verify "job-state-reasons.digital-signature-did-not-verify" = "Digital Signature Did Not Verify"; // TRANSLATORS: Digital Signature Type Not Supported "job-state-reasons.digital-signature-type-not-supported" = "Digital Signature Type Not Supported"; // TRANSLATORS: Document Access Error "job-state-reasons.document-access-error" = "Document Access Error"; // TRANSLATORS: Document Format Error "job-state-reasons.document-format-error" = "Document Format Error"; // TRANSLATORS: Document Password Error "job-state-reasons.document-password-error" = "Document Password Error"; // TRANSLATORS: Document Permission Error "job-state-reasons.document-permission-error" = "Document Permission Error"; // TRANSLATORS: Document Security Error "job-state-reasons.document-security-error" = "Document Security Error"; // TRANSLATORS: Document Unprintable Error "job-state-reasons.document-unprintable-error" = "Document Unprintable Error"; // TRANSLATORS: Errors Detected "job-state-reasons.errors-detected" = "Errors Detected"; // TRANSLATORS: Canceled at printer "job-state-reasons.job-canceled-at-device" = "Job Canceled At Device"; // TRANSLATORS: Canceled by operator "job-state-reasons.job-canceled-by-operator" = "Job Canceled By Operator"; // TRANSLATORS: Canceled by user "job-state-reasons.job-canceled-by-user" = "Job Canceled By User"; // TRANSLATORS: "job-state-reasons.job-completed-successfully" = "Job Completed Successfully"; // TRANSLATORS: Completed with errors "job-state-reasons.job-completed-with-errors" = "Job Completed With Errors"; // TRANSLATORS: Completed with warnings "job-state-reasons.job-completed-with-warnings" = "Job Completed With Warnings"; // TRANSLATORS: Insufficient data "job-state-reasons.job-data-insufficient" = "Job Data Insufficient"; // TRANSLATORS: Job Delay Output Until Specified "job-state-reasons.job-delay-output-until-specified" = "Job Delay Output Until Specified"; // TRANSLATORS: Job Digital Signature Wait "job-state-reasons.job-digital-signature-wait" = "Job Digital Signature Wait"; // TRANSLATORS: Job Fetchable "job-state-reasons.job-fetchable" = "Job Fetchable"; // TRANSLATORS: Job Held For Review "job-state-reasons.job-held-for-review" = "Job Held For Review"; // TRANSLATORS: Job held "job-state-reasons.job-hold-until-specified" = "Job Hold Until Specified"; // TRANSLATORS: Incoming "job-state-reasons.job-incoming" = "Job Incoming"; // TRANSLATORS: Interpreting "job-state-reasons.job-interpreting" = "Job Interpreting"; // TRANSLATORS: Outgoing "job-state-reasons.job-outgoing" = "Job Outgoing"; // TRANSLATORS: Job Password Wait "job-state-reasons.job-password-wait" = "Job Password Wait"; // TRANSLATORS: Job Printed Successfully "job-state-reasons.job-printed-successfully" = "Job Printed Successfully"; // TRANSLATORS: Job Printed With Errors "job-state-reasons.job-printed-with-errors" = "Job Printed With Errors"; // TRANSLATORS: Job Printed With Warnings "job-state-reasons.job-printed-with-warnings" = "Job Printed With Warnings"; // TRANSLATORS: Printing "job-state-reasons.job-printing" = "Job Printing"; // TRANSLATORS: Preparing to print "job-state-reasons.job-queued" = "Job Queued"; // TRANSLATORS: Processing document "job-state-reasons.job-queued-for-marker" = "Job Queued For Marker"; // TRANSLATORS: Job Release Wait "job-state-reasons.job-release-wait" = "Job Release Wait"; // TRANSLATORS: Restartable "job-state-reasons.job-restartable" = "Job Restartable"; // TRANSLATORS: Job Resuming "job-state-reasons.job-resuming" = "Job Resuming"; // TRANSLATORS: Job Saved Successfully "job-state-reasons.job-saved-successfully" = "Job Saved Successfully"; // TRANSLATORS: Job Saved With Errors "job-state-reasons.job-saved-with-errors" = "Job Saved With Errors"; // TRANSLATORS: Job Saved With Warnings "job-state-reasons.job-saved-with-warnings" = "Job Saved With Warnings"; // TRANSLATORS: Job Saving "job-state-reasons.job-saving" = "Job Saving"; // TRANSLATORS: Job Spooling "job-state-reasons.job-spooling" = "Job Spooling"; // TRANSLATORS: Job Streaming "job-state-reasons.job-streaming" = "Job Streaming"; // TRANSLATORS: Suspended "job-state-reasons.job-suspended" = "Job Suspended"; // TRANSLATORS: Job Suspended By Operator "job-state-reasons.job-suspended-by-operator" = "Job Suspended By Operator"; // TRANSLATORS: Job Suspended By System "job-state-reasons.job-suspended-by-system" = "Job Suspended By System"; // TRANSLATORS: Job Suspended By User "job-state-reasons.job-suspended-by-user" = "Job Suspended By User"; // TRANSLATORS: Job Suspending "job-state-reasons.job-suspending" = "Job Suspending"; // TRANSLATORS: Job Transferring "job-state-reasons.job-transferring" = "Job Transferring"; // TRANSLATORS: Transforming "job-state-reasons.job-transforming" = "Job Transforming"; // TRANSLATORS: None "job-state-reasons.none" = "None"; // TRANSLATORS: Printer offline "job-state-reasons.printer-stopped" = "Printer Stopped"; // TRANSLATORS: Printer partially stopped "job-state-reasons.printer-stopped-partly" = "Printer Stopped Partly"; // TRANSLATORS: Stopping "job-state-reasons.processing-to-stop-point" = "Processing To Stop Point"; // TRANSLATORS: Ready "job-state-reasons.queued-in-device" = "Queued In Device"; // TRANSLATORS: Resources Are Not Ready "job-state-reasons.resources-are-not-ready" = "Resources Are Not Ready"; // TRANSLATORS: Resources Are Not Supported "job-state-reasons.resources-are-not-supported" = "Resources Are Not Supported"; // TRANSLATORS: Service offline "job-state-reasons.service-off-line" = "Service Off Line"; // TRANSLATORS: Submission Interrupted "job-state-reasons.submission-interrupted" = "Submission Interrupted"; // TRANSLATORS: Unsupported Attributes Or Values "job-state-reasons.unsupported-attributes-or-values" = "Unsupported Attributes Or Values"; // TRANSLATORS: Unsupported Compression "job-state-reasons.unsupported-compression" = "Unsupported Compression"; // TRANSLATORS: Unsupported Document Format "job-state-reasons.unsupported-document-format" = "Unsupported Document Format"; // TRANSLATORS: Waiting For User Action "job-state-reasons.waiting-for-user-action" = "Waiting For User Action"; // TRANSLATORS: Warnings Detected "job-state-reasons.warnings-detected" = "Warnings Detected"; // TRANSLATORS: Pending "job-state.3" = "Pending"; // TRANSLATORS: Held "job-state.4" = "Held"; // TRANSLATORS: Processing "job-state.5" = "Processing"; // TRANSLATORS: Stopped "job-state.6" = "Stopped"; // TRANSLATORS: Canceled "job-state.7" = "Canceled"; // TRANSLATORS: Aborted "job-state.8" = "Aborted"; // TRANSLATORS: Completed "job-state.9" = "Completed"; // TRANSLATORS: Laminate Pages "laminating" = "Laminate Pages"; // TRANSLATORS: Laminate "laminating-sides" = "Laminate"; // TRANSLATORS: Back Only "laminating-sides.back" = "Back Only"; // TRANSLATORS: Front and Back "laminating-sides.both" = "Front and Back"; // TRANSLATORS: Front Only "laminating-sides.front" = "Front Only"; // TRANSLATORS: Type of Lamination "laminating-type" = "Type of Lamination"; // TRANSLATORS: Archival "laminating-type.archival" = "Archival"; // TRANSLATORS: Glossy "laminating-type.glossy" = "Glossy"; // TRANSLATORS: High Gloss "laminating-type.high-gloss" = "High Gloss"; // TRANSLATORS: Matte "laminating-type.matte" = "Matte"; // TRANSLATORS: Semi-gloss "laminating-type.semi-gloss" = "Semi-gloss"; // TRANSLATORS: Translucent "laminating-type.translucent" = "Translucent"; // TRANSLATORS: Logo "logo" = "Logo"; "lpadmin: Class name can only contain printable characters." = "lpadmin: Class name can only contain printable characters."; "lpadmin: Expected PPD after \"-%c\" option." = "lpadmin: Expected PPD after “-%c” option."; "lpadmin: Expected allow/deny:userlist after \"-u\" option." = "lpadmin: Expected allow/deny:userlist after “-u” option."; "lpadmin: Expected class after \"-r\" option." = "lpadmin: Expected class after “-r” option."; "lpadmin: Expected class name after \"-c\" option." = "lpadmin: Expected class name after “-c” option."; "lpadmin: Expected description after \"-D\" option." = "lpadmin: Expected description after “-D” option."; "lpadmin: Expected device URI after \"-v\" option." = "lpadmin: Expected device URI after “-v” option."; "lpadmin: Expected file type(s) after \"-I\" option." = "lpadmin: Expected file type(s) after “-I” option."; "lpadmin: Expected hostname after \"-h\" option." = "lpadmin: Expected hostname after “-h” option."; "lpadmin: Expected location after \"-L\" option." = "lpadmin: Expected location after “-L” option."; "lpadmin: Expected model after \"-m\" option." = "lpadmin: Expected model after “-m” option."; "lpadmin: Expected name after \"-R\" option." = "lpadmin: Expected name after “-R” option."; "lpadmin: Expected name=value after \"-o\" option." = "lpadmin: Expected name=value after “-o” option."; "lpadmin: Expected printer after \"-p\" option." = "lpadmin: Expected printer after “-p” option."; "lpadmin: Expected printer name after \"-d\" option." = "lpadmin: Expected printer name after “-d” option."; "lpadmin: Expected printer or class after \"-x\" option." = "lpadmin: Expected printer or class after “-x” option."; "lpadmin: No member names were seen." = "lpadmin: No member names were seen."; "lpadmin: Printer %s is already a member of class %s." = "lpadmin: Printer %s is already a member of class %s."; "lpadmin: Printer %s is not a member of class %s." = "lpadmin: Printer %s is not a member of class %s."; "lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS." = "lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS."; "lpadmin: Printer name can only contain printable characters." = "lpadmin: Printer name can only contain printable characters."; "lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS." = "lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS."; "lpadmin: Raw queues are no longer supported on macOS." = "lpadmin: Raw queues are no longer supported on macOS."; "lpadmin: System V interface scripts are no longer supported for security reasons." = "lpadmin: System V interface scripts are no longer supported for security reasons."; "lpadmin: Unable to add a printer to the class:\n You must specify a printer name first." = "lpadmin: Unable to add a printer to the class:\n You must specify a printer name first."; "lpadmin: Unable to connect to server: %s" = "lpadmin: Unable to connect to server: %s"; "lpadmin: Unable to create temporary file" = "lpadmin: Unable to create temporary file"; "lpadmin: Unable to delete option:\n You must specify a printer name first." = "lpadmin: Unable to delete option:\n You must specify a printer name first."; "lpadmin: Unable to open PPD \"%s\": %s" = "lpadmin: Unable to open PPD “%s”: %s"; "lpadmin: Unable to open PPD \"%s\": %s on line %d." = "lpadmin: Unable to open PPD “%s”: %s on line %d."; "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first." = "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first."; "lpadmin: Unable to set the printer options:\n You must specify a printer name first." = "lpadmin: Unable to set the printer options:\n You must specify a printer name first."; "lpadmin: Unknown allow/deny option \"%s\"." = "lpadmin: Unknown allow/deny option “%s”."; "lpadmin: Unknown argument \"%s\"." = "lpadmin: Unknown argument “%s”."; "lpadmin: Unknown option \"%c\"." = "lpadmin: Unknown option “%c”."; "lpadmin: Use the 'everywhere' model for shared printers." = "lpadmin: Use the ‘everywhere’ model for shared printers."; "lpadmin: Warning - content type list ignored." = "lpadmin: Warning - content type list ignored."; "lpc> " = "lpc> "; "lpinfo: Expected 1284 device ID string after \"--device-id\"." = "lpinfo: Expected 1284 device ID string after “--device-id”."; "lpinfo: Expected language after \"--language\"." = "lpinfo: Expected language after “--language”."; "lpinfo: Expected make and model after \"--make-and-model\"." = "lpinfo: Expected make and model after “--make-and-model”."; "lpinfo: Expected product string after \"--product\"." = "lpinfo: Expected product string after “--product”."; "lpinfo: Expected scheme list after \"--exclude-schemes\"." = "lpinfo: Expected scheme list after “--exclude-schemes”."; "lpinfo: Expected scheme list after \"--include-schemes\"." = "lpinfo: Expected scheme list after “--include-schemes”."; "lpinfo: Expected timeout after \"--timeout\"." = "lpinfo: Expected timeout after “--timeout”."; "lpmove: Unable to connect to server: %s" = "lpmove: Unable to connect to server: %s"; "lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument “%s”."; "lpoptions: No printers." = "lpoptions: No printers."; "lpoptions: Unable to add printer or instance: %s" = "lpoptions: Unable to add printer or instance: %s"; "lpoptions: Unable to get PPD file for %s: %s" = "lpoptions: Unable to get PPD file for %s: %s"; "lpoptions: Unable to open PPD file for %s." = "lpoptions: Unable to open PPD file for %s."; "lpoptions: Unknown printer or class." = "lpoptions: Unknown printer or class."; "lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination \"%s\"."; // TRANSLATORS: Amount of Material "material-amount" = "Amount of Material"; // TRANSLATORS: Amount Units "material-amount-units" = "Amount Units"; // TRANSLATORS: Grams "material-amount-units.g" = "Grams"; // TRANSLATORS: Kilograms "material-amount-units.kg" = "Kilograms"; // TRANSLATORS: Liters "material-amount-units.l" = "Liters"; // TRANSLATORS: Meters "material-amount-units.m" = "Meters"; // TRANSLATORS: Milliliters "material-amount-units.ml" = "Milliliters"; // TRANSLATORS: Millimeters "material-amount-units.mm" = "Millimeters"; // TRANSLATORS: Material Color "material-color" = "Material Color"; // TRANSLATORS: Material Diameter "material-diameter" = "Material Diameter"; // TRANSLATORS: Material Diameter Tolerance "material-diameter-tolerance" = "Material Diameter Tolerance"; // TRANSLATORS: Material Fill Density "material-fill-density" = "Material Fill Density"; // TRANSLATORS: Material Name "material-name" = "Material Name"; // TRANSLATORS: Material Nozzle Diameter "material-nozzle-diameter" = "Material Nozzle Diameter"; // TRANSLATORS: Use Material For "material-purpose" = "Use Material For"; // TRANSLATORS: Everything "material-purpose.all" = "Everything"; // TRANSLATORS: Base "material-purpose.base" = "Base"; // TRANSLATORS: In-fill "material-purpose.in-fill" = "In-fill"; // TRANSLATORS: Shell "material-purpose.shell" = "Shell"; // TRANSLATORS: Supports "material-purpose.support" = "Supports"; // TRANSLATORS: Feed Rate "material-rate" = "Feed Rate"; // TRANSLATORS: Feed Rate Units "material-rate-units" = "Feed Rate Units"; // TRANSLATORS: Milligrams per second "material-rate-units.mg_second" = "Milligrams per second"; // TRANSLATORS: Milliliters per second "material-rate-units.ml_second" = "Milliliters per second"; // TRANSLATORS: Millimeters per second "material-rate-units.mm_second" = "Millimeters per second"; // TRANSLATORS: Material Retraction "material-retraction" = "Material Retraction"; // TRANSLATORS: Material Shell Thickness "material-shell-thickness" = "Material Shell Thickness"; // TRANSLATORS: Material Temperature "material-temperature" = "Material Temperature"; // TRANSLATORS: Material Type "material-type" = "Material Type"; // TRANSLATORS: ABS "material-type.abs" = "ABS"; // TRANSLATORS: Carbon Fiber ABS "material-type.abs-carbon-fiber" = "Carbon Fiber ABS"; // TRANSLATORS: Carbon Nanotube ABS "material-type.abs-carbon-nanotube" = "Carbon Nanotube ABS"; // TRANSLATORS: Chocolate "material-type.chocolate" = "Chocolate"; // TRANSLATORS: Gold "material-type.gold" = "Gold"; // TRANSLATORS: Nylon "material-type.nylon" = "Nylon"; // TRANSLATORS: Pet "material-type.pet" = "Pet"; // TRANSLATORS: Photopolymer "material-type.photopolymer" = "Photopolymer"; // TRANSLATORS: PLA "material-type.pla" = "PLA"; // TRANSLATORS: Conductive PLA "material-type.pla-conductive" = "Conductive PLA"; // TRANSLATORS: Pla Dissolvable "material-type.pla-dissolvable" = "Pla Dissolvable"; // TRANSLATORS: Flexible PLA "material-type.pla-flexible" = "Flexible PLA"; // TRANSLATORS: Magnetic PLA "material-type.pla-magnetic" = "Magnetic PLA"; // TRANSLATORS: Steel PLA "material-type.pla-steel" = "Steel PLA"; // TRANSLATORS: Stone PLA "material-type.pla-stone" = "Stone PLA"; // TRANSLATORS: Wood PLA "material-type.pla-wood" = "Wood PLA"; // TRANSLATORS: Polycarbonate "material-type.polycarbonate" = "Polycarbonate"; // TRANSLATORS: Dissolvable PVA "material-type.pva-dissolvable" = "Dissolvable PVA"; // TRANSLATORS: Silver "material-type.silver" = "Silver"; // TRANSLATORS: Titanium "material-type.titanium" = "Titanium"; // TRANSLATORS: Wax "material-type.wax" = "Wax"; // TRANSLATORS: Materials "materials-col" = "Materials"; // TRANSLATORS: Media "media" = "Media"; // TRANSLATORS: Back Coating of Media "media-back-coating" = "Back Coating of Media"; // TRANSLATORS: Glossy "media-back-coating.glossy" = "Glossy"; // TRANSLATORS: High Gloss "media-back-coating.high-gloss" = "High Gloss"; // TRANSLATORS: Matte "media-back-coating.matte" = "Matte"; // TRANSLATORS: None "media-back-coating.none" = "None"; // TRANSLATORS: Satin "media-back-coating.satin" = "Satin"; // TRANSLATORS: Semi-gloss "media-back-coating.semi-gloss" = "Semi-gloss"; // TRANSLATORS: Media Bottom Margin "media-bottom-margin" = "Media Bottom Margin"; // TRANSLATORS: Media "media-col" = "Media"; // TRANSLATORS: Media Color "media-color" = "Media Color"; // TRANSLATORS: Black "media-color.black" = "Black"; // TRANSLATORS: Blue "media-color.blue" = "Blue"; // TRANSLATORS: Brown "media-color.brown" = "Brown"; // TRANSLATORS: Buff "media-color.buff" = "Buff"; // TRANSLATORS: Clear Black "media-color.clear-black" = "Clear Black"; // TRANSLATORS: Clear Blue "media-color.clear-blue" = "Clear Blue"; // TRANSLATORS: Clear Brown "media-color.clear-brown" = "Clear Brown"; // TRANSLATORS: Clear Buff "media-color.clear-buff" = "Clear Buff"; // TRANSLATORS: Clear Cyan "media-color.clear-cyan" = "Clear Cyan"; // TRANSLATORS: Clear Gold "media-color.clear-gold" = "Clear Gold"; // TRANSLATORS: Clear Goldenrod "media-color.clear-goldenrod" = "Clear Goldenrod"; // TRANSLATORS: Clear Gray "media-color.clear-gray" = "Clear Gray"; // TRANSLATORS: Clear Green "media-color.clear-green" = "Clear Green"; // TRANSLATORS: Clear Ivory "media-color.clear-ivory" = "Clear Ivory"; // TRANSLATORS: Clear Magenta "media-color.clear-magenta" = "Clear Magenta"; // TRANSLATORS: Clear Multi Color "media-color.clear-multi-color" = "Clear Multi Color"; // TRANSLATORS: Clear Mustard "media-color.clear-mustard" = "Clear Mustard"; // TRANSLATORS: Clear Orange "media-color.clear-orange" = "Clear Orange"; // TRANSLATORS: Clear Pink "media-color.clear-pink" = "Clear Pink"; // TRANSLATORS: Clear Red "media-color.clear-red" = "Clear Red"; // TRANSLATORS: Clear Silver "media-color.clear-silver" = "Clear Silver"; // TRANSLATORS: Clear Turquoise "media-color.clear-turquoise" = "Clear Turquoise"; // TRANSLATORS: Clear Violet "media-color.clear-violet" = "Clear Violet"; // TRANSLATORS: Clear White "media-color.clear-white" = "Clear White"; // TRANSLATORS: Clear Yellow "media-color.clear-yellow" = "Clear Yellow"; // TRANSLATORS: Cyan "media-color.cyan" = "Cyan"; // TRANSLATORS: Dark Blue "media-color.dark-blue" = "Dark Blue"; // TRANSLATORS: Dark Brown "media-color.dark-brown" = "Dark Brown"; // TRANSLATORS: Dark Buff "media-color.dark-buff" = "Dark Buff"; // TRANSLATORS: Dark Cyan "media-color.dark-cyan" = "Dark Cyan"; // TRANSLATORS: Dark Gold "media-color.dark-gold" = "Dark Gold"; // TRANSLATORS: Dark Goldenrod "media-color.dark-goldenrod" = "Dark Goldenrod"; // TRANSLATORS: Dark Gray "media-color.dark-gray" = "Dark Gray"; // TRANSLATORS: Dark Green "media-color.dark-green" = "Dark Green"; // TRANSLATORS: Dark Ivory "media-color.dark-ivory" = "Dark Ivory"; // TRANSLATORS: Dark Magenta "media-color.dark-magenta" = "Dark Magenta"; // TRANSLATORS: Dark Mustard "media-color.dark-mustard" = "Dark Mustard"; // TRANSLATORS: Dark Orange "media-color.dark-orange" = "Dark Orange"; // TRANSLATORS: Dark Pink "media-color.dark-pink" = "Dark Pink"; // TRANSLATORS: Dark Red "media-color.dark-red" = "Dark Red"; // TRANSLATORS: Dark Silver "media-color.dark-silver" = "Dark Silver"; // TRANSLATORS: Dark Turquoise "media-color.dark-turquoise" = "Dark Turquoise"; // TRANSLATORS: Dark Violet "media-color.dark-violet" = "Dark Violet"; // TRANSLATORS: Dark Yellow "media-color.dark-yellow" = "Dark Yellow"; // TRANSLATORS: Gold "media-color.gold" = "Gold"; // TRANSLATORS: Goldenrod "media-color.goldenrod" = "Goldenrod"; // TRANSLATORS: Gray "media-color.gray" = "Gray"; // TRANSLATORS: Green "media-color.green" = "Green"; // TRANSLATORS: Ivory "media-color.ivory" = "Ivory"; // TRANSLATORS: Light Black "media-color.light-black" = "Light Black"; // TRANSLATORS: Light Blue "media-color.light-blue" = "Light Blue"; // TRANSLATORS: Light Brown "media-color.light-brown" = "Light Brown"; // TRANSLATORS: Light Buff "media-color.light-buff" = "Light Buff"; // TRANSLATORS: Light Cyan "media-color.light-cyan" = "Light Cyan"; // TRANSLATORS: Light Gold "media-color.light-gold" = "Light Gold"; // TRANSLATORS: Light Goldenrod "media-color.light-goldenrod" = "Light Goldenrod"; // TRANSLATORS: Light Gray "media-color.light-gray" = "Light Gray"; // TRANSLATORS: Light Green "media-color.light-green" = "Light Green"; // TRANSLATORS: Light Ivory "media-color.light-ivory" = "Light Ivory"; // TRANSLATORS: Light Magenta "media-color.light-magenta" = "Light Magenta"; // TRANSLATORS: Light Mustard "media-color.light-mustard" = "Light Mustard"; // TRANSLATORS: Light Orange "media-color.light-orange" = "Light Orange"; // TRANSLATORS: Light Pink "media-color.light-pink" = "Light Pink"; // TRANSLATORS: Light Red "media-color.light-red" = "Light Red"; // TRANSLATORS: Light Silver "media-color.light-silver" = "Light Silver"; // TRANSLATORS: Light Turquoise "media-color.light-turquoise" = "Light Turquoise"; // TRANSLATORS: Light Violet "media-color.light-violet" = "Light Violet"; // TRANSLATORS: Light Yellow "media-color.light-yellow" = "Light Yellow"; // TRANSLATORS: Magenta "media-color.magenta" = "Magenta"; // TRANSLATORS: Multi-color "media-color.multi-color" = "Multi-color"; // TRANSLATORS: Mustard "media-color.mustard" = "Mustard"; // TRANSLATORS: No Color "media-color.no-color" = "No Color"; // TRANSLATORS: Orange "media-color.orange" = "Orange"; // TRANSLATORS: Pink "media-color.pink" = "Pink"; // TRANSLATORS: Red "media-color.red" = "Red"; // TRANSLATORS: Silver "media-color.silver" = "Silver"; // TRANSLATORS: Turquoise "media-color.turquoise" = "Turquoise"; // TRANSLATORS: Violet "media-color.violet" = "Violet"; // TRANSLATORS: White "media-color.white" = "White"; // TRANSLATORS: Yellow "media-color.yellow" = "Yellow"; // TRANSLATORS: Front Coating of Media "media-front-coating" = "Front Coating of Media"; // TRANSLATORS: Media Grain "media-grain" = "Media Grain"; // TRANSLATORS: Cross-Feed Direction "media-grain.x-direction" = "Cross-Feed Direction"; // TRANSLATORS: Feed Direction "media-grain.y-direction" = "Feed Direction"; // TRANSLATORS: Media Hole Count "media-hole-count" = "Media Hole Count"; // TRANSLATORS: Media Info "media-info" = "Media Info"; // TRANSLATORS: Force Media "media-input-tray-check" = "Force Media"; // TRANSLATORS: Media Left Margin "media-left-margin" = "Media Left Margin"; // TRANSLATORS: Pre-printed Media "media-pre-printed" = "Pre-printed Media"; // TRANSLATORS: Blank "media-pre-printed.blank" = "Blank"; // TRANSLATORS: Letterhead "media-pre-printed.letter-head" = "Letterhead"; // TRANSLATORS: Pre-printed "media-pre-printed.pre-printed" = "Pre-printed"; // TRANSLATORS: Recycled Media "media-recycled" = "Recycled Media"; // TRANSLATORS: None "media-recycled.none" = "None"; // TRANSLATORS: Standard "media-recycled.standard" = "Standard"; // TRANSLATORS: Media Right Margin "media-right-margin" = "Media Right Margin"; // TRANSLATORS: Media Dimensions "media-size" = "Media Dimensions"; // TRANSLATORS: Media Name "media-size-name" = "Media Name"; // TRANSLATORS: Media Source "media-source" = "Media Source"; // TRANSLATORS: Alternate "media-source.alternate" = "Alternate"; // TRANSLATORS: Alternate Roll "media-source.alternate-roll" = "Alternate Roll"; // TRANSLATORS: Automatic "media-source.auto" = "Automatic"; // TRANSLATORS: Bottom "media-source.bottom" = "Bottom"; // TRANSLATORS: By-pass Tray "media-source.by-pass-tray" = "By-pass Tray"; // TRANSLATORS: Center "media-source.center" = "Center"; // TRANSLATORS: Disc "media-source.disc" = "Disc"; // TRANSLATORS: Envelope "media-source.envelope" = "Envelope"; // TRANSLATORS: Hagaki "media-source.hagaki" = "Hagaki"; // TRANSLATORS: Large Capacity "media-source.large-capacity" = "Large Capacity"; // TRANSLATORS: Left "media-source.left" = "Left"; // TRANSLATORS: Main "media-source.main" = "Main"; // TRANSLATORS: Main Roll "media-source.main-roll" = "Main Roll"; // TRANSLATORS: Manual "media-source.manual" = "Manual"; // TRANSLATORS: Middle "media-source.middle" = "Middle"; // TRANSLATORS: Photo "media-source.photo" = "Photo"; // TRANSLATORS: Rear "media-source.rear" = "Rear"; // TRANSLATORS: Right "media-source.right" = "Right"; // TRANSLATORS: Roll 1 "media-source.roll-1" = "Roll 1"; // TRANSLATORS: Roll 10 "media-source.roll-10" = "Roll 10"; // TRANSLATORS: Roll 2 "media-source.roll-2" = "Roll 2"; // TRANSLATORS: Roll 3 "media-source.roll-3" = "Roll 3"; // TRANSLATORS: Roll 4 "media-source.roll-4" = "Roll 4"; // TRANSLATORS: Roll 5 "media-source.roll-5" = "Roll 5"; // TRANSLATORS: Roll 6 "media-source.roll-6" = "Roll 6"; // TRANSLATORS: Roll 7 "media-source.roll-7" = "Roll 7"; // TRANSLATORS: Roll 8 "media-source.roll-8" = "Roll 8"; // TRANSLATORS: Roll 9 "media-source.roll-9" = "Roll 9"; // TRANSLATORS: Side "media-source.side" = "Side"; // TRANSLATORS: Top "media-source.top" = "Top"; // TRANSLATORS: Tray 1 "media-source.tray-1" = "Tray 1"; // TRANSLATORS: Tray 10 "media-source.tray-10" = "Tray 10"; // TRANSLATORS: Tray 11 "media-source.tray-11" = "Tray 11"; // TRANSLATORS: Tray 12 "media-source.tray-12" = "Tray 12"; // TRANSLATORS: Tray 13 "media-source.tray-13" = "Tray 13"; // TRANSLATORS: Tray 14 "media-source.tray-14" = "Tray 14"; // TRANSLATORS: Tray 15 "media-source.tray-15" = "Tray 15"; // TRANSLATORS: Tray 16 "media-source.tray-16" = "Tray 16"; // TRANSLATORS: Tray 17 "media-source.tray-17" = "Tray 17"; // TRANSLATORS: Tray 18 "media-source.tray-18" = "Tray 18"; // TRANSLATORS: Tray 19 "media-source.tray-19" = "Tray 19"; // TRANSLATORS: Tray 2 "media-source.tray-2" = "Tray 2"; // TRANSLATORS: Tray 20 "media-source.tray-20" = "Tray 20"; // TRANSLATORS: Tray 3 "media-source.tray-3" = "Tray 3"; // TRANSLATORS: Tray 4 "media-source.tray-4" = "Tray 4"; // TRANSLATORS: Tray 5 "media-source.tray-5" = "Tray 5"; // TRANSLATORS: Tray 6 "media-source.tray-6" = "Tray 6"; // TRANSLATORS: Tray 7 "media-source.tray-7" = "Tray 7"; // TRANSLATORS: Tray 8 "media-source.tray-8" = "Tray 8"; // TRANSLATORS: Tray 9 "media-source.tray-9" = "Tray 9"; // TRANSLATORS: Media Thickness "media-thickness" = "Media Thickness"; // TRANSLATORS: Media Tooth (Texture) "media-tooth" = "Media Tooth (Texture)"; // TRANSLATORS: Antique "media-tooth.antique" = "Antique"; // TRANSLATORS: Extra Smooth "media-tooth.calendared" = "Extra Smooth"; // TRANSLATORS: Coarse "media-tooth.coarse" = "Coarse"; // TRANSLATORS: Fine "media-tooth.fine" = "Fine"; // TRANSLATORS: Linen "media-tooth.linen" = "Linen"; // TRANSLATORS: Medium "media-tooth.medium" = "Medium"; // TRANSLATORS: Smooth "media-tooth.smooth" = "Smooth"; // TRANSLATORS: Stipple "media-tooth.stipple" = "Stipple"; // TRANSLATORS: Rough "media-tooth.uncalendared" = "Rough"; // TRANSLATORS: Vellum "media-tooth.vellum" = "Vellum"; // TRANSLATORS: Media Top Margin "media-top-margin" = "Media Top Margin"; // TRANSLATORS: Media Type "media-type" = "Media Type"; // TRANSLATORS: Aluminum "media-type.aluminum" = "Aluminum"; // TRANSLATORS: Automatic "media-type.auto" = "Automatic"; // TRANSLATORS: Back Print Film "media-type.back-print-film" = "Back Print Film"; // TRANSLATORS: Cardboard "media-type.cardboard" = "Cardboard"; // TRANSLATORS: Cardstock "media-type.cardstock" = "Cardstock"; // TRANSLATORS: CD "media-type.cd" = "CD"; // TRANSLATORS: Continuous "media-type.continuous" = "Continuous"; // TRANSLATORS: Continuous Long "media-type.continuous-long" = "Continuous Long"; // TRANSLATORS: Continuous Short "media-type.continuous-short" = "Continuous Short"; // TRANSLATORS: Corrugated Board "media-type.corrugated-board" = "Corrugated Board"; // TRANSLATORS: Optical Disc "media-type.disc" = "Optical Disc"; // TRANSLATORS: Glossy Optical Disc "media-type.disc-glossy" = "Glossy Optical Disc"; // TRANSLATORS: High Gloss Optical Disc "media-type.disc-high-gloss" = "High Gloss Optical Disc"; // TRANSLATORS: Matte Optical Disc "media-type.disc-matte" = "Matte Optical Disc"; // TRANSLATORS: Satin Optical Disc "media-type.disc-satin" = "Satin Optical Disc"; // TRANSLATORS: Semi-Gloss Optical Disc "media-type.disc-semi-gloss" = "Semi-Gloss Optical Disc"; // TRANSLATORS: Double Wall "media-type.double-wall" = "Double Wall"; // TRANSLATORS: Dry Film "media-type.dry-film" = "Dry Film"; // TRANSLATORS: DVD "media-type.dvd" = "DVD"; // TRANSLATORS: Embossing Foil "media-type.embossing-foil" = "Embossing Foil"; // TRANSLATORS: End Board "media-type.end-board" = "End Board"; // TRANSLATORS: Envelope "media-type.envelope" = "Envelope"; // TRANSLATORS: Archival Envelope "media-type.envelope-archival" = "Archival Envelope"; // TRANSLATORS: Bond Envelope "media-type.envelope-bond" = "Bond Envelope"; // TRANSLATORS: Coated Envelope "media-type.envelope-coated" = "Coated Envelope"; // TRANSLATORS: Cotton Envelope "media-type.envelope-cotton" = "Cotton Envelope"; // TRANSLATORS: Fine Envelope "media-type.envelope-fine" = "Fine Envelope"; // TRANSLATORS: Heavyweight Envelope "media-type.envelope-heavyweight" = "Heavyweight Envelope"; // TRANSLATORS: Inkjet Envelope "media-type.envelope-inkjet" = "Inkjet Envelope"; // TRANSLATORS: Lightweight Envelope "media-type.envelope-lightweight" = "Lightweight Envelope"; // TRANSLATORS: Plain Envelope "media-type.envelope-plain" = "Plain Envelope"; // TRANSLATORS: Preprinted Envelope "media-type.envelope-preprinted" = "Preprinted Envelope"; // TRANSLATORS: Windowed Envelope "media-type.envelope-window" = "Windowed Envelope"; // TRANSLATORS: Fabric "media-type.fabric" = "Fabric"; // TRANSLATORS: Archival Fabric "media-type.fabric-archival" = "Archival Fabric"; // TRANSLATORS: Glossy Fabric "media-type.fabric-glossy" = "Glossy Fabric"; // TRANSLATORS: High Gloss Fabric "media-type.fabric-high-gloss" = "High Gloss Fabric"; // TRANSLATORS: Matte Fabric "media-type.fabric-matte" = "Matte Fabric"; // TRANSLATORS: Semi-Gloss Fabric "media-type.fabric-semi-gloss" = "Semi-Gloss Fabric"; // TRANSLATORS: Waterproof Fabric "media-type.fabric-waterproof" = "Waterproof Fabric"; // TRANSLATORS: Film "media-type.film" = "Film"; // TRANSLATORS: Flexo Base "media-type.flexo-base" = "Flexo Base"; // TRANSLATORS: Flexo Photo Polymer "media-type.flexo-photo-polymer" = "Flexo Photo Polymer"; // TRANSLATORS: Flute "media-type.flute" = "Flute"; // TRANSLATORS: Foil "media-type.foil" = "Foil"; // TRANSLATORS: Full Cut Tabs "media-type.full-cut-tabs" = "Full Cut Tabs"; // TRANSLATORS: Glass "media-type.glass" = "Glass"; // TRANSLATORS: Glass Colored "media-type.glass-colored" = "Glass Colored"; // TRANSLATORS: Glass Opaque "media-type.glass-opaque" = "Glass Opaque"; // TRANSLATORS: Glass Surfaced "media-type.glass-surfaced" = "Glass Surfaced"; // TRANSLATORS: Glass Textured "media-type.glass-textured" = "Glass Textured"; // TRANSLATORS: Gravure Cylinder "media-type.gravure-cylinder" = "Gravure Cylinder"; // TRANSLATORS: Image Setter Paper "media-type.image-setter-paper" = "Image Setter Paper"; // TRANSLATORS: Imaging Cylinder "media-type.imaging-cylinder" = "Imaging Cylinder"; // TRANSLATORS: Labels "media-type.labels" = "Labels"; // TRANSLATORS: Colored Labels "media-type.labels-colored" = "Colored Labels"; // TRANSLATORS: Glossy Labels "media-type.labels-glossy" = "Glossy Labels"; // TRANSLATORS: High Gloss Labels "media-type.labels-high-gloss" = "High Gloss Labels"; // TRANSLATORS: Inkjet Labels "media-type.labels-inkjet" = "Inkjet Labels"; // TRANSLATORS: Matte Labels "media-type.labels-matte" = "Matte Labels"; // TRANSLATORS: Permanent Labels "media-type.labels-permanent" = "Permanent Labels"; // TRANSLATORS: Satin Labels "media-type.labels-satin" = "Satin Labels"; // TRANSLATORS: Security Labels "media-type.labels-security" = "Security Labels"; // TRANSLATORS: Semi-Gloss Labels "media-type.labels-semi-gloss" = "Semi-Gloss Labels"; // TRANSLATORS: Laminating Foil "media-type.laminating-foil" = "Laminating Foil"; // TRANSLATORS: Letterhead "media-type.letterhead" = "Letterhead"; // TRANSLATORS: Metal "media-type.metal" = "Metal"; // TRANSLATORS: Metal Glossy "media-type.metal-glossy" = "Metal Glossy"; // TRANSLATORS: Metal High Gloss "media-type.metal-high-gloss" = "Metal High Gloss"; // TRANSLATORS: Metal Matte "media-type.metal-matte" = "Metal Matte"; // TRANSLATORS: Metal Satin "media-type.metal-satin" = "Metal Satin"; // TRANSLATORS: Metal Semi Gloss "media-type.metal-semi-gloss" = "Metal Semi Gloss"; // TRANSLATORS: Mounting Tape "media-type.mounting-tape" = "Mounting Tape"; // TRANSLATORS: Multi Layer "media-type.multi-layer" = "Multi Layer"; // TRANSLATORS: Multi Part Form "media-type.multi-part-form" = "Multi Part Form"; // TRANSLATORS: Other "media-type.other" = "Other"; // TRANSLATORS: Paper "media-type.paper" = "Paper"; // TRANSLATORS: Photo Paper "media-type.photographic" = "Photo Paper"; // TRANSLATORS: Photographic Archival "media-type.photographic-archival" = "Photographic Archival"; // TRANSLATORS: Photo Film "media-type.photographic-film" = "Photo Film"; // TRANSLATORS: Glossy Photo Paper "media-type.photographic-glossy" = "Glossy Photo Paper"; // TRANSLATORS: High Gloss Photo Paper "media-type.photographic-high-gloss" = "High Gloss Photo Paper"; // TRANSLATORS: Matte Photo Paper "media-type.photographic-matte" = "Matte Photo Paper"; // TRANSLATORS: Satin Photo Paper "media-type.photographic-satin" = "Satin Photo Paper"; // TRANSLATORS: Semi-Gloss Photo Paper "media-type.photographic-semi-gloss" = "Semi-Gloss Photo Paper"; // TRANSLATORS: Plastic "media-type.plastic" = "Plastic"; // TRANSLATORS: Plastic Archival "media-type.plastic-archival" = "Plastic Archival"; // TRANSLATORS: Plastic Colored "media-type.plastic-colored" = "Plastic Colored"; // TRANSLATORS: Plastic Glossy "media-type.plastic-glossy" = "Plastic Glossy"; // TRANSLATORS: Plastic High Gloss "media-type.plastic-high-gloss" = "Plastic High Gloss"; // TRANSLATORS: Plastic Matte "media-type.plastic-matte" = "Plastic Matte"; // TRANSLATORS: Plastic Satin "media-type.plastic-satin" = "Plastic Satin"; // TRANSLATORS: Plastic Semi Gloss "media-type.plastic-semi-gloss" = "Plastic Semi Gloss"; // TRANSLATORS: Plate "media-type.plate" = "Plate"; // TRANSLATORS: Polyester "media-type.polyester" = "Polyester"; // TRANSLATORS: Pre Cut Tabs "media-type.pre-cut-tabs" = "Pre Cut Tabs"; // TRANSLATORS: Roll "media-type.roll" = "Roll"; // TRANSLATORS: Screen "media-type.screen" = "Screen"; // TRANSLATORS: Screen Paged "media-type.screen-paged" = "Screen Paged"; // TRANSLATORS: Self Adhesive "media-type.self-adhesive" = "Self Adhesive"; // TRANSLATORS: Self Adhesive Film "media-type.self-adhesive-film" = "Self Adhesive Film"; // TRANSLATORS: Shrink Foil "media-type.shrink-foil" = "Shrink Foil"; // TRANSLATORS: Single Face "media-type.single-face" = "Single Face"; // TRANSLATORS: Single Wall "media-type.single-wall" = "Single Wall"; // TRANSLATORS: Sleeve "media-type.sleeve" = "Sleeve"; // TRANSLATORS: Stationery "media-type.stationery" = "Stationery"; // TRANSLATORS: Stationery Archival "media-type.stationery-archival" = "Stationery Archival"; // TRANSLATORS: Coated Paper "media-type.stationery-coated" = "Coated Paper"; // TRANSLATORS: Stationery Cotton "media-type.stationery-cotton" = "Stationery Cotton"; // TRANSLATORS: Vellum Paper "media-type.stationery-fine" = "Vellum Paper"; // TRANSLATORS: Heavyweight Paper "media-type.stationery-heavyweight" = "Heavyweight Paper"; // TRANSLATORS: Stationery Heavyweight Coated "media-type.stationery-heavyweight-coated" = "Stationery Heavyweight Coated"; // TRANSLATORS: Stationery Inkjet Paper "media-type.stationery-inkjet" = "Stationery Inkjet Paper"; // TRANSLATORS: Letterhead "media-type.stationery-letterhead" = "Letterhead"; // TRANSLATORS: Lightweight Paper "media-type.stationery-lightweight" = "Lightweight Paper"; // TRANSLATORS: Preprinted Paper "media-type.stationery-preprinted" = "Preprinted Paper"; // TRANSLATORS: Punched Paper "media-type.stationery-prepunched" = "Punched Paper"; // TRANSLATORS: Tab Stock "media-type.tab-stock" = "Tab Stock"; // TRANSLATORS: Tractor "media-type.tractor" = "Tractor"; // TRANSLATORS: Transfer "media-type.transfer" = "Transfer"; // TRANSLATORS: Transparency "media-type.transparency" = "Transparency"; // TRANSLATORS: Triple Wall "media-type.triple-wall" = "Triple Wall"; // TRANSLATORS: Wet Film "media-type.wet-film" = "Wet Film"; // TRANSLATORS: Media Weight (grams per m²) "media-weight-metric" = "Media Weight (grams per m²)"; // TRANSLATORS: 28 x 40″ "media.asme_f_28x40in" = "28 x 40″"; // TRANSLATORS: A4 or US Letter "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" = "A4 or US Letter"; // TRANSLATORS: 2a0 "media.iso_2a0_1189x1682mm" = "2a0"; // TRANSLATORS: A0 "media.iso_a0_841x1189mm" = "A0"; // TRANSLATORS: A0x3 "media.iso_a0x3_1189x2523mm" = "A0x3"; // TRANSLATORS: A10 "media.iso_a10_26x37mm" = "A10"; // TRANSLATORS: A1 "media.iso_a1_594x841mm" = "A1"; // TRANSLATORS: A1x3 "media.iso_a1x3_841x1783mm" = "A1x3"; // TRANSLATORS: A1x4 "media.iso_a1x4_841x2378mm" = "A1x4"; // TRANSLATORS: A2 "media.iso_a2_420x594mm" = "A2"; // TRANSLATORS: A2x3 "media.iso_a2x3_594x1261mm" = "A2x3"; // TRANSLATORS: A2x4 "media.iso_a2x4_594x1682mm" = "A2x4"; // TRANSLATORS: A2x5 "media.iso_a2x5_594x2102mm" = "A2x5"; // TRANSLATORS: A3 (Extra) "media.iso_a3-extra_322x445mm" = "A3 (Extra)"; // TRANSLATORS: A3 "media.iso_a3_297x420mm" = "A3"; // TRANSLATORS: A3x3 "media.iso_a3x3_420x891mm" = "A3x3"; // TRANSLATORS: A3x4 "media.iso_a3x4_420x1189mm" = "A3x4"; // TRANSLATORS: A3x5 "media.iso_a3x5_420x1486mm" = "A3x5"; // TRANSLATORS: A3x6 "media.iso_a3x6_420x1783mm" = "A3x6"; // TRANSLATORS: A3x7 "media.iso_a3x7_420x2080mm" = "A3x7"; // TRANSLATORS: A4 (Extra) "media.iso_a4-extra_235.5x322.3mm" = "A4 (Extra)"; // TRANSLATORS: A4 (Tab) "media.iso_a4-tab_225x297mm" = "A4 (Tab)"; // TRANSLATORS: A4 "media.iso_a4_210x297mm" = "A4"; // TRANSLATORS: A4x3 "media.iso_a4x3_297x630mm" = "A4x3"; // TRANSLATORS: A4x4 "media.iso_a4x4_297x841mm" = "A4x4"; // TRANSLATORS: A4x5 "media.iso_a4x5_297x1051mm" = "A4x5"; // TRANSLATORS: A4x6 "media.iso_a4x6_297x1261mm" = "A4x6"; // TRANSLATORS: A4x7 "media.iso_a4x7_297x1471mm" = "A4x7"; // TRANSLATORS: A4x8 "media.iso_a4x8_297x1682mm" = "A4x8"; // TRANSLATORS: A4x9 "media.iso_a4x9_297x1892mm" = "A4x9"; // TRANSLATORS: A5 (Extra) "media.iso_a5-extra_174x235mm" = "A5 (Extra)"; // TRANSLATORS: A5 "media.iso_a5_148x210mm" = "A5"; // TRANSLATORS: A6 "media.iso_a6_105x148mm" = "A6"; // TRANSLATORS: A7 "media.iso_a7_74x105mm" = "A7"; // TRANSLATORS: A8 "media.iso_a8_52x74mm" = "A8"; // TRANSLATORS: A9 "media.iso_a9_37x52mm" = "A9"; // TRANSLATORS: B0 "media.iso_b0_1000x1414mm" = "B0"; // TRANSLATORS: B10 "media.iso_b10_31x44mm" = "B10"; // TRANSLATORS: B1 "media.iso_b1_707x1000mm" = "B1"; // TRANSLATORS: B2 "media.iso_b2_500x707mm" = "B2"; // TRANSLATORS: B3 "media.iso_b3_353x500mm" = "B3"; // TRANSLATORS: B4 "media.iso_b4_250x353mm" = "B4"; // TRANSLATORS: B5 (Extra) "media.iso_b5-extra_201x276mm" = "B5 (Extra)"; // TRANSLATORS: Envelope B5 "media.iso_b5_176x250mm" = "Envelope B5"; // TRANSLATORS: B6 "media.iso_b6_125x176mm" = "B6"; // TRANSLATORS: Envelope B6/C4 "media.iso_b6c4_125x324mm" = "Envelope B6/C4"; // TRANSLATORS: B7 "media.iso_b7_88x125mm" = "B7"; // TRANSLATORS: B8 "media.iso_b8_62x88mm" = "B8"; // TRANSLATORS: B9 "media.iso_b9_44x62mm" = "B9"; // TRANSLATORS: CEnvelope 0 "media.iso_c0_917x1297mm" = "CEnvelope 0"; // TRANSLATORS: CEnvelope 10 "media.iso_c10_28x40mm" = "CEnvelope 10"; // TRANSLATORS: CEnvelope 1 "media.iso_c1_648x917mm" = "CEnvelope 1"; // TRANSLATORS: CEnvelope 2 "media.iso_c2_458x648mm" = "CEnvelope 2"; // TRANSLATORS: CEnvelope 3 "media.iso_c3_324x458mm" = "CEnvelope 3"; // TRANSLATORS: CEnvelope 4 "media.iso_c4_229x324mm" = "CEnvelope 4"; // TRANSLATORS: CEnvelope 5 "media.iso_c5_162x229mm" = "CEnvelope 5"; // TRANSLATORS: CEnvelope 6 "media.iso_c6_114x162mm" = "CEnvelope 6"; // TRANSLATORS: CEnvelope 6c5 "media.iso_c6c5_114x229mm" = "CEnvelope 6c5"; // TRANSLATORS: CEnvelope 7 "media.iso_c7_81x114mm" = "CEnvelope 7"; // TRANSLATORS: CEnvelope 7c6 "media.iso_c7c6_81x162mm" = "CEnvelope 7c6"; // TRANSLATORS: CEnvelope 8 "media.iso_c8_57x81mm" = "CEnvelope 8"; // TRANSLATORS: CEnvelope 9 "media.iso_c9_40x57mm" = "CEnvelope 9"; // TRANSLATORS: Envelope DL "media.iso_dl_110x220mm" = "Envelope DL"; // TRANSLATORS: Id-1 "media.iso_id-1_53.98x85.6mm" = "Id-1"; // TRANSLATORS: Id-3 "media.iso_id-3_88x125mm" = "Id-3"; // TRANSLATORS: ISO RA0 "media.iso_ra0_860x1220mm" = "ISO RA0"; // TRANSLATORS: ISO RA1 "media.iso_ra1_610x860mm" = "ISO RA1"; // TRANSLATORS: ISO RA2 "media.iso_ra2_430x610mm" = "ISO RA2"; // TRANSLATORS: ISO RA3 "media.iso_ra3_305x430mm" = "ISO RA3"; // TRANSLATORS: ISO RA4 "media.iso_ra4_215x305mm" = "ISO RA4"; // TRANSLATORS: ISO SRA0 "media.iso_sra0_900x1280mm" = "ISO SRA0"; // TRANSLATORS: ISO SRA1 "media.iso_sra1_640x900mm" = "ISO SRA1"; // TRANSLATORS: ISO SRA2 "media.iso_sra2_450x640mm" = "ISO SRA2"; // TRANSLATORS: ISO SRA3 "media.iso_sra3_320x450mm" = "ISO SRA3"; // TRANSLATORS: ISO SRA4 "media.iso_sra4_225x320mm" = "ISO SRA4"; // TRANSLATORS: JIS B0 "media.jis_b0_1030x1456mm" = "JIS B0"; // TRANSLATORS: JIS B10 "media.jis_b10_32x45mm" = "JIS B10"; // TRANSLATORS: JIS B1 "media.jis_b1_728x1030mm" = "JIS B1"; // TRANSLATORS: JIS B2 "media.jis_b2_515x728mm" = "JIS B2"; // TRANSLATORS: JIS B3 "media.jis_b3_364x515mm" = "JIS B3"; // TRANSLATORS: JIS B4 "media.jis_b4_257x364mm" = "JIS B4"; // TRANSLATORS: JIS B5 "media.jis_b5_182x257mm" = "JIS B5"; // TRANSLATORS: JIS B6 "media.jis_b6_128x182mm" = "JIS B6"; // TRANSLATORS: JIS B7 "media.jis_b7_91x128mm" = "JIS B7"; // TRANSLATORS: JIS B8 "media.jis_b8_64x91mm" = "JIS B8"; // TRANSLATORS: JIS B9 "media.jis_b9_45x64mm" = "JIS B9"; // TRANSLATORS: JIS Executive "media.jis_exec_216x330mm" = "JIS Executive"; // TRANSLATORS: Envelope Chou 2 "media.jpn_chou2_111.1x146mm" = "Envelope Chou 2"; // TRANSLATORS: Envelope Chou 3 "media.jpn_chou3_120x235mm" = "Envelope Chou 3"; // TRANSLATORS: Envelope Chou 40 "media.jpn_chou40_90x225mm" = "media.jpn_chou40_90x225mm"; // TRANSLATORS: Envelope Chou 4 "media.jpn_chou4_90x205mm" = "Envelope Chou 4"; // TRANSLATORS: Hagaki "media.jpn_hagaki_100x148mm" = "Hagaki"; // TRANSLATORS: Envelope Kahu "media.jpn_kahu_240x322.1mm" = "Envelope Kahu"; // TRANSLATORS: 270 x 382mm "media.jpn_kaku1_270x382mm" = "270 x 382mm"; // TRANSLATORS: Envelope Kahu 2 "media.jpn_kaku2_240x332mm" = "Envelope Kahu 2"; // TRANSLATORS: 216 x 277mm "media.jpn_kaku3_216x277mm" = "216 x 277mm"; // TRANSLATORS: 197 x 267mm "media.jpn_kaku4_197x267mm" = "197 x 267mm"; // TRANSLATORS: 190 x 240mm "media.jpn_kaku5_190x240mm" = "190 x 240mm"; // TRANSLATORS: 142 x 205mm "media.jpn_kaku7_142x205mm" = "142 x 205mm"; // TRANSLATORS: 119 x 197mm "media.jpn_kaku8_119x197mm" = "119 x 197mm"; // TRANSLATORS: Oufuku Reply Postcard "media.jpn_oufuku_148x200mm" = "Oufuku Reply Postcard"; // TRANSLATORS: Envelope You 4 "media.jpn_you4_105x235mm" = "Envelope You 4"; // TRANSLATORS: 10 x 11″ "media.na_10x11_10x11in" = "10 x 11″"; // TRANSLATORS: 10 x 13″ "media.na_10x13_10x13in" = "10 x 13″"; // TRANSLATORS: 10 x 14″ "media.na_10x14_10x14in" = "10 x 14″"; // TRANSLATORS: 10 x 15″ "media.na_10x15_10x15in" = "10 x 15″"; // TRANSLATORS: 11 x 12″ "media.na_11x12_11x12in" = "11 x 12″"; // TRANSLATORS: 11 x 15″ "media.na_11x15_11x15in" = "11 x 15″"; // TRANSLATORS: 12 x 19″ "media.na_12x19_12x19in" = "12 x 19″"; // TRANSLATORS: 5 x 7″ "media.na_5x7_5x7in" = "5 x 7″"; // TRANSLATORS: 6 x 9″ "media.na_6x9_6x9in" = "6 x 9″"; // TRANSLATORS: 7 x 9″ "media.na_7x9_7x9in" = "7 x 9″"; // TRANSLATORS: 9 x 11″ "media.na_9x11_9x11in" = "9 x 11″"; // TRANSLATORS: Envelope A2 "media.na_a2_4.375x5.75in" = "Envelope A2"; // TRANSLATORS: 9 x 12″ "media.na_arch-a_9x12in" = "9 x 12″"; // TRANSLATORS: 12 x 18″ "media.na_arch-b_12x18in" = "12 x 18″"; // TRANSLATORS: 18 x 24″ "media.na_arch-c_18x24in" = "18 x 24″"; // TRANSLATORS: 24 x 36″ "media.na_arch-d_24x36in" = "24 x 36″"; // TRANSLATORS: 26 x 38″ "media.na_arch-e2_26x38in" = "26 x 38″"; // TRANSLATORS: 27 x 39″ "media.na_arch-e3_27x39in" = "27 x 39″"; // TRANSLATORS: 36 x 48″ "media.na_arch-e_36x48in" = "36 x 48″"; // TRANSLATORS: 12 x 19.17″ "media.na_b-plus_12x19.17in" = "12 x 19.17″"; // TRANSLATORS: Envelope C5 "media.na_c5_6.5x9.5in" = "Envelope C5"; // TRANSLATORS: 17 x 22″ "media.na_c_17x22in" = "17 x 22″"; // TRANSLATORS: 22 x 34″ "media.na_d_22x34in" = "22 x 34″"; // TRANSLATORS: 34 x 44″ "media.na_e_34x44in" = "34 x 44″"; // TRANSLATORS: 11 x 14″ "media.na_edp_11x14in" = "11 x 14″"; // TRANSLATORS: 12 x 14″ "media.na_eur-edp_12x14in" = "12 x 14″"; // TRANSLATORS: Executive "media.na_executive_7.25x10.5in" = "Executive"; // TRANSLATORS: 44 x 68″ "media.na_f_44x68in" = "44 x 68″"; // TRANSLATORS: European Fanfold "media.na_fanfold-eur_8.5x12in" = "European Fanfold"; // TRANSLATORS: US Fanfold "media.na_fanfold-us_11x14.875in" = "US Fanfold"; // TRANSLATORS: Foolscap "media.na_foolscap_8.5x13in" = "Foolscap"; // TRANSLATORS: 8 x 13″ "media.na_govt-legal_8x13in" = "8 x 13″"; // TRANSLATORS: 8 x 10″ "media.na_govt-letter_8x10in" = "8 x 10″"; // TRANSLATORS: 3 x 5″ "media.na_index-3x5_3x5in" = "3 x 5″"; // TRANSLATORS: 6 x 8″ "media.na_index-4x6-ext_6x8in" = "6 x 8″"; // TRANSLATORS: 4 x 6″ "media.na_index-4x6_4x6in" = "4 x 6″"; // TRANSLATORS: 5 x 8″ "media.na_index-5x8_5x8in" = "5 x 8″"; // TRANSLATORS: Statement "media.na_invoice_5.5x8.5in" = "Statement"; // TRANSLATORS: 11 x 17″ "media.na_ledger_11x17in" = "11 x 17″"; // TRANSLATORS: US Legal (Extra) "media.na_legal-extra_9.5x15in" = "US Legal (Extra)"; // TRANSLATORS: US Legal "media.na_legal_8.5x14in" = "US Legal"; // TRANSLATORS: US Letter (Extra) "media.na_letter-extra_9.5x12in" = "US Letter (Extra)"; // TRANSLATORS: US Letter (Plus) "media.na_letter-plus_8.5x12.69in" = "US Letter (Plus)"; // TRANSLATORS: US Letter "media.na_letter_8.5x11in" = "US Letter"; // TRANSLATORS: Envelope Monarch "media.na_monarch_3.875x7.5in" = "Envelope Monarch"; // TRANSLATORS: Envelope #10 "media.na_number-10_4.125x9.5in" = "Envelope #10"; // TRANSLATORS: Envelope #11 "media.na_number-11_4.5x10.375in" = "Envelope #11"; // TRANSLATORS: Envelope #12 "media.na_number-12_4.75x11in" = "Envelope #12"; // TRANSLATORS: Envelope #14 "media.na_number-14_5x11.5in" = "Envelope #14"; // TRANSLATORS: Envelope #9 "media.na_number-9_3.875x8.875in" = "Envelope #9"; // TRANSLATORS: 8.5 x 13.4″ "media.na_oficio_8.5x13.4in" = "8.5 x 13.4″"; // TRANSLATORS: Envelope Personal "media.na_personal_3.625x6.5in" = "Envelope Personal"; // TRANSLATORS: Quarto "media.na_quarto_8.5x10.83in" = "Quarto"; // TRANSLATORS: 8.94 x 14″ "media.na_super-a_8.94x14in" = "8.94 x 14″"; // TRANSLATORS: 13 x 19″ "media.na_super-b_13x19in" = "13 x 19″"; // TRANSLATORS: 30 x 42″ "media.na_wide-format_30x42in" = "30 x 42″"; // TRANSLATORS: 12 x 16″ "media.oe_12x16_12x16in" = "12 x 16″"; // TRANSLATORS: 14 x 17″ "media.oe_14x17_14x17in" = "14 x 17″"; // TRANSLATORS: 18 x 22″ "media.oe_18x22_18x22in" = "18 x 22″"; // TRANSLATORS: 17 x 24″ "media.oe_a2plus_17x24in" = "17 x 24″"; // TRANSLATORS: 2 x 3.5″ "media.oe_business-card_2x3.5in" = "2 x 3.5″"; // TRANSLATORS: 10 x 12″ "media.oe_photo-10r_10x12in" = "10 x 12″"; // TRANSLATORS: 20 x 24″ "media.oe_photo-20r_20x24in" = "20 x 24″"; // TRANSLATORS: 3.5 x 5″ "media.oe_photo-l_3.5x5in" = "3.5 x 5″"; // TRANSLATORS: 10 x 15″ "media.oe_photo-s10r_10x15in" = "10 x 15″"; // TRANSLATORS: 4 x 4″ "media.oe_square-photo_4x4in" = "4 x 4″"; // TRANSLATORS: 5 x 5″ "media.oe_square-photo_5x5in" = "5 x 5″"; // TRANSLATORS: 184 x 260mm "media.om_16k_184x260mm" = "184 x 260mm"; // TRANSLATORS: 195 x 270mm "media.om_16k_195x270mm" = "195 x 270mm"; // TRANSLATORS: 55 x 85mm "media.om_business-card_55x85mm" = "55 x 85mm"; // TRANSLATORS: 55 x 91mm "media.om_business-card_55x91mm" = "55 x 91mm"; // TRANSLATORS: 54 x 86mm "media.om_card_54x86mm" = "54 x 86mm"; // TRANSLATORS: 275 x 395mm "media.om_dai-pa-kai_275x395mm" = "275 x 395mm"; // TRANSLATORS: 89 x 119mm "media.om_dsc-photo_89x119mm" = "89 x 119mm"; // TRANSLATORS: Folio "media.om_folio-sp_215x315mm" = "Folio"; // TRANSLATORS: Folio (Special) "media.om_folio_210x330mm" = "Folio (Special)"; // TRANSLATORS: Envelope Invitation "media.om_invite_220x220mm" = "Envelope Invitation"; // TRANSLATORS: Envelope Italian "media.om_italian_110x230mm" = "Envelope Italian"; // TRANSLATORS: 198 x 275mm "media.om_juuro-ku-kai_198x275mm" = "198 x 275mm"; // TRANSLATORS: 200 x 300 "media.om_large-photo_200x300" = "200 x 300"; // TRANSLATORS: 130 x 180mm "media.om_medium-photo_130x180mm" = "130 x 180mm"; // TRANSLATORS: 267 x 389mm "media.om_pa-kai_267x389mm" = "267 x 389mm"; // TRANSLATORS: Envelope Postfix "media.om_postfix_114x229mm" = "Envelope Postfix"; // TRANSLATORS: 100 x 150mm "media.om_small-photo_100x150mm" = "100 x 150mm"; // TRANSLATORS: 89 x 89mm "media.om_square-photo_89x89mm" = "89 x 89mm"; // TRANSLATORS: 100 x 200mm "media.om_wide-photo_100x200mm" = "100 x 200mm"; // TRANSLATORS: Envelope Chinese #10 "media.prc_10_324x458mm" = "Envelope Chinese #10"; // TRANSLATORS: Chinese 16k "media.prc_16k_146x215mm" = "Chinese 16k"; // TRANSLATORS: Envelope Chinese #1 "media.prc_1_102x165mm" = "Envelope Chinese #1"; // TRANSLATORS: Envelope Chinese #2 "media.prc_2_102x176mm" = "Envelope Chinese #2"; // TRANSLATORS: Chinese 32k "media.prc_32k_97x151mm" = "Chinese 32k"; // TRANSLATORS: Envelope Chinese #3 "media.prc_3_125x176mm" = "Envelope Chinese #3"; // TRANSLATORS: Envelope Chinese #4 "media.prc_4_110x208mm" = "Envelope Chinese #4"; // TRANSLATORS: Envelope Chinese #5 "media.prc_5_110x220mm" = "Envelope Chinese #5"; // TRANSLATORS: Envelope Chinese #6 "media.prc_6_120x320mm" = "Envelope Chinese #6"; // TRANSLATORS: Envelope Chinese #7 "media.prc_7_160x230mm" = "Envelope Chinese #7"; // TRANSLATORS: Envelope Chinese #8 "media.prc_8_120x309mm" = "Envelope Chinese #8"; // TRANSLATORS: ROC 16k "media.roc_16k_7.75x10.75in" = "ROC 16k"; // TRANSLATORS: ROC 8k "media.roc_8k_10.75x15.5in" = "ROC 8k"; "members of class %s:" = "members of class %s:"; // TRANSLATORS: Multiple Document Handling "multiple-document-handling" = "Multiple Document Handling"; // TRANSLATORS: Separate Documents Collated Copies "multiple-document-handling.separate-documents-collated-copies" = "Separate Documents Collated Copies"; // TRANSLATORS: Separate Documents Uncollated Copies "multiple-document-handling.separate-documents-uncollated-copies" = "Separate Documents Uncollated Copies"; // TRANSLATORS: Single Document "multiple-document-handling.single-document" = "Single Document"; // TRANSLATORS: Single Document New Sheet "multiple-document-handling.single-document-new-sheet" = "Single Document New Sheet"; // TRANSLATORS: Multiple Object Handling "multiple-object-handling" = "Multiple Object Handling"; // TRANSLATORS: Multiple Object Handling Actual "multiple-object-handling-actual" = "Multiple Object Handling Actual"; // TRANSLATORS: Automatic "multiple-object-handling.auto" = "Automatic"; // TRANSLATORS: Best Fit "multiple-object-handling.best-fit" = "Best Fit"; // TRANSLATORS: Best Quality "multiple-object-handling.best-quality" = "Best Quality"; // TRANSLATORS: Best Speed "multiple-object-handling.best-speed" = "Best Speed"; // TRANSLATORS: One At A Time "multiple-object-handling.one-at-a-time" = "One At A Time"; // TRANSLATORS: On Timeout "multiple-operation-time-out-action" = "On Timeout"; // TRANSLATORS: Abort Job "multiple-operation-time-out-action.abort-job" = "Abort Job"; // TRANSLATORS: Hold Job "multiple-operation-time-out-action.hold-job" = "Hold Job"; // TRANSLATORS: Process Job "multiple-operation-time-out-action.process-job" = "Process Job"; "no entries" = "no entries"; "no system default destination" = "no system default destination"; // TRANSLATORS: Noise Removal "noise-removal" = "Noise Removal"; // TRANSLATORS: Notify Attributes "notify-attributes" = "Notify Attributes"; // TRANSLATORS: Notify Charset "notify-charset" = "Notify Charset"; // TRANSLATORS: Notify Events "notify-events" = "Notify Events"; "notify-events not specified." = "notify-events not specified."; // TRANSLATORS: Document Completed "notify-events.document-completed" = "Document Completed"; // TRANSLATORS: Document Config Changed "notify-events.document-config-changed" = "Document Config Changed"; // TRANSLATORS: Document Created "notify-events.document-created" = "Document Created"; // TRANSLATORS: Document Fetchable "notify-events.document-fetchable" = "Document Fetchable"; // TRANSLATORS: Document State Changed "notify-events.document-state-changed" = "Document State Changed"; // TRANSLATORS: Document Stopped "notify-events.document-stopped" = "Document Stopped"; // TRANSLATORS: Job Completed "notify-events.job-completed" = "Job Completed"; // TRANSLATORS: Job Config Changed "notify-events.job-config-changed" = "Job Config Changed"; // TRANSLATORS: Job Created "notify-events.job-created" = "Job Created"; // TRANSLATORS: Job Fetchable "notify-events.job-fetchable" = "Job Fetchable"; // TRANSLATORS: Job Progress "notify-events.job-progress" = "Job Progress"; // TRANSLATORS: Job State Changed "notify-events.job-state-changed" = "Job State Changed"; // TRANSLATORS: Job Stopped "notify-events.job-stopped" = "Job Stopped"; // TRANSLATORS: None "notify-events.none" = "None"; // TRANSLATORS: Printer Config Changed "notify-events.printer-config-changed" = "Printer Config Changed"; // TRANSLATORS: Printer Finishings Changed "notify-events.printer-finishings-changed" = "Printer Finishings Changed"; // TRANSLATORS: Printer Media Changed "notify-events.printer-media-changed" = "Printer Media Changed"; // TRANSLATORS: Printer Queue Order Changed "notify-events.printer-queue-order-changed" = "Printer Queue Order Changed"; // TRANSLATORS: Printer Restarted "notify-events.printer-restarted" = "Printer Restarted"; // TRANSLATORS: Printer Shutdown "notify-events.printer-shutdown" = "Printer Shutdown"; // TRANSLATORS: Printer State Changed "notify-events.printer-state-changed" = "Printer State Changed"; // TRANSLATORS: Printer Stopped "notify-events.printer-stopped" = "Printer Stopped"; // TRANSLATORS: Notify Get Interval "notify-get-interval" = "Notify Get Interval"; // TRANSLATORS: Notify Lease Duration "notify-lease-duration" = "Notify Lease Duration"; // TRANSLATORS: Notify Natural Language "notify-natural-language" = "Notify Natural Language"; // TRANSLATORS: Notify Pull Method "notify-pull-method" = "Notify Pull Method"; // TRANSLATORS: Notify Recipient "notify-recipient-uri" = "Notify Recipient"; "notify-recipient-uri URI \"%s\" is already used." = "notify-recipient-uri URI “%s” is already used."; "notify-recipient-uri URI \"%s\" uses unknown scheme." = "notify-recipient-uri URI \"%s\" uses unknown scheme."; // TRANSLATORS: Notify Sequence Numbers "notify-sequence-numbers" = "Notify Sequence Numbers"; // TRANSLATORS: Notify Subscription Ids "notify-subscription-ids" = "Notify Subscription Ids"; // TRANSLATORS: Notify Time Interval "notify-time-interval" = "Notify Time Interval"; // TRANSLATORS: Notify User Data "notify-user-data" = "Notify User Data"; // TRANSLATORS: Notify Wait "notify-wait" = "Notify Wait"; // TRANSLATORS: Number Of Retries "number-of-retries" = "Number Of Retries"; // TRANSLATORS: Number-Up "number-up" = "Number-Up"; // TRANSLATORS: Object Offset "object-offset" = "Object Offset"; // TRANSLATORS: Object Size "object-size" = "Object Size"; // TRANSLATORS: Organization Name "organization-name" = "Organization Name"; // TRANSLATORS: Orientation "orientation-requested" = "Orientation"; // TRANSLATORS: Portrait "orientation-requested.3" = "Portrait"; // TRANSLATORS: Landscape "orientation-requested.4" = "Landscape"; // TRANSLATORS: Reverse Landscape "orientation-requested.5" = "Reverse Landscape"; // TRANSLATORS: Reverse Portrait "orientation-requested.6" = "Reverse Portrait"; // TRANSLATORS: None "orientation-requested.7" = "None"; // TRANSLATORS: Scanned Image Options "output-attributes" = "Scanned Image Options"; // TRANSLATORS: Output Tray "output-bin" = "Output Tray"; // TRANSLATORS: Automatic "output-bin.auto" = "Automatic"; // TRANSLATORS: Bottom "output-bin.bottom" = "Bottom"; // TRANSLATORS: Center "output-bin.center" = "Center"; // TRANSLATORS: Face Down "output-bin.face-down" = "Face Down"; // TRANSLATORS: Face Up "output-bin.face-up" = "Face Up"; // TRANSLATORS: Large Capacity "output-bin.large-capacity" = "Large Capacity"; // TRANSLATORS: Left "output-bin.left" = "Left"; // TRANSLATORS: Mailbox 1 "output-bin.mailbox-1" = "Mailbox 1"; // TRANSLATORS: Mailbox 10 "output-bin.mailbox-10" = "Mailbox 10"; // TRANSLATORS: Mailbox 2 "output-bin.mailbox-2" = "Mailbox 2"; // TRANSLATORS: Mailbox 3 "output-bin.mailbox-3" = "Mailbox 3"; // TRANSLATORS: Mailbox 4 "output-bin.mailbox-4" = "Mailbox 4"; // TRANSLATORS: Mailbox 5 "output-bin.mailbox-5" = "Mailbox 5"; // TRANSLATORS: Mailbox 6 "output-bin.mailbox-6" = "Mailbox 6"; // TRANSLATORS: Mailbox 7 "output-bin.mailbox-7" = "Mailbox 7"; // TRANSLATORS: Mailbox 8 "output-bin.mailbox-8" = "Mailbox 8"; // TRANSLATORS: Mailbox 9 "output-bin.mailbox-9" = "Mailbox 9"; // TRANSLATORS: Middle "output-bin.middle" = "Middle"; // TRANSLATORS: My Mailbox "output-bin.my-mailbox" = "My Mailbox"; // TRANSLATORS: Rear "output-bin.rear" = "Rear"; // TRANSLATORS: Right "output-bin.right" = "Right"; // TRANSLATORS: Side "output-bin.side" = "Side"; // TRANSLATORS: Stacker 1 "output-bin.stacker-1" = "Stacker 1"; // TRANSLATORS: Stacker 10 "output-bin.stacker-10" = "Stacker 10"; // TRANSLATORS: Stacker 2 "output-bin.stacker-2" = "Stacker 2"; // TRANSLATORS: Stacker 3 "output-bin.stacker-3" = "Stacker 3"; // TRANSLATORS: Stacker 4 "output-bin.stacker-4" = "Stacker 4"; // TRANSLATORS: Stacker 5 "output-bin.stacker-5" = "Stacker 5"; // TRANSLATORS: Stacker 6 "output-bin.stacker-6" = "Stacker 6"; // TRANSLATORS: Stacker 7 "output-bin.stacker-7" = "Stacker 7"; // TRANSLATORS: Stacker 8 "output-bin.stacker-8" = "Stacker 8"; // TRANSLATORS: Stacker 9 "output-bin.stacker-9" = "Stacker 9"; // TRANSLATORS: Top "output-bin.top" = "Top"; // TRANSLATORS: Tray 1 "output-bin.tray-1" = "Tray 1"; // TRANSLATORS: Tray 10 "output-bin.tray-10" = "Tray 10"; // TRANSLATORS: Tray 2 "output-bin.tray-2" = "Tray 2"; // TRANSLATORS: Tray 3 "output-bin.tray-3" = "Tray 3"; // TRANSLATORS: Tray 4 "output-bin.tray-4" = "Tray 4"; // TRANSLATORS: Tray 5 "output-bin.tray-5" = "Tray 5"; // TRANSLATORS: Tray 6 "output-bin.tray-6" = "Tray 6"; // TRANSLATORS: Tray 7 "output-bin.tray-7" = "Tray 7"; // TRANSLATORS: Tray 8 "output-bin.tray-8" = "Tray 8"; // TRANSLATORS: Tray 9 "output-bin.tray-9" = "Tray 9"; // TRANSLATORS: Scanned Image Quality "output-compression-quality-factor" = "Scanned Image Quality"; // TRANSLATORS: Page Delivery "page-delivery" = "Page Delivery"; // TRANSLATORS: Reverse Order Face-down "page-delivery.reverse-order-face-down" = "Reverse Order Face-down"; // TRANSLATORS: Reverse Order Face-up "page-delivery.reverse-order-face-up" = "Reverse Order Face-up"; // TRANSLATORS: Same Order Face-down "page-delivery.same-order-face-down" = "Same Order Face-down"; // TRANSLATORS: Same Order Face-up "page-delivery.same-order-face-up" = "Same Order Face-up"; // TRANSLATORS: System Specified "page-delivery.system-specified" = "System Specified"; // TRANSLATORS: Page Order Received "page-order-received" = "Page Order Received"; // TRANSLATORS: 1 To N "page-order-received.1-to-n-order" = "1 To N"; // TRANSLATORS: N To 1 "page-order-received.n-to-1-order" = "N To 1"; // TRANSLATORS: Page Ranges "page-ranges" = "Page Ranges"; // TRANSLATORS: Pages "pages" = "Pages"; // TRANSLATORS: Pages Per Subset "pages-per-subset" = "Pages Per Subset"; // TRANSLATORS: Pclm Raster Back Side "pclm-raster-back-side" = "Pclm Raster Back Side"; // TRANSLATORS: Flipped "pclm-raster-back-side.flipped" = "Flipped"; // TRANSLATORS: Normal "pclm-raster-back-side.normal" = "Normal"; // TRANSLATORS: Rotated "pclm-raster-back-side.rotated" = "Rotated"; // TRANSLATORS: Pclm Source Resolution "pclm-source-resolution" = "Pclm Source Resolution"; "pending" = "pending"; // TRANSLATORS: Platform Shape "platform-shape" = "Platform Shape"; // TRANSLATORS: Round "platform-shape.ellipse" = "Round"; // TRANSLATORS: Rectangle "platform-shape.rectangle" = "Rectangle"; // TRANSLATORS: Platform Temperature "platform-temperature" = "Platform Temperature"; // TRANSLATORS: Post-dial String "post-dial-string" = "Post-dial String"; "ppdc: Adding include directory \"%s\"." = "ppdc: Adding include directory “%s”."; "ppdc: Adding/updating UI text from %s." = "ppdc: Adding/updating UI text from %s."; "ppdc: Bad boolean value (%s) on line %d of %s." = "ppdc: Bad boolean value (%s) on line %d of %s."; "ppdc: Bad font attribute: %s" = "ppdc: Bad font attribute: %s"; "ppdc: Bad resolution name \"%s\" on line %d of %s." = "ppdc: Bad resolution name “%s” on line %d of %s."; "ppdc: Bad status keyword %s on line %d of %s." = "ppdc: Bad status keyword %s on line %d of %s."; "ppdc: Bad variable substitution ($%c) on line %d of %s." = "ppdc: Bad variable substitution ($%c) on line %d of %s."; "ppdc: Choice found on line %d of %s with no Option." = "ppdc: Choice found on line %d of %s with no Option."; "ppdc: Duplicate #po for locale %s on line %d of %s." = "ppdc: Duplicate #po for locale %s on line %d of %s."; "ppdc: Expected a filter definition on line %d of %s." = "ppdc: Expected a filter definition on line %d of %s."; "ppdc: Expected a program name on line %d of %s." = "ppdc: Expected a program name on line %d of %s."; "ppdc: Expected boolean value on line %d of %s." = "ppdc: Expected boolean value on line %d of %s."; "ppdc: Expected charset after Font on line %d of %s." = "ppdc: Expected charset after Font on line %d of %s."; "ppdc: Expected choice code on line %d of %s." = "ppdc: Expected choice code on line %d of %s."; "ppdc: Expected choice name/text on line %d of %s." = "ppdc: Expected choice name/text on line %d of %s."; "ppdc: Expected color order for ColorModel on line %d of %s." = "ppdc: Expected color order for ColorModel on line %d of %s."; "ppdc: Expected colorspace for ColorModel on line %d of %s." = "ppdc: Expected colorspace for ColorModel on line %d of %s."; "ppdc: Expected compression for ColorModel on line %d of %s." = "ppdc: Expected compression for ColorModel on line %d of %s."; "ppdc: Expected constraints string for UIConstraints on line %d of %s." = "ppdc: Expected constraints string for UIConstraints on line %d of %s."; "ppdc: Expected driver type keyword following DriverType on line %d of %s." = "ppdc: Expected driver type keyword following DriverType on line %d of %s."; "ppdc: Expected duplex type after Duplex on line %d of %s." = "ppdc: Expected duplex type after Duplex on line %d of %s."; "ppdc: Expected encoding after Font on line %d of %s." = "ppdc: Expected encoding after Font on line %d of %s."; "ppdc: Expected filename after #po %s on line %d of %s." = "ppdc: Expected filename after #po %s on line %d of %s."; "ppdc: Expected group name/text on line %d of %s." = "ppdc: Expected group name/text on line %d of %s."; "ppdc: Expected include filename on line %d of %s." = "ppdc: Expected include filename on line %d of %s."; "ppdc: Expected integer on line %d of %s." = "ppdc: Expected integer on line %d of %s."; "ppdc: Expected locale after #po on line %d of %s." = "ppdc: Expected locale after #po on line %d of %s."; "ppdc: Expected name after %s on line %d of %s." = "ppdc: Expected name after %s on line %d of %s."; "ppdc: Expected name after FileName on line %d of %s." = "ppdc: Expected name after FileName on line %d of %s."; "ppdc: Expected name after Font on line %d of %s." = "ppdc: Expected name after Font on line %d of %s."; "ppdc: Expected name after Manufacturer on line %d of %s." = "ppdc: Expected name after Manufacturer on line %d of %s."; "ppdc: Expected name after MediaSize on line %d of %s." = "ppdc: Expected name after MediaSize on line %d of %s."; "ppdc: Expected name after ModelName on line %d of %s." = "ppdc: Expected name after ModelName on line %d of %s."; "ppdc: Expected name after PCFileName on line %d of %s." = "ppdc: Expected name after PCFileName on line %d of %s."; "ppdc: Expected name/text after %s on line %d of %s." = "ppdc: Expected name/text after %s on line %d of %s."; "ppdc: Expected name/text after Installable on line %d of %s." = "ppdc: Expected name/text after Installable on line %d of %s."; "ppdc: Expected name/text after Resolution on line %d of %s." = "ppdc: Expected name/text after Resolution on line %d of %s."; "ppdc: Expected name/text combination for ColorModel on line %d of %s." = "ppdc: Expected name/text combination for ColorModel on line %d of %s."; "ppdc: Expected option name/text on line %d of %s." = "ppdc: Expected option name/text on line %d of %s."; "ppdc: Expected option section on line %d of %s." = "ppdc: Expected option section on line %d of %s."; "ppdc: Expected option type on line %d of %s." = "ppdc: Expected option type on line %d of %s."; "ppdc: Expected override field after Resolution on line %d of %s." = "ppdc: Expected override field after Resolution on line %d of %s."; "ppdc: Expected quoted string on line %d of %s." = "ppdc: Expected quoted string on line %d of %s."; "ppdc: Expected real number on line %d of %s." = "ppdc: Expected real number on line %d of %s."; "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." = "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."; "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." = "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."; "ppdc: Expected selector after %s on line %d of %s." = "ppdc: Expected selector after %s on line %d of %s."; "ppdc: Expected status after Font on line %d of %s." = "ppdc: Expected status after Font on line %d of %s."; "ppdc: Expected string after Copyright on line %d of %s." = "ppdc: Expected string after Copyright on line %d of %s."; "ppdc: Expected string after Version on line %d of %s." = "ppdc: Expected string after Version on line %d of %s."; "ppdc: Expected two option names on line %d of %s." = "ppdc: Expected two option names on line %d of %s."; "ppdc: Expected value after %s on line %d of %s." = "ppdc: Expected value after %s on line %d of %s."; "ppdc: Expected version after Font on line %d of %s." = "ppdc: Expected version after Font on line %d of %s."; "ppdc: Invalid #include/#po filename \"%s\"." = "ppdc: Invalid #include/#po filename “%s”."; "ppdc: Invalid cost for filter on line %d of %s." = "ppdc: Invalid cost for filter on line %d of %s."; "ppdc: Invalid empty MIME type for filter on line %d of %s." = "ppdc: Invalid empty MIME type for filter on line %d of %s."; "ppdc: Invalid empty program name for filter on line %d of %s." = "ppdc: Invalid empty program name for filter on line %d of %s."; "ppdc: Invalid option section \"%s\" on line %d of %s." = "ppdc: Invalid option section “%s” on line %d of %s."; "ppdc: Invalid option type \"%s\" on line %d of %s." = "ppdc: Invalid option type “%s” on line %d of %s."; "ppdc: Loading driver information file \"%s\"." = "ppdc: Loading driver information file “%s”."; "ppdc: Loading messages for locale \"%s\"." = "ppdc: Loading messages for locale “%s”."; "ppdc: Loading messages from \"%s\"." = "ppdc: Loading messages from “%s”."; "ppdc: Missing #endif at end of \"%s\"." = "ppdc: Missing #endif at end of “%s”."; "ppdc: Missing #if on line %d of %s." = "ppdc: Missing #if on line %d of %s."; "ppdc: Need a msgid line before any translation strings on line %d of %s." = "ppdc: Need a msgid line before any translation strings on line %d of %s."; "ppdc: No message catalog provided for locale %s." = "ppdc: No message catalog provided for locale %s."; "ppdc: Option %s defined in two different groups on line %d of %s." = "ppdc: Option %s defined in two different groups on line %d of %s."; "ppdc: Option %s redefined with a different type on line %d of %s." = "ppdc: Option %s redefined with a different type on line %d of %s."; "ppdc: Option constraint must *name on line %d of %s." = "ppdc: Option constraint must *name on line %d of %s."; "ppdc: Too many nested #if's on line %d of %s." = "ppdc: Too many nested #if’s on line %d of %s."; "ppdc: Unable to create PPD file \"%s\" - %s." = "ppdc: Unable to create PPD file “%s” - %s."; "ppdc: Unable to create output directory %s: %s" = "ppdc: Unable to create output directory %s: %s"; "ppdc: Unable to create output pipes: %s" = "ppdc: Unable to create output pipes: %s"; "ppdc: Unable to execute cupstestppd: %s" = "ppdc: Unable to execute cupstestppd: %s"; "ppdc: Unable to find #po file %s on line %d of %s." = "ppdc: Unable to find #po file %s on line %d of %s."; "ppdc: Unable to find include file \"%s\" on line %d of %s." = "ppdc: Unable to find include file “%s” on line %d of %s."; "ppdc: Unable to find localization for \"%s\" - %s" = "ppdc: Unable to find localization for “%s” - %s"; "ppdc: Unable to load localization file \"%s\" - %s" = "ppdc: Unable to load localization file “%s” - %s"; "ppdc: Unable to open %s: %s" = "ppdc: Unable to open %s: %s"; "ppdc: Undefined variable (%s) on line %d of %s." = "ppdc: Undefined variable (%s) on line %d of %s."; "ppdc: Unexpected text on line %d of %s." = "ppdc: Unexpected text on line %d of %s."; "ppdc: Unknown driver type %s on line %d of %s." = "ppdc: Unknown driver type %s on line %d of %s."; "ppdc: Unknown duplex type \"%s\" on line %d of %s." = "ppdc: Unknown duplex type “%s” on line %d of %s."; "ppdc: Unknown media size \"%s\" on line %d of %s." = "ppdc: Unknown media size “%s” on line %d of %s."; "ppdc: Unknown message catalog format for \"%s\"." = "ppdc: Unknown message catalog format for “%s”."; "ppdc: Unknown token \"%s\" seen on line %d of %s." = "ppdc: Unknown token “%s” seen on line %d of %s."; "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." = "ppdc: Unknown trailing characters in real number “%s” on line %d of %s."; "ppdc: Unterminated string starting with %c on line %d of %s." = "ppdc: Unterminated string starting with %c on line %d of %s."; "ppdc: Warning - overlapping filename \"%s\"." = "ppdc: Warning - overlapping filename “%s”."; "ppdc: Writing %s." = "ppdc: Writing %s."; "ppdc: Writing PPD files to directory \"%s\"." = "ppdc: Writing PPD files to directory “%s”."; "ppdmerge: Bad LanguageVersion \"%s\" in %s." = "ppdmerge: Bad LanguageVersion “%s” in %s."; "ppdmerge: Ignoring PPD file %s." = "ppdmerge: Ignoring PPD file %s."; "ppdmerge: Unable to backup %s to %s - %s" = "ppdmerge: Unable to backup %s to %s - %s"; // TRANSLATORS: Pre-dial String "pre-dial-string" = "Pre-dial String"; // TRANSLATORS: Number-Up Layout "presentation-direction-number-up" = "Number-Up Layout"; // TRANSLATORS: Top-bottom, Right-left "presentation-direction-number-up.tobottom-toleft" = "Top-bottom, Right-left"; // TRANSLATORS: Top-bottom, Left-right "presentation-direction-number-up.tobottom-toright" = "Top-bottom, Left-right"; // TRANSLATORS: Right-left, Top-bottom "presentation-direction-number-up.toleft-tobottom" = "Right-left, Top-bottom"; // TRANSLATORS: Right-left, Bottom-top "presentation-direction-number-up.toleft-totop" = "Right-left, Bottom-top"; // TRANSLATORS: Left-right, Top-bottom "presentation-direction-number-up.toright-tobottom" = "Left-right, Top-bottom"; // TRANSLATORS: Left-right, Bottom-top "presentation-direction-number-up.toright-totop" = "Left-right, Bottom-top"; // TRANSLATORS: Bottom-top, Right-left "presentation-direction-number-up.totop-toleft" = "Bottom-top, Right-left"; // TRANSLATORS: Bottom-top, Left-right "presentation-direction-number-up.totop-toright" = "Bottom-top, Left-right"; // TRANSLATORS: Print Accuracy "print-accuracy" = "Print Accuracy"; // TRANSLATORS: Print Base "print-base" = "Print Base"; // TRANSLATORS: Print Base Actual "print-base-actual" = "Print Base Actual"; // TRANSLATORS: Brim "print-base.brim" = "Brim"; // TRANSLATORS: None "print-base.none" = "None"; // TRANSLATORS: Raft "print-base.raft" = "Raft"; // TRANSLATORS: Skirt "print-base.skirt" = "Skirt"; // TRANSLATORS: Standard "print-base.standard" = "Standard"; // TRANSLATORS: Print Color Mode "print-color-mode" = "Print Color Mode"; // TRANSLATORS: Automatic "print-color-mode.auto" = "Automatic"; // TRANSLATORS: Auto Monochrome "print-color-mode.auto-monochrome" = "Auto Monochrome"; // TRANSLATORS: Text "print-color-mode.bi-level" = "Text"; // TRANSLATORS: Color "print-color-mode.color" = "Color"; // TRANSLATORS: Highlight "print-color-mode.highlight" = "Highlight"; // TRANSLATORS: Monochrome "print-color-mode.monochrome" = "Monochrome"; // TRANSLATORS: Process Text "print-color-mode.process-bi-level" = "Process Text"; // TRANSLATORS: Process Monochrome "print-color-mode.process-monochrome" = "Process Monochrome"; // TRANSLATORS: Print Optimization "print-content-optimize" = "Print Optimization"; // TRANSLATORS: Print Content Optimize Actual "print-content-optimize-actual" = "print-content-optimize-actual"; // TRANSLATORS: Automatic "print-content-optimize.auto" = "Automatic"; // TRANSLATORS: Graphics "print-content-optimize.graphic" = "Graphics"; // TRANSLATORS: Graphics "print-content-optimize.graphics" = "print-content-optimize.graphics"; // TRANSLATORS: Photo "print-content-optimize.photo" = "Photo"; // TRANSLATORS: Text "print-content-optimize.text" = "Text"; // TRANSLATORS: Text and Graphics "print-content-optimize.text-and-graphic" = "Text and Graphics"; // TRANSLATORS: Text And Graphics "print-content-optimize.text-and-graphics" = "print-content-optimize.text-and-graphics"; // TRANSLATORS: Print Objects "print-objects" = "Print Objects"; // TRANSLATORS: Print Quality "print-quality" = "Print Quality"; // TRANSLATORS: Draft "print-quality.3" = "Draft"; // TRANSLATORS: Normal "print-quality.4" = "Normal"; // TRANSLATORS: High "print-quality.5" = "High"; // TRANSLATORS: Print Rendering Intent "print-rendering-intent" = "Print Rendering Intent"; // TRANSLATORS: Absolute "print-rendering-intent.absolute" = "Absolute"; // TRANSLATORS: Automatic "print-rendering-intent.auto" = "Automatic"; // TRANSLATORS: Perceptual "print-rendering-intent.perceptual" = "Perceptual"; // TRANSLATORS: Relative "print-rendering-intent.relative" = "Relative"; // TRANSLATORS: Relative w/Black Point Compensation "print-rendering-intent.relative-bpc" = "Relative w/Black Point Compensation"; // TRANSLATORS: Saturation "print-rendering-intent.saturation" = "Saturation"; // TRANSLATORS: Print Scaling "print-scaling" = "Print Scaling"; // TRANSLATORS: Automatic "print-scaling.auto" = "Automatic"; // TRANSLATORS: Auto-fit "print-scaling.auto-fit" = "Auto-fit"; // TRANSLATORS: Fill "print-scaling.fill" = "Fill"; // TRANSLATORS: Fit "print-scaling.fit" = "Fit"; // TRANSLATORS: None "print-scaling.none" = "None"; // TRANSLATORS: Print Supports "print-supports" = "Print Supports"; // TRANSLATORS: Print Supports Actual "print-supports-actual" = "Print Supports Actual"; // TRANSLATORS: With Specified Material "print-supports.material" = "With Specified Material"; // TRANSLATORS: None "print-supports.none" = "None"; // TRANSLATORS: Standard "print-supports.standard" = "Standard"; "printer %s disabled since %s -" = "printer %s disabled since %s -"; "printer %s is holding new jobs. enabled since %s" = "printer %s is holding new jobs. enabled since %s"; "printer %s is idle. enabled since %s" = "printer %s is idle. enabled since %s"; "printer %s now printing %s-%d. enabled since %s" = "printer %s now printing %s-%d. enabled since %s"; "printer %s/%s disabled since %s -" = "printer %s/%s disabled since %s -"; "printer %s/%s is idle. enabled since %s" = "printer %s/%s is idle. enabled since %s"; "printer %s/%s now printing %s-%d. enabled since %s" = "printer %s/%s now printing %s-%d. enabled since %s"; // TRANSLATORS: Printer Kind "printer-kind" = "printer-kind"; // TRANSLATORS: Disc "printer-kind.disc" = "printer-kind.disc"; // TRANSLATORS: Document "printer-kind.document" = "printer-kind.document"; // TRANSLATORS: Envelope "printer-kind.envelope" = "printer-kind.envelope"; // TRANSLATORS: Label "printer-kind.label" = "printer-kind.label"; // TRANSLATORS: Large Format "printer-kind.large-format" = "printer-kind.large-format"; // TRANSLATORS: Photo "printer-kind.photo" = "printer-kind.photo"; // TRANSLATORS: Postcard "printer-kind.postcard" = "printer-kind.postcard"; // TRANSLATORS: Receipt "printer-kind.receipt" = "printer-kind.receipt"; // TRANSLATORS: Roll "printer-kind.roll" = "printer-kind.roll"; // TRANSLATORS: Message From Operator "printer-message-from-operator" = "Message From Operator"; // TRANSLATORS: Print Resolution "printer-resolution" = "Print Resolution"; // TRANSLATORS: Printer State "printer-state" = "Printer State"; // TRANSLATORS: Detailed Printer State "printer-state-reasons" = "Detailed Printer State"; // TRANSLATORS: Old Alerts Have Been Removed "printer-state-reasons.alert-removal-of-binary-change-entry" = "Old Alerts Have Been Removed"; // TRANSLATORS: Bander Added "printer-state-reasons.bander-added" = "Bander Added"; // TRANSLATORS: Bander Almost Empty "printer-state-reasons.bander-almost-empty" = "Bander Almost Empty"; // TRANSLATORS: Bander Almost Full "printer-state-reasons.bander-almost-full" = "Bander Almost Full"; // TRANSLATORS: Bander At Limit "printer-state-reasons.bander-at-limit" = "Bander At Limit"; // TRANSLATORS: Bander Closed "printer-state-reasons.bander-closed" = "Bander Closed"; // TRANSLATORS: Bander Configuration Change "printer-state-reasons.bander-configuration-change" = "Bander Configuration Change"; // TRANSLATORS: Bander Cover Closed "printer-state-reasons.bander-cover-closed" = "Bander Cover Closed"; // TRANSLATORS: Bander Cover Open "printer-state-reasons.bander-cover-open" = "Bander Cover Open"; // TRANSLATORS: Bander Empty "printer-state-reasons.bander-empty" = "Bander Empty"; // TRANSLATORS: Bander Full "printer-state-reasons.bander-full" = "Bander Full"; // TRANSLATORS: Bander Interlock Closed "printer-state-reasons.bander-interlock-closed" = "Bander Interlock Closed"; // TRANSLATORS: Bander Interlock Open "printer-state-reasons.bander-interlock-open" = "Bander Interlock Open"; // TRANSLATORS: Bander Jam "printer-state-reasons.bander-jam" = "Bander Jam"; // TRANSLATORS: Bander Life Almost Over "printer-state-reasons.bander-life-almost-over" = "Bander Life Almost Over"; // TRANSLATORS: Bander Life Over "printer-state-reasons.bander-life-over" = "Bander Life Over"; // TRANSLATORS: Bander Memory Exhausted "printer-state-reasons.bander-memory-exhausted" = "Bander Memory Exhausted"; // TRANSLATORS: Bander Missing "printer-state-reasons.bander-missing" = "Bander Missing"; // TRANSLATORS: Bander Motor Failure "printer-state-reasons.bander-motor-failure" = "Bander Motor Failure"; // TRANSLATORS: Bander Near Limit "printer-state-reasons.bander-near-limit" = "Bander Near Limit"; // TRANSLATORS: Bander Offline "printer-state-reasons.bander-offline" = "Bander Offline"; // TRANSLATORS: Bander Opened "printer-state-reasons.bander-opened" = "Bander Opened"; // TRANSLATORS: Bander Over Temperature "printer-state-reasons.bander-over-temperature" = "Bander Over Temperature"; // TRANSLATORS: Bander Power Saver "printer-state-reasons.bander-power-saver" = "Bander Power Saver"; // TRANSLATORS: Bander Recoverable Failure "printer-state-reasons.bander-recoverable-failure" = "Bander Recoverable Failure"; // TRANSLATORS: Bander Recoverable Storage "printer-state-reasons.bander-recoverable-storage" = "Bander Recoverable Storage"; // TRANSLATORS: Bander Removed "printer-state-reasons.bander-removed" = "Bander Removed"; // TRANSLATORS: Bander Resource Added "printer-state-reasons.bander-resource-added" = "Bander Resource Added"; // TRANSLATORS: Bander Resource Removed "printer-state-reasons.bander-resource-removed" = "Bander Resource Removed"; // TRANSLATORS: Bander Thermistor Failure "printer-state-reasons.bander-thermistor-failure" = "Bander Thermistor Failure"; // TRANSLATORS: Bander Timing Failure "printer-state-reasons.bander-timing-failure" = "Bander Timing Failure"; // TRANSLATORS: Bander Turned Off "printer-state-reasons.bander-turned-off" = "Bander Turned Off"; // TRANSLATORS: Bander Turned On "printer-state-reasons.bander-turned-on" = "Bander Turned On"; // TRANSLATORS: Bander Under Temperature "printer-state-reasons.bander-under-temperature" = "Bander Under Temperature"; // TRANSLATORS: Bander Unrecoverable Failure "printer-state-reasons.bander-unrecoverable-failure" = "Bander Unrecoverable Failure"; // TRANSLATORS: Bander Unrecoverable Storage Error "printer-state-reasons.bander-unrecoverable-storage-error" = "Bander Unrecoverable Storage Error"; // TRANSLATORS: Bander Warming Up "printer-state-reasons.bander-warming-up" = "Bander Warming Up"; // TRANSLATORS: Binder Added "printer-state-reasons.binder-added" = "Binder Added"; // TRANSLATORS: Binder Almost Empty "printer-state-reasons.binder-almost-empty" = "Binder Almost Empty"; // TRANSLATORS: Binder Almost Full "printer-state-reasons.binder-almost-full" = "Binder Almost Full"; // TRANSLATORS: Binder At Limit "printer-state-reasons.binder-at-limit" = "Binder At Limit"; // TRANSLATORS: Binder Closed "printer-state-reasons.binder-closed" = "Binder Closed"; // TRANSLATORS: Binder Configuration Change "printer-state-reasons.binder-configuration-change" = "Binder Configuration Change"; // TRANSLATORS: Binder Cover Closed "printer-state-reasons.binder-cover-closed" = "Binder Cover Closed"; // TRANSLATORS: Binder Cover Open "printer-state-reasons.binder-cover-open" = "Binder Cover Open"; // TRANSLATORS: Binder Empty "printer-state-reasons.binder-empty" = "Binder Empty"; // TRANSLATORS: Binder Full "printer-state-reasons.binder-full" = "Binder Full"; // TRANSLATORS: Binder Interlock Closed "printer-state-reasons.binder-interlock-closed" = "Binder Interlock Closed"; // TRANSLATORS: Binder Interlock Open "printer-state-reasons.binder-interlock-open" = "Binder Interlock Open"; // TRANSLATORS: Binder Jam "printer-state-reasons.binder-jam" = "Binder Jam"; // TRANSLATORS: Binder Life Almost Over "printer-state-reasons.binder-life-almost-over" = "Binder Life Almost Over"; // TRANSLATORS: Binder Life Over "printer-state-reasons.binder-life-over" = "Binder Life Over"; // TRANSLATORS: Binder Memory Exhausted "printer-state-reasons.binder-memory-exhausted" = "Binder Memory Exhausted"; // TRANSLATORS: Binder Missing "printer-state-reasons.binder-missing" = "Binder Missing"; // TRANSLATORS: Binder Motor Failure "printer-state-reasons.binder-motor-failure" = "Binder Motor Failure"; // TRANSLATORS: Binder Near Limit "printer-state-reasons.binder-near-limit" = "Binder Near Limit"; // TRANSLATORS: Binder Offline "printer-state-reasons.binder-offline" = "Binder Offline"; // TRANSLATORS: Binder Opened "printer-state-reasons.binder-opened" = "Binder Opened"; // TRANSLATORS: Binder Over Temperature "printer-state-reasons.binder-over-temperature" = "Binder Over Temperature"; // TRANSLATORS: Binder Power Saver "printer-state-reasons.binder-power-saver" = "Binder Power Saver"; // TRANSLATORS: Binder Recoverable Failure "printer-state-reasons.binder-recoverable-failure" = "Binder Recoverable Failure"; // TRANSLATORS: Binder Recoverable Storage "printer-state-reasons.binder-recoverable-storage" = "Binder Recoverable Storage"; // TRANSLATORS: Binder Removed "printer-state-reasons.binder-removed" = "Binder Removed"; // TRANSLATORS: Binder Resource Added "printer-state-reasons.binder-resource-added" = "Binder Resource Added"; // TRANSLATORS: Binder Resource Removed "printer-state-reasons.binder-resource-removed" = "Binder Resource Removed"; // TRANSLATORS: Binder Thermistor Failure "printer-state-reasons.binder-thermistor-failure" = "Binder Thermistor Failure"; // TRANSLATORS: Binder Timing Failure "printer-state-reasons.binder-timing-failure" = "Binder Timing Failure"; // TRANSLATORS: Binder Turned Off "printer-state-reasons.binder-turned-off" = "Binder Turned Off"; // TRANSLATORS: Binder Turned On "printer-state-reasons.binder-turned-on" = "Binder Turned On"; // TRANSLATORS: Binder Under Temperature "printer-state-reasons.binder-under-temperature" = "Binder Under Temperature"; // TRANSLATORS: Binder Unrecoverable Failure "printer-state-reasons.binder-unrecoverable-failure" = "Binder Unrecoverable Failure"; // TRANSLATORS: Binder Unrecoverable Storage Error "printer-state-reasons.binder-unrecoverable-storage-error" = "Binder Unrecoverable Storage Error"; // TRANSLATORS: Binder Warming Up "printer-state-reasons.binder-warming-up" = "Binder Warming Up"; // TRANSLATORS: Camera Failure "printer-state-reasons.camera-failure" = "Camera Failure"; // TRANSLATORS: Chamber Cooling "printer-state-reasons.chamber-cooling" = "Chamber Cooling"; // TRANSLATORS: Chamber Failure "printer-state-reasons.chamber-failure" = "Chamber Failure"; // TRANSLATORS: Chamber Heating "printer-state-reasons.chamber-heating" = "Chamber Heating"; // TRANSLATORS: Chamber Temperature High "printer-state-reasons.chamber-temperature-high" = "Chamber Temperature High"; // TRANSLATORS: Chamber Temperature Low "printer-state-reasons.chamber-temperature-low" = "Chamber Temperature Low"; // TRANSLATORS: Cleaner Life Almost Over "printer-state-reasons.cleaner-life-almost-over" = "Cleaner Life Almost Over"; // TRANSLATORS: Cleaner Life Over "printer-state-reasons.cleaner-life-over" = "Cleaner Life Over"; // TRANSLATORS: Configuration Change "printer-state-reasons.configuration-change" = "Configuration Change"; // TRANSLATORS: Connecting To Device "printer-state-reasons.connecting-to-device" = "Connecting To Device"; // TRANSLATORS: Cover Open "printer-state-reasons.cover-open" = "Cover Open"; // TRANSLATORS: Deactivated "printer-state-reasons.deactivated" = "Deactivated"; // TRANSLATORS: Developer Empty "printer-state-reasons.developer-empty" = "Developer Empty"; // TRANSLATORS: Developer Low "printer-state-reasons.developer-low" = "Developer Low"; // TRANSLATORS: Die Cutter Added "printer-state-reasons.die-cutter-added" = "Die Cutter Added"; // TRANSLATORS: Die Cutter Almost Empty "printer-state-reasons.die-cutter-almost-empty" = "Die Cutter Almost Empty"; // TRANSLATORS: Die Cutter Almost Full "printer-state-reasons.die-cutter-almost-full" = "Die Cutter Almost Full"; // TRANSLATORS: Die Cutter At Limit "printer-state-reasons.die-cutter-at-limit" = "Die Cutter At Limit"; // TRANSLATORS: Die Cutter Closed "printer-state-reasons.die-cutter-closed" = "Die Cutter Closed"; // TRANSLATORS: Die Cutter Configuration Change "printer-state-reasons.die-cutter-configuration-change" = "Die Cutter Configuration Change"; // TRANSLATORS: Die Cutter Cover Closed "printer-state-reasons.die-cutter-cover-closed" = "Die Cutter Cover Closed"; // TRANSLATORS: Die Cutter Cover Open "printer-state-reasons.die-cutter-cover-open" = "Die Cutter Cover Open"; // TRANSLATORS: Die Cutter Empty "printer-state-reasons.die-cutter-empty" = "Die Cutter Empty"; // TRANSLATORS: Die Cutter Full "printer-state-reasons.die-cutter-full" = "Die Cutter Full"; // TRANSLATORS: Die Cutter Interlock Closed "printer-state-reasons.die-cutter-interlock-closed" = "Die Cutter Interlock Closed"; // TRANSLATORS: Die Cutter Interlock Open "printer-state-reasons.die-cutter-interlock-open" = "Die Cutter Interlock Open"; // TRANSLATORS: Die Cutter Jam "printer-state-reasons.die-cutter-jam" = "Die Cutter Jam"; // TRANSLATORS: Die Cutter Life Almost Over "printer-state-reasons.die-cutter-life-almost-over" = "Die Cutter Life Almost Over"; // TRANSLATORS: Die Cutter Life Over "printer-state-reasons.die-cutter-life-over" = "Die Cutter Life Over"; // TRANSLATORS: Die Cutter Memory Exhausted "printer-state-reasons.die-cutter-memory-exhausted" = "Die Cutter Memory Exhausted"; // TRANSLATORS: Die Cutter Missing "printer-state-reasons.die-cutter-missing" = "Die Cutter Missing"; // TRANSLATORS: Die Cutter Motor Failure "printer-state-reasons.die-cutter-motor-failure" = "Die Cutter Motor Failure"; // TRANSLATORS: Die Cutter Near Limit "printer-state-reasons.die-cutter-near-limit" = "Die Cutter Near Limit"; // TRANSLATORS: Die Cutter Offline "printer-state-reasons.die-cutter-offline" = "Die Cutter Offline"; // TRANSLATORS: Die Cutter Opened "printer-state-reasons.die-cutter-opened" = "Die Cutter Opened"; // TRANSLATORS: Die Cutter Over Temperature "printer-state-reasons.die-cutter-over-temperature" = "Die Cutter Over Temperature"; // TRANSLATORS: Die Cutter Power Saver "printer-state-reasons.die-cutter-power-saver" = "Die Cutter Power Saver"; // TRANSLATORS: Die Cutter Recoverable Failure "printer-state-reasons.die-cutter-recoverable-failure" = "Die Cutter Recoverable Failure"; // TRANSLATORS: Die Cutter Recoverable Storage "printer-state-reasons.die-cutter-recoverable-storage" = "Die Cutter Recoverable Storage"; // TRANSLATORS: Die Cutter Removed "printer-state-reasons.die-cutter-removed" = "Die Cutter Removed"; // TRANSLATORS: Die Cutter Resource Added "printer-state-reasons.die-cutter-resource-added" = "Die Cutter Resource Added"; // TRANSLATORS: Die Cutter Resource Removed "printer-state-reasons.die-cutter-resource-removed" = "Die Cutter Resource Removed"; // TRANSLATORS: Die Cutter Thermistor Failure "printer-state-reasons.die-cutter-thermistor-failure" = "Die Cutter Thermistor Failure"; // TRANSLATORS: Die Cutter Timing Failure "printer-state-reasons.die-cutter-timing-failure" = "Die Cutter Timing Failure"; // TRANSLATORS: Die Cutter Turned Off "printer-state-reasons.die-cutter-turned-off" = "Die Cutter Turned Off"; // TRANSLATORS: Die Cutter Turned On "printer-state-reasons.die-cutter-turned-on" = "Die Cutter Turned On"; // TRANSLATORS: Die Cutter Under Temperature "printer-state-reasons.die-cutter-under-temperature" = "Die Cutter Under Temperature"; // TRANSLATORS: Die Cutter Unrecoverable Failure "printer-state-reasons.die-cutter-unrecoverable-failure" = "Die Cutter Unrecoverable Failure"; // TRANSLATORS: Die Cutter Unrecoverable Storage Error "printer-state-reasons.die-cutter-unrecoverable-storage-error" = "Die Cutter Unrecoverable Storage Error"; // TRANSLATORS: Die Cutter Warming Up "printer-state-reasons.die-cutter-warming-up" = "Die Cutter Warming Up"; // TRANSLATORS: Door Open "printer-state-reasons.door-open" = "Door Open"; // TRANSLATORS: Extruder Cooling "printer-state-reasons.extruder-cooling" = "Extruder Cooling"; // TRANSLATORS: Extruder Failure "printer-state-reasons.extruder-failure" = "Extruder Failure"; // TRANSLATORS: Extruder Heating "printer-state-reasons.extruder-heating" = "Extruder Heating"; // TRANSLATORS: Extruder Jam "printer-state-reasons.extruder-jam" = "Extruder Jam"; // TRANSLATORS: Extruder Temperature High "printer-state-reasons.extruder-temperature-high" = "Extruder Temperature High"; // TRANSLATORS: Extruder Temperature Low "printer-state-reasons.extruder-temperature-low" = "Extruder Temperature Low"; // TRANSLATORS: Fan Failure "printer-state-reasons.fan-failure" = "Fan Failure"; // TRANSLATORS: Fax Modem Life Almost Over "printer-state-reasons.fax-modem-life-almost-over" = "printer-state-reasons.fax-modem-life-almost-over"; // TRANSLATORS: Fax Modem Life Over "printer-state-reasons.fax-modem-life-over" = "printer-state-reasons.fax-modem-life-over"; // TRANSLATORS: Fax Modem Missing "printer-state-reasons.fax-modem-missing" = "printer-state-reasons.fax-modem-missing"; // TRANSLATORS: Fax Modem Turned Off "printer-state-reasons.fax-modem-turned-off" = "printer-state-reasons.fax-modem-turned-off"; // TRANSLATORS: Fax Modem Turned On "printer-state-reasons.fax-modem-turned-on" = "printer-state-reasons.fax-modem-turned-on"; // TRANSLATORS: Folder Added "printer-state-reasons.folder-added" = "Folder Added"; // TRANSLATORS: Folder Almost Empty "printer-state-reasons.folder-almost-empty" = "Folder Almost Empty"; // TRANSLATORS: Folder Almost Full "printer-state-reasons.folder-almost-full" = "Folder Almost Full"; // TRANSLATORS: Folder At Limit "printer-state-reasons.folder-at-limit" = "Folder At Limit"; // TRANSLATORS: Folder Closed "printer-state-reasons.folder-closed" = "Folder Closed"; // TRANSLATORS: Folder Configuration Change "printer-state-reasons.folder-configuration-change" = "Folder Configuration Change"; // TRANSLATORS: Folder Cover Closed "printer-state-reasons.folder-cover-closed" = "Folder Cover Closed"; // TRANSLATORS: Folder Cover Open "printer-state-reasons.folder-cover-open" = "Folder Cover Open"; // TRANSLATORS: Folder Empty "printer-state-reasons.folder-empty" = "Folder Empty"; // TRANSLATORS: Folder Full "printer-state-reasons.folder-full" = "Folder Full"; // TRANSLATORS: Folder Interlock Closed "printer-state-reasons.folder-interlock-closed" = "Folder Interlock Closed"; // TRANSLATORS: Folder Interlock Open "printer-state-reasons.folder-interlock-open" = "Folder Interlock Open"; // TRANSLATORS: Folder Jam "printer-state-reasons.folder-jam" = "Folder Jam"; // TRANSLATORS: Folder Life Almost Over "printer-state-reasons.folder-life-almost-over" = "Folder Life Almost Over"; // TRANSLATORS: Folder Life Over "printer-state-reasons.folder-life-over" = "Folder Life Over"; // TRANSLATORS: Folder Memory Exhausted "printer-state-reasons.folder-memory-exhausted" = "Folder Memory Exhausted"; // TRANSLATORS: Folder Missing "printer-state-reasons.folder-missing" = "Folder Missing"; // TRANSLATORS: Folder Motor Failure "printer-state-reasons.folder-motor-failure" = "Folder Motor Failure"; // TRANSLATORS: Folder Near Limit "printer-state-reasons.folder-near-limit" = "Folder Near Limit"; // TRANSLATORS: Folder Offline "printer-state-reasons.folder-offline" = "Folder Offline"; // TRANSLATORS: Folder Opened "printer-state-reasons.folder-opened" = "Folder Opened"; // TRANSLATORS: Folder Over Temperature "printer-state-reasons.folder-over-temperature" = "Folder Over Temperature"; // TRANSLATORS: Folder Power Saver "printer-state-reasons.folder-power-saver" = "Folder Power Saver"; // TRANSLATORS: Folder Recoverable Failure "printer-state-reasons.folder-recoverable-failure" = "Folder Recoverable Failure"; // TRANSLATORS: Folder Recoverable Storage "printer-state-reasons.folder-recoverable-storage" = "Folder Recoverable Storage"; // TRANSLATORS: Folder Removed "printer-state-reasons.folder-removed" = "Folder Removed"; // TRANSLATORS: Folder Resource Added "printer-state-reasons.folder-resource-added" = "Folder Resource Added"; // TRANSLATORS: Folder Resource Removed "printer-state-reasons.folder-resource-removed" = "Folder Resource Removed"; // TRANSLATORS: Folder Thermistor Failure "printer-state-reasons.folder-thermistor-failure" = "Folder Thermistor Failure"; // TRANSLATORS: Folder Timing Failure "printer-state-reasons.folder-timing-failure" = "Folder Timing Failure"; // TRANSLATORS: Folder Turned Off "printer-state-reasons.folder-turned-off" = "Folder Turned Off"; // TRANSLATORS: Folder Turned On "printer-state-reasons.folder-turned-on" = "Folder Turned On"; // TRANSLATORS: Folder Under Temperature "printer-state-reasons.folder-under-temperature" = "Folder Under Temperature"; // TRANSLATORS: Folder Unrecoverable Failure "printer-state-reasons.folder-unrecoverable-failure" = "Folder Unrecoverable Failure"; // TRANSLATORS: Folder Unrecoverable Storage Error "printer-state-reasons.folder-unrecoverable-storage-error" = "Folder Unrecoverable Storage Error"; // TRANSLATORS: Folder Warming Up "printer-state-reasons.folder-warming-up" = "Folder Warming Up"; // TRANSLATORS: Fuser temperature high "printer-state-reasons.fuser-over-temp" = "Fuser Over Temp"; // TRANSLATORS: Fuser temperature low "printer-state-reasons.fuser-under-temp" = "Fuser Under Temp"; // TRANSLATORS: Hold New Jobs "printer-state-reasons.hold-new-jobs" = "Hold New Jobs"; // TRANSLATORS: Identify Printer "printer-state-reasons.identify-printer-requested" = "Identify Printer"; // TRANSLATORS: Imprinter Added "printer-state-reasons.imprinter-added" = "Imprinter Added"; // TRANSLATORS: Imprinter Almost Empty "printer-state-reasons.imprinter-almost-empty" = "Imprinter Almost Empty"; // TRANSLATORS: Imprinter Almost Full "printer-state-reasons.imprinter-almost-full" = "Imprinter Almost Full"; // TRANSLATORS: Imprinter At Limit "printer-state-reasons.imprinter-at-limit" = "Imprinter At Limit"; // TRANSLATORS: Imprinter Closed "printer-state-reasons.imprinter-closed" = "Imprinter Closed"; // TRANSLATORS: Imprinter Configuration Change "printer-state-reasons.imprinter-configuration-change" = "Imprinter Configuration Change"; // TRANSLATORS: Imprinter Cover Closed "printer-state-reasons.imprinter-cover-closed" = "Imprinter Cover Closed"; // TRANSLATORS: Imprinter Cover Open "printer-state-reasons.imprinter-cover-open" = "Imprinter Cover Open"; // TRANSLATORS: Imprinter Empty "printer-state-reasons.imprinter-empty" = "Imprinter Empty"; // TRANSLATORS: Imprinter Full "printer-state-reasons.imprinter-full" = "Imprinter Full"; // TRANSLATORS: Imprinter Interlock Closed "printer-state-reasons.imprinter-interlock-closed" = "Imprinter Interlock Closed"; // TRANSLATORS: Imprinter Interlock Open "printer-state-reasons.imprinter-interlock-open" = "Imprinter Interlock Open"; // TRANSLATORS: Imprinter Jam "printer-state-reasons.imprinter-jam" = "Imprinter Jam"; // TRANSLATORS: Imprinter Life Almost Over "printer-state-reasons.imprinter-life-almost-over" = "Imprinter Life Almost Over"; // TRANSLATORS: Imprinter Life Over "printer-state-reasons.imprinter-life-over" = "Imprinter Life Over"; // TRANSLATORS: Imprinter Memory Exhausted "printer-state-reasons.imprinter-memory-exhausted" = "Imprinter Memory Exhausted"; // TRANSLATORS: Imprinter Missing "printer-state-reasons.imprinter-missing" = "Imprinter Missing"; // TRANSLATORS: Imprinter Motor Failure "printer-state-reasons.imprinter-motor-failure" = "Imprinter Motor Failure"; // TRANSLATORS: Imprinter Near Limit "printer-state-reasons.imprinter-near-limit" = "Imprinter Near Limit"; // TRANSLATORS: Imprinter Offline "printer-state-reasons.imprinter-offline" = "Imprinter Offline"; // TRANSLATORS: Imprinter Opened "printer-state-reasons.imprinter-opened" = "Imprinter Opened"; // TRANSLATORS: Imprinter Over Temperature "printer-state-reasons.imprinter-over-temperature" = "Imprinter Over Temperature"; // TRANSLATORS: Imprinter Power Saver "printer-state-reasons.imprinter-power-saver" = "Imprinter Power Saver"; // TRANSLATORS: Imprinter Recoverable Failure "printer-state-reasons.imprinter-recoverable-failure" = "Imprinter Recoverable Failure"; // TRANSLATORS: Imprinter Recoverable Storage "printer-state-reasons.imprinter-recoverable-storage" = "Imprinter Recoverable Storage"; // TRANSLATORS: Imprinter Removed "printer-state-reasons.imprinter-removed" = "Imprinter Removed"; // TRANSLATORS: Imprinter Resource Added "printer-state-reasons.imprinter-resource-added" = "Imprinter Resource Added"; // TRANSLATORS: Imprinter Resource Removed "printer-state-reasons.imprinter-resource-removed" = "Imprinter Resource Removed"; // TRANSLATORS: Imprinter Thermistor Failure "printer-state-reasons.imprinter-thermistor-failure" = "Imprinter Thermistor Failure"; // TRANSLATORS: Imprinter Timing Failure "printer-state-reasons.imprinter-timing-failure" = "Imprinter Timing Failure"; // TRANSLATORS: Imprinter Turned Off "printer-state-reasons.imprinter-turned-off" = "Imprinter Turned Off"; // TRANSLATORS: Imprinter Turned On "printer-state-reasons.imprinter-turned-on" = "Imprinter Turned On"; // TRANSLATORS: Imprinter Under Temperature "printer-state-reasons.imprinter-under-temperature" = "Imprinter Under Temperature"; // TRANSLATORS: Imprinter Unrecoverable Failure "printer-state-reasons.imprinter-unrecoverable-failure" = "Imprinter Unrecoverable Failure"; // TRANSLATORS: Imprinter Unrecoverable Storage Error "printer-state-reasons.imprinter-unrecoverable-storage-error" = "Imprinter Unrecoverable Storage Error"; // TRANSLATORS: Imprinter Warming Up "printer-state-reasons.imprinter-warming-up" = "Imprinter Warming Up"; // TRANSLATORS: Input Cannot Feed Size Selected "printer-state-reasons.input-cannot-feed-size-selected" = "Input Cannot Feed Size Selected"; // TRANSLATORS: Input Manual Input Request "printer-state-reasons.input-manual-input-request" = "Input Manual Input Request"; // TRANSLATORS: Input Media Color Change "printer-state-reasons.input-media-color-change" = "Input Media Color Change"; // TRANSLATORS: Input Media Form Parts Change "printer-state-reasons.input-media-form-parts-change" = "Input Media Form Parts Change"; // TRANSLATORS: Input Media Size Change "printer-state-reasons.input-media-size-change" = "Input Media Size Change"; // TRANSLATORS: Input Media Tray Failure "printer-state-reasons.input-media-tray-failure" = "printer-state-reasons.input-media-tray-failure"; // TRANSLATORS: Input Media Tray Feed Error "printer-state-reasons.input-media-tray-feed-error" = "printer-state-reasons.input-media-tray-feed-error"; // TRANSLATORS: Input Media Tray Jam "printer-state-reasons.input-media-tray-jam" = "printer-state-reasons.input-media-tray-jam"; // TRANSLATORS: Input Media Type Change "printer-state-reasons.input-media-type-change" = "Input Media Type Change"; // TRANSLATORS: Input Media Weight Change "printer-state-reasons.input-media-weight-change" = "Input Media Weight Change"; // TRANSLATORS: Input Pick Roller Failure "printer-state-reasons.input-pick-roller-failure" = "printer-state-reasons.input-pick-roller-failure"; // TRANSLATORS: Input Pick Roller Life Over "printer-state-reasons.input-pick-roller-life-over" = "printer-state-reasons.input-pick-roller-life-over"; // TRANSLATORS: Input Pick Roller Life Warn "printer-state-reasons.input-pick-roller-life-warn" = "printer-state-reasons.input-pick-roller-life-warn"; // TRANSLATORS: Input Pick Roller Missing "printer-state-reasons.input-pick-roller-missing" = "printer-state-reasons.input-pick-roller-missing"; // TRANSLATORS: Input Tray Elevation Failure "printer-state-reasons.input-tray-elevation-failure" = "Input Tray Elevation Failure"; // TRANSLATORS: Paper tray is missing "printer-state-reasons.input-tray-missing" = "Input Tray Missing"; // TRANSLATORS: Input Tray Position Failure "printer-state-reasons.input-tray-position-failure" = "Input Tray Position Failure"; // TRANSLATORS: Inserter Added "printer-state-reasons.inserter-added" = "Inserter Added"; // TRANSLATORS: Inserter Almost Empty "printer-state-reasons.inserter-almost-empty" = "Inserter Almost Empty"; // TRANSLATORS: Inserter Almost Full "printer-state-reasons.inserter-almost-full" = "Inserter Almost Full"; // TRANSLATORS: Inserter At Limit "printer-state-reasons.inserter-at-limit" = "Inserter At Limit"; // TRANSLATORS: Inserter Closed "printer-state-reasons.inserter-closed" = "Inserter Closed"; // TRANSLATORS: Inserter Configuration Change "printer-state-reasons.inserter-configuration-change" = "Inserter Configuration Change"; // TRANSLATORS: Inserter Cover Closed "printer-state-reasons.inserter-cover-closed" = "Inserter Cover Closed"; // TRANSLATORS: Inserter Cover Open "printer-state-reasons.inserter-cover-open" = "Inserter Cover Open"; // TRANSLATORS: Inserter Empty "printer-state-reasons.inserter-empty" = "Inserter Empty"; // TRANSLATORS: Inserter Full "printer-state-reasons.inserter-full" = "Inserter Full"; // TRANSLATORS: Inserter Interlock Closed "printer-state-reasons.inserter-interlock-closed" = "Inserter Interlock Closed"; // TRANSLATORS: Inserter Interlock Open "printer-state-reasons.inserter-interlock-open" = "Inserter Interlock Open"; // TRANSLATORS: Inserter Jam "printer-state-reasons.inserter-jam" = "Inserter Jam"; // TRANSLATORS: Inserter Life Almost Over "printer-state-reasons.inserter-life-almost-over" = "Inserter Life Almost Over"; // TRANSLATORS: Inserter Life Over "printer-state-reasons.inserter-life-over" = "Inserter Life Over"; // TRANSLATORS: Inserter Memory Exhausted "printer-state-reasons.inserter-memory-exhausted" = "Inserter Memory Exhausted"; // TRANSLATORS: Inserter Missing "printer-state-reasons.inserter-missing" = "Inserter Missing"; // TRANSLATORS: Inserter Motor Failure "printer-state-reasons.inserter-motor-failure" = "Inserter Motor Failure"; // TRANSLATORS: Inserter Near Limit "printer-state-reasons.inserter-near-limit" = "Inserter Near Limit"; // TRANSLATORS: Inserter Offline "printer-state-reasons.inserter-offline" = "Inserter Offline"; // TRANSLATORS: Inserter Opened "printer-state-reasons.inserter-opened" = "Inserter Opened"; // TRANSLATORS: Inserter Over Temperature "printer-state-reasons.inserter-over-temperature" = "Inserter Over Temperature"; // TRANSLATORS: Inserter Power Saver "printer-state-reasons.inserter-power-saver" = "Inserter Power Saver"; // TRANSLATORS: Inserter Recoverable Failure "printer-state-reasons.inserter-recoverable-failure" = "Inserter Recoverable Failure"; // TRANSLATORS: Inserter Recoverable Storage "printer-state-reasons.inserter-recoverable-storage" = "Inserter Recoverable Storage"; // TRANSLATORS: Inserter Removed "printer-state-reasons.inserter-removed" = "Inserter Removed"; // TRANSLATORS: Inserter Resource Added "printer-state-reasons.inserter-resource-added" = "Inserter Resource Added"; // TRANSLATORS: Inserter Resource Removed "printer-state-reasons.inserter-resource-removed" = "Inserter Resource Removed"; // TRANSLATORS: Inserter Thermistor Failure "printer-state-reasons.inserter-thermistor-failure" = "Inserter Thermistor Failure"; // TRANSLATORS: Inserter Timing Failure "printer-state-reasons.inserter-timing-failure" = "Inserter Timing Failure"; // TRANSLATORS: Inserter Turned Off "printer-state-reasons.inserter-turned-off" = "Inserter Turned Off"; // TRANSLATORS: Inserter Turned On "printer-state-reasons.inserter-turned-on" = "Inserter Turned On"; // TRANSLATORS: Inserter Under Temperature "printer-state-reasons.inserter-under-temperature" = "Inserter Under Temperature"; // TRANSLATORS: Inserter Unrecoverable Failure "printer-state-reasons.inserter-unrecoverable-failure" = "Inserter Unrecoverable Failure"; // TRANSLATORS: Inserter Unrecoverable Storage Error "printer-state-reasons.inserter-unrecoverable-storage-error" = "Inserter Unrecoverable Storage Error"; // TRANSLATORS: Inserter Warming Up "printer-state-reasons.inserter-warming-up" = "Inserter Warming Up"; // TRANSLATORS: Interlock Closed "printer-state-reasons.interlock-closed" = "Interlock Closed"; // TRANSLATORS: Interlock Open "printer-state-reasons.interlock-open" = "Interlock Open"; // TRANSLATORS: Interpreter Cartridge Added "printer-state-reasons.interpreter-cartridge-added" = "Interpreter Cartridge Added"; // TRANSLATORS: Interpreter Cartridge Removed "printer-state-reasons.interpreter-cartridge-deleted" = "Interpreter Cartridge Removed"; // TRANSLATORS: Interpreter Complex Page Encountered "printer-state-reasons.interpreter-complex-page-encountered" = "Interpreter Complex Page Encountered"; // TRANSLATORS: Interpreter Memory Decrease "printer-state-reasons.interpreter-memory-decrease" = "Interpreter Memory Decrease"; // TRANSLATORS: Interpreter Memory Increase "printer-state-reasons.interpreter-memory-increase" = "Interpreter Memory Increase"; // TRANSLATORS: Interpreter Resource Added "printer-state-reasons.interpreter-resource-added" = "Interpreter Resource Added"; // TRANSLATORS: Interpreter Resource Deleted "printer-state-reasons.interpreter-resource-deleted" = "Interpreter Resource Deleted"; // TRANSLATORS: Printer resource unavailable "printer-state-reasons.interpreter-resource-unavailable" = "Interpreter Resource Unavailable"; // TRANSLATORS: Lamp At End of Life "printer-state-reasons.lamp-at-eol" = "Lamp At End of Life"; // TRANSLATORS: Lamp Failure "printer-state-reasons.lamp-failure" = "Lamp Failure"; // TRANSLATORS: Lamp Near End of Life "printer-state-reasons.lamp-near-eol" = "Lamp Near End of Life"; // TRANSLATORS: Laser At End of Life "printer-state-reasons.laser-at-eol" = "Laser At End of Life"; // TRANSLATORS: Laser Failure "printer-state-reasons.laser-failure" = "Laser Failure"; // TRANSLATORS: Laser Near End of Life "printer-state-reasons.laser-near-eol" = "Laser Near End of Life"; // TRANSLATORS: Envelope Maker Added "printer-state-reasons.make-envelope-added" = "Envelope Maker Added"; // TRANSLATORS: Envelope Maker Almost Empty "printer-state-reasons.make-envelope-almost-empty" = "Envelope Maker Almost Empty"; // TRANSLATORS: Envelope Maker Almost Full "printer-state-reasons.make-envelope-almost-full" = "Envelope Maker Almost Full"; // TRANSLATORS: Envelope Maker At Limit "printer-state-reasons.make-envelope-at-limit" = "Envelope Maker At Limit"; // TRANSLATORS: Envelope Maker Closed "printer-state-reasons.make-envelope-closed" = "Envelope Maker Closed"; // TRANSLATORS: Envelope Maker Configuration Change "printer-state-reasons.make-envelope-configuration-change" = "Envelope Maker Configuration Change"; // TRANSLATORS: Envelope Maker Cover Closed "printer-state-reasons.make-envelope-cover-closed" = "Envelope Maker Cover Closed"; // TRANSLATORS: Envelope Maker Cover Open "printer-state-reasons.make-envelope-cover-open" = "Envelope Maker Cover Open"; // TRANSLATORS: Envelope Maker Empty "printer-state-reasons.make-envelope-empty" = "Envelope Maker Empty"; // TRANSLATORS: Envelope Maker Full "printer-state-reasons.make-envelope-full" = "Envelope Maker Full"; // TRANSLATORS: Envelope Maker Interlock Closed "printer-state-reasons.make-envelope-interlock-closed" = "Envelope Maker Interlock Closed"; // TRANSLATORS: Envelope Maker Interlock Open "printer-state-reasons.make-envelope-interlock-open" = "Envelope Maker Interlock Open"; // TRANSLATORS: Envelope Maker Jam "printer-state-reasons.make-envelope-jam" = "Envelope Maker Jam"; // TRANSLATORS: Envelope Maker Life Almost Over "printer-state-reasons.make-envelope-life-almost-over" = "Envelope Maker Life Almost Over"; // TRANSLATORS: Envelope Maker Life Over "printer-state-reasons.make-envelope-life-over" = "Envelope Maker Life Over"; // TRANSLATORS: Envelope Maker Memory Exhausted "printer-state-reasons.make-envelope-memory-exhausted" = "Envelope Maker Memory Exhausted"; // TRANSLATORS: Envelope Maker Missing "printer-state-reasons.make-envelope-missing" = "Envelope Maker Missing"; // TRANSLATORS: Envelope Maker Motor Failure "printer-state-reasons.make-envelope-motor-failure" = "Envelope Maker Motor Failure"; // TRANSLATORS: Envelope Maker Near Limit "printer-state-reasons.make-envelope-near-limit" = "Envelope Maker Near Limit"; // TRANSLATORS: Envelope Maker Offline "printer-state-reasons.make-envelope-offline" = "Envelope Maker Offline"; // TRANSLATORS: Envelope Maker Opened "printer-state-reasons.make-envelope-opened" = "Envelope Maker Opened"; // TRANSLATORS: Envelope Maker Over Temperature "printer-state-reasons.make-envelope-over-temperature" = "Envelope Maker Over Temperature"; // TRANSLATORS: Envelope Maker Power Saver "printer-state-reasons.make-envelope-power-saver" = "Envelope Maker Power Saver"; // TRANSLATORS: Envelope Maker Recoverable Failure "printer-state-reasons.make-envelope-recoverable-failure" = "Envelope Maker Recoverable Failure"; // TRANSLATORS: Envelope Maker Recoverable Storage "printer-state-reasons.make-envelope-recoverable-storage" = "Envelope Maker Recoverable Storage"; // TRANSLATORS: Envelope Maker Removed "printer-state-reasons.make-envelope-removed" = "Envelope Maker Removed"; // TRANSLATORS: Envelope Maker Resource Added "printer-state-reasons.make-envelope-resource-added" = "Envelope Maker Resource Added"; // TRANSLATORS: Envelope Maker Resource Removed "printer-state-reasons.make-envelope-resource-removed" = "Envelope Maker Resource Removed"; // TRANSLATORS: Envelope Maker Thermistor Failure "printer-state-reasons.make-envelope-thermistor-failure" = "Envelope Maker Thermistor Failure"; // TRANSLATORS: Envelope Maker Timing Failure "printer-state-reasons.make-envelope-timing-failure" = "Envelope Maker Timing Failure"; // TRANSLATORS: Envelope Maker Turned Off "printer-state-reasons.make-envelope-turned-off" = "Envelope Maker Turned Off"; // TRANSLATORS: Envelope Maker Turned On "printer-state-reasons.make-envelope-turned-on" = "Envelope Maker Turned On"; // TRANSLATORS: Envelope Maker Under Temperature "printer-state-reasons.make-envelope-under-temperature" = "Envelope Maker Under Temperature"; // TRANSLATORS: Envelope Maker Unrecoverable Failure "printer-state-reasons.make-envelope-unrecoverable-failure" = "Envelope Maker Unrecoverable Failure"; // TRANSLATORS: Envelope Maker Unrecoverable Storage Error "printer-state-reasons.make-envelope-unrecoverable-storage-error" = "Envelope Maker Unrecoverable Storage Error"; // TRANSLATORS: Envelope Maker Warming Up "printer-state-reasons.make-envelope-warming-up" = "Envelope Maker Warming Up"; // TRANSLATORS: Marker Adjusting Print Quality "printer-state-reasons.marker-adjusting-print-quality" = "Marker Adjusting Print Quality"; // TRANSLATORS: Marker Cleaner Missing "printer-state-reasons.marker-cleaner-missing" = "printer-state-reasons.marker-cleaner-missing"; // TRANSLATORS: Marker Developer Almost Empty "printer-state-reasons.marker-developer-almost-empty" = "Marker Developer Almost Empty"; // TRANSLATORS: Marker Developer Empty "printer-state-reasons.marker-developer-empty" = "Marker Developer Empty"; // TRANSLATORS: Marker Developer Missing "printer-state-reasons.marker-developer-missing" = "printer-state-reasons.marker-developer-missing"; // TRANSLATORS: Marker Fuser Missing "printer-state-reasons.marker-fuser-missing" = "printer-state-reasons.marker-fuser-missing"; // TRANSLATORS: Marker Fuser Thermistor Failure "printer-state-reasons.marker-fuser-thermistor-failure" = "Marker Fuser Thermistor Failure"; // TRANSLATORS: Marker Fuser Timing Failure "printer-state-reasons.marker-fuser-timing-failure" = "Marker Fuser Timing Failure"; // TRANSLATORS: Marker Ink Almost Empty "printer-state-reasons.marker-ink-almost-empty" = "Marker Ink Almost Empty"; // TRANSLATORS: Marker Ink Empty "printer-state-reasons.marker-ink-empty" = "Marker Ink Empty"; // TRANSLATORS: Marker Ink Missing "printer-state-reasons.marker-ink-missing" = "printer-state-reasons.marker-ink-missing"; // TRANSLATORS: Marker Opc Missing "printer-state-reasons.marker-opc-missing" = "printer-state-reasons.marker-opc-missing"; // TRANSLATORS: Marker Print Ribbon Almost Empty "printer-state-reasons.marker-print-ribbon-almost-empty" = "Marker Print Ribbon Almost Empty"; // TRANSLATORS: Marker Print Ribbon Empty "printer-state-reasons.marker-print-ribbon-empty" = "Marker Print Ribbon Empty"; // TRANSLATORS: Marker Print Ribbon Missing "printer-state-reasons.marker-print-ribbon-missing" = "printer-state-reasons.marker-print-ribbon-missing"; // TRANSLATORS: Marker Supply Almost Empty "printer-state-reasons.marker-supply-almost-empty" = "printer-state-reasons.marker-supply-almost-empty"; // TRANSLATORS: Ink/toner empty "printer-state-reasons.marker-supply-empty" = "Marker Supply Empty"; // TRANSLATORS: Ink/toner low "printer-state-reasons.marker-supply-low" = "Marker Supply Low"; // TRANSLATORS: Marker Supply Missing "printer-state-reasons.marker-supply-missing" = "printer-state-reasons.marker-supply-missing"; // TRANSLATORS: Marker Toner Cartridge Missing "printer-state-reasons.marker-toner-cartridge-missing" = "Marker Toner Cartridge Missing"; // TRANSLATORS: Marker Toner Missing "printer-state-reasons.marker-toner-missing" = "printer-state-reasons.marker-toner-missing"; // TRANSLATORS: Ink/toner waste bin almost full "printer-state-reasons.marker-waste-almost-full" = "Marker Waste Almost Full"; // TRANSLATORS: Ink/toner waste bin full "printer-state-reasons.marker-waste-full" = "Marker Waste Full"; // TRANSLATORS: Marker Waste Ink Receptacle Almost Full "printer-state-reasons.marker-waste-ink-receptacle-almost-full" = "Marker Waste Ink Receptacle Almost Full"; // TRANSLATORS: Marker Waste Ink Receptacle Full "printer-state-reasons.marker-waste-ink-receptacle-full" = "Marker Waste Ink Receptacle Full"; // TRANSLATORS: Marker Waste Ink Receptacle Missing "printer-state-reasons.marker-waste-ink-receptacle-missing" = "printer-state-reasons.marker-waste-ink-receptacle-missing"; // TRANSLATORS: Marker Waste Missing "printer-state-reasons.marker-waste-missing" = "printer-state-reasons.marker-waste-missing"; // TRANSLATORS: Marker Waste Toner Receptacle Almost Full "printer-state-reasons.marker-waste-toner-receptacle-almost-full" = "Marker Waste Toner Receptacle Almost Full"; // TRANSLATORS: Marker Waste Toner Receptacle Full "printer-state-reasons.marker-waste-toner-receptacle-full" = "Marker Waste Toner Receptacle Full"; // TRANSLATORS: Marker Waste Toner Receptacle Missing "printer-state-reasons.marker-waste-toner-receptacle-missing" = "printer-state-reasons.marker-waste-toner-receptacle-missing"; // TRANSLATORS: Material Empty "printer-state-reasons.material-empty" = "Material Empty"; // TRANSLATORS: Material Low "printer-state-reasons.material-low" = "Material Low"; // TRANSLATORS: Material Needed "printer-state-reasons.material-needed" = "Material Needed"; // TRANSLATORS: Media Drying "printer-state-reasons.media-drying" = "Media Drying"; // TRANSLATORS: Paper tray is empty "printer-state-reasons.media-empty" = "Media Empty"; // TRANSLATORS: Paper jam "printer-state-reasons.media-jam" = "Media Jam"; // TRANSLATORS: Paper tray is almost empty "printer-state-reasons.media-low" = "Paper tray is almost empty"; // TRANSLATORS: Load paper "printer-state-reasons.media-needed" = "Load paper"; // TRANSLATORS: Media Path Cannot Do 2-Sided Printing "printer-state-reasons.media-path-cannot-duplex-media-selected" = "Media Path Cannot Do 2-Sided Printing"; // TRANSLATORS: Media Path Failure "printer-state-reasons.media-path-failure" = "Media Path Failure"; // TRANSLATORS: Media Path Input Empty "printer-state-reasons.media-path-input-empty" = "Media Path Input Empty"; // TRANSLATORS: Media Path Input Feed Error "printer-state-reasons.media-path-input-feed-error" = "Media Path Input Feed Error"; // TRANSLATORS: Media Path Input Jam "printer-state-reasons.media-path-input-jam" = "Media Path Input Jam"; // TRANSLATORS: Media Path Input Request "printer-state-reasons.media-path-input-request" = "Media Path Input Request"; // TRANSLATORS: Media Path Jam "printer-state-reasons.media-path-jam" = "Media Path Jam"; // TRANSLATORS: Media Path Media Tray Almost Full "printer-state-reasons.media-path-media-tray-almost-full" = "Media Path Media Tray Almost Full"; // TRANSLATORS: Media Path Media Tray Full "printer-state-reasons.media-path-media-tray-full" = "Media Path Media Tray Full"; // TRANSLATORS: Media Path Media Tray Missing "printer-state-reasons.media-path-media-tray-missing" = "Media Path Media Tray Missing"; // TRANSLATORS: Media Path Output Feed Error "printer-state-reasons.media-path-output-feed-error" = "Media Path Output Feed Error"; // TRANSLATORS: Media Path Output Full "printer-state-reasons.media-path-output-full" = "Media Path Output Full"; // TRANSLATORS: Media Path Output Jam "printer-state-reasons.media-path-output-jam" = "Media Path Output Jam"; // TRANSLATORS: Media Path Pick Roller Failure "printer-state-reasons.media-path-pick-roller-failure" = "Media Path Pick Roller Failure"; // TRANSLATORS: Media Path Pick Roller Life Over "printer-state-reasons.media-path-pick-roller-life-over" = "Media Path Pick Roller Life Over"; // TRANSLATORS: Media Path Pick Roller Life Warn "printer-state-reasons.media-path-pick-roller-life-warn" = "Media Path Pick Roller Life Warn"; // TRANSLATORS: Media Path Pick Roller Missing "printer-state-reasons.media-path-pick-roller-missing" = "Media Path Pick Roller Missing"; // TRANSLATORS: Motor Failure "printer-state-reasons.motor-failure" = "Motor Failure"; // TRANSLATORS: Printer going offline "printer-state-reasons.moving-to-paused" = "Moving To Paused"; // TRANSLATORS: None "printer-state-reasons.none" = "None"; // TRANSLATORS: Optical Photoconductor Life Over "printer-state-reasons.opc-life-over" = "Optical Photoconductor Life Over"; // TRANSLATORS: OPC almost at end-of-life "printer-state-reasons.opc-near-eol" = "Optical Photoconductor Near End-of-life"; // TRANSLATORS: Check the printer for errors "printer-state-reasons.other" = "Other"; // TRANSLATORS: Output bin is almost full "printer-state-reasons.output-area-almost-full" = "Output Area Almost Full"; // TRANSLATORS: Output bin is full "printer-state-reasons.output-area-full" = "Output Area Full"; // TRANSLATORS: Output Mailbox Select Failure "printer-state-reasons.output-mailbox-select-failure" = "Output Mailbox Select Failure"; // TRANSLATORS: Output Media Tray Failure "printer-state-reasons.output-media-tray-failure" = "Output Media Tray Failure"; // TRANSLATORS: Output Media Tray Feed Error "printer-state-reasons.output-media-tray-feed-error" = "Output Media Tray Feed Error"; // TRANSLATORS: Output Media Tray Jam "printer-state-reasons.output-media-tray-jam" = "Output Media Tray Jam"; // TRANSLATORS: Output tray is missing "printer-state-reasons.output-tray-missing" = "Output Tray Missing"; // TRANSLATORS: Paused "printer-state-reasons.paused" = "Paused"; // TRANSLATORS: Perforater Added "printer-state-reasons.perforater-added" = "Perforater Added"; // TRANSLATORS: Perforater Almost Empty "printer-state-reasons.perforater-almost-empty" = "Perforater Almost Empty"; // TRANSLATORS: Perforater Almost Full "printer-state-reasons.perforater-almost-full" = "Perforater Almost Full"; // TRANSLATORS: Perforater At Limit "printer-state-reasons.perforater-at-limit" = "Perforater At Limit"; // TRANSLATORS: Perforater Closed "printer-state-reasons.perforater-closed" = "Perforater Closed"; // TRANSLATORS: Perforater Configuration Change "printer-state-reasons.perforater-configuration-change" = "Perforater Configuration Change"; // TRANSLATORS: Perforater Cover Closed "printer-state-reasons.perforater-cover-closed" = "Perforater Cover Closed"; // TRANSLATORS: Perforater Cover Open "printer-state-reasons.perforater-cover-open" = "Perforater Cover Open"; // TRANSLATORS: Perforater Empty "printer-state-reasons.perforater-empty" = "Perforater Empty"; // TRANSLATORS: Perforater Full "printer-state-reasons.perforater-full" = "Perforater Full"; // TRANSLATORS: Perforater Interlock Closed "printer-state-reasons.perforater-interlock-closed" = "Perforater Interlock Closed"; // TRANSLATORS: Perforater Interlock Open "printer-state-reasons.perforater-interlock-open" = "Perforater Interlock Open"; // TRANSLATORS: Perforater Jam "printer-state-reasons.perforater-jam" = "Perforater Jam"; // TRANSLATORS: Perforater Life Almost Over "printer-state-reasons.perforater-life-almost-over" = "Perforater Life Almost Over"; // TRANSLATORS: Perforater Life Over "printer-state-reasons.perforater-life-over" = "Perforater Life Over"; // TRANSLATORS: Perforater Memory Exhausted "printer-state-reasons.perforater-memory-exhausted" = "Perforater Memory Exhausted"; // TRANSLATORS: Perforater Missing "printer-state-reasons.perforater-missing" = "Perforater Missing"; // TRANSLATORS: Perforater Motor Failure "printer-state-reasons.perforater-motor-failure" = "Perforater Motor Failure"; // TRANSLATORS: Perforater Near Limit "printer-state-reasons.perforater-near-limit" = "Perforater Near Limit"; // TRANSLATORS: Perforater Offline "printer-state-reasons.perforater-offline" = "Perforater Offline"; // TRANSLATORS: Perforater Opened "printer-state-reasons.perforater-opened" = "Perforater Opened"; // TRANSLATORS: Perforater Over Temperature "printer-state-reasons.perforater-over-temperature" = "Perforater Over Temperature"; // TRANSLATORS: Perforater Power Saver "printer-state-reasons.perforater-power-saver" = "Perforater Power Saver"; // TRANSLATORS: Perforater Recoverable Failure "printer-state-reasons.perforater-recoverable-failure" = "Perforater Recoverable Failure"; // TRANSLATORS: Perforater Recoverable Storage "printer-state-reasons.perforater-recoverable-storage" = "Perforater Recoverable Storage"; // TRANSLATORS: Perforater Removed "printer-state-reasons.perforater-removed" = "Perforater Removed"; // TRANSLATORS: Perforater Resource Added "printer-state-reasons.perforater-resource-added" = "Perforater Resource Added"; // TRANSLATORS: Perforater Resource Removed "printer-state-reasons.perforater-resource-removed" = "Perforater Resource Removed"; // TRANSLATORS: Perforater Thermistor Failure "printer-state-reasons.perforater-thermistor-failure" = "Perforater Thermistor Failure"; // TRANSLATORS: Perforater Timing Failure "printer-state-reasons.perforater-timing-failure" = "Perforater Timing Failure"; // TRANSLATORS: Perforater Turned Off "printer-state-reasons.perforater-turned-off" = "Perforater Turned Off"; // TRANSLATORS: Perforater Turned On "printer-state-reasons.perforater-turned-on" = "Perforater Turned On"; // TRANSLATORS: Perforater Under Temperature "printer-state-reasons.perforater-under-temperature" = "Perforater Under Temperature"; // TRANSLATORS: Perforater Unrecoverable Failure "printer-state-reasons.perforater-unrecoverable-failure" = "Perforater Unrecoverable Failure"; // TRANSLATORS: Perforater Unrecoverable Storage Error "printer-state-reasons.perforater-unrecoverable-storage-error" = "Perforater Unrecoverable Storage Error"; // TRANSLATORS: Perforater Warming Up "printer-state-reasons.perforater-warming-up" = "Perforater Warming Up"; // TRANSLATORS: Platform Cooling "printer-state-reasons.platform-cooling" = "Platform Cooling"; // TRANSLATORS: Platform Failure "printer-state-reasons.platform-failure" = "Platform Failure"; // TRANSLATORS: Platform Heating "printer-state-reasons.platform-heating" = "Platform Heating"; // TRANSLATORS: Platform Temperature High "printer-state-reasons.platform-temperature-high" = "Platform Temperature High"; // TRANSLATORS: Platform Temperature Low "printer-state-reasons.platform-temperature-low" = "Platform Temperature Low"; // TRANSLATORS: Power Down "printer-state-reasons.power-down" = "Power Down"; // TRANSLATORS: Power Up "printer-state-reasons.power-up" = "Power Up"; // TRANSLATORS: Printer Reset Manually "printer-state-reasons.printer-manual-reset" = "Printer Reset Manually"; // TRANSLATORS: Printer Reset Remotely "printer-state-reasons.printer-nms-reset" = "Printer Reset Remotely"; // TRANSLATORS: Printer Ready To Print "printer-state-reasons.printer-ready-to-print" = "Printer Ready To Print"; // TRANSLATORS: Puncher Added "printer-state-reasons.puncher-added" = "Puncher Added"; // TRANSLATORS: Puncher Almost Empty "printer-state-reasons.puncher-almost-empty" = "Puncher Almost Empty"; // TRANSLATORS: Puncher Almost Full "printer-state-reasons.puncher-almost-full" = "Puncher Almost Full"; // TRANSLATORS: Puncher At Limit "printer-state-reasons.puncher-at-limit" = "Puncher At Limit"; // TRANSLATORS: Puncher Closed "printer-state-reasons.puncher-closed" = "Puncher Closed"; // TRANSLATORS: Puncher Configuration Change "printer-state-reasons.puncher-configuration-change" = "Puncher Configuration Change"; // TRANSLATORS: Puncher Cover Closed "printer-state-reasons.puncher-cover-closed" = "Puncher Cover Closed"; // TRANSLATORS: Puncher Cover Open "printer-state-reasons.puncher-cover-open" = "Puncher Cover Open"; // TRANSLATORS: Puncher Empty "printer-state-reasons.puncher-empty" = "Puncher Empty"; // TRANSLATORS: Puncher Full "printer-state-reasons.puncher-full" = "Puncher Full"; // TRANSLATORS: Puncher Interlock Closed "printer-state-reasons.puncher-interlock-closed" = "Puncher Interlock Closed"; // TRANSLATORS: Puncher Interlock Open "printer-state-reasons.puncher-interlock-open" = "Puncher Interlock Open"; // TRANSLATORS: Puncher Jam "printer-state-reasons.puncher-jam" = "Puncher Jam"; // TRANSLATORS: Puncher Life Almost Over "printer-state-reasons.puncher-life-almost-over" = "Puncher Life Almost Over"; // TRANSLATORS: Puncher Life Over "printer-state-reasons.puncher-life-over" = "Puncher Life Over"; // TRANSLATORS: Puncher Memory Exhausted "printer-state-reasons.puncher-memory-exhausted" = "Puncher Memory Exhausted"; // TRANSLATORS: Puncher Missing "printer-state-reasons.puncher-missing" = "Puncher Missing"; // TRANSLATORS: Puncher Motor Failure "printer-state-reasons.puncher-motor-failure" = "Puncher Motor Failure"; // TRANSLATORS: Puncher Near Limit "printer-state-reasons.puncher-near-limit" = "Puncher Near Limit"; // TRANSLATORS: Puncher Offline "printer-state-reasons.puncher-offline" = "Puncher Offline"; // TRANSLATORS: Puncher Opened "printer-state-reasons.puncher-opened" = "Puncher Opened"; // TRANSLATORS: Puncher Over Temperature "printer-state-reasons.puncher-over-temperature" = "Puncher Over Temperature"; // TRANSLATORS: Puncher Power Saver "printer-state-reasons.puncher-power-saver" = "Puncher Power Saver"; // TRANSLATORS: Puncher Recoverable Failure "printer-state-reasons.puncher-recoverable-failure" = "Puncher Recoverable Failure"; // TRANSLATORS: Puncher Recoverable Storage "printer-state-reasons.puncher-recoverable-storage" = "Puncher Recoverable Storage"; // TRANSLATORS: Puncher Removed "printer-state-reasons.puncher-removed" = "Puncher Removed"; // TRANSLATORS: Puncher Resource Added "printer-state-reasons.puncher-resource-added" = "Puncher Resource Added"; // TRANSLATORS: Puncher Resource Removed "printer-state-reasons.puncher-resource-removed" = "Puncher Resource Removed"; // TRANSLATORS: Puncher Thermistor Failure "printer-state-reasons.puncher-thermistor-failure" = "Puncher Thermistor Failure"; // TRANSLATORS: Puncher Timing Failure "printer-state-reasons.puncher-timing-failure" = "Puncher Timing Failure"; // TRANSLATORS: Puncher Turned Off "printer-state-reasons.puncher-turned-off" = "Puncher Turned Off"; // TRANSLATORS: Puncher Turned On "printer-state-reasons.puncher-turned-on" = "Puncher Turned On"; // TRANSLATORS: Puncher Under Temperature "printer-state-reasons.puncher-under-temperature" = "Puncher Under Temperature"; // TRANSLATORS: Puncher Unrecoverable Failure "printer-state-reasons.puncher-unrecoverable-failure" = "Puncher Unrecoverable Failure"; // TRANSLATORS: Puncher Unrecoverable Storage Error "printer-state-reasons.puncher-unrecoverable-storage-error" = "Puncher Unrecoverable Storage Error"; // TRANSLATORS: Puncher Warming Up "printer-state-reasons.puncher-warming-up" = "Puncher Warming Up"; // TRANSLATORS: Separation Cutter Added "printer-state-reasons.separation-cutter-added" = "Separation Cutter Added"; // TRANSLATORS: Separation Cutter Almost Empty "printer-state-reasons.separation-cutter-almost-empty" = "Separation Cutter Almost Empty"; // TRANSLATORS: Separation Cutter Almost Full "printer-state-reasons.separation-cutter-almost-full" = "Separation Cutter Almost Full"; // TRANSLATORS: Separation Cutter At Limit "printer-state-reasons.separation-cutter-at-limit" = "Separation Cutter At Limit"; // TRANSLATORS: Separation Cutter Closed "printer-state-reasons.separation-cutter-closed" = "Separation Cutter Closed"; // TRANSLATORS: Separation Cutter Configuration Change "printer-state-reasons.separation-cutter-configuration-change" = "Separation Cutter Configuration Change"; // TRANSLATORS: Separation Cutter Cover Closed "printer-state-reasons.separation-cutter-cover-closed" = "Separation Cutter Cover Closed"; // TRANSLATORS: Separation Cutter Cover Open "printer-state-reasons.separation-cutter-cover-open" = "Separation Cutter Cover Open"; // TRANSLATORS: Separation Cutter Empty "printer-state-reasons.separation-cutter-empty" = "Separation Cutter Empty"; // TRANSLATORS: Separation Cutter Full "printer-state-reasons.separation-cutter-full" = "Separation Cutter Full"; // TRANSLATORS: Separation Cutter Interlock Closed "printer-state-reasons.separation-cutter-interlock-closed" = "Separation Cutter Interlock Closed"; // TRANSLATORS: Separation Cutter Interlock Open "printer-state-reasons.separation-cutter-interlock-open" = "Separation Cutter Interlock Open"; // TRANSLATORS: Separation Cutter Jam "printer-state-reasons.separation-cutter-jam" = "Separation Cutter Jam"; // TRANSLATORS: Separation Cutter Life Almost Over "printer-state-reasons.separation-cutter-life-almost-over" = "Separation Cutter Life Almost Over"; // TRANSLATORS: Separation Cutter Life Over "printer-state-reasons.separation-cutter-life-over" = "Separation Cutter Life Over"; // TRANSLATORS: Separation Cutter Memory Exhausted "printer-state-reasons.separation-cutter-memory-exhausted" = "Separation Cutter Memory Exhausted"; // TRANSLATORS: Separation Cutter Missing "printer-state-reasons.separation-cutter-missing" = "Separation Cutter Missing"; // TRANSLATORS: Separation Cutter Motor Failure "printer-state-reasons.separation-cutter-motor-failure" = "Separation Cutter Motor Failure"; // TRANSLATORS: Separation Cutter Near Limit "printer-state-reasons.separation-cutter-near-limit" = "Separation Cutter Near Limit"; // TRANSLATORS: Separation Cutter Offline "printer-state-reasons.separation-cutter-offline" = "Separation Cutter Offline"; // TRANSLATORS: Separation Cutter Opened "printer-state-reasons.separation-cutter-opened" = "Separation Cutter Opened"; // TRANSLATORS: Separation Cutter Over Temperature "printer-state-reasons.separation-cutter-over-temperature" = "Separation Cutter Over Temperature"; // TRANSLATORS: Separation Cutter Power Saver "printer-state-reasons.separation-cutter-power-saver" = "Separation Cutter Power Saver"; // TRANSLATORS: Separation Cutter Recoverable Failure "printer-state-reasons.separation-cutter-recoverable-failure" = "Separation Cutter Recoverable Failure"; // TRANSLATORS: Separation Cutter Recoverable Storage "printer-state-reasons.separation-cutter-recoverable-storage" = "Separation Cutter Recoverable Storage"; // TRANSLATORS: Separation Cutter Removed "printer-state-reasons.separation-cutter-removed" = "Separation Cutter Removed"; // TRANSLATORS: Separation Cutter Resource Added "printer-state-reasons.separation-cutter-resource-added" = "Separation Cutter Resource Added"; // TRANSLATORS: Separation Cutter Resource Removed "printer-state-reasons.separation-cutter-resource-removed" = "Separation Cutter Resource Removed"; // TRANSLATORS: Separation Cutter Thermistor Failure "printer-state-reasons.separation-cutter-thermistor-failure" = "Separation Cutter Thermistor Failure"; // TRANSLATORS: Separation Cutter Timing Failure "printer-state-reasons.separation-cutter-timing-failure" = "Separation Cutter Timing Failure"; // TRANSLATORS: Separation Cutter Turned Off "printer-state-reasons.separation-cutter-turned-off" = "Separation Cutter Turned Off"; // TRANSLATORS: Separation Cutter Turned On "printer-state-reasons.separation-cutter-turned-on" = "Separation Cutter Turned On"; // TRANSLATORS: Separation Cutter Under Temperature "printer-state-reasons.separation-cutter-under-temperature" = "Separation Cutter Under Temperature"; // TRANSLATORS: Separation Cutter Unrecoverable Failure "printer-state-reasons.separation-cutter-unrecoverable-failure" = "Separation Cutter Unrecoverable Failure"; // TRANSLATORS: Separation Cutter Unrecoverable Storage Error "printer-state-reasons.separation-cutter-unrecoverable-storage-error" = "Separation Cutter Unrecoverable Storage Error"; // TRANSLATORS: Separation Cutter Warming Up "printer-state-reasons.separation-cutter-warming-up" = "Separation Cutter Warming Up"; // TRANSLATORS: Sheet Rotator Added "printer-state-reasons.sheet-rotator-added" = "Sheet Rotator Added"; // TRANSLATORS: Sheet Rotator Almost Empty "printer-state-reasons.sheet-rotator-almost-empty" = "Sheet Rotator Almost Empty"; // TRANSLATORS: Sheet Rotator Almost Full "printer-state-reasons.sheet-rotator-almost-full" = "Sheet Rotator Almost Full"; // TRANSLATORS: Sheet Rotator At Limit "printer-state-reasons.sheet-rotator-at-limit" = "Sheet Rotator At Limit"; // TRANSLATORS: Sheet Rotator Closed "printer-state-reasons.sheet-rotator-closed" = "Sheet Rotator Closed"; // TRANSLATORS: Sheet Rotator Configuration Change "printer-state-reasons.sheet-rotator-configuration-change" = "Sheet Rotator Configuration Change"; // TRANSLATORS: Sheet Rotator Cover Closed "printer-state-reasons.sheet-rotator-cover-closed" = "Sheet Rotator Cover Closed"; // TRANSLATORS: Sheet Rotator Cover Open "printer-state-reasons.sheet-rotator-cover-open" = "Sheet Rotator Cover Open"; // TRANSLATORS: Sheet Rotator Empty "printer-state-reasons.sheet-rotator-empty" = "Sheet Rotator Empty"; // TRANSLATORS: Sheet Rotator Full "printer-state-reasons.sheet-rotator-full" = "Sheet Rotator Full"; // TRANSLATORS: Sheet Rotator Interlock Closed "printer-state-reasons.sheet-rotator-interlock-closed" = "Sheet Rotator Interlock Closed"; // TRANSLATORS: Sheet Rotator Interlock Open "printer-state-reasons.sheet-rotator-interlock-open" = "Sheet Rotator Interlock Open"; // TRANSLATORS: Sheet Rotator Jam "printer-state-reasons.sheet-rotator-jam" = "Sheet Rotator Jam"; // TRANSLATORS: Sheet Rotator Life Almost Over "printer-state-reasons.sheet-rotator-life-almost-over" = "Sheet Rotator Life Almost Over"; // TRANSLATORS: Sheet Rotator Life Over "printer-state-reasons.sheet-rotator-life-over" = "Sheet Rotator Life Over"; // TRANSLATORS: Sheet Rotator Memory Exhausted "printer-state-reasons.sheet-rotator-memory-exhausted" = "Sheet Rotator Memory Exhausted"; // TRANSLATORS: Sheet Rotator Missing "printer-state-reasons.sheet-rotator-missing" = "Sheet Rotator Missing"; // TRANSLATORS: Sheet Rotator Motor Failure "printer-state-reasons.sheet-rotator-motor-failure" = "Sheet Rotator Motor Failure"; // TRANSLATORS: Sheet Rotator Near Limit "printer-state-reasons.sheet-rotator-near-limit" = "Sheet Rotator Near Limit"; // TRANSLATORS: Sheet Rotator Offline "printer-state-reasons.sheet-rotator-offline" = "Sheet Rotator Offline"; // TRANSLATORS: Sheet Rotator Opened "printer-state-reasons.sheet-rotator-opened" = "Sheet Rotator Opened"; // TRANSLATORS: Sheet Rotator Over Temperature "printer-state-reasons.sheet-rotator-over-temperature" = "Sheet Rotator Over Temperature"; // TRANSLATORS: Sheet Rotator Power Saver "printer-state-reasons.sheet-rotator-power-saver" = "Sheet Rotator Power Saver"; // TRANSLATORS: Sheet Rotator Recoverable Failure "printer-state-reasons.sheet-rotator-recoverable-failure" = "Sheet Rotator Recoverable Failure"; // TRANSLATORS: Sheet Rotator Recoverable Storage "printer-state-reasons.sheet-rotator-recoverable-storage" = "Sheet Rotator Recoverable Storage"; // TRANSLATORS: Sheet Rotator Removed "printer-state-reasons.sheet-rotator-removed" = "Sheet Rotator Removed"; // TRANSLATORS: Sheet Rotator Resource Added "printer-state-reasons.sheet-rotator-resource-added" = "Sheet Rotator Resource Added"; // TRANSLATORS: Sheet Rotator Resource Removed "printer-state-reasons.sheet-rotator-resource-removed" = "Sheet Rotator Resource Removed"; // TRANSLATORS: Sheet Rotator Thermistor Failure "printer-state-reasons.sheet-rotator-thermistor-failure" = "Sheet Rotator Thermistor Failure"; // TRANSLATORS: Sheet Rotator Timing Failure "printer-state-reasons.sheet-rotator-timing-failure" = "Sheet Rotator Timing Failure"; // TRANSLATORS: Sheet Rotator Turned Off "printer-state-reasons.sheet-rotator-turned-off" = "Sheet Rotator Turned Off"; // TRANSLATORS: Sheet Rotator Turned On "printer-state-reasons.sheet-rotator-turned-on" = "Sheet Rotator Turned On"; // TRANSLATORS: Sheet Rotator Under Temperature "printer-state-reasons.sheet-rotator-under-temperature" = "Sheet Rotator Under Temperature"; // TRANSLATORS: Sheet Rotator Unrecoverable Failure "printer-state-reasons.sheet-rotator-unrecoverable-failure" = "Sheet Rotator Unrecoverable Failure"; // TRANSLATORS: Sheet Rotator Unrecoverable Storage Error "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" = "Sheet Rotator Unrecoverable Storage Error"; // TRANSLATORS: Sheet Rotator Warming Up "printer-state-reasons.sheet-rotator-warming-up" = "Sheet Rotator Warming Up"; // TRANSLATORS: Printer offline "printer-state-reasons.shutdown" = "Shutdown"; // TRANSLATORS: Slitter Added "printer-state-reasons.slitter-added" = "Slitter Added"; // TRANSLATORS: Slitter Almost Empty "printer-state-reasons.slitter-almost-empty" = "Slitter Almost Empty"; // TRANSLATORS: Slitter Almost Full "printer-state-reasons.slitter-almost-full" = "Slitter Almost Full"; // TRANSLATORS: Slitter At Limit "printer-state-reasons.slitter-at-limit" = "Slitter At Limit"; // TRANSLATORS: Slitter Closed "printer-state-reasons.slitter-closed" = "Slitter Closed"; // TRANSLATORS: Slitter Configuration Change "printer-state-reasons.slitter-configuration-change" = "Slitter Configuration Change"; // TRANSLATORS: Slitter Cover Closed "printer-state-reasons.slitter-cover-closed" = "Slitter Cover Closed"; // TRANSLATORS: Slitter Cover Open "printer-state-reasons.slitter-cover-open" = "Slitter Cover Open"; // TRANSLATORS: Slitter Empty "printer-state-reasons.slitter-empty" = "Slitter Empty"; // TRANSLATORS: Slitter Full "printer-state-reasons.slitter-full" = "Slitter Full"; // TRANSLATORS: Slitter Interlock Closed "printer-state-reasons.slitter-interlock-closed" = "Slitter Interlock Closed"; // TRANSLATORS: Slitter Interlock Open "printer-state-reasons.slitter-interlock-open" = "Slitter Interlock Open"; // TRANSLATORS: Slitter Jam "printer-state-reasons.slitter-jam" = "Slitter Jam"; // TRANSLATORS: Slitter Life Almost Over "printer-state-reasons.slitter-life-almost-over" = "Slitter Life Almost Over"; // TRANSLATORS: Slitter Life Over "printer-state-reasons.slitter-life-over" = "Slitter Life Over"; // TRANSLATORS: Slitter Memory Exhausted "printer-state-reasons.slitter-memory-exhausted" = "Slitter Memory Exhausted"; // TRANSLATORS: Slitter Missing "printer-state-reasons.slitter-missing" = "Slitter Missing"; // TRANSLATORS: Slitter Motor Failure "printer-state-reasons.slitter-motor-failure" = "Slitter Motor Failure"; // TRANSLATORS: Slitter Near Limit "printer-state-reasons.slitter-near-limit" = "Slitter Near Limit"; // TRANSLATORS: Slitter Offline "printer-state-reasons.slitter-offline" = "Slitter Offline"; // TRANSLATORS: Slitter Opened "printer-state-reasons.slitter-opened" = "Slitter Opened"; // TRANSLATORS: Slitter Over Temperature "printer-state-reasons.slitter-over-temperature" = "Slitter Over Temperature"; // TRANSLATORS: Slitter Power Saver "printer-state-reasons.slitter-power-saver" = "Slitter Power Saver"; // TRANSLATORS: Slitter Recoverable Failure "printer-state-reasons.slitter-recoverable-failure" = "Slitter Recoverable Failure"; // TRANSLATORS: Slitter Recoverable Storage "printer-state-reasons.slitter-recoverable-storage" = "Slitter Recoverable Storage"; // TRANSLATORS: Slitter Removed "printer-state-reasons.slitter-removed" = "Slitter Removed"; // TRANSLATORS: Slitter Resource Added "printer-state-reasons.slitter-resource-added" = "Slitter Resource Added"; // TRANSLATORS: Slitter Resource Removed "printer-state-reasons.slitter-resource-removed" = "Slitter Resource Removed"; // TRANSLATORS: Slitter Thermistor Failure "printer-state-reasons.slitter-thermistor-failure" = "Slitter Thermistor Failure"; // TRANSLATORS: Slitter Timing Failure "printer-state-reasons.slitter-timing-failure" = "Slitter Timing Failure"; // TRANSLATORS: Slitter Turned Off "printer-state-reasons.slitter-turned-off" = "Slitter Turned Off"; // TRANSLATORS: Slitter Turned On "printer-state-reasons.slitter-turned-on" = "Slitter Turned On"; // TRANSLATORS: Slitter Under Temperature "printer-state-reasons.slitter-under-temperature" = "Slitter Under Temperature"; // TRANSLATORS: Slitter Unrecoverable Failure "printer-state-reasons.slitter-unrecoverable-failure" = "Slitter Unrecoverable Failure"; // TRANSLATORS: Slitter Unrecoverable Storage Error "printer-state-reasons.slitter-unrecoverable-storage-error" = "Slitter Unrecoverable Storage Error"; // TRANSLATORS: Slitter Warming Up "printer-state-reasons.slitter-warming-up" = "Slitter Warming Up"; // TRANSLATORS: Spool Area Full "printer-state-reasons.spool-area-full" = "Spool Area Full"; // TRANSLATORS: Stacker Added "printer-state-reasons.stacker-added" = "Stacker Added"; // TRANSLATORS: Stacker Almost Empty "printer-state-reasons.stacker-almost-empty" = "Stacker Almost Empty"; // TRANSLATORS: Stacker Almost Full "printer-state-reasons.stacker-almost-full" = "Stacker Almost Full"; // TRANSLATORS: Stacker At Limit "printer-state-reasons.stacker-at-limit" = "Stacker At Limit"; // TRANSLATORS: Stacker Closed "printer-state-reasons.stacker-closed" = "Stacker Closed"; // TRANSLATORS: Stacker Configuration Change "printer-state-reasons.stacker-configuration-change" = "Stacker Configuration Change"; // TRANSLATORS: Stacker Cover Closed "printer-state-reasons.stacker-cover-closed" = "Stacker Cover Closed"; // TRANSLATORS: Stacker Cover Open "printer-state-reasons.stacker-cover-open" = "Stacker Cover Open"; // TRANSLATORS: Stacker Empty "printer-state-reasons.stacker-empty" = "Stacker Empty"; // TRANSLATORS: Stacker Full "printer-state-reasons.stacker-full" = "Stacker Full"; // TRANSLATORS: Stacker Interlock Closed "printer-state-reasons.stacker-interlock-closed" = "Stacker Interlock Closed"; // TRANSLATORS: Stacker Interlock Open "printer-state-reasons.stacker-interlock-open" = "Stacker Interlock Open"; // TRANSLATORS: Stacker Jam "printer-state-reasons.stacker-jam" = "Stacker Jam"; // TRANSLATORS: Stacker Life Almost Over "printer-state-reasons.stacker-life-almost-over" = "Stacker Life Almost Over"; // TRANSLATORS: Stacker Life Over "printer-state-reasons.stacker-life-over" = "Stacker Life Over"; // TRANSLATORS: Stacker Memory Exhausted "printer-state-reasons.stacker-memory-exhausted" = "Stacker Memory Exhausted"; // TRANSLATORS: Stacker Missing "printer-state-reasons.stacker-missing" = "Stacker Missing"; // TRANSLATORS: Stacker Motor Failure "printer-state-reasons.stacker-motor-failure" = "Stacker Motor Failure"; // TRANSLATORS: Stacker Near Limit "printer-state-reasons.stacker-near-limit" = "Stacker Near Limit"; // TRANSLATORS: Stacker Offline "printer-state-reasons.stacker-offline" = "Stacker Offline"; // TRANSLATORS: Stacker Opened "printer-state-reasons.stacker-opened" = "Stacker Opened"; // TRANSLATORS: Stacker Over Temperature "printer-state-reasons.stacker-over-temperature" = "Stacker Over Temperature"; // TRANSLATORS: Stacker Power Saver "printer-state-reasons.stacker-power-saver" = "Stacker Power Saver"; // TRANSLATORS: Stacker Recoverable Failure "printer-state-reasons.stacker-recoverable-failure" = "Stacker Recoverable Failure"; // TRANSLATORS: Stacker Recoverable Storage "printer-state-reasons.stacker-recoverable-storage" = "Stacker Recoverable Storage"; // TRANSLATORS: Stacker Removed "printer-state-reasons.stacker-removed" = "Stacker Removed"; // TRANSLATORS: Stacker Resource Added "printer-state-reasons.stacker-resource-added" = "Stacker Resource Added"; // TRANSLATORS: Stacker Resource Removed "printer-state-reasons.stacker-resource-removed" = "Stacker Resource Removed"; // TRANSLATORS: Stacker Thermistor Failure "printer-state-reasons.stacker-thermistor-failure" = "Stacker Thermistor Failure"; // TRANSLATORS: Stacker Timing Failure "printer-state-reasons.stacker-timing-failure" = "Stacker Timing Failure"; // TRANSLATORS: Stacker Turned Off "printer-state-reasons.stacker-turned-off" = "Stacker Turned Off"; // TRANSLATORS: Stacker Turned On "printer-state-reasons.stacker-turned-on" = "Stacker Turned On"; // TRANSLATORS: Stacker Under Temperature "printer-state-reasons.stacker-under-temperature" = "Stacker Under Temperature"; // TRANSLATORS: Stacker Unrecoverable Failure "printer-state-reasons.stacker-unrecoverable-failure" = "Stacker Unrecoverable Failure"; // TRANSLATORS: Stacker Unrecoverable Storage Error "printer-state-reasons.stacker-unrecoverable-storage-error" = "Stacker Unrecoverable Storage Error"; // TRANSLATORS: Stacker Warming Up "printer-state-reasons.stacker-warming-up" = "Stacker Warming Up"; // TRANSLATORS: Stapler Added "printer-state-reasons.stapler-added" = "Stapler Added"; // TRANSLATORS: Stapler Almost Empty "printer-state-reasons.stapler-almost-empty" = "Stapler Almost Empty"; // TRANSLATORS: Stapler Almost Full "printer-state-reasons.stapler-almost-full" = "Stapler Almost Full"; // TRANSLATORS: Stapler At Limit "printer-state-reasons.stapler-at-limit" = "Stapler At Limit"; // TRANSLATORS: Stapler Closed "printer-state-reasons.stapler-closed" = "Stapler Closed"; // TRANSLATORS: Stapler Configuration Change "printer-state-reasons.stapler-configuration-change" = "Stapler Configuration Change"; // TRANSLATORS: Stapler Cover Closed "printer-state-reasons.stapler-cover-closed" = "Stapler Cover Closed"; // TRANSLATORS: Stapler Cover Open "printer-state-reasons.stapler-cover-open" = "Stapler Cover Open"; // TRANSLATORS: Stapler Empty "printer-state-reasons.stapler-empty" = "Stapler Empty"; // TRANSLATORS: Stapler Full "printer-state-reasons.stapler-full" = "Stapler Full"; // TRANSLATORS: Stapler Interlock Closed "printer-state-reasons.stapler-interlock-closed" = "Stapler Interlock Closed"; // TRANSLATORS: Stapler Interlock Open "printer-state-reasons.stapler-interlock-open" = "Stapler Interlock Open"; // TRANSLATORS: Stapler Jam "printer-state-reasons.stapler-jam" = "Stapler Jam"; // TRANSLATORS: Stapler Life Almost Over "printer-state-reasons.stapler-life-almost-over" = "Stapler Life Almost Over"; // TRANSLATORS: Stapler Life Over "printer-state-reasons.stapler-life-over" = "Stapler Life Over"; // TRANSLATORS: Stapler Memory Exhausted "printer-state-reasons.stapler-memory-exhausted" = "Stapler Memory Exhausted"; // TRANSLATORS: Stapler Missing "printer-state-reasons.stapler-missing" = "Stapler Missing"; // TRANSLATORS: Stapler Motor Failure "printer-state-reasons.stapler-motor-failure" = "Stapler Motor Failure"; // TRANSLATORS: Stapler Near Limit "printer-state-reasons.stapler-near-limit" = "Stapler Near Limit"; // TRANSLATORS: Stapler Offline "printer-state-reasons.stapler-offline" = "Stapler Offline"; // TRANSLATORS: Stapler Opened "printer-state-reasons.stapler-opened" = "Stapler Opened"; // TRANSLATORS: Stapler Over Temperature "printer-state-reasons.stapler-over-temperature" = "Stapler Over Temperature"; // TRANSLATORS: Stapler Power Saver "printer-state-reasons.stapler-power-saver" = "Stapler Power Saver"; // TRANSLATORS: Stapler Recoverable Failure "printer-state-reasons.stapler-recoverable-failure" = "Stapler Recoverable Failure"; // TRANSLATORS: Stapler Recoverable Storage "printer-state-reasons.stapler-recoverable-storage" = "Stapler Recoverable Storage"; // TRANSLATORS: Stapler Removed "printer-state-reasons.stapler-removed" = "Stapler Removed"; // TRANSLATORS: Stapler Resource Added "printer-state-reasons.stapler-resource-added" = "Stapler Resource Added"; // TRANSLATORS: Stapler Resource Removed "printer-state-reasons.stapler-resource-removed" = "Stapler Resource Removed"; // TRANSLATORS: Stapler Thermistor Failure "printer-state-reasons.stapler-thermistor-failure" = "Stapler Thermistor Failure"; // TRANSLATORS: Stapler Timing Failure "printer-state-reasons.stapler-timing-failure" = "Stapler Timing Failure"; // TRANSLATORS: Stapler Turned Off "printer-state-reasons.stapler-turned-off" = "Stapler Turned Off"; // TRANSLATORS: Stapler Turned On "printer-state-reasons.stapler-turned-on" = "Stapler Turned On"; // TRANSLATORS: Stapler Under Temperature "printer-state-reasons.stapler-under-temperature" = "Stapler Under Temperature"; // TRANSLATORS: Stapler Unrecoverable Failure "printer-state-reasons.stapler-unrecoverable-failure" = "Stapler Unrecoverable Failure"; // TRANSLATORS: Stapler Unrecoverable Storage Error "printer-state-reasons.stapler-unrecoverable-storage-error" = "Stapler Unrecoverable Storage Error"; // TRANSLATORS: Stapler Warming Up "printer-state-reasons.stapler-warming-up" = "Stapler Warming Up"; // TRANSLATORS: Stitcher Added "printer-state-reasons.stitcher-added" = "Stitcher Added"; // TRANSLATORS: Stitcher Almost Empty "printer-state-reasons.stitcher-almost-empty" = "Stitcher Almost Empty"; // TRANSLATORS: Stitcher Almost Full "printer-state-reasons.stitcher-almost-full" = "Stitcher Almost Full"; // TRANSLATORS: Stitcher At Limit "printer-state-reasons.stitcher-at-limit" = "Stitcher At Limit"; // TRANSLATORS: Stitcher Closed "printer-state-reasons.stitcher-closed" = "Stitcher Closed"; // TRANSLATORS: Stitcher Configuration Change "printer-state-reasons.stitcher-configuration-change" = "Stitcher Configuration Change"; // TRANSLATORS: Stitcher Cover Closed "printer-state-reasons.stitcher-cover-closed" = "Stitcher Cover Closed"; // TRANSLATORS: Stitcher Cover Open "printer-state-reasons.stitcher-cover-open" = "Stitcher Cover Open"; // TRANSLATORS: Stitcher Empty "printer-state-reasons.stitcher-empty" = "Stitcher Empty"; // TRANSLATORS: Stitcher Full "printer-state-reasons.stitcher-full" = "Stitcher Full"; // TRANSLATORS: Stitcher Interlock Closed "printer-state-reasons.stitcher-interlock-closed" = "Stitcher Interlock Closed"; // TRANSLATORS: Stitcher Interlock Open "printer-state-reasons.stitcher-interlock-open" = "Stitcher Interlock Open"; // TRANSLATORS: Stitcher Jam "printer-state-reasons.stitcher-jam" = "Stitcher Jam"; // TRANSLATORS: Stitcher Life Almost Over "printer-state-reasons.stitcher-life-almost-over" = "Stitcher Life Almost Over"; // TRANSLATORS: Stitcher Life Over "printer-state-reasons.stitcher-life-over" = "Stitcher Life Over"; // TRANSLATORS: Stitcher Memory Exhausted "printer-state-reasons.stitcher-memory-exhausted" = "Stitcher Memory Exhausted"; // TRANSLATORS: Stitcher Missing "printer-state-reasons.stitcher-missing" = "Stitcher Missing"; // TRANSLATORS: Stitcher Motor Failure "printer-state-reasons.stitcher-motor-failure" = "Stitcher Motor Failure"; // TRANSLATORS: Stitcher Near Limit "printer-state-reasons.stitcher-near-limit" = "Stitcher Near Limit"; // TRANSLATORS: Stitcher Offline "printer-state-reasons.stitcher-offline" = "Stitcher Offline"; // TRANSLATORS: Stitcher Opened "printer-state-reasons.stitcher-opened" = "Stitcher Opened"; // TRANSLATORS: Stitcher Over Temperature "printer-state-reasons.stitcher-over-temperature" = "Stitcher Over Temperature"; // TRANSLATORS: Stitcher Power Saver "printer-state-reasons.stitcher-power-saver" = "Stitcher Power Saver"; // TRANSLATORS: Stitcher Recoverable Failure "printer-state-reasons.stitcher-recoverable-failure" = "Stitcher Recoverable Failure"; // TRANSLATORS: Stitcher Recoverable Storage "printer-state-reasons.stitcher-recoverable-storage" = "Stitcher Recoverable Storage"; // TRANSLATORS: Stitcher Removed "printer-state-reasons.stitcher-removed" = "Stitcher Removed"; // TRANSLATORS: Stitcher Resource Added "printer-state-reasons.stitcher-resource-added" = "Stitcher Resource Added"; // TRANSLATORS: Stitcher Resource Removed "printer-state-reasons.stitcher-resource-removed" = "Stitcher Resource Removed"; // TRANSLATORS: Stitcher Thermistor Failure "printer-state-reasons.stitcher-thermistor-failure" = "Stitcher Thermistor Failure"; // TRANSLATORS: Stitcher Timing Failure "printer-state-reasons.stitcher-timing-failure" = "Stitcher Timing Failure"; // TRANSLATORS: Stitcher Turned Off "printer-state-reasons.stitcher-turned-off" = "Stitcher Turned Off"; // TRANSLATORS: Stitcher Turned On "printer-state-reasons.stitcher-turned-on" = "Stitcher Turned On"; // TRANSLATORS: Stitcher Under Temperature "printer-state-reasons.stitcher-under-temperature" = "Stitcher Under Temperature"; // TRANSLATORS: Stitcher Unrecoverable Failure "printer-state-reasons.stitcher-unrecoverable-failure" = "Stitcher Unrecoverable Failure"; // TRANSLATORS: Stitcher Unrecoverable Storage Error "printer-state-reasons.stitcher-unrecoverable-storage-error" = "Stitcher Unrecoverable Storage Error"; // TRANSLATORS: Stitcher Warming Up "printer-state-reasons.stitcher-warming-up" = "Stitcher Warming Up"; // TRANSLATORS: Partially stopped "printer-state-reasons.stopped-partly" = "Stopped Partly"; // TRANSLATORS: Stopping "printer-state-reasons.stopping" = "Stopping"; // TRANSLATORS: Subunit Added "printer-state-reasons.subunit-added" = "Subunit Added"; // TRANSLATORS: Subunit Almost Empty "printer-state-reasons.subunit-almost-empty" = "Subunit Almost Empty"; // TRANSLATORS: Subunit Almost Full "printer-state-reasons.subunit-almost-full" = "Subunit Almost Full"; // TRANSLATORS: Subunit At Limit "printer-state-reasons.subunit-at-limit" = "Subunit At Limit"; // TRANSLATORS: Subunit Closed "printer-state-reasons.subunit-closed" = "Subunit Closed"; // TRANSLATORS: Subunit Cooling Down "printer-state-reasons.subunit-cooling-down" = "Subunit Cooling Down"; // TRANSLATORS: Subunit Empty "printer-state-reasons.subunit-empty" = "Subunit Empty"; // TRANSLATORS: Subunit Full "printer-state-reasons.subunit-full" = "Subunit Full"; // TRANSLATORS: Subunit Life Almost Over "printer-state-reasons.subunit-life-almost-over" = "Subunit Life Almost Over"; // TRANSLATORS: Subunit Life Over "printer-state-reasons.subunit-life-over" = "Subunit Life Over"; // TRANSLATORS: Subunit Memory Exhausted "printer-state-reasons.subunit-memory-exhausted" = "Subunit Memory Exhausted"; // TRANSLATORS: Subunit Missing "printer-state-reasons.subunit-missing" = "Subunit Missing"; // TRANSLATORS: Subunit Motor Failure "printer-state-reasons.subunit-motor-failure" = "Subunit Motor Failure"; // TRANSLATORS: Subunit Near Limit "printer-state-reasons.subunit-near-limit" = "Subunit Near Limit"; // TRANSLATORS: Subunit Offline "printer-state-reasons.subunit-offline" = "Subunit Offline"; // TRANSLATORS: Subunit Opened "printer-state-reasons.subunit-opened" = "Subunit Opened"; // TRANSLATORS: Subunit Over Temperature "printer-state-reasons.subunit-over-temperature" = "Subunit Over Temperature"; // TRANSLATORS: Subunit Power Saver "printer-state-reasons.subunit-power-saver" = "Subunit Power Saver"; // TRANSLATORS: Subunit Recoverable Failure "printer-state-reasons.subunit-recoverable-failure" = "Subunit Recoverable Failure"; // TRANSLATORS: Subunit Recoverable Storage "printer-state-reasons.subunit-recoverable-storage" = "Subunit Recoverable Storage"; // TRANSLATORS: Subunit Removed "printer-state-reasons.subunit-removed" = "Subunit Removed"; // TRANSLATORS: Subunit Resource Added "printer-state-reasons.subunit-resource-added" = "Subunit Resource Added"; // TRANSLATORS: Subunit Resource Removed "printer-state-reasons.subunit-resource-removed" = "Subunit Resource Removed"; // TRANSLATORS: Subunit Thermistor Failure "printer-state-reasons.subunit-thermistor-failure" = "Subunit Thermistor Failure"; // TRANSLATORS: Subunit Timing Failure "printer-state-reasons.subunit-timing-Failure" = "Subunit Timing Failure"; // TRANSLATORS: Subunit Turned Off "printer-state-reasons.subunit-turned-off" = "Subunit Turned Off"; // TRANSLATORS: Subunit Turned On "printer-state-reasons.subunit-turned-on" = "Subunit Turned On"; // TRANSLATORS: Subunit Under Temperature "printer-state-reasons.subunit-under-temperature" = "Subunit Under Temperature"; // TRANSLATORS: Subunit Unrecoverable Failure "printer-state-reasons.subunit-unrecoverable-failure" = "Subunit Unrecoverable Failure"; // TRANSLATORS: Subunit Unrecoverable Storage "printer-state-reasons.subunit-unrecoverable-storage" = "Subunit Unrecoverable Storage"; // TRANSLATORS: Subunit Warming Up "printer-state-reasons.subunit-warming-up" = "Subunit Warming Up"; // TRANSLATORS: Printer stopped responding "printer-state-reasons.timed-out" = "Timed Out"; // TRANSLATORS: Out of toner "printer-state-reasons.toner-empty" = "Toner Empty"; // TRANSLATORS: Toner low "printer-state-reasons.toner-low" = "Toner Low"; // TRANSLATORS: Trimmer Added "printer-state-reasons.trimmer-added" = "Trimmer Added"; // TRANSLATORS: Trimmer Almost Empty "printer-state-reasons.trimmer-almost-empty" = "Trimmer Almost Empty"; // TRANSLATORS: Trimmer Almost Full "printer-state-reasons.trimmer-almost-full" = "Trimmer Almost Full"; // TRANSLATORS: Trimmer At Limit "printer-state-reasons.trimmer-at-limit" = "Trimmer At Limit"; // TRANSLATORS: Trimmer Closed "printer-state-reasons.trimmer-closed" = "Trimmer Closed"; // TRANSLATORS: Trimmer Configuration Change "printer-state-reasons.trimmer-configuration-change" = "Trimmer Configuration Change"; // TRANSLATORS: Trimmer Cover Closed "printer-state-reasons.trimmer-cover-closed" = "Trimmer Cover Closed"; // TRANSLATORS: Trimmer Cover Open "printer-state-reasons.trimmer-cover-open" = "Trimmer Cover Open"; // TRANSLATORS: Trimmer Empty "printer-state-reasons.trimmer-empty" = "Trimmer Empty"; // TRANSLATORS: Trimmer Full "printer-state-reasons.trimmer-full" = "Trimmer Full"; // TRANSLATORS: Trimmer Interlock Closed "printer-state-reasons.trimmer-interlock-closed" = "Trimmer Interlock Closed"; // TRANSLATORS: Trimmer Interlock Open "printer-state-reasons.trimmer-interlock-open" = "Trimmer Interlock Open"; // TRANSLATORS: Trimmer Jam "printer-state-reasons.trimmer-jam" = "Trimmer Jam"; // TRANSLATORS: Trimmer Life Almost Over "printer-state-reasons.trimmer-life-almost-over" = "Trimmer Life Almost Over"; // TRANSLATORS: Trimmer Life Over "printer-state-reasons.trimmer-life-over" = "Trimmer Life Over"; // TRANSLATORS: Trimmer Memory Exhausted "printer-state-reasons.trimmer-memory-exhausted" = "Trimmer Memory Exhausted"; // TRANSLATORS: Trimmer Missing "printer-state-reasons.trimmer-missing" = "Trimmer Missing"; // TRANSLATORS: Trimmer Motor Failure "printer-state-reasons.trimmer-motor-failure" = "Trimmer Motor Failure"; // TRANSLATORS: Trimmer Near Limit "printer-state-reasons.trimmer-near-limit" = "Trimmer Near Limit"; // TRANSLATORS: Trimmer Offline "printer-state-reasons.trimmer-offline" = "Trimmer Offline"; // TRANSLATORS: Trimmer Opened "printer-state-reasons.trimmer-opened" = "Trimmer Opened"; // TRANSLATORS: Trimmer Over Temperature "printer-state-reasons.trimmer-over-temperature" = "Trimmer Over Temperature"; // TRANSLATORS: Trimmer Power Saver "printer-state-reasons.trimmer-power-saver" = "Trimmer Power Saver"; // TRANSLATORS: Trimmer Recoverable Failure "printer-state-reasons.trimmer-recoverable-failure" = "Trimmer Recoverable Failure"; // TRANSLATORS: Trimmer Recoverable Storage "printer-state-reasons.trimmer-recoverable-storage" = "Trimmer Recoverable Storage"; // TRANSLATORS: Trimmer Removed "printer-state-reasons.trimmer-removed" = "Trimmer Removed"; // TRANSLATORS: Trimmer Resource Added "printer-state-reasons.trimmer-resource-added" = "Trimmer Resource Added"; // TRANSLATORS: Trimmer Resource Removed "printer-state-reasons.trimmer-resource-removed" = "Trimmer Resource Removed"; // TRANSLATORS: Trimmer Thermistor Failure "printer-state-reasons.trimmer-thermistor-failure" = "Trimmer Thermistor Failure"; // TRANSLATORS: Trimmer Timing Failure "printer-state-reasons.trimmer-timing-failure" = "Trimmer Timing Failure"; // TRANSLATORS: Trimmer Turned Off "printer-state-reasons.trimmer-turned-off" = "Trimmer Turned Off"; // TRANSLATORS: Trimmer Turned On "printer-state-reasons.trimmer-turned-on" = "Trimmer Turned On"; // TRANSLATORS: Trimmer Under Temperature "printer-state-reasons.trimmer-under-temperature" = "Trimmer Under Temperature"; // TRANSLATORS: Trimmer Unrecoverable Failure "printer-state-reasons.trimmer-unrecoverable-failure" = "Trimmer Unrecoverable Failure"; // TRANSLATORS: Trimmer Unrecoverable Storage Error "printer-state-reasons.trimmer-unrecoverable-storage-error" = "Trimmer Unrecoverable Storage Error"; // TRANSLATORS: Trimmer Warming Up "printer-state-reasons.trimmer-warming-up" = "Trimmer Warming Up"; // TRANSLATORS: Unknown "printer-state-reasons.unknown" = "Unknown"; // TRANSLATORS: Wrapper Added "printer-state-reasons.wrapper-added" = "Wrapper Added"; // TRANSLATORS: Wrapper Almost Empty "printer-state-reasons.wrapper-almost-empty" = "Wrapper Almost Empty"; // TRANSLATORS: Wrapper Almost Full "printer-state-reasons.wrapper-almost-full" = "Wrapper Almost Full"; // TRANSLATORS: Wrapper At Limit "printer-state-reasons.wrapper-at-limit" = "Wrapper At Limit"; // TRANSLATORS: Wrapper Closed "printer-state-reasons.wrapper-closed" = "Wrapper Closed"; // TRANSLATORS: Wrapper Configuration Change "printer-state-reasons.wrapper-configuration-change" = "Wrapper Configuration Change"; // TRANSLATORS: Wrapper Cover Closed "printer-state-reasons.wrapper-cover-closed" = "Wrapper Cover Closed"; // TRANSLATORS: Wrapper Cover Open "printer-state-reasons.wrapper-cover-open" = "Wrapper Cover Open"; // TRANSLATORS: Wrapper Empty "printer-state-reasons.wrapper-empty" = "Wrapper Empty"; // TRANSLATORS: Wrapper Full "printer-state-reasons.wrapper-full" = "Wrapper Full"; // TRANSLATORS: Wrapper Interlock Closed "printer-state-reasons.wrapper-interlock-closed" = "Wrapper Interlock Closed"; // TRANSLATORS: Wrapper Interlock Open "printer-state-reasons.wrapper-interlock-open" = "Wrapper Interlock Open"; // TRANSLATORS: Wrapper Jam "printer-state-reasons.wrapper-jam" = "Wrapper Jam"; // TRANSLATORS: Wrapper Life Almost Over "printer-state-reasons.wrapper-life-almost-over" = "Wrapper Life Almost Over"; // TRANSLATORS: Wrapper Life Over "printer-state-reasons.wrapper-life-over" = "Wrapper Life Over"; // TRANSLATORS: Wrapper Memory Exhausted "printer-state-reasons.wrapper-memory-exhausted" = "Wrapper Memory Exhausted"; // TRANSLATORS: Wrapper Missing "printer-state-reasons.wrapper-missing" = "Wrapper Missing"; // TRANSLATORS: Wrapper Motor Failure "printer-state-reasons.wrapper-motor-failure" = "Wrapper Motor Failure"; // TRANSLATORS: Wrapper Near Limit "printer-state-reasons.wrapper-near-limit" = "Wrapper Near Limit"; // TRANSLATORS: Wrapper Offline "printer-state-reasons.wrapper-offline" = "Wrapper Offline"; // TRANSLATORS: Wrapper Opened "printer-state-reasons.wrapper-opened" = "Wrapper Opened"; // TRANSLATORS: Wrapper Over Temperature "printer-state-reasons.wrapper-over-temperature" = "Wrapper Over Temperature"; // TRANSLATORS: Wrapper Power Saver "printer-state-reasons.wrapper-power-saver" = "Wrapper Power Saver"; // TRANSLATORS: Wrapper Recoverable Failure "printer-state-reasons.wrapper-recoverable-failure" = "Wrapper Recoverable Failure"; // TRANSLATORS: Wrapper Recoverable Storage "printer-state-reasons.wrapper-recoverable-storage" = "Wrapper Recoverable Storage"; // TRANSLATORS: Wrapper Removed "printer-state-reasons.wrapper-removed" = "Wrapper Removed"; // TRANSLATORS: Wrapper Resource Added "printer-state-reasons.wrapper-resource-added" = "Wrapper Resource Added"; // TRANSLATORS: Wrapper Resource Removed "printer-state-reasons.wrapper-resource-removed" = "Wrapper Resource Removed"; // TRANSLATORS: Wrapper Thermistor Failure "printer-state-reasons.wrapper-thermistor-failure" = "Wrapper Thermistor Failure"; // TRANSLATORS: Wrapper Timing Failure "printer-state-reasons.wrapper-timing-failure" = "Wrapper Timing Failure"; // TRANSLATORS: Wrapper Turned Off "printer-state-reasons.wrapper-turned-off" = "Wrapper Turned Off"; // TRANSLATORS: Wrapper Turned On "printer-state-reasons.wrapper-turned-on" = "Wrapper Turned On"; // TRANSLATORS: Wrapper Under Temperature "printer-state-reasons.wrapper-under-temperature" = "Wrapper Under Temperature"; // TRANSLATORS: Wrapper Unrecoverable Failure "printer-state-reasons.wrapper-unrecoverable-failure" = "Wrapper Unrecoverable Failure"; // TRANSLATORS: Wrapper Unrecoverable Storage Error "printer-state-reasons.wrapper-unrecoverable-storage-error" = "Wrapper Unrecoverable Storage Error"; // TRANSLATORS: Wrapper Warming Up "printer-state-reasons.wrapper-warming-up" = "Wrapper Warming Up"; // TRANSLATORS: Idle "printer-state.3" = "Idle"; // TRANSLATORS: Processing "printer-state.4" = "Processing"; // TRANSLATORS: Stopped "printer-state.5" = "Stopped"; // TRANSLATORS: Printer Uptime "printer-up-time" = "Printer Uptime"; "processing" = "processing"; // TRANSLATORS: Proof Print "proof-print" = "Proof Print"; // TRANSLATORS: Proof Print Copies "proof-print-copies" = "Proof Print Copies"; // TRANSLATORS: Punching "punching" = "Punching"; // TRANSLATORS: Punching Locations "punching-locations" = "Punching Locations"; // TRANSLATORS: Punching Offset "punching-offset" = "Punching Offset"; // TRANSLATORS: Punch Edge "punching-reference-edge" = "Punch Edge"; // TRANSLATORS: Bottom "punching-reference-edge.bottom" = "Bottom"; // TRANSLATORS: Left "punching-reference-edge.left" = "Left"; // TRANSLATORS: Right "punching-reference-edge.right" = "Right"; // TRANSLATORS: Top "punching-reference-edge.top" = "Top"; "request id is %s-%d (%d file(s))" = "request id is %s-%d (%d file(s))"; "request-id uses indefinite length" = "request-id uses indefinite length"; // TRANSLATORS: Requested Attributes "requested-attributes" = "Requested Attributes"; // TRANSLATORS: Retry Interval "retry-interval" = "Retry Interval"; // TRANSLATORS: Retry Timeout "retry-time-out" = "Retry Timeout"; // TRANSLATORS: Save Disposition "save-disposition" = "Save Disposition"; // TRANSLATORS: None "save-disposition.none" = "None"; // TRANSLATORS: Print and Save "save-disposition.print-save" = "Print and Save"; // TRANSLATORS: Save Only "save-disposition.save-only" = "Save Only"; // TRANSLATORS: Save Document Format "save-document-format" = "Save Document Format"; // TRANSLATORS: Save Info "save-info" = "Save Info"; // TRANSLATORS: Save Location "save-location" = "Save Location"; // TRANSLATORS: Save Name "save-name" = "Save Name"; "scheduler is not running" = "scheduler is not running"; "scheduler is running" = "scheduler is running"; // TRANSLATORS: Separator Sheets "separator-sheets" = "Separator Sheets"; // TRANSLATORS: Type of Separator Sheets "separator-sheets-type" = "Type of Separator Sheets"; // TRANSLATORS: Start and End Sheets "separator-sheets-type.both-sheets" = "Start and End Sheets"; // TRANSLATORS: End Sheet "separator-sheets-type.end-sheet" = "End Sheet"; // TRANSLATORS: None "separator-sheets-type.none" = "None"; // TRANSLATORS: Slip Sheets "separator-sheets-type.slip-sheets" = "Slip Sheets"; // TRANSLATORS: Start Sheet "separator-sheets-type.start-sheet" = "Start Sheet"; // TRANSLATORS: 2-Sided Printing "sides" = "2-Sided Printing"; // TRANSLATORS: Off "sides.one-sided" = "Off"; // TRANSLATORS: On (Portrait) "sides.two-sided-long-edge" = "On (Portrait)"; // TRANSLATORS: On (Landscape) "sides.two-sided-short-edge" = "On (Landscape)"; "stat of %s failed: %s" = "stat of %s failed: %s"; "status\t\tShow status of daemon and queue." = "status\t\tShow status of daemon and queue."; // TRANSLATORS: Status Message "status-message" = "Status Message"; // TRANSLATORS: Staple "stitching" = "Staple"; // TRANSLATORS: Stitching Angle "stitching-angle" = "Stitching Angle"; // TRANSLATORS: Stitching Locations "stitching-locations" = "Stitching Locations"; // TRANSLATORS: Staple Method "stitching-method" = "Staple Method"; // TRANSLATORS: Automatic "stitching-method.auto" = "Automatic"; // TRANSLATORS: Crimp "stitching-method.crimp" = "Crimp"; // TRANSLATORS: Wire "stitching-method.wire" = "Wire"; // TRANSLATORS: Stitching Offset "stitching-offset" = "Stitching Offset"; // TRANSLATORS: Staple Edge "stitching-reference-edge" = "Staple Edge"; // TRANSLATORS: Bottom "stitching-reference-edge.bottom" = "Bottom"; // TRANSLATORS: Left "stitching-reference-edge.left" = "Left"; // TRANSLATORS: Right "stitching-reference-edge.right" = "Right"; // TRANSLATORS: Top "stitching-reference-edge.top" = "Top"; "stopped" = "stopped"; // TRANSLATORS: Subject "subject" = "Subject"; // TRANSLATORS: Subscription Privacy Attributes "subscription-privacy-attributes" = "Subscription Privacy Attributes"; // TRANSLATORS: All "subscription-privacy-attributes.all" = "All"; // TRANSLATORS: Default "subscription-privacy-attributes.default" = "Default"; // TRANSLATORS: None "subscription-privacy-attributes.none" = "None"; // TRANSLATORS: Subscription Description "subscription-privacy-attributes.subscription-description" = "Subscription Description"; // TRANSLATORS: Subscription Template "subscription-privacy-attributes.subscription-template" = "Subscription Template"; // TRANSLATORS: Subscription Privacy Scope "subscription-privacy-scope" = "Subscription Privacy Scope"; // TRANSLATORS: All "subscription-privacy-scope.all" = "All"; // TRANSLATORS: Default "subscription-privacy-scope.default" = "Default"; // TRANSLATORS: None "subscription-privacy-scope.none" = "None"; // TRANSLATORS: Owner "subscription-privacy-scope.owner" = "Owner"; "system default destination: %s" = "system default destination: %s"; "system default destination: %s/%s" = "system default destination: %s/%s"; // TRANSLATORS: T33 Subaddress "t33-subaddress" = "T33 Subaddress"; // TRANSLATORS: To Name "to-name" = "To Name"; // TRANSLATORS: Transmission Status "transmission-status" = "Transmission Status"; // TRANSLATORS: Pending "transmission-status.3" = "Pending"; // TRANSLATORS: Pending Retry "transmission-status.4" = "Pending Retry"; // TRANSLATORS: Processing "transmission-status.5" = "Processing"; // TRANSLATORS: Canceled "transmission-status.7" = "Canceled"; // TRANSLATORS: Aborted "transmission-status.8" = "Aborted"; // TRANSLATORS: Completed "transmission-status.9" = "Completed"; // TRANSLATORS: Cut "trimming" = "Cut"; // TRANSLATORS: Cut Position "trimming-offset" = "Cut Position"; // TRANSLATORS: Cut Edge "trimming-reference-edge" = "Cut Edge"; // TRANSLATORS: Bottom "trimming-reference-edge.bottom" = "Bottom"; // TRANSLATORS: Left "trimming-reference-edge.left" = "Left"; // TRANSLATORS: Right "trimming-reference-edge.right" = "Right"; // TRANSLATORS: Top "trimming-reference-edge.top" = "Top"; // TRANSLATORS: Type of Cut "trimming-type" = "Type of Cut"; // TRANSLATORS: Draw Line "trimming-type.draw-line" = "Draw Line"; // TRANSLATORS: Full "trimming-type.full" = "Full"; // TRANSLATORS: Partial "trimming-type.partial" = "Partial"; // TRANSLATORS: Perforate "trimming-type.perforate" = "Perforate"; // TRANSLATORS: Score "trimming-type.score" = "Score"; // TRANSLATORS: Tab "trimming-type.tab" = "Tab"; // TRANSLATORS: Cut After "trimming-when" = "Cut After"; // TRANSLATORS: Every Document "trimming-when.after-documents" = "Every Document"; // TRANSLATORS: Job "trimming-when.after-job" = "Job"; // TRANSLATORS: Every Set "trimming-when.after-sets" = "Every Set"; // TRANSLATORS: Every Page "trimming-when.after-sheets" = "Every Page"; "unknown" = "unknown"; "untitled" = "untitled"; "variable-bindings uses indefinite length" = "variable-bindings uses indefinite length"; // TRANSLATORS: X Accuracy "x-accuracy" = "X Accuracy"; // TRANSLATORS: X Dimension "x-dimension" = "X Dimension"; // TRANSLATORS: X Offset "x-offset" = "X Offset"; // TRANSLATORS: X Origin "x-origin" = "X Origin"; // TRANSLATORS: Y Accuracy "y-accuracy" = "Y Accuracy"; // TRANSLATORS: Y Dimension "y-dimension" = "Y Dimension"; // TRANSLATORS: Y Offset "y-offset" = "Y Offset"; // TRANSLATORS: Y Origin "y-origin" = "Y Origin"; // TRANSLATORS: Z Accuracy "z-accuracy" = "Z Accuracy"; // TRANSLATORS: Z Dimension "z-dimension" = "Z Dimension"; // TRANSLATORS: Z Offset "z-offset" = "Z Offset"; "{service_domain} Domain name" = "{service_domain} Domain name"; "{service_hostname} Fully-qualified domain name" = "{service_hostname} Fully-qualified domain name"; "{service_name} Service instance name" = "{service_name} Service instance name"; "{service_port} Port number" = "{service_port} Port number"; "{service_regtype} DNS-SD registration type" = "{service_regtype} DNS-SD registration type"; "{service_scheme} URI scheme" = "{service_scheme} URI scheme"; "{service_uri} URI" = "{service_uri} URI"; "{txt_*} Value of TXT record key" = "{txt_*} Value of TXT record key"; "{} URI" = "{} URI"; "~/.cups/lpoptions file names default destination that does not exist." = "~/.cups/lpoptions file names default destination that does not exist."; cups-2.3.1/locale/cups.header000664 000765 000024 00000000775 13574721672 016173 0ustar00mikestaff000000 000000 # # Message catalog template for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # # Notes for Translators: # # The "checkpo" program located in the "locale" source directory can be used # to verify that your translations do not introduce formatting errors or other # problems. Run with: # # cd locale # ./checkpo cups_LL.po # # where "LL" is your locale. # cups-2.3.1/locale/cups_ca.po000664 000765 000024 00001221231 13574721672 016015 0ustar00mikestaff000000 000000 # # Catalan message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Àngel Mompó , 2011, 2012. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2012-09-29 11:21+0200\n" "Last-Translator: Àngel Mompó \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" msgid "\t\t(all)" msgstr "\t\t(tots)" msgid "\t\t(none)" msgstr "\t\t(cap)" #, c-format msgid "\t%d entries" msgstr "\t%d entrades" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tDesprés d'una fallada: continua" #, c-format msgid "\tAlerts: %s" msgstr "\tAlertes: %s" msgid "\tBanner required" msgstr "\tNecessita un bàner" msgid "\tCharset sets:" msgstr "\tConjunt de caràcters:" msgid "\tConnection: direct" msgstr "\tConnexió: directa" msgid "\tConnection: remote" msgstr "\tConnexió: remota" msgid "\tContent types: any" msgstr "\tTipus de contingut: qualsevol" msgid "\tDefault page size:" msgstr "\tMida de la pàgina per defecte:" msgid "\tDefault pitch:" msgstr "\tDensitat per defecte:" msgid "\tDefault port settings:" msgstr "\tConfiguració del port per defecte:" #, c-format msgid "\tDescription: %s" msgstr "\tDescripció: %s" msgid "\tForm mounted:" msgstr "\tFormularis muntats:" msgid "\tForms allowed:" msgstr "\tFormularis admesos:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tInterfície: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tInterfície: %s/ppd/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tUbicació: %s" msgid "\tOn fault: no alert" msgstr "\tEn cas de fallada: no avisis" msgid "\tPrinter types: unknown" msgstr "\tTipus d'impresores: desconeguts" #, c-format msgid "\tStatus: %s" msgstr "\tEstat: %s" msgid "\tUsers allowed:" msgstr "\tUsuaris permesos:" msgid "\tUsers denied:" msgstr "\tUsuaris sense permís:" msgid "\tdaemon present" msgstr "\tpresència del dimoni" msgid "\tno entries" msgstr "\tcap entrada" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tLa impressora és al dispositiu «%s» velocitat -1" msgid "\tprinting is disabled" msgstr "\tLa impressora està deshabilitada" msgid "\tprinting is enabled" msgstr "\tLa impressora està habilitada" #, c-format msgid "\tqueued for %s" msgstr "\ten cua per %s" msgid "\tqueuing is disabled" msgstr "\tla cua està deshabilitada" msgid "\tqueuing is enabled" msgstr "\tla cua està habilitada" msgid "\treason unknown" msgstr "\traó desconeguda" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" "\n" " RESULTAT DETALLAT DEL TEST DE CONFORMITAT" msgid " REF: Page 15, section 3.1." msgstr " REF: pàgina 15, secció 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: pàgina 15, secció 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: pàgina 19, secció 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: pàgina 20, secció 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: pàgina 27, secció 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: pàgina 42, secció 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: pàgines 16-17, secció 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: pàgines 42-45, secció 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: pàgines 45-46, secció 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: pàgines 48-49, secció 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: pàgines 52-54, secció 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr " %-39.39s %.0f bytes" #, c-format msgid " PASS Default%s" msgstr " VALIDA Default%s" msgid " PASS DefaultImageableArea" msgstr " VALIDA DefaultImageableArea" msgid " PASS DefaultPaperDimension" msgstr " VALIDA DefaultPaperDimension" msgid " PASS FileVersion" msgstr " VALIDA FileVersion" msgid " PASS FormatVersion" msgstr " VALIDA FileVersion" msgid " PASS LanguageEncoding" msgstr " VALIDA LanguageEncoding" msgid " PASS LanguageVersion" msgstr " VALIDA LanguageVersion" msgid " PASS Manufacturer" msgstr " VALIDA Manufacturer" msgid " PASS ModelName" msgstr " VALIDA ModelName" msgid " PASS NickName" msgstr " VALIDA NickName" msgid " PASS PCFileName" msgstr " VALIDA PCFileName" msgid " PASS PSVersion" msgstr " VALIDA PSVersion" msgid " PASS PageRegion" msgstr " VALIDA PageRegion" msgid " PASS PageSize" msgstr " VALIDA PageSize" msgid " PASS Product" msgstr " VALIDA Product" msgid " PASS ShortNickName" msgstr " VALIDA ShortNickName" #, c-format msgid " WARN %s has no corresponding options." msgstr " AVÍS %s no té les opcions corresponents." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " AVÍS %s té un prefixe comú amb %s\n" " REF: pàgina 15, secció 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" " AVÍS La paraula clau %s de l'opció dúplex pot no funcionar com " "s'espera i s'hauria de dir Duplex.\n" " REF: pàgina 122, secció 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr "" " AVÍS El fitxer conté una barreja de CR, LF, i CR LF com a finals " "de línia." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " AVÍS Es requereix un LanguageEncoding segons les espec. del PPD " "4.3\n" " REF: pàgines 56-57, secció 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " AVÍS La línia %d només conté espais en blanc." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" " AVÍS El fabricant requereix les espec. del PPD 4.3.\n" " REF: pàgines 58-59, secció 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " AVÍS Els fitxers PPD que no són del Windows han de fer servir " "només LF com a final de línia, no CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " AVÍS La versió del PPD %.1f és obsoleta!\n" " REF: pàgina 42, secció 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" " AVÍS El PCFileName és més llarg de 8.3 i viola les espec. del " "PPD.\n" " REF: pàgines 61-62, secció 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" " AVÍS El PCFileName és més llarg de 8.3 i viola les espec. del " "PPD.\n" " REF: pàgines 61-62, secció 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" " AVÍS Els protocols contenen el PJL però els atributs del JCL no " "s'han definit.\n" " REF: pàgines 78-79, secció 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" " AVÍS Es protocols contenen tant el PJL com el BCP; s'esperava el " "TBCP.\n" " REF: pàgines 78-79, secció 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" " AVÍS Es requereix un ShortNickName segons les espec.del PPD 4.3.\n" " REF: pàgines 64-65, secció 5.3." #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s «%s %s» entra en conflicte amb «%s %s»\n" " (restricció=«%s %s %s %s»)." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s no existeix." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s el fitxer «%s» fa un ús incorrecte de les majúscules." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" " %s Mala %s elecció %s!\n" " REF: pàgina 122, secció 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s UTF-8 incorrecte «%s» a la traducció de l'opció %s, elecció %s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr " %s UTF-8 Incorrecte «%s» a la traducció de l'opció %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s Valor incorrecte del cupsFilter «%s»." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s Valor incorrecte del cupsFilter2 «%s»" #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s cupsICCProfile incorrecte %s." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s Valor de la cupsPreFilter incorrecte «%s»." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s cupsUIConstraints incorrecte %s: «%s»" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s language incorrecte «%s»." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s Permisos del fitxer %s incorrectes «%s»." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s %s Està mal escrit: hauria de ser %s." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr " %s No hi pot haver APScanAppPath i APScanAppBundleID alhora." #, c-format msgid " %s Default choices conflicting." msgstr " %s Conflictes amb les opcions per defecte." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s cupsUIConstraints buit %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr " %s Falta la traducció de «%s» per l'opció %s, elecció %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s Falta la traducció de «%s» per l'opció %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s Falta el fitxer %s «%s»." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" " %s Falta l'opció PageRegion NECESSÀRIA .\n" " REF: pàgina 100, secció 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" " %s Falta l'opció PageSize NECESSÀRIA.\n" " REF: pàgina 99, secció 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Falta l'elecció *%s %s a UIConstraints «*%s %s *%s %s»." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Falta l'elecció *%s %s a cupsUIConstraints %s: «%s»" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr " %s Falta el cupsUIResolver %s" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr " %s Falta l'opció %s a UIConstraints «*%s %s *%s %s»." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr " %s Falta l'opció %s a cupsUIConstraints %s: «%s»" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr " %s No s'ha inclòs cap traducció de base «%s» al fitxer." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" " %s NECESSARI %s no defineix l'eleció «Cap»!\n" " REF: pàgina 122, secció 5.17" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr " %s Mida \"%s\" definida per %s però no per %s." #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr " %s Mida \"%s\" té unes dimensions inesperades (%gx%g)." #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr " %s Mida «%s» hauria de ser «%s»." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr " %s Mida \"%s\" hauria de ser el nom estàndard d'Adobe «%s»." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr " %s cupsICCProfile %s el valor resum (hash) col·lideix amb %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s entra en bucle." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" " %s cupsUIResolver %s no llista com a mínim dues opcions diferents." #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" " **ERROR** %s ha de ser 1284DeviceID!\n" " REF: pàgina 72, secció 5.5" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" " **ERROR** Default%s incorrecte %s\n" " REF: pàgina 40, secció 4.5." #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" " **ERROR** DefaultImageableArea incorrecte %s\n" " REF: pàgina 102, secció 5.15." #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" " **ERROR** DefaultPaperDimension incorrecte %s\n" " REF: pàgina 103, secció 5.15." #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **ERROR** FileVersion incorrecte «%s»\n" " REF: pàgina 56, secció 5.3." #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" " **ERROR** FormatVersion incorrecte «%s»\n" " REF: pàgina 56, secció 5.3." msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" " **ERROR** atribut de JobPatchFile incorrecte al fitxer\n" " REF: pàgina 24, secció 3.4." #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr " **ERROR** LanguageEncoding incorrecte %s: ha de ser ISOLatin1." #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr " **ERROR** LanguageVersion incorrecta %s: ha de ser anglès." #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" " **ERROR** Manufacturer incorrecte (hauria de ser «%s»)\n" " REF: pàgina 211, taula D.1." #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" " **ERROR** ModelName incorrecte - no es permet «%c» a la cadena.\n" " REF: pàgines 59-60, secció 5.3." msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" " **ERROR** PSVersion incorrecte - no és «(cadena) enter».\n" " REF: pàgines 62-64, secció 5.3." msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" " **ERROR** Product incorrecte - no és «(cadena)».\n" " REF: pàgina 62, secció 5.3." msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" " **ERROR** ShortNickName incorrecte - més llarg de 31 caràcters.\n" " REF: pàgines 64-65, secció 5.3." #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" " **ERROR** Elecció %s incorrecta %s\n" " REF: pàgina 84, secció 5.9" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" " **ERROR** El codi de l'opció per defecte no es pot interpretar: %s" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" " **ERROR** La traducció per defecte de l'opció %s elecció %s conté " "caràcters de 8 bits." #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" " **ERROR** La traducció per defecte de l'opció %s conté caràcters de 8 " "bits." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" " **ERROR** Els noms dels grups %s i %s només es diferencien en les " "majúscules." #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" " **ERROR** Coincidències múltiples de l'opció %s nom de l'elecció %s." #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" " **ERROR** L'opció %s noms de les opcions %s i %s només es diferencien " "per les majúscules." #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" " **ERROR** Els noms de les opcions %s i %s només es diferencien per " "les majúscules." #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" " **ERROR** ES NECESSITA Default%s\n" " REF: pàgina 40, secció 4.5." msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" " **ERROR** ES NECESSITA DefaultImageableArea\n" " REF: pàgina 102, secció 5.15." msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" " **ERROR** ES NECESSITA DefaultPaperDimension\n" " REF: pàgina 103, secció 5.15." msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" " **ERROR** ES NECESSITA FileVersion\n" " REF: pàgina 56, secció 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" " **ERROR** ES NECESSITA FormatVersion\n" " REF: pàgina 56, secció 5.3." #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" " **ERROR** ES NECESSITA ImageableArea per PageSize %s\n" " REF: pàgina 41, secció 5.\n" " REF: pàgina 102, secció 5.15." msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" " **ERROR** ES NECESSITA LanguageEncoding\n" " REF: pàgines 56-57, secció 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" " **ERROR** ES NECESSITA LanguageVersion\n" " REF: pàgines 57-58, secció 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" " **ERROR** ES NECESSITA Manufacturer\n" " REF: pàgines 58-59, secció 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" " **ERROR** ES NECESSITA ModelName\n" " REF: pàgines 59-60, secció 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" " **ERROR** ES NECESSITA NickName\n" " REF: pàgina 60, secció 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" " **ERROR** ES NECESSITA PCFileName\n" " REF: pàgines 61-62, secció 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" " **ERROR** ES NECESSITA PSVersion\n" " REF: pàgines 62-64, secció 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" " **ERROR** ES NECESSITA PageRegion\n" " REF: pàgina 100, secció 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" " **ERROR** ES NECESSITA PageSize\n" " REF: pàgina 41, secció 5.\n" " REF: pàgina 99, secció 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" " **ERROR** ES NECESSITA PageSize\n" " REF: pàgines 99-100, secció 5.14." #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" " **ERROR** ES NECESSITA PaperDimension per PageSize %s\n" " REF: pàgina 41, secció 5.\n" " REF: pàgina 103, secció 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" " **ERROR** ES NECESSITA Product\n" " REF: pàgina 62, secció 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" " **FAIL** ES NECESSITA ShortNickName\n" " REF: pàgina 64-65, secció 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr " **ERROR** No es pot obrir el fitxer PPD - %s a la línia %d." #, c-format msgid " %d ERRORS FOUND" msgstr " %d S'HAN TROBAT ERRORS" msgid " NO ERRORS FOUND" msgstr " NO S'HA TROBAT CAP ERROR" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Final de línia amb CR (Mac OS 9)." msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Final de línia amb CR + LF (Windows)." msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" msgid " --list-filters List filters that will be used." msgstr "" msgid " -D Remove the input file when finished." msgstr " -D Elimina el fitxer d'entrada quan ha acabat." msgid " -D name=value Set named variable to value." msgstr " -D nom=valor Estableix la variable indicada al valor." msgid " -I include-dir Add include directory to search path." msgstr " -I dir-inclòs Afegeix el directori inclòs al camí de cerca." msgid " -P filename.ppd Set PPD file." msgstr " -P nomfitxer.ppd Estableix el fitxer PPD." msgid " -U username Specify username." msgstr " -U nomusuari Especifica un nom d'usuari." msgid " -c catalog.po Load the specified message catalog." msgstr " -c catàleg.po Carrega el catàleg de missatges indicat." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" msgid " -d output-dir Specify the output directory." msgstr " -d dir-sortida Especifica el directori de sortida." msgid " -d printer Use the named printer." msgstr " -d impressora Fa servir la impressora indicada." msgid " -e Use every filter from the PPD file." msgstr " -e Fa servir tots els filtres del fitxer PPD." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i tipus/mime Estableix el tipus MIME d'entrada (auto-typed si " "no s'especifica)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" " -j id-feina[,N] Filtra el fitxer N a la feina especificada (el " "fitxer per defecte és 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr "" " -l idioma[,idioma,...] Especifica els idiomes de sortida (locale)." msgid " -m Use the ModelName value as the filename." msgstr "" " -m Fa servir el valor de ModelName com a nom de " "fitxer." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m tipus/mime Estableix el tipus MIME de sortida (application/" "pdf si no s'especifica)." msgid " -n copies Set number of copies." msgstr " -n còpies Estableix el nombre de còpies." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o nomfitxer.drv Estableix el fitxer d'informació del controlador " "(ppdi.drv si no s'especifica)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o nomfitxer.ppd[.gz] Estableix el fitxer de sortida (stdout si no " "s'especifica)." msgid " -o name=value Set option(s)." msgstr " -o nom=valor Estableix les opcions." msgid " -p filename.ppd Set PPD file." msgstr " -p nomfitxer.ppd Estableix el fitxer PPD." msgid " -t Test PPDs instead of generating them." msgstr " -t Prova els PPDs en comptes de generar-los." msgid " -t title Set title." msgstr " -t títol Estableix el títol." msgid " -u Remove the PPD file when finished." msgstr " -u Elimina el fitxer PPD quan ha acabat." msgid " -v Be verbose." msgstr " -v Mode detallat." msgid " -z Compress PPD files using GNU zip." msgstr "" " -z Comprimeix els fitxers PPD fent servir el zip de " "GNU." msgid " FAIL" msgstr " ERROR" msgid " PASS" msgstr " VÀLID" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes" #, c-format msgid "%d x %d mm" msgstr "" #, c-format msgid "%g x %g \"" msgstr "" #, c-format msgid "%s (%s)" msgstr "" #, c-format msgid "%s (%s, %s)" msgstr "" #, c-format msgid "%s (Borderless)" msgstr "" #, c-format msgid "%s (Borderless, %s)" msgstr "" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "" #, c-format msgid "%s accepting requests since %s" msgstr "%s accepta peticions des de %s" #, c-format msgid "%s cannot be changed." msgstr "%s no es pot canviar." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s no està implementat en la versió del CUPS del lpc." #, c-format msgid "%s is not ready" msgstr "%s no està preparada" #, c-format msgid "%s is ready" msgstr "%s està preparada" #, c-format msgid "%s is ready and printing" msgstr "%s està preparada i imprimeix" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s identificador-feina usuari títol còpies opcions [fitxer]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s no accepta peticions des de %s -" #, c-format msgid "%s not supported." msgstr "no és compatible amb l'ús de %s." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s accepta peticions des de %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s no accepta peticions des de %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [feina %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s ha fallat: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "" #, c-format msgid "%s: Don't know what to do." msgstr "%s: no sé que fer." #, c-format msgid "%s: Error - %s" msgstr "" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: error - els noms de les variables d'entorn %s tenen un destí inexistent " "«%s»." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" #, c-format msgid "%s: Error - bad job ID." msgstr "%s: error - ID de la feina incorrecte." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: error - no es poden imprimir fitxers i modificar tasques al mateix temps." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: error - no es pot imprimir des d'stdin si s'indiquen els fitxers o " "l'identificador de la feina." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" "%s: error - s'esperava un conjunt de caràcters després de l'opció «-S»." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: error - s'esperava un tipus de contingut després de l'opció «-T»." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: error - s'esperaven còpies després de l'opció «-#»." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: error - s'esperaven còpies després de l'opció «-n»." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: error - s'esperava un destí després de l'opció «-P»." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: error - s'esperava un destí després de l'opció «-d»." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: error - s'esperava un formulari després de l'opció «-f»." #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: error - s'esperava un nom per pausa després de l'opció «-H»." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: error - s'esperava el nom de l'amfitrió després de l'opció «-H»." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: error - s'esperava el nom de l'amfitrió després de l'opció «-h»." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: error - s'esperava una llista de modes després de l'opció «-y»." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: error - s'esperava un nom després de l'opció «-%c»." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: error - s'esperava opció=valor després de l'opció «-o»." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: error - s'esperava una llista de pàgines després de l'opció «-P»." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: error - s'esperava una prioritat després de l'opció «-%c»." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: error - s'esperava una explicació després de l'opció «-r»." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: error - s'esperava un títol després de l'opció «-t»." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: error - s'esperava un nom d'usuari després de l'opció «-U»." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: error - s'esperava un nom d'usuari després de l'opció «-u»." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: error - s'esperava un valor després de l'opció «-%c»." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: error - es requereix «completed», «not-completed», o «all» després de " "l'opció «-W»." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: error - no hi ha un destí per defecte." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: error - la prioritat ha de ser entre 1 i 100." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: error - el planificador no està responent." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: error - massa fitxers - «%s»." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: error - no es pot accedir a «%s» - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "%s: error - no es pot posar en cua des d'stdin - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: error - el destí «%s» és desconegut." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: error - el destí «%s/%s» és desconegut." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: error - l'opció «%c» és desconeguda." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: error - l'opció «%s» és desconeguda." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: s'esperava l'ID d'una feina després de l'opció «-i»." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: el nom del destí no és vàlid a la llista «%s»." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: la cadena del filtre «%s» no és vàlida." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "" #, c-format msgid "%s: Missing version for \"-V\"." msgstr "" #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: es necessita l'ID de la feina («-i jobid») abans de «-H restart»." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: no hi ha cap filtre per convertir de %s/%s a %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: ha fallat l'operació: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: ho sento, no està compilada la compatibilitat pel xifrat." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: no es pot connectar al servidor." #, c-format msgid "%s: Unable to contact server." msgstr "%s: no es pot contactar amb el servidor." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: no es pot determinar el tips de MIME de «%s»." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: no es pot obrir %s: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: no es pot obrir el fitxer PPD: %s a la línia %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: no es pot llegir la base de dades MIME de «%s» o «%s»." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: el destí «%s» és desconegut." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: es destí de tipus MIME %s/%s és desconegut." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: l'opció «%c» és desconeguda." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "" #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "" #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: la font del tipus de MIME %s/%s és desconeguda." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" "%s: avís - no és compatible amb l'ús del modificador de format «%c» - el " "resultat pot no ser correcte." #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: avís - s'ignora l'opció del grup de caràcters." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: avís - s'ignora l'opció de tipus de contingut." #, c-format msgid "%s: Warning - form option ignored." msgstr "%s: avís - s'ignora l'opció de formulari." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: avís - s'ignora l'opció de mode." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 polzada/seg." msgid "1.25x0.25\"" msgstr "1.25x0.25\"" msgid "1.25x2.25\"" msgstr "1.25x2.25\"" msgid "1.5 inch/sec." msgstr "1.5 polzades/seg." msgid "1.50x0.25\"" msgstr "1.50x0.25\"" msgid "1.50x0.50\"" msgstr "1.50x0.50\"" msgid "1.50x1.00\"" msgstr "1.50x1.00\"" msgid "1.50x2.00\"" msgstr "1.50x2.00\"" msgid "10" msgstr "10" msgid "10 inches/sec." msgstr "10 polzades/seg." msgid "10 x 11" msgstr "10 x 11" msgid "10 x 13" msgstr "10 x 13" msgid "10 x 14" msgstr "10 x 14" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/seg." msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 polzades/seg." msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 polzades/seg." msgid "12 x 11" msgstr "12 x 11" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/seg." msgid "120x60dpi" msgstr "120x60ppp" msgid "120x72dpi" msgstr "120x72ppp" msgid "13" msgstr "13" msgid "136dpi" msgstr "136ppp" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/seg." msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/seg." msgid "150dpi" msgstr "150ppp" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180ppp" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 polzades/seg." msgid "2-Sided Printing" msgstr "Impressió a doble cara" msgid "2.00x0.37\"" msgstr "2.00x0.37\"" msgid "2.00x0.50\"" msgstr "2.00x0.50\"" msgid "2.00x1.00\"" msgstr "2.00x1.00\"" msgid "2.00x1.25\"" msgstr "2.00x1.25\"" msgid "2.00x2.00\"" msgstr "2.00x2.00\"" msgid "2.00x3.00\"" msgstr "2.00x3.00\"" msgid "2.00x4.00\"" msgstr "2.00x4.00\"" msgid "2.00x5.50\"" msgstr "2.00x5.50\"" msgid "2.25x0.50\"" msgstr "2.25x0.50\"" msgid "2.25x1.25\"" msgstr "2.25x1.25\"" msgid "2.25x4.00\"" msgstr "2.25x4.00\"" msgid "2.25x5.50\"" msgstr "2.25x5.50\"" msgid "2.38x5.50\"" msgstr "2.38x5.50\"" msgid "2.5 inches/sec." msgstr "2.5 polzades/seg." msgid "2.50x1.00\"" msgstr "2.50x1.00\"" msgid "2.50x2.00\"" msgstr "2.50x2.00\"" msgid "2.75x1.25\"" msgstr "2.75x1.25\"" msgid "2.9 x 1\"" msgstr "2.9 x 1\"" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/seg." msgid "200 mm/sec." msgstr "200 mm/seg." msgid "203dpi" msgstr "203ppp" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "Sèrie de 24 pins" msgid "240x72dpi" msgstr "240x72ppp" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/seg." msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 polzades/seg." msgid "3 x 5" msgstr "3 x 5" msgid "3.00x1.00\"" msgstr "3.00x1.00\"" msgid "3.00x1.25\"" msgstr "3.00x1.25\"" msgid "3.00x2.00\"" msgstr "3.00x2.00\"" msgid "3.00x3.00\"" msgstr "3.00x3.00\"" msgid "3.00x5.00\"" msgstr "3.00x5.00\"" msgid "3.25x2.00\"" msgstr "3.25x2.00\"" msgid "3.25x5.00\"" msgstr "3.25x5.00\"" msgid "3.25x5.50\"" msgstr "3.25x5.50\"" msgid "3.25x5.83\"" msgstr "3.25x5.83\"" msgid "3.25x7.83\"" msgstr "3.25x7.83\"" msgid "3.5 x 5" msgstr "3.5 x 5" msgid "3.5\" Disk" msgstr "Disc de 3.5\"" msgid "3.50x1.00\"" msgstr "3.5x1.00\"" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/seg." msgid "300 mm/sec." msgstr "300 mm/seg." msgid "300dpi" msgstr "300ppp" msgid "35" msgstr "35" msgid "360dpi" msgstr "360ppp" msgid "360x180dpi" msgstr "360x180ppp" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 polzades/seg." msgid "4.00x1.00\"" msgstr "4.00x1.00\"" msgid "4.00x13.00\"" msgstr "4.00x13.00\"" msgid "4.00x2.00\"" msgstr "4.00x2.00\"" msgid "4.00x2.50\"" msgstr "4.00x2.50\"" msgid "4.00x3.00\"" msgstr "4.00x3.00\"" msgid "4.00x4.00\"" msgstr "4.00x4.00\"" msgid "4.00x5.00\"" msgstr "4.00x5.00\"" msgid "4.00x6.00\"" msgstr "4.00x6.00\"" msgid "4.00x6.50\"" msgstr "4.00x6.50\"" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/seg." msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 polzades/seg." msgid "5 x 7" msgstr "15 x 11" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 polzades/seg." msgid "6.00x1.00\"" msgstr "6.00x1.00\"" msgid "6.00x2.00\"" msgstr "6.00x2.00\"" msgid "6.00x3.00\"" msgstr "6.00x3.00\"" msgid "6.00x4.00\"" msgstr "6.00x4.00\"" msgid "6.00x5.00\"" msgstr "6.00x5.00\"" msgid "6.00x6.00\"" msgstr "6.00x6.00\"" msgid "6.00x6.50\"" msgstr "6.00x6.50\"" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/seg." msgid "600dpi" msgstr "600ppp" msgid "60dpi" msgstr "60ppp" msgid "60x72dpi" msgstr "60x72ppp" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 polzades/seg." msgid "7 x 9" msgstr "7 x 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 polzades/seg." msgid "8 x 10" msgstr "8 x 10" msgid "8.00x1.00\"" msgstr "8.00x1.00\"" msgid "8.00x2.00\"" msgstr "8.00x2.00\"" msgid "8.00x3.00\"" msgstr "8.00x3.00\"" msgid "8.00x4.00\"" msgstr "8.00x4.00\"" msgid "8.00x5.00\"" msgstr "8.00x5.00\"" msgid "8.00x6.00\"" msgstr "8.00x6.00\"" msgid "8.00x6.50\"" msgstr "8.00x6.50\"" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/seg." msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 polzades/seg." msgid "9 x 11" msgstr "9 x 11" msgid "9 x 12" msgstr "9 x 12" msgid "9-Pin Series" msgstr "Sèrie de 9 pins" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Comanda d'ajuda no vàlida desconeguda." #, c-format msgid "A class named \"%s\" already exists." msgstr "Ja existeix una classe anomenada «%s»." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Ja existeix una impressora anomenada «%s»." msgid "A0" msgstr "A0" msgid "A0 Long Edge" msgstr "A0 costat llarg" msgid "A1" msgstr "A1" msgid "A1 Long Edge" msgstr "A1 costat llarg" msgid "A10" msgstr "A10" msgid "A2" msgstr "A2" msgid "A2 Long Edge" msgstr "A2 costat llarg" msgid "A3" msgstr "A3" msgid "A3 Long Edge" msgstr "A3 costat llarg" msgid "A3 Oversize" msgstr "A3 estès" msgid "A3 Oversize Long Edge" msgstr "A3 estès pel costat llarg" msgid "A4" msgstr "A4" msgid "A4 Long Edge" msgstr "A4 costat llarg" msgid "A4 Oversize" msgstr "A4 estès" msgid "A4 Small" msgstr "A4 reduït" msgid "A5" msgstr "A5" msgid "A5 Long Edge" msgstr "A5 costat llarg" msgid "A5 Oversize" msgstr "A5 estès" msgid "A6" msgstr "A6" msgid "A6 Long Edge" msgstr "A6 costat llarg" msgid "A7" msgstr "A7" msgid "A8" msgstr "A8" msgid "A9" msgstr "A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C costat llarg" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D costat llarg" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E costat llarg" msgid "Accept Jobs" msgstr "Accepta feines" msgid "Accepted" msgstr "Acceptada" msgid "Add Class" msgstr "Afegeix una classe" msgid "Add Printer" msgstr "Afegeix una impressora" msgid "Address" msgstr "Adreça" msgid "Administration" msgstr "Administració" msgid "Always" msgstr "Sempre" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Aplicador" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" "S'ha intentat posar l'estat de la impressora %s a un valor incorrecte %d." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Grups d'atribut desordenats (%x < %x)." msgid "B0" msgstr "B0" msgid "B1" msgstr "B1" msgid "B10" msgstr "B10" msgid "B2" msgstr "B2" msgid "B3" msgstr "B3" msgid "B4" msgstr "B4" msgid "B5" msgstr "B5" msgid "B5 Oversize" msgstr "A5 estès" msgid "B6" msgstr "B6" msgid "B7" msgstr "B7" msgid "B8" msgstr "B8" msgid "B9" msgstr "B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "El punter de dests NULL és incorrecte" msgid "Bad OpenGroup" msgstr "La OpenGroup és incorrecta" msgid "Bad OpenUI/JCLOpenUI" msgstr "La OpenUI/JCLOpenUI és incorrecta" msgid "Bad OrderDependency" msgstr "La OrderDependency és incorrecta" msgid "Bad PPD cache file." msgstr "El fitxer PPD de memòria cau és incorrecte." msgid "Bad PPD file." msgstr "" msgid "Bad Request" msgstr "La petició és incorrecta" msgid "Bad SNMP version number" msgstr "El número de versió del SNMP és incorrecte" msgid "Bad UIConstraints" msgstr "La UIConstraints és incorrecta" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "" #, c-format msgid "Bad copies value %d." msgstr "El valor de copies %d és incorrecte" msgid "Bad custom parameter" msgstr "El paràmetre personalitzat és incorrecte" #, c-format msgid "Bad device-uri \"%s\"." msgstr "La device-uri «%s» és incorrecta." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "L'esquema «%s» de la device-uri és incorrecte." #, c-format msgid "Bad document-format \"%s\"." msgstr "La document-format «%s» és incorrecta." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "La document-format-default «%s» és incorrecta." msgid "Bad filename buffer" msgstr "El nom del fitxer de la memòria cau és incorrecte" msgid "Bad hostname/address in URI" msgstr "" #, c-format msgid "Bad job-name value: %s" msgstr "" msgid "Bad job-name value: Wrong type or count." msgstr "" msgid "Bad job-priority value." msgstr "El valor de la job-priority és incorrecte." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "El valor «%s» de la job-sheets és incorrecte." msgid "Bad job-sheets value type." msgstr "El tipus de valor de la job-sheets és incorrecte." msgid "Bad job-state value." msgstr "El valor de la job-state és incorrecte." #, c-format msgid "Bad job-uri \"%s\"." msgstr "La job-uri «%s» és incorrecta." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "La notify-pull-method «%s» és incorrecta." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "La notify-recipient-uri «%s» és incorrecta." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "El valor de number-up %d és incorrecte." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Els valors de page-ranges %d-%d són incorrectes." msgid "Bad port number in URI" msgstr "" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "La port-monitor «%s» és incorrecta." #, c-format msgid "Bad printer-state value %d." msgstr "El valor %d de printer-state és incorrecte." msgid "Bad printer-uri." msgstr "" #, c-format msgid "Bad request ID %d." msgstr "L'identificador %d de la sol·licitud és incorrecte." #, c-format msgid "Bad request version number %d.%d." msgstr "El número de versió %d.%d de la sol·licitud és incorrecte." msgid "Bad resource in URI" msgstr "" msgid "Bad scheme in URI" msgstr "" msgid "Bad username in URI" msgstr "" msgid "Bad value string" msgstr "El valor de la cadena és incorrecte" msgid "Bad/empty URI" msgstr "" msgid "Banners" msgstr "Bàners" msgid "Bond Paper" msgstr "Paper de valors" msgid "Booklet" msgstr "" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "S'esperava un booleà per l'opció waiteof «%s»." msgid "Buffer overflow detected, aborting." msgstr "S'ha detectat un desbordament la memòria cau. S'interromp." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "Impressora d'etiquetes CPCL" msgid "Cancel Jobs" msgstr "" msgid "Canceling print job." msgstr "Es cancel·la feina." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "No es pot compartir una impressora remota sobre Kerberos." msgid "Cassette" msgstr "Classet" msgid "Change Settings" msgstr "Canvia la configuració" #, c-format msgid "Character set \"%s\" not supported." msgstr "No es permet l'ús del grup de caràcters «%s»." msgid "Classes" msgstr "Classes" msgid "Clean Print Heads" msgstr "Neteja els capçals de la impressora" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job no permet l'ús de l'atribut job-uri." msgid "Color" msgstr "Color" msgid "Color Mode" msgstr "Mode de color" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Les ordres han de ser abreujades. Poden ser:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Els noms de comunitat tenen longitud indefinida" msgid "Connected to printer." msgstr "S'ha connectat a la impressora." msgid "Connecting to printer." msgstr "Es connecta a la impressora." msgid "Continue" msgstr "Continua" msgid "Continuous" msgstr "Contínua" msgid "Control file sent successfully." msgstr "El fitxer de control s'ha enviat correctament." msgid "Copying print data." msgstr "Es copien les dades d'impressió." msgid "Created" msgstr "Creat" msgid "Credentials do not validate against site CA certificate." msgstr "" msgid "Credentials have expired." msgstr "" msgid "Custom" msgstr "Personalitzat" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Tall" msgid "Cutter" msgstr "Ganiveta" msgid "Dark" msgstr "Fosc" msgid "Darkness" msgstr "Foscor" msgid "Data file sent successfully." msgstr "El fitxer de dades s'ha enviat correctament." msgid "Deep Color" msgstr "" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Elimina la classe" msgid "Delete Printer" msgstr "Elimina la impressora" msgid "DeskJet Series" msgstr "Sèrie Deskjet" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "El Destí «%s» no accepta tasques." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Dispositiu: uri = %s\n" " classe = %s\n" " informació = %s\n" " fabricant i model = %s\n" " identificador = %s\n" " ubicació = %s" msgid "Direct Thermal Media" msgstr "Paper per impressió tèrmica directa" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "El directori «%s» conté un camí relatiu." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "El directori «%s» té permisos que no són segurs (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "El directori «%s» és un fitxer." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "El directori «%s» no està disponible: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "El directori «%s» té els permisos correctes (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Desabilitat" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "No s'ha trobat el document #%d a la feina #%d." msgid "Draft" msgstr "" msgid "Duplexer" msgstr "Unitat d'impressió a dues cares" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "Impressora d'etiquetes EPL1" msgid "EPL2 Label Printer" msgstr "Impressora d'etiquetes EPL2" msgid "Edit Configuration File" msgstr "Edita el fitxer de configuració" msgid "Encryption is not supported." msgstr "" #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "S'està acabant el bàner" msgid "English" msgstr "Anglès" 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 "" "Introduïu el vostre nom d'usuari i contrasenya o el nom d'usuari i la " "contrasenya de root per accedir a aquesta pàgina. Si feu servir " "l'autenticació Kerberos, assegureu-vos de tenir un tiquet Kerberos que sigui " "vàlid." msgid "Envelope #10" msgstr "" msgid "Envelope #11" msgstr "Sobre #11" msgid "Envelope #12" msgstr "Sobre #12" msgid "Envelope #14" msgstr "Sobre #14" msgid "Envelope #9" msgstr "Sobre #9" msgid "Envelope B4" msgstr "Sobre B4" msgid "Envelope B5" msgstr "Sobre B5" msgid "Envelope B6" msgstr "Sobre B6" msgid "Envelope C0" msgstr "Sobre C0" msgid "Envelope C1" msgstr "Sobre C1" msgid "Envelope C2" msgstr "Sobre C2" msgid "Envelope C3" msgstr "Sobre C3" msgid "Envelope C4" msgstr "Sobre C4" msgid "Envelope C5" msgstr "Sobre C5" msgid "Envelope C6" msgstr "Sobre C6" msgid "Envelope C65" msgstr "Sobre C65" msgid "Envelope C7" msgstr "Sobre C7" msgid "Envelope Choukei 3" msgstr "Sobre Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Sobre Choukei 3 costat llarg" msgid "Envelope Choukei 4" msgstr "Sobre Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Sobre Choukei 4 costat llarg" msgid "Envelope DL" msgstr "Sobre DL" msgid "Envelope Feed" msgstr "Alimentació de sobres" msgid "Envelope Invite" msgstr "Sobre d'invitació" msgid "Envelope Italian" msgstr "Sobre italià" msgid "Envelope Kaku2" msgstr "Sobre Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Sobre Kaku2 costat llarg" msgid "Envelope Kaku3" msgstr "Sobre Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Sobre Kaku3 costat llarg" msgid "Envelope Monarch" msgstr "Sobre monarch" msgid "Envelope PRC1" msgstr "" msgid "Envelope PRC1 Long Edge" msgstr "Sobre PRC1 costat llarg" msgid "Envelope PRC10" msgstr "Sobre PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Sobre PRC10 costat llarg" msgid "Envelope PRC2" msgstr "Sobre PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Sobre PRC2 costat llarg" msgid "Envelope PRC3" msgstr "Sobre PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Sobre PRC3 costat llarg" msgid "Envelope PRC4" msgstr "Sobre PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Sobre PRC4 costat llarg" msgid "Envelope PRC5 Long Edge" msgstr "Sobre PRC5 costat llarg" msgid "Envelope PRC5PRC5" msgstr "Sobre PRC5" msgid "Envelope PRC6" msgstr "Sobre PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Sobre PRC6 costat llarg" msgid "Envelope PRC7" msgstr "Sobre PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Sobre PRC7 costat llarg" msgid "Envelope PRC8" msgstr "Sobre PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Sobre PRC8 costat llarg" msgid "Envelope PRC9" msgstr "Sobre PRC9" msgid "Envelope PRC9 Long Edge" msgstr "Sobre PRC9 costat llarg" msgid "Envelope Personal" msgstr "Sobre personalitzat" msgid "Envelope You4" msgstr "Sobre You4" msgid "Envelope You4 Long Edge" msgstr "Sobre You4 costat llarg" msgid "Environment Variables:" msgstr "" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Normes d'error" msgid "Error reading raster data." msgstr "" msgid "Error sending raster data." msgstr "S'ha produït un error quan s'enviaven les dades de la trama." msgid "Error: need hostname after \"-h\" option." msgstr "ERROR: es necessita un nom d'amfitrió després de l'opció «-h»." msgid "European Fanfold" msgstr "" msgid "European Fanfold Legal" msgstr "" msgid "Every 10 Labels" msgstr "Cada 10 etiquetes" msgid "Every 2 Labels" msgstr "Cada 2 etiquetes" msgid "Every 3 Labels" msgstr "Cada 3 etiquetes" msgid "Every 4 Labels" msgstr "Cada 4 etiquetes" msgid "Every 5 Labels" msgstr "Cada 5 etiquetes" msgid "Every 6 Labels" msgstr "Cada 6 etiquetes" msgid "Every 7 Labels" msgstr "Cada 7 etiquetes" msgid "Every 8 Labels" msgstr "Cada 8 etiquetes" msgid "Every 9 Labels" msgstr "Cada 9 etiquetes" msgid "Every Label" msgstr "Cada etiqueta" msgid "Executive" msgstr "Executiu" msgid "Expectation Failed" msgstr "Ha fallat la condició del valor que s'esperava" msgid "Expressions:" msgstr "" msgid "Fast Grayscale" msgstr "" #, c-format msgid "File \"%s\" contains a relative path." msgstr "El fitxer «%s» conté un camí relatiu." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "El fitxer «%s» té permisos que no són segurs (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "El fitxer «%s» és un directori." #, c-format msgid "File \"%s\" not available: %s" msgstr "El fitxer «%s» no està disponible: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "El fitxer «%s» té els permisos correctes (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" #, c-format msgid "Finished page %d." msgstr "S'ha acabat la pàgina %d." msgid "Finishing Preset" msgstr "" msgid "Fold" msgstr "" msgid "Folio" msgstr "Foli" msgid "Forbidden" msgstr "Prohibit" msgid "Found" msgstr "" msgid "General" msgstr "General" msgid "Generic" msgstr "Genèric" msgid "Get-Response-PDU uses indefinite length" msgstr "La Get-Response-PDU fa servir una longitud indefinida" msgid "Glossy Paper" msgstr "Paper fotogràfic" msgid "Got a printer-uri attribute but no job-id." msgstr "S'ha obtingut l'atribut printer-uri però no el job-id." msgid "Grayscale" msgstr "Escala de grisos" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Carpeta per penjar" msgid "Hash buffer too small." msgstr "" msgid "Help file not in index." msgstr "El fitxer d'ajuda no és a l'índex." msgid "High" msgstr "" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "" "L'atribut 1setOf del IPP té etiquetes amb valors que no són compatibles." msgid "IPP attribute has no name." msgstr "L'atribut del IPP no té nom." msgid "IPP attribute is not a member of the message." msgstr "L'atribut del IPP no és membre del missatge." msgid "IPP begCollection value not 0 bytes." msgstr "El valor de begColletion del IPP no té 0 bytes." msgid "IPP boolean value not 1 byte." msgstr "El valor booleà del IPP no té 1 byte." msgid "IPP date value not 11 bytes." msgstr "El valor de date del IPP no té 11 bytes." msgid "IPP endCollection value not 0 bytes." msgstr "El valor de endColletion del IPP no té 0 bytes." msgid "IPP enum value not 4 bytes." msgstr "El valor de enum del IPP no té 4 bytes." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "La etiqueta d'extension del IPP és més llarga de 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "El valor enter de IPP no té 4 bytes." msgid "IPP language length overflows value." msgstr "El valor de la longitud del llenguatge del IPP desborda." msgid "IPP language length too large." msgstr "" msgid "IPP member name is not empty." msgstr "El nom del membre del IPP no està buit." msgid "IPP memberName value is empty." msgstr "El valor de memberName de l'IPP està buit." msgid "IPP memberName with no attribute." msgstr "" msgid "IPP name larger than 32767 bytes." msgstr "EL nom del IPP és més llarg de 32767 bytes." msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "" "El valor de nameWithLanguage del IPP és més petit que el mínim, 4 bytes." msgid "IPP octetString length too large." msgstr "" msgid "IPP rangeOfInteger value not 8 bytes." msgstr "El valor de rangeOfInteger del IPP no té 8 bytes." msgid "IPP resolution value not 9 bytes." msgstr "El valor de resolution del IPP no té 9 bytes." msgid "IPP string length overflows value." msgstr "El valor de la longitud de la cadena del IPP desborda." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "" "EL valor de textWithLanguage del IPP és més petit que el mínim, 4 bytes." msgid "IPP value larger than 32767 bytes." msgstr "El valor del IPP és més llarg de 32767 bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Caràcter de control no permès" msgid "Illegal main keyword string" msgstr "Cadena de paraula clau principal no permesa" msgid "Illegal option keyword string" msgstr "Cadena de paraula clau d'opció no permesa" msgid "Illegal translation string" msgstr "Cadena de traducció no permesa" msgid "Illegal whitespace character" msgstr "Caràcter d'espai en blanc no permés" msgid "Installable Options" msgstr "Opcions instal·lables" msgid "Installed" msgstr "Instal·lat" msgid "IntelliBar Label Printer" msgstr "Impressora d'etiquetes IntelliBar" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Error intern del servidor" msgid "Internal error" msgstr "Error intern" msgid "Internet Postage 2-Part" msgstr "Franqueig per Internet en 2 parts" msgid "Internet Postage 3-Part" msgstr "Franqueig per Internet en 3 parts" msgid "Internet Printing Protocol" msgstr "Protocol d'impressió per Internet" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "" msgid "Invalid media size." msgstr "Mida del suport no vàlida." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "" #, c-format msgid "Invalid printer command \"%s\"." msgstr "La comanda de la impressora «%s» no és vàlida." msgid "JCL" msgstr "Llenguatge de control de tasques (JCL)" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 costat llarg" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 costat llarg" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 costat llarg" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "La feina #%d no es pot tornar a iniciar - no hi ha fitxers." #, c-format msgid "Job #%d does not exist." msgstr "La feina #%d no existeix." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "La feina #%d ja s'ha interromput: no es pot cancel·lar." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "La feina #%d ja està cancel·lada: no es pot cancel·lar." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "La feina #%d ja s'ha acabat: no es pot cancel·lar." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "La feina #%d s'ha acabat i no es pot canviar." #, c-format msgid "Job #%d is not complete." msgstr "La feina #%d no s'ha acabat." #, c-format msgid "Job #%d is not held for authentication." msgstr "La feina #%d no està aturada per ser autenticada." #, c-format msgid "Job #%d is not held." msgstr "La feina #%d no està aturada." msgid "Job Completed" msgstr "S'ha acabat la feina" msgid "Job Created" msgstr "S'ha creat la feina" msgid "Job Options Changed" msgstr "S'han canviat les opcions de la feina" msgid "Job Stopped" msgstr "S'ha aturat la feina" msgid "Job is completed and cannot be changed." msgstr "La feina s'ha finalitzat i no es pot canviar." msgid "Job operation failed" msgstr "Ha fallat l'operació de la feina" msgid "Job state cannot be changed." msgstr "L'estat de la feina no es pot canviar." msgid "Job subscriptions cannot be renewed." msgstr "Les subscripcions a les feines no es poden renovar." msgid "Jobs" msgstr "Feines" msgid "LPD/LPR Host or Printer" msgstr "Amfitrió o impressora LPD/LPR" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" msgid "Label Printer" msgstr "Impressora d'etiquetes" msgid "Label Top" msgstr "Capçalera de l'etiqueta" #, c-format msgid "Language \"%s\" not supported." msgstr "L'idioma «%s» no està disponible." msgid "Large Address" msgstr "Adreça gran" msgid "LaserJet Series PCL 4/5" msgstr "Sèrie Laser Jet PCL 4/5" msgid "Letter Oversize" msgstr "Carta gran" msgid "Letter Oversize Long Edge" msgstr "Carta americà gran costat llarg" msgid "Light" msgstr "Lluminós" msgid "Line longer than the maximum allowed (255 characters)" msgstr "La línia la longitud màxima permesa (255 caràcters)" msgid "List Available Printers" msgstr "Llista les impressores disponibles" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "" msgid "Long-Edge (Portrait)" msgstr "Costat-llarg (vertical)" msgid "Looking for printer." msgstr "S'està buscant la impressora." msgid "Manual Feed" msgstr "Alimentació manual" msgid "Media Size" msgstr "Mida del paper" msgid "Media Source" msgstr "Font del paper" msgid "Media Tracking" msgstr "Seguiment del paper" msgid "Media Type" msgstr "Tipus de paper" msgid "Medium" msgstr "Mitjà" msgid "Memory allocation error" msgstr "S'ha produït un error d'ubicació de memòria" msgid "Missing CloseGroup" msgstr "Falta el CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "Falta la capçalera PPD-ADOBE-4.x" msgid "Missing asterisk in column 1" msgstr "Falta un asterisc a la columna 1" msgid "Missing document-number attribute." msgstr "Falta l'atribut document-number." msgid "Missing form variable" msgstr "Falta una variable del formulari" msgid "Missing last-document attribute in request." msgstr "Falta l'atribut last-document-number a la petició." msgid "Missing media or media-col." msgstr "Falta el media o el media-col." msgid "Missing media-size in media-col." msgstr "Falta el media-size al media-col." msgid "Missing notify-subscription-ids attribute." msgstr "Falta l'atribut notify-subscription-ids." msgid "Missing option keyword" msgstr "Falta l'opció keyword" msgid "Missing requesting-user-name attribute." msgstr "Falta l'atribut requesting-user-name." #, c-format msgid "Missing required attribute \"%s\"." msgstr "" msgid "Missing required attributes." msgstr "Falten alguns atributs necessaris." msgid "Missing resource in URI" msgstr "" msgid "Missing scheme in URI" msgstr "" msgid "Missing value string" msgstr "Falta la cadena de valor" msgid "Missing x-dimension in media-size." msgstr "Falta la mida x a la mida del suport." msgid "Missing y-dimension in media-size." msgstr "Falta la mida y a la mida del suport." #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Model: nom = %s\n" " idioma_natural = %s\n" " fabricant i model = %s\n" " id del dispositiu = %s" msgid "Modifiers:" msgstr "" msgid "Modify Class" msgstr "Modifica la classe" msgid "Modify Printer" msgstr "Modifica la impressora" msgid "Move All Jobs" msgstr "Mou totes les feines" msgid "Move Job" msgstr "Mou la feina" msgid "Moved Permanently" msgstr "S'ha mogut de manera permanent" msgid "NULL PPD file pointer" msgstr "Punter del fitxer PPD NUL" msgid "Name OID uses indefinite length" msgstr "El nom de l'OID fa servir una longitud indefinida" msgid "Nested classes are not allowed." msgstr "No es permeten les classes imbricades." msgid "Never" msgstr "Mai" msgid "New credentials are not valid for name." msgstr "" msgid "New credentials are older than stored credentials." msgstr "" msgid "No" msgstr "No" msgid "No Content" msgstr "No hi ha contingut" msgid "No IPP attributes." msgstr "" msgid "No PPD name" msgstr "El PPD no té nom" msgid "No VarBind SEQUENCE" msgstr "No hi ha cap SEQUENCE VarBind" msgid "No active connection" msgstr "No hi ha cap connexió activa" msgid "No active connection." msgstr "" #, c-format msgid "No active jobs on %s." msgstr "No hi ha cap feina activa a %s." msgid "No attributes in request." msgstr "No hi ha atributs en demanda." msgid "No authentication information provided." msgstr "No s'ha donat cap informació d'autenticació." msgid "No common name specified." msgstr "" msgid "No community name" msgstr "Ho hi na cap nom de comunitat" msgid "No default destination." msgstr "" msgid "No default printer." msgstr "No hi ha cap impressora per defecte." msgid "No destinations added." msgstr "No s'ha afegit cap destí." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "No s'ha trobat cap URI de dispositiu a argv[0] o a la variable d'entorn " "DEVICE_URI." msgid "No error-index" msgstr "No hi ca cap error-index" msgid "No error-status" msgstr "No hi ha cap status-error" msgid "No file in print request." msgstr "No hi ha cap printer-uri a la sol·licitud." msgid "No modification time" msgstr "No hi ha hora de modificació" msgid "No name OID" msgstr "No hi ha cap nom d'OID" msgid "No pages were found." msgstr "No s'ha trobat cap pàgina." msgid "No printer name" msgstr "No hi ha cap nom d'impressora" msgid "No printer-uri found" msgstr "No s'ha trobat cap printer-uri" msgid "No printer-uri found for class" msgstr "No s'ha trobat cap printer-uri per la classe" msgid "No printer-uri in request." msgstr "No hi ha cap printer-uri a la sol·licitud." msgid "No request URI." msgstr "" msgid "No request protocol version." msgstr "" msgid "No request sent." msgstr "" msgid "No request-id" msgstr "No hi ha cap request-id" msgid "No stored credentials, not valid for name." msgstr "" msgid "No subscription attributes in request." msgstr "No hi ha cap atribut de la subscripció a la sol·licitud." msgid "No subscriptions found." msgstr "No s'ha trobat cap sol·licitud." msgid "No variable-bindings SEQUENCE" msgstr "No hi ha cap SEQUENCE variable-bindings" msgid "No version number" msgstr "No hi ha cap número de versió" msgid "Non-continuous (Mark sensing)" msgstr "Discontinu (sensible a les marques)" msgid "Non-continuous (Web sensing)" msgstr "Discontinu (Sensible al web)" msgid "None" msgstr "" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "No s'ha trobat" msgid "Not Implemented" msgstr "No implementat" msgid "Not Installed" msgstr "No està instal·lat" msgid "Not Modified" msgstr "No està modificat" msgid "Not Supported" msgstr "No és compatible" msgid "Not allowed to print." msgstr "No teniu permís per imprimir." msgid "Note" msgstr "Nota" msgid "OK" msgstr "D'acord" msgid "Off (1-Sided)" msgstr "Inactiu (Una cara)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Ajuda en línia" msgid "Only local users can create a local printer." msgstr "" #, c-format msgid "Open of %s failed: %s" msgstr "No s'ha pogut obrir %s: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup sense un CloseGroup abans" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI sense un CloseUI/JCLCloseUI abans" msgid "Operation Policy" msgstr "Política d'operacions" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "L'opció «%s» no es pot incloure a través de %%%%IncludeFeature." msgid "Options Installed" msgstr "Opcions instal·lades" msgid "Options:" msgstr "Opcions:" msgid "Other Media" msgstr "" msgid "Other Tray" msgstr "" msgid "Out of date PPD cache file." msgstr "El fitxer de memòria cau del PPD no està actualitzat." msgid "Out of memory." msgstr "Sense memòria." msgid "Output Mode" msgstr "Mode de sortida" msgid "PCL Laser Printer" msgstr "Impressora làser PCL" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K costat llarg" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K costat llarg" msgid "PRC32K Oversize" msgstr "PRC32K gran" msgid "PRC32K Oversize Long Edge" msgstr "PRC32K gran costat llarg" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "El paquet no conté cap Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "El paquet no comença amb SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Contrasenya per %s a %s? " msgid "Pause Class" msgstr "Posa la classe en pausa" msgid "Pause Printer" msgstr "Posa la impressora en pausa" msgid "Peel-Off" msgstr "Desenganxar" msgid "Photo" msgstr "Fotografia" msgid "Photo Labels" msgstr "Etiquetes de fotografia" msgid "Plain Paper" msgstr "Paper normal" msgid "Policies" msgstr "Polítiques" msgid "Port Monitor" msgstr "Seguiment del port" msgid "PostScript Printer" msgstr "Impressora PostScript" msgid "Postcard" msgstr "Postal" msgid "Postcard Double" msgstr "" msgid "Postcard Double Long Edge" msgstr "Postal doble costat llarg" msgid "Postcard Long Edge" msgstr "Postal costat llarg" msgid "Preparing to print." msgstr "" msgid "Print Density" msgstr "Densitat de la impressió" msgid "Print Job:" msgstr "Feina d'impressió:" msgid "Print Mode" msgstr "Mode d'impressió" msgid "Print Quality" msgstr "" msgid "Print Rate" msgstr "Ritme d'impressió" msgid "Print Self-Test Page" msgstr "Imprimeix la pàgina de prova pròpia" msgid "Print Speed" msgstr "Velocitat d'impressió" msgid "Print Test Page" msgstr "Imprimeix una pàgina de prova" msgid "Print and Cut" msgstr "Imprimeix i talla" msgid "Print and Tear" msgstr "Imprimeix i estripa" msgid "Print file sent." msgstr "S'ha enviat el fitxer d'impressió." msgid "Print job canceled at printer." msgstr "S'ha cancel·lat la feina a la impressora." msgid "Print job too large." msgstr "La feina d'impressió és massa llarga." msgid "Print job was not accepted." msgstr "" #, c-format msgid "Printer \"%s\" already exists." msgstr "" msgid "Printer Added" msgstr "S'ha afegit una impressora" msgid "Printer Default" msgstr "Impressora per defecte" msgid "Printer Deleted" msgstr "S'ha eliminat la impressora" msgid "Printer Modified" msgstr "S'ha modificat la impressora" msgid "Printer Paused" msgstr "S'ha posat la impressora en pausa" msgid "Printer Settings" msgstr "Configuració de la impressora" msgid "Printer cannot print supplied content." msgstr "La impressora no pot imprimir el contingut subministrat." msgid "Printer cannot print with supplied options." msgstr "" msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Impressora:" msgid "Printers" msgstr "Impressores" #, c-format msgid "Printing page %d, %u%% complete." msgstr "" msgid "Punch" msgstr "" msgid "Quarto" msgstr "Quart" msgid "Quota limit reached." msgstr "S'ha assolit el límit de la quota." msgid "Rank Owner Job File(s) Total Size" msgstr "" "Rang Propietari Feina Fitxer(s) Mida total" msgid "Reject Jobs" msgstr "Rebutja feines" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "L'amfitrió remot no accepta el fitxer de control (%d)." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "L'amfitrió remot no accepta el fitxer de dades (%d)." msgid "Reprint After Error" msgstr "Torna a imprimir després d'un error" msgid "Request Entity Too Large" msgstr "Entitat de petició massa gran" msgid "Resolution" msgstr "Resolució" msgid "Resume Class" msgstr "Reprèn la classe" msgid "Resume Printer" msgstr "Reprèn la impressora" msgid "Return Address" msgstr "Remitent" msgid "Rewind" msgstr "Rebobina" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE té una longitud indefinida" msgid "SSL/TLS Negotiation Error" msgstr "S'ha produït un error mentre es negociava el SSL/TLS" msgid "See Other" msgstr "Vegeu altres" msgid "See remote printer." msgstr "" msgid "Self-signed credentials are blocked." msgstr "" msgid "Sending data to printer." msgstr "S'envien les dades a la impressora." msgid "Server Restarted" msgstr "S'ha reiniciat el servidor" msgid "Server Security Auditing" msgstr "S'està auditant la seguretat del servidor" msgid "Server Started" msgstr "S'ha iniciat el servidor" msgid "Server Stopped" msgstr "S'ha aturat el servidor" msgid "Server credentials not set." msgstr "" msgid "Service Unavailable" msgstr "El servei no està disponible" msgid "Set Allowed Users" msgstr "Definir els permisos dels usuaris" msgid "Set As Server Default" msgstr "Establir com a servidor per defecte" msgid "Set Class Options" msgstr "Definir les opcions de la classe" msgid "Set Printer Options" msgstr "Definir les opcions de la impressora" msgid "Set Publishing" msgstr "Establir com a pública" msgid "Shipping Address" msgstr "Adreça de lliurament" msgid "Short-Edge (Landscape)" msgstr "Costat curt (horitzontal)" msgid "Special Paper" msgstr "Paper especial" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "S'està posant a la cua la feina. S'ha completat el %.0f%%." msgid "Standard" msgstr "Estàndard" msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Bàner inicial" #, c-format msgid "Starting page %d." msgstr "S'està començant la pàgina %d." msgid "Statement" msgstr "Declaració" #, c-format msgid "Subscription #%d does not exist." msgstr "La subscripció #%d no existeix." msgid "Substitutions:" msgstr "" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Intercanviar els protocols" msgid "Tabloid" msgstr "Tabloide" msgid "Tabloid Oversize" msgstr "Tabloide gran" msgid "Tabloid Oversize Long Edge" msgstr "Tabloide gran costat llarg" msgid "Tear" msgstr "Estripar" msgid "Tear-Off" msgstr "Estripar" msgid "Tear-Off Adjust Position" msgstr "Posició d'ajust d'estripat" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "" #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "No es pot fer servir l'atribut %s amb les job-ids." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "L'atribut d'operació «%s» no es pot subministrar en una petició de Create-" "Job." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "No s'ha pogut trobar el fitxer PPD «%s»." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "No s'ha pogut obrir el fitxer PPD «%s»: %s" msgid "The PPD file could not be opened." msgstr "No s'ha pogut obrir el fitxer PPD." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "El nom de la classe només pot tenir fins a 127 caràcters imprimibles i no " "pot contenir espais, barres (/) o el símbol coixinet (#)." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "No es pot fer servir l'atribut notify-lease-duration amb les subscripcions a " "tasques." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "El valor de notify-user-data és massa llarg (%d > 63 octets)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" msgid "The printer did not respond." msgstr "La impressora no ha respost." msgid "The printer is in use." msgstr "La impressora està ocupada." msgid "The printer is not connected." msgstr "La impressora no està connectada." msgid "The printer is not responding." msgstr "La impressora no respon." msgid "The printer is now connected." msgstr "Ara la impressora està connectada." msgid "The printer is now online." msgstr "Ara la impressora està en línia." msgid "The printer is offline." msgstr "La impressora està fora de línia." msgid "The printer is unreachable at this time." msgstr "Ara mateix no es pot accedir a la impressora." msgid "The printer may not exist or is unavailable at this time." msgstr "" "Pot ser que la impressora no existeixi o que ara mateix no estigui " "accessible." 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 "" msgid "The printer or class does not exist." msgstr "La impressora o la classe no existeix." msgid "The printer or class is not shared." msgstr "La impressora o la classe no estan compartides." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "El printer-uri «%s» conté caràcters no vàlids." msgid "The printer-uri attribute is required." msgstr "L'atribut printer-uri és obligatori." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "El printer-uri ha de tenir la forma «ipp://NOMAMFITRIÓ/classes/NOMCLASSE»." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "El printer-uri ha de tenir la forma «ipp://NOMAMFITRIÓ/printers/" "NOMIMPRESSORA»." msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "La interfície web està deshabilitada. Executeu «cupsctl WebInterface=yes» " "per habilitar-la." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "El valor «%s» de which-jobs no està implementat." msgid "There are too many subscriptions." msgstr "Hi ha massa subscripcions." msgid "There was an unrecoverable USB error." msgstr "Hi ha un error de l'USB irrecuperable." msgid "Thermal Transfer Media" msgstr "Mitjà de transferència tèrmica" msgid "Too many active jobs." msgstr "Hi ha massa tasques actives." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Hi ha massa valors de job-sheets (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Hi ha massa valors de printer-state-reasons (%d > %d)." msgid "Transparency" msgstr "Transparència" msgid "Tray" msgstr "Safata" msgid "Tray 1" msgstr "Safata 1" msgid "Tray 2" msgstr "Safata 2" msgid "Tray 3" msgstr "Safata 3" msgid "Tray 4" msgstr "Safata 4" msgid "Trust on first use is disabled." msgstr "" msgid "URI Too Long" msgstr "L'URI és massa llarg" msgid "URI too large" msgstr "" msgid "US Fanfold" msgstr "" msgid "US Ledger" msgstr "Llibre major americà" msgid "US Legal" msgstr "Legal americà" msgid "US Legal Oversize" msgstr "Legal americà gran" msgid "US Letter" msgstr "Carta americà" msgid "US Letter Long Edge" msgstr "Carta americà costat llarg" msgid "US Letter Oversize" msgstr "Carta americà gran" msgid "US Letter Oversize Long Edge" msgstr "Carta americà gran costat llarg" msgid "US Letter Small" msgstr "Carta americà petit" msgid "Unable to access cupsd.conf file" msgstr "No es pot accedir al fitxer cups.conf" msgid "Unable to access help file." msgstr "No es pot accedir al fitxer d'ajuda." msgid "Unable to add class" msgstr "No es pot afegir la classe" msgid "Unable to add document to print job." msgstr "No es pot obrir el documenta la feina." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "No es pot afegir la feina al destí «%s»." msgid "Unable to add printer" msgstr "No es pot afegir la impressora" msgid "Unable to allocate memory for file types." msgstr "No es pot assignar la memòria pels tipus de fitxers." msgid "Unable to allocate memory for page info" msgstr "No s'ha pogut assignar memòria per la pàgina d'informació" msgid "Unable to allocate memory for pages array" msgstr "No s'ha pogut assignar memòria per la matriu de pàgines" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "No es pot cancel·lar la feina d'impressió." msgid "Unable to change printer" msgstr "No es pot canviar la impressora" msgid "Unable to change printer-is-shared attribute" msgstr "No es pot canviar l'atribut printer-is-shared" msgid "Unable to change server settings" msgstr "No es pot canviar la configuració del servidor" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" msgid "Unable to configure printer options." msgstr "No es poden configurar les opcions de la impressora." msgid "Unable to connect to host." msgstr "No es pot connectar a l'amfitrió." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "No es pot contactar amb la impressora. Es posa a la cua de la següent " "impressora de la classe." #, c-format msgid "Unable to copy PPD file - %s" msgstr "No es pot copiar el fitxer PPD - %s" msgid "Unable to copy PPD file." msgstr "No es pot copiar el fitxer PPD." msgid "Unable to create credentials from array." msgstr "" msgid "Unable to create printer-uri" msgstr "No es pot crear el printer-uri" msgid "Unable to create printer." msgstr "" msgid "Unable to create server credentials." msgstr "" #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "No es pot crear el fitxer temporal" msgid "Unable to delete class" msgstr "No es pot esborrar la classe" msgid "Unable to delete printer" msgstr "No es pot esborrar la impressora" msgid "Unable to do maintenance command" msgstr "No es pot executar la comanda de manteniment" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "No es poden editar fitxers cupsd.conf més grans d'1MB" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (la cadena del " "certificat no és vàlida)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (el certificat " "encara no és vàlid)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (ha expirat el " "certificat)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (hi ha un error en " "el nom de l'amfitrió)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (s'ha tallat la " "connexió abans de respondre)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (el certificat és " "autosignat)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "No s'ha pogut establir una connexió segura amb l'amfitrió (el certificat no " "és de confiança)." msgid "Unable to establish a secure connection to host." msgstr "No es pot establir una connexió segura amb l'amfitrió." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "No es pot trobar el destí de la feina" msgid "Unable to find printer." msgstr "No es pot trobar la impressora." msgid "Unable to find server credentials." msgstr "" msgid "Unable to get backend exit status." msgstr "No es pot obtenir el motiu de la sortida de l'execució en segon pla" msgid "Unable to get class list" msgstr "No es pot obtenir la llista de classes" msgid "Unable to get class status" msgstr "No es pot obtenir l'estat de la classe" msgid "Unable to get list of printer drivers" msgstr "No es pot obtenir la llista dels controladors d'impressora" msgid "Unable to get printer attributes" msgstr "No es poden obtenir els atributs de la impressora" msgid "Unable to get printer list" msgstr "No es pot obtenir la llista d'impressores" msgid "Unable to get printer status" msgstr "No es pot obtenir l'estat de la impressora" msgid "Unable to get printer status." msgstr "No es pot obtenir l'estat de la impressora." msgid "Unable to load help index." msgstr "No es pot carregar l'índex de l'ajuda." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "No es pot ubicar la impressora «%s»." msgid "Unable to locate printer." msgstr "No es pot ubicar la impressora." msgid "Unable to modify class" msgstr "No es pot modificar la classe" msgid "Unable to modify printer" msgstr "No es pot modificar la impressora" msgid "Unable to move job" msgstr "No es pot moure la feina" msgid "Unable to move jobs" msgstr "No es poden moure les tasques" msgid "Unable to open PPD file" msgstr "No es pot obrir el fitxer PPD" msgid "Unable to open cupsd.conf file:" msgstr "No es pot obrir el fitxer cups.conf" msgid "Unable to open device file" msgstr "No es pot obrir el fitxer de dispositiu" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "No es pot obrir el document #%d a la feina #%d." msgid "Unable to open help file." msgstr "No es pot obrir el fitxer d'impressió." msgid "Unable to open print file" msgstr "No es pot obrir el fitxer d'impressió" msgid "Unable to open raster file" msgstr "No es pot obrir el fitxer de trama" msgid "Unable to print test page" msgstr "No es pot imprimir la pàgina de prova" msgid "Unable to read print data." msgstr "No es poden llegir les dades d'impressió." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "" msgid "Unable to resolve printer-uri." msgstr "" msgid "Unable to see in file" msgstr "No es pot veure al fitxer" msgid "Unable to send command to printer driver" msgstr "No es pot enviar la comanda al controlador de la impressora" msgid "Unable to send data to printer." msgstr "No es poden enviar dades a la impressora." msgid "Unable to set options" msgstr "No es poden configurar les opcions" msgid "Unable to set server default" msgstr "No es pot posar la configuració per defecte al servidor" msgid "Unable to start backend process." msgstr "No es pot iniciar el procés en segon pla." msgid "Unable to upload cupsd.conf file" msgstr "No es pot penjar el fitxer cups.conf" msgid "Unable to use legacy USB class driver." msgstr "No es pot fer servir el controlador de la classe USB antic." msgid "Unable to write print data" msgstr "No es poden escriure les dades d'impressió" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "No es poden escriure les dades sense comprimir: %s" msgid "Unauthorized" msgstr "No autoritzat" msgid "Units" msgstr "Unitats" msgid "Unknown" msgstr "Desconegut" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "La tria de «%s» per l'opció «%s» és desconeguda." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "El valor de l'opció de xifrat «%s» és desconegut." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Ordre desconegut del fitxer: «%s»." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Format del caràcter desconegut: «%c»." msgid "Unknown hash algorithm." msgstr "" msgid "Unknown media size name." msgstr "El nom de la mida del suport no és conegut." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "L'opció «%s» amb valor «%s» és desconeguda." #, c-format msgid "Unknown option \"%s\"." msgstr "L'opció «%s» és desconeguda." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "El mode d'impressió «%s» és desconegut." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "El paràmetre printer-error-policy «%s» és desconegut." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "El paràmetre printer-op-policy «%s» és desconegut." msgid "Unknown request method." msgstr "" msgid "Unknown request version." msgstr "" msgid "Unknown scheme in URI" msgstr "" msgid "Unknown service name." msgstr "El nom del servei és desconegut." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "El valor de l'opció de la versió és desconegut: «%s»." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "" #, c-format msgid "Unsupported character set \"%s\"." msgstr "No s'admet el grup de caràcters «%s»." #, c-format msgid "Unsupported compression \"%s\"." msgstr "No s'admet la compressió «%s»." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "No s'admet el document-format «%s»." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "No s'admet el document-format «%s/%s»." #, c-format msgid "Unsupported format \"%s\"." msgstr "No s'admet el format «%s»." msgid "Unsupported margins." msgstr "No s'admeten els marges." msgid "Unsupported media value." msgstr "No s'admet el valor del suport." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "No s'admet el valor %d a number-up. Es fa servir number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "No s'admet el valor %s a number-up-layout. Es fa servir number-up-" "layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "No s'admet el valor %s a page-border. Es fa servir page-border=none." msgid "Unsupported raster data." msgstr "No s'admet les dades en trama." msgid "Unsupported value type" msgstr "El tipus de valor no és compatible" msgid "Upgrade Required" msgstr "S'ha d'actualitzar" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Sintaxi: %s id-feina usuari títol còpies opcions [fitxer]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Sintaxi: cupsctl [opcions] [param=valor ... paramN=valorN]" msgid "Usage: cupsd [options]" msgstr "Sintaxi: cupsd [opcions]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Sintaxi: ipptool [opcions] URI nomfitxer[ ... nomfitxerN]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Sintaxi: ppdc [opcions] nomfitxer.rv [ ... nomfitxerN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Sintaxi: ppdhtml [opcions] nomfitxer.drv >nomfitxer.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Sintaxi: ppdi [opcions] nomfitxer.ppd [ ... nomfitxerN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Sintaxi: ppdmerge [opcions] nomfitxer.ppd [ ... nomfitxerN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "Sintaxi: ppdpo [opcions] -o nomfitxer.po nomfitxer.drv [ ... nomfitxerN.drv]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Sintaxi: snmp [adreça-amfitrió-o-ip]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "El valor té una longitud indefinida" msgid "VarBind uses indefinite length" msgstr "VarBind té una longitud indefinida" msgid "Version uses indefinite length" msgstr "Version té una longitud indefinida" msgid "Waiting for job to complete." msgstr "S'està esperant que acabi la feina." msgid "Waiting for printer to become available." msgstr "S'està esperant que la impressora estigui disponible." msgid "Waiting for printer to finish." msgstr "S'està esperant que la impressora acabi." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "La interfície web està deshabilitada" msgid "Yes" msgstr "Sí" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Heu d'accedir a aquesta pagina a través de la URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "Impressora d'etiquetes ZPL" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "interromput" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "cancel·lat" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "completat" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "no s'ha pogut executar correctament la cups-deviced." msgid "cups-driverd failed to execute." msgstr "no s'ha pogut executar correctament la cups-driverd" #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: no es pot connectar al servidor: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: l'opció «%s» és desconeguda" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: l'opció «-%c» és desconeguda" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" "cupsd: s'esperava un nom de fitxer de configuració després de l'opció «-c»." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" msgid "cupsd: Unable to get current directory." msgstr "cupsd: No es pot obtenir el directori actual." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: l'argument «%s» és desconegut - s'interromp." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: l'opció «%c» és desconeguda - s'interromp." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: el document número %d no és vàlid." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: la feina %d no és vàlida." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: només es pot especificar un nom de fitxer." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: no es pot obtenir el fitxer de la feina - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: l'opció -q no és compatible amb l'opció -v." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: l'opció -v no és compatible amb l'opció -q." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "dispositiu per %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "dispositiu per %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "error-index fa servir una longitud indefinida" msgid "error-status uses indefinite length" msgstr "error-status fa servir una longitud indefinida" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "En pausa" msgid "help\t\tGet help on commands." msgstr "help\t\tproporciona ajuda sobre les comandes." msgid "idle" msgstr "inactiva" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" msgid "ippfind: Cannot use --and after --or." msgstr "" #, c-format msgid "ippfind: Expected key name after %s." msgstr "" #, c-format msgid "ippfind: Expected port range after %s." msgstr "" #, c-format msgid "ippfind: Expected program after %s." msgstr "" #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" msgid "ippfind: Missing close brace in substitution." msgstr "" msgid "ippfind: Missing close parenthesis." msgstr "" msgid "ippfind: Missing expression before \"--and\"." msgstr "" msgid "ippfind: Missing expression before \"--or\"." msgstr "" #, c-format msgid "ippfind: Missing key name after %s." msgstr "" #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "" #, c-format msgid "ippfind: Missing program after %s." msgstr "" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" msgid "ippfind: Out of memory." msgstr "" msgid "ippfind: Too many parenthesis." msgstr "" #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "ipptool: els segons de «-i» no són correctes." msgid "ipptool: May only specify a single URI." msgstr "ipptool: heu d'especificar només un URI." msgid "ipptool: Missing count for \"-n\"." msgstr "ipptool: falta el comptador de «-n»." msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "ipptool: falta el nom del fitxer a «-f»." msgid "ipptool: Missing name=value for \"-d\"." msgstr "ipptool: falta nom=valor a «-d»." msgid "ipptool: Missing seconds for \"-i\"." msgstr "ipptool: falten els segons a «-i»." msgid "ipptool: URI required before test file." msgstr "ipptool: falta l'URI abans del fitxer de prova." #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "Falta l'atribut de job-printer-uri." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: el nom de la classe només pot tenir caràcters imprimibles." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "lpadmin: s'esperava allow/deny:llistausuaris després de l'opció «-u»." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: s'esperava una classe després de l'opció «-r»." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: s'esperava un nom de classe després de l'opció «-c»." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: s'esperava una descripció després de l'opció «-D»." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: s'esperava un URI de dispositiu després de l'opció «-v»." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: s'esperava un(s) tipus de fitxer(s) després de l'opció «-I»." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: s'esperava un nom d'amfitrió després de l'opció «-h»." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: s'esperava una ubicació després de l'opció «-L»." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: s'esperava un model després de l'opció «-m»." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: s'esperava un nom després de l'opció «-R»." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: s'esperava nom=valor després de l'opció «-o»." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: s'esperava una impressora després de l'opció «-p»." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: s'esperava un nom d'impressora després de l'opció «-d»." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: s'esperava un impressora o classe després de l'opció «-x»." msgid "lpadmin: No member names were seen." msgstr "lpadmin: no s'ha trobat cap nom de membre." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: la impressora %s ja és membre de la classe %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: la impressora %s no és membre de la classe %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "" "lpadmin: el nom de la impressora només pot contenir caràcters imprimibles." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: no s'ha pogut afegir una impressora a la classe:\n" " Heu d'especificar primer un nom d'impressora." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: no s'ha pogut connectar al servidor: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: no s'ha pogut crear el fitxer temporal" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" "lpadmin: no s'ha pogut esborrar l'opció:\n" " Heu d'especificar primer un nom d'impressora." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: no es pot esborrar una impressora de la classe:\n" " Heu d'especificar primer un nom d'impressora." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: no es pot establir les opcions de la impressora:\n" " Heu d'especificar primer un nom d'impressora." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: l'opció allow/deny «%s» és desconeguda." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: l'argument «%s» és desconegut." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: l'opció «%c» és desconeguda." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: avís - s'ignora el contingut de la llista de tipus." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" "lpinfo: s'esperava una cadena d'ID de dispositiu 1284 després de «--device-" "id»." msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: s'esperava un idioma després de «--language»." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "lpinfo: s'esperava una marca i model després de «--make-and-model»." msgid "lpinfo: Expected product string after \"--product\"." msgstr "lpinfo: s'esperava una cadena de producte després de «--product!»." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" "lpinfo: s'esperava una llista d'esquemes després de l'opció «--exclude-" "schemes»." msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" "lpinfo: s'esperava una llista d'esquemes després de l'opció «--include-" "schemes»." msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "lpinfo: s'esperava un temps d'espera després de «--timeout»." #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: no s'ha pogut connectar al servidor: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: l'argument «%s» és desconegut." msgid "lpoptions: No printers." msgstr "lpoptions: no hi ha cap impressora." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: no s'ha pogut afegir la impressora o la instància: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: no s'ha pogut obtenir el fitxer PPD de %s: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: no s'ha pogut obrir el fitxer PPD per %s." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: la impressora o la classe són desconegudes." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" "lpstat: error - la variable d'entorn %s esmenta el destí «%s» que no " "existeix." #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "membres de la classe %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "no hi ha cap entrada" msgid "no system default destination" msgstr "no hi ha cap destí per defecte" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "no s'ha especificat cap notify-events." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "L'URI de notify-recipient-uri «%s» ja s'ha fet servir." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "L'URI de notify-recipient-uri «%s» fa servir un esquema desconegut." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "pendent" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "ppdc: s'afegeix el directori inclòs «%s»." #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "ppdc: s'afegeix/actualitza el text de l'UI des de %s." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "ppdc: valor booleà incorrecte (%s) a la línia %d de %s." #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: l'atribut del tipus de lletra és incorrecte: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "ppdc: el nom de resolució «%s» de la línia %d de %s és incorrecte." #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "ppdc: la paraula clau d'estat %s de la línia %d de %s és incorrecta." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" "ppdc: la variable de substitució ($%c) de la línia %d de %s és incorrecta." #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "ppdc: s'ha trobat una elecció a la línia %d de %s sense cap opció." #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "ppdc: #po duplicat per l'idioma %s a la línia %d de %s." #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "ppdc: s'esperava una definició de filtre a la línia %d de %s." #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "ppdc: s'esperava un nom de programa a la línia %d de %s." #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "ppdc: s'esperava un valor booleà a la línia %d de %s." #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" "ppdc: s'esperava un joc de caràcters després de Font a la línia %d de %s." #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "ppdc: s'esperava un codi d'elecció a la línia %d de %s." #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "ppdc: s'esperava un nom/text d'elecció a la línia %d de %s." #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" "ppdc: s'esperava un ordre de colors per ColorModel a la línia %d de %s." #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" "ppdc: s'esperava un espai de colors per ColorModel a la línia %d de %s." #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "ppdc: s'esperava una compressió per ColorModel a la línia %d de %s." #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" "ppdc: s'esperava una cadena de restriccions per UIConstraints a la línia %d " "de %s." #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" "ppdc: s'esperava una paraula clau de tipus de controlador després de " "DriverType a la línia %d de %s." #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" "ppdc: s'esperava un tipus de dúplex després de Duplex a la línia %d de %s." #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "ppdc: s'esperava una codificació després de Font a la línia %d de %s." #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" "ppdc: s'esperava un nom de fitxer després de #po %s a la línia %d de %s." #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "ppdc: s'esperava un nom/text de grup a la línia %d de %s." #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "ppdc: s'esperava un nom de fitxer d'inclusió a la línia %d de %s." #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "ppdc: s'esperava un enter a la línia %d de %s." #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "ppdc: s'esperava un idioma després de #po a la línia %d de %s." #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "ppdc: s'esperava un nom després de %s a la línia %d de %s." #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "ppdc: s'esperava un nom després de FileName a la línia %d de %s." #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "ppdc: s'esperava un nom després de Font a la línia %d de %s." #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "ppdc: s'esperava un nom després de Manufacturer a la línia %d de %s." #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "ppdc: s'esperava un nom després de MediaSize a la línia %d de %s." #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "ppdc: s'esperava un nom després de ModelName a la línia %d de %s." #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "ppdc: s'esperava un nom després de PCFileName a la línia %d de %s." #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "ppdc: s'esperava un nom/text després de %s a la línia %d de %s." #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" "ppdc: s'esperava un nom/text després d'Installable a la línia %d de %s." #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" "ppdc: s'esperava un nom/text després de Resolution a la línia %d de %s." #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" "ppdc: s'esperava una combinació de nom/text per ColorModel a la línia %d de " "%s." #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "ppdc: s'esperava un nom/text d'opció a la línia %d de %s." #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "ppdc: s'esperava una secció d'opció a la línia %d de %s." #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "ppdc: s'esperava un tipus d'opció a la línia %d de %s." #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" "ppdc: s'esperava un camp de substitució després de Resolution a la línia %d " "de %s." #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "ppdc: s'esperava una cadena entre cometes dobles a la línia %d de %s." #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "ppdc: s'esperava un número real a la línia %d de %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" "ppdc: s'esperava una resolució/tipus de mitjà després de ColorProfile a la " "línia %d de %s." #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" "ppdc: s'esperava una resolució/tipus de mitjà després de SimpleColorProfile " "a la línia %d de %s." #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "ppdc: s'esperava un selector després de %s a la línia %d de %s." #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "ppdc: s'esperava un estat després de Font a la línia %d de %s." #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "ppdc: s'esperava una cadena després de Copyright a la línia %d de %s." #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "ppdc: s'esperava una cadena després de Version a la línia %d de %s." #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "ppdc: s'esperava dos noms d'opció a la línia %d de %s." #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "ppdc: s'esperava un valor després de %s a la línia %d de %s." #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "ppdc: s'esperava una versió després de Font a la línia %d de %s." #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "ppdc: el nom de fitxer #include/#po «%s» no és vàlid." #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "ppdc: el cost del filtre no és vàlid a la línia %d de %s." #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "ppdc: el tipus MIME buit no és vàlid pel filtre a la línia %d de %s." #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" "ppdc: el nom de programa buit no és vàlid pel filtre a la línia %d de %s." #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "ppdc: la secció d'opció «%s» no és vàlida a la línia %d de %s." #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "ppdc: el tipus d'opció «%s» no és vàlid a la línia %d de %s." #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "ppdc: s'està carregant el fitxer d'informació del controlador «%s»." #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "ppdc: s'està carregant l'idioma «%s»." #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "ppdc: s'està carregant els missatges des de «%s»." #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "ppdc: falta un #endif al final de «%s»." #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "ppdc: falta un #if a la línia %d de %s." #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" "oodc: es necessita un msgid abans de la cadena per traduir a la línia %d de " "%s." #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "ppdc: no s'ha donat el catàleg de missatges per l'idioma %s." #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" "ppdc: l'opció %s està definida a dos grups diferents a la línia %d de %s." #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" "ppdc: l'opció %s està redefinida amb un tipus diferent a la línia %d de %s." #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "ppdc: l'opció de restricció ha d'incloure *nom a la línia %d de %s." #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "ppdc: hi ha massa #if imbricats a la línia %d de %s." #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "ppdc: no s'ha pogut crear el fitxer PPD «%s» - %s." #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "ppdc: no s'ha pogut crear el directori de sortida %s: %s" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "ppdc: no s'ha pogut crear els conductes de sortida: %s" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "ppdc: no s'ha pogut executar cupstestppd: %s" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "ppdc: no s'ha pogut trobar el fitxer #po %s a la línia %d de %s." #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" "ppdc: no s'ha pogut trobar el fitxer d'inclusió «%s» a la línia %d de %s." #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "ppdc: no s'ha pogut trobar la localització de «%s» - %s" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "ppdc: no s'ha pogut carregar el fitxer de localització «%s» - %s" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "ppdc: no s'ha pogut obrir %s: %s" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "ppdc: la variable (%s) de la línia %d de %s no està definida." #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "ppdc: hi ha un text inesperat a la línia %d de %s." #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "ppdc: el tipus de controlador %s de la línia %d de %s no és conegut." #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "ppdc: el tipus de dúplex «%s» de la línia %d de %s no és conegut." #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "ppdc: la mida del mitjà «%s» de la línia %d de %s no és coneguda." #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "ppdc: el format del catàleg de missatges de «%s» no és conegut." #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "ppdc: el testimoni «%s» de la línia %d de %s no és conegut." #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" "ppdc: els caràcters finals del número real «%s» de la línia %d de %s no són " "coneguts." #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" "ppdc: la cadena que comença per %c de la línia %d de %s no està acabada." #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "ppdc: avís - se superposa el nom del fitxer «%s»." #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: s'escriu %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: s'escriuen els fitxers PPD a la carpeta «%s»." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "ppdmerge: LanguageVersion «%s» incorrecte a %s." #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: s'ignora el fitxer PPD %s." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "ppdmerge: no s'ha pogut fer la còpia de seguretat %s a %s- %s" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "la impressora %s està deshabilitada des de %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "la impressora %s està inactiva. Està activada des de %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "la impressora %s està imprimint %s-%d. Està habilitada des de %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "la impressora %s/%s està deshabilitada des de %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "la impressora %s/%s està inactiva. Està activada des de %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "la impressora %s/%s està imprimint %s-%d. Està activada des de %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "s'està processant" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "l'identificador de la petició és %s-%d (%d fitxer(s))" msgid "request-id uses indefinite length" msgstr "la request-id fa servir una longitud indefinida" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "el programador de tasques no s'està executant" msgid "scheduler is running" msgstr "el programador de tasques s'està executant" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "stat de %s ha fallat: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tmostra l'estat del dimoni i la cua." #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "aturat" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "destí per defecte del sistema: %s" #, c-format msgid "system default destination: %s/%s" msgstr "destí per defecte del sistema: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "desconegut" msgid "untitled" msgstr "sense títol" msgid "variable-bindings uses indefinite length" msgstr "La variable-bindings fa servir una longitud indefinida" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "" #~ "Necessiteu una contrasenya de Samba per exportar els controladors " #~ "d'impressora" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "Necessiteu una nom d'usuari de Samba per exportar els controladors " #~ "d'impressora" #~ msgid "Export Printers to Samba" #~ msgstr "Exportar les impressores al Samba" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: no es pot establir Listen o Port directament." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: no s'ha pogut obrir el fitxer PPD «%s» - %s" cups-2.3.1/locale/po2strings.c000664 000765 000024 00000017342 13574721672 016323 0ustar00mikestaff000000 000000 /* * Convert a GNU gettext .po file to an Apple .strings file. * * Copyright 2007-2017 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. * * Usage: * * po2strings filename.strings filename.po * * Compile with: * * gcc -o po2strings po2strings.c `cups-config --libs` */ #include /* * The .strings file format is simple: * * // comment * "msgid" = "msgstr"; * * The GNU gettext .po format is also fairly simple: * * #. comment * msgid "some text" * msgstr "localized text" * * The comment, msgid, and msgstr text can span multiple lines using the form: * * #. comment * #. more comments * msgid "" * "some long text" * msgstr "" * "localized text spanning " * "multiple lines" * * Both the msgid and msgstr strings use standard C quoting for special * characters like newline and the double quote character. */ static char *normalize_string(const char *idstr, char *buffer, size_t bufsize); /* * main() - Convert .po file to .strings. */ int /* O - Exit code */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *pofile, /* .po filename */ *stringsfile; /* .strings filename */ cups_file_t *po, /* .po file */ *strings; /* .strings file */ char s[4096], /* String buffer */ *ptr, /* Pointer into buffer */ *temp, /* New string */ *msgid, /* msgid string */ *msgstr, /* msgstr string */ normalized[8192];/* Normalized msgid string */ size_t length; /* Length of combined strings */ int use_msgid; /* Use msgid strings for msgstr? */ /* * Process command-line arguments... */ pofile = NULL; stringsfile = NULL; use_msgid = 0; for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "-m")) use_msgid = 1; else if (argv[i][0] == '-') { puts("Usage: po2strings [-m] filename.po filename.strings"); return (1); } else if (!pofile) pofile = argv[i]; else if (!stringsfile) stringsfile = argv[i]; else { puts("Usage: po2strings [-m] filename.po filename.strings"); return (1); } } if (!pofile || !stringsfile) { puts("Usage: po2strings [-m] filename.po filename.strings"); return (1); } /* * Read strings from the .po file and write to the .strings file... */ if ((po = cupsFileOpen(pofile, "r")) == NULL) { perror(pofile); return (1); } if ((strings = cupsFileOpen(stringsfile, "w")) == NULL) { perror(stringsfile); cupsFileClose(po); return (1); } msgid = msgstr = NULL; while (cupsFileGets(po, s, sizeof(s)) != NULL) { if (s[0] == '#' && s[1] == '.') { /* * Copy comment string... */ if (msgid && msgstr) { /* * First output the last localization string... */ if (*msgid) cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, (use_msgid || !*msgstr) ? msgid : msgstr); free(msgid); free(msgstr); msgid = msgstr = NULL; } cupsFilePrintf(strings, "//%s\n", s + 2); } else if (s[0] == '#' || !s[0]) { /* * Skip blank and file comment lines... */ continue; } else { /* * Strip the trailing quote... */ if ((ptr = strrchr(s, '\"')) == NULL) continue; *ptr = '\0'; /* * Find start of value... */ if ((ptr = strchr(s, '\"')) == NULL) continue; ptr ++; /* * Create or add to a message... */ if (!strncmp(s, "msgid", 5)) { /* * Output previous message as needed... */ if (msgid && msgstr) { if (*msgid) cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized))); } if (msgid) free(msgid); if (msgstr) free(msgstr); msgid = strdup(ptr); msgstr = NULL; } else if (s[0] == '\"' && (msgid || msgstr)) { /* * Append to current string... */ size_t ptrlen = strlen(ptr); /* Length of string */ length = strlen(msgstr ? msgstr : msgid); if ((temp = realloc(msgstr ? msgstr : msgid, length + ptrlen + 1)) == NULL) { free(msgid); if (msgstr) free(msgstr); perror("Unable to allocate string"); return (1); } if (msgstr) { /* * Copy the new portion to the end of the msgstr string - safe * to use strcpy because the buffer is allocated to the correct * size... */ msgstr = temp; memcpy(msgstr + length, ptr, ptrlen + 1); } else { /* * Copy the new portion to the end of the msgid string - safe * to use strcpy because the buffer is allocated to the correct * size... */ msgid = temp; memcpy(msgid + length, ptr, ptrlen + 1); } } else if (!strncmp(s, "msgstr", 6) && msgid) { /* * Set the string... */ if (msgstr) free(msgstr); if ((msgstr = strdup(ptr)) == NULL) { free(msgid); perror("Unable to allocate msgstr"); return (1); } } } } if (msgid && msgstr) { if (*msgid) cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized))); } if (msgid) free(msgid); if (msgstr) free(msgstr); cupsFileClose(po); cupsFileClose(strings); return (0); } /* * 'normalize_string()' - Normalize a msgid string. * * This function converts ASCII ellipsis and double quotes to their Unicode * counterparts. */ static char * /* O - Normalized string */ normalize_string(const char *idstr, /* I - msgid string */ char *buffer, /* I - Normalized string buffer */ size_t bufsize) /* I - Size of string buffer */ { char *bufptr = buffer, /* Pointer into buffer */ *bufend = buffer + bufsize - 3; /* End of buffer */ int quote = 0, /* Quote direction */ html = 0; /* HTML text */ while (*idstr && bufptr < bufend) { if (!strncmp(idstr, "') html = 0; if (*idstr == '.' && idstr[1] == '.' && idstr[2] == '.') { /* * Convert ... to Unicode ellipsis... */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0xA6; idstr += 2; } else if (!html && *idstr == '\\' && idstr[1] == '\"') { if (quote) { /* * Convert second \" to Unicode right (curley) double quote. */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0x9D; quote = 0; } else if (strchr(idstr + 2, '\"') != NULL) { /* * Convert first \" to Unicode left (curley) double quote. */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0x9C; quote = 1; } else { /* * Convert lone \" to Unicode double prime. */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0xB3; } idstr ++; } else if (*idstr == '\'') { if (strchr(idstr + 1, '\'') == NULL || quote) { /* * Convert second ' (or ' used for a contraction) to Unicode right * (curley) single quote. */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0x99; quote = 0; } else { /* * Convert first ' to Unicode left (curley) single quote. */ *bufptr++ = (char)0xE2; *bufptr++ = (char)0x80; *bufptr++ = (char)0x98; quote = 1; } } else *bufptr++ = *idstr; idstr ++; } *bufptr = '\0'; return (buffer); } cups-2.3.1/locale/cups_de.po000664 000765 000024 00001175466 13574721672 016044 0ustar00mikestaff000000 000000 # # German message catalog for CUPS. # # Copyright © 2007-2018 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Notes for Translators: # # The "checkpo" program located in the "locale" source directory can be used # to verify that your translations do not introduce formatting errors or other # problems. Run with: # # cd locale # ./checkpo cups_LL.po # # where "LL" is your locale. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" "POT-Creation-Date: 2019-08-23 09:13-0400\n" "PO-Revision-Date: 2017-10-25 14:57+0200\n" "Last-Translator: Joachim Schwender \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "\t\t(all)" msgstr "\t\t(alle)" msgid "\t\t(none)" msgstr "\t\t(keine)" #, c-format msgid "\t%d entries" msgstr "\t%d Einträge" #, c-format msgid "\t%s" msgstr "\t%s" msgid "\tAfter fault: continue" msgstr "\tNach einem Fehler: fortfahren" #, c-format msgid "\tAlerts: %s" msgstr "\tAlarme: %s" msgid "\tBanner required" msgstr "\tBanner erforderlich" msgid "\tCharset sets:" msgstr "\tZeichensatz Set:" msgid "\tConnection: direct" msgstr "\tVerbindung: direkt" msgid "\tConnection: remote" msgstr "\tVerbindung: über Netz" msgid "\tContent types: any" msgstr "\tInhaltstypen: beliebig" msgid "\tDefault page size:" msgstr "\tVoreingestellte Seitengrösse:" msgid "\tDefault pitch:" msgstr "\tVoreingestellte Neigung:" msgid "\tDefault port settings:" msgstr "\tVoreingestellte Porteinstellungen:" #, c-format msgid "\tDescription: %s" msgstr "\tBeschreibung: %s" msgid "\tForm mounted:" msgstr "\tGeladenes Formblatt" msgid "\tForms allowed:" msgstr "\tErlaubte Formblätter:" #, c-format msgid "\tInterface: %s.ppd" msgstr "\tSchnittstelle: %s.ppd" #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "\tSchnittstelle: %s/ppp/%s.ppd" #, c-format msgid "\tLocation: %s" msgstr "\tOrt: %s" msgid "\tOn fault: no alert" msgstr "\tBei Fehlern: kein Alarm" msgid "\tPrinter types: unknown" msgstr "\tDruckertypen: unbekannt" #, c-format msgid "\tStatus: %s" msgstr "\tStatus: %s" msgid "\tUsers allowed:" msgstr "\tErlaubte Benutzer:" msgid "\tUsers denied:" msgstr "\tGesperrte Benutzer:" msgid "\tdaemon present" msgstr "\tDienst verfügbar" msgid "\tno entries" msgstr "\tKeine Einträge" #, c-format msgid "\tprinter is on device '%s' speed -1" msgstr "\tDrucker ist am Gerät '%s' Geschwindigkeit -1" msgid "\tprinting is disabled" msgstr "\tDrucken ist abgeschaltet" msgid "\tprinting is enabled" msgstr "\tDrucken ist eingeschaltet" #, c-format msgid "\tqueued for %s" msgstr "\tin Warteschlange eingereiht für %s" msgid "\tqueuing is disabled" msgstr "\tin Warteschlange einreihen gesperrt" msgid "\tqueuing is enabled" msgstr "\tin Warteschlange einreihen erlaubt" msgid "\treason unknown" msgstr "\tunbekannter Grund" msgid "" "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" msgid " REF: Page 15, section 3.1." msgstr " REF: Seite 15, Kap. 3.1." msgid " REF: Page 15, section 3.2." msgstr " REF: Seite 15, Kap. 3.2." msgid " REF: Page 19, section 3.3." msgstr " REF: Seite 19, Kap. 3.3." msgid " REF: Page 20, section 3.4." msgstr " REF: Seite 20, Kap. 3.4." msgid " REF: Page 27, section 3.5." msgstr " REF: Seite 27, Kap. 3.5." msgid " REF: Page 42, section 5.2." msgstr " REF: Seite 42, Kap. 5.2." msgid " REF: Pages 16-17, section 3.2." msgstr " REF: Seiten 16-17, Kap. 3.2." msgid " REF: Pages 42-45, section 5.2." msgstr " REF: Seiten 42-45, Kap. 5.2." msgid " REF: Pages 45-46, section 5.2." msgstr " REF: Seiten 45-46, Kap. 5.2." msgid " REF: Pages 48-49, section 5.2." msgstr " REF: Seiten 48-49, Kap. 5.2." msgid " REF: Pages 52-54, section 5.2." msgstr " REF: Seiten 52-52, Kap. 5.2." #, c-format msgid " %-39.39s %.0f bytes" msgstr "" #, c-format msgid " PASS Default%s" msgstr "" msgid " PASS DefaultImageableArea" msgstr "" msgid " PASS DefaultPaperDimension" msgstr "" msgid " PASS FileVersion" msgstr "" msgid " PASS FormatVersion" msgstr "" msgid " PASS LanguageEncoding" msgstr "" msgid " PASS LanguageVersion" msgstr "" msgid " PASS Manufacturer" msgstr "" msgid " PASS ModelName" msgstr "" msgid " PASS NickName" msgstr "" msgid " PASS PCFileName" msgstr "" msgid " PASS PSVersion" msgstr "" msgid " PASS PageRegion" msgstr "" msgid " PASS PageSize" msgstr "" msgid " PASS Product" msgstr "" msgid " PASS ShortNickName" msgstr "" #, c-format msgid " WARN %s has no corresponding options." msgstr " WARN %s hat keine entsprechenden Optionen." #, c-format msgid "" " WARN %s shares a common prefix with %s\n" " REF: Page 15, section 3.2." msgstr "" " WARN %s hat mit %s ein gemeinsames Präfix\n" " REF: Seite 15, Kap. 3.2." #, c-format msgid "" " WARN Duplex option keyword %s may not work as expected and should " "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." msgstr " WARN Datei einthält gemischt CR, LF, und CR LF Zeilenenden." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3." msgstr "" " WARN LanguageEncoding ist erforderlich gem. PPD 4.3 " "Spezifikation.\n" " REF: Seiten 56-57, Kap. 5.3." #, c-format msgid " WARN Line %d only contains whitespace." msgstr " WARN Zeile %d enthält nur Leerzeichen." msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" " WARN Nicht-Windows PPD Dateien sollten ausschließlich LF " "Zeilenenden verwenden, nicht CR LF." #, c-format msgid "" " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" " WARN Veraltete PPD Version %.1f.\n" " REF: Seite 42, Kap. 5.2." msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " %s \"%s %s\" conflicts with \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." msgstr "" " %s \"%s %s\" ist nicht vereinbar mit \"%s %s\"\n" " (constraint=\"%s %s %s %s\")." #, c-format msgid " %s %s %s does not exist." msgstr " %s %s %s existiert nicht." #, c-format msgid " %s %s file \"%s\" has the wrong capitalization." msgstr " %s %s Datei \"%s\" hat falsche Großschreibung." #, c-format msgid "" " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." msgstr "" " %s Ungültige UTF-8 »%s« Zeichenkette zur Übersetzung der Option %s, " "Auswahl %s." #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s." msgstr "" " %s Ungültige UTF-8 »%s« Zeichenkette zur Übersetzung der Option %s." #, c-format msgid " %s Bad cupsFilter value \"%s\"." msgstr " %s Wert für cupsFilter \"%s\"." #, c-format msgid " %s Bad cupsFilter2 value \"%s\"." msgstr " %s Ungültiger Wert für cupsFilter2 \"%s\"." #, c-format msgid " %s Bad cupsICCProfile %s." msgstr " %s Ungültiger Wert für cupsICCProfile %s." #, c-format msgid " %s Bad cupsPreFilter value \"%s\"." msgstr " %s Ungültiger Wert für cupsPreFilter \"%s\"." #, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"" msgstr " %s Ungültiger Wert für cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Bad language \"%s\"." msgstr " %s Ungültige Sprache \"%s\"." #, c-format msgid " %s Bad permissions on %s file \"%s\"." msgstr " %s Ungültige Rechte %s Datei \"%s\"." #, c-format msgid " %s Bad spelling of %s - should be %s." msgstr " %s Ungültige Schreibweise von %s - sollte %s sein." #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" #, c-format msgid " %s Default choices conflicting." msgstr " %s Wiedersprüchliche voreingestellte Auswahl." #, c-format msgid " %s Empty cupsUIConstraints %s" msgstr " %s Leere cupsUIConstraints %s" #, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s." msgstr " %s Fehlende \"%s\" Übersetzung für Option %s, Auswahl %s." #, c-format msgid " %s Missing \"%s\" translation string for option %s." msgstr " %s Fehlende \"%s\" Übersetzung für Option %s." #, c-format msgid " %s Missing %s file \"%s\"." msgstr " %s Fehlende %s Datei »%s«." #, c-format msgid "" " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s Missing cupsUIResolver %s" msgstr "" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." msgstr "" #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" msgstr "" #, c-format msgid " %s No base translation \"%s\" is included in file." msgstr "" #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." msgstr "" #, c-format msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." msgstr "" #, c-format msgid " %s Size \"%s\" should be \"%s\"." msgstr "" #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." msgstr "" #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." msgstr "" #, c-format msgid " %s cupsUIResolver %s causes a loop." msgstr " %s cupsUIResolver %s verursacht eine Schleife." #, c-format msgid "" " %s cupsUIResolver %s does not list at least two different options." msgstr "" #, c-format msgid "" " **FAIL** %s must be 1284DeviceID\n" " REF: Page 72, section 5.5" msgstr "" #, c-format msgid "" " **FAIL** Bad Default%s %s\n" " REF: Page 40, section 4.5." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultImageableArea %s\n" " REF: Page 102, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad DefaultPaperDimension %s\n" " REF: Page 103, section 5.15." msgstr "" #, c-format msgid "" " **FAIL** Bad FileVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad FormatVersion \"%s\"\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** Bad JobPatchFile attribute in file\n" " REF: Page 24, section 3.4." msgstr "" #, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." msgstr "" #, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English." msgstr "" #, c-format msgid "" " **FAIL** Bad Manufacturer (should be \"%s\")\n" " REF: Page 211, table D.1." msgstr "" #, c-format msgid "" " **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** Bad PSVersion - not \"(string) int\".\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** Bad Product - not \"(string)\".\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** Bad ShortNickName - longer than 31 chars.\n" " REF: Pages 64-65, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** Bad option %s choice %s\n" " REF: Page 84, section 5.9" msgstr "" #, c-format msgid " **FAIL** Default option code cannot be interpreted: %s" msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s choice %s contains " "8-bit characters." msgstr "" #, c-format msgid "" " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" #, c-format msgid " **FAIL** Group names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Multiple occurrences of option %s choice name %s." msgstr "" #, c-format msgid " **FAIL** Option %s choice names %s and %s differ only by case." msgstr "" #, c-format msgid " **FAIL** Option names %s and %s differ only by case." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED Default%s\n" " REF: Page 40, section 4.5." msgstr "" msgid "" " **FAIL** REQUIRED DefaultImageableArea\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED DefaultPaperDimension\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED ImageableArea for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 102, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" #, c-format msgid "" " **FAIL** REQUIRED PaperDimension for PageSize %s\n" " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." msgstr "" #, c-format msgid " %d ERRORS FOUND" msgstr " %d FEHLER GEFUNDEN" msgid " NO ERRORS FOUND" msgstr " KEINE FEHLER GEFUNDEN" msgid " --cr End lines with CR (Mac OS 9)." msgstr " --cr Zeilenenden mit CR (Mac OS 9)" msgid " --crlf End lines with CR + LF (Windows)." msgstr " --crlf Zeilenenden mit CR+LF (Windows)" msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr " --lf Zeilenenden mit LF (UNIX/Linux/macOS)." msgid " --list-filters List filters that will be used." msgstr " --list-filters Liste die Filter auf die benutzt werden." msgid " -D Remove the input file when finished." msgstr " -D Lösche die Eingabe nach Beenden." msgid " -D name=value Set named variable to value." msgstr " -D Name=Wert Variable »Name« den »Wert« zuordnen." msgid " -I include-dir Add include directory to search path." msgstr "" " -I Inklus.Verz. Inklusionsverzeichnis dem Suchpfad hinzufügen." msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd Lege PPD Datei fest." msgid " -U username Specify username." msgstr " -U username Gebe den Benutzernamen an." msgid " -c catalog.po Load the specified message catalog." msgstr " -c Katalog.po Lade den angegebenen Nachrichtenkatalog." msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" " -c cups-files.conf Setze die zu benutzende Datei cups-files.conf" msgid " -d output-dir Specify the output directory." msgstr " -d AusgabeVerz. Angabe des Ausgabeverzeichnisses." msgid " -d printer Use the named printer." msgstr " -d printer Benutze den genannten Drucker." msgid " -e Use every filter from the PPD file." msgstr " -e Benutzt jeden Filter der PPD Datei." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" " -i mime/type Legt den MIME-typ der Eingabe fest (sonst " "selbsterkennend)." msgid "" " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] Spezifiziere die Ausgabesprache(n) (locale)." msgid " -m Use the ModelName value as the filename." msgstr " -m Verwende den ModellNamen als Dateinamen." msgid "" " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" " -m mime/type Legt den MIME-Typ der Ausgabe fest (sonst " "application/pdf)." msgid " -n copies Set number of copies." msgstr " -n copies Lege die Anzahl der Kopien fest." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." msgstr "" " -o Dateiname.drv Legt die Treiberinformationsdatei fest (sonst ppdi." "drv)." msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" " -o Dateiname.ppd[.gz] Legt den Dateinamen der Ausgabe fest (sonst " "stdout)." msgid " -o name=value Set option(s)." msgstr " -o Name=Wert Option(en) festlegen." msgid " -p filename.ppd Set PPD file." msgstr " -p filename.ppd PPD-Datei festlegen." msgid " -t Test PPDs instead of generating them." msgstr " -t Teste PPDs anstelle sie zu erzeugen." msgid " -t title Set title." msgstr " -t Titel Legt den Titel fest." msgid " -u Remove the PPD file when finished." msgstr " -u PPD-Datei nach dem Fertigstellen löschen." msgid " -v Be verbose." msgstr " -v Ausführliche Ausgabe." msgid " -z Compress PPD files using GNU zip." msgstr "" " -z Komprimiere PPD Datei unter Verwendung von GNU zip." msgid " FAIL" msgstr "" msgid " PASS" msgstr "BESTANDEN" msgid "! expression Unary NOT of expression" msgstr "" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "\"%s\": Falscher URI-Wert \"%s\" - %s (RFC 8011 Abschnitt 5.1.6)." #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" "\"%s\": Falscher URI-Wert \"%s\" - falsche Länge %d (RFC 8011 Abschnitt " "5.1.6)." #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" "\"%s\": Falscher Attributname - falsche Länge %d (RFC 8011 Abschnitt 5.1.4)." #, c-format msgid "" "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" "\"%s\": Falscher Attributname - ungültiges Zeichen (RFC 8011 Abschnitt " "5.1.4)." #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" "\"%s\": Falscher Zeichensatzwert \"%s\" - falsche Zeichen (RFC 8011 " "Abschnitt 5.1.8)." #, c-format msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" "\"%s\": Falscher Schlüsselwortwert \"%s\" - falsche Länge %d (RFC 8011 " "Abschnitt 5.1.4)." #, c-format msgid "" "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section " "5.1.4)." msgstr "" "\"%s\": Falscher Schlüsselwortwert \"%s\" - ungültiges Zeichen (RFC 8011 " "Abschnitt 5.1.4)." #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" "\"%s\": Falscher Namenswert \"%s\" - falsche UTF-8-Sequenz (RFC 8011 " "Abschnitt 5.1.3)." #, c-format msgid "" "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" "\"%s\": Falsches Namenswert \"%s\" - falsche Länge %d (RFC 8011 Abschnitt " "5.1.3)." #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" #, c-format msgid "" "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" #, c-format msgid "" "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 " "section 5.1.14)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section " "5.1.16)." msgstr "" "\"%s\": Falscher Auflösungswert %dx%d%s - falscher Einheitenwert (RFC 8011 " "Abschnitt 5.1.16)." #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be " "positive (RFC 8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC " "8011 section 5.1.16)." msgstr "" #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" "\"%s\": Falscher Textwert \"%s\" - falsche UTF-8-Sequenz (RFC 8011 Abschnitt " "5.1.2)." #, c-format msgid "" "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" "\"%s\": Falscher Textwert \"%s\" - falsche Länge %d (RFC 8011 Abschnitt " "5.1.2)." #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" "\"%s\": Falscher uriScheme-Wert \"%s\" - falsche Zeichen (RFC 8011 Abschnitt " "5.1.7)." #, c-format msgid "" "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" "\"%s\": Falscher uriScheme-Wert \"%s\" - falsche Länge %d (RFC 8011 " "Abschnitt 5.1.7)." msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f Bytes" #, c-format msgid "%d x %d mm" msgstr "%d x %d mm" #, c-format msgid "%g x %g \"" msgstr "%g x %g \"" #, c-format msgid "%s (%s)" msgstr "%s (%s)" #, c-format msgid "%s (%s, %s)" msgstr "%s (%s, %s)" #, c-format msgid "%s (Borderless)" msgstr "%s (Randlos)" #, c-format msgid "%s (Borderless, %s)" msgstr "%s (Randlos, %s)" #, c-format msgid "%s (Borderless, %s, %s)" msgstr "%s (Randlos, %s, %s)" #, c-format msgid "%s accepting requests since %s" msgstr "%s akzeptiert Anfragen seit %s" #, c-format msgid "%s cannot be changed." msgstr "%s kann nicht geändert werden." #, c-format msgid "%s is not implemented by the CUPS version of lpc." msgstr "%s ist in der CUPS-Version von lpc nicht implementiert." #, c-format msgid "%s is not ready" msgstr "%s ist nicht bereit" #, c-format msgid "%s is ready" msgstr "%s ist bereit" #, c-format msgid "%s is ready and printing" msgstr "%s ist bereit und druckt" #, c-format msgid "%s job-id user title copies options [file]" msgstr "%s Auftrags-ID Benutzer Titel Kopien Optionen [Datei]" #, c-format msgid "%s not accepting requests since %s -" msgstr "%s akzeptiert keine Anfragen seit %s -" #, c-format msgid "%s not supported." msgstr "%s wird nicht unterstützt." #, c-format msgid "%s/%s accepting requests since %s" msgstr "%s/%s akzeptiert Anfragen seit %s" #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "%s/%s akzeptiert keine Anfragen seit %s -" #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "%s: %-33.33s [Auftrag %d localhost]" #. TRANSLATORS: Message is "subject: error" #, c-format msgid "%s: %s" msgstr "%s: %s" #, c-format msgid "%s: %s failed: %s" msgstr "%s: %s fehlgeschlagen: %s" #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "%s: Ungültige Drucker-URI \"%s\"." #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "%s: Ungültige Version %s für \"-V\"." #, c-format msgid "%s: Don't know what to do." msgstr "%s: Es ist nicht klar, was zu tun ist." #, c-format msgid "%s: Error - %s" msgstr "%s: Fehler - %s" #, c-format msgid "" "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" "%s: Fehler - Umgebungsvariable %s benennt nicht existierendes Ziel \"%s\"." #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Fehler - füge '/version=1.1' zum Servernamen hinzu." #, c-format msgid "%s: Error - bad job ID." msgstr "%s: Fehler - ungültige Auftrags-ID." #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" "%s: Fehler - kann nicht gleichzeitig Dateien drucken und Aufträge ändern." #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" "%s: Fehler - Kann von der Standardeingabe nicht drucken, wenn eine Datei " "oder Auftrags-ID übergeben werden." #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "%s: Fehler - Kopien müssen 1 oder mehr sein." #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Fehler - Zeichensatz nach der Option \"-S\" erwartet." #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "%s: Fehler - Inhaltstyp nach der Option \"-T\" erwartet." #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "%s: Fehler - Kopienanzahl nach der Option \"-#\" erwartet." #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "%s: Fehler - Kopienzahl nach der Option \"-n\" erwartet." #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Fehler - Zielangabe nach der Option \"-P\" erwartet." #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "%s: Fehler - Zielangabe nach der Option \"-d\" erwartet." #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Fehler - erwarte hold name nach \"-H\" Option." #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "%s: Fehler - Hostname nach der Option \"-H\" erwartet." #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "%s: Fehler - Hostname nach der Option \"-h\" erwartet." #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Fehler - Modusliste nach der Option \"-y\" erwartet." #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "%s: Fehler - Name nach der Option \"-%c\" erwartet." #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Fehler - Option=Wert nach der Option \"-o\" erwartet." #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "%s: Fehler - Seitenliste nach der Option \"-P\" erwartet." #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Fehler - Priorität nach der Option \"-%c\" erwartet." #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "%s: Fehler - Grund nach der Option \"-r\" erwartet." #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Fehler - Titel nach der Option \"-t\" erwartet." #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "%s: Fehler - Benutzername nach der Option \"-U\" erwartet." #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "%s: Fehler - Benutzername nach der Option \"-u\" erwartet." #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "%s: Fehler - Wert nach der Option \"-%c\" erwartet." #, c-format msgid "" "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " "option." msgstr "" "%s: Fehler - benötigt \"completed\", \"not-completed\", oder \"all\" nach " "Option \"-W\"." #, c-format msgid "%s: Error - no default destination available." msgstr "%s: Fehler - kein voreingestelltes Druckziel verfügbar." #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "%s: Fehler - Priorität muss zwischen 1 und 100 liegen." #, c-format msgid "%s: Error - scheduler not responding." msgstr "%s: Fehler - Zeitplandienst antwortet nicht." #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "%s: Fehler - zu viele Dateien - \"%s\"." #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "%s: Fehler - Zugriff auf \"%s\" nicht möglich - %s" #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "" #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "%s: Fehler - unbekanntes Druckziel \"%s\"." #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "%s: Fehler - unbekanntes Druckziel \"%s/%s\"." #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "%s: Fehler - unbekannte Option \"%c\"." #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "%s: Fehler - unbekannte Option \"%s\"." #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Auftrags-ID nach der Option \"-i\" erwartet." #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "%s: Ungültiger Zielname in Liste \"%s\"." #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "%s: Ungültige Filterzeichenkette \"%s\"." #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "%s: Fehlender Dateiname für \"-P\"." #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "%s: Fehlende Zeitüberschreitung für \"-T\"." #, c-format msgid "%s: Missing version for \"-V\"." msgstr "%s: Fehlende Version für \"-V\"." #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "%s: Benötigt Auftrags-ID (\"-i jobid\") vor \"-H restart\"." #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "%s: Kein Filter zum Umwandeln von %s/%s nach %s/%s." #, c-format msgid "%s: Operation failed: %s" msgstr "%s: Vorgang fehlgeschlagen: %s" #, c-format msgid "%s: Sorry, no encryption support." msgstr "%s: Entschuldigung, Verschlüsselung wird nicht unterstützt." #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "%s: Verbindung zu \"%s:%d\": %s nicht möglich" #, c-format msgid "%s: Unable to connect to server." msgstr "%s: Verbindung zum Server nicht möglich." #, c-format msgid "%s: Unable to contact server." msgstr "%s: Server kontaktieren nicht möglich." #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "%s: Erzeugung der PPD Datei nicht möglich: %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "%s: Ermittlung des MIME-Typs von \"%s\" nicht möglich." #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "%s: Öffnen von \"%s\": %s nicht möglich" #, c-format msgid "%s: Unable to open %s: %s" msgstr "%s: Öffnen von %s: %s nicht möglich" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "%s: Öffnen der PPD-Datei: %s in Zeile %d." #, c-format msgid "%s: Unable to query printer: %s" msgstr "" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "%s: Lesen der MIME-Datenbank von \"%s\" oder \"%s\" nicht möglich." #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "%s: Auflösen von \"%s\" nicht möglich." #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "%s: Unbekanntes Argument \"%s\"." #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "%s: Unbekanntes Druckziel \"%s\"." #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "%s: Unbekannter Ziel-MIME-Typ %s/%s." #, c-format msgid "%s: Unknown option \"%c\"." msgstr "%s: Unbekannte Option \"%c\"." #, c-format msgid "%s: Unknown option \"%s\"." msgstr "%s: Unbekannte Option \"%s\"." #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "%s: Unbekannte Option \"-%c\"." #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "%s: Unbekannter Quell-MIME-Typ %s/%s." #, c-format msgid "" "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" #, c-format msgid "%s: Warning - character set option ignored." msgstr "%s: Warnung - Zeichensatzoption ignoriert." #, c-format msgid "%s: Warning - content type option ignored." msgstr "%s: Warnung - Inhaltstypenoption ignoriert." #, c-format msgid "%s: Warning - form option ignored." msgstr "" #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Warnung - Modusoption ignoriert." msgid "( expressions ) Group expressions" msgstr "" msgid "- Cancel all jobs" msgstr "" msgid "-# num-copies Specify the number of copies to print" msgstr "" msgid "--[no-]debug-logging Turn debug logging on/off" msgstr "" msgid "--[no-]remote-admin Turn remote administration on/off" msgstr "" msgid "--[no-]remote-any Allow/prevent access from the Internet" msgstr "" msgid "--[no-]share-printers Turn printer sharing on/off" msgstr "" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" msgid "" "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" msgid "--domain regex Match domain to regular expression" msgstr "" msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "--false Always false" msgstr "" msgid "--help Show program help" msgstr "" msgid "--hold Hold new jobs" msgstr "" msgid "--host regex Match hostname to regular expression" msgstr "" msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" msgid "--ippserver filename Produce ippserver attribute file" msgstr "" msgid "--language locale Show models matching the given locale" msgstr "" msgid "--local True if service is local" msgstr "" msgid "--ls List attributes" msgstr "" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" msgstr "" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" msgid "--not expression Unary NOT of expression" msgstr "" msgid "--path regex Match resource path to regular expression" msgstr "" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" msgstr "" msgid "--print-name Print service name if true" msgstr "" msgid "" "--product name Show models matching the given PostScript product" msgstr "" msgid "--quiet Quietly report match via exit code" msgstr "" msgid "--release Release previously held jobs" msgstr "" msgid "--remote True if service is remote" msgstr "" msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" msgid "" "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" msgid "--true Always true" msgstr "" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" msgid "--uri regex Match URI to regular expression" msgstr "" msgid "--version Show program version" msgstr "" msgid "--version Show version" msgstr "" msgid "-1" msgstr "-1" msgid "-10" msgstr "-10" msgid "-100" msgstr "-100" msgid "-105" msgstr "-105" msgid "-11" msgstr "-11" msgid "-110" msgstr "-110" msgid "-115" msgstr "-115" msgid "-12" msgstr "-12" msgid "-120" msgstr "-120" msgid "-13" msgstr "-13" msgid "-14" msgstr "-14" msgid "-15" msgstr "-15" msgid "-2" msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" msgid "-20" msgstr "-20" msgid "-25" msgstr "-25" msgid "-3" msgstr "-3" msgid "-30" msgstr "-30" msgid "-35" msgstr "-35" msgid "-4" msgstr "-4" msgid "-4 Connect using IPv4" msgstr "" msgid "-40" msgstr "-40" msgid "-45" msgstr "-45" msgid "-5" msgstr "-5" msgid "-50" msgstr "-50" msgid "-55" msgstr "-55" msgid "-6" msgstr "-6" msgid "-6 Connect using IPv6" msgstr "" msgid "-60" msgstr "-60" msgid "-65" msgstr "-65" msgid "-7" msgstr "-7" msgid "-70" msgstr "-70" msgid "-75" msgstr "-75" msgid "-8" msgstr "-8" msgid "-80" msgstr "-80" msgid "-85" msgstr "-85" msgid "-9" msgstr "-9" msgid "-90" msgstr "-90" msgid "-95" msgstr "-95" msgid "-C Send requests using chunking (default)" msgstr "" msgid "-D description Specify the textual description of the printer" msgstr "" msgid "-D device-uri Set the device URI for the printer" msgstr "" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" msgid "-E Encrypt the connection to the server" msgstr "" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" msgid "-F Run in the foreground but detach from console." msgstr "" msgid "-F output-type/subtype Set the output format for the printer" msgstr "" msgid "-H Show the default server and port" msgstr "" msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" msgid "-H hold Hold the job until released/resumed" msgstr "" msgid "-H immediate Print the job as soon as possible" msgstr "" msgid "-H restart Reprint the job" msgstr "" msgid "-H resume Resume a held job" msgstr "" msgid "-H server[:port] Connect to the named server and port" msgstr "" msgid "-I Ignore errors" msgstr "" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" msgid "-L Send requests using content-length" msgstr "" msgid "-L location Specify the textual location of the printer" msgstr "" msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" msgid "-P destination Show status for the specified destination" msgstr "" msgid "-P destination Specify the destination" msgstr "" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" msgid "-P number[-number] Match port to number or range" msgstr "" msgid "-P page-list Specify a list of pages to print" msgstr "" msgid "-R Show the ranking of jobs" msgstr "" msgid "-R name-default Remove the default value for the named option" msgstr "" msgid "-R root-directory Set alternate root" msgstr "" msgid "-S Test with encryption using HTTPS" msgstr "" msgid "-T seconds Set the browse timeout in seconds" msgstr "" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" msgid "-T title Specify the job title" msgstr "" msgid "-U username Specify the username to use for authentication" msgstr "" msgid "-U username Specify username to use for authentication" msgstr "" msgid "-V version Set default IPP version" msgstr "" msgid "-W completed Show completed jobs" msgstr "" msgid "-W not-completed Show pending jobs" msgstr "" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," "translations}\n" " Issue warnings instead of errors" msgstr "" msgid "-X Produce XML plist instead of plain text" msgstr "" msgid "-a Cancel all jobs" msgstr "" msgid "-a Show jobs on all destinations" msgstr "" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" msgid "-a filename.conf Load printer attributes from conf file" msgstr "" msgid "-c Make a copy of the print file(s)" msgstr "" msgid "-c Produce CSV output" msgstr "" msgid "-c [class(es)] Show classes and their member printers" msgstr "" msgid "-c class Add the named destination to a class" msgstr "" msgid "-c command Set print command" msgstr "" msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" msgid "-d Show the default destination" msgstr "" msgid "-d destination Set default destination" msgstr "" msgid "-d destination Set the named destination as the server default" msgstr "" msgid "-d name=value Set named variable to value" msgstr "" msgid "-d regex Match domain to regular expression" msgstr "" msgid "-d spool-directory Set spool directory" msgstr "" msgid "-e Show available destinations on the network" msgstr "" msgid "-f Run in the foreground." msgstr "" msgid "-f filename Set default request filename" msgstr "" msgid "-f type/subtype[,...] Set supported file types" msgstr "" msgid "-h Show this usage message." msgstr "" msgid "-h Validate HTTP response headers" msgstr "" msgid "-h regex Match hostname to regular expression" msgstr "" msgid "-h server[:port] Connect to the named server and port" msgstr "" msgid "-i iconfile.png Set icon file" msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "" msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" msgid "-k Keep job spool files" msgstr "" msgid "-l List attributes" msgstr "" msgid "-l Produce plain text output" msgstr "" msgid "-l Run cupsd on demand." msgstr "" msgid "-l Show supported options and values" msgstr "" msgid "-l Show verbose (long) output" msgstr "" msgid "-l location Set location of printer" msgstr "" msgid "" "-m Send an email notification when the job completes" msgstr "" msgid "-m Show models" msgstr "" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" msgid "-m model Set model name (default=Printer)" msgstr "" msgid "" "-m model Specify a standard model/PPD file for the printer" msgstr "" msgid "-n count Repeat the last file the given number of times" msgstr "" msgid "-n hostname Set hostname for printer" msgstr "" msgid "-n num-copies Specify the number of copies to print" msgstr "" msgid "-n regex Match service name to regular expression" msgstr "" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" msgstr "" msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" msgid "-o media=size Specify the media size to use" msgstr "" msgid "-o name-default=value Specify the default value for the named option" msgstr "" msgid "-o name[=value] Set default option and value" msgstr "" msgid "" "-o number-up=N Specify that input pages should be printed N-up (1, " "2, 4, 6, 9, and 16 are supported)" msgstr "" msgid "-o option[=value] Specify a printer-specific option" msgstr "" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" msgid "-p destination Specify a destination" msgstr "" msgid "-p destination Specify/add the named destination" msgstr "" msgid "-p port Set port number for printer" msgstr "" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" msgstr "" msgid "-q Specify the job should be held for printing" msgstr "" msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" msgid "-r Remove the file(s) after submission" msgstr "" msgid "-r Show whether the CUPS server is running" msgstr "" msgid "-r True if service is remote" msgstr "" msgid "-r Use 'relaxed' open mode" msgstr "" msgid "-r class Remove the named destination from a class" msgstr "" msgid "-r reason Specify a reason message that others can see" msgstr "" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" msgstr "" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" msgstr "" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" msgstr "" msgid "-t Show all status information" msgstr "" msgid "-t Test the configuration file." msgstr "" msgid "-t key True if the TXT record contains the key" msgstr "" msgid "-t title Specify the job title" msgstr "" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" msgid "-u allow:all Allow all users to print" msgstr "" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" msgid "" "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" msgid "-u owner Specify the owner to use for jobs" msgstr "" msgid "-u regex Match URI to regular expression" msgstr "" msgid "-v Be verbose" msgstr "" msgid "-v Show devices" msgstr "" msgid "-v [printer(s)] Show the devices for each destination" msgstr "" msgid "-v device-uri Specify the device URI for the printer" msgstr "" msgid "-vv Be very verbose" msgstr "" msgid "-x Purge jobs rather than just canceling" msgstr "" msgid "-x destination Remove default options for destination" msgstr "" msgid "-x destination Remove the named destination" msgstr "" msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" msgid "0" msgstr "0" msgid "1" msgstr "1" msgid "1 inch/sec." msgstr "1 inch/s" # Die Verwendung des x ist nur ersatzweise erlaubt, typografisch korrekt und in UTF-8 auch möglich ist × # Keine Leerzeichen zwischen Zahl und ×! # Die Verwendung von " für die Einheit Inch ist nicht zulässig (ISO 80000). # Die Bezeichnung "Zoll" ist nicht korrekt. msgid "1.25x0.25\"" msgstr "1,25×0,25 inch" msgid "1.25x2.25\"" msgstr "1,25 × 2,25 inch" msgid "1.5 inch/sec." msgstr "1,5 inch/s" msgid "1.50x0.25\"" msgstr "1,50 × 0,25 inch" msgid "1.50x0.50\"" msgstr "1,50 × 0,50 inch" msgid "1.50x1.00\"" msgstr "1,50 × 1,00 inch" msgid "1.50x2.00\"" msgstr "1,50 × 2,00 inch" msgid "10" msgstr "10" # Die SI Einheit Sekunde wird korrekt nur mit s abgekürzt (ISO 31), (sek ist nicht zulässig) msgid "10 inches/sec." msgstr "10 inch/s" msgid "10 x 11" msgstr "10 × 11 inch" msgid "10 x 13" msgstr "10 × 13 inch" msgid "10 x 14" msgstr "10 × 14 inch" msgid "100" msgstr "100" msgid "100 mm/sec." msgstr "100 mm/s" msgid "105" msgstr "105" msgid "11" msgstr "11" msgid "11 inches/sec." msgstr "11 inch/s" msgid "110" msgstr "110" msgid "115" msgstr "115" msgid "12" msgstr "12" msgid "12 inches/sec." msgstr "12 inch/s" msgid "12 x 11" msgstr "12 × 11 inch" msgid "120" msgstr "120" msgid "120 mm/sec." msgstr "120 mm/s" msgid "120x60dpi" msgstr "120 × 60 dpi" msgid "120x72dpi" msgstr "120 × 72 dpi" msgid "13" msgstr "13" msgid "136dpi" msgstr "136 dpi" msgid "14" msgstr "14" msgid "15" msgstr "15" msgid "15 mm/sec." msgstr "15 mm/s" msgid "15 x 11" msgstr "15 x 11" msgid "150 mm/sec." msgstr "150 mm/s" msgid "150dpi" msgstr "150 dpi" msgid "16" msgstr "16" msgid "17" msgstr "17" msgid "18" msgstr "18" msgid "180dpi" msgstr "180 dpi" msgid "19" msgstr "19" msgid "2" msgstr "2" msgid "2 inches/sec." msgstr "2 inch/s" msgid "2-Sided Printing" msgstr "Doppelseitig drucken" msgid "2.00x0.37\"" msgstr "2,00 × 0,37 inch" msgid "2.00x0.50\"" msgstr "2,00 × 0,50 inch" msgid "2.00x1.00\"" msgstr "2,00 × 1,00 inch" msgid "2.00x1.25\"" msgstr "2,00 × 1,25 inch" msgid "2.00x2.00\"" msgstr "2,00 × 2,00 inch" msgid "2.00x3.00\"" msgstr "2,00 × 3,00 inch" msgid "2.00x4.00\"" msgstr "2,00 × 4,00 inch" msgid "2.00x5.50\"" msgstr "2,00 × 5,50 inch" msgid "2.25x0.50\"" msgstr "2,25 × 0,50 inch" msgid "2.25x1.25\"" msgstr "2,25 × 1,25 inch" msgid "2.25x4.00\"" msgstr "2,25 × 4,00 inch" msgid "2.25x5.50\"" msgstr "2,25 × 5,50 inch" msgid "2.38x5.50\"" msgstr "2,38 × 5,50 inch" msgid "2.5 inches/sec." msgstr "2,5 inch/s" msgid "2.50x1.00\"" msgstr "2,50 × 1,00 inch" msgid "2.50x2.00\"" msgstr "2,50 × 2,00 inch" msgid "2.75x1.25\"" msgstr "2,75 × 1,25 inch" msgid "2.9 x 1\"" msgstr "2.9 × 1 inch" msgid "20" msgstr "20" msgid "20 mm/sec." msgstr "20 mm/s" msgid "200 mm/sec." msgstr "200 mm/s" msgid "203dpi" msgstr "203 dpi" msgid "21" msgstr "21" msgid "22" msgstr "22" msgid "23" msgstr "23" msgid "24" msgstr "24" msgid "24-Pin Series" msgstr "24-Pin Serie" msgid "240x72dpi" msgstr "240 × 72 dpi" msgid "25" msgstr "25" msgid "250 mm/sec." msgstr "250 mm/s" msgid "26" msgstr "26" msgid "27" msgstr "27" msgid "28" msgstr "28" msgid "29" msgstr "29" msgid "3" msgstr "3" msgid "3 inches/sec." msgstr "3 inch/s" msgid "3 x 5" msgstr "3 × 5" msgid "3.00x1.00\"" msgstr "3,00 × 1,00 inch" msgid "3.00x1.25\"" msgstr "3,00 × 1,25 inch" msgid "3.00x2.00\"" msgstr "3,00 × 2,00 inch" msgid "3.00x3.00\"" msgstr "3,00 × 3,00 inch" msgid "3.00x5.00\"" msgstr "3,00 × 5,00 inch" msgid "3.25x2.00\"" msgstr "3,25 × 2,00 inch" msgid "3.25x5.00\"" msgstr "3,25 × 5,00 inch" msgid "3.25x5.50\"" msgstr "3,25 × 5,50 inch" msgid "3.25x5.83\"" msgstr "3,25 × 5,83 inch" msgid "3.25x7.83\"" msgstr "3,25 × 7,83 inch" msgid "3.5 x 5" msgstr "3,5 × 5 inch" msgid "3.5\" Disk" msgstr "3,5 inch Disk" msgid "3.50x1.00\"" msgstr "3,50 × 1,00 inch" msgid "30" msgstr "30" msgid "30 mm/sec." msgstr "30 mm/s" msgid "300 mm/sec." msgstr "300 mm/s" msgid "300dpi" msgstr "300 dpi" msgid "35" msgstr "35" msgid "360dpi" msgstr "360 dpi" msgid "360x180dpi" msgstr "360 × 180 dpi" msgid "4" msgstr "4" msgid "4 inches/sec." msgstr "4 inch/s" msgid "4.00x1.00\"" msgstr "4,00 × 1,00 inch" msgid "4.00x13.00\"" msgstr "4,00 × 13,00 inch" msgid "4.00x2.00\"" msgstr "4,00 × 2,00 inch" msgid "4.00x2.50\"" msgstr "4,00 × 2,50 inch" msgid "4.00x3.00\"" msgstr "4,00 × 3,00 inch" msgid "4.00x4.00\"" msgstr "4,00 × 4,00 inch" msgid "4.00x5.00\"" msgstr "4,00 × 5,00 inch" msgid "4.00x6.00\"" msgstr "4,00 × 6,00 inch" msgid "4.00x6.50\"" msgstr "4,00 × 6,50 inch" msgid "40" msgstr "40" msgid "40 mm/sec." msgstr "40 mm/s" msgid "45" msgstr "45" msgid "5" msgstr "5" msgid "5 inches/sec." msgstr "5 inch/s" msgid "5 x 7" msgstr "5 × 7" msgid "50" msgstr "50" msgid "55" msgstr "55" msgid "6" msgstr "6" msgid "6 inches/sec." msgstr "6 inch/s" msgid "6.00x1.00\"" msgstr "6,00 × 1,00 inch" msgid "6.00x2.00\"" msgstr "6,00 × 2,00 inch" msgid "6.00x3.00\"" msgstr "6,00 × 3,00 inch" msgid "6.00x4.00\"" msgstr "6,00 × 4,00 inch" msgid "6.00x5.00\"" msgstr "6,00 × 5,00 inch" msgid "6.00x6.00\"" msgstr "6,00 × 6,00 inch" msgid "6.00x6.50\"" msgstr "6,00 × 6,50 inch" msgid "60" msgstr "60" msgid "60 mm/sec." msgstr "60 mm/s" msgid "600dpi" msgstr "600 dpi" msgid "60dpi" msgstr "60 dpi" msgid "60x72dpi" msgstr "60 × 72 dpi" msgid "65" msgstr "65" msgid "7" msgstr "7" msgid "7 inches/sec." msgstr "7 inch/s" msgid "7 x 9" msgstr "7 × 9" msgid "70" msgstr "70" msgid "75" msgstr "75" msgid "8" msgstr "8" msgid "8 inches/sec." msgstr "8 inch/s" msgid "8 x 10" msgstr "8 × 10 inch" msgid "8.00x1.00\"" msgstr "8,00 × 1,00 inch" msgid "8.00x2.00\"" msgstr "8,00 × 2,00 inch" msgid "8.00x3.00\"" msgstr "8,00 × 3,00 inch" msgid "8.00x4.00\"" msgstr "8,00 × 4,00 inch" msgid "8.00x5.00\"" msgstr "8,00 × 5,00 inch" msgid "8.00x6.00\"" msgstr "8,00 × 6,00 inch" msgid "8.00x6.50\"" msgstr "8,00 × 6,50 inch" msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/s" msgid "85" msgstr "85" msgid "9" msgstr "9" msgid "9 inches/sec." msgstr "9 inch/s" msgid "9 x 11" msgstr "9×12" msgid "9 x 12" msgstr "9×12" msgid "9-Pin Series" msgstr "9-Pin Serie" msgid "90" msgstr "90" msgid "95" msgstr "95" msgid "?Invalid help command unknown." msgstr "?Ungültiger Hilfebefehl unbekannt." #, c-format msgid "A class named \"%s\" already exists." msgstr "Eine Klasse mit dem Namen \"%s\" existiert bereits." #, c-format msgid "A printer named \"%s\" already exists." msgstr "Ein Drucker mit dem Namen \"%s\" existiert bereits." msgid "A0" msgstr "DIN A0" msgid "A0 Long Edge" msgstr "A0 lange Kante" msgid "A1" msgstr "DIN A1" msgid "A1 Long Edge" msgstr "A1 lange Kante" msgid "A10" msgstr "DIN A10" msgid "A2" msgstr "DIN A2" msgid "A2 Long Edge" msgstr "A2 lange Kante" msgid "A3" msgstr "DIN A3" msgid "A3 Long Edge" msgstr "A3 lange Kante" msgid "A3 Oversize" msgstr "A3 Übergröße" msgid "A3 Oversize Long Edge" msgstr "A3 Übergröße lange Kante" msgid "A4" msgstr "DIN A4" msgid "A4 Long Edge" msgstr "A4 lange Kante" msgid "A4 Oversize" msgstr "A4 Übergröße" msgid "A4 Small" msgstr "A4 klein" msgid "A5" msgstr "DIN A5" msgid "A5 Long Edge" msgstr "A5 lange Kante" msgid "A5 Oversize" msgstr "A5 Übergröße" msgid "A6" msgstr "DIN A6" msgid "A6 Long Edge" msgstr "A6 lange Kante" msgid "A7" msgstr "DIN A7" msgid "A8" msgstr "DIN A8" msgid "A9" msgstr "DIN A9" msgid "ANSI A" msgstr "ANSI A" msgid "ANSI B" msgstr "ANSI B" msgid "ANSI C" msgstr "ANSI C" msgid "ANSI D" msgstr "ANSI D" msgid "ANSI E" msgstr "ANSI E" msgid "ARCH C" msgstr "ARCH C" msgid "ARCH C Long Edge" msgstr "ARCH C lange Kante" msgid "ARCH D" msgstr "ARCH D" msgid "ARCH D Long Edge" msgstr "ARCH D lange Kante" msgid "ARCH E" msgstr "ARCH E" msgid "ARCH E Long Edge" msgstr "ARCH E lange Kante" msgid "Accept Jobs" msgstr "Druckaufträge akzeptieren" msgid "Accepted" msgstr "Akzeptiert" msgid "Add Class" msgstr "Klasse hinzufügen" msgid "Add Printer" msgstr "Drucker hinzufügen" msgid "Address" msgstr "Adresse" msgid "Administration" msgstr "Verwaltung" msgid "Always" msgstr "Immer" msgid "AppSocket/HP JetDirect" msgstr "AppSocket/HP JetDirect" msgid "Applicator" msgstr "Applikator" #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "Versuch den %s Druckerstatus auf einen ungültigen %d Wert zu setzen." #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "Attribut \"%s\" ist in der falschen Gruppe." #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "Attribut \"%s\" ist der falsche Werttyp." #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "Attributgruppen sind nicht in der Reihenfolge (%x < %x)." msgid "B0" msgstr "DIN B0" msgid "B1" msgstr "DIN B1" msgid "B10" msgstr "DIN B10" msgid "B2" msgstr "DIN B2" msgid "B3" msgstr "DIN B3" msgid "B4" msgstr "DIN B4" msgid "B5" msgstr "DIN B5" msgid "B5 Oversize" msgstr "B5 Übergröße" msgid "B6" msgstr "DIN B6" msgid "B7" msgstr "DIN B7" msgid "B8" msgstr "DIN B8" msgid "B9" msgstr "DIN B9" #, c-format msgid "Bad \"printer-id\" value %d." msgstr "Falscher \"printer-id\" Wert %d." #, c-format msgid "Bad '%s' value." msgstr "" #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "Fehlerhafter 'document-format' Wert \"%s\"." msgid "Bad CloseUI/JCLCloseUI" msgstr "" msgid "Bad NULL dests pointer" msgstr "Ungültiger NULL-Dests-Zeiger" msgid "Bad OpenGroup" msgstr "Ungültige OpenGroup" msgid "Bad OpenUI/JCLOpenUI" msgstr "Ungültig OpenUI/JCLOpenUI" msgid "Bad OrderDependency" msgstr "Ungültige Abhängigkeit" msgid "Bad PPD cache file." msgstr "Ungültige PPD-Cache-Datei." msgid "Bad PPD file." msgstr "Ungültige PPD-Datei" msgid "Bad Request" msgstr "Ungültige Anfrage" msgid "Bad SNMP version number" msgstr "Ungültige SNMP-Versionsnummer" msgid "Bad UIConstraints" msgstr "Ungültige UIConstraints" msgid "Bad URI." msgstr "" msgid "Bad arguments to function" msgstr "Ungültige Argumente an Funktion" #, c-format msgid "Bad copies value %d." msgstr "Ungültiger Wert der Kopien %d." msgid "Bad custom parameter" msgstr "Ungültiger angepasster Parameter" #, c-format msgid "Bad device-uri \"%s\"." msgstr "Ungültige Geräte-URI\"%s\"." #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "Ungültiges Geräte-URI-Schema \"%s\"." #, c-format msgid "Bad document-format \"%s\"." msgstr "Ungültiges Dokumentenformat \"%s\"." #, c-format msgid "Bad document-format-default \"%s\"." msgstr "Ungültiges voreingestelltes Dokumentenformat \"%s\"." msgid "Bad filename buffer" msgstr "Ungültiger Dateinamenpuffer" msgid "Bad hostname/address in URI" msgstr "Ungültiger Hostname/Adresse in URI" #, c-format msgid "Bad job-name value: %s" msgstr "Ungültiger Auftragsnamenwert: %s" msgid "Bad job-name value: Wrong type or count." msgstr "Ungültiger Auftragsnamenwert: Falscher Typ oder Anzahl." msgid "Bad job-priority value." msgstr "Ungültiger Auftragsprioritätwert." #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "Ungültiger Wert für job-sheets \"%s\"." msgid "Bad job-sheets value type." msgstr "Ungültiger Werttyp für job-sheets." msgid "Bad job-state value." msgstr "Ungültiger Auftragsstatuswert." #, c-format msgid "Bad job-uri \"%s\"." msgstr "Ungültige Auftrags-URI\"%s\"." #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "Ungültige notify-pull-method \"%s\"." #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "Ungültige notify-recipient-uri \"%s\"." #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" #, c-format msgid "Bad number-up value %d." msgstr "Ungültiger number-up-Wert %d." #, c-format msgid "Bad page-ranges values %d-%d." msgstr "Ungültige Seitenbereichswerte %d-%d." msgid "Bad port number in URI" msgstr "Ungültige Port-Nummer in URI" #, c-format msgid "Bad port-monitor \"%s\"." msgstr "Ungültiger port-monitor \"%s\"." #, c-format msgid "Bad printer-state value %d." msgstr "Ungültiger Druckerstatuswert %d." msgid "Bad printer-uri." msgstr "Ungültige Drucker-URI" #, c-format msgid "Bad request ID %d." msgstr "Ungültige Anfrage-ID %d." #, c-format msgid "Bad request version number %d.%d." msgstr "Ungültige Versionsnummernanfrage %d.%d." msgid "Bad resource in URI" msgstr "Ungültige Resource in URI" msgid "Bad scheme in URI" msgstr "Ungültiges Scheman in URI" msgid "Bad username in URI" msgstr "Ungültiger Benutzername in URI" msgid "Bad value string" msgstr "Ungültiger Zeichenkette" msgid "Bad/empty URI" msgstr "Ungültige/leere URI" msgid "Banners" msgstr "Banner" msgid "Bond Paper" msgstr "Papier bündeln" msgid "Booklet" msgstr "Broschüre" #, c-format msgid "Boolean expected for waiteof option \"%s\"." msgstr "Boolesch erwartet für waitof Option \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "Pufferüberlauf festgestellt, Abbruch." msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" msgstr "CPCL Etikettendrucker" msgid "Cancel Jobs" msgstr "Druckaufträge abbrechen" msgid "Canceling print job." msgstr "Auftrag wird abgebrochen." msgid "Cannot change printer-is-shared for remote queues." msgstr "" msgid "Cannot share a remote Kerberized printer." msgstr "Freigabe eines entfernten kerberisierten Druckers nicht möglich" msgid "Cassette" msgstr "Kassette" msgid "Change Settings" msgstr "Einstellungen ändern" #, c-format msgid "Character set \"%s\" not supported." msgstr "Zeichensatz \"%s\" nicht unterstützt." msgid "Classes" msgstr "Klassen" msgid "Clean Print Heads" msgstr "Saubere Druckköpfe" msgid "Close-Job doesn't support the job-uri attribute." msgstr "Close-Job unterstützt keine job-uri Attribute." msgid "Color" msgstr "Farbe" msgid "Color Mode" msgstr "Farbmodus" msgid "" "Commands may be abbreviated. Commands are:\n" "\n" "exit help quit status ?" msgstr "" "Befehle können abgekürzt werden. Befehle sind:\n" "\n" "exit help quit status ?" msgid "Community name uses indefinite length" msgstr "Community-Name hat unbestimmte Länge" msgid "Connected to printer." msgstr "Verbunden zum Drucker." msgid "Connecting to printer." msgstr "Verbinde zum Drucker." msgid "Continue" msgstr "Weiter" msgid "Continuous" msgstr "Kontinuierlich" msgid "Control file sent successfully." msgstr "Steuerdatei erfolgreich gesendet." msgid "Copying print data." msgstr "Kopiere Druckdaten." msgid "Created" msgstr "Erstellt" msgid "Credentials do not validate against site CA certificate." msgstr "Anmeldedaten validieren nicht gegen das CA Zertifikat der Seite" msgid "Credentials have expired." msgstr "Berechtigung ist abgelaufen" msgid "Custom" msgstr "Eigene" msgid "CustominCutInterval" msgstr "CustominCutInterval" msgid "CustominTearInterval" msgstr "CustominTearInterval" msgid "Cut" msgstr "Abschneiden" msgid "Cutter" msgstr "Abschneider" msgid "Dark" msgstr "Dunkel" msgid "Darkness" msgstr "Dunkelheit" msgid "Data file sent successfully." msgstr "Datendatei erfolgreich gesendet." msgid "Deep Color" msgstr "Tiefe Farbe" msgid "Deep Gray" msgstr "" msgid "Delete Class" msgstr "Klasse löschen" msgid "Delete Printer" msgstr "Drucker löschen" msgid "DeskJet Series" msgstr "DeskJet Serie" #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "Ziel „%s“ akzeptiert keine Druckaufträge." msgid "Device CMYK" msgstr "" msgid "Device Gray" msgstr "" msgid "Device RGB" msgstr "" #, c-format msgid "" "Device: uri = %s\n" " class = %s\n" " info = %s\n" " make-and-model = %s\n" " device-id = %s\n" " location = %s" msgstr "" "Gerät: URI = %s\n" " Klasse = %s\n" " Info = %s\n" " Hersteller-und-Modell = %s\n" " Geräte-ID = %s\n" " Standort = %s" msgid "Direct Thermal Media" msgstr "Direct Thermotransfermedia" #, c-format msgid "Directory \"%s\" contains a relative path." msgstr "Verzeichnis \"%s\" enthält einen relativen Pfad." #, c-format msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Verzeichnis \"%s\" hat unsichere Rechte (0%o/uid=%d/gid=%d)." #, c-format msgid "Directory \"%s\" is a file." msgstr "Verzeichnis \"%s\" ist eine Datei." #, c-format msgid "Directory \"%s\" not available: %s" msgstr "Verzeichnis \"%s\" nicht vorhanden: %s" #, c-format msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Verzeichnisrechte \"%s\" OK (0%o/uid=%d/gid=%d)." msgid "Disabled" msgstr "Deaktiviert" #, c-format msgid "Document #%d does not exist in job #%d." msgstr "Dokument #%d existiert in Auftrag #%d nicht." msgid "Draft" msgstr "Entwurf" msgid "Duplexer" msgstr "Duplexer" msgid "Dymo" msgstr "Dymo" msgid "EPL1 Label Printer" msgstr "EPL1 Etikettendrucker" msgid "EPL2 Label Printer" msgstr "EPL2 Etikettendrucker" msgid "Edit Configuration File" msgstr "Konfigurationsdatei bearbeiten" msgid "Encryption is not supported." msgstr "Verschlüsselung ist nicht unterstüzt." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" msgstr "Banner beenden" msgid "English" msgstr "Deutsch" 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 "" "Geben Sie Ihren Benutzernamen und das Passwort oder den root-Benutzernamen " "und -passwort ein, um auf diese Seite zuzugreifen. Falls Sie die Kerberos-" "Authentifizierung verwenden, stellen Sie sicher, dass Sie ein gültiges " "Kerberos-Ticket haben." msgid "Envelope #10" msgstr "US Umschlag 10" msgid "Envelope #11" msgstr "US Umschlag 11" msgid "Envelope #12" msgstr "US Umschlag 12" msgid "Envelope #14" msgstr "US Umschlag 14" msgid "Envelope #9" msgstr "US Umschlag 9" msgid "Envelope B4" msgstr "Umschlag B4" msgid "Envelope B5" msgstr "Umschlag B5" msgid "Envelope B6" msgstr "Umschlag B6" msgid "Envelope C0" msgstr "Umschlag C0" msgid "Envelope C1" msgstr "Umschlag C1" msgid "Envelope C2" msgstr "Umschlag C2" msgid "Envelope C3" msgstr "Umschlag C3" msgid "Envelope C4" msgstr "Umschlag C4" msgid "Envelope C5" msgstr "Umschlag C5" msgid "Envelope C6" msgstr "Umschlag C6" msgid "Envelope C65" msgstr "Umschlag C65" msgid "Envelope C7" msgstr "Umschlag C7" msgid "Envelope Choukei 3" msgstr "Umschlag Choukei 3" msgid "Envelope Choukei 3 Long Edge" msgstr "Umschlag Choukei 3 lange Seite" msgid "Envelope Choukei 4" msgstr "Umschlag Choukei 4" msgid "Envelope Choukei 4 Long Edge" msgstr "Umschlag Choukei 4 lange Seite" msgid "Envelope DL" msgstr "Umschlag DL" msgid "Envelope Feed" msgstr "Umschlagzuführung" msgid "Envelope Invite" msgstr "Umschlag Invite" msgid "Envelope Italian" msgstr "Umschlag italienisch" msgid "Envelope Kaku2" msgstr "Umschlag Kaku2" msgid "Envelope Kaku2 Long Edge" msgstr "Umschlag Kaku2 lange Seite" msgid "Envelope Kaku3" msgstr "Umschlag Kaku3" msgid "Envelope Kaku3 Long Edge" msgstr "Umschlag Kaku3 lange Seite" msgid "Envelope Monarch" msgstr "Umschlag Monarch" msgid "Envelope PRC1" msgstr "Umschlag PRC1" msgid "Envelope PRC1 Long Edge" msgstr "Umschlag PRC1 lange Seite" msgid "Envelope PRC10" msgstr "Umschlag PRC10" msgid "Envelope PRC10 Long Edge" msgstr "Umschlag PRC10 lange Seite" msgid "Envelope PRC2" msgstr "Umschlag PRC2" msgid "Envelope PRC2 Long Edge" msgstr "Umschlag PRC2 lange Seite" msgid "Envelope PRC3" msgstr "Umschlag PRC3" msgid "Envelope PRC3 Long Edge" msgstr "Umschlag PRC3 lange Seite" msgid "Envelope PRC4" msgstr "Umschlag PRC4" msgid "Envelope PRC4 Long Edge" msgstr "Umschlag PRC4 lange Seite" msgid "Envelope PRC5 Long Edge" msgstr "Umschlag PRC5 lange Seite" msgid "Envelope PRC5PRC5" msgstr "Umschlag PRC" msgid "Envelope PRC6" msgstr "Umschlag PRC6" msgid "Envelope PRC6 Long Edge" msgstr "Umschlag PRC6 lange Seite" msgid "Envelope PRC7" msgstr "Umschlag PRC7" msgid "Envelope PRC7 Long Edge" msgstr "Umschlag PRC7 lange Seite" msgid "Envelope PRC8" msgstr "Umschlag PRC8" msgid "Envelope PRC8 Long Edge" msgstr "Umschlag PRC8 lange Seite" msgid "Envelope PRC9" msgstr "Umschlag PRC" msgid "Envelope PRC9 Long Edge" msgstr "Umschlag PRC9 lange Seite" msgid "Envelope Personal" msgstr "Umschlag Personal" msgid "Envelope You4" msgstr "Umschlag You4" msgid "Envelope You4 Long Edge" msgstr "Umschlag You4 lange Seite" msgid "Environment Variables:" msgstr "Umgebungsvariablen:" msgid "Epson" msgstr "Epson" msgid "Error Policy" msgstr "Fehlerbehandlung" msgid "Error reading raster data." msgstr "Fehler beim Lesen der Rasterdaten." msgid "Error sending raster data." msgstr "Fehler beim Senden von Rasterdaten." msgid "Error: need hostname after \"-h\" option." msgstr "Fehler: Hostname ist nach der \"-h\" Option erforderlich." msgid "European Fanfold" msgstr "Europäisches Endlospapier" msgid "European Fanfold Legal" msgstr "Europäisches Endlospapier Legal" msgid "Every 10 Labels" msgstr "Alle 10 Etiketten" msgid "Every 2 Labels" msgstr "Alle 2 Etiketten" msgid "Every 3 Labels" msgstr "Alle 3 Etiketten" msgid "Every 4 Labels" msgstr "Alle 4 Etiketten" msgid "Every 5 Labels" msgstr "Alle 5 Etiketten" msgid "Every 6 Labels" msgstr "Alle 6 Etiketten" msgid "Every 7 Labels" msgstr "Alle 7 Etiketten" msgid "Every 8 Labels" msgstr "Alle 8 Etiketten" msgid "Every 9 Labels" msgstr "Alle 9 Etiketten" msgid "Every Label" msgstr "Bei jedem Etikett" msgid "Executive" msgstr "184×267 (Imp)" msgid "Expectation Failed" msgstr "Erwartete Daten nicht erhalten" msgid "Expressions:" msgstr "Ausdrücke:" msgid "Fast Grayscale" msgstr "Grautöne schnell" #, c-format msgid "File \"%s\" contains a relative path." msgstr "Datei \"%s\" enthält einen relativen Pfad." #, c-format msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." msgstr "Datei \"%s\" hat unsichere Rechte (0%o/uid=%d/gid=%d)." #, c-format msgid "File \"%s\" is a directory." msgstr "Datei \"%s\" ist ein Verzeichnis." #, c-format msgid "File \"%s\" not available: %s" msgstr "Datei \"%s\" nicht verfügbar: %s" #, c-format msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "Dateirechte \"%s\" OK (0%o/uid=%d/gid=%d)." msgid "File Folder" msgstr "Dateiverzeichnis" #, c-format msgid "" "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" #, c-format msgid "Finished page %d." msgstr "Seite %d fertiggestellt." msgid "Finishing Preset" msgstr "Voreinstellungen Endverarbeitung" msgid "Fold" msgstr "Falten" msgid "Folio" msgstr "Folio" msgid "Forbidden" msgstr "Verboten" msgid "Found" msgstr "Gefunden" msgid "General" msgstr "Allgemein" msgid "Generic" msgstr "Allgemein" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU hat unbestimmte Länge" msgid "Glossy Paper" msgstr "Glanzpapier" msgid "Got a printer-uri attribute but no job-id." msgstr "Drucker-URI Attribut empfangen aber keine Auftrags-ID." msgid "Grayscale" msgstr "Graustufen" msgid "HP" msgstr "HP" msgid "Hanging Folder" msgstr "Hängeordner" msgid "Hash buffer too small." msgstr "Hash Puffer zu klein." msgid "Help file not in index." msgstr "Hilfedatei nicht im Index." msgid "High" msgstr "Hoch" msgid "IPP 1setOf attribute with incompatible value tags." msgstr "IPP 1setOf Attribut mit inkompatiblen Werte-Markierung." msgid "IPP attribute has no name." msgstr "IPP-Attribut hat keinen Namen." msgid "IPP attribute is not a member of the message." msgstr "IPP-Attribut ist kein Mitglied der Nachricht." msgid "IPP begCollection value not 0 bytes." msgstr "IPP begCollection Wert nicht 0 Byte." msgid "IPP boolean value not 1 byte." msgstr "IPP boolescher Wert nicht 1 Byte." msgid "IPP date value not 11 bytes." msgstr "IPP-Datenwert nicht 11 Byte." msgid "IPP endCollection value not 0 bytes." msgstr "IPP endCollection Wert nicht 0 Byte." msgid "IPP enum value not 4 bytes." msgstr "IPP enum Wert nicht 4 Byte." msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "IPP Erweiterung grösser als 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "IPP Integer-Wert nicht 4 Bytes." msgid "IPP language length overflows value." msgstr "IPP Sprachlänge übersteigt Wert." msgid "IPP language length too large." msgstr "IPP-Sprachlänge zu groß." msgid "IPP member name is not empty." msgstr "IPP-Mitgliedsname ist nicht leer." msgid "IPP memberName value is empty." msgstr "IPP-Mitgliedsnamenwert ist leer." msgid "IPP memberName with no attribute." msgstr "IPP-Mitgliedsname ohne Attribute." msgid "IPP name larger than 32767 bytes." msgstr "IPP Name länger als 32767 Byte" msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "IPP nameWithLanguage Wert weniger als mindestens 4 Byte." msgid "IPP octetString length too large." msgstr "IPP Oktett-Zeichenkettenlänge zu groß." msgid "IPP rangeOfInteger value not 8 bytes." msgstr "IPP rangeOfInteger Wert nicht 8 Byte." msgid "IPP resolution value not 9 bytes." msgstr "IPP-Auflösungswert nicht 9 Bytes." msgid "IPP string length overflows value." msgstr "IPP Zeichenkettenlänge übersteigt Wert." msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "IPP textWithLanguage Wert weniger als mindestens 4 Byte." msgid "IPP value larger than 32767 bytes." msgstr "IPP-Wert länger als 32767 Bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" msgid "IPPFIND_SERVICE_URI URI" msgstr "" msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" msgid "ISOLatin1" msgstr "ISOLatin1" msgid "Illegal control character" msgstr "Ungültiges Steuerzeichen" msgid "Illegal main keyword string" msgstr "Ungültige Haupt-Schlüsselwort-Zeichenkette" msgid "Illegal option keyword string" msgstr "Ungültige Option-Schlüsselwort-Zeichenkette" msgid "Illegal translation string" msgstr "Ungültiger Übersetzungsstring" msgid "Illegal whitespace character" msgstr "Ungültiges Leerzeichen" msgid "Installable Options" msgstr "Installationsoptionen" msgid "Installed" msgstr "Installiert" msgid "IntelliBar Label Printer" msgstr "IntelliBar Etikettendrucker" msgid "Intellitech" msgstr "Intellitech" msgid "Internal Server Error" msgstr "Interner Serverfehler" msgid "Internal error" msgstr "Interner Fehler" msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-teilig" msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-teilig" msgid "Internet Printing Protocol" msgstr "Internet Printing Protocol" msgid "Invalid group tag." msgstr "" msgid "Invalid media name arguments." msgstr "Ungültige Argumente des Mediennamens." msgid "Invalid media size." msgstr "Ungültige Mediengröße." msgid "Invalid named IPP attribute in collection." msgstr "" msgid "Invalid ppd-name value." msgstr "Ungültgier Wert ppd-name" #, c-format msgid "Invalid printer command \"%s\"." msgstr "Ungültiger Druckbefehl \"%s\"." msgid "JCL" msgstr "JCL" msgid "JIS B0" msgstr "JIS B0" msgid "JIS B1" msgstr "JIS B1" msgid "JIS B10" msgstr "JIS B10" msgid "JIS B2" msgstr "JIS B2" msgid "JIS B3" msgstr "JIS B3" msgid "JIS B4" msgstr "JIS B4" msgid "JIS B4 Long Edge" msgstr "JIS B4 lange Kante" msgid "JIS B5" msgstr "JIS B5" msgid "JIS B5 Long Edge" msgstr "JIS B5 lange Kante" msgid "JIS B6" msgstr "JIS B6" msgid "JIS B6 Long Edge" msgstr "JIS B6 lange Kante" msgid "JIS B7" msgstr "JIS B7" msgid "JIS B8" msgstr "JIS B8" msgid "JIS B9" msgstr "JIS B9" #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "Auftrag #%d kann nicht wieder gestartet werden - keine Dateien." #, c-format msgid "Job #%d does not exist." msgstr "Auftrag #%d existiert nicht." #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "Auftrag %d wurde bereits abgebrochen – Abbruch nicht möglich." #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "Auftrag %d wurde bereits abgebrochen – Abbruch nicht möglich." #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "Auftrag %d wurde bereits abgeschlossen – Abbruch nicht möglich." #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "Auftrag #%d ist abgeschlossen und kann nicht mehr geändert werden." #, c-format msgid "Job #%d is not complete." msgstr "Auftrag #%d ist nicht abgeschlossen." #, c-format msgid "Job #%d is not held for authentication." msgstr "Auftrag #%d ist nicht zur Authentifizierung angehalten." #, c-format msgid "Job #%d is not held." msgstr "Auftrag #%d ist nicht angehalten." msgid "Job Completed" msgstr "Auftrag abgeschlossen" msgid "Job Created" msgstr "Auftrag erstellt" msgid "Job Options Changed" msgstr "Auftragsoptionen geändert" msgid "Job Stopped" msgstr "Auftrag gestoppt" msgid "Job is completed and cannot be changed." msgstr "Auftrag ist abgeschlossen und kann nicht geändert werden." msgid "Job operation failed" msgstr "Auftrag fehlgeschlagen:" msgid "Job state cannot be changed." msgstr "Auftragsstatus kann nicht geändert werden." msgid "Job subscriptions cannot be renewed." msgstr "Auftragssubskiptionen können nicht erneuert werden." msgid "Jobs" msgstr "Aufträge" msgid "LPD/LPR Host or Printer" msgstr "LPD/LPR-Host oder -Drucker" msgid "" "LPDEST environment variable names default destination that does not exist." msgstr "" "LPDEST-Umgebungsvariable benennt standardmäßig ein Ziel, das nicht existiert." msgid "Label Printer" msgstr "Etikettendrucker" msgid "Label Top" msgstr "Etikett oben" #, c-format msgid "Language \"%s\" not supported." msgstr "Sprache \"%s\" wird nicht unterstützt." msgid "Large Address" msgstr "Große Adresse" msgid "LaserJet Series PCL 4/5" msgstr "LaserJet Serie PCL 4/5" msgid "Letter Oversize" msgstr "Letter Übergröße" msgid "Letter Oversize Long Edge" msgstr "Letter Übergröße lange Kante" msgid "Light" msgstr "Leicht" msgid "Line longer than the maximum allowed (255 characters)" msgstr "Zeile ist länger als die zulässige Länge von 255 Zeichen" msgid "List Available Printers" msgstr "Verfügbare Drucker anzeigen" #, c-format msgid "Listening on port %d." msgstr "" msgid "Local printer created." msgstr "Lokalen Drucker erzeugt." msgid "Long-Edge (Portrait)" msgstr "Lange Kante (Hochformat)" msgid "Looking for printer." msgstr "Suche nach Drucker." msgid "Manual Feed" msgstr "Manuelle Papierzufuhr" msgid "Media Size" msgstr "Mediengröße" msgid "Media Source" msgstr "Medienquelle" msgid "Media Tracking" msgstr "Medienführung" msgid "Media Type" msgstr "Medienart" msgid "Medium" msgstr "Medium" msgid "Memory allocation error" msgstr "Fehler bei der Speicherzuteilung" msgid "Missing CloseGroup" msgstr "Fehlendes CloseGroup" msgid "Missing CloseUI/JCLCloseUI" msgstr "" msgid "Missing PPD-Adobe-4.x header" msgstr "PPD-Adobe-4.x Header fehlt" msgid "Missing asterisk in column 1" msgstr "Sternchen in Spalte 1 fehlt" msgid "Missing document-number attribute." msgstr "Fehlendes Attribut zur Dokumentennummer." msgid "Missing form variable" msgstr "Fehlende form Variable" msgid "Missing last-document attribute in request." msgstr "Fehlendes Letzte-Sete Attribut in der Anfrage." msgid "Missing media or media-col." msgstr "" msgid "Missing media-size in media-col." msgstr "" msgid "Missing notify-subscription-ids attribute." msgstr "" msgid "Missing option keyword" msgstr "Fehlende Option Schlüsselwort" msgid "Missing requesting-user-name attribute." msgstr "Fehlendes requesting-user-name Attribut." #, c-format msgid "Missing required attribute \"%s\"." msgstr "Erforderliches Attribut \"%s\" fehlt." msgid "Missing required attributes." msgstr "Erforderliche Attribute fehlen." msgid "Missing resource in URI" msgstr "Fehlende Ressource in URI" msgid "Missing scheme in URI" msgstr "Fehlendes Schema in URI" msgid "Missing value string" msgstr "Wertezeichenkette fehlt" msgid "Missing x-dimension in media-size." msgstr "Fehlende x-Dimension in Mediengröße" msgid "Missing y-dimension in media-size." msgstr "Fehlende y-Dimension in Mediengröße" #, c-format msgid "" "Model: name = %s\n" " natural_language = %s\n" " make-and-model = %s\n" " device-id = %s" msgstr "" "Modell: Name = %s\n" " natürliche_Sprache = %s\n" " Hersteller-und-Modell = %s\n" " Geräte-ID = %s" msgid "Modifiers:" msgstr "Modifikatoren:" msgid "Modify Class" msgstr "Klasse verändern" msgid "Modify Printer" msgstr "Drucker verändern" msgid "Move All Jobs" msgstr "Alle Aufträge verschieben" msgid "Move Job" msgstr "Auftrag verschieben" msgid "Moved Permanently" msgstr "Dauerhaft verschoben" msgid "NULL PPD file pointer" msgstr "NULL PPD-Dateizeiger" msgid "Name OID uses indefinite length" msgstr "Name-OID hat unbestimmte Länge" msgid "Nested classes are not allowed." msgstr "Geschachtelte Klassen sind nicht erlaubt." msgid "Never" msgstr "Nie" msgid "New credentials are not valid for name." msgstr "Neue Anmeldedaten sind für den Namen ungültig." msgid "New credentials are older than stored credentials." msgstr "Neue Anmeldedaten sind läter als die gespeicherten Anmeldedaten" msgid "No" msgstr "Nein" msgid "No Content" msgstr "Kein Inhalt" msgid "No IPP attributes." msgstr "Keine IPP-Attribute." msgid "No PPD name" msgstr "Kein PPD-Name" msgid "No VarBind SEQUENCE" msgstr "Keine VarBind SEQUENCE" msgid "No active connection" msgstr "Keine aktive Verbindung" msgid "No active connection." msgstr "Keine aktive Verbindung." #, c-format msgid "No active jobs on %s." msgstr "Keine aktiven Aufträge auf %s." msgid "No attributes in request." msgstr "Keine Attribute in der Anfrage." msgid "No authentication information provided." msgstr "Keine Authentifizierungsinformation bereitgestellt." msgid "No common name specified." msgstr "Keinen gebräuchlichen Namen angegeben." msgid "No community name" msgstr "Kein Community-Name" msgid "No default destination." msgstr "Kein voreingestelltes Ziel." msgid "No default printer." msgstr "Kein voreingestellter Drucker." msgid "No destinations added." msgstr "Keine Druckziele hinzugefügt." msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." msgstr "" "Keine Geräte-URI in argv[0] oder der Umgebungsvariablen DEVICE_URI gefunden." msgid "No error-index" msgstr "Kein Fehlerindex" msgid "No error-status" msgstr "Kein Fehlerstatus" msgid "No file in print request." msgstr "Keine Druckdatei in der Anfrage." msgid "No modification time" msgstr "Keine Modifikationszeit" msgid "No name OID" msgstr "Kein Name-OID" msgid "No pages were found." msgstr "Keine Seiten gefunden." msgid "No printer name" msgstr "Kein Druckername" msgid "No printer-uri found" msgstr "Keine Drucker-uri gefunden" msgid "No printer-uri found for class" msgstr "Keine Drucker-URI gefunden für die Klasse" msgid "No printer-uri in request." msgstr "" msgid "No request URI." msgstr "Keine Anfrage-URI." msgid "No request protocol version." msgstr "Keine Anfrageprotokollversion." msgid "No request sent." msgstr "Keine Anfrage gesendet." msgid "No request-id" msgstr "Keine Anfrage-ID" msgid "No stored credentials, not valid for name." msgstr "Keine gespeicherten Anmeldedaten, ungültig für Name." msgid "No subscription attributes in request." msgstr "Keine Subskriptions-Attribute in der Anfrage." msgid "No subscriptions found." msgstr "Keine Subskriptionen gefunden." msgid "No variable-bindings SEQUENCE" msgstr "Keine „variable-bindings SEQUENCE“" msgid "No version number" msgstr "Keine Versionsnummer" msgid "Non-continuous (Mark sensing)" msgstr "Nicht fortlaufend (Mark-Sensing)" msgid "Non-continuous (Web sensing)" msgstr "Nicht fortlaufend (Web-Sensing)" msgid "None" msgstr "Keine" msgid "Normal" msgstr "Normal" msgid "Not Found" msgstr "Nicht gefunden" msgid "Not Implemented" msgstr "Nicht implementiert" msgid "Not Installed" msgstr "Nicht installiert" msgid "Not Modified" msgstr "Nicht verändert" msgid "Not Supported" msgstr "Nicht unterstützt" msgid "Not allowed to print." msgstr "Drucken nicht erlaubt." msgid "Note" msgstr "Hinweis" msgid "OK" msgstr "OK" msgid "Off (1-Sided)" msgstr "Aus (Einseitig)" msgid "Oki" msgstr "Oki" msgid "Online Help" msgstr "Online-Hilfe" msgid "Only local users can create a local printer." msgstr "Nur lokale Benutzer können lokale Drucker erzeugen." #, c-format msgid "Open of %s failed: %s" msgstr "Öffnen von %s ist fehlgeschlagen: %s" msgid "OpenGroup without a CloseGroup first" msgstr "OpenGroup ohne CloseGroup zuerst" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "OpenUI/JCLOpenUI ohne CloseUI/JCLCloseUI zuerst" msgid "Operation Policy" msgstr "Nutzungsrichtlinien" #, c-format msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "Option \"%s\" kann nicht mittels %%%%IncludeFeature einbezogen werden." msgid "Options Installed" msgstr "Installierte Optionen" msgid "Options:" msgstr "Optionen:" msgid "Other Media" msgstr "Andere Medien" msgid "Other Tray" msgstr "Anderes Fach" msgid "Out of date PPD cache file." msgstr "Veraltete PPD-Cache-Datei." msgid "Out of memory." msgstr "Nicht genügend Speicher." msgid "Output Mode" msgstr "Ausgabemodus" msgid "PCL Laser Printer" msgstr "PCL-Laserdrucker" msgid "PRC16K" msgstr "PRC16K" msgid "PRC16K Long Edge" msgstr "PRC16K lange Kante" msgid "PRC32K" msgstr "PRC32K" msgid "PRC32K Long Edge" msgstr "PRC32K lange Kante" msgid "PRC32K Oversize" msgstr "PRCK32K Übergröße" msgid "PRC32K Oversize Long Edge" msgstr "PRCK32K Übergröße lange Kante" msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" msgid "Packet does not contain a Get-Response-PDU" msgstr "Paket enthält kein Get-Response-PDU" msgid "Packet does not start with SEQUENCE" msgstr "Paket beginnt nicht mit SEQUENCE" msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" #, c-format msgid "Password for %s on %s? " msgstr "Passwort für %s auf %s? " msgid "Pause Class" msgstr "Klasse anhalten" msgid "Pause Printer" msgstr "Drucker anhalten" msgid "Peel-Off" msgstr "Aufkleber" msgid "Photo" msgstr "Foto" msgid "Photo Labels" msgstr "Foto-Etiketten" msgid "Plain Paper" msgstr "Standardpapier" msgid "Policies" msgstr "Richtlinien " msgid "Port Monitor" msgstr "Port-Monitor" msgid "PostScript Printer" msgstr "PostScript-Drucker" msgid "Postcard" msgstr "Postkarte" msgid "Postcard Double" msgstr "Doppelpostkarte" msgid "Postcard Double Long Edge" msgstr "Doppelpostkarte lange Seite" msgid "Postcard Long Edge" msgstr "Postkarte lange Seite" msgid "Preparing to print." msgstr "Vorbereitung zum Druck." msgid "Print Density" msgstr "Druckdichte" msgid "Print Job:" msgstr "Druckauftrag:" msgid "Print Mode" msgstr "Druckmodus" msgid "Print Quality" msgstr "Druckqualität" msgid "Print Rate" msgstr "Druckrate" msgid "Print Self-Test Page" msgstr "Selbsttestseite drucken" msgid "Print Speed" msgstr "Druckgeschwindigkeit" msgid "Print Test Page" msgstr "Testseite drucken" msgid "Print and Cut" msgstr "Drucken und abschneiden" msgid "Print and Tear" msgstr "Drucken und abreißen" msgid "Print file sent." msgstr "Druckdatei gesendet." msgid "Print job canceled at printer." msgstr "Druckauftrag wurde am Drucker abgebrochen." msgid "Print job too large." msgstr "Der Druckauftrag ist zu groß." msgid "Print job was not accepted." msgstr "Der Druckauftrag wurde nicht angenommen." #, c-format msgid "Printer \"%s\" already exists." msgstr "Drucker \"%s\" existiert bereits." msgid "Printer Added" msgstr "Drucker hinzugefügt" msgid "Printer Default" msgstr "Standardeinstellung für Drucker" msgid "Printer Deleted" msgstr "Drucker gelöscht" msgid "Printer Modified" msgstr "Drucker geändert" msgid "Printer Paused" msgstr "Drucker angehalten" msgid "Printer Settings" msgstr "Druckereinstellungen" msgid "Printer cannot print supplied content." msgstr "Drucker kann den Inhalt nicht drucken." msgid "Printer cannot print with supplied options." msgstr "Drucker kann mit den angegebenen Optionen nicht drucken." msgid "Printer does not support required IPP attributes or document formats." msgstr "" msgid "Printer:" msgstr "Drucker:" msgid "Printers" msgstr "Drucker" #, c-format msgid "Printing page %d, %u%% complete." msgstr "Drucke Seite %d, %u%% fertig." msgid "Punch" msgstr "Locher" msgid "Quarto" msgstr "US Quarto" msgid "Quota limit reached." msgstr "Kontingentgrenze erreicht." msgid "Rank Owner Job File(s) Total Size" msgstr "Rang Besitz. Auftrag Datei(en) Gesamtgröße" msgid "Reject Jobs" msgstr "Druckaufträge ablehnen" #, c-format msgid "Remote host did not accept control file (%d)." msgstr "Entfernter Host hat die Steuerdatei (%d) nicht akzeptiert." #, c-format msgid "Remote host did not accept data file (%d)." msgstr "Entfernter Host hat die Datendatei (%d) nicht akzeptiert." msgid "Reprint After Error" msgstr "Druckvorgang nach dem Fehler fortsetzen" msgid "Request Entity Too Large" msgstr "Gesamte Anfrage zu groß" msgid "Resolution" msgstr "Auflösung" msgid "Resume Class" msgstr "Klasse fortsetzen" msgid "Resume Printer" msgstr "Drucken fortsetzen" msgid "Return Address" msgstr "Rückgabeadresse" msgid "Rewind" msgstr "Zurückdrehen" msgid "SEQUENCE uses indefinite length" msgstr "SEQUENCE hat unbestimmte Länge" msgid "SSL/TLS Negotiation Error" msgstr "SSL/TLS Verhandlungsfehler" msgid "See Other" msgstr "Siehe auch" msgid "See remote printer." msgstr "Siehe entfernter Drucker." msgid "Self-signed credentials are blocked." msgstr "Selbstsignierte Anmeldedaten sind blockiert." msgid "Sending data to printer." msgstr "Sende Daten zum Drucker." msgid "Server Restarted" msgstr "Server neu gestartet" msgid "Server Security Auditing" msgstr "Server Security Auditing" msgid "Server Started" msgstr "Server gestartet" msgid "Server Stopped" msgstr "Server ist angehalten" msgid "Server credentials not set." msgstr "Server-Zugangsdaten nicht gesetzt." msgid "Service Unavailable" msgstr "Dienst nicht verfügbar" msgid "Set Allowed Users" msgstr "Zugelassene Benutzer festlegen" msgid "Set As Server Default" msgstr "Als Voreinstellungen für Server festlegen" msgid "Set Class Options" msgstr "Klassenoptionen festlegen" msgid "Set Printer Options" msgstr "Druckeroptionen festlegen" msgid "Set Publishing" msgstr "Veröffentlichung festlegen" msgid "Shipping Address" msgstr "Lieferadresse" msgid "Short-Edge (Landscape)" msgstr "Kurze Kante (Querformat)" msgid "Special Paper" msgstr "Spezialpapier" #, c-format msgid "Spooling job, %.0f%% complete." msgstr "Auftragszwischenspeicherung %.0f%% abgeschlossen." msgid "Standard" msgstr "Standard" msgid "Staple" msgstr "Heftung" #. TRANSLATORS: Banner/cover sheet before the print job. msgid "Starting Banner" msgstr "Startbanner" #, c-format msgid "Starting page %d." msgstr "Beginne Seite %d." msgid "Statement" msgstr "US Statement" #, c-format msgid "Subscription #%d does not exist." msgstr "Abonnement #%d existiert nicht." msgid "Substitutions:" msgstr "Ersatz:" msgid "Super A" msgstr "Super A" msgid "Super B" msgstr "Super B" msgid "Super B/A3" msgstr "Super B/A3" msgid "Switching Protocols" msgstr "Protokolle wechseln" msgid "Tabloid" msgstr "US Tabloid" msgid "Tabloid Oversize" msgstr "US Tabloid übergroß" msgid "Tabloid Oversize Long Edge" msgstr "US Tabloid übergroß lange Seite" msgid "Tear" msgstr "Abreißen" msgid "Tear-Off" msgstr "Abriss" msgid "Tear-Off Adjust Position" msgstr "Abriss-Justierposition" #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "Das Attribut »%s« ist erforderlich für Druckaufträge." #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "Das %s Attribut kann nicht mit Auftrags-IDs angegeben werden." #, c-format msgid "" "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" "Das Attribut '%s' Auftragsstatus kann in einer Auftragsanfrage nicht " "angegeben werden." #, c-format msgid "" "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" "Das Vorgangsattribut '%s' kann nicht mit einer Anfrage zur " "Auftragserstellung angegeben werden." #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "Die PPD-Datei »%s« konnte nicht gefunden werden." #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "Die PPD-Datei »%s« konnte nicht geöffnet werden: %s" msgid "The PPD file could not be opened." msgstr "Die PPD Datei konnte nicht geöffnet werden." msgid "" "The class name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/), or the pound sign (#)." msgstr "" "Der Klassenname darf maximal 127 druckbare Zeichen haben und darf keine " "Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten." msgid "" "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" "Das Attribut „notify-lease-duration“ kann nicht mit Druckauftrags-" "Subskriptionen verwendet werden." #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "Der WErt für notify-user-data ist zu groß (%d > 63 octets)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" "Die Druckerkonfiguration ist nicht korrekt oder der Drucker existiert nicht " "mehr." msgid "The printer did not respond." msgstr "Der Drucker hat nicht geantwortet." msgid "The printer is in use." msgstr "Der Drucker ist beschäftigt." msgid "The printer is not connected." msgstr "Der Drucker ist nicht verbunden." msgid "The printer is not responding." msgstr "Der Drucker antwortet nicht." msgid "The printer is now connected." msgstr "Der Drucker ist jetzt verbunden." msgid "The printer is now online." msgstr "Der Drucker ist jetzt online." msgid "The printer is offline." msgstr "Der Drucker ist offline." msgid "The printer is unreachable at this time." msgstr "Der Drucker ist derzeit nicht erreichbar." msgid "The printer may not exist or is unavailable at this time." msgstr "Der Drucker existiert nicht oder ist zur Zeit nicht verfügbar." 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 "" msgid "The printer or class does not exist." msgstr "Der Drucker oder die Klasse existiert nicht." msgid "The printer or class is not shared." msgstr "Der Drucker oder die Klasse ist nicht freigegeben." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "Die Drucker-URI »%s« enthält ungültige Zeichen." msgid "The printer-uri attribute is required." msgstr "Das printer-uri Attribut ist erforderlich." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" "Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/classes/" "CLASSNAME" msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" "Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/" "printers/PRINTERNAME" msgid "" "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" "Die Web-Schnittstelle ist derzeit abgeschaltet. Das Einschalten kann mitdem " "Befehl »cupsctl WebInterface=yes« erfolgen." #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "Der which-jobs Wert »%s« ist nicht unterstützt." msgid "There are too many subscriptions." msgstr "Es gibt zu viele Subskriptionen." msgid "There was an unrecoverable USB error." msgstr "Ein nicht zu behebender USB Fehler ist aufgetreten." msgid "Thermal Transfer Media" msgstr "Thermotransferpapier" msgid "Too many active jobs." msgstr "Zu viele aktive Druckaufträge." #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "Zu viele job-sheets Werte (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "Zu viele printer-state-reasons Werte (%d > %d)." msgid "Transparency" msgstr "Transparenz" msgid "Tray" msgstr "Fach" msgid "Tray 1" msgstr "Fach 1" msgid "Tray 2" msgstr "Fach 2" msgid "Tray 3" msgstr "Fach 3" msgid "Tray 4" msgstr "Fach 4" msgid "Trust on first use is disabled." msgstr "Vertrauen bei erster Benutzung gesperrt." msgid "URI Too Long" msgstr "URI zu lang" msgid "URI too large" msgstr "URI zu groß" msgid "US Fanfold" msgstr "US Fanfold" msgid "US Ledger" msgstr "US Ledger" msgid "US Legal" msgstr "US Lang" msgid "US Legal Oversize" msgstr "US Legal übergroß" msgid "US Letter" msgstr "US Letter" msgid "US Letter Long Edge" msgstr "US Letter lange Seite" msgid "US Letter Oversize" msgstr "US Letter übergroß" msgid "US Letter Oversize Long Edge" msgstr "US Letter übergroß, lange Seite" msgid "US Letter Small" msgstr "US Letter klein" msgid "Unable to access cupsd.conf file" msgstr "Kein Zugriff auf die Datei cupsd.conf" msgid "Unable to access help file." msgstr "Kein Zugriff auf die Hilfe-Datei." msgid "Unable to add class" msgstr "Klasse konnte nicht hinzugefügt werden:" msgid "Unable to add document to print job." msgstr "Dem Druckauftrag kann kein Dokument hinzugefügt werden." #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "Dem Ziel »%s« kann kein Auftrag hinzugefügt werden." msgid "Unable to add printer" msgstr "Drucker konnte nicht hinzugefügt werden:" msgid "Unable to allocate memory for file types." msgstr "Speicher für Dateitypen kann nicht belegt werden." msgid "Unable to allocate memory for page info" msgstr "Speicher für Seiteninformation kann nicht belegt werden" msgid "Unable to allocate memory for pages array" msgstr "Speicher für Seitenmatrix kann nicht belegt werden" msgid "Unable to allocate memory for printer" msgstr "" msgid "Unable to cancel print job." msgstr "Druckauftrag kann nicht abgebrochen werden." msgid "Unable to change printer" msgstr "Drucker konnte nicht geändert werden" msgid "Unable to change printer-is-shared attribute" msgstr "Attribut „printer-is-shared“ konnte nicht geändert werden" msgid "Unable to change server settings" msgstr "Servereinstellungen konnten nicht geändert werden :" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" "Der regulären Ausdruck %s für mimeMediaType kann nicht kompiliert werden." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" "Der natualLanguage regulärer Ausdruck kann nicht kompiliert werden: %s." msgid "Unable to configure printer options." msgstr "Druckeroptionen können nicht konfiguriert werden." msgid "Unable to connect to host." msgstr "Verbindungsaufbau zum Host fehlgeschlagen." msgid "Unable to contact printer, queuing on next printer in class." msgstr "" "Drucker kann nicht kontaktiert werden, stelle in die nächste Warteschlange " "der Klasse ein" #, c-format msgid "Unable to copy PPD file - %s" msgstr "PPD Datei %s kann nicht kopiert werden" msgid "Unable to copy PPD file." msgstr "PPD Datei kann nicht kopiert werden" msgid "Unable to create credentials from array." msgstr "Anmeldedaten aus dem Array können nicht erzeugt werden." msgid "Unable to create printer-uri" msgstr "Drucker-URI kann nicht erzeugt werden" msgid "Unable to create printer." msgstr "Drucker kann nicht erzeugt werden." msgid "Unable to create server credentials." msgstr "Die Server-Anmeldedaten können nicht erzeugt werden." #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" msgid "Unable to create temporary file" msgstr "Temporäre Datei konnte nicht erstellt werden" msgid "Unable to delete class" msgstr "Die Klasse konnte nicht gelöscht werden" msgid "Unable to delete printer" msgstr "Der Drucker konnte nicht gelöscht werden" msgid "Unable to do maintenance command" msgstr "Wartungsbefehl konnte nicht ausgeführt werden" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "cupsd.conf Dateien grösser als 1MB können nicht bearbeitet werden" #, c-format msgid "Unable to establish a secure connection to host (%d)." msgstr "" msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "Sichere Verbindung zu Host nicht möglich (Zertifikatskette ungültig)." msgid "" "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" "Sichere Verbindung zu Host nicht möglich (Zertifikatskette noch nicht " "gültig)." msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "Sichere Verbindung zu Host nicht möglich (Zertifikate abgelaufen)." msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "Sichere Verbindung zu Host nicht möglich (Hostname passt nicht)." msgid "" "Unable to establish a secure connection to host (peer dropped connection " "before responding)." msgstr "" "Sichere Verbindung zu Host nicht möglich (Gegenstelle hat die Verbindung vor " "einer Antwort beendet)." msgid "" "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" "Sichere Verbindung zu Host nicht möglich (Selbstsigniertes Zertifikat)." msgid "" "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" "Sichere Verbindung zu Host nicht möglich (Nicht vertrauenswürdiges " "Zertifikat)." msgid "Unable to establish a secure connection to host." msgstr "Sichere Verbindung zu Host nicht möglich." #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" msgid "Unable to find destination for job" msgstr "Das Ziel für den Auftrag kann nicht gefunden werden" msgid "Unable to find printer." msgstr "Der Drucker kann nicht gefunden werden" msgid "Unable to find server credentials." msgstr "Die Server-Zugangsdaten konnten nicht gefunden werden." msgid "Unable to get backend exit status." msgstr "Der Backend-Rückgabewert kann nicht ermittelt werden." msgid "Unable to get class list" msgstr "Klassenliste konnte nicht ermittelt werden:" msgid "Unable to get class status" msgstr "Klassenstatus konnte nicht ermittelt werden:" msgid "Unable to get list of printer drivers" msgstr "Liste der Druckertreiber konnte nicht ermittel werden:" msgid "Unable to get printer attributes" msgstr "Druckerattribute konnten nicht ermittelt werden:" msgid "Unable to get printer list" msgstr "Druckerliste konnte nicht ermittelt werden:" msgid "Unable to get printer status" msgstr "Druckerstatus konnte nicht ermittelt werden" msgid "Unable to get printer status." msgstr "Druckerstatus konnte nicht ermittelt werden:" msgid "Unable to load help index." msgstr "Hilfeindex kann nicht geladen werden." #, c-format msgid "Unable to locate printer \"%s\"." msgstr "Der Drucker »%s« kann nicht lokalisiert werden" msgid "Unable to locate printer." msgstr "Der Drucker kann nicht lokalisiert werden" msgid "Unable to modify class" msgstr "Klasse konnte nicht verändert werden:" msgid "Unable to modify printer" msgstr "Drucker kann nicht verändert werden:" msgid "Unable to move job" msgstr "Druckauftrag kann nicht bewegt werden" msgid "Unable to move jobs" msgstr "Druckaufträge können nicht bewegt werden" msgid "Unable to open PPD file" msgstr "PPD Datei kann nicht geöffnet werden" msgid "Unable to open cupsd.conf file:" msgstr "Die Datei „cupsd.conf“ kann nicht geöffnet werden:" msgid "Unable to open device file" msgstr "Die Gerätedatei kann nicht geöffnet werden" #, c-format msgid "Unable to open document #%d in job #%d." msgstr "Das Dokument #%d in Auftrag #%d kann nicht geöffnet werden." msgid "Unable to open help file." msgstr "Die Hilfe-Datei kann nicht geöffnet werden" msgid "Unable to open print file" msgstr "Die Druckdatei kann nicht geöffnet werden" msgid "Unable to open raster file" msgstr "Die Rasterdatei kann nicht geöffnet werden" msgid "Unable to print test page" msgstr "Die Testseite kann nicht gedruckt werden" msgid "Unable to read print data." msgstr "Druckdaten können nicht gelesen werden." #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" msgid "Unable to rename job document file." msgstr "Auftragsdatei kann nicht umbenannt werden." msgid "Unable to resolve printer-uri." msgstr "Drucker-URI kann nicht aufgelöst werden." msgid "Unable to see in file" msgstr "In die Datei kann nicht gesehen werden" msgid "Unable to send command to printer driver" msgstr "Befehl kann nicht zum Drucker gesendet werden" msgid "Unable to send data to printer." msgstr "Kann Daten nicht zum Drucker senden." msgid "Unable to set options" msgstr "Optionen konnten nicht festgelegt werden:" msgid "Unable to set server default" msgstr "Standardeinstellungen für Server konnten nicht festgelegt werden:" msgid "Unable to start backend process." msgstr "Backend-Prozess kann nicht gestartet werden." msgid "Unable to upload cupsd.conf file" msgstr "Die Datei „cupsd.conf“ kann nicht hochgeladen werden:" msgid "Unable to use legacy USB class driver." msgstr "Der alte USB-Klassentreiber kann nicht verwendet werden." msgid "Unable to write print data" msgstr "Kann Druckdaten nicht schreiben" #, c-format msgid "Unable to write uncompressed print data: %s" msgstr "Unkomprimierte Druckdaten %s können nicht geschrieben werden." msgid "Unauthorized" msgstr "Nicht berechtigt" msgid "Units" msgstr "Einheiten" msgid "Unknown" msgstr "Unbekannt" #, c-format msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "Unbekannte Auswahl \"%s\" für Option \"%s\"." #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" #, c-format msgid "Unknown encryption option value: \"%s\"." msgstr "Unbekannte Verschlüsselungsoption: »%s«." #, c-format msgid "Unknown file order: \"%s\"." msgstr "Unbekannte Dateireihenfolge: \"%s\"." #, c-format msgid "Unknown format character: \"%c\"." msgstr "Unbekanntes Formatzeichen: \"%c\"." msgid "Unknown hash algorithm." msgstr "Unbekannter Hashalgorithmus." msgid "Unknown media size name." msgstr "Unbekannter Name der Mediengröße." #, c-format msgid "Unknown option \"%s\" with value \"%s\"." msgstr "Unbekannte Option \"%s\" mit Wert \"%s\"." #, c-format msgid "Unknown option \"%s\"." msgstr "Unbekannte Option \"%s\"." #, c-format msgid "Unknown print mode: \"%s\"." msgstr "Unbekannter Druckmodus: \"%s\"." #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "Unbekannte printer-error-policy \"%s\"." #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "Unbekannte printer-op-policy \"%s\"." msgid "Unknown request method." msgstr "Unbekannte Anfragemethode." msgid "Unknown request version." msgstr "Unbekannte Anfrageversion" msgid "Unknown scheme in URI" msgstr "Unbekanntes Schema in URI" msgid "Unknown service name." msgstr "Unbekannter Dienstname." #, c-format msgid "Unknown version option value: \"%s\"." msgstr "Unbekannter Versionsoption: \"%s\"." #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "Nicht unterstützter Kompressionswert \"%s\"." #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "Nicht unterstützter Wert des 'document-format' \"%s\"." msgid "Unsupported 'job-hold-until' value." msgstr "" msgid "Unsupported 'job-name' value." msgstr "Nicht unterstützter 'job-name' Wert." #, c-format msgid "Unsupported character set \"%s\"." msgstr "Nicht unterstützter Zeichensatz \"%s\"." #, c-format msgid "Unsupported compression \"%s\"." msgstr "Nicht unterstützte Kompression \"%s\"." #, c-format msgid "Unsupported document-format \"%s\"." msgstr "Nicht unterstütztes Dokumentenformat \"%s\"." #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "Nicht unterstütztes Dokumentenformat \"%s/%s\"." #, c-format msgid "Unsupported format \"%s\"." msgstr "Nicht unterstütztes Format \"%s\"." msgid "Unsupported margins." msgstr "Nicht unterstützte Ränder." msgid "Unsupported media value." msgstr "Nicht unterstützter Medienwert." #, c-format msgid "Unsupported number-up value %d, using number-up=1." msgstr "Nicht unterstützter number-up Wert %d, verwende number-up=1." #, c-format msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." msgstr "" "Nicht unterstützter number-up-layout Wert %s, verwende number-up-layout=lrtb." #, c-format msgid "Unsupported page-border value %s, using page-border=none." msgstr "" "Nicht unterstützter Wert für page-border %s, verwende paqe-border=none." msgid "Unsupported raster data." msgstr "Nicht unterstützte Rasterdaten." msgid "Unsupported value type" msgstr "Wertetyp nicht unterstützt" msgid "Upgrade Required" msgstr "Aktualisierung erforderlich" #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" #, c-format msgid "Usage: %s job-id user title copies options [file]" msgstr "Aufruf: %s Auftrags-ID Benutzer Titel Kopien Optionen [Datei]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "Aufruf: cupsctl [Optionen] [Parameter=Wert ... ParameterN=WertN]" msgid "Usage: cupsd [options]" msgstr "Aufruf: cupsd [Optionen]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "Aufruf: cupsfilter [ Optionen ] [ -- ] Dateiname" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" " ippfind --help\n" " ippfind --version" msgstr "" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "Aufruf: ipptool [Optionen] URI Dateiname [ ... DateinameN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" " lpadmin [options] -p destination -c class\n" " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" msgid "" "Usage: lpoptions [options] -d destination\n" " lpoptions [options] [-p destination] [-l]\n" " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" msgid "Usage: lpq [options] [+interval]" msgstr "" msgid "Usage: lpr [options] [file(s)]" msgstr "" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" msgid "Usage: lpstat [options]" msgstr "" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Verwendung: ppdc [Optionen] Dateiname.drv [ ... DateinameN.drv ]" msgid "Usage: ppdhtml [options] filename.drv >filename.html" msgstr "Verwendung: ppdhtml [Optionen] Dateiname.ppd Dateiname.html" msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Verwendung: ppdi [Optionen] Dateiname.ppd [ ... DateinameN.ppd ]" msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" msgstr "Verwendung: ppdmerge [Optionen] Dateiname.ppd [ ... DateinameN.ppd ]" msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" "Aufruf: ppdpo [Optionen] -o Dateiname.po Dateiname.drv [ ... DateinameN.drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Verwendung: snmp [Host-oder-IP-Adresse]" #, c-format msgid "Using spool directory \"%s\"." msgstr "" msgid "Value uses indefinite length" msgstr "Wert hat unbestimmte Länge" msgid "VarBind uses indefinite length" msgstr "VarBind hat unbestimmte Länge" msgid "Version uses indefinite length" msgstr "Version hat unbestimmte Länge" msgid "Waiting for job to complete." msgstr "Warte auf Auftragsabschluss." msgid "Waiting for printer to become available." msgstr "Warte darauf dass der Drucker verfügbar wird." msgid "Waiting for printer to finish." msgstr "Warte auf Abschluss." msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" msgid "Web Interface is Disabled" msgstr "Web-Schnittstelle ist deaktiviert" msgid "Yes" msgstr "Ja" msgid "You cannot access this page." msgstr "" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Auf diese Seite greifen Sie zu über die URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." msgstr "" msgid "ZPL Label Printer" msgstr "ZPL-Etikettendrucker" msgid "Zebra" msgstr "Zebra" msgid "aborted" msgstr "abgebrochen" #. TRANSLATORS: Accuracy Units msgid "accuracy-units" msgstr "" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" msgstr "" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" msgstr "" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" msgstr "" #. TRANSLATORS: Bale Output msgid "baling" msgstr "" #. TRANSLATORS: Bale Using msgid "baling-type" msgstr "" #. TRANSLATORS: Band msgid "baling-type.band" msgstr "" #. TRANSLATORS: Shrink Wrap msgid "baling-type.shrink-wrap" msgstr "" #. TRANSLATORS: Wrap msgid "baling-type.wrap" msgstr "" #. TRANSLATORS: Bale After msgid "baling-when" msgstr "" #. TRANSLATORS: Job msgid "baling-when.after-job" msgstr "" #. TRANSLATORS: Sets msgid "baling-when.after-sets" msgstr "" #. TRANSLATORS: Bind Output msgid "binding" msgstr "" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "binding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "binding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "binding-reference-edge.top" msgstr "" #. TRANSLATORS: Binder Type msgid "binding-type" msgstr "" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" msgstr "" #. TRANSLATORS: Comb msgid "binding-type.comb" msgstr "" #. TRANSLATORS: Flat msgid "binding-type.flat" msgstr "" #. TRANSLATORS: Padding msgid "binding-type.padding" msgstr "" #. TRANSLATORS: Perfect msgid "binding-type.perfect" msgstr "" #. TRANSLATORS: Spiral msgid "binding-type.spiral" msgstr "" #. TRANSLATORS: Tape msgid "binding-type.tape" msgstr "" #. TRANSLATORS: Velo msgid "binding-type.velo" msgstr "" msgid "canceled" msgstr "abgebrochen" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" msgstr "" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" msgstr "" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" msgstr "" #. TRANSLATORS: Coat Sheets msgid "coating" msgstr "" #. TRANSLATORS: Add Coating To msgid "coating-sides" msgstr "" #. TRANSLATORS: Back msgid "coating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "coating-sides.both" msgstr "" #. TRANSLATORS: Front msgid "coating-sides.front" msgstr "" #. TRANSLATORS: Type of Coating msgid "coating-type" msgstr "" #. TRANSLATORS: Archival msgid "coating-type.archival" msgstr "" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" msgstr "" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" msgstr "" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" msgstr "" #. TRANSLATORS: Glossy msgid "coating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "coating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" msgstr "" #. TRANSLATORS: Silicone msgid "coating-type.silicone" msgstr "" #. TRANSLATORS: Translucent msgid "coating-type.translucent" msgstr "" msgid "completed" msgstr "abgeschlossen" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" msgstr "" #. TRANSLATORS: Copies msgid "copies" msgstr "" #. TRANSLATORS: Back Cover msgid "cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "cover-front" msgstr "" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" msgstr "" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" msgstr "" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" msgstr "" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" msgstr "" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" msgstr "" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" msgstr "" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" msgstr "" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" msgstr "" #. TRANSLATORS: Printed Cover msgid "cover-type" msgstr "" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" msgstr "" #. TRANSLATORS: Back Only msgid "cover-type.print-back" msgstr "" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" msgstr "" #. TRANSLATORS: Front Only msgid "cover-type.print-front" msgstr "" #. TRANSLATORS: None msgid "cover-type.print-none" msgstr "" #. TRANSLATORS: Cover Output msgid "covering" msgstr "" #. TRANSLATORS: Add Cover msgid "covering-name" msgstr "" #. TRANSLATORS: Plain msgid "covering-name.plain" msgstr "" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" msgstr "" #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" msgstr "" msgid "cups-deviced failed to execute." msgstr "„cups-deviced“ konnte nicht ausgeführt werden." msgid "cups-driverd failed to execute." msgstr "„cups-driverd“ konnte nicht ausgeführt werden." #, c-format msgid "cupsctl: Cannot set %s directly." msgstr "" #, c-format msgid "cupsctl: Unable to connect to server: %s" msgstr "cupsctl: Kann nicht mit dem Server %s verbinden" #, c-format msgid "cupsctl: Unknown option \"%s\"" msgstr "cupsctl: Unbekannte Option »%s«" #, c-format msgid "cupsctl: Unknown option \"-%c\"" msgstr "cupsctl: Unbekannte Option \"-%c\"" msgid "cupsd: Expected config filename after \"-c\" option." msgstr "cupsd: Konfigurations-Dateiname nach der »-c« Option erwartet." msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "cupsd: Dateiname cups-files.conf nach der »-s« Option erwartet." msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" "cupsd: Start auf Anforderung nicht einkompiliert, starte im normalen Modus." msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "cupsd: Relativer Dateiname für cups-files.conf nicht zulässig." msgid "cupsd: Unable to get current directory." msgstr "cupsd: Aktuelles Verzeichnis kann nicht ermittelt werden." msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "cupsd: Pfad zur Datei cups-files.conf kann nicht ermittelt werden." #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "cupsd: Unbekanntes Argument \"%s\" - Abbruch." #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "cupsd: Unbekannte Option \"%c\" - Abbruch." #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "cupsfilter: ungültige Dokumentennummer %d." #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "cupsfilter: ungültige Auftrags-ID %d." msgid "cupsfilter: Only one filename can be specified." msgstr "cupsfilter: Es kann nur ein Dateiname angegeben werden." #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "cupsfilter: Auftragsdatei nicht verfügbar - %s" msgid "cupstestppd: The -q option is incompatible with the -v option." msgstr "cupstestppd: Die -q Option ist nicht vereinbar mit der -v Option." msgid "cupstestppd: The -v option is incompatible with the -q option." msgstr "cupstestppd: Die -v Option ist nicht vereinbar mit der -q Option." #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" msgstr "" #, c-format msgid "device for %s/%s: %s" msgstr "Gerät für %s/%s: %s" #, c-format msgid "device for %s: %s" msgstr "Gerät für %s: %s" #. TRANSLATORS: Copies msgid "document-copies" msgstr "" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "document-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" msgstr "" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" msgstr "" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" msgstr "" #. TRANSLATORS: None msgid "document-privacy-attributes.none" msgstr "" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "document-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "document-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "document-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" msgstr "" #. TRANSLATORS: Document State msgid "document-state" msgstr "" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" msgstr "" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" msgstr "" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" msgstr "" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" msgstr "" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" msgstr "" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" msgstr "" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" msgstr "" #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" msgstr "" #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" msgstr "" #. TRANSLATORS: None msgid "document-state-reasons.none" msgstr "" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" msgstr "" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" msgstr "" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" msgstr "" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" msgstr "" #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "document-state.3" msgstr "" #. TRANSLATORS: Processing msgid "document-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "document-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "document-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "document-state.8" msgstr "" #. TRANSLATORS: Completed msgid "document-state.9" msgstr "" msgid "error-index uses indefinite length" msgstr "Fehlerindex hat unbestimmte Länge" msgid "error-status uses indefinite length" msgstr "Fehlerstatus hat unbestimmte Länge" msgid "" "expression --and expression\n" " Logical AND" msgstr "" msgid "" "expression --or expression\n" " Logical OR" msgstr "" msgid "expression expression Logical AND" msgstr "" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" msgstr "" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" msgstr "" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" msgstr "" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" msgstr "" #. TRANSLATORS: Finishing Template msgid "finishing-template" msgstr "" #. TRANSLATORS: Bale msgid "finishing-template.bale" msgstr "" #. TRANSLATORS: Bind msgid "finishing-template.bind" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishing-template.bind-bottom" msgstr "" #. TRANSLATORS: Bind Left msgid "finishing-template.bind-left" msgstr "" #. TRANSLATORS: Bind Right msgid "finishing-template.bind-right" msgstr "" #. TRANSLATORS: Bind Top msgid "finishing-template.bind-top" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" msgstr "" #. TRANSLATORS: Coat msgid "finishing-template.coat" msgstr "" #. TRANSLATORS: Cover msgid "finishing-template.cover" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" msgstr "" #. TRANSLATORS: Fold msgid "finishing-template.fold" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishing-template.fold-gate" msgstr "" #. TRANSLATORS: Half Fold msgid "finishing-template.fold-half" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishing-template.fold-half-z" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishing-template.fold-left-gate" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishing-template.fold-letter" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishing-template.fold-parallel" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishing-template.fold-poster" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishing-template.fold-right-gate" msgstr "" #. TRANSLATORS: Z Fold msgid "finishing-template.fold-z" msgstr "" #. TRANSLATORS: JDF F10-1 msgid "finishing-template.jdf-f10-1" msgstr "" #. TRANSLATORS: JDF F10-2 msgid "finishing-template.jdf-f10-2" msgstr "" #. TRANSLATORS: JDF F10-3 msgid "finishing-template.jdf-f10-3" msgstr "" #. TRANSLATORS: JDF F12-1 msgid "finishing-template.jdf-f12-1" msgstr "" #. TRANSLATORS: JDF F12-10 msgid "finishing-template.jdf-f12-10" msgstr "" #. TRANSLATORS: JDF F12-11 msgid "finishing-template.jdf-f12-11" msgstr "" #. TRANSLATORS: JDF F12-12 msgid "finishing-template.jdf-f12-12" msgstr "" #. TRANSLATORS: JDF F12-13 msgid "finishing-template.jdf-f12-13" msgstr "" #. TRANSLATORS: JDF F12-14 msgid "finishing-template.jdf-f12-14" msgstr "" #. TRANSLATORS: JDF F12-2 msgid "finishing-template.jdf-f12-2" msgstr "" #. TRANSLATORS: JDF F12-3 msgid "finishing-template.jdf-f12-3" msgstr "" #. TRANSLATORS: JDF F12-4 msgid "finishing-template.jdf-f12-4" msgstr "" #. TRANSLATORS: JDF F12-5 msgid "finishing-template.jdf-f12-5" msgstr "" #. TRANSLATORS: JDF F12-6 msgid "finishing-template.jdf-f12-6" msgstr "" #. TRANSLATORS: JDF F12-7 msgid "finishing-template.jdf-f12-7" msgstr "" #. TRANSLATORS: JDF F12-8 msgid "finishing-template.jdf-f12-8" msgstr "" #. TRANSLATORS: JDF F12-9 msgid "finishing-template.jdf-f12-9" msgstr "" #. TRANSLATORS: JDF F14-1 msgid "finishing-template.jdf-f14-1" msgstr "" #. TRANSLATORS: JDF F16-1 msgid "finishing-template.jdf-f16-1" msgstr "" #. TRANSLATORS: JDF F16-10 msgid "finishing-template.jdf-f16-10" msgstr "" #. TRANSLATORS: JDF F16-11 msgid "finishing-template.jdf-f16-11" msgstr "" #. TRANSLATORS: JDF F16-12 msgid "finishing-template.jdf-f16-12" msgstr "" #. TRANSLATORS: JDF F16-13 msgid "finishing-template.jdf-f16-13" msgstr "" #. TRANSLATORS: JDF F16-14 msgid "finishing-template.jdf-f16-14" msgstr "" #. TRANSLATORS: JDF F16-2 msgid "finishing-template.jdf-f16-2" msgstr "" #. TRANSLATORS: JDF F16-3 msgid "finishing-template.jdf-f16-3" msgstr "" #. TRANSLATORS: JDF F16-4 msgid "finishing-template.jdf-f16-4" msgstr "" #. TRANSLATORS: JDF F16-5 msgid "finishing-template.jdf-f16-5" msgstr "" #. TRANSLATORS: JDF F16-6 msgid "finishing-template.jdf-f16-6" msgstr "" #. TRANSLATORS: JDF F16-7 msgid "finishing-template.jdf-f16-7" msgstr "" #. TRANSLATORS: JDF F16-8 msgid "finishing-template.jdf-f16-8" msgstr "" #. TRANSLATORS: JDF F16-9 msgid "finishing-template.jdf-f16-9" msgstr "" #. TRANSLATORS: JDF F18-1 msgid "finishing-template.jdf-f18-1" msgstr "" #. TRANSLATORS: JDF F18-2 msgid "finishing-template.jdf-f18-2" msgstr "" #. TRANSLATORS: JDF F18-3 msgid "finishing-template.jdf-f18-3" msgstr "" #. TRANSLATORS: JDF F18-4 msgid "finishing-template.jdf-f18-4" msgstr "" #. TRANSLATORS: JDF F18-5 msgid "finishing-template.jdf-f18-5" msgstr "" #. TRANSLATORS: JDF F18-6 msgid "finishing-template.jdf-f18-6" msgstr "" #. TRANSLATORS: JDF F18-7 msgid "finishing-template.jdf-f18-7" msgstr "" #. TRANSLATORS: JDF F18-8 msgid "finishing-template.jdf-f18-8" msgstr "" #. TRANSLATORS: JDF F18-9 msgid "finishing-template.jdf-f18-9" msgstr "" #. TRANSLATORS: JDF F2-1 msgid "finishing-template.jdf-f2-1" msgstr "" #. TRANSLATORS: JDF F20-1 msgid "finishing-template.jdf-f20-1" msgstr "" #. TRANSLATORS: JDF F20-2 msgid "finishing-template.jdf-f20-2" msgstr "" #. TRANSLATORS: JDF F24-1 msgid "finishing-template.jdf-f24-1" msgstr "" #. TRANSLATORS: JDF F24-10 msgid "finishing-template.jdf-f24-10" msgstr "" #. TRANSLATORS: JDF F24-11 msgid "finishing-template.jdf-f24-11" msgstr "" #. TRANSLATORS: JDF F24-2 msgid "finishing-template.jdf-f24-2" msgstr "" #. TRANSLATORS: JDF F24-3 msgid "finishing-template.jdf-f24-3" msgstr "" #. TRANSLATORS: JDF F24-4 msgid "finishing-template.jdf-f24-4" msgstr "" #. TRANSLATORS: JDF F24-5 msgid "finishing-template.jdf-f24-5" msgstr "" #. TRANSLATORS: JDF F24-6 msgid "finishing-template.jdf-f24-6" msgstr "" #. TRANSLATORS: JDF F24-7 msgid "finishing-template.jdf-f24-7" msgstr "" #. TRANSLATORS: JDF F24-8 msgid "finishing-template.jdf-f24-8" msgstr "" #. TRANSLATORS: JDF F24-9 msgid "finishing-template.jdf-f24-9" msgstr "" #. TRANSLATORS: JDF F28-1 msgid "finishing-template.jdf-f28-1" msgstr "" #. TRANSLATORS: JDF F32-1 msgid "finishing-template.jdf-f32-1" msgstr "" #. TRANSLATORS: JDF F32-2 msgid "finishing-template.jdf-f32-2" msgstr "" #. TRANSLATORS: JDF F32-3 msgid "finishing-template.jdf-f32-3" msgstr "" #. TRANSLATORS: JDF F32-4 msgid "finishing-template.jdf-f32-4" msgstr "" #. TRANSLATORS: JDF F32-5 msgid "finishing-template.jdf-f32-5" msgstr "" #. TRANSLATORS: JDF F32-6 msgid "finishing-template.jdf-f32-6" msgstr "" #. TRANSLATORS: JDF F32-7 msgid "finishing-template.jdf-f32-7" msgstr "" #. TRANSLATORS: JDF F32-8 msgid "finishing-template.jdf-f32-8" msgstr "" #. TRANSLATORS: JDF F32-9 msgid "finishing-template.jdf-f32-9" msgstr "" #. TRANSLATORS: JDF F36-1 msgid "finishing-template.jdf-f36-1" msgstr "" #. TRANSLATORS: JDF F36-2 msgid "finishing-template.jdf-f36-2" msgstr "" #. TRANSLATORS: JDF F4-1 msgid "finishing-template.jdf-f4-1" msgstr "" #. TRANSLATORS: JDF F4-2 msgid "finishing-template.jdf-f4-2" msgstr "" #. TRANSLATORS: JDF F40-1 msgid "finishing-template.jdf-f40-1" msgstr "" #. TRANSLATORS: JDF F48-1 msgid "finishing-template.jdf-f48-1" msgstr "" #. TRANSLATORS: JDF F48-2 msgid "finishing-template.jdf-f48-2" msgstr "" #. TRANSLATORS: JDF F6-1 msgid "finishing-template.jdf-f6-1" msgstr "" #. TRANSLATORS: JDF F6-2 msgid "finishing-template.jdf-f6-2" msgstr "" #. TRANSLATORS: JDF F6-3 msgid "finishing-template.jdf-f6-3" msgstr "" #. TRANSLATORS: JDF F6-4 msgid "finishing-template.jdf-f6-4" msgstr "" #. TRANSLATORS: JDF F6-5 msgid "finishing-template.jdf-f6-5" msgstr "" #. TRANSLATORS: JDF F6-6 msgid "finishing-template.jdf-f6-6" msgstr "" #. TRANSLATORS: JDF F6-7 msgid "finishing-template.jdf-f6-7" msgstr "" #. TRANSLATORS: JDF F6-8 msgid "finishing-template.jdf-f6-8" msgstr "" #. TRANSLATORS: JDF F64-1 msgid "finishing-template.jdf-f64-1" msgstr "" #. TRANSLATORS: JDF F64-2 msgid "finishing-template.jdf-f64-2" msgstr "" #. TRANSLATORS: JDF F8-1 msgid "finishing-template.jdf-f8-1" msgstr "" #. TRANSLATORS: JDF F8-2 msgid "finishing-template.jdf-f8-2" msgstr "" #. TRANSLATORS: JDF F8-3 msgid "finishing-template.jdf-f8-3" msgstr "" #. TRANSLATORS: JDF F8-4 msgid "finishing-template.jdf-f8-4" msgstr "" #. TRANSLATORS: JDF F8-5 msgid "finishing-template.jdf-f8-5" msgstr "" #. TRANSLATORS: JDF F8-6 msgid "finishing-template.jdf-f8-6" msgstr "" #. TRANSLATORS: JDF F8-7 msgid "finishing-template.jdf-f8-7" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishing-template.jog-offset" msgstr "" #. TRANSLATORS: Laminate msgid "finishing-template.laminate" msgstr "" #. TRANSLATORS: Punch msgid "finishing-template.punch" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" msgstr "" #. TRANSLATORS: Staple msgid "finishing-template.staple" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" msgstr "" #. TRANSLATORS: Trim msgid "finishing-template.trim" msgstr "" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" msgstr "" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" msgstr "" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" msgstr "" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" msgstr "" #. TRANSLATORS: Finishings msgid "finishings" msgstr "" #. TRANSLATORS: Finishings msgid "finishings-col" msgstr "" #. TRANSLATORS: Fold msgid "finishings.10" msgstr "" #. TRANSLATORS: Z Fold msgid "finishings.100" msgstr "" #. TRANSLATORS: Engineering Z Fold msgid "finishings.101" msgstr "" #. TRANSLATORS: Trim msgid "finishings.11" msgstr "" #. TRANSLATORS: Bale msgid "finishings.12" msgstr "" #. TRANSLATORS: Booklet Maker msgid "finishings.13" msgstr "" #. TRANSLATORS: Jog Offset msgid "finishings.14" msgstr "" #. TRANSLATORS: Coat msgid "finishings.15" msgstr "" #. TRANSLATORS: Laminate msgid "finishings.16" msgstr "" #. TRANSLATORS: Staple Top Left msgid "finishings.20" msgstr "" #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" msgstr "" #. TRANSLATORS: Staple Top Right msgid "finishings.22" msgstr "" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" msgstr "" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" msgstr "" #. TRANSLATORS: Edge Stitch Top msgid "finishings.25" msgstr "" #. TRANSLATORS: Edge Stitch Right msgid "finishings.26" msgstr "" #. TRANSLATORS: Edge Stitch Bottom msgid "finishings.27" msgstr "" #. TRANSLATORS: 2 Staples on Left msgid "finishings.28" msgstr "" #. TRANSLATORS: 2 Staples on Top msgid "finishings.29" msgstr "" #. TRANSLATORS: None msgid "finishings.3" msgstr "" #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" msgstr "" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" msgstr "" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" msgstr "" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" msgstr "" #. TRANSLATORS: 3 Staples on Right msgid "finishings.34" msgstr "" #. TRANSLATORS: 3 Staples on Bottom msgid "finishings.35" msgstr "" #. TRANSLATORS: Staple msgid "finishings.4" msgstr "" #. TRANSLATORS: Punch msgid "finishings.5" msgstr "" #. TRANSLATORS: Bind Left msgid "finishings.50" msgstr "" #. TRANSLATORS: Bind Top msgid "finishings.51" msgstr "" #. TRANSLATORS: Bind Right msgid "finishings.52" msgstr "" #. TRANSLATORS: Bind Bottom msgid "finishings.53" msgstr "" #. TRANSLATORS: Cover msgid "finishings.6" msgstr "" #. TRANSLATORS: Trim Pages msgid "finishings.60" msgstr "" #. TRANSLATORS: Trim Documents msgid "finishings.61" msgstr "" #. TRANSLATORS: Trim Copies msgid "finishings.62" msgstr "" #. TRANSLATORS: Trim Job msgid "finishings.63" msgstr "" #. TRANSLATORS: Bind msgid "finishings.7" msgstr "" #. TRANSLATORS: Punch Top Left msgid "finishings.70" msgstr "" #. TRANSLATORS: Punch Bottom Left msgid "finishings.71" msgstr "" #. TRANSLATORS: Punch Top Right msgid "finishings.72" msgstr "" #. TRANSLATORS: Punch Bottom Right msgid "finishings.73" msgstr "" #. TRANSLATORS: 2-hole Punch Left msgid "finishings.74" msgstr "" #. TRANSLATORS: 2-hole Punch Top msgid "finishings.75" msgstr "" #. TRANSLATORS: 2-hole Punch Right msgid "finishings.76" msgstr "" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishings.77" msgstr "" #. TRANSLATORS: 3-hole Punch Left msgid "finishings.78" msgstr "" #. TRANSLATORS: 3-hole Punch Top msgid "finishings.79" msgstr "" #. TRANSLATORS: Saddle Stitch msgid "finishings.8" msgstr "" #. TRANSLATORS: 3-hole Punch Right msgid "finishings.80" msgstr "" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishings.81" msgstr "" #. TRANSLATORS: 4-hole Punch Left msgid "finishings.82" msgstr "" #. TRANSLATORS: 4-hole Punch Top msgid "finishings.83" msgstr "" #. TRANSLATORS: 4-hole Punch Right msgid "finishings.84" msgstr "" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishings.85" msgstr "" #. TRANSLATORS: Multi-hole Punch Left msgid "finishings.86" msgstr "" #. TRANSLATORS: Multi-hole Punch Top msgid "finishings.87" msgstr "" #. TRANSLATORS: Multi-hole Punch Right msgid "finishings.88" msgstr "" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishings.89" msgstr "" #. TRANSLATORS: Edge Stitch msgid "finishings.9" msgstr "" #. TRANSLATORS: Accordion Fold msgid "finishings.90" msgstr "" #. TRANSLATORS: Double Gate Fold msgid "finishings.91" msgstr "" #. TRANSLATORS: Gate Fold msgid "finishings.92" msgstr "" #. TRANSLATORS: Half Fold msgid "finishings.93" msgstr "" #. TRANSLATORS: Half Z Fold msgid "finishings.94" msgstr "" #. TRANSLATORS: Left Gate Fold msgid "finishings.95" msgstr "" #. TRANSLATORS: Letter Fold msgid "finishings.96" msgstr "" #. TRANSLATORS: Parallel Fold msgid "finishings.97" msgstr "" #. TRANSLATORS: Poster Fold msgid "finishings.98" msgstr "" #. TRANSLATORS: Right Gate Fold msgid "finishings.99" msgstr "" #. TRANSLATORS: Fold msgid "folding" msgstr "" #. TRANSLATORS: Fold Direction msgid "folding-direction" msgstr "" #. TRANSLATORS: Inward msgid "folding-direction.inward" msgstr "" #. TRANSLATORS: Outward msgid "folding-direction.outward" msgstr "" #. TRANSLATORS: Fold Position msgid "folding-offset" msgstr "" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "folding-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "folding-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "folding-reference-edge.top" msgstr "" #. TRANSLATORS: Font Name msgid "font-name-requested" msgstr "" #. TRANSLATORS: Font Size msgid "font-size-requested" msgstr "" #. TRANSLATORS: Force Front Side msgid "force-front-side" msgstr "" #. TRANSLATORS: From Name msgid "from-name" msgstr "" msgid "held" msgstr "gehalten" msgid "help\t\tGet help on commands." msgstr "" msgid "idle" msgstr "inaktiv" #. TRANSLATORS: Imposition Template msgid "imposition-template" msgstr "" #. TRANSLATORS: None msgid "imposition-template.none" msgstr "" #. TRANSLATORS: Signature msgid "imposition-template.signature" msgstr "" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" msgstr "" #. TRANSLATORS: Insert Count msgid "insert-count" msgstr "" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" msgstr "" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "ippfind: falscher regulärer Ausdruck: %s" msgid "ippfind: Cannot use --and after --or." msgstr "ippfind: --and kann nicht zusammen mit --or benutzt werden." #, c-format msgid "ippfind: Expected key name after %s." msgstr "ippfind: Erwarte Schlüsselname nach %s." #, c-format msgid "ippfind: Expected port range after %s." msgstr "ippfind: Erwarte Portbereich nach %s." #, c-format msgid "ippfind: Expected program after %s." msgstr "ippfind: Erwarte Programm nach %s." #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "ippfind: Erwarte Semikolon nach %s." msgid "ippfind: Missing close brace in substitution." msgstr "" msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Fehlende Schlussklammer." msgid "ippfind: Missing expression before \"--and\"." msgstr "ippfind: Fehlender Ausdruck vor \"--and\"." msgid "ippfind: Missing expression before \"--or\"." msgstr "ippfind: Fehlender Ausdruck vor \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." msgstr "" #, c-format msgid "ippfind: Missing name after %s." msgstr "" msgid "ippfind: Missing open parenthesis." msgstr "" #, c-format msgid "ippfind: Missing program after %s." msgstr "" #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" msgid "ippfind: Out of memory." msgstr "ippfind: zu wenig Speicher." msgid "ippfind: Too many parenthesis." msgstr "ipp find: zu viele Klammern." #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "ippfind: Auflösen oder Browsen nicht möglich: %s" #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " "and \"-X\"." msgstr "" msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" msgid "ipptool: May only specify a single URI." msgstr "" msgid "ipptool: Missing count for \"-n\"." msgstr "" msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" msgid "ipptool: Missing filename for \"-f\"." msgstr "" msgid "ipptool: Missing name=value for \"-d\"." msgstr "" msgid "ipptool: Missing seconds for \"-i\"." msgstr "" msgid "ipptool: URI required before test file." msgstr "" #. TRANSLATORS: Job Account ID msgid "job-account-id" msgstr "" #. TRANSLATORS: Job Account Type msgid "job-account-type" msgstr "" #. TRANSLATORS: General msgid "job-account-type.general" msgstr "" #. TRANSLATORS: Group msgid "job-account-type.group" msgstr "" #. TRANSLATORS: None msgid "job-account-type.none" msgstr "" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" msgstr "" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" msgstr "" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" msgstr "" #. TRANSLATORS: None msgid "job-accounting-sheets-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-accounting-sheets-type.standard" msgstr "" #. TRANSLATORS: Job Accounting User ID msgid "job-accounting-user-id" msgstr "" #. TRANSLATORS: Job Cancel After msgid "job-cancel-after" msgstr "" #. TRANSLATORS: Copies msgid "job-copies" msgstr "" #. TRANSLATORS: Back Cover msgid "job-cover-back" msgstr "" #. TRANSLATORS: Front Cover msgid "job-cover-front" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" msgstr "" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-delay-output-until.night" msgstr "" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" msgstr "" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" msgstr "" #. TRANSLATORS: On Error msgid "job-error-action" msgstr "" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" msgstr "" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" msgstr "" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" msgstr "" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" msgstr "" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" msgstr "" #. TRANSLATORS: None msgid "job-error-sheet-type.none" msgstr "" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" msgstr "" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" msgstr "" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" msgstr "" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" msgstr "" #. TRANSLATORS: Job Finishings msgid "job-finishings" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until" msgstr "" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" msgstr "" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" msgstr "" #. TRANSLATORS: Evening msgid "job-hold-until.evening" msgstr "" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" msgstr "" #. TRANSLATORS: Night msgid "job-hold-until.night" msgstr "" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" msgstr "" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" msgstr "" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" msgstr "" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" msgstr "" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" msgstr "" #. TRANSLATORS: Title msgid "job-name" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages" msgstr "" #. TRANSLATORS: Job Pages msgid "job-pages-col" msgstr "" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" msgstr "" msgid "job-printer-uri attribute missing." msgstr "job-printer-uri Attribut fehlt." #. TRANSLATORS: Job Priority msgid "job-priority" msgstr "" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "job-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" msgstr "" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" msgstr "" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" msgstr "" #. TRANSLATORS: None msgid "job-privacy-attributes.none" msgstr "" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "job-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "job-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "job-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" msgstr "" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" msgstr "" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" msgstr "" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" msgstr "" #. TRANSLATORS: Job Retain Until Time msgid "job-retain-until-time" msgstr "" #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" msgstr "" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" msgstr "" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" msgstr "" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" msgstr "" #. TRANSLATORS: None msgid "job-retain-until.none" msgstr "" #. TRANSLATORS: Job Save Disposition msgid "job-save-disposition" msgstr "" #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets" msgstr "" #. TRANSLATORS: Banner Page msgid "job-sheets-col" msgstr "" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" msgstr "" #. TRANSLATORS: End Sheet msgid "job-sheets.job-end-sheet" msgstr "" #. TRANSLATORS: Start Sheet msgid "job-sheets.job-start-sheet" msgstr "" #. TRANSLATORS: None msgid "job-sheets.none" msgstr "" #. TRANSLATORS: Standard msgid "job-sheets.standard" msgstr "" #. TRANSLATORS: Job State msgid "job-state" msgstr "" #. TRANSLATORS: Job State Message msgid "job-state-message" msgstr "" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" msgstr "" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" msgstr "" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" msgstr "" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" msgstr "" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" msgstr "" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" msgstr "" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" msgstr "" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" msgstr "" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" msgstr "" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" msgstr "" #. TRANSLATORS: Digital Signature Did Not Verify msgid "job-state-reasons.digital-signature-did-not-verify" msgstr "" #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" msgstr "" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" msgstr "" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" msgstr "" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" msgstr "" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" msgstr "" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" msgstr "" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" msgstr "" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" msgstr "" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" msgstr "" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" msgstr "" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" msgstr "" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" msgstr "" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" msgstr "" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" msgstr "" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" msgstr "" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" msgstr "" #. TRANSLATORS: Job Digital Signature Wait msgid "job-state-reasons.job-digital-signature-wait" msgstr "" #. TRANSLATORS: Job Fetchable msgid "job-state-reasons.job-fetchable" msgstr "" #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" msgstr "" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" msgstr "" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" msgstr "" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" msgstr "" #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" msgstr "" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" msgstr "" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" msgstr "" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" msgstr "" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" msgstr "" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" msgstr "" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" msgstr "" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" msgstr "" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" msgstr "" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" msgstr "" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" msgstr "" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" msgstr "" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" msgstr "" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" msgstr "" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" msgstr "" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" msgstr "" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" msgstr "" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" msgstr "" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" msgstr "" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" msgstr "" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" msgstr "" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" msgstr "" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" msgstr "" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" msgstr "" #. TRANSLATORS: None msgid "job-state-reasons.none" msgstr "" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" msgstr "" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" msgstr "" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" msgstr "" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" msgstr "" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" msgstr "" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" msgstr "" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" msgstr "" #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" msgstr "" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" msgstr "" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" msgstr "" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" msgstr "" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" msgstr "" #. TRANSLATORS: Pending msgid "job-state.3" msgstr "" #. TRANSLATORS: Held msgid "job-state.4" msgstr "" #. TRANSLATORS: Processing msgid "job-state.5" msgstr "" #. TRANSLATORS: Stopped msgid "job-state.6" msgstr "" #. TRANSLATORS: Canceled msgid "job-state.7" msgstr "" #. TRANSLATORS: Aborted msgid "job-state.8" msgstr "" #. TRANSLATORS: Completed msgid "job-state.9" msgstr "" #. TRANSLATORS: Laminate Pages msgid "laminating" msgstr "" #. TRANSLATORS: Laminate msgid "laminating-sides" msgstr "" #. TRANSLATORS: Back Only msgid "laminating-sides.back" msgstr "" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" msgstr "" #. TRANSLATORS: Front Only msgid "laminating-sides.front" msgstr "" #. TRANSLATORS: Type of Lamination msgid "laminating-type" msgstr "" #. TRANSLATORS: Archival msgid "laminating-type.archival" msgstr "" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "laminating-type.matte" msgstr "" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" msgstr "" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" msgstr "" #. TRANSLATORS: Logo msgid "logo" msgstr "" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: Klassenname darf nur druckbare Zeichen enthalten." #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "lpadmin: Nach der \"-%c\" Option PPD erwartet." msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" "lpadmin: Nach der \"-u\" Option wird eine allow/deny:userlist erwartet." msgid "lpadmin: Expected class after \"-r\" option." msgstr "lpadmin: Klasse nach der \"-r\" Option erwartet." msgid "lpadmin: Expected class name after \"-c\" option." msgstr "lpadmin: Klasse nach der \"-c\" Option erwartet." msgid "lpadmin: Expected description after \"-D\" option." msgstr "lpadmin: BEschreibung nach der \"-D\" Option erwartet." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: Geräte-URI nach der \"-v\" Option erwartet." msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "lpadmin: Dateitype nach der \"-I\" Option erwartet." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: Hostname nach der \"-h\" Option erwartet." msgid "lpadmin: Expected location after \"-L\" option." msgstr "lpadmin: Ort nach der \"-L\" Option erwartet." msgid "lpadmin: Expected model after \"-m\" option." msgstr "lpadmin: Modellangabe nach der \"-m\" Option erwartet." msgid "lpadmin: Expected name after \"-R\" option." msgstr "lpadmin: Name nach der \"-R\" Option erwartet." msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "lpadmin: Name=Wert nach der \"-o\" Option erwartet." msgid "lpadmin: Expected printer after \"-p\" option." msgstr "lpadmin: Drucker nach der \"-p\" Option erwartet." msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "lpadmin: Druckername nach der \"-d\" Option erwartet." msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "lpadmin: Drucker oder Klasse nach der \"-x\" Option erwartet." msgid "lpadmin: No member names were seen." msgstr "lpadmin: Keine Mitgleidernamen erkennbar." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "lpadmin: Drucker %s ist bereits Mitglied der Klasse %s." #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "lpadmin: Drucker %s ist kein Mitglied der Klasse %s." msgid "" "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: Druckername darf nur druckbare Zeichen enthalten." msgid "" "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Kann Drucker nicht zur Klasse hinzufügen:\n" " Der Druckername muss zuerst angegeben werden." #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "lpadmin: Kann nicht mit dem Server %s verbinden." msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: Temporäre Datei kann nicht angelegt werden" msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "lpadmin: Öffnen der PPD \"%s\": %s in Zeile %d nicht möglich." msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" "lpadmin: Entfernen des Drucker aus der Klasse nicht möglich:\n" " Sie müssen zuerst einen Druckernamen angeben." msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" "lpadmin: Festlegen der Druckeroptionen nicht möglich:\n" " Sie müssen zuerst einen Druckernamen angeben." #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "lpadmin: Unbekannte Erlaubnis/Ablehnungs-Option »%s«." #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "lpadmin: unbekanntes Argument \"%s\"." #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "lpadmin: Unbekannte Option »%c«." msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Warnung - Inhaltstypliste ignoriert." msgid "lpc> " msgstr "lpc> " msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" msgid "lpinfo: Expected language after \"--language\"." msgstr "lpinfo: Sprache nach \"--language\" erwartet." msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" msgid "lpinfo: Expected product string after \"--product\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "lpmove: Verbindung zum Server »%s« nicht möglich" #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "lpmove: Unbekanntes Argument »%s«." msgid "lpoptions: No printers." msgstr "lpoptions: Keine Drucker." #, c-format msgid "lpoptions: Unable to add printer or instance: %s" msgstr "lpoptions: Hinzufügen von Drucker oder Instanz nicht möglich: %s" #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" msgstr "lpoptions: Keine PPD-Datei für %s: %s verfügbar" #, c-format msgid "lpoptions: Unable to open PPD file for %s." msgstr "lpoptions: Keine PPD-Datei für %s verfügbar." msgid "lpoptions: Unknown printer or class." msgstr "lpoptions: Unbekannter Drucker oder Klasse." #, c-format msgid "" "lpstat: error - %s environment variable names non-existent destination \"%s" "\"." msgstr "" #. TRANSLATORS: Amount of Material msgid "material-amount" msgstr "" #. TRANSLATORS: Amount Units msgid "material-amount-units" msgstr "" #. TRANSLATORS: Grams msgid "material-amount-units.g" msgstr "" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" msgstr "" #. TRANSLATORS: Liters msgid "material-amount-units.l" msgstr "" #. TRANSLATORS: Meters msgid "material-amount-units.m" msgstr "" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" msgstr "" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" msgstr "" #. TRANSLATORS: Material Color msgid "material-color" msgstr "" #. TRANSLATORS: Material Diameter msgid "material-diameter" msgstr "" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" msgstr "" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" msgstr "" #. TRANSLATORS: Material Name msgid "material-name" msgstr "" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" msgstr "" #. TRANSLATORS: Use Material For msgid "material-purpose" msgstr "" #. TRANSLATORS: Everything msgid "material-purpose.all" msgstr "" #. TRANSLATORS: Base msgid "material-purpose.base" msgstr "" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" msgstr "" #. TRANSLATORS: Shell msgid "material-purpose.shell" msgstr "" #. TRANSLATORS: Supports msgid "material-purpose.support" msgstr "" #. TRANSLATORS: Feed Rate msgid "material-rate" msgstr "" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" msgstr "" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" msgstr "" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" msgstr "" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" msgstr "" #. TRANSLATORS: Material Retraction msgid "material-retraction" msgstr "" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" msgstr "" #. TRANSLATORS: Material Temperature msgid "material-temperature" msgstr "" #. TRANSLATORS: Material Type msgid "material-type" msgstr "" #. TRANSLATORS: ABS msgid "material-type.abs" msgstr "" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" msgstr "" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" msgstr "" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" msgstr "" #. TRANSLATORS: Gold msgid "material-type.gold" msgstr "" #. TRANSLATORS: Nylon msgid "material-type.nylon" msgstr "" #. TRANSLATORS: Pet msgid "material-type.pet" msgstr "" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" msgstr "" #. TRANSLATORS: PLA msgid "material-type.pla" msgstr "" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" msgstr "" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" msgstr "" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" msgstr "" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" msgstr "" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" msgstr "" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" msgstr "" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" msgstr "" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" msgstr "" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" msgstr "" #. TRANSLATORS: Silver msgid "material-type.silver" msgstr "" #. TRANSLATORS: Titanium msgid "material-type.titanium" msgstr "" #. TRANSLATORS: Wax msgid "material-type.wax" msgstr "" #. TRANSLATORS: Materials msgid "materials-col" msgstr "" #. TRANSLATORS: Media msgid "media" msgstr "" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" msgstr "" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" msgstr "" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" msgstr "" #. TRANSLATORS: Matte msgid "media-back-coating.matte" msgstr "" #. TRANSLATORS: None msgid "media-back-coating.none" msgstr "" #. TRANSLATORS: Satin msgid "media-back-coating.satin" msgstr "" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" msgstr "" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" msgstr "" #. TRANSLATORS: Media msgid "media-col" msgstr "" #. TRANSLATORS: Media Color msgid "media-color" msgstr "" #. TRANSLATORS: Black msgid "media-color.black" msgstr "" #. TRANSLATORS: Blue msgid "media-color.blue" msgstr "" #. TRANSLATORS: Brown msgid "media-color.brown" msgstr "" #. TRANSLATORS: Buff msgid "media-color.buff" msgstr "" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" msgstr "" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" msgstr "" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" msgstr "" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" msgstr "" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" msgstr "" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" msgstr "" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" msgstr "" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" msgstr "" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" msgstr "" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" msgstr "" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" msgstr "" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" msgstr "" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" msgstr "" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" msgstr "" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" msgstr "" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" msgstr "" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" msgstr "" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" msgstr "" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" msgstr "" #. TRANSLATORS: Clear White msgid "media-color.clear-white" msgstr "" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" msgstr "" #. TRANSLATORS: Cyan msgid "media-color.cyan" msgstr "" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" msgstr "" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" msgstr "" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" msgstr "" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" msgstr "" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" msgstr "" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" msgstr "" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" msgstr "" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" msgstr "" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" msgstr "" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" msgstr "" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" msgstr "" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" msgstr "" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" msgstr "" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" msgstr "" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" msgstr "" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" msgstr "" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" msgstr "" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" msgstr "" #. TRANSLATORS: Gold msgid "media-color.gold" msgstr "" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" msgstr "" #. TRANSLATORS: Gray msgid "media-color.gray" msgstr "" #. TRANSLATORS: Green msgid "media-color.green" msgstr "" #. TRANSLATORS: Ivory msgid "media-color.ivory" msgstr "" #. TRANSLATORS: Light Black msgid "media-color.light-black" msgstr "" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" msgstr "" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" msgstr "" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" msgstr "" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" msgstr "" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" msgstr "" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" msgstr "" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" msgstr "" #. TRANSLATORS: Light Green msgid "media-color.light-green" msgstr "" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" msgstr "" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" msgstr "" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" msgstr "" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" msgstr "" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" msgstr "" #. TRANSLATORS: Light Red msgid "media-color.light-red" msgstr "" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" msgstr "" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" msgstr "" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" msgstr "" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" msgstr "" #. TRANSLATORS: Magenta msgid "media-color.magenta" msgstr "" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" msgstr "" #. TRANSLATORS: Mustard msgid "media-color.mustard" msgstr "" #. TRANSLATORS: No Color msgid "media-color.no-color" msgstr "" #. TRANSLATORS: Orange msgid "media-color.orange" msgstr "" #. TRANSLATORS: Pink msgid "media-color.pink" msgstr "" #. TRANSLATORS: Red msgid "media-color.red" msgstr "" #. TRANSLATORS: Silver msgid "media-color.silver" msgstr "" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" msgstr "" #. TRANSLATORS: Violet msgid "media-color.violet" msgstr "" #. TRANSLATORS: White msgid "media-color.white" msgstr "" #. TRANSLATORS: Yellow msgid "media-color.yellow" msgstr "" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" msgstr "" #. TRANSLATORS: Media Grain msgid "media-grain" msgstr "" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" msgstr "" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" msgstr "" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" msgstr "" #. TRANSLATORS: Media Info msgid "media-info" msgstr "" #. TRANSLATORS: Force Media msgid "media-input-tray-check" msgstr "" #. TRANSLATORS: Media Left Margin msgid "media-left-margin" msgstr "" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" msgstr "" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" msgstr "" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" msgstr "" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" msgstr "" #. TRANSLATORS: Recycled Media msgid "media-recycled" msgstr "" #. TRANSLATORS: None msgid "media-recycled.none" msgstr "" #. TRANSLATORS: Standard msgid "media-recycled.standard" msgstr "" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" msgstr "" #. TRANSLATORS: Media Dimensions msgid "media-size" msgstr "" #. TRANSLATORS: Media Name msgid "media-size-name" msgstr "" #. TRANSLATORS: Media Source msgid "media-source" msgstr "" #. TRANSLATORS: Alternate msgid "media-source.alternate" msgstr "" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" msgstr "" #. TRANSLATORS: Automatic msgid "media-source.auto" msgstr "" #. TRANSLATORS: Bottom msgid "media-source.bottom" msgstr "" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" msgstr "" #. TRANSLATORS: Center msgid "media-source.center" msgstr "" #. TRANSLATORS: Disc msgid "media-source.disc" msgstr "" #. TRANSLATORS: Envelope msgid "media-source.envelope" msgstr "" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" msgstr "" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "media-source.left" msgstr "" #. TRANSLATORS: Main msgid "media-source.main" msgstr "" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" msgstr "" #. TRANSLATORS: Manual msgid "media-source.manual" msgstr "" #. TRANSLATORS: Middle msgid "media-source.middle" msgstr "" #. TRANSLATORS: Photo msgid "media-source.photo" msgstr "" #. TRANSLATORS: Rear msgid "media-source.rear" msgstr "" #. TRANSLATORS: Right msgid "media-source.right" msgstr "" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" msgstr "" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" msgstr "" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" msgstr "" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" msgstr "" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" msgstr "" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" msgstr "" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" msgstr "" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" msgstr "" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" msgstr "" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" msgstr "" #. TRANSLATORS: Side msgid "media-source.side" msgstr "" #. TRANSLATORS: Top msgid "media-source.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" msgstr "" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" msgstr "" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" msgstr "" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" msgstr "" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" msgstr "" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" msgstr "" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" msgstr "" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" msgstr "" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" msgstr "" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" msgstr "" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" msgstr "" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" msgstr "" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" msgstr "" #. TRANSLATORS: Media Thickness msgid "media-thickness" msgstr "" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" msgstr "" #. TRANSLATORS: Antique msgid "media-tooth.antique" msgstr "" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" msgstr "" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" msgstr "" #. TRANSLATORS: Fine msgid "media-tooth.fine" msgstr "" #. TRANSLATORS: Linen msgid "media-tooth.linen" msgstr "" #. TRANSLATORS: Medium msgid "media-tooth.medium" msgstr "" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" msgstr "" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" msgstr "" #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" msgstr "" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" msgstr "" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" msgstr "" #. TRANSLATORS: Media Type msgid "media-type" msgstr "" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" msgstr "" #. TRANSLATORS: Automatic msgid "media-type.auto" msgstr "" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" msgstr "" #. TRANSLATORS: Cardboard msgid "media-type.cardboard" msgstr "" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" msgstr "" #. TRANSLATORS: CD msgid "media-type.cd" msgstr "" #. TRANSLATORS: Continuous msgid "media-type.continuous" msgstr "" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" msgstr "" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" msgstr "" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" msgstr "" #. TRANSLATORS: Optical Disc msgid "media-type.disc" msgstr "" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" msgstr "" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" msgstr "" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" msgstr "" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" msgstr "" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" msgstr "" #. TRANSLATORS: Dry Film msgid "media-type.dry-film" msgstr "" #. TRANSLATORS: DVD msgid "media-type.dvd" msgstr "" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" msgstr "" #. TRANSLATORS: End Board msgid "media-type.end-board" msgstr "" #. TRANSLATORS: Envelope msgid "media-type.envelope" msgstr "" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" msgstr "" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" msgstr "" #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" msgstr "" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" msgstr "" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" msgstr "" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" msgstr "" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" msgstr "" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" msgstr "" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" msgstr "" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" msgstr "" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" msgstr "" #. TRANSLATORS: Fabric msgid "media-type.fabric" msgstr "" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" msgstr "" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" msgstr "" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" msgstr "" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" msgstr "" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" msgstr "" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" msgstr "" #. TRANSLATORS: Film msgid "media-type.film" msgstr "" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" msgstr "" #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" msgstr "" #. TRANSLATORS: Flute msgid "media-type.flute" msgstr "" #. TRANSLATORS: Foil msgid "media-type.foil" msgstr "" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" msgstr "" #. TRANSLATORS: Glass msgid "media-type.glass" msgstr "" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" msgstr "" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" msgstr "" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" msgstr "" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" msgstr "" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" msgstr "" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" msgstr "" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" msgstr "" #. TRANSLATORS: Labels msgid "media-type.labels" msgstr "" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" msgstr "" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" msgstr "" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" msgstr "" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" msgstr "" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" msgstr "" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" msgstr "" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" msgstr "" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" msgstr "" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" msgstr "" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" msgstr "" #. TRANSLATORS: Metal msgid "media-type.metal" msgstr "" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" msgstr "" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" msgstr "" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" msgstr "" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" msgstr "" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" msgstr "" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" msgstr "" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" msgstr "" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" msgstr "" #. TRANSLATORS: Other msgid "media-type.other" msgstr "" #. TRANSLATORS: Paper msgid "media-type.paper" msgstr "" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" msgstr "" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" msgstr "" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" msgstr "" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" msgstr "" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" msgstr "" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" msgstr "" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" msgstr "" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" msgstr "" #. TRANSLATORS: Plastic msgid "media-type.plastic" msgstr "" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" msgstr "" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" msgstr "" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" msgstr "" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" msgstr "" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" msgstr "" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" msgstr "" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" msgstr "" #. TRANSLATORS: Plate msgid "media-type.plate" msgstr "" #. TRANSLATORS: Polyester msgid "media-type.polyester" msgstr "" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" msgstr "" #. TRANSLATORS: Roll msgid "media-type.roll" msgstr "" #. TRANSLATORS: Screen msgid "media-type.screen" msgstr "" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" msgstr "" #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" msgstr "" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" msgstr "" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" msgstr "" #. TRANSLATORS: Single Face msgid "media-type.single-face" msgstr "" #. TRANSLATORS: Single Wall msgid "media-type.single-wall" msgstr "" #. TRANSLATORS: Sleeve msgid "media-type.sleeve" msgstr "" #. TRANSLATORS: Stationery msgid "media-type.stationery" msgstr "" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" msgstr "" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" msgstr "" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" msgstr "" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" msgstr "" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" msgstr "" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" msgstr "" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" msgstr "" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" msgstr "" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" msgstr "" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" msgstr "" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" msgstr "" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" msgstr "" #. TRANSLATORS: Tractor msgid "media-type.tractor" msgstr "" #. TRANSLATORS: Transfer msgid "media-type.transfer" msgstr "" #. TRANSLATORS: Transparency msgid "media-type.transparency" msgstr "" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" msgstr "" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" msgstr "" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" msgstr "" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" msgstr "" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" msgstr "" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" msgstr "" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" msgstr "" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" msgstr "" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" msgstr "" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" msgstr "" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" msgstr "" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" msgstr "" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" msgstr "" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" msgstr "" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" msgstr "" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" msgstr "" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" msgstr "" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" msgstr "" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" msgstr "" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" msgstr "" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" msgstr "" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" msgstr "" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" msgstr "" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" msgstr "" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" msgstr "" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" msgstr "" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" msgstr "" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" msgstr "" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" msgstr "" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" msgstr "" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" msgstr "" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" msgstr "" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" msgstr "" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" msgstr "" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" msgstr "" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" msgstr "" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" msgstr "" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" msgstr "" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" msgstr "" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" msgstr "" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" msgstr "" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" msgstr "" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" msgstr "" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" msgstr "" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" msgstr "" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" msgstr "" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" msgstr "" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" msgstr "" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" msgstr "" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" msgstr "" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" msgstr "" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" msgstr "" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" msgstr "" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" msgstr "" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" msgstr "" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" msgstr "" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" msgstr "" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" msgstr "" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" msgstr "" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" msgstr "" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" msgstr "" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" msgstr "" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" msgstr "" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" msgstr "" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" msgstr "" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" msgstr "" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" msgstr "" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" msgstr "" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" msgstr "" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" msgstr "" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" msgstr "" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" msgstr "" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" msgstr "" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" msgstr "" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" msgstr "" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" msgstr "" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" msgstr "" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" msgstr "" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" msgstr "" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" msgstr "" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" msgstr "" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" msgstr "" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" msgstr "" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" msgstr "" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" msgstr "" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" msgstr "" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" msgstr "" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" msgstr "" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" msgstr "" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" msgstr "" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" msgstr "" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" msgstr "" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" msgstr "" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" msgstr "" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" msgstr "" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" msgstr "" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" msgstr "" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" msgstr "" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" msgstr "" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" msgstr "" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" msgstr "" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" msgstr "" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" msgstr "" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" msgstr "" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" msgstr "" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" msgstr "" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" msgstr "" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" msgstr "" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" msgstr "" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" msgstr "" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" msgstr "" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" msgstr "" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" msgstr "" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" msgstr "" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" msgstr "" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" msgstr "" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" msgstr "" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" msgstr "" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" msgstr "" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" msgstr "" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" msgstr "" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" msgstr "" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" msgstr "" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" msgstr "" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" msgstr "" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" msgstr "" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" msgstr "" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" msgstr "" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" msgstr "" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" msgstr "" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" msgstr "" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" msgstr "" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" msgstr "" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" msgstr "" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" msgstr "" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" msgstr "" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" msgstr "" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" msgstr "" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" msgstr "" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" msgstr "" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" msgstr "" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" msgstr "" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" msgstr "" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" msgstr "" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" msgstr "" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" msgstr "" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" msgstr "" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" msgstr "" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" msgstr "" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" msgstr "" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" msgstr "" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" msgstr "" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" msgstr "" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" msgstr "" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" msgstr "" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" msgstr "" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" msgstr "" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" msgstr "" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" msgstr "" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" msgstr "" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" msgstr "" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" msgstr "" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" msgstr "" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" msgstr "" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" msgstr "" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" msgstr "" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" msgstr "" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" msgstr "" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" msgstr "" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" msgstr "" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" msgstr "" #. TRANSLATORS: 184 x 260mm msgid "media.om_16k_184x260mm" msgstr "" #. TRANSLATORS: 195 x 270mm msgid "media.om_16k_195x270mm" msgstr "" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" msgstr "" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" msgstr "" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" msgstr "" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" msgstr "" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" msgstr "" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" msgstr "" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" msgstr "" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" msgstr "" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" msgstr "" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" msgstr "" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" msgstr "" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" msgstr "" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" msgstr "" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" msgstr "" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" msgstr "" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" msgstr "" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" msgstr "" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" msgstr "" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" msgstr "" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" msgstr "" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" msgstr "" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" msgstr "" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" msgstr "" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" msgstr "" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" msgstr "" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" msgstr "" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" msgstr "" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" msgstr "" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" msgstr "" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" msgstr "" #, c-format msgid "members of class %s:" msgstr "Mitglieder der Klasse %s:" #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" msgstr "" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" msgstr "" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" msgstr "" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" msgstr "" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" msgstr "" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" msgstr "" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" msgstr "" #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" msgstr "" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" msgstr "" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" msgstr "" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" msgstr "" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" msgstr "" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" msgstr "" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" msgstr "" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" msgstr "" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" msgstr "" msgid "no entries" msgstr "Keine Einträge" msgid "no system default destination" msgstr "Keine systemvoreingestellten Ziele" #. TRANSLATORS: Noise Removal msgid "noise-removal" msgstr "" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" msgstr "" #. TRANSLATORS: Notify Charset msgid "notify-charset" msgstr "" #. TRANSLATORS: Notify Events msgid "notify-events" msgstr "" msgid "notify-events not specified." msgstr "" #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" msgstr "" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" msgstr "" #. TRANSLATORS: Document Created msgid "notify-events.document-created" msgstr "" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" msgstr "" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" msgstr "" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" msgstr "" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" msgstr "" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" msgstr "" #. TRANSLATORS: Job Created msgid "notify-events.job-created" msgstr "" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" msgstr "" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" msgstr "" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" msgstr "" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" msgstr "" #. TRANSLATORS: None msgid "notify-events.none" msgstr "" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" msgstr "" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" msgstr "" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" msgstr "" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" msgstr "" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" msgstr "" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" msgstr "" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" msgstr "" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" msgstr "" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" msgstr "" #. TRANSLATORS: Notify Lease Duration msgid "notify-lease-duration" msgstr "" #. TRANSLATORS: Notify Natural Language msgid "notify-natural-language" msgstr "" #. TRANSLATORS: Notify Pull Method msgid "notify-pull-method" msgstr "" #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" msgstr "" #. TRANSLATORS: Notify Subscription Ids msgid "notify-subscription-ids" msgstr "" #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" msgstr "" #. TRANSLATORS: Notify User Data msgid "notify-user-data" msgstr "" #. TRANSLATORS: Notify Wait msgid "notify-wait" msgstr "" #. TRANSLATORS: Number Of Retries msgid "number-of-retries" msgstr "" #. TRANSLATORS: Number-Up msgid "number-up" msgstr "" #. TRANSLATORS: Object Offset msgid "object-offset" msgstr "" #. TRANSLATORS: Object Size msgid "object-size" msgstr "" #. TRANSLATORS: Organization Name msgid "organization-name" msgstr "" #. TRANSLATORS: Orientation msgid "orientation-requested" msgstr "" #. TRANSLATORS: Portrait msgid "orientation-requested.3" msgstr "" #. TRANSLATORS: Landscape msgid "orientation-requested.4" msgstr "" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" msgstr "" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" msgstr "" #. TRANSLATORS: None msgid "orientation-requested.7" msgstr "" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" msgstr "" #. TRANSLATORS: Output Tray msgid "output-bin" msgstr "" #. TRANSLATORS: Automatic msgid "output-bin.auto" msgstr "" #. TRANSLATORS: Bottom msgid "output-bin.bottom" msgstr "" #. TRANSLATORS: Center msgid "output-bin.center" msgstr "" #. TRANSLATORS: Face Down msgid "output-bin.face-down" msgstr "" #. TRANSLATORS: Face Up msgid "output-bin.face-up" msgstr "" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" msgstr "" #. TRANSLATORS: Left msgid "output-bin.left" msgstr "" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" msgstr "" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" msgstr "" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" msgstr "" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" msgstr "" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" msgstr "" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" msgstr "" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" msgstr "" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" msgstr "" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" msgstr "" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" msgstr "" #. TRANSLATORS: Middle msgid "output-bin.middle" msgstr "" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" msgstr "" #. TRANSLATORS: Rear msgid "output-bin.rear" msgstr "" #. TRANSLATORS: Right msgid "output-bin.right" msgstr "" #. TRANSLATORS: Side msgid "output-bin.side" msgstr "" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" msgstr "" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" msgstr "" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" msgstr "" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" msgstr "" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" msgstr "" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" msgstr "" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" msgstr "" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" msgstr "" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" msgstr "" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" msgstr "" #. TRANSLATORS: Top msgid "output-bin.top" msgstr "" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" msgstr "" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" msgstr "" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" msgstr "" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" msgstr "" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" msgstr "" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" msgstr "" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" msgstr "" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" msgstr "" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" msgstr "" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" msgstr "" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" msgstr "" #. TRANSLATORS: Page Delivery msgid "page-delivery" msgstr "" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" msgstr "" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" msgstr "" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" msgstr "" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" msgstr "" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" msgstr "" #. TRANSLATORS: Page Order Received msgid "page-order-received" msgstr "" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" msgstr "" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" msgstr "" #. TRANSLATORS: Page Ranges msgid "page-ranges" msgstr "" #. TRANSLATORS: Pages msgid "pages" msgstr "" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" msgstr "" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" msgstr "" #. TRANSLATORS: Flipped msgid "pclm-raster-back-side.flipped" msgstr "" #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" msgstr "" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" msgstr "" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" msgstr "in Verarbeitung" #. TRANSLATORS: Platform Shape msgid "platform-shape" msgstr "" #. TRANSLATORS: Round msgid "platform-shape.ellipse" msgstr "" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" msgstr "" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" msgstr "" #. TRANSLATORS: Post-dial String msgid "post-dial-string" msgstr "" #, c-format msgid "ppdc: Adding include directory \"%s\"." msgstr "" #, c-format msgid "ppdc: Adding/updating UI text from %s." msgstr "" #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad font attribute: %s" msgstr "ppdc: Ungültiges Schriftattribut: %s" #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" #, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a filter definition on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected a program name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected boolean value on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected charset after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice code on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected choice name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected encoding after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected group name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected integer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected locale after #po on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option name/text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option section on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected option type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected quoted string on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected real number on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " "of %s." msgstr "" #, c-format msgid "ppdc: Expected selector after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected two option names on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected value after %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Expected version after Font on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Invalid cost for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Loading driver information file \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages for locale \"%s\"." msgstr "" #, c-format msgid "ppdc: Loading messages from \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "" #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Need a msgid line before any translation strings on line %d of %s." msgstr "" #, c-format msgid "ppdc: No message catalog provided for locale %s." msgstr "" #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s." msgstr "" #, c-format msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s." msgstr "" #, c-format msgid "ppdc: Unable to create output directory %s: %s" msgstr "" #, c-format msgid "ppdc: Unable to create output pipes: %s" msgstr "" #, c-format msgid "ppdc: Unable to execute cupstestppd: %s" msgstr "" #, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s" msgstr "" #, c-format msgid "ppdc: Unable to open %s: %s" msgstr "" #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unexpected text on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "" #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "" #, c-format msgid "" "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" #, c-format msgid "ppdc: Warning - overlapping filename \"%s\"." msgstr "" #, c-format msgid "ppdc: Writing %s." msgstr "ppdc: Schreibe: %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." msgstr "ppdc: Schreibe PPD-Dateien in Verzeichnis \"%s\"." #, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." msgstr "" #, c-format msgid "ppdmerge: Ignoring PPD file %s." msgstr "ppdmerge: PPD-Datei %s wird ignoriert." #, c-format msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "" #. TRANSLATORS: Pre-dial String msgid "pre-dial-string" msgstr "" #. TRANSLATORS: Number-Up Layout msgid "presentation-direction-number-up" msgstr "" #. TRANSLATORS: Top-bottom, Right-left msgid "presentation-direction-number-up.tobottom-toleft" msgstr "" #. TRANSLATORS: Top-bottom, Left-right msgid "presentation-direction-number-up.tobottom-toright" msgstr "" #. TRANSLATORS: Right-left, Top-bottom msgid "presentation-direction-number-up.toleft-tobottom" msgstr "" #. TRANSLATORS: Right-left, Bottom-top msgid "presentation-direction-number-up.toleft-totop" msgstr "" #. TRANSLATORS: Left-right, Top-bottom msgid "presentation-direction-number-up.toright-tobottom" msgstr "" #. TRANSLATORS: Left-right, Bottom-top msgid "presentation-direction-number-up.toright-totop" msgstr "" #. TRANSLATORS: Bottom-top, Right-left msgid "presentation-direction-number-up.totop-toleft" msgstr "" #. TRANSLATORS: Bottom-top, Left-right msgid "presentation-direction-number-up.totop-toright" msgstr "" #. TRANSLATORS: Print Accuracy msgid "print-accuracy" msgstr "" #. TRANSLATORS: Print Base msgid "print-base" msgstr "" #. TRANSLATORS: Print Base Actual msgid "print-base-actual" msgstr "" #. TRANSLATORS: Brim msgid "print-base.brim" msgstr "" #. TRANSLATORS: None msgid "print-base.none" msgstr "" #. TRANSLATORS: Raft msgid "print-base.raft" msgstr "" #. TRANSLATORS: Skirt msgid "print-base.skirt" msgstr "" #. TRANSLATORS: Standard msgid "print-base.standard" msgstr "" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" msgstr "" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" msgstr "" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" msgstr "" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" msgstr "" #. TRANSLATORS: Color msgid "print-color-mode.color" msgstr "" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" msgstr "" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" msgstr "" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" msgstr "" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" msgstr "" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" msgstr "" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" msgstr "" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" msgstr "" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" msgstr "" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" msgstr "" #. TRANSLATORS: Text msgid "print-content-optimize.text" msgstr "" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" msgstr "" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" msgstr "" #. TRANSLATORS: Print Objects msgid "print-objects" msgstr "" #. TRANSLATORS: Print Quality msgid "print-quality" msgstr "" #. TRANSLATORS: Draft msgid "print-quality.3" msgstr "" #. TRANSLATORS: Normal msgid "print-quality.4" msgstr "" #. TRANSLATORS: High msgid "print-quality.5" msgstr "" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" msgstr "" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" msgstr "" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" msgstr "" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" msgstr "" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" msgstr "" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" msgstr "" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" msgstr "" #. TRANSLATORS: Print Scaling msgid "print-scaling" msgstr "" #. TRANSLATORS: Automatic msgid "print-scaling.auto" msgstr "" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" msgstr "" #. TRANSLATORS: Fill msgid "print-scaling.fill" msgstr "" #. TRANSLATORS: Fit msgid "print-scaling.fit" msgstr "" #. TRANSLATORS: None msgid "print-scaling.none" msgstr "" #. TRANSLATORS: Print Supports msgid "print-supports" msgstr "" #. TRANSLATORS: Print Supports Actual msgid "print-supports-actual" msgstr "" #. TRANSLATORS: With Specified Material msgid "print-supports.material" msgstr "" #. TRANSLATORS: None msgid "print-supports.none" msgstr "" #. TRANSLATORS: Standard msgid "print-supports.standard" msgstr "" #, c-format msgid "printer %s disabled since %s -" msgstr "Drucker %s ist deaktiviert seit %s" #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" #, c-format msgid "printer %s is idle. enabled since %s" msgstr "Drucker %s ist im Leerlauf. Aktiviert seit %s" #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "Drucker %s druckt jetzt %s-%d. Aktiviert seit %s" #, c-format msgid "printer %s/%s disabled since %s -" msgstr "Drucker %s/%s deaktiviert seit %s" #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "Drucker %s/%s ist im Leerlauf. Aktiviert seit %s" #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "Drucker %s/%s druckt jetzt %s-%d. Aktiviert seit %s" #. TRANSLATORS: Printer Kind msgid "printer-kind" msgstr "" #. TRANSLATORS: Disc msgid "printer-kind.disc" msgstr "" #. TRANSLATORS: Document msgid "printer-kind.document" msgstr "" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" msgstr "" #. TRANSLATORS: Label msgid "printer-kind.label" msgstr "" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" msgstr "" #. TRANSLATORS: Photo msgid "printer-kind.photo" msgstr "" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" msgstr "" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" msgstr "" #. TRANSLATORS: Roll msgid "printer-kind.roll" msgstr "" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" msgstr "" #. TRANSLATORS: Print Resolution msgid "printer-resolution" msgstr "" #. TRANSLATORS: Printer State msgid "printer-state" msgstr "" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" msgstr "" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" msgstr "" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" msgstr "" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" msgstr "" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" msgstr "" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" msgstr "" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" msgstr "" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" msgstr "" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" msgstr "" #. TRANSLATORS: Bander Cover Open msgid "printer-state-reasons.bander-cover-open" msgstr "" #. TRANSLATORS: Bander Empty msgid "printer-state-reasons.bander-empty" msgstr "" #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" msgstr "" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" msgstr "" #. TRANSLATORS: Bander Interlock Open msgid "printer-state-reasons.bander-interlock-open" msgstr "" #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" msgstr "" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" msgstr "" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" msgstr "" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" msgstr "" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" msgstr "" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" msgstr "" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" msgstr "" #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" msgstr "" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" msgstr "" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" msgstr "" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" msgstr "" #. TRANSLATORS: Bander Recoverable Failure msgid "printer-state-reasons.bander-recoverable-failure" msgstr "" #. TRANSLATORS: Bander Recoverable Storage msgid "printer-state-reasons.bander-recoverable-storage" msgstr "" #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" msgstr "" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" msgstr "" #. TRANSLATORS: Bander Resource Removed msgid "printer-state-reasons.bander-resource-removed" msgstr "" #. TRANSLATORS: Bander Thermistor Failure msgid "printer-state-reasons.bander-thermistor-failure" msgstr "" #. TRANSLATORS: Bander Timing Failure msgid "printer-state-reasons.bander-timing-failure" msgstr "" #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" msgstr "" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" msgstr "" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" msgstr "" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" msgstr "" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" msgstr "" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" msgstr "" #. TRANSLATORS: Binder Almost Empty msgid "printer-state-reasons.binder-almost-empty" msgstr "" #. TRANSLATORS: Binder Almost Full msgid "printer-state-reasons.binder-almost-full" msgstr "" #. TRANSLATORS: Binder At Limit msgid "printer-state-reasons.binder-at-limit" msgstr "" #. TRANSLATORS: Binder Closed msgid "printer-state-reasons.binder-closed" msgstr "" #. TRANSLATORS: Binder Configuration Change msgid "printer-state-reasons.binder-configuration-change" msgstr "" #. TRANSLATORS: Binder Cover Closed msgid "printer-state-reasons.binder-cover-closed" msgstr "" #. TRANSLATORS: Binder Cover Open msgid "printer-state-reasons.binder-cover-open" msgstr "" #. TRANSLATORS: Binder Empty msgid "printer-state-reasons.binder-empty" msgstr "" #. TRANSLATORS: Binder Full msgid "printer-state-reasons.binder-full" msgstr "" #. TRANSLATORS: Binder Interlock Closed msgid "printer-state-reasons.binder-interlock-closed" msgstr "" #. TRANSLATORS: Binder Interlock Open msgid "printer-state-reasons.binder-interlock-open" msgstr "" #. TRANSLATORS: Binder Jam msgid "printer-state-reasons.binder-jam" msgstr "" #. TRANSLATORS: Binder Life Almost Over msgid "printer-state-reasons.binder-life-almost-over" msgstr "" #. TRANSLATORS: Binder Life Over msgid "printer-state-reasons.binder-life-over" msgstr "" #. TRANSLATORS: Binder Memory Exhausted msgid "printer-state-reasons.binder-memory-exhausted" msgstr "" #. TRANSLATORS: Binder Missing msgid "printer-state-reasons.binder-missing" msgstr "" #. TRANSLATORS: Binder Motor Failure msgid "printer-state-reasons.binder-motor-failure" msgstr "" #. TRANSLATORS: Binder Near Limit msgid "printer-state-reasons.binder-near-limit" msgstr "" #. TRANSLATORS: Binder Offline msgid "printer-state-reasons.binder-offline" msgstr "" #. TRANSLATORS: Binder Opened msgid "printer-state-reasons.binder-opened" msgstr "" #. TRANSLATORS: Binder Over Temperature msgid "printer-state-reasons.binder-over-temperature" msgstr "" #. TRANSLATORS: Binder Power Saver msgid "printer-state-reasons.binder-power-saver" msgstr "" #. TRANSLATORS: Binder Recoverable Failure msgid "printer-state-reasons.binder-recoverable-failure" msgstr "" #. TRANSLATORS: Binder Recoverable Storage msgid "printer-state-reasons.binder-recoverable-storage" msgstr "" #. TRANSLATORS: Binder Removed msgid "printer-state-reasons.binder-removed" msgstr "" #. TRANSLATORS: Binder Resource Added msgid "printer-state-reasons.binder-resource-added" msgstr "" #. TRANSLATORS: Binder Resource Removed msgid "printer-state-reasons.binder-resource-removed" msgstr "" #. TRANSLATORS: Binder Thermistor Failure msgid "printer-state-reasons.binder-thermistor-failure" msgstr "" #. TRANSLATORS: Binder Timing Failure msgid "printer-state-reasons.binder-timing-failure" msgstr "" #. TRANSLATORS: Binder Turned Off msgid "printer-state-reasons.binder-turned-off" msgstr "" #. TRANSLATORS: Binder Turned On msgid "printer-state-reasons.binder-turned-on" msgstr "" #. TRANSLATORS: Binder Under Temperature msgid "printer-state-reasons.binder-under-temperature" msgstr "" #. TRANSLATORS: Binder Unrecoverable Failure msgid "printer-state-reasons.binder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Binder Unrecoverable Storage Error msgid "printer-state-reasons.binder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Binder Warming Up msgid "printer-state-reasons.binder-warming-up" msgstr "" #. TRANSLATORS: Camera Failure msgid "printer-state-reasons.camera-failure" msgstr "" #. TRANSLATORS: Chamber Cooling msgid "printer-state-reasons.chamber-cooling" msgstr "" #. TRANSLATORS: Chamber Failure msgid "printer-state-reasons.chamber-failure" msgstr "" #. TRANSLATORS: Chamber Heating msgid "printer-state-reasons.chamber-heating" msgstr "" #. TRANSLATORS: Chamber Temperature High msgid "printer-state-reasons.chamber-temperature-high" msgstr "" #. TRANSLATORS: Chamber Temperature Low msgid "printer-state-reasons.chamber-temperature-low" msgstr "" #. TRANSLATORS: Cleaner Life Almost Over msgid "printer-state-reasons.cleaner-life-almost-over" msgstr "" #. TRANSLATORS: Cleaner Life Over msgid "printer-state-reasons.cleaner-life-over" msgstr "" #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" msgstr "" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" msgstr "" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" msgstr "" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" msgstr "" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" msgstr "" #. TRANSLATORS: Developer Low msgid "printer-state-reasons.developer-low" msgstr "" #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" msgstr "" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" msgstr "" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" msgstr "" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" msgstr "" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" msgstr "" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" msgstr "" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" msgstr "" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" msgstr "" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" msgstr "" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" msgstr "" #. TRANSLATORS: Die Cutter Interlock Closed msgid "printer-state-reasons.die-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Die Cutter Interlock Open msgid "printer-state-reasons.die-cutter-interlock-open" msgstr "" #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" msgstr "" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" msgstr "" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" msgstr "" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" msgstr "" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" msgstr "" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" msgstr "" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" msgstr "" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" msgstr "" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Recoverable Storage msgid "printer-state-reasons.die-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" msgstr "" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" msgstr "" #. TRANSLATORS: Die Cutter Resource Removed msgid "printer-state-reasons.die-cutter-resource-removed" msgstr "" #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" msgstr "" #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" msgstr "" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" msgstr "" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Failure msgid "printer-state-reasons.die-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Die Cutter Unrecoverable Storage Error msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" msgstr "" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" msgstr "" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" msgstr "" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" msgstr "" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" msgstr "" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" msgstr "" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" msgstr "" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" msgstr "" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" msgstr "" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" msgstr "" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" msgstr "" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" msgstr "" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" msgstr "" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" msgstr "" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" msgstr "" #. TRANSLATORS: Folder Almost Empty msgid "printer-state-reasons.folder-almost-empty" msgstr "" #. TRANSLATORS: Folder Almost Full msgid "printer-state-reasons.folder-almost-full" msgstr "" #. TRANSLATORS: Folder At Limit msgid "printer-state-reasons.folder-at-limit" msgstr "" #. TRANSLATORS: Folder Closed msgid "printer-state-reasons.folder-closed" msgstr "" #. TRANSLATORS: Folder Configuration Change msgid "printer-state-reasons.folder-configuration-change" msgstr "" #. TRANSLATORS: Folder Cover Closed msgid "printer-state-reasons.folder-cover-closed" msgstr "" #. TRANSLATORS: Folder Cover Open msgid "printer-state-reasons.folder-cover-open" msgstr "" #. TRANSLATORS: Folder Empty msgid "printer-state-reasons.folder-empty" msgstr "" #. TRANSLATORS: Folder Full msgid "printer-state-reasons.folder-full" msgstr "" #. TRANSLATORS: Folder Interlock Closed msgid "printer-state-reasons.folder-interlock-closed" msgstr "" #. TRANSLATORS: Folder Interlock Open msgid "printer-state-reasons.folder-interlock-open" msgstr "" #. TRANSLATORS: Folder Jam msgid "printer-state-reasons.folder-jam" msgstr "" #. TRANSLATORS: Folder Life Almost Over msgid "printer-state-reasons.folder-life-almost-over" msgstr "" #. TRANSLATORS: Folder Life Over msgid "printer-state-reasons.folder-life-over" msgstr "" #. TRANSLATORS: Folder Memory Exhausted msgid "printer-state-reasons.folder-memory-exhausted" msgstr "" #. TRANSLATORS: Folder Missing msgid "printer-state-reasons.folder-missing" msgstr "" #. TRANSLATORS: Folder Motor Failure msgid "printer-state-reasons.folder-motor-failure" msgstr "" #. TRANSLATORS: Folder Near Limit msgid "printer-state-reasons.folder-near-limit" msgstr "" #. TRANSLATORS: Folder Offline msgid "printer-state-reasons.folder-offline" msgstr "" #. TRANSLATORS: Folder Opened msgid "printer-state-reasons.folder-opened" msgstr "" #. TRANSLATORS: Folder Over Temperature msgid "printer-state-reasons.folder-over-temperature" msgstr "" #. TRANSLATORS: Folder Power Saver msgid "printer-state-reasons.folder-power-saver" msgstr "" #. TRANSLATORS: Folder Recoverable Failure msgid "printer-state-reasons.folder-recoverable-failure" msgstr "" #. TRANSLATORS: Folder Recoverable Storage msgid "printer-state-reasons.folder-recoverable-storage" msgstr "" #. TRANSLATORS: Folder Removed msgid "printer-state-reasons.folder-removed" msgstr "" #. TRANSLATORS: Folder Resource Added msgid "printer-state-reasons.folder-resource-added" msgstr "" #. TRANSLATORS: Folder Resource Removed msgid "printer-state-reasons.folder-resource-removed" msgstr "" #. TRANSLATORS: Folder Thermistor Failure msgid "printer-state-reasons.folder-thermistor-failure" msgstr "" #. TRANSLATORS: Folder Timing Failure msgid "printer-state-reasons.folder-timing-failure" msgstr "" #. TRANSLATORS: Folder Turned Off msgid "printer-state-reasons.folder-turned-off" msgstr "" #. TRANSLATORS: Folder Turned On msgid "printer-state-reasons.folder-turned-on" msgstr "" #. TRANSLATORS: Folder Under Temperature msgid "printer-state-reasons.folder-under-temperature" msgstr "" #. TRANSLATORS: Folder Unrecoverable Failure msgid "printer-state-reasons.folder-unrecoverable-failure" msgstr "" #. TRANSLATORS: Folder Unrecoverable Storage Error msgid "printer-state-reasons.folder-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Folder Warming Up msgid "printer-state-reasons.folder-warming-up" msgstr "" #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" msgstr "" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" msgstr "" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" msgstr "" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" msgstr "" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" msgstr "" #. TRANSLATORS: Imprinter Almost Empty msgid "printer-state-reasons.imprinter-almost-empty" msgstr "" #. TRANSLATORS: Imprinter Almost Full msgid "printer-state-reasons.imprinter-almost-full" msgstr "" #. TRANSLATORS: Imprinter At Limit msgid "printer-state-reasons.imprinter-at-limit" msgstr "" #. TRANSLATORS: Imprinter Closed msgid "printer-state-reasons.imprinter-closed" msgstr "" #. TRANSLATORS: Imprinter Configuration Change msgid "printer-state-reasons.imprinter-configuration-change" msgstr "" #. TRANSLATORS: Imprinter Cover Closed msgid "printer-state-reasons.imprinter-cover-closed" msgstr "" #. TRANSLATORS: Imprinter Cover Open msgid "printer-state-reasons.imprinter-cover-open" msgstr "" #. TRANSLATORS: Imprinter Empty msgid "printer-state-reasons.imprinter-empty" msgstr "" #. TRANSLATORS: Imprinter Full msgid "printer-state-reasons.imprinter-full" msgstr "" #. TRANSLATORS: Imprinter Interlock Closed msgid "printer-state-reasons.imprinter-interlock-closed" msgstr "" #. TRANSLATORS: Imprinter Interlock Open msgid "printer-state-reasons.imprinter-interlock-open" msgstr "" #. TRANSLATORS: Imprinter Jam msgid "printer-state-reasons.imprinter-jam" msgstr "" #. TRANSLATORS: Imprinter Life Almost Over msgid "printer-state-reasons.imprinter-life-almost-over" msgstr "" #. TRANSLATORS: Imprinter Life Over msgid "printer-state-reasons.imprinter-life-over" msgstr "" #. TRANSLATORS: Imprinter Memory Exhausted msgid "printer-state-reasons.imprinter-memory-exhausted" msgstr "" #. TRANSLATORS: Imprinter Missing msgid "printer-state-reasons.imprinter-missing" msgstr "" #. TRANSLATORS: Imprinter Motor Failure msgid "printer-state-reasons.imprinter-motor-failure" msgstr "" #. TRANSLATORS: Imprinter Near Limit msgid "printer-state-reasons.imprinter-near-limit" msgstr "" #. TRANSLATORS: Imprinter Offline msgid "printer-state-reasons.imprinter-offline" msgstr "" #. TRANSLATORS: Imprinter Opened msgid "printer-state-reasons.imprinter-opened" msgstr "" #. TRANSLATORS: Imprinter Over Temperature msgid "printer-state-reasons.imprinter-over-temperature" msgstr "" #. TRANSLATORS: Imprinter Power Saver msgid "printer-state-reasons.imprinter-power-saver" msgstr "" #. TRANSLATORS: Imprinter Recoverable Failure msgid "printer-state-reasons.imprinter-recoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Recoverable Storage msgid "printer-state-reasons.imprinter-recoverable-storage" msgstr "" #. TRANSLATORS: Imprinter Removed msgid "printer-state-reasons.imprinter-removed" msgstr "" #. TRANSLATORS: Imprinter Resource Added msgid "printer-state-reasons.imprinter-resource-added" msgstr "" #. TRANSLATORS: Imprinter Resource Removed msgid "printer-state-reasons.imprinter-resource-removed" msgstr "" #. TRANSLATORS: Imprinter Thermistor Failure msgid "printer-state-reasons.imprinter-thermistor-failure" msgstr "" #. TRANSLATORS: Imprinter Timing Failure msgid "printer-state-reasons.imprinter-timing-failure" msgstr "" #. TRANSLATORS: Imprinter Turned Off msgid "printer-state-reasons.imprinter-turned-off" msgstr "" #. TRANSLATORS: Imprinter Turned On msgid "printer-state-reasons.imprinter-turned-on" msgstr "" #. TRANSLATORS: Imprinter Under Temperature msgid "printer-state-reasons.imprinter-under-temperature" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Failure msgid "printer-state-reasons.imprinter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Imprinter Unrecoverable Storage Error msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Imprinter Warming Up msgid "printer-state-reasons.imprinter-warming-up" msgstr "" #. TRANSLATORS: Input Cannot Feed Size Selected msgid "printer-state-reasons.input-cannot-feed-size-selected" msgstr "" #. TRANSLATORS: Input Manual Input Request msgid "printer-state-reasons.input-manual-input-request" msgstr "" #. TRANSLATORS: Input Media Color Change msgid "printer-state-reasons.input-media-color-change" msgstr "" #. TRANSLATORS: Input Media Form Parts Change msgid "printer-state-reasons.input-media-form-parts-change" msgstr "" #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" msgstr "" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" msgstr "" #. TRANSLATORS: Input Media Tray Feed Error msgid "printer-state-reasons.input-media-tray-feed-error" msgstr "" #. TRANSLATORS: Input Media Tray Jam msgid "printer-state-reasons.input-media-tray-jam" msgstr "" #. TRANSLATORS: Input Media Type Change msgid "printer-state-reasons.input-media-type-change" msgstr "" #. TRANSLATORS: Input Media Weight Change msgid "printer-state-reasons.input-media-weight-change" msgstr "" #. TRANSLATORS: Input Pick Roller Failure msgid "printer-state-reasons.input-pick-roller-failure" msgstr "" #. TRANSLATORS: Input Pick Roller Life Over msgid "printer-state-reasons.input-pick-roller-life-over" msgstr "" #. TRANSLATORS: Input Pick Roller Life Warn msgid "printer-state-reasons.input-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Input Pick Roller Missing msgid "printer-state-reasons.input-pick-roller-missing" msgstr "" #. TRANSLATORS: Input Tray Elevation Failure msgid "printer-state-reasons.input-tray-elevation-failure" msgstr "" #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" msgstr "" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" msgstr "" #. TRANSLATORS: Inserter Added msgid "printer-state-reasons.inserter-added" msgstr "" #. TRANSLATORS: Inserter Almost Empty msgid "printer-state-reasons.inserter-almost-empty" msgstr "" #. TRANSLATORS: Inserter Almost Full msgid "printer-state-reasons.inserter-almost-full" msgstr "" #. TRANSLATORS: Inserter At Limit msgid "printer-state-reasons.inserter-at-limit" msgstr "" #. TRANSLATORS: Inserter Closed msgid "printer-state-reasons.inserter-closed" msgstr "" #. TRANSLATORS: Inserter Configuration Change msgid "printer-state-reasons.inserter-configuration-change" msgstr "" #. TRANSLATORS: Inserter Cover Closed msgid "printer-state-reasons.inserter-cover-closed" msgstr "" #. TRANSLATORS: Inserter Cover Open msgid "printer-state-reasons.inserter-cover-open" msgstr "" #. TRANSLATORS: Inserter Empty msgid "printer-state-reasons.inserter-empty" msgstr "" #. TRANSLATORS: Inserter Full msgid "printer-state-reasons.inserter-full" msgstr "" #. TRANSLATORS: Inserter Interlock Closed msgid "printer-state-reasons.inserter-interlock-closed" msgstr "" #. TRANSLATORS: Inserter Interlock Open msgid "printer-state-reasons.inserter-interlock-open" msgstr "" #. TRANSLATORS: Inserter Jam msgid "printer-state-reasons.inserter-jam" msgstr "" #. TRANSLATORS: Inserter Life Almost Over msgid "printer-state-reasons.inserter-life-almost-over" msgstr "" #. TRANSLATORS: Inserter Life Over msgid "printer-state-reasons.inserter-life-over" msgstr "" #. TRANSLATORS: Inserter Memory Exhausted msgid "printer-state-reasons.inserter-memory-exhausted" msgstr "" #. TRANSLATORS: Inserter Missing msgid "printer-state-reasons.inserter-missing" msgstr "" #. TRANSLATORS: Inserter Motor Failure msgid "printer-state-reasons.inserter-motor-failure" msgstr "" #. TRANSLATORS: Inserter Near Limit msgid "printer-state-reasons.inserter-near-limit" msgstr "" #. TRANSLATORS: Inserter Offline msgid "printer-state-reasons.inserter-offline" msgstr "" #. TRANSLATORS: Inserter Opened msgid "printer-state-reasons.inserter-opened" msgstr "" #. TRANSLATORS: Inserter Over Temperature msgid "printer-state-reasons.inserter-over-temperature" msgstr "" #. TRANSLATORS: Inserter Power Saver msgid "printer-state-reasons.inserter-power-saver" msgstr "" #. TRANSLATORS: Inserter Recoverable Failure msgid "printer-state-reasons.inserter-recoverable-failure" msgstr "" #. TRANSLATORS: Inserter Recoverable Storage msgid "printer-state-reasons.inserter-recoverable-storage" msgstr "" #. TRANSLATORS: Inserter Removed msgid "printer-state-reasons.inserter-removed" msgstr "" #. TRANSLATORS: Inserter Resource Added msgid "printer-state-reasons.inserter-resource-added" msgstr "" #. TRANSLATORS: Inserter Resource Removed msgid "printer-state-reasons.inserter-resource-removed" msgstr "" #. TRANSLATORS: Inserter Thermistor Failure msgid "printer-state-reasons.inserter-thermistor-failure" msgstr "" #. TRANSLATORS: Inserter Timing Failure msgid "printer-state-reasons.inserter-timing-failure" msgstr "" #. TRANSLATORS: Inserter Turned Off msgid "printer-state-reasons.inserter-turned-off" msgstr "" #. TRANSLATORS: Inserter Turned On msgid "printer-state-reasons.inserter-turned-on" msgstr "" #. TRANSLATORS: Inserter Under Temperature msgid "printer-state-reasons.inserter-under-temperature" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Failure msgid "printer-state-reasons.inserter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Inserter Unrecoverable Storage Error msgid "printer-state-reasons.inserter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Inserter Warming Up msgid "printer-state-reasons.inserter-warming-up" msgstr "" #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" msgstr "" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" msgstr "" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" msgstr "" #. TRANSLATORS: Interpreter Cartridge Removed msgid "printer-state-reasons.interpreter-cartridge-deleted" msgstr "" #. TRANSLATORS: Interpreter Complex Page Encountered msgid "printer-state-reasons.interpreter-complex-page-encountered" msgstr "" #. TRANSLATORS: Interpreter Memory Decrease msgid "printer-state-reasons.interpreter-memory-decrease" msgstr "" #. TRANSLATORS: Interpreter Memory Increase msgid "printer-state-reasons.interpreter-memory-increase" msgstr "" #. TRANSLATORS: Interpreter Resource Added msgid "printer-state-reasons.interpreter-resource-added" msgstr "" #. TRANSLATORS: Interpreter Resource Deleted msgid "printer-state-reasons.interpreter-resource-deleted" msgstr "" #. TRANSLATORS: Printer resource unavailable msgid "printer-state-reasons.interpreter-resource-unavailable" msgstr "" #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" msgstr "" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" msgstr "" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" msgstr "" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" msgstr "" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" msgstr "" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" msgstr "" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" msgstr "" #. TRANSLATORS: Envelope Maker Almost Empty msgid "printer-state-reasons.make-envelope-almost-empty" msgstr "" #. TRANSLATORS: Envelope Maker Almost Full msgid "printer-state-reasons.make-envelope-almost-full" msgstr "" #. TRANSLATORS: Envelope Maker At Limit msgid "printer-state-reasons.make-envelope-at-limit" msgstr "" #. TRANSLATORS: Envelope Maker Closed msgid "printer-state-reasons.make-envelope-closed" msgstr "" #. TRANSLATORS: Envelope Maker Configuration Change msgid "printer-state-reasons.make-envelope-configuration-change" msgstr "" #. TRANSLATORS: Envelope Maker Cover Closed msgid "printer-state-reasons.make-envelope-cover-closed" msgstr "" #. TRANSLATORS: Envelope Maker Cover Open msgid "printer-state-reasons.make-envelope-cover-open" msgstr "" #. TRANSLATORS: Envelope Maker Empty msgid "printer-state-reasons.make-envelope-empty" msgstr "" #. TRANSLATORS: Envelope Maker Full msgid "printer-state-reasons.make-envelope-full" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Closed msgid "printer-state-reasons.make-envelope-interlock-closed" msgstr "" #. TRANSLATORS: Envelope Maker Interlock Open msgid "printer-state-reasons.make-envelope-interlock-open" msgstr "" #. TRANSLATORS: Envelope Maker Jam msgid "printer-state-reasons.make-envelope-jam" msgstr "" #. TRANSLATORS: Envelope Maker Life Almost Over msgid "printer-state-reasons.make-envelope-life-almost-over" msgstr "" #. TRANSLATORS: Envelope Maker Life Over msgid "printer-state-reasons.make-envelope-life-over" msgstr "" #. TRANSLATORS: Envelope Maker Memory Exhausted msgid "printer-state-reasons.make-envelope-memory-exhausted" msgstr "" #. TRANSLATORS: Envelope Maker Missing msgid "printer-state-reasons.make-envelope-missing" msgstr "" #. TRANSLATORS: Envelope Maker Motor Failure msgid "printer-state-reasons.make-envelope-motor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Near Limit msgid "printer-state-reasons.make-envelope-near-limit" msgstr "" #. TRANSLATORS: Envelope Maker Offline msgid "printer-state-reasons.make-envelope-offline" msgstr "" #. TRANSLATORS: Envelope Maker Opened msgid "printer-state-reasons.make-envelope-opened" msgstr "" #. TRANSLATORS: Envelope Maker Over Temperature msgid "printer-state-reasons.make-envelope-over-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Power Saver msgid "printer-state-reasons.make-envelope-power-saver" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Failure msgid "printer-state-reasons.make-envelope-recoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Recoverable Storage msgid "printer-state-reasons.make-envelope-recoverable-storage" msgstr "" #. TRANSLATORS: Envelope Maker Removed msgid "printer-state-reasons.make-envelope-removed" msgstr "" #. TRANSLATORS: Envelope Maker Resource Added msgid "printer-state-reasons.make-envelope-resource-added" msgstr "" #. TRANSLATORS: Envelope Maker Resource Removed msgid "printer-state-reasons.make-envelope-resource-removed" msgstr "" #. TRANSLATORS: Envelope Maker Thermistor Failure msgid "printer-state-reasons.make-envelope-thermistor-failure" msgstr "" #. TRANSLATORS: Envelope Maker Timing Failure msgid "printer-state-reasons.make-envelope-timing-failure" msgstr "" #. TRANSLATORS: Envelope Maker Turned Off msgid "printer-state-reasons.make-envelope-turned-off" msgstr "" #. TRANSLATORS: Envelope Maker Turned On msgid "printer-state-reasons.make-envelope-turned-on" msgstr "" #. TRANSLATORS: Envelope Maker Under Temperature msgid "printer-state-reasons.make-envelope-under-temperature" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Failure msgid "printer-state-reasons.make-envelope-unrecoverable-failure" msgstr "" #. TRANSLATORS: Envelope Maker Unrecoverable Storage Error msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Envelope Maker Warming Up msgid "printer-state-reasons.make-envelope-warming-up" msgstr "" #. TRANSLATORS: Marker Adjusting Print Quality msgid "printer-state-reasons.marker-adjusting-print-quality" msgstr "" #. TRANSLATORS: Marker Cleaner Missing msgid "printer-state-reasons.marker-cleaner-missing" msgstr "" #. TRANSLATORS: Marker Developer Almost Empty msgid "printer-state-reasons.marker-developer-almost-empty" msgstr "" #. TRANSLATORS: Marker Developer Empty msgid "printer-state-reasons.marker-developer-empty" msgstr "" #. TRANSLATORS: Marker Developer Missing msgid "printer-state-reasons.marker-developer-missing" msgstr "" #. TRANSLATORS: Marker Fuser Missing msgid "printer-state-reasons.marker-fuser-missing" msgstr "" #. TRANSLATORS: Marker Fuser Thermistor Failure msgid "printer-state-reasons.marker-fuser-thermistor-failure" msgstr "" #. TRANSLATORS: Marker Fuser Timing Failure msgid "printer-state-reasons.marker-fuser-timing-failure" msgstr "" #. TRANSLATORS: Marker Ink Almost Empty msgid "printer-state-reasons.marker-ink-almost-empty" msgstr "" #. TRANSLATORS: Marker Ink Empty msgid "printer-state-reasons.marker-ink-empty" msgstr "" #. TRANSLATORS: Marker Ink Missing msgid "printer-state-reasons.marker-ink-missing" msgstr "" #. TRANSLATORS: Marker Opc Missing msgid "printer-state-reasons.marker-opc-missing" msgstr "" #. TRANSLATORS: Marker Print Ribbon Almost Empty msgid "printer-state-reasons.marker-print-ribbon-almost-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Empty msgid "printer-state-reasons.marker-print-ribbon-empty" msgstr "" #. TRANSLATORS: Marker Print Ribbon Missing msgid "printer-state-reasons.marker-print-ribbon-missing" msgstr "" #. TRANSLATORS: Marker Supply Almost Empty msgid "printer-state-reasons.marker-supply-almost-empty" msgstr "" #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" msgstr "" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" msgstr "" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" msgstr "" #. TRANSLATORS: Marker Toner Cartridge Missing msgid "printer-state-reasons.marker-toner-cartridge-missing" msgstr "" #. TRANSLATORS: Marker Toner Missing msgid "printer-state-reasons.marker-toner-missing" msgstr "" #. TRANSLATORS: Ink/toner waste bin almost full msgid "printer-state-reasons.marker-waste-almost-full" msgstr "" #. TRANSLATORS: Ink/toner waste bin full msgid "printer-state-reasons.marker-waste-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Almost Full msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Full msgid "printer-state-reasons.marker-waste-ink-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Ink Receptacle Missing msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" msgstr "" #. TRANSLATORS: Marker Waste Missing msgid "printer-state-reasons.marker-waste-missing" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Almost Full msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Full msgid "printer-state-reasons.marker-waste-toner-receptacle-full" msgstr "" #. TRANSLATORS: Marker Waste Toner Receptacle Missing msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" msgstr "" #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" msgstr "" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" msgstr "" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" msgstr "" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" msgstr "" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" msgstr "" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" msgstr "" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" msgstr "" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" msgstr "" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" msgstr "" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" msgstr "" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" msgstr "" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" msgstr "" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" msgstr "" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" msgstr "" #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" msgstr "" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Full msgid "printer-state-reasons.media-path-media-tray-full" msgstr "" #. TRANSLATORS: Media Path Media Tray Missing msgid "printer-state-reasons.media-path-media-tray-missing" msgstr "" #. TRANSLATORS: Media Path Output Feed Error msgid "printer-state-reasons.media-path-output-feed-error" msgstr "" #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" msgstr "" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" msgstr "" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Over msgid "printer-state-reasons.media-path-pick-roller-life-over" msgstr "" #. TRANSLATORS: Media Path Pick Roller Life Warn msgid "printer-state-reasons.media-path-pick-roller-life-warn" msgstr "" #. TRANSLATORS: Media Path Pick Roller Missing msgid "printer-state-reasons.media-path-pick-roller-missing" msgstr "" #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" msgstr "" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" msgstr "" #. TRANSLATORS: None msgid "printer-state-reasons.none" msgstr "" #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" msgstr "" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" msgstr "" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" msgstr "" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" msgstr "" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" msgstr "" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" msgstr "" #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" msgstr "" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" msgstr "" #. TRANSLATORS: Output Media Tray Jam msgid "printer-state-reasons.output-media-tray-jam" msgstr "" #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" msgstr "" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" msgstr "" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" msgstr "" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" msgstr "" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" msgstr "" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" msgstr "" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" msgstr "" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" msgstr "" #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" msgstr "" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" msgstr "" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" msgstr "" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" msgstr "" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" msgstr "" #. TRANSLATORS: Perforater Interlock Open msgid "printer-state-reasons.perforater-interlock-open" msgstr "" #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" msgstr "" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" msgstr "" #. TRANSLATORS: Perforater Life Over msgid "printer-state-reasons.perforater-life-over" msgstr "" #. TRANSLATORS: Perforater Memory Exhausted msgid "printer-state-reasons.perforater-memory-exhausted" msgstr "" #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" msgstr "" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" msgstr "" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" msgstr "" #. TRANSLATORS: Perforater Offline msgid "printer-state-reasons.perforater-offline" msgstr "" #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" msgstr "" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" msgstr "" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" msgstr "" #. TRANSLATORS: Perforater Recoverable Failure msgid "printer-state-reasons.perforater-recoverable-failure" msgstr "" #. TRANSLATORS: Perforater Recoverable Storage msgid "printer-state-reasons.perforater-recoverable-storage" msgstr "" #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" msgstr "" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" msgstr "" #. TRANSLATORS: Perforater Resource Removed msgid "printer-state-reasons.perforater-resource-removed" msgstr "" #. TRANSLATORS: Perforater Thermistor Failure msgid "printer-state-reasons.perforater-thermistor-failure" msgstr "" #. TRANSLATORS: Perforater Timing Failure msgid "printer-state-reasons.perforater-timing-failure" msgstr "" #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" msgstr "" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" msgstr "" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" msgstr "" #. TRANSLATORS: Perforater Unrecoverable Storage Error msgid "printer-state-reasons.perforater-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" msgstr "" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" msgstr "" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" msgstr "" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" msgstr "" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" msgstr "" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" msgstr "" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" msgstr "" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" msgstr "" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" msgstr "" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" msgstr "" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" msgstr "" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" msgstr "" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" msgstr "" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" msgstr "" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" msgstr "" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" msgstr "" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" msgstr "" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" msgstr "" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" msgstr "" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" msgstr "" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" msgstr "" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" msgstr "" #. TRANSLATORS: Puncher Interlock Open msgid "printer-state-reasons.puncher-interlock-open" msgstr "" #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" msgstr "" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" msgstr "" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" msgstr "" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" msgstr "" #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" msgstr "" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" msgstr "" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" msgstr "" #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" msgstr "" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" msgstr "" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" msgstr "" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" msgstr "" #. TRANSLATORS: Puncher Recoverable Failure msgid "printer-state-reasons.puncher-recoverable-failure" msgstr "" #. TRANSLATORS: Puncher Recoverable Storage msgid "printer-state-reasons.puncher-recoverable-storage" msgstr "" #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" msgstr "" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" msgstr "" #. TRANSLATORS: Puncher Resource Removed msgid "printer-state-reasons.puncher-resource-removed" msgstr "" #. TRANSLATORS: Puncher Thermistor Failure msgid "printer-state-reasons.puncher-thermistor-failure" msgstr "" #. TRANSLATORS: Puncher Timing Failure msgid "printer-state-reasons.puncher-timing-failure" msgstr "" #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" msgstr "" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" msgstr "" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Puncher Unrecoverable Storage Error msgid "printer-state-reasons.puncher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" msgstr "" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" msgstr "" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" msgstr "" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" msgstr "" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" msgstr "" #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" msgstr "" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" msgstr "" #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" msgstr "" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" msgstr "" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" msgstr "" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" msgstr "" #. TRANSLATORS: Separation Cutter Interlock Open msgid "printer-state-reasons.separation-cutter-interlock-open" msgstr "" #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" msgstr "" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" msgstr "" #. TRANSLATORS: Separation Cutter Life Over msgid "printer-state-reasons.separation-cutter-life-over" msgstr "" #. TRANSLATORS: Separation Cutter Memory Exhausted msgid "printer-state-reasons.separation-cutter-memory-exhausted" msgstr "" #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" msgstr "" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" msgstr "" #. TRANSLATORS: Separation Cutter Offline msgid "printer-state-reasons.separation-cutter-offline" msgstr "" #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" msgstr "" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Failure msgid "printer-state-reasons.separation-cutter-recoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Recoverable Storage msgid "printer-state-reasons.separation-cutter-recoverable-storage" msgstr "" #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" msgstr "" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" msgstr "" #. TRANSLATORS: Separation Cutter Resource Removed msgid "printer-state-reasons.separation-cutter-resource-removed" msgstr "" #. TRANSLATORS: Separation Cutter Thermistor Failure msgid "printer-state-reasons.separation-cutter-thermistor-failure" msgstr "" #. TRANSLATORS: Separation Cutter Timing Failure msgid "printer-state-reasons.separation-cutter-timing-failure" msgstr "" #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" msgstr "" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" msgstr "" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Separation Cutter Unrecoverable Storage Error msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" msgstr "" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Empty msgid "printer-state-reasons.sheet-rotator-almost-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Almost Full msgid "printer-state-reasons.sheet-rotator-almost-full" msgstr "" #. TRANSLATORS: Sheet Rotator At Limit msgid "printer-state-reasons.sheet-rotator-at-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Closed msgid "printer-state-reasons.sheet-rotator-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Configuration Change msgid "printer-state-reasons.sheet-rotator-configuration-change" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Closed msgid "printer-state-reasons.sheet-rotator-cover-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Cover Open msgid "printer-state-reasons.sheet-rotator-cover-open" msgstr "" #. TRANSLATORS: Sheet Rotator Empty msgid "printer-state-reasons.sheet-rotator-empty" msgstr "" #. TRANSLATORS: Sheet Rotator Full msgid "printer-state-reasons.sheet-rotator-full" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Closed msgid "printer-state-reasons.sheet-rotator-interlock-closed" msgstr "" #. TRANSLATORS: Sheet Rotator Interlock Open msgid "printer-state-reasons.sheet-rotator-interlock-open" msgstr "" #. TRANSLATORS: Sheet Rotator Jam msgid "printer-state-reasons.sheet-rotator-jam" msgstr "" #. TRANSLATORS: Sheet Rotator Life Almost Over msgid "printer-state-reasons.sheet-rotator-life-almost-over" msgstr "" #. TRANSLATORS: Sheet Rotator Life Over msgid "printer-state-reasons.sheet-rotator-life-over" msgstr "" #. TRANSLATORS: Sheet Rotator Memory Exhausted msgid "printer-state-reasons.sheet-rotator-memory-exhausted" msgstr "" #. TRANSLATORS: Sheet Rotator Missing msgid "printer-state-reasons.sheet-rotator-missing" msgstr "" #. TRANSLATORS: Sheet Rotator Motor Failure msgid "printer-state-reasons.sheet-rotator-motor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Near Limit msgid "printer-state-reasons.sheet-rotator-near-limit" msgstr "" #. TRANSLATORS: Sheet Rotator Offline msgid "printer-state-reasons.sheet-rotator-offline" msgstr "" #. TRANSLATORS: Sheet Rotator Opened msgid "printer-state-reasons.sheet-rotator-opened" msgstr "" #. TRANSLATORS: Sheet Rotator Over Temperature msgid "printer-state-reasons.sheet-rotator-over-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Power Saver msgid "printer-state-reasons.sheet-rotator-power-saver" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Failure msgid "printer-state-reasons.sheet-rotator-recoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Recoverable Storage msgid "printer-state-reasons.sheet-rotator-recoverable-storage" msgstr "" #. TRANSLATORS: Sheet Rotator Removed msgid "printer-state-reasons.sheet-rotator-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Added msgid "printer-state-reasons.sheet-rotator-resource-added" msgstr "" #. TRANSLATORS: Sheet Rotator Resource Removed msgid "printer-state-reasons.sheet-rotator-resource-removed" msgstr "" #. TRANSLATORS: Sheet Rotator Thermistor Failure msgid "printer-state-reasons.sheet-rotator-thermistor-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Timing Failure msgid "printer-state-reasons.sheet-rotator-timing-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Turned Off msgid "printer-state-reasons.sheet-rotator-turned-off" msgstr "" #. TRANSLATORS: Sheet Rotator Turned On msgid "printer-state-reasons.sheet-rotator-turned-on" msgstr "" #. TRANSLATORS: Sheet Rotator Under Temperature msgid "printer-state-reasons.sheet-rotator-under-temperature" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Failure msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" msgstr "" #. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Sheet Rotator Warming Up msgid "printer-state-reasons.sheet-rotator-warming-up" msgstr "" #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" msgstr "" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" msgstr "" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" msgstr "" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" msgstr "" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" msgstr "" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" msgstr "" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" msgstr "" #. TRANSLATORS: Slitter Cover Closed msgid "printer-state-reasons.slitter-cover-closed" msgstr "" #. TRANSLATORS: Slitter Cover Open msgid "printer-state-reasons.slitter-cover-open" msgstr "" #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" msgstr "" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" msgstr "" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" msgstr "" #. TRANSLATORS: Slitter Interlock Open msgid "printer-state-reasons.slitter-interlock-open" msgstr "" #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" msgstr "" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" msgstr "" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" msgstr "" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" msgstr "" #. TRANSLATORS: Slitter Missing msgid "printer-state-reasons.slitter-missing" msgstr "" #. TRANSLATORS: Slitter Motor Failure msgid "printer-state-reasons.slitter-motor-failure" msgstr "" #. TRANSLATORS: Slitter Near Limit msgid "printer-state-reasons.slitter-near-limit" msgstr "" #. TRANSLATORS: Slitter Offline msgid "printer-state-reasons.slitter-offline" msgstr "" #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" msgstr "" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" msgstr "" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" msgstr "" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" msgstr "" #. TRANSLATORS: Slitter Recoverable Storage msgid "printer-state-reasons.slitter-recoverable-storage" msgstr "" #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" msgstr "" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" msgstr "" #. TRANSLATORS: Slitter Resource Removed msgid "printer-state-reasons.slitter-resource-removed" msgstr "" #. TRANSLATORS: Slitter Thermistor Failure msgid "printer-state-reasons.slitter-thermistor-failure" msgstr "" #. TRANSLATORS: Slitter Timing Failure msgid "printer-state-reasons.slitter-timing-failure" msgstr "" #. TRANSLATORS: Slitter Turned Off msgid "printer-state-reasons.slitter-turned-off" msgstr "" #. TRANSLATORS: Slitter Turned On msgid "printer-state-reasons.slitter-turned-on" msgstr "" #. TRANSLATORS: Slitter Under Temperature msgid "printer-state-reasons.slitter-under-temperature" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Failure msgid "printer-state-reasons.slitter-unrecoverable-failure" msgstr "" #. TRANSLATORS: Slitter Unrecoverable Storage Error msgid "printer-state-reasons.slitter-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Slitter Warming Up msgid "printer-state-reasons.slitter-warming-up" msgstr "" #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" msgstr "" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" msgstr "" #. TRANSLATORS: Stacker Almost Empty msgid "printer-state-reasons.stacker-almost-empty" msgstr "" #. TRANSLATORS: Stacker Almost Full msgid "printer-state-reasons.stacker-almost-full" msgstr "" #. TRANSLATORS: Stacker At Limit msgid "printer-state-reasons.stacker-at-limit" msgstr "" #. TRANSLATORS: Stacker Closed msgid "printer-state-reasons.stacker-closed" msgstr "" #. TRANSLATORS: Stacker Configuration Change msgid "printer-state-reasons.stacker-configuration-change" msgstr "" #. TRANSLATORS: Stacker Cover Closed msgid "printer-state-reasons.stacker-cover-closed" msgstr "" #. TRANSLATORS: Stacker Cover Open msgid "printer-state-reasons.stacker-cover-open" msgstr "" #. TRANSLATORS: Stacker Empty msgid "printer-state-reasons.stacker-empty" msgstr "" #. TRANSLATORS: Stacker Full msgid "printer-state-reasons.stacker-full" msgstr "" #. TRANSLATORS: Stacker Interlock Closed msgid "printer-state-reasons.stacker-interlock-closed" msgstr "" #. TRANSLATORS: Stacker Interlock Open msgid "printer-state-reasons.stacker-interlock-open" msgstr "" #. TRANSLATORS: Stacker Jam msgid "printer-state-reasons.stacker-jam" msgstr "" #. TRANSLATORS: Stacker Life Almost Over msgid "printer-state-reasons.stacker-life-almost-over" msgstr "" #. TRANSLATORS: Stacker Life Over msgid "printer-state-reasons.stacker-life-over" msgstr "" #. TRANSLATORS: Stacker Memory Exhausted msgid "printer-state-reasons.stacker-memory-exhausted" msgstr "" #. TRANSLATORS: Stacker Missing msgid "printer-state-reasons.stacker-missing" msgstr "" #. TRANSLATORS: Stacker Motor Failure msgid "printer-state-reasons.stacker-motor-failure" msgstr "" #. TRANSLATORS: Stacker Near Limit msgid "printer-state-reasons.stacker-near-limit" msgstr "" #. TRANSLATORS: Stacker Offline msgid "printer-state-reasons.stacker-offline" msgstr "" #. TRANSLATORS: Stacker Opened msgid "printer-state-reasons.stacker-opened" msgstr "" #. TRANSLATORS: Stacker Over Temperature msgid "printer-state-reasons.stacker-over-temperature" msgstr "" #. TRANSLATORS: Stacker Power Saver msgid "printer-state-reasons.stacker-power-saver" msgstr "" #. TRANSLATORS: Stacker Recoverable Failure msgid "printer-state-reasons.stacker-recoverable-failure" msgstr "" #. TRANSLATORS: Stacker Recoverable Storage msgid "printer-state-reasons.stacker-recoverable-storage" msgstr "" #. TRANSLATORS: Stacker Removed msgid "printer-state-reasons.stacker-removed" msgstr "" #. TRANSLATORS: Stacker Resource Added msgid "printer-state-reasons.stacker-resource-added" msgstr "" #. TRANSLATORS: Stacker Resource Removed msgid "printer-state-reasons.stacker-resource-removed" msgstr "" #. TRANSLATORS: Stacker Thermistor Failure msgid "printer-state-reasons.stacker-thermistor-failure" msgstr "" #. TRANSLATORS: Stacker Timing Failure msgid "printer-state-reasons.stacker-timing-failure" msgstr "" #. TRANSLATORS: Stacker Turned Off msgid "printer-state-reasons.stacker-turned-off" msgstr "" #. TRANSLATORS: Stacker Turned On msgid "printer-state-reasons.stacker-turned-on" msgstr "" #. TRANSLATORS: Stacker Under Temperature msgid "printer-state-reasons.stacker-under-temperature" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Failure msgid "printer-state-reasons.stacker-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stacker Unrecoverable Storage Error msgid "printer-state-reasons.stacker-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stacker Warming Up msgid "printer-state-reasons.stacker-warming-up" msgstr "" #. TRANSLATORS: Stapler Added msgid "printer-state-reasons.stapler-added" msgstr "" #. TRANSLATORS: Stapler Almost Empty msgid "printer-state-reasons.stapler-almost-empty" msgstr "" #. TRANSLATORS: Stapler Almost Full msgid "printer-state-reasons.stapler-almost-full" msgstr "" #. TRANSLATORS: Stapler At Limit msgid "printer-state-reasons.stapler-at-limit" msgstr "" #. TRANSLATORS: Stapler Closed msgid "printer-state-reasons.stapler-closed" msgstr "" #. TRANSLATORS: Stapler Configuration Change msgid "printer-state-reasons.stapler-configuration-change" msgstr "" #. TRANSLATORS: Stapler Cover Closed msgid "printer-state-reasons.stapler-cover-closed" msgstr "" #. TRANSLATORS: Stapler Cover Open msgid "printer-state-reasons.stapler-cover-open" msgstr "" #. TRANSLATORS: Stapler Empty msgid "printer-state-reasons.stapler-empty" msgstr "" #. TRANSLATORS: Stapler Full msgid "printer-state-reasons.stapler-full" msgstr "" #. TRANSLATORS: Stapler Interlock Closed msgid "printer-state-reasons.stapler-interlock-closed" msgstr "" #. TRANSLATORS: Stapler Interlock Open msgid "printer-state-reasons.stapler-interlock-open" msgstr "" #. TRANSLATORS: Stapler Jam msgid "printer-state-reasons.stapler-jam" msgstr "" #. TRANSLATORS: Stapler Life Almost Over msgid "printer-state-reasons.stapler-life-almost-over" msgstr "" #. TRANSLATORS: Stapler Life Over msgid "printer-state-reasons.stapler-life-over" msgstr "" #. TRANSLATORS: Stapler Memory Exhausted msgid "printer-state-reasons.stapler-memory-exhausted" msgstr "" #. TRANSLATORS: Stapler Missing msgid "printer-state-reasons.stapler-missing" msgstr "" #. TRANSLATORS: Stapler Motor Failure msgid "printer-state-reasons.stapler-motor-failure" msgstr "" #. TRANSLATORS: Stapler Near Limit msgid "printer-state-reasons.stapler-near-limit" msgstr "" #. TRANSLATORS: Stapler Offline msgid "printer-state-reasons.stapler-offline" msgstr "" #. TRANSLATORS: Stapler Opened msgid "printer-state-reasons.stapler-opened" msgstr "" #. TRANSLATORS: Stapler Over Temperature msgid "printer-state-reasons.stapler-over-temperature" msgstr "" #. TRANSLATORS: Stapler Power Saver msgid "printer-state-reasons.stapler-power-saver" msgstr "" #. TRANSLATORS: Stapler Recoverable Failure msgid "printer-state-reasons.stapler-recoverable-failure" msgstr "" #. TRANSLATORS: Stapler Recoverable Storage msgid "printer-state-reasons.stapler-recoverable-storage" msgstr "" #. TRANSLATORS: Stapler Removed msgid "printer-state-reasons.stapler-removed" msgstr "" #. TRANSLATORS: Stapler Resource Added msgid "printer-state-reasons.stapler-resource-added" msgstr "" #. TRANSLATORS: Stapler Resource Removed msgid "printer-state-reasons.stapler-resource-removed" msgstr "" #. TRANSLATORS: Stapler Thermistor Failure msgid "printer-state-reasons.stapler-thermistor-failure" msgstr "" #. TRANSLATORS: Stapler Timing Failure msgid "printer-state-reasons.stapler-timing-failure" msgstr "" #. TRANSLATORS: Stapler Turned Off msgid "printer-state-reasons.stapler-turned-off" msgstr "" #. TRANSLATORS: Stapler Turned On msgid "printer-state-reasons.stapler-turned-on" msgstr "" #. TRANSLATORS: Stapler Under Temperature msgid "printer-state-reasons.stapler-under-temperature" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Failure msgid "printer-state-reasons.stapler-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stapler Unrecoverable Storage Error msgid "printer-state-reasons.stapler-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stapler Warming Up msgid "printer-state-reasons.stapler-warming-up" msgstr "" #. TRANSLATORS: Stitcher Added msgid "printer-state-reasons.stitcher-added" msgstr "" #. TRANSLATORS: Stitcher Almost Empty msgid "printer-state-reasons.stitcher-almost-empty" msgstr "" #. TRANSLATORS: Stitcher Almost Full msgid "printer-state-reasons.stitcher-almost-full" msgstr "" #. TRANSLATORS: Stitcher At Limit msgid "printer-state-reasons.stitcher-at-limit" msgstr "" #. TRANSLATORS: Stitcher Closed msgid "printer-state-reasons.stitcher-closed" msgstr "" #. TRANSLATORS: Stitcher Configuration Change msgid "printer-state-reasons.stitcher-configuration-change" msgstr "" #. TRANSLATORS: Stitcher Cover Closed msgid "printer-state-reasons.stitcher-cover-closed" msgstr "" #. TRANSLATORS: Stitcher Cover Open msgid "printer-state-reasons.stitcher-cover-open" msgstr "" #. TRANSLATORS: Stitcher Empty msgid "printer-state-reasons.stitcher-empty" msgstr "" #. TRANSLATORS: Stitcher Full msgid "printer-state-reasons.stitcher-full" msgstr "" #. TRANSLATORS: Stitcher Interlock Closed msgid "printer-state-reasons.stitcher-interlock-closed" msgstr "" #. TRANSLATORS: Stitcher Interlock Open msgid "printer-state-reasons.stitcher-interlock-open" msgstr "" #. TRANSLATORS: Stitcher Jam msgid "printer-state-reasons.stitcher-jam" msgstr "" #. TRANSLATORS: Stitcher Life Almost Over msgid "printer-state-reasons.stitcher-life-almost-over" msgstr "" #. TRANSLATORS: Stitcher Life Over msgid "printer-state-reasons.stitcher-life-over" msgstr "" #. TRANSLATORS: Stitcher Memory Exhausted msgid "printer-state-reasons.stitcher-memory-exhausted" msgstr "" #. TRANSLATORS: Stitcher Missing msgid "printer-state-reasons.stitcher-missing" msgstr "" #. TRANSLATORS: Stitcher Motor Failure msgid "printer-state-reasons.stitcher-motor-failure" msgstr "" #. TRANSLATORS: Stitcher Near Limit msgid "printer-state-reasons.stitcher-near-limit" msgstr "" #. TRANSLATORS: Stitcher Offline msgid "printer-state-reasons.stitcher-offline" msgstr "" #. TRANSLATORS: Stitcher Opened msgid "printer-state-reasons.stitcher-opened" msgstr "" #. TRANSLATORS: Stitcher Over Temperature msgid "printer-state-reasons.stitcher-over-temperature" msgstr "" #. TRANSLATORS: Stitcher Power Saver msgid "printer-state-reasons.stitcher-power-saver" msgstr "" #. TRANSLATORS: Stitcher Recoverable Failure msgid "printer-state-reasons.stitcher-recoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Recoverable Storage msgid "printer-state-reasons.stitcher-recoverable-storage" msgstr "" #. TRANSLATORS: Stitcher Removed msgid "printer-state-reasons.stitcher-removed" msgstr "" #. TRANSLATORS: Stitcher Resource Added msgid "printer-state-reasons.stitcher-resource-added" msgstr "" #. TRANSLATORS: Stitcher Resource Removed msgid "printer-state-reasons.stitcher-resource-removed" msgstr "" #. TRANSLATORS: Stitcher Thermistor Failure msgid "printer-state-reasons.stitcher-thermistor-failure" msgstr "" #. TRANSLATORS: Stitcher Timing Failure msgid "printer-state-reasons.stitcher-timing-failure" msgstr "" #. TRANSLATORS: Stitcher Turned Off msgid "printer-state-reasons.stitcher-turned-off" msgstr "" #. TRANSLATORS: Stitcher Turned On msgid "printer-state-reasons.stitcher-turned-on" msgstr "" #. TRANSLATORS: Stitcher Under Temperature msgid "printer-state-reasons.stitcher-under-temperature" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Failure msgid "printer-state-reasons.stitcher-unrecoverable-failure" msgstr "" #. TRANSLATORS: Stitcher Unrecoverable Storage Error msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Stitcher Warming Up msgid "printer-state-reasons.stitcher-warming-up" msgstr "" #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" msgstr "" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" msgstr "" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" msgstr "" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" msgstr "" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" msgstr "" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" msgstr "" #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" msgstr "" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" msgstr "" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" msgstr "" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" msgstr "" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" msgstr "" #. TRANSLATORS: Subunit Life Over msgid "printer-state-reasons.subunit-life-over" msgstr "" #. TRANSLATORS: Subunit Memory Exhausted msgid "printer-state-reasons.subunit-memory-exhausted" msgstr "" #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" msgstr "" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" msgstr "" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" msgstr "" #. TRANSLATORS: Subunit Offline msgid "printer-state-reasons.subunit-offline" msgstr "" #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" msgstr "" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" msgstr "" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" msgstr "" #. TRANSLATORS: Subunit Recoverable Failure msgid "printer-state-reasons.subunit-recoverable-failure" msgstr "" #. TRANSLATORS: Subunit Recoverable Storage msgid "printer-state-reasons.subunit-recoverable-storage" msgstr "" #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" msgstr "" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" msgstr "" #. TRANSLATORS: Subunit Resource Removed msgid "printer-state-reasons.subunit-resource-removed" msgstr "" #. TRANSLATORS: Subunit Thermistor Failure msgid "printer-state-reasons.subunit-thermistor-failure" msgstr "" #. TRANSLATORS: Subunit Timing Failure msgid "printer-state-reasons.subunit-timing-Failure" msgstr "" #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" msgstr "" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" msgstr "" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" msgstr "" #. TRANSLATORS: Subunit Unrecoverable Storage msgid "printer-state-reasons.subunit-unrecoverable-storage" msgstr "" #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" msgstr "" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" msgstr "" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" msgstr "" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" msgstr "" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" msgstr "" #. TRANSLATORS: Trimmer Almost Empty msgid "printer-state-reasons.trimmer-almost-empty" msgstr "" #. TRANSLATORS: Trimmer Almost Full msgid "printer-state-reasons.trimmer-almost-full" msgstr "" #. TRANSLATORS: Trimmer At Limit msgid "printer-state-reasons.trimmer-at-limit" msgstr "" #. TRANSLATORS: Trimmer Closed msgid "printer-state-reasons.trimmer-closed" msgstr "" #. TRANSLATORS: Trimmer Configuration Change msgid "printer-state-reasons.trimmer-configuration-change" msgstr "" #. TRANSLATORS: Trimmer Cover Closed msgid "printer-state-reasons.trimmer-cover-closed" msgstr "" #. TRANSLATORS: Trimmer Cover Open msgid "printer-state-reasons.trimmer-cover-open" msgstr "" #. TRANSLATORS: Trimmer Empty msgid "printer-state-reasons.trimmer-empty" msgstr "" #. TRANSLATORS: Trimmer Full msgid "printer-state-reasons.trimmer-full" msgstr "" #. TRANSLATORS: Trimmer Interlock Closed msgid "printer-state-reasons.trimmer-interlock-closed" msgstr "" #. TRANSLATORS: Trimmer Interlock Open msgid "printer-state-reasons.trimmer-interlock-open" msgstr "" #. TRANSLATORS: Trimmer Jam msgid "printer-state-reasons.trimmer-jam" msgstr "" #. TRANSLATORS: Trimmer Life Almost Over msgid "printer-state-reasons.trimmer-life-almost-over" msgstr "" #. TRANSLATORS: Trimmer Life Over msgid "printer-state-reasons.trimmer-life-over" msgstr "" #. TRANSLATORS: Trimmer Memory Exhausted msgid "printer-state-reasons.trimmer-memory-exhausted" msgstr "" #. TRANSLATORS: Trimmer Missing msgid "printer-state-reasons.trimmer-missing" msgstr "" #. TRANSLATORS: Trimmer Motor Failure msgid "printer-state-reasons.trimmer-motor-failure" msgstr "" #. TRANSLATORS: Trimmer Near Limit msgid "printer-state-reasons.trimmer-near-limit" msgstr "" #. TRANSLATORS: Trimmer Offline msgid "printer-state-reasons.trimmer-offline" msgstr "" #. TRANSLATORS: Trimmer Opened msgid "printer-state-reasons.trimmer-opened" msgstr "" #. TRANSLATORS: Trimmer Over Temperature msgid "printer-state-reasons.trimmer-over-temperature" msgstr "" #. TRANSLATORS: Trimmer Power Saver msgid "printer-state-reasons.trimmer-power-saver" msgstr "" #. TRANSLATORS: Trimmer Recoverable Failure msgid "printer-state-reasons.trimmer-recoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Recoverable Storage msgid "printer-state-reasons.trimmer-recoverable-storage" msgstr "" #. TRANSLATORS: Trimmer Removed msgid "printer-state-reasons.trimmer-removed" msgstr "" #. TRANSLATORS: Trimmer Resource Added msgid "printer-state-reasons.trimmer-resource-added" msgstr "" #. TRANSLATORS: Trimmer Resource Removed msgid "printer-state-reasons.trimmer-resource-removed" msgstr "" #. TRANSLATORS: Trimmer Thermistor Failure msgid "printer-state-reasons.trimmer-thermistor-failure" msgstr "" #. TRANSLATORS: Trimmer Timing Failure msgid "printer-state-reasons.trimmer-timing-failure" msgstr "" #. TRANSLATORS: Trimmer Turned Off msgid "printer-state-reasons.trimmer-turned-off" msgstr "" #. TRANSLATORS: Trimmer Turned On msgid "printer-state-reasons.trimmer-turned-on" msgstr "" #. TRANSLATORS: Trimmer Under Temperature msgid "printer-state-reasons.trimmer-under-temperature" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Failure msgid "printer-state-reasons.trimmer-unrecoverable-failure" msgstr "" #. TRANSLATORS: Trimmer Unrecoverable Storage Error msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Trimmer Warming Up msgid "printer-state-reasons.trimmer-warming-up" msgstr "" #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" msgstr "" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" msgstr "" #. TRANSLATORS: Wrapper Almost Empty msgid "printer-state-reasons.wrapper-almost-empty" msgstr "" #. TRANSLATORS: Wrapper Almost Full msgid "printer-state-reasons.wrapper-almost-full" msgstr "" #. TRANSLATORS: Wrapper At Limit msgid "printer-state-reasons.wrapper-at-limit" msgstr "" #. TRANSLATORS: Wrapper Closed msgid "printer-state-reasons.wrapper-closed" msgstr "" #. TRANSLATORS: Wrapper Configuration Change msgid "printer-state-reasons.wrapper-configuration-change" msgstr "" #. TRANSLATORS: Wrapper Cover Closed msgid "printer-state-reasons.wrapper-cover-closed" msgstr "" #. TRANSLATORS: Wrapper Cover Open msgid "printer-state-reasons.wrapper-cover-open" msgstr "" #. TRANSLATORS: Wrapper Empty msgid "printer-state-reasons.wrapper-empty" msgstr "" #. TRANSLATORS: Wrapper Full msgid "printer-state-reasons.wrapper-full" msgstr "" #. TRANSLATORS: Wrapper Interlock Closed msgid "printer-state-reasons.wrapper-interlock-closed" msgstr "" #. TRANSLATORS: Wrapper Interlock Open msgid "printer-state-reasons.wrapper-interlock-open" msgstr "" #. TRANSLATORS: Wrapper Jam msgid "printer-state-reasons.wrapper-jam" msgstr "" #. TRANSLATORS: Wrapper Life Almost Over msgid "printer-state-reasons.wrapper-life-almost-over" msgstr "" #. TRANSLATORS: Wrapper Life Over msgid "printer-state-reasons.wrapper-life-over" msgstr "" #. TRANSLATORS: Wrapper Memory Exhausted msgid "printer-state-reasons.wrapper-memory-exhausted" msgstr "" #. TRANSLATORS: Wrapper Missing msgid "printer-state-reasons.wrapper-missing" msgstr "" #. TRANSLATORS: Wrapper Motor Failure msgid "printer-state-reasons.wrapper-motor-failure" msgstr "" #. TRANSLATORS: Wrapper Near Limit msgid "printer-state-reasons.wrapper-near-limit" msgstr "" #. TRANSLATORS: Wrapper Offline msgid "printer-state-reasons.wrapper-offline" msgstr "" #. TRANSLATORS: Wrapper Opened msgid "printer-state-reasons.wrapper-opened" msgstr "" #. TRANSLATORS: Wrapper Over Temperature msgid "printer-state-reasons.wrapper-over-temperature" msgstr "" #. TRANSLATORS: Wrapper Power Saver msgid "printer-state-reasons.wrapper-power-saver" msgstr "" #. TRANSLATORS: Wrapper Recoverable Failure msgid "printer-state-reasons.wrapper-recoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Recoverable Storage msgid "printer-state-reasons.wrapper-recoverable-storage" msgstr "" #. TRANSLATORS: Wrapper Removed msgid "printer-state-reasons.wrapper-removed" msgstr "" #. TRANSLATORS: Wrapper Resource Added msgid "printer-state-reasons.wrapper-resource-added" msgstr "" #. TRANSLATORS: Wrapper Resource Removed msgid "printer-state-reasons.wrapper-resource-removed" msgstr "" #. TRANSLATORS: Wrapper Thermistor Failure msgid "printer-state-reasons.wrapper-thermistor-failure" msgstr "" #. TRANSLATORS: Wrapper Timing Failure msgid "printer-state-reasons.wrapper-timing-failure" msgstr "" #. TRANSLATORS: Wrapper Turned Off msgid "printer-state-reasons.wrapper-turned-off" msgstr "" #. TRANSLATORS: Wrapper Turned On msgid "printer-state-reasons.wrapper-turned-on" msgstr "" #. TRANSLATORS: Wrapper Under Temperature msgid "printer-state-reasons.wrapper-under-temperature" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Failure msgid "printer-state-reasons.wrapper-unrecoverable-failure" msgstr "" #. TRANSLATORS: Wrapper Unrecoverable Storage Error msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" msgstr "" #. TRANSLATORS: Wrapper Warming Up msgid "printer-state-reasons.wrapper-warming-up" msgstr "" #. TRANSLATORS: Idle msgid "printer-state.3" msgstr "" #. TRANSLATORS: Processing msgid "printer-state.4" msgstr "" #. TRANSLATORS: Stopped msgid "printer-state.5" msgstr "" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" msgstr "" msgid "processing" msgstr "in Verarbeitung" #. TRANSLATORS: Proof Print msgid "proof-print" msgstr "" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" msgstr "" #. TRANSLATORS: Punching msgid "punching" msgstr "" #. TRANSLATORS: Punching Locations msgid "punching-locations" msgstr "" #. TRANSLATORS: Punching Offset msgid "punching-offset" msgstr "" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "punching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "punching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "punching-reference-edge.top" msgstr "" #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "Anfrage-ID ist %s-%d (%d Datei(en))" msgid "request-id uses indefinite length" msgstr "Anfrage-ID hat unbestimmte Länge" #. TRANSLATORS: Requested Attributes msgid "requested-attributes" msgstr "" #. TRANSLATORS: Retry Interval msgid "retry-interval" msgstr "" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" msgstr "" #. TRANSLATORS: Save Disposition msgid "save-disposition" msgstr "" #. TRANSLATORS: None msgid "save-disposition.none" msgstr "" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" msgstr "" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" msgstr "" #. TRANSLATORS: Save Document Format msgid "save-document-format" msgstr "" #. TRANSLATORS: Save Info msgid "save-info" msgstr "" #. TRANSLATORS: Save Location msgid "save-location" msgstr "" #. TRANSLATORS: Save Name msgid "save-name" msgstr "" msgid "scheduler is not running" msgstr "Zeitplandienst läuft nicht" msgid "scheduler is running" msgstr "Zeitplandienst läuft" #. TRANSLATORS: Separator Sheets msgid "separator-sheets" msgstr "" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" msgstr "" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" msgstr "" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" msgstr "" #. TRANSLATORS: None msgid "separator-sheets-type.none" msgstr "" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" msgstr "" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" msgstr "" #. TRANSLATORS: 2-Sided Printing msgid "sides" msgstr "" #. TRANSLATORS: Off msgid "sides.one-sided" msgstr "" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" msgstr "" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" msgstr "" #, c-format msgid "stat of %s failed: %s" msgstr "Status von %s fehlgeschlagen: %s" msgid "status\t\tShow status of daemon and queue." msgstr "status\t\tStatus von Dienst und Warteschlange anzeigen." #. TRANSLATORS: Status Message msgid "status-message" msgstr "" #. TRANSLATORS: Staple msgid "stitching" msgstr "" #. TRANSLATORS: Stitching Angle msgid "stitching-angle" msgstr "" #. TRANSLATORS: Stitching Locations msgid "stitching-locations" msgstr "" #. TRANSLATORS: Staple Method msgid "stitching-method" msgstr "" #. TRANSLATORS: Automatic msgid "stitching-method.auto" msgstr "" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" msgstr "" #. TRANSLATORS: Wire msgid "stitching-method.wire" msgstr "" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" msgstr "" #. TRANSLATORS: Staple Edge msgid "stitching-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" msgstr "" msgid "stopped" msgstr "angehalten" #. TRANSLATORS: Subject msgid "subject" msgstr "" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" msgstr "" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" msgstr "" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" msgstr "" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" msgstr "" #. TRANSLATORS: All msgid "subscription-privacy-scope.all" msgstr "" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" msgstr "" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" msgstr "" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" msgstr "" #, c-format msgid "system default destination: %s" msgstr "systemvoreingestelltes Ziel: %s" #, c-format msgid "system default destination: %s/%s" msgstr "systemvoreingestelltes Ziel: %s/%s" #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" msgstr "T33 Subaddress" #. TRANSLATORS: To Name msgid "to-name" msgstr "" #. TRANSLATORS: Transmission Status msgid "transmission-status" msgstr "" #. TRANSLATORS: Pending msgid "transmission-status.3" msgstr "" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" msgstr "" #. TRANSLATORS: Processing msgid "transmission-status.5" msgstr "" #. TRANSLATORS: Canceled msgid "transmission-status.7" msgstr "" #. TRANSLATORS: Aborted msgid "transmission-status.8" msgstr "" #. TRANSLATORS: Completed msgid "transmission-status.9" msgstr "" #. TRANSLATORS: Cut msgid "trimming" msgstr "" #. TRANSLATORS: Cut Position msgid "trimming-offset" msgstr "" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" msgstr "" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" msgstr "" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" msgstr "" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" msgstr "" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" msgstr "" #. TRANSLATORS: Type of Cut msgid "trimming-type" msgstr "" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" msgstr "" #. TRANSLATORS: Full msgid "trimming-type.full" msgstr "" #. TRANSLATORS: Partial msgid "trimming-type.partial" msgstr "" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" msgstr "" #. TRANSLATORS: Score msgid "trimming-type.score" msgstr "" #. TRANSLATORS: Tab msgid "trimming-type.tab" msgstr "" #. TRANSLATORS: Cut After msgid "trimming-when" msgstr "" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" msgstr "" #. TRANSLATORS: Job msgid "trimming-when.after-job" msgstr "" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" msgstr "" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" msgstr "" msgid "unknown" msgstr "Unbekannt" msgid "untitled" msgstr "Ohne Titel" msgid "variable-bindings uses indefinite length" msgstr "variable-bindings hat unbestimmte Länge" #. TRANSLATORS: X Accuracy msgid "x-accuracy" msgstr "" #. TRANSLATORS: X Dimension msgid "x-dimension" msgstr "" #. TRANSLATORS: X Offset msgid "x-offset" msgstr "" #. TRANSLATORS: X Origin msgid "x-origin" msgstr "" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" msgstr "" #. TRANSLATORS: Y Dimension msgid "y-dimension" msgstr "" #. TRANSLATORS: Y Offset msgid "y-offset" msgstr "" #. TRANSLATORS: Y Origin msgid "y-origin" msgstr "" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" msgstr "" #. TRANSLATORS: Z Dimension msgid "z-dimension" msgstr "" #. TRANSLATORS: Z Offset msgid "z-offset" msgstr "" msgid "{service_domain} Domain name" msgstr "" msgid "{service_hostname} Fully-qualified domain name" msgstr "" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" msgstr "" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" msgstr "" msgid "{service_uri} URI" msgstr "" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" msgstr "" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" #~ msgid "A Samba password is required to export printer drivers" #~ msgstr "" #~ "Ein Samba-Passwort ist erforderlich, um Druckertreiber zu exportieren" #~ msgid "A Samba username is required to export printer drivers" #~ msgstr "" #~ "Ein Samba-Benutzername ist erforderlich, um Druckertreiber zu exportieren" #~ msgid "Export Printers to Samba" #~ msgstr "Drucker zu Samba exportieren" #~ msgid "cupsctl: Cannot set Listen or Port directly." #~ msgstr "cupsctl: Kann nicht direkt auf dem Port hören." #~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s" #~ msgstr "lpadmin: Kann PPD Datei \"%s\" - %s nicht öffnen" cups-2.3.1/locale/strings2po.c000664 000765 000024 00000006457 13574721672 016330 0ustar00mikestaff000000 000000 /* * Convert Apple .strings file (UTF-16 BE text file) to GNU gettext .po files. * * Copyright 2007-2014 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. * * Usage: * * strings2po filename.strings filename.po * * Compile with: * * gcc -o strings2po strings2po.c */ #include #include /* * The .strings file format is simple: * * // comment * "id" = "str"; * * Both the id and str strings use standard C quoting for special characters * like newline and the double quote character. */ /* * Local functions... */ static int read_strings(FILE *strings, char *buffer, size_t bufsize, char **id, char **str); static void write_po(FILE *po, const char *what, const char *s); /* * main() - Convert .strings file to .po. */ int /* O - Exit code */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { FILE *strings, /* .strings file */ *po; /* .po file */ char iconv[1024], /* iconv command */ buffer[8192], /* Line buffer */ *id, /* ID string */ *str; /* Translation string */ int count; /* Number of messages converted */ if (argc != 3) { puts("Usage: strings2po filename.strings filename.po"); return (1); } /* * Cheat by using iconv to convert the .strings file from UTF-16 to UTF-8 * which is what we need for the .po file (and it makes things a lot * simpler...) */ snprintf(iconv, sizeof(iconv), "iconv -f utf-16 -t utf-8 '%s'", argv[1]); if ((strings = popen(iconv, "r")) == NULL) { perror(argv[1]); return (1); } if ((po = fopen(argv[2], "w")) == NULL) { perror(argv[2]); pclose(strings); return (1); } count = 0; while (read_strings(strings, buffer, sizeof(buffer), &id, &str)) { count ++; write_po(po, "msgid", id); write_po(po, "msgstr", str); } pclose(strings); fclose(po); printf("%s: %d messages.\n", argv[2], count); return (0); } /* * 'read_strings()' - Read a line from a .strings file. */ static int /* O - 1 on success, 0 on failure */ read_strings(FILE *strings, /* I - .strings file */ char *buffer, /* I - Line buffer */ size_t bufsize, /* I - Size of line buffer */ char **id, /* O - Pointer to ID string */ char **str) /* O - Pointer to translation string */ { char *bufptr; /* Pointer into buffer */ while (fgets(buffer, (int)bufsize, strings)) { if (buffer[0] != '\"') continue; *id = buffer + 1; for (bufptr = buffer + 1; *bufptr && *bufptr != '\"'; bufptr ++) if (*bufptr == '\\') bufptr ++; if (*bufptr != '\"') continue; *bufptr++ = '\0'; while (*bufptr && *bufptr != '\"') bufptr ++; if (!*bufptr) continue; bufptr ++; *str = bufptr; for (; *bufptr && *bufptr != '\"'; bufptr ++) if (*bufptr == '\\') bufptr ++; if (*bufptr != '\"') continue; *bufptr = '\0'; return (1); } return (0); } /* * 'write_po()' - Write a line to the .po file. */ static void write_po(FILE *po, /* I - .po file */ const char *what, /* I - Type of string */ const char *s) /* I - String to write */ { fprintf(po, "%s \"%s\"\n", what, s); } cups-2.3.1/monitor/Makefile000664 000765 000024 00000003251 13574721672 015727 0ustar00mikestaff000000 000000 # # Port monitor makefile for CUPS. # # 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. # include ../Makedefs TARGETS = bcp tbcp OBJS = bcp.o tbcp.o # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all object files... # clean: $(RM) $(OBJS) $(TARGETS) # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: $(INSTALL_DIR) -m 755 $(SERVERBIN)/monitor for file in $(TARGETS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/monitor; \ done if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ for file in $(TARGETS); do \ cp $$file $(SYMROOT); \ dsymutil $(SYMROOT)/$$file; \ done \ fi # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Uninstall all targets... # uninstall: for file in $(TARGETS); do \ $(RM) $(SERVERBIN)/monitor/$$file; \ done -$(RMDIR) $(SERVERBIN)/monitor -$(RMDIR) $(SERVERBIN) # # bcp # bcp: bcp.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ bcp.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # tbcp # tbcp: tbcp.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ tbcp.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Dependencies... # include Dependencies cups-2.3.1/monitor/Dependencies000664 000765 000024 00000001506 13574721672 016601 0ustar00mikestaff000000 000000 bcp.o: bcp.c ../cups/cups-private.h ../cups/string-private.h ../config.h \ ../cups/versioning.h ../cups/array-private.h ../cups/array.h \ ../cups/ipp-private.h ../cups/cups.h ../cups/file.h ../cups/ipp.h \ ../cups/http.h ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h ../cups/ppd.h ../cups/raster.h tbcp.o: tbcp.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h ../cups/ppd.h \ ../cups/raster.h cups-2.3.1/monitor/tbcp.c000664 000765 000024 00000011157 13574721672 015367 0ustar00mikestaff000000 000000 /* * TBCP port monitor for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1993-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include /* * Local functions... */ static char *psgets(char *buf, size_t *bytes, FILE *fp); static ssize_t pswrite(const char *buf, size_t bytes); /* * 'main()' - Main entry... */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { FILE *fp; /* File to print */ int copies; /* Number of copies left */ char line[1024]; /* Line/buffer from stream/file */ size_t linelen; /* Length of line */ /* * Check command-line... */ if (argc < 6 || argc > 7) { _cupsLangPrintf(stderr, _("Usage: %s job-id user title copies options [file]"), argv[0]); return (1); } if (argc == 6) { copies = 1; fp = stdin; } else { copies = atoi(argv[4]); fp = fopen(argv[6], "rb"); if (!fp) { perror(argv[6]); return (1); } } /* * Copy the print file to stdout... */ while (copies > 0) { copies --; /* * Read the first line... */ linelen = sizeof(line); if (!psgets(line, &linelen, fp)) break; /* * Handle leading PJL fun... */ if (!strncmp(line, "\033%-12345X", 9) || !strncmp(line, "@PJL ", 5)) { /* * Yup, we have leading PJL fun, so copy it until we hit a line * with "ENTER LANGUAGE"... */ while (strstr(line, "ENTER LANGUAGE") == NULL) { fwrite(line, 1, linelen, stdout); linelen = sizeof(line); if (psgets(line, &linelen, fp) == NULL) break; } } else { /* * No PJL stuff, just add the UEL... */ fputs("\033%-12345X", stdout); } /* * Switch to TBCP mode... */ fputs("\001M", stdout); /* * Loop until we see end-of-file... */ while (pswrite(line, linelen) > 0) { linelen = sizeof(line); if (psgets(line, &linelen, fp) == NULL) break; } fflush(stdout); } return (0); } /* * 'psgets()' - Get a line from a file. * * Note: * * This function differs from the gets() function in that it * handles any combination of CR, LF, or CR LF to end input * lines. */ static char * /* O - String or NULL if EOF */ psgets(char *buf, /* I - Buffer to read into */ size_t *bytes, /* IO - Length of buffer */ FILE *fp) /* I - File to read from */ { char *bufptr; /* Pointer into buffer */ int ch; /* Character from file */ size_t len; /* Max length of string */ len = *bytes - 1; bufptr = buf; ch = EOF; while ((size_t)(bufptr - buf) < len) { if ((ch = getc(fp)) == EOF) break; if (ch == '\r') { /* * Got a CR; see if there is a LF as well... */ ch = getc(fp); if (ch != EOF && ch != '\n') { ungetc(ch, fp); /* Nope, save it for later... */ ch = '\r'; } else *bufptr++ = '\r'; break; } else if (ch == '\n') break; else *bufptr++ = (char)ch; } /* * Add a trailing newline if it is there... */ if (ch == '\n' || ch == '\r') { if ((size_t)(bufptr - buf) < len) *bufptr++ = (char)ch; else ungetc(ch, fp); } /* * Nul-terminate the string and return it (or NULL for EOF). */ *bufptr = '\0'; *bytes = (size_t)(bufptr - buf); if (ch == EOF && bufptr == buf) return (NULL); else return (buf); } /* * 'pswrite()' - Write data from a file. */ static ssize_t /* O - Number of bytes written */ pswrite(const char *buf, /* I - Buffer to write */ size_t bytes) /* I - Bytes to write */ { size_t count; /* Remaining bytes */ for (count = bytes; count > 0; count --, buf ++) switch (*buf) { case 0x04 : /* CTRL-D */ if (bytes == 1) { /* * Don't quote the last CTRL-D... */ putchar(0x04); break; } case 0x01 : /* CTRL-A */ case 0x03 : /* CTRL-C */ case 0x05 : /* CTRL-E */ case 0x11 : /* CTRL-Q */ case 0x13 : /* CTRL-S */ case 0x14 : /* CTRL-T */ case 0x1b : /* CTRL-[ (aka ESC) */ case 0x1c : /* CTRL-\ */ if (putchar(0x01) < 0) return (-1); if (putchar(*buf ^ 0x40) < 0) return (-1); break; default : if (putchar(*buf) < 0) return (-1); break; } return ((ssize_t)bytes); } cups-2.3.1/monitor/bcp.c000664 000765 000024 00000012111 13574721672 015172 0ustar00mikestaff000000 000000 /* * TBCP port monitor for CUPS. * * Copyright 2007-2014 by Apple Inc. * Copyright 1993-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* * Include necessary headers... */ #include #include /* * Local functions... */ static char *psgets(char *buf, size_t *bytes, FILE *fp); static ssize_t pswrite(const char *buf, size_t bytes); /* * 'main()' - Main entry... */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { FILE *fp; /* File to print */ int copies; /* Number of copies left */ char line[1024]; /* Line/buffer from stream/file */ size_t linelen; /* Length of line */ ppd_file_t *ppd; /* PPD file */ /* * Check command-line... */ if (argc < 6 || argc > 7) { _cupsLangPrintf(stderr, _("Usage: %s job-id user title copies options [file]"), argv[0]); return (1); } if (argc == 6) { copies = 1; fp = stdin; } else { copies = atoi(argv[4]); fp = fopen(argv[6], "rb"); if (!fp) { perror(argv[6]); return (1); } } /* * Open the PPD file as needed... */ ppd = ppdOpenFile(getenv("PPD")); /* * Copy the print file to stdout... */ while (copies > 0) { copies --; if (ppd && ppd->jcl_begin) fputs(ppd->jcl_begin, stdout); if (ppd && ppd->jcl_ps) fputs(ppd->jcl_ps, stdout); if (!ppd || ppd->language_level == 1) { /* * Use setsoftwareiomode for BCP mode... */ puts("%!PS-Adobe-3.0 ExitServer"); puts("%%Title: (BCP - Level 1)"); puts("%%EndComments"); puts("%%BeginExitServer: 0"); puts("serverdict begin 0 exitserver"); puts("%%EndExitServer"); puts("statusdict begin"); puts("/setsoftwareiomode known {100 setsoftwareiomode}"); puts("end"); puts("%EOF"); } else { /* * Use setdevparams for BCP mode... */ puts("%!PS-Adobe-3.0"); puts("%%Title: (BCP - Level 2)"); puts("%%EndComments"); puts("currentsysparams"); puts("/CurInputDevice 2 copy known {"); puts("get"); puts("<> setdevparams"); puts("}{"); puts("pop pop"); puts("} ifelse"); puts("%EOF"); } if (ppd && ppd->jcl_end) fputs(ppd->jcl_end, stdout); else if (!ppd || ppd->num_filters == 0) putchar(0x04); /* * Loop until we see end-of-file... */ do { linelen = sizeof(line); if (psgets(line, &linelen, fp) == NULL) break; } while (pswrite(line, linelen) > 0); fflush(stdout); } return (0); } /* * 'psgets()' - Get a line from a file. * * Note: * * This function differs from the gets() function in that it * handles any combination of CR, LF, or CR LF to end input * lines. */ static char * /* O - String or NULL if EOF */ psgets(char *buf, /* I - Buffer to read into */ size_t *bytes, /* IO - Length of buffer */ FILE *fp) /* I - File to read from */ { char *bufptr; /* Pointer into buffer */ int ch; /* Character from file */ size_t len; /* Max length of string */ len = *bytes - 1; bufptr = buf; ch = EOF; while ((size_t)(bufptr - buf) < len) { if ((ch = getc(fp)) == EOF) break; if (ch == '\r') { /* * Got a CR; see if there is a LF as well... */ ch = getc(fp); if (ch != EOF && ch != '\n') { ungetc(ch, fp); /* Nope, save it for later... */ ch = '\r'; } else *bufptr++ = '\r'; break; } else if (ch == '\n') break; else *bufptr++ = (char)ch; } /* * Add a trailing newline if it is there... */ if (ch == '\n' || ch == '\r') { if ((size_t)(bufptr - buf) < len) *bufptr++ = (char)ch; else ungetc(ch, fp); } /* * Nul-terminate the string and return it (or NULL for EOF). */ *bufptr = '\0'; *bytes = (size_t)(bufptr - buf); if (ch == EOF && bufptr == buf) return (NULL); else return (buf); } /* * 'pswrite()' - Write data from a file. */ static ssize_t /* O - Number of bytes written */ pswrite(const char *buf, /* I - Buffer to write */ size_t bytes) /* I - Bytes to write */ { size_t count; /* Remaining bytes */ for (count = bytes; count > 0; count --, buf ++) switch (*buf) { case 0x04 : /* CTRL-D */ if (bytes == 1) { /* * Don't quote the last CTRL-D... */ putchar(0x04); break; } case 0x01 : /* CTRL-A */ case 0x03 : /* CTRL-C */ case 0x05 : /* CTRL-E */ case 0x11 : /* CTRL-Q */ case 0x13 : /* CTRL-S */ case 0x14 : /* CTRL-T */ case 0x1c : /* CTRL-\ */ if (putchar(0x01) < 0) return (-1); if (putchar(*buf ^ 0x40) < 0) return (-1); break; default : if (putchar(*buf) < 0) return (-1); break; } return ((ssize_t)bytes); } cups-2.3.1/tools/ippevecommon.h000664 000765 000024 00000000674 13574721672 016620 0ustar00mikestaff000000 000000 /* * Common header for IPP Everywhere printer commands for CUPS. * * Copyright © 2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include #include #include #include #include #include #include /* * Prototypes... */ cups-2.3.1/tools/ippeveps.c000664 000765 000024 00000064563 13574721672 015754 0ustar00mikestaff000000 000000 /* * Generic Adobe PostScript printer command for ippeveprinter/CUPS. * * Copyright © 2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "ippevecommon.h" #if !CUPS_LITE # include #endif /* !CUPS_LITE */ #include #include #ifdef __APPLE__ # define PDFTOPS CUPS_SERVERBIN "/filter/cgpdftops" #else # define PDFTOPS CUPS_SERVERBIN "/filter/pdftops" #endif /* __APPLE__ */ /* * Local globals... */ #if !CUPS_LITE static ppd_file_t *ppd = NULL; /* PPD file data */ static _ppd_cache_t *ppd_cache = NULL; /* IPP to PPD cache data */ #endif /* !CUPS_LITE */ /* * Local functions... */ static void ascii85(const unsigned char *data, int length, int eod); static void dsc_header(int num_pages); static void dsc_page(int page); static void dsc_trailer(int num_pages); static int get_options(cups_option_t **options); static int jpeg_to_ps(const char *filename, int copies); static int pdf_to_ps(const char *filename, int copies, int num_options, cups_option_t *options); static int ps_to_ps(const char *filename, int copies); static int raster_to_ps(const char *filename); /* * 'main()' - Main entry for PostScript printer command. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { const char *content_type, /* Content type to print */ *ipp_copies; /* IPP_COPIES value */ int copies; /* Number of copies */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ /* * Get print options... */ num_options = get_options(&options); if ((ipp_copies = getenv("IPP_COPIES")) != NULL) copies = atoi(ipp_copies); else copies = 1; /* * Print it... */ if (argc > 2) { fputs("ERROR: Too many arguments supplied, aborting.\n", stderr); return (1); } else if ((content_type = getenv("CONTENT_TYPE")) == NULL) { fputs("ERROR: CONTENT_TYPE environment variable not set, aborting.\n", stderr); return (1); } else if (!strcasecmp(content_type, "application/pdf")) { return (pdf_to_ps(argv[1], copies, num_options, options)); } else if (!strcasecmp(content_type, "application/postscript")) { return (ps_to_ps(argv[1], copies)); } else if (!strcasecmp(content_type, "image/jpeg")) { return (jpeg_to_ps(argv[1], copies)); } else if (!strcasecmp(content_type, "image/pwg-raster") || !strcasecmp(content_type, "image/urf")) { return (raster_to_ps(argv[1])); } else { fprintf(stderr, "ERROR: CONTENT_TYPE %s not supported.\n", content_type); return (1); } } /* * 'ascii85()' - Write binary data using a Base85 encoding... */ static void ascii85(const unsigned char *data, /* I - Data to write */ int length, /* I - Number of bytes to write */ int eod) /* I - 1 if this is the end, 0 otherwise */ { unsigned b = 0; /* Current 32-bit word */ unsigned char c[5]; /* Base-85 encoded characters */ static int col = 0; /* Column */ static unsigned char leftdata[4]; /* Leftover data at the end */ static int leftcount = 0; /* Size of leftover data */ length += leftcount; while (length > 3) { switch (leftcount) { case 0 : b = (unsigned)((((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]); break; case 1 : b = (unsigned)((((((leftdata[0] << 8) | data[0]) << 8) | data[1]) << 8) | data[2]); break; case 2 : b = (unsigned)((((((leftdata[0] << 8) | leftdata[1]) << 8) | data[0]) << 8) | data[1]); break; case 3 : b = (unsigned)((((((leftdata[0] << 8) | leftdata[1]) << 8) | leftdata[2]) << 8) | data[0]); break; } if (col >= 76) { col = 0; putchar('\n'); } if (b == 0) { putchar('z'); col ++; } else { c[4] = (b % 85) + '!'; b /= 85; c[3] = (b % 85) + '!'; b /= 85; c[2] = (b % 85) + '!'; b /= 85; c[1] = (b % 85) + '!'; b /= 85; c[0] = (unsigned char)(b + '!'); fwrite(c, 1, 5, stdout); col += 5; } data += 4 - leftcount; length -= 4 - leftcount; leftcount = 0; } if (length > 0) { // Copy any remainder into the leftdata array... if ((length - leftcount) > 0) memcpy(leftdata + leftcount, data, (size_t)(length - leftcount)); memset(leftdata + length, 0, (size_t)(4 - length)); leftcount = length; } if (eod) { // Do the end-of-data dance... if (col >= 76) { col = 0; putchar('\n'); } if (leftcount > 0) { // Write the remaining bytes as needed... b = (unsigned)((((((leftdata[0] << 8) | leftdata[1]) << 8) | leftdata[2]) << 8) | leftdata[3]); c[4] = (b % 85) + '!'; b /= 85; c[3] = (b % 85) + '!'; b /= 85; c[2] = (b % 85) + '!'; b /= 85; c[1] = (b % 85) + '!'; b /= 85; c[0] = (unsigned char)(b + '!'); fwrite(c, (size_t)(leftcount + 1), 1, stdout); leftcount = 0; } puts("~>"); col = 0; } } /* * 'dsc_header()' - Write out a standard Document Structuring Conventions * PostScript header. */ static void dsc_header(int num_pages) /* I - Number of pages or 0 if not known */ { const char *job_name = getenv("IPP_JOB_NAME"); /* job-name value */ #if !CUPS_LITE const char *job_id = getenv("IPP_JOB_ID"); /* job-id value */ ppdEmitJCL(ppd, stdout, job_id ? atoi(job_id) : 0, cupsUser(), job_name ? job_name : "Unknown"); #endif /* !CUPS_LITE */ puts("%!PS-Adobe-3.0"); puts("%%LanguageLevel: 2"); printf("%%%%Creator: ippeveps/%d.%d.%d\n", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH); if (job_name) { fputs("%%Title: ", stdout); while (*job_name) { if (*job_name >= 0x20 && *job_name < 0x7f) putchar(*job_name); else putchar('?'); job_name ++; } putchar('\n'); } if (num_pages > 0) printf("%%%%Pages: %d\n", num_pages); else puts("%%Pages: (atend)"); puts("%%EndComments"); #if !CUPS_LITE if (ppd) { puts("%%BeginProlog"); if (ppd->patches) { puts("%%BeginFeature: *JobPatchFile 1"); puts(ppd->patches); puts("%%EndFeature"); } ppdEmit(ppd, stdout, PPD_ORDER_PROLOG); puts("%%EndProlog"); puts("%%BeginSetup"); ppdEmit(ppd, stdout, PPD_ORDER_DOCUMENT); ppdEmit(ppd, stdout, PPD_ORDER_ANY); puts("%%EndSetup"); } #endif /* !CUPS_LITE */ } /* * 'dsc_page()' - Mark the start of a page. */ static void dsc_page(int page) /* I - Page numebr (1-based) */ { printf("%%%%Page: (%d) %d\n", page, page); fprintf(stderr, "ATTR: job-impressions-completed=%d\n", page); #if !CUPS_LITE if (ppd) { puts("%%BeginPageSetup"); ppdEmit(ppd, stdout, PPD_ORDER_PAGE); puts("%%EndPageSetup"); } #endif /* !CUPS_LITE */ } /* * 'dsc_trailer()' - Mark the end of the document. */ static void dsc_trailer(int num_pages) /* I - Number of pages */ { if (num_pages > 0) { puts("%%Trailer"); printf("%%%%Pages: %d\n", num_pages); puts("%%EOF"); } #if !CUPS_LITE if (ppd && ppd->jcl_end) ppdEmitJCLEnd(ppd, stdout); else #endif /* !CUPS_LITE */ putchar(0x04); } /* * 'get_options()' - Get the PPD options corresponding to the IPP Job Template * attributes. */ static int /* O - Number of options */ get_options(cups_option_t **options) /* O - Options */ { int num_options = 0; /* Number of options */ const char *value; /* Option value */ pwg_media_t *media = NULL; /* Media mapping */ int num_media_col = 0; /* Number of media-col values */ cups_option_t *media_col = NULL; /* media-col values */ #if !CUPS_LITE const char *choice; /* PPD choice */ #endif /* !CUPS_LITE */ /* * No options to start... */ *options = NULL; /* * Media... */ if ((value = getenv("IPP_MEDIA")) == NULL) if ((value = getenv("IPP_MEDIA_COL")) == NULL) if ((value = getenv("IPP_MEDIA_DEFAULT")) == NULL) value = getenv("IPP_MEDIA_COL_DEFAULT"); if (value) { if (*value == '{') { /* * media-col value... */ num_media_col = cupsParseOptions(value, 0, &media_col); } else { /* * media value - map to media-col.media-size-name... */ num_media_col = cupsAddOption("media-size-name", value, 0, &media_col); } } if ((value = cupsGetOption("media-size-name", num_media_col, media_col)) != NULL) { media = pwgMediaForPWG(value); } else if ((value = cupsGetOption("media-size", num_media_col, media_col)) != NULL) { int num_media_size; /* Number of media-size values */ cups_option_t *media_size; /* media-size values */ const char *x_dimension, /* x-dimension value */ *y_dimension; /* y-dimension value */ num_media_size = cupsParseOptions(value, 0, &media_size); if ((x_dimension = cupsGetOption("x-dimension", num_media_size, media_size)) != NULL && (y_dimension = cupsGetOption("y-dimension", num_media_size, media_size)) != NULL) media = pwgMediaForSize(atoi(x_dimension), atoi(y_dimension)); cupsFreeOptions(num_media_size, media_size); } if (media) num_options = cupsAddOption("PageSize", media->ppd, num_options, options); #if !CUPS_LITE /* * Load PPD file and the corresponding IPP <-> PPD cache data... */ if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL) { ppd_cache = _ppdCacheCreateWithPPD(ppd); /* TODO: Fix me - values are names, not numbers... Also need to support finishings-col */ if ((value = getenv("IPP_FINISHINGS")) == NULL) value = getenv("IPP_FINISHINGS_DEFAULT"); if (value) { char *ptr; /* Pointer into value */ int fin; /* Current value */ for (fin = strtol(value, &ptr, 10); fin > 0; fin = strtol(ptr + 1, &ptr, 10)) { num_options = _ppdCacheGetFinishingOptions(ppd_cache, NULL, (ipp_finishings_t)fin, num_options, options); if (*ptr != ',') break; } } if ((value = cupsGetOption("media-source", num_media_col, media_col)) != NULL) { if ((choice = _ppdCacheGetInputSlot(ppd_cache, NULL, value)) != NULL) num_options = cupsAddOption("InputSlot", choice, num_options, options); } if ((value = cupsGetOption("media-type", num_media_col, media_col)) != NULL) { if ((choice = _ppdCacheGetMediaType(ppd_cache, NULL, value)) != NULL) num_options = cupsAddOption("MediaType", choice, num_options, options); } if ((value = getenv("IPP_OUTPUT_BIN")) == NULL) value = getenv("IPP_OUTPUT_BIN_DEFAULT"); if (value) { if ((choice = _ppdCacheGetOutputBin(ppd_cache, value)) != NULL) num_options = cupsAddOption("OutputBin", choice, num_options, options); } if ((value = getenv("IPP_SIDES")) == NULL) value = getenv("IPP_SIDES_DEFAULT"); if (value && ppd_cache->sides_option) { if (!strcmp(value, "one-sided") && ppd_cache->sides_1sided) num_options = cupsAddOption(ppd_cache->sides_option, ppd_cache->sides_1sided, num_options, options); else if (!strcmp(value, "two-sided-long-edge") && ppd_cache->sides_2sided_long) num_options = cupsAddOption(ppd_cache->sides_option, ppd_cache->sides_2sided_long, num_options, options); else if (!strcmp(value, "two-sided-short-edge") && ppd_cache->sides_2sided_short) num_options = cupsAddOption(ppd_cache->sides_option, ppd_cache->sides_2sided_short, num_options, options); } if ((value = getenv("IPP_PRINT_QUALITY")) == NULL) value = getenv("IPP_PRINT_QUALITY_DEFAULT"); if (value) { int i; /* Looping var */ int pq; /* Print quality (0-2) */ int pcm = 1; /* Print color model (0 = mono, 1 = color) */ int num_presets; /* Number of presets */ cups_option_t *presets; /* Presets */ if (!strcmp(value, "draft")) pq = 0; else if (!strcmp(value, "high")) pq = 2; else pq = 1; if ((value = getenv("IPP_PRINT_COLOR_MODE")) == NULL) value = getenv("IPP_PRINT_COLOR_MODE_DEFAULT"); if (value && !strcmp(value, "monochrome")) pcm = 0; num_presets = ppd_cache->num_presets[pcm][pq]; presets = ppd_cache->presets[pcm][pq]; for (i = 0; i < num_presets; i ++) num_options = cupsAddOption(presets[i].name, presets[i].value, num_options, options); } /* * Mark the PPD with the options... */ ppdMarkDefaults(ppd); cupsMarkOptions(ppd, num_options, *options); } #endif /* !CUPS_LITE */ cupsFreeOptions(num_media_col, media_col); return (num_options); } /* * 'jpeg_to_ps()' - Convert a JPEG file to PostScript. */ static int /* O - Exit status */ jpeg_to_ps(const char *filename, /* I - Filename */ int copies) /* I - Number of copies */ { int fd; /* JPEG file descriptor */ int copy; /* Current copy */ int width = 0, /* Width */ height = 0, /* Height */ depth = 0, /* Number of colors */ length; /* Length of marker */ unsigned char buffer[65536], /* Copy buffer */ *bufptr, /* Pointer info buffer */ *bufend; /* End of buffer */ ssize_t bytes; /* Bytes in buffer */ const char *decode; /* Decode array */ float page_left, /* Left margin */ page_top, /* Top margin */ page_width, /* Page width in points */ page_height, /* Page heigth in points */ x_factor, /* X image scaling factor */ y_factor, /* Y image scaling factor */ page_scaling; /* Image scaling factor */ #if !CUPS_LITE ppd_size_t *page_size; /* Current page size */ #endif /* !CUPS_LITE */ /* * Open the input file... */ if (filename) { if ((fd = open(filename, O_RDONLY)) < 0) { fprintf(stderr, "ERROR: Unable to open \"%s\": %s\n", filename, strerror(errno)); return (1); } } else { fd = 0; copies = 1; } /* * Read the JPEG dimensions... */ bytes = read(fd, buffer, sizeof(buffer)); if (bytes < 3 || memcmp(buffer, "\377\330\377", 3)) { fputs("ERROR: Not a JPEG image.\n", stderr); if (fd > 0) close(fd); return (1); } for (bufptr = buffer + 2, bufend = buffer + bytes; bufptr < bufend;) { /* * Scan the file for a SOFn marker, then we can get the dimensions... */ if (*bufptr == 0xff) { bufptr ++; if (bufptr >= bufend) { /* * If we are at the end of the current buffer, re-fill and continue... */ if ((bytes = read(fd, buffer, sizeof(buffer))) <= 0) break; bufptr = buffer; bufend = buffer + bytes; } if (*bufptr == 0xff) continue; if ((bufptr + 16) >= bufend) { /* * Read more of the marker... */ bytes = bufend - bufptr; memmove(buffer, bufptr, (size_t)bytes); bufptr = buffer; bufend = buffer + bytes; if ((bytes = read(fd, bufend, sizeof(buffer) - (size_t)bytes)) <= 0) break; bufend += bytes; } length = (size_t)((bufptr[1] << 8) | bufptr[2]); if ((*bufptr >= 0xc0 && *bufptr <= 0xc3) || (*bufptr >= 0xc5 && *bufptr <= 0xc7) || (*bufptr >= 0xc9 && *bufptr <= 0xcb) || (*bufptr >= 0xcd && *bufptr <= 0xcf)) { /* * SOFn marker, look for dimensions... */ width = (bufptr[6] << 8) | bufptr[7]; height = (bufptr[4] << 8) | bufptr[5]; depth = bufptr[8]; break; } /* * Skip past this marker... */ bufptr ++; bytes = bufend - bufptr; while (length >= bytes) { length -= bytes; if ((bytes = read(fd, buffer, sizeof(buffer))) <= 0) break; bufptr = buffer; bufend = buffer + bytes; } if (length > bytes) break; bufptr += length; } } fprintf(stderr, "DEBUG: JPEG dimensions are %dx%dx%d\n", width, height, depth); if (width <= 0 || height <= 0 || depth <= 0) { fputs("ERROR: No valid image data in JPEG file.\n", stderr); if (fd > 0) close(fd); return (1); } fputs("ATTR: job-impressions=1\n", stderr); /* * Figure out the dimensions/scaling of the final image... */ #if CUPS_LITE page_left = 18.0f; page_top = 756.0f; page_width = 576.0f; page_height = 720.0f; #else if ((page_size = ppdPageSize(ppd, NULL)) != NULL) { page_left = page_size->left; page_top = page_size->top; page_width = page_size->right - page_left; page_height = page_top - page_size->bottom; } else { page_left = 18.0f; page_top = 756.0f; page_width = 576.0f; page_height = 720.0f; } #endif /* CUPS_LITE */ fprintf(stderr, "DEBUG: page_left=%.2f, page_top=%.2f, page_width=%.2f, page_height=%.2f\n", page_left, page_top, page_width, page_height); /* TODO: Support orientation/rotation, different print-scaling modes */ x_factor = page_width / width; y_factor = page_height / height; if (x_factor > y_factor && (height * x_factor) <= page_height) page_scaling = x_factor; else page_scaling = y_factor; fprintf(stderr, "DEBUG: Scaled dimensions are %.2fx%.2f\n", width * page_scaling, height * page_scaling); /* * Write pages... */ dsc_header(copies); for (copy = 1; copy <= copies; copy ++) { dsc_page(copy); if (depth == 1) { puts("/DeviceGray setcolorspace"); decode = "0 1"; } else if (depth == 3) { puts("/DeviceRGB setcolorspace"); decode = "0 1 0 1 0 1"; } else { puts("/DeviceCMYK setcolorspace"); decode = "0 1 0 1 0 1 0 1"; } printf("gsave %.3f %.3f translate %.3f %.3f scale\n", page_left + 0.5f * (page_width - width * page_scaling), page_top - 0.5f * (page_height - height * page_scaling), page_scaling, page_scaling); printf("<>image\n", width, height, decode); if (fd > 0) lseek(fd, 0, SEEK_SET); while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) ascii85(buffer, (int)bytes, 0); ascii85(buffer, 0, 1); puts("grestore showpage"); } dsc_trailer(0); return (0); } /* * 'pdf_to_ps()' - Convert a PDF file to PostScript. */ static int /* O - Exit status */ pdf_to_ps(const char *filename, /* I - Filename */ int copies, /* I - Number of copies */ int num_options, /* I - Number of options */ cups_option_t *options) /* I - options */ { int status; /* Exit status */ char tempfile[1024]; /* Temporary file */ int tempfd; /* Temporary file descriptor */ int pid; /* Process ID */ const char *pdf_argv[8]; /* Command-line arguments */ char pdf_options[1024]; /* Options */ const char *value; /* Option value */ const char *job_id, /* job-id value */ *job_name; /* job-name value */ /* * Create a temporary file for the PostScript version... */ if ((tempfd = cupsTempFd(tempfile, sizeof(tempfile))) < 0) { fprintf(stderr, "ERROR: Unable to create temporary file: %s\n", strerror(errno)); return (1); } /* * Run cgpdftops or pdftops in the filter directory... */ if ((value = cupsGetOption("PageSize", num_options, options)) != NULL) snprintf(pdf_options, sizeof(pdf_options), "PageSize=%s", value); else pdf_options[0] = '\0'; if ((job_id = getenv("IPP_JOB_ID")) == NULL) job_id = "42"; if ((job_name = getenv("IPP_JOB_NAME")) == NULL) job_name = "untitled"; pdf_argv[0] = "printer"; pdf_argv[1] = job_id; pdf_argv[2] = cupsUser(); pdf_argv[3] = job_name; pdf_argv[4] = "1"; pdf_argv[5] = pdf_options; pdf_argv[6] = filename; pdf_argv[7] = NULL; if ((pid = fork()) == 0) { /* * Child comes here... */ close(1); dup2(tempfd, 1); close(tempfd); execv(PDFTOPS, (char * const *)pdf_argv); exit(errno); } else if (pid < 0) { /* * Unable to fork process... */ perror("ERROR: Unable to start PDF filter"); close(tempfd); unlink(tempfile); return (1); } else { /* * Wait for the filter to complete... */ close(tempfd); # ifdef HAVE_WAITPID while (waitpid(pid, &status, 0) < 0); # else while (wait(&status) < 0); # endif /* HAVE_WAITPID */ if (status) { if (WIFEXITED(status)) fprintf(stderr, "ERROR: " PDFTOPS " exited with status %d.\n", WEXITSTATUS(status)); else fprintf(stderr, "ERROR: " PDFTOPS " terminated with signal %d.\n", WTERMSIG(status)); unlink(tempfile); return (1); } } /* * Copy the PostScript output from the command... */ status = ps_to_ps(tempfile, copies); unlink(tempfile); return (status); } /* * 'ps_to_ps()' - Copy PostScript to the standard output. */ static int /* O - Exit status */ ps_to_ps(const char *filename, /* I - Filename */ int copies) /* I - Number of copies */ { FILE *fp; /* File to read from */ int copy, /* Current copy */ page, /* Current page number */ num_pages = 0, /* Total number of pages */ first_page, /* First page */ last_page; /* Last page */ const char *page_ranges; /* page-ranges option */ long first_pos = -1; /* Offset for first page */ char line[1024]; /* Line from file */ /* * Open the print file... */ if (filename) { if ((fp = fopen(filename, "rb")) == NULL) { fprintf(stderr, "ERROR: Unable to open \"%s\": %s\n", filename, strerror(errno)); return (1); } } else { copies = 1; fp = stdin; } /* * Check page ranges... */ if ((page_ranges = getenv("IPP_PAGE_RANGES")) != NULL) { if (sscanf(page_ranges, "%d-%d", &first_page, &last_page) != 2) { first_page = 1; last_page = INT_MAX; } } else { first_page = 1; last_page = INT_MAX; } /* * Write the PostScript header for the document... */ dsc_header(0); first_pos = 0; while (fgets(line, sizeof(line), fp)) { if (!strncmp(line, "%%Page:", 7)) break; first_pos = ftell(fp); if (line[0] != '%') fputs(line, stdout); } if (!strncmp(line, "%%Page:", 7)) { for (copy = 0; copy < copies; copy ++) { int copy_page = 0; /* Do we copy the page data? */ if (fp != stdin) fseek(fp, first_pos, SEEK_SET); page = 0; while (fgets(line, sizeof(line), fp)) { if (!strncmp(line, "%%Page:", 7)) { page ++; copy_page = page >= first_page && page <= last_page; if (copy_page) { num_pages ++; dsc_page(num_pages); } } else if (copy_page) fputs(line, stdout); } } } dsc_trailer(num_pages); fprintf(stderr, "ATTR: job-impressions=%d\n", num_pages / copies); if (fp != stdin) fclose(fp); return (0); } /* * 'raster_to_ps()' - Convert PWG Raster/Apple Raster to PostScript. * * The current implementation locally-decodes the raster data and then writes * whole, non-blank lines as 1-line high images with base-85 encoding, resulting * in between 10 and 20 times larger output. A alternate implementation (if it * is deemed necessary) would be to implement a PostScript decode procedure that * handles the modified packbits decompression so that we just have the base-85 * encoding overhead (25%). Furthermore, Level 3 PostScript printers also * support Flate compression. * * That said, the most efficient path with the highest quality is for Clients * to supply PDF files and us to use the existing PDF to PostScript conversion * filters. */ static int /* O - Exit status */ raster_to_ps(const char *filename) /* I - Filename */ { int fd; /* Input file */ cups_raster_t *ras; /* Raster stream */ cups_page_header2_t header; /* Page header */ int page = 0; /* Current page */ unsigned y; /* Current line */ unsigned char *line; /* Line buffer */ unsigned char white; /* White color */ const char *decode; /* Image decode array */ /* * Open the input file... */ if (filename) { if ((fd = open(filename, O_RDONLY)) < 0) { fprintf(stderr, "ERROR: Unable to open \"%s\": %s\n", filename, strerror(errno)); return (1); } } else { fd = 0; } /* * Open the raster stream and send pages... */ if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) { fputs("ERROR: Unable to read raster data, aborting.\n", stderr); return (1); } dsc_header(0); while (cupsRasterReadHeader2(ras, &header)) { page ++; fprintf(stderr, "DEBUG: Page %d: %ux%ux%u\n", page, header.cupsWidth, header.cupsHeight, header.cupsBitsPerPixel); if (header.cupsColorSpace != CUPS_CSPACE_W && header.cupsColorSpace != CUPS_CSPACE_SW && header.cupsColorSpace != CUPS_CSPACE_K && header.cupsColorSpace != CUPS_CSPACE_RGB && header.cupsColorSpace != CUPS_CSPACE_SRGB) { fputs("ERROR: Unsupported color space, aborting.\n", stderr); break; } else if (header.cupsBitsPerColor != 1 && header.cupsBitsPerColor != 8) { fputs("ERROR: Unsupported bit depth, aborting.\n", stderr); break; } line = malloc(header.cupsBytesPerLine); dsc_page(page); puts("gsave"); printf("%.6f %.6f scale\n", 72.0f / header.HWResolution[0], 72.0f / header.HWResolution[1]); switch (header.cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_SW : decode = "0 1"; puts("/DeviceGray setcolorspace"); white = 255; break; case CUPS_CSPACE_K : decode = "0 1"; puts("/DeviceGray setcolorspace"); white = 0; break; default : decode = "0 1 0 1 0 1"; puts("/DeviceRGB setcolorspace"); white = 255; break; } printf("gsave /L{grestore gsave 0 exch translate <>image}bind def\n", header.cupsWidth, header.cupsBitsPerColor, decode); for (y = header.cupsHeight; y > 0; y --) { if (cupsRasterReadPixels(ras, line, header.cupsBytesPerLine)) { if (line[0] != white || memcmp(line, line + 1, header.cupsBytesPerLine - 1)) { printf("%d L\n", y - 1); ascii85(line, (int)header.cupsBytesPerLine, 1); } } else break; } fprintf(stderr, "DEBUG: y=%d at end...\n", y); puts("grestore grestore"); puts("showpage"); free(line); } cupsRasterClose(ras); dsc_trailer(page); fprintf(stderr, "ATTR: job-impressions=%d\n", page); return (0); } cups-2.3.1/tools/dither.h000664 000765 000024 00000050731 13574721672 015375 0ustar00mikestaff000000 000000 /* Simple ordered dither threshold matrix */ const unsigned char threshold[64][64] = { { 0, 235, 138, 22, 45, 98, 217, 2, 45, 98, 7, 185, 45, 97, 6, 192, 110, 37, 110, 37, 97, 45, 18, 148, 109, 37, 97, 45, 7, 185, 45, 97, 6, 192, 109, 37, 57, 82, 165, 12, 26, 130, 190, 6, 119, 31, 97, 45, 179, 8, 109, 37, 97, 45, 140, 22, 109, 37, 57, 82, 9, 177, 24, 135 }, { 109, 37, 57, 82, 20, 143, 57, 82, 146, 19, 57, 82, 15, 158, 87, 53, 20, 144, 13, 162, 138, 22, 53, 87, 162, 13, 138, 22, 57, 82, 22, 140, 57, 82, 153, 16, 119, 31, 109, 37, 109, 37, 57, 81, 19, 147, 213, 2, 53, 87, 21, 142, 13, 164, 53, 87, 187, 6, 152, 17, 119, 32, 110, 37 }, { 24, 135, 12, 167, 97, 45, 17, 151, 45, 97, 32, 119, 26, 130, 119, 32, 81, 58, 30, 121, 81, 58, 181, 8, 119, 32, 97, 45, 17, 151, 45, 97, 161, 14, 45, 97, 213, 2, 135, 24, 7, 183, 138, 22, 109, 37, 58, 81, 121, 30, 109, 37, 58, 81, 30, 121, 58, 81, 127, 27, 58, 81, 165, 12 }, { 58, 81, 31, 119, 5, 197, 58, 81, 9, 175, 206, 3, 58, 81, 10, 174, 222, 1, 45, 97, 206, 3, 124, 29, 58, 81, 4, 200, 58, 81, 2, 217, 58, 81, 27, 127, 108, 37, 58, 81, 30, 121, 58, 81, 167, 12, 25, 132, 15, 158, 5, 197, 135, 24, 206, 3, 142, 21, 45, 97, 203, 3, 119, 32 }, { 6, 190, 108, 38, 97, 45, 143, 20, 108, 38, 97, 45, 148, 18, 108, 38, 58, 81, 148, 18, 119, 32, 97, 45, 16, 153, 97, 45, 143, 20, 46, 97, 32, 119, 6, 187, 25, 132, 13, 164, 46, 97, 1, 222, 119, 32, 108, 38, 108, 38, 108, 38, 108, 38, 108, 38, 58, 81, 8, 179, 123, 29, 97, 46 }, { 58, 81, 161, 14, 147, 19, 53, 87, 22, 138, 14, 159, 87, 53, 22, 138, 14, 159, 108, 38, 87, 53, 177, 9, 53, 87, 14, 161, 58, 81, 22, 137, 12, 167, 108, 38, 108, 38, 81, 58, 153, 16, 123, 29, 53, 87, 187, 6, 162, 13, 132, 25, 11, 168, 25, 132, 12, 165, 119, 32, 81, 58, 14, 161 }, { 140, 22, 108, 38, 81, 58, 8, 181, 108, 38, 97, 46, 8, 181, 58, 81, 31, 119, 7, 185, 147, 19, 58, 81, 127, 27, 97, 46, 8, 179, 108, 38, 58, 81, 21, 142, 13, 162, 5, 194, 108, 38, 58, 81, 15, 156, 87, 53, 30, 121, 108, 38, 108, 38, 58, 81, 127, 27, 97, 46, 16, 153, 97, 46 }, { 58, 81, 2, 217, 123, 29, 36, 111, 1, 227, 138, 22, 97, 46, 4, 203, 108, 38, 108, 38, 97, 46, 23, 137, 222, 1, 112, 36, 58, 81, 6, 192, 137, 23, 53, 87, 30, 121, 58, 80, 23, 137, 183, 7, 36, 111, 26, 130, 59, 80, 0, 235, 130, 26, 192, 6, 46, 97, 222, 1, 53, 87, 194, 5 }, { 17, 151, 46, 97, 172, 10, 59, 80, 27, 127, 59, 80, 18, 148, 59, 80, 172, 10, 24, 135, 4, 200, 80, 59, 36, 112, 167, 12, 137, 23, 108, 38, 97, 46, 0, 235, 46, 97, 144, 20, 46, 97, 127, 27, 53, 87, 3, 206, 147, 19, 108, 38, 108, 38, 80, 59, 151, 17, 80, 59, 27, 127, 96, 46 }, { 58, 81, 126, 27, 96, 46, 15, 156, 46, 97, 172, 10, 46, 96, 14, 159, 119, 32, 59, 80, 32, 119, 156, 15, 53, 87, 27, 127, 59, 80, 21, 142, 10, 172, 80, 59, 177, 9, 80, 59, 2, 213, 59, 80, 14, 161, 108, 38, 59, 79, 23, 137, 11, 168, 137, 23, 46, 96, 32, 119, 13, 164, 140, 22 }, { 6, 190, 152, 17, 112, 36, 59, 79, 6, 187, 59, 79, 30, 121, 108, 38, 96, 46, 15, 156, 46, 96, 29, 123, 183, 7, 46, 96, 209, 3, 46, 96, 32, 118, 26, 130, 96, 46, 15, 158, 46, 96, 16, 153, 46, 96, 32, 118, 10, 172, 108, 38, 108, 38, 59, 79, 179, 8, 141, 21, 59, 79, 32, 119 }, { 87, 53, 36, 112, 203, 4, 137, 23, 96, 46, 23, 137, 4, 200, 24, 135, 235, 0, 87, 53, 8, 179, 108, 38, 87, 53, 15, 156, 53, 87, 156, 15, 59, 79, 156, 15, 119, 32, 59, 79, 30, 121, 59, 79, 6, 190, 151, 17, 59, 79, 187, 6, 26, 130, 3, 206, 108, 38, 96, 46, 206, 3, 110, 37 }, { 142, 21, 59, 79, 28, 126, 59, 79, 144, 20, 59, 79, 119, 32, 60, 79, 32, 118, 27, 129, 87, 53, 3, 209, 118, 32, 60, 79, 126, 28, 96, 46, 5, 194, 46, 96, 197, 5, 134, 24, 7, 183, 137, 23, 46, 96, 36, 112, 28, 126, 108, 38, 108, 38, 60, 79, 148, 18, 118, 32, 60, 79, 167, 12 }, { 37, 109, 174, 10, 46, 95, 10, 174, 47, 95, 170, 11, 47, 95, 9, 177, 47, 95, 14, 159, 118, 32, 60, 79, 170, 11, 134, 24, 183, 7, 112, 36, 79, 60, 140, 22, 108, 38, 107, 38, 107, 39, 79, 60, 17, 149, 60, 79, 213, 2, 24, 135, 177, 9, 159, 14, 47, 95, 9, 175, 137, 23, 47, 95 }, { 0, 235, 60, 79, 18, 149, 87, 53, 217, 2, 53, 87, 156, 15, 86, 53, 16, 153, 54, 86, 167, 12, 137, 23, 107, 39, 60, 79, 36, 112, 172, 10, 147, 19, 47, 95, 19, 147, 9, 175, 132, 25, 1, 227, 36, 110, 9, 175, 112, 36, 60, 79, 30, 121, 60, 79, 126, 28, 112, 36, 60, 79, 19, 147 }, { 37, 109, 140, 22, 47, 95, 30, 121, 60, 78, 30, 121, 61, 78, 32, 118, 61, 78, 200, 4, 112, 36, 61, 78, 19, 147, 227, 1, 47, 95, 27, 129, 86, 54, 2, 217, 54, 86, 28, 126, 61, 78, 126, 28, 61, 78, 129, 26, 95, 47, 15, 158, 47, 95, 20, 144, 1, 222, 95, 47, 6, 190, 47, 95 }, { 13, 164, 61, 78, 4, 200, 162, 13, 24, 134, 183, 7, 24, 134, 213, 2, 142, 21, 123, 29, 95, 47, 192, 6, 107, 39, 86, 54, 153, 16, 54, 86, 30, 121, 61, 78, 30, 121, 95, 47, 170, 11, 47, 95, 10, 172, 47, 94, 179, 8, 61, 78, 4, 200, 107, 39, 61, 78, 22, 140, 61, 78, 23, 137 }, { 37, 109, 31, 120, 107, 39, 107, 39, 107, 39, 107, 39, 61, 78, 121, 30, 107, 39, 61, 78, 19, 146, 86, 54, 23, 137, 13, 164, 61, 77, 200, 4, 159, 14, 131, 25, 13, 164, 4, 200, 86, 54, 18, 148, 54, 86, 203, 4, 94, 47, 19, 146, 47, 94, 23, 137, 13, 161, 47, 94, 17, 151, 47, 94 }, { 26, 131, 6, 187, 158, 15, 26, 131, 4, 203, 26, 131, 177, 9, 47, 94, 14, 159, 10, 174, 94, 47, 151, 17, 61, 77, 32, 118, 27, 129, 118, 32, 107, 39, 107, 39, 86, 54, 126, 28, 118, 32, 61, 77, 31, 120, 77, 61, 126, 28, 86, 54, 14, 161, 107, 39, 77, 61, 6, 190, 61, 77, 3, 206 }, { 107, 39, 61, 77, 121, 30, 86, 54, 121, 30, 107, 39, 61, 77, 16, 153, 107, 39, 86, 54, 1, 222, 94, 47, 8, 179, 47, 94, 174, 10, 54, 86, 11, 168, 5, 194, 144, 20, 86, 54, 17, 152, 3, 209, 162, 13, 134, 24, 12, 167, 123, 29, 61, 77, 7, 185, 136, 23, 47, 94, 32, 118, 27, 127 }, { 164, 13, 144, 20, 94, 47, 174, 10, 61, 77, 11, 170, 123, 29, 37, 110, 5, 194, 123, 29, 86, 54, 20, 143, 61, 77, 3, 206, 61, 77, 18, 148, 118, 32, 85, 54, 32, 118, 177, 9, 85, 55, 28, 126, 106, 39, 106, 39, 61, 77, 0, 235, 118, 32, 106, 39, 61, 77, 19, 147, 177, 9, 81, 58 }, { 106, 39, 77, 61, 222, 1, 94, 47, 18, 149, 48, 93, 227, 1, 85, 55, 29, 123, 168, 11, 112, 36, 85, 55, 33, 117, 27, 129, 117, 33, 106, 39, 94, 47, 149, 18, 77, 61, 27, 129, 117, 33, 61, 77, 20, 144, 6, 190, 117, 33, 55, 85, 159, 14, 26, 131, 3, 209, 117, 32, 94, 47, 16, 153 }, { 5, 194, 123, 29, 55, 85, 19, 146, 62, 77, 126, 28, 37, 110, 156, 15, 62, 77, 36, 112, 17, 151, 194, 5, 151, 17, 77, 62, 17, 152, 2, 217, 175, 9, 93, 47, 227, 0, 48, 93, 6, 192, 168, 11, 117, 33, 77, 62, 161, 14, 140, 22, 106, 39, 106, 39, 106, 39, 62, 77, 28, 126, 81, 58 }, { 47, 94, 153, 16, 123, 29, 85, 55, 5, 197, 152, 17, 62, 77, 29, 123, 10, 174, 48, 93, 28, 126, 106, 39, 93, 48, 8, 181, 106, 39, 62, 77, 33, 117, 144, 20, 62, 77, 18, 148, 106, 39, 106, 39, 93, 48, 18, 147, 48, 93, 33, 117, 192, 6, 164, 13, 131, 26, 14, 158, 227, 1, 140, 22 }, { 13, 164, 85, 55, 10, 174, 117, 33, 106, 39, 93, 48, 10, 172, 106, 39, 62, 77, 2, 209, 62, 77, 161, 14, 142, 21, 62, 77, 33, 117, 143, 20, 106, 39, 93, 48, 22, 138, 48, 93, 158, 15, 131, 26, 1, 217, 85, 55, 200, 4, 106, 39, 105, 39, 105, 40, 105, 40, 105, 40, 105, 40, 87, 53 }, { 85, 55, 120, 31, 62, 77, 6, 187, 142, 21, 123, 29, 85, 55, 5, 194, 123, 29, 37, 110, 179, 8, 117, 33, 85, 55, 23, 136, 6, 192, 62, 77, 10, 174, 5, 197, 62, 77, 8, 179, 105, 40, 105, 40, 85, 55, 120, 31, 62, 77, 167, 12, 26, 131, 15, 158, 5, 194, 168, 11, 147, 19, 118, 32 }, { 135, 24, 3, 209, 136, 23, 105, 40, 62, 76, 209, 3, 123, 29, 63, 76, 15, 155, 63, 76, 27, 129, 93, 48, 0, 235, 105, 40, 93, 48, 17, 151, 48, 93, 33, 116, 16, 155, 37, 110, 4, 203, 162, 13, 24, 134, 11, 168, 136, 23, 105, 40, 105, 40, 105, 40, 63, 76, 126, 28, 85, 55, 6, 190 }, { 37, 109, 33, 117, 63, 76, 21, 142, 12, 165, 48, 93, 16, 155, 123, 29, 93, 48, 11, 170, 48, 93, 16, 155, 55, 85, 170, 11, 136, 23, 63, 76, 146, 19, 63, 76, 27, 129, 76, 63, 27, 129, 116, 33, 76, 63, 33, 117, 63, 76, 19, 147, 217, 2, 168, 11, 142, 21, 48, 93, 120, 31, 80, 59 }, { 175, 9, 93, 49, 10, 172, 105, 40, 63, 76, 125, 28, 85, 55, 8, 179, 117, 33, 84, 55, 197, 5, 55, 84, 27, 129, 116, 33, 93, 49, 213, 2, 49, 93, 11, 170, 49, 93, 172, 10, 105, 40, 93, 49, 5, 194, 49, 93, 192, 6, 116, 33, 63, 76, 120, 31, 63, 76, 3, 206, 162, 13, 26, 131 }, { 37, 109, 18, 149, 63, 76, 0, 235, 131, 26, 187, 6, 116, 33, 84, 55, 1, 222, 140, 22, 63, 76, 33, 116, 8, 179, 84, 55, 158, 15, 55, 84, 27, 129, 84, 55, 217, 2, 55, 84, 20, 144, 10, 174, 55, 84, 149, 18, 122, 29, 93, 49, 20, 143, 49, 93, 15, 158, 116, 33, 105, 40, 80, 59 }, { 138, 22, 93, 49, 22, 138, 105, 40, 105, 40, 63, 76, 159, 14, 136, 23, 63, 75, 33, 116, 164, 13, 144, 20, 93, 49, 5, 194, 63, 75, 33, 116, 185, 7, 116, 33, 75, 63, 31, 120, 104, 40, 75, 63, 31, 120, 104, 41, 75, 63, 181, 8, 84, 55, 6, 192, 104, 41, 84, 55, 21, 142, 217, 2 }, { 84, 55, 197, 5, 55, 84, 19, 146, 13, 164, 140, 22, 104, 41, 93, 49, 18, 149, 49, 93, 28, 125, 63, 75, 125, 28, 93, 49, 21, 141, 11, 168, 63, 75, 165, 12, 24, 134, 15, 158, 209, 3, 26, 131, 15, 158, 1, 227, 144, 20, 49, 93, 16, 153, 63, 75, 23, 136, 10, 172, 63, 75, 120, 30 }, { 14, 161, 75, 63, 177, 8, 116, 33, 75, 63, 33, 116, 2, 213, 175, 9, 63, 75, 190, 6, 92, 49, 2, 213, 152, 17, 111, 36, 63, 75, 36, 112, 27, 129, 111, 36, 104, 41, 104, 41, 104, 41, 104, 41, 104, 41, 104, 41, 75, 63, 125, 28, 92, 49, 14, 161, 104, 41, 92, 49, 7, 185, 49, 92 }, { 47, 94, 144, 20, 122, 30, 92, 49, 5, 197, 49, 92, 28, 125, 92, 49, 143, 20, 49, 92, 18, 149, 75, 63, 36, 112, 11, 168, 222, 1, 49, 92, 203, 4, 55, 84, 190, 6, 162, 13, 26, 130, 190, 6, 164, 13, 26, 130, 13, 162, 206, 3, 122, 30, 84, 55, 0, 235, 122, 30, 84, 55, 16, 152 }, { 6, 192, 116, 33, 75, 63, 16, 155, 63, 74, 15, 156, 64, 74, 20, 143, 84, 55, 22, 138, 92, 49, 143, 20, 49, 92, 27, 129, 55, 84, 156, 15, 56, 84, 16, 155, 116, 33, 104, 41, 104, 41, 104, 41, 104, 41, 104, 41, 103, 41, 64, 74, 181, 8, 115, 33, 64, 74, 152, 17, 122, 30, 80, 59 }, { 103, 41, 92, 49, 213, 2, 49, 92, 28, 125, 92, 49, 6, 185, 92, 49, 3, 206, 64, 74, 7, 185, 64, 74, 190, 6, 64, 74, 31, 120, 64, 74, 33, 117, 103, 41, 64, 74, 20, 144, 8, 181, 24, 134, 15, 158, 5, 197, 141, 21, 122, 30, 56, 84, 19, 146, 13, 164, 50, 91, 203, 4, 112, 36 }, { 24, 134, 12, 167, 56, 84, 34, 115, 172, 10, 136, 23, 64, 74, 18, 149, 92, 49, 18, 149, 91, 49, 15, 156, 50, 91, 20, 144, 7, 183, 24, 134, 183, 7, 24, 134, 235, 0, 50, 91, 31, 120, 64, 74, 125, 28, 115, 34, 64, 74, 161, 14, 115, 34, 103, 41, 64, 74, 125, 28, 37, 110, 165, 12 }, { 103, 41, 64, 74, 23, 136, 185, 7, 103, 41, 91, 50, 20, 143, 50, 91, 22, 138, 56, 84, 31, 120, 64, 74, 31, 120, 103, 41, 103, 41, 64, 74, 31, 120, 103, 41, 64, 74, 125, 28, 91, 50, 217, 2, 103, 41, 91, 50, 10, 174, 50, 91, 22, 140, 200, 4, 134, 24, 7, 183, 65, 74, 28, 126 }, { 227, 1, 146, 19, 103, 41, 65, 74, 21, 142, 227, 1, 65, 74, 6, 190, 65, 74, 9, 175, 0, 235, 24, 134, 206, 3, 162, 13, 130, 26, 213, 2, 50, 91, 13, 162, 131, 26, 185, 7, 152, 17, 65, 74, 170, 11, 144, 20, 56, 84, 1, 222, 103, 41, 103, 41, 103, 41, 91, 50, 175, 9, 50, 91 }, { 49, 93, 33, 116, 6, 187, 136, 23, 50, 91, 33, 116, 18, 149, 50, 91, 19, 147, 103, 41, 103, 41, 102, 41, 102, 42, 102, 42, 102, 42, 65, 74, 21, 141, 102, 42, 102, 42, 65, 74, 125, 28, 115, 34, 102, 42, 65, 74, 31, 119, 65, 74, 167, 12, 26, 130, 12, 165, 115, 34, 84, 56, 151, 17 }, { 148, 18, 102, 42, 102, 42, 84, 56, 174, 10, 102, 42, 65, 74, 22, 140, 65, 74, 159, 14, 131, 26, 11, 168, 26, 131, 15, 158, 7, 185, 159, 14, 50, 91, 5, 197, 168, 11, 141, 21, 50, 91, 179, 8, 24, 134, 4, 203, 162, 13, 142, 21, 102, 42, 102, 42, 65, 74, 2, 217, 140, 22, 80, 59 }, { 49, 92, 9, 175, 24, 133, 3, 209, 65, 74, 19, 146, 185, 7, 90, 50, 3, 209, 102, 42, 65, 74, 31, 120, 102, 42, 65, 74, 31, 120, 65, 73, 34, 115, 27, 129, 115, 34, 56, 84, 203, 4, 111, 36, 65, 73, 125, 28, 102, 42, 65, 73, 23, 136, 192, 6, 136, 23, 102, 42, 90, 50, 6, 187 }, { 31, 119, 102, 42, 102, 42, 90, 50, 138, 22, 102, 42, 65, 73, 125, 28, 65, 73, 21, 141, 194, 5, 50, 90, 192, 6, 141, 21, 50, 90, 21, 141, 6, 187, 102, 42, 65, 73, 16, 155, 122, 30, 90, 50, 14, 161, 50, 90, 34, 115, 200, 4, 102, 42, 102, 42, 84, 56, 18, 149, 115, 34, 79, 59 }, { 209, 3, 25, 133, 6, 187, 146, 19, 65, 73, 203, 4, 134, 24, 11, 168, 111, 36, 102, 42, 65, 73, 19, 147, 102, 42, 65, 73, 1, 227, 102, 42, 65, 73, 19, 146, 217, 2, 115, 34, 56, 84, 17, 152, 73, 65, 177, 9, 151, 17, 73, 65, 165, 12, 131, 26, 175, 9, 73, 65, 9, 174, 24, 134 }, { 33, 117, 102, 42, 65, 73, 34, 115, 11, 170, 115, 34, 65, 73, 36, 111, 181, 7, 168, 11, 136, 23, 50, 90, 161, 14, 146, 19, 50, 90, 159, 14, 136, 23, 102, 42, 102, 42, 73, 65, 7, 183, 90, 50, 1, 227, 50, 90, 36, 111, 27, 129, 115, 34, 72, 65, 34, 115, 27, 127, 111, 36, 79, 59 }, { 50, 90, 164, 13, 141, 21, 102, 42, 102, 42, 90, 50, 15, 156, 50, 90, 27, 127, 115, 34, 66, 72, 2, 217, 102, 42, 66, 72, 22, 138, 102, 42, 66, 72, 167, 12, 133, 25, 12, 165, 37, 110, 28, 125, 72, 66, 143, 20, 72, 66, 179, 8, 90, 50, 235, 0, 51, 90, 203, 4, 90, 50, 7, 183 }, { 17, 152, 101, 42, 66, 72, 235, 0, 25, 133, 8, 181, 66, 72, 222, 1, 101, 43, 90, 50, 17, 152, 51, 90, 23, 136, 185, 7, 51, 90, 9, 175, 203, 4, 114, 34, 72, 66, 125, 28, 72, 66, 172, 10, 146, 19, 90, 51, 209, 3, 51, 90, 153, 16, 56, 84, 16, 155, 56, 84, 16, 155, 87, 53 }, { 84, 56, 6, 192, 151, 17, 114, 35, 72, 66, 35, 114, 27, 127, 37, 110, 17, 152, 197, 5, 84, 56, 14, 161, 101, 43, 72, 66, 18, 149, 72, 66, 125, 28, 90, 51, 190, 6, 51, 90, 3, 206, 51, 90, 35, 114, 11, 170, 66, 72, 159, 14, 66, 72, 28, 125, 66, 72, 31, 119, 66, 72, 127, 27 }, { 111, 36, 66, 72, 124, 28, 90, 51, 16, 155, 51, 90, 16, 155, 66, 72, 29, 124, 66, 72, 124, 29, 66, 72, 5, 192, 136, 23, 51, 90, 144, 19, 51, 90, 149, 18, 56, 83, 18, 149, 66, 72, 142, 20, 101, 43, 84, 56, 31, 119, 83, 56, 35, 114, 170, 10, 25, 133, 183, 7, 133, 25, 1, 222 }, { 172, 10, 141, 21, 51, 90, 170, 11, 83, 56, 4, 200, 89, 51, 11, 170, 52, 89, 21, 141, 183, 7, 114, 35, 101, 43, 66, 72, 2, 213, 66, 72, 8, 179, 66, 72, 22, 140, 52, 89, 147, 19, 52, 89, 203, 4, 133, 25, 8, 181, 25, 133, 4, 200, 101, 43, 66, 72, 114, 35, 83, 56, 36, 111 }, { 28, 126, 66, 72, 3, 206, 37, 110, 29, 124, 72, 66, 31, 119, 71, 66, 4, 203, 101, 43, 67, 71, 167, 12, 25, 133, 12, 165, 52, 89, 29, 124, 89, 52, 0, 235, 52, 89, 177, 9, 56, 83, 11, 170, 114, 35, 67, 71, 35, 114, 101, 43, 67, 71, 35, 114, 2, 213, 52, 89, 177, 9, 79, 59 }, { 51, 90, 15, 156, 122, 30, 67, 71, 8, 181, 133, 25, 185, 7, 141, 21, 52, 89, 16, 155, 114, 35, 101, 43, 101, 43, 67, 71, 36, 111, 165, 12, 136, 23, 56, 83, 31, 119, 67, 71, 35, 114, 127, 27, 89, 52, 15, 156, 52, 89, 167, 12, 133, 25, 12, 165, 83, 56, 16, 155, 89, 52, 15, 156 }, { 6, 192, 101, 43, 89, 52, 148, 18, 101, 43, 101, 43, 101, 43, 67, 71, 124, 29, 67, 71, 0, 235, 25, 133, 200, 4, 133, 25, 183, 7, 101, 43, 67, 71, 19, 146, 187, 6, 133, 25, 217, 2, 67, 71, 8, 181, 67, 71, 1, 222, 114, 35, 101, 43, 67, 71, 31, 119, 67, 71, 31, 119, 79, 59 }, { 51, 90, 23, 135, 10, 172, 67, 71, 24, 135, 222, 1, 26, 130, 15, 158, 10, 174, 114, 35, 100, 43, 67, 71, 31, 119, 67, 70, 35, 114, 21, 141, 5, 194, 114, 35, 100, 43, 100, 43, 89, 52, 16, 155, 52, 89, 27, 127, 122, 30, 56, 83, 197, 5, 132, 25, 8, 181, 25, 133, 206, 3, 137, 23 }, { 18, 149, 100, 43, 89, 52, 194, 5, 100, 43, 100, 43, 100, 43, 100, 43, 68, 70, 7, 185, 26, 131, 175, 9, 52, 88, 11, 170, 100, 43, 100, 43, 100, 43, 68, 70, 21, 141, 12, 165, 111, 36, 68, 70, 35, 113, 16, 155, 56, 83, 16, 155, 113, 35, 68, 70, 35, 113, 68, 70, 113, 35, 79, 59 }, { 52, 88, 227, 1, 135, 24, 68, 70, 167, 12, 26, 130, 13, 162, 209, 3, 135, 24, 100, 43, 100, 43, 83, 56, 18, 148, 56, 83, 1, 222, 162, 13, 132, 25, 12, 167, 52, 88, 35, 113, 7, 183, 25, 133, 4, 203, 56, 83, 175, 9, 122, 30, 88, 52, 15, 156, 52, 88, 168, 11, 52, 88, 181, 8 }, { 27, 129, 113, 35, 88, 52, 20, 143, 100, 43, 100, 43, 100, 43, 99, 43, 68, 70, 19, 146, 5, 194, 113, 35, 68, 70, 35, 113, 29, 124, 99, 44, 99, 44, 68, 70, 2, 213, 68, 70, 29, 124, 99, 44, 68, 70, 31, 119, 99, 44, 70, 68, 177, 9, 70, 68, 227, 1, 83, 56, 16, 153, 56, 83 }, { 170, 11, 70, 68, 10, 174, 68, 70, 19, 146, 197, 5, 158, 15, 130, 26, 175, 9, 113, 35, 56, 83, 21, 140, 3, 209, 152, 17, 56, 83, 21, 141, 4, 197, 122, 30, 88, 52, 16, 153, 52, 88, 165, 12, 132, 25, 183, 7, 25, 132, 213, 2, 88, 52, 143, 20, 52, 88, 119, 31, 68, 70, 32, 118 }, { 88, 52, 19, 147, 88, 52, 213, 2, 99, 44, 99, 44, 99, 44, 99, 44, 99, 44, 68, 70, 161, 14, 111, 36, 99, 44, 68, 70, 7, 183, 99, 44, 70, 68, 16, 153, 122, 30, 70, 68, 5, 197, 113, 35, 68, 70, 35, 113, 68, 70, 35, 113, 29, 124, 68, 70, 24, 135, 187, 6, 25, 132, 3, 209 }, { 31, 119, 70, 68, 124, 29, 82, 57, 21, 141, 13, 164, 132, 25, 187, 6, 25, 132, 217, 2, 122, 30, 70, 68, 18, 148, 122, 30, 37, 110, 16, 153, 122, 30, 56, 82, 10, 172, 113, 35, 99, 44, 88, 52, 0, 235, 52, 88, 14, 159, 52, 88, 17, 152, 5, 194, 99, 44, 99, 44, 99, 44, 79, 60 }, { 13, 162, 200, 4, 167, 11, 111, 36, 68, 70, 119, 31, 68, 70, 119, 31, 98, 44, 98, 45, 87, 52, 6, 190, 53, 87, 9, 177, 57, 82, 30, 122, 8, 179, 113, 35, 69, 68, 7, 185, 132, 25, 12, 164, 57, 82, 17, 152, 69, 69, 177, 9, 69, 69, 35, 113, 165, 12, 26, 130, 11, 168, 132, 25 }, { 37, 109, 69, 69, 36, 111, 17, 151, 190, 6, 53, 87, 1, 227, 53, 87, 10, 174, 130, 26, 14, 159, 69, 69, 20, 143, 69, 69, 206, 3, 98, 45, 69, 69, 1, 227, 142, 21, 98, 45, 98, 45, 69, 69, 124, 29, 37, 110, 5, 197, 87, 53, 20, 143, 53, 87, 29, 124, 98, 45, 98, 45, 79, 60 }, { 26, 130, 14, 159, 53, 87, 29, 124, 82, 57, 18, 148, 82, 57, 18, 148, 98, 45, 98, 45, 87, 53, 138, 22, 53, 87, 124, 29, 37, 110, 165, 12, 142, 21, 98, 45, 69, 69, 24, 135, 3, 209, 132, 25, 181, 8, 82, 57, 27, 127, 113, 35, 82, 57, 177, 9, 57, 82, 213, 2, 25, 132, 6, 187 }, { 37, 109, 61, 78, 8, 179, 61, 78, 20, 143, 66, 72, 22, 138, 66, 72, 24, 135, 4, 200, 175, 9, 72, 66, 1, 227, 151, 17, 72, 66, 29, 124, 68, 70, 24, 135, 181, 8, 98, 45, 98, 45, 98, 45, 68, 70, 18, 148, 70, 68, 17, 151, 222, 1, 70, 68, 18, 148, 112, 35, 98, 45, 78, 61 } }; cups-2.3.1/tools/printer.opacity000664 000765 000024 00000122410 13574721672 017014 0ustar00mikestaff000000 000000 bplist00X$versionX$objectsY$archiverT$topcopqrswxJ&'789:;<=>FJOTAbW^fpv|     69<AFKNOPQRSTWYafv|}~"#$%&'(,@CHMRSTUVWX]gt  !"#$(<?DINOPQRSTYflm 36;@EFGHIJKPcp|   !"#';>CHMNOPQRSXco{ $0<HPQRSTUVWXYZ[\dst %45HKNSX]`abcdefj~     " # $ % & ' ( , @ C H M R S T U V W X ] h t   $ ' * / 4 9 < = > ? @ A B F Z ] b g l m n o p q r w         & ' ( ) < ? D I N O P Q R S T X l o t y ~   ! $ ' , 1 6 9 : ; < = > ? C W Z _ d i l m n o p q r w |     % * + , - . / 0 4 H K P U Z [ \ ] ^ _ ` e u { ~   "06789LOTY^_`abcdei}-./Rbcdefghlptz9{|}~: !"#$%&+=>?@ABCDNOPWXYcdefnopqr~<U$null0  !"#$%&'()*+,-./0123456789:;<=>??ABC::DEFGHI:JKLMAO?QRSTJAVWXYZC\]^_?CZbEUNSRGB\NSColorSpace_NSCustomColorSpaceJ0 0 0 0.513G"HITNSID2yzKL\NSColorSpaceMN\NSColorSpaceXNSObjectyzPQWNSColorRSWNSColorXNSObject#V yzXYXPCFilterZ[\]XPCFilterZPCDrawableXPCObjectXNSObjectyz_`]PCFilterLayerabcde]PCFilterLayerWPCLayerZPCDrawableXPCObjectXNSObject"::bhiAkmb=: >@"?sC9;de"wynz< "iJ:WPrinterde"n? "J9e"vA5f0M "bCAWAbWAWbTrectSisIVcomTypWfilPropSshXTantiSflVTvecsUstrosSshYUalPixSangSflHB C jX9 _{{0, 0}, {0, 0}}"b::?::AVrelLP2SblHWgradAngUradGCTfilTWrelRadCVfilPosSaEqStypXrelLinP1VfilColVrelLP1UfilImVothColXrelLinP2SgEqUfilGrSrEqXgradStopUpgNumSbEqQ#@ MNWVPDOEARTSFU ?@"CEF0 0 03?@"CEL0.6 0.6 0.63e"GJL"?W=ValtColSlocScolCHI@"<EWNSWhiteB13yz^PCGradientStop^PCGradientStopZPCDrawableXPCObjectXNSObject"?CKI?@"CEL0.6 0.6 0.63yz^NSMutableArrayWNSArrayXNSObjectV{0, 0}V{0, 0}_{0, -0.38275384010550079}_{0, -0.59095584796146183}_{0, -0.38275384010550079}_{0, -0.59095584796146183}Q0QtW100 - tS100yz_PCDrawVectorProperties_PCDrawVectorPropertiesZPCDrawableXPCObjectXNSObjecte"YL" !"b$%:&':)?+,:A/J:]3:5TcapSSposUinvisSwidUdashSd`#@VaiVcb[A eTZS\Uf@"7<EB03?@":CEL0.4 0.4 0.43e"=>?]^L"?W]YZI"?IY_I?@"LCEL0.4 0.4 0.43V{0, 0}V{0, 0}_{0, -0.38275384010550079}_{0, -0.59095584796146183}_{0, -0.38275384010550079}_{0, -0.59095584796146183}e"UvVWgh yzZ[_PCStrokeVectorProperties\]^_`_PCStrokeVectorProperties_PCDrawVectorPropertiesZPCDrawableXPCObjectXNSObjecte"bvcdk ghi"jkbAnWAbqrWAWbUdimLKVcornRXVcornRYlo p {A de"wynxmzn ]cornerRadiusX]cornerRadiusY_5{{19.002601226657074, 14.001547070515279}, {100, 64}}"bC:=?c:CbyuvWVxHwqkzTSrU?@"CEL0.6 0.6 0.63e"stL"?nW=pHI"?npqIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"|L" !b%:':?c:AJ:]CiV}k TZS~U?@"CEL0.4 0.4 0.43e"ȀL"?W]|ZI"?|}IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vVWgh yz\PCRectVector\PCRectVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectXNSObjectghi"bAWAbWWqWAWb A de"nxmzn _4{{47.002601226657077, 64.501547070515272}, {76, 14}}"b%C:=?d : CbWVHTSU?@"CEL0.6 0.6 0.63e"L"?W=HI"?IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e")*L" !-b/%:0':3?56d:A9J:]=C?iV TZSU?@"ACEL0.4 0.4 0.43e"DEFL"?*W]ZI"?*6IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"YvVWgh yz^__PCPathGroupVector`abcdef_PCPathGroupVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectXNSObject"bCAkWAbnpWAWbB €9 "ubw:x:{|}?::AWVTS ?@"CEO'0.1897665858 0.1897609085 0.18976412713?@"CEL0.6 0.6 0.63e"L"?kW=HI"?kI?@"CEL0.6 0.6 0.63V{0, 0}V{0, 0}_{0, -0.3827538401055009}_{0, -0.59095584796146183}_{0, -0.3827538401055009}_{0, -0.59095584796146183}W100 - te"L" !b%:':?:AJ:]:iV TZS?@"CEL0.4 0.4 0.43e"ĀL"?W]ZI"?I?@"CEL0.4 0.4 0.43V{0, 0}V{0, 0}_{0, -0.3827538401055009}_{0, -0.59095584796146183}_{0, -0.3827538401055009}_{0, -0.59095584796146183}e"vVWgh e"vÀ ghi"bAWAbqWAWbĀ Ӏ de"nšƀ ]cornerRadiusX]cornerRadiusY_{{8, 9}, {100, 64}}"bC:=?: Cb̀΀WVЀHπɀÀҀTSʀ?@" CEL0.6 0.6 0.63e"ˀ̀L"?W=ȀHI"?ȀɀIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"%&ԀL" !)b+%:,':/?12:A5J:]9C;ـڀiV܀ۀՀ ހTZSր?@"=CEL0.4 0.4 0.43e"@AB׀؀L"?&W]ԀZI"?&2ԀՀIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"UvVWgh ghi"Z[bA^WAbWWqbWAWb  de"ginšƀ _{{36, 59.5}, {76, 14}}"nb%pCq:t=v?xz:}CbWVHTS倳?@"CEL0.6 0.6 0.63e"L"?^W=HI"?^xIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"L" !b%:':?:AJ:]CiV TZS񀳀?@"CEL0.4 0.4 0.43e"L"?W]ZI"?IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vVWgh "bAWAbWAWbVfConPtVconPtsVlConPt3 4 9 _{{101, 9}, {18, 56}}"b%C::?:CA WV  TS ?@"CEO$0.192297894 0.192297894 0.1922978943?@"CEO'0.2923743207 0.2923743207 0.29237432073e"L"?WI?@"CEO*0.01031759511 0.01031759511 0.010317595113"?I"?#@;+ \I?@"CEO'0.2265200408 0.2265200408 0.22652004083V{0, 0}V{0, 0}_{17, -28.000000000000004}_{94.444444444444443, -50}_{0, 28.000000000000018}_{0, 50.000000000000028}e" L" ! b"%:#':&?():A,J:]0C2iV TZS?@"4CEL0.4 0.4 0.43e"789L"?W] ZI"?) IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"LvVWgh QRSTUVWX"bAb]^b`ab:YhasConPt1VcPLinkUisCloRptTnextYhasConPt2VconPt1VconPt2 012 VX"dTWQRUSbfbiCjbAnbTprev/ -. VX"dTWQRUSbrb^uCvbAzb, *+ VX"dTWQRUSb~bnCbAb) '( VX"dTWQRUSbbzCbAb& $% VX"dTWQRUSbbCbAb# !" QSR"VdbCAAbb  yz]PCCustomPoint]PCCustomPointZPCDrawableXPCObjectXNSObjectY{108, 16}Y{108, 16}Y{108, 16}Y{108, 59}Y{108, 59}Y{108, 59}Y{119, 65}Y{119, 65}Y{119, 65}Y{119, 19}Y{119, 19}Y{119, 19}Y{114, 14}Y{114, 14}Y{114, 14}X{101, 9}X{101, 9}X{101, 9}e"^nzځLyz^PCCustomVector^PCCustomVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectXNSObject"bAWAbWAWb6Te 7 4XG9 _{{35, 59}, {84, 6}}"b%C::?:CAEABWVD8C95FTS: ?@"CEO'0.1790293818 0.1790293818 0.17902938183?@"CEL0.6 0.6 0.63e";=?L"?W7I?@"CEO'0.3288255774 0.3288255774 0.32882557743"?7#@GS@I?@"CEO'0.2026154891 0.2026154891 0.20261548913V{0, 0}V{0, 0}_{0, -3.0000000000000071}_{0, -50.000000000000121}_{0, 3.0000000000000142}_{0, 50.000000000000242}e"$%HL" !(b*%:+':.?01:A4J:]8C:QMNiVPOI5 RTZSJS?@"<CEL0.4 0.4 0.43e"?@AKLL"?%W]HZI"?%1HIIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"TvVWgh QRSTUVWX"bAb]^b`ab: 5bUcd VX"dTWQRUSbebhCibAmba T_` 5VVX"dTWQRUSbqb^tCubAyb^ U\] 5WVX"dTWQRUSb}bmCbAb[ VYZ 5XQSR"VdbCAAbby 5  WX{48, 65}X{48, 65}X{48, 65}Y{119, 65}Y{119, 65}Y{119, 65}Y{108, 59}Y{108, 59}Y{108, 59}X{35, 59}X{35, 59}X{35, 59}e"^my߁TUVWXL"bAWAbWAWbg h 4u9 _{{36, 59}, {11, 19}}"b%C:?:CAsopWVriqjftTSk ?@"CEO'0.2802522079 0.2802522079 0.28025220793?@"CEO'0.3288680367 0.3288680367 0.32886803673e"ρlmL"?W=hHI"?hnI?@"CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vL" !b%:':?:AJ:]C{|iV~}wf TZSx?@"CEL0.4 0.4 0.43e"yzL"?W]vZI"?vwIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vVWgh QRSTUVWX"bAbb!"b: f VX"dTWQRUSb&b)C*bA.b  fVX"dTWQRUSb2b5C6bA:b  fVX"dTWQRUSb>b.ACBbAb  fQSR"VdbCAAbb: f  X{47, 78}X{47, 78}X{47, 78}X{36, 72}X{36, 72}X{36, 72}X{36, 59}X{36, 59}X{36, 59}X{47, 65}X{47, 65}X{47, 65}e"].:L"efbhAjWAbnoWAWb  49 _{{13, 72}, {34, 7}}"ub%wCx:{|}?:CAWVTS ?@"CEO'0.3420940897 0.3420940897 0.34209408973?@"CEO'0.2653277853 0.2653277853 0.26532778533e"L"?jW=HI"?jI?@"CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"L" !b%:':?:AJ:]CiV TZS?@"CEL0.4 0.4 0.43e"ÁL"?W]ZI"?IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vVWgh QRSTUVWX"bAbbb:  VX"dTWQRUSbbfCbAb  VX"dTWQRUSbbCbAb  VX"dTWQRUSbbCbAnb  QSR"VdbCAAbb   X{35, 72}X{35, 72}X{35, 72}X{47, 78}X{47, 78}X{47, 78}X{28, 79}X{28, 79}X{28, 79}X{13, 72}X{13, 72}X{13, 72}e"fnL"&'b)A+WAb/0WAWbÁ  4р9 _{{37.5, 62.5}, {41, 7}}"6b%8C9:<=>?@B:ECAˁ̀WV΁Ł̀ƁЀTSǀ ?@"ICEO'0.2359459918 0.2359459918 0.23594599183?@"LCEO*0.06109884511 0.06109884511 0.061098845113e"OPQȁɀL"?+W=ĀHI"?+[āʀI?@"^CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"ghҀL" !kbm%:n':q?st:bwJ:]{C}ׁ؀iVڀفӁ܀TZSԀ?@"CEL0.4 0.4 0.43e"ՁրL"?hW]ҀZI"?htҁӀIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"vVWgh QRSTUVWX"bAbbb:  VX"dTWQRUSbb'CbAb ށ VX"dTWQRUSbbCbAb ߁ VX"dTWQRUSbbCbA/b  QSR"VdbCAAbb   \{46.5, 66.5}\{46.5, 66.5}\{46.5, 66.5}\{78.5, 69.5}\{78.5, 69.5}\{78.5, 69.5}\{70.5, 65.5}\{70.5, 65.5}\{70.5, 65.5}\{37.5, 62.5}\{37.5, 62.5}\{37.5, 62.5}e"'/ށ߁L"bAWAbWAWb   49 _{{37, 62}, {9, 12}}"bC: ?  : CA#@^WVTS ?@" CEO*0.04050611413 0.04050611413 0.040506114133?@" CEO'0.2160962976 0.2160962976 0.21609629763e"   L"?W=HI"? I?@" CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" ) *L" ! -b /%: 0': 3? 5 6:A 9J:] =C ? iV  TZS ?@" ACEL0.4 0.4 0.43e" D E FL"? *W]ZI"? * 6IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" YvVWgh QRSTUVWX"bAb b cb e fb:   VX"dTWQRUSb jb mC nbA rb   VX"dTWQRUSb vb c yC zbA ~b   VX"dTWQRUSb b r C bAb  QSR"VdbCAAbb ~   X{46, 74}X{46, 74}X{46, 74}X{46, 67}X{46, 67}X{46, 67}X{37, 62}X{37, 62}X{37, 62}\{37.5, 69.5}\{37.5, 69.5}\{37.5, 69.5}e"  c r ~  L  "b A?WAb WAWbSpt1Spt2B- ./9 e"   L" ! b %: ': ? :b J:  C ρ*&'iV)("+T!S#,?@" CEO'0.1716202446 0.1716202446 0.17162024463?@" CEL0.4 0.4 0.43e"  ف$%L"? W] ZI"?  "IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vVWgh W{9, 28}Y{108, 28}yz \PCLineVector \PCLineVector\PCPathVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectXNSObjectghi" bA  Abq WAWb12 3#& @9 de" nšƀ _{{15, 42}, {87, 13}}" b% C :   ?  : !CA>:;WV=4<50?TS6 ?@" %CEJ0 0 0 0.23?@" (CEK0 0 0 0.193e" + , -78L"? W=3HI"?  739I?@" :CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" C DAL" ! Gb I%: J': M? O P:A SJ:] WC YJFGiVIHB0 KTZSCL?@" [CEL0.4 0.4 0.43e" ^ _ `DEL"? DW]AZI"? D PABIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" svVWgh " x ybAWA }b WA WbVorBndsN O9 _T{{12.000000000000002, 44.249136083608384}, {90.543616808306169, 11.503086363086119}}e" v P  " bCA WAb  WAWbVpreTKVQB S oaM  " WNS.dataO streamtyped@Ryz ]NSMutableData VNSDataXNSObject" b% C : ? : : A^Z[WV]T\UP_TSV` ?@" CEJ0 0 0 0.53?@" CEK0 0 0 0.753e"  WXL"? W=SHI"? SYI?@" CEL0.6 0.6 0.63V{0, 0}V{0, 0}_{0, 5.1463130614683354}_{0, 44.738541457734918}_{0, 5.1463130614683354}_{0, 44.738541457734918}W100 - te"  ׁbL" ! b %: ': ? :A J:] : lhiiVkjcP mTZSd`n?@" CEL0.4 0.4 0.43e"  efL"? W]bZI"? bgI?@" CEL0.4 0.4 0.43V{0, 0}V{0, 0}_{0, 5.1463130614683354}_{0, 44.738541457734918}_{0, 5.1463130614683354}_{0, 44.738541457734918}e" vVWgh e" v  p ghi"  bA  Abq W AWbqt u#@6 P de" ! #n "r $s ]cornerRadiusX]cornerRadiusY_T{{15.394291957465503, 44.252204139492406}, {86.622653214236578, 21.789508371540805}}" *b% ,C -: 0= 2? 4  6: 9C b~z{WV}H|vpTSw`?@" =CEL0.6 0.6 0.63e" @ A BxyL"? W=uHI"?  4uvIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" U VL" ! Yb [%: \': _? a b :A eJ:] iC kiVp TZS`?@" mCEL0.4 0.4 0.43e" p q rL"? VW]ZI"? V bIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vVWgh ghi" bA WAbWWq W AWb  P de" n "r $s _T{{12.933421127515606, 55.752222446694503}, {96.466136534036195, 15.736867157223941}}" b% C : = ?  : C bWVHTS`?@" CEL0.6 0.6 0.63e"  L"? W=HI"? IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"  ʁL" ! b %: ': ? :A J:] C ߁iV TZS`?@" CEL0.4 0.4 0.43e"  L"? W]ZI"? IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vVWgh  " bCA WAb  WAWbB  ŀM  " O streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+sizeWidthCenteredNSNumberNSValue*dsizeHeightCenteredR" b% C :   ?  : :AWVTS ?@" "CEO$0.403851053 0.403851053 0.4038510533?@" %CEO'0.2658160666 0.2658160666 0.26581606663e" ( ) *L"? W=HI"?  4I?@" 7CEL0.6 0.6 0.63V{0, 0}V{0, 0}_{0, 4.2515341609509996}_{0, 44.738541457734918}_{0, 4.2515341609509996}_{0, 44.738541457734918}e" @ AL" ! Db F%: G': J? L M :A PJ:] T: ViV ÀTZS?@" XCEL0.4 0.4 0.43e" [ \ ]L"? AW]ZI"? A gI?@" jCEL0.4 0.4 0.43V{0, 0}V{0, 0}_{0, 4.2515341609509996}_{0, 44.738541457734918}_{0, 4.2515341609509996}_{0, 44.738541457734918}e" svVWgh e" xv y zƁ ghi" } ~bA Abq W AWbǁ #@6 ԁ de" nšƀ _4{{14.336510027119617, 46.003068321901999}, {88, 18}}" b% C : = ? y : Cb΁πWVрHЀʁƁӀTSˀ?@" CEL0.6 0.6 0.63e"  ́̀L"? W=ɀHI"? ɁʀIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"  ՀL" ! b %: ': ? y:A J:] C ӁځۀiV݀܁ց ߀TZS׀?@" CEL0.4 0.4 0.43e"  ځ؁ـL"? W]ՀZI"? ՁրIV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vVWgh ghi" bA WAbWWq W AWb   de" nšƀ _4{{11.836510027119623, 55.503068321901999}, {98, 13}}" b% C : = ?  z : CbWVHTS怳?@" CEL0.6 0.6 0.63e"   L"? W=HI"? IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" 1 2L" ! 5b 7%: 8': ;? = > z:A AJ:] EC GiV TZS򀳁?@" ICEL0.4 0.4 0.43e" L M NL"? 2W]ZI"? 2 >IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" avVWgh  hi"g fb hbA k lAb o oq qWAW t #@6 #@ M de" v xnšƀ " | O streamtyped@R_#{{24.207106781186546, 48}, {12, 6}}" b% C : ? : CA WV   TS ?@" CEO0.6863980707 0.8061224313 13?@" CEO0.3126169177 0.3186546528 0.63e"  L"? kW=HI"? k I?@" CEL0.6 0.6 0.63V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e"  L" ! b %: ': ? :b J:  C ǁiVTS@" <EF0 0.53?@" CEL0.4 0.4 0.43e"  сL"? W]ZI"? IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}e" vVWgh _T{{12.000000000000002, 44.249136083608384}, {90.543616808306169, 11.503086363086119}}yz ]PCGroupVector ]PCGroupVector_PCRectBasedVectorXPCVectorZPCDrawableXPCObjectXNSObjectyz ]PCFolderLayer ]PCFolderLayerWPCLayerZPCDrawableXPCObjectXNSObject"::b A bS" #%"?C de"  n! " JZBackgroundde"n$ "Je"v &D ghi"#$bA'WAb**q,WAWb'* + #@(7 de"13n2(4) ]cornerRadiusX]cornerRadiusY_{{0, 0}, {128, 128}}":b%<:=:@=B?DF:ICJA401WV3H2,&5TS-6 ?@"MCEL0.6 0.6 0.63e"PQR./L"?'W=+HI"?'D+,IV{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}V{0, 0}W100 - te"fg8L" !jbl%:m':p?rs:AvJ:]zCJ|A=>iV@?9& BTZS:6C?@"~CEL0.4 0.4 0.43e";?@ASCDEF?HIJALMOPYUcodeSUprColVprShTiSfraVcodePlVcodeFrUcodeFTsnShVexPropTpropUgenCHUgrTypVanLooCVprLinCUcodeLv rsuwp`n o\qtde"SZnTUVWXYabcdef[\=^_`ghHijm V{JFIF}U{GIF}_"kCGImageDestinationBackgroundColorU{PNG}V{TIFF}_*kCGImageDestinationLossyCompressionQualityde"ijn de"mnn de"qrn de"uwnvkxl [Compression#?Zpublic.png]public.folderde"n ?@"CEL0.5 0 0 0.53SiosUcocoaUtouchVMyViewVUIViewyz_PCBitmapProperties_PCBitmapPropertiesXPCObjectXNSObjectyzYPCFactoryYPCFactoryZPCDrawableXPCObjectXNSObjecte"栀LYselectionZ{128, 128}@"<EE0.753_CICheckerboardGenerator0123456"789:;<=>?@ASCDEF?ALMPYv rsuw otde"nTUVWXYabcdef=H de"n de"n de"n de"nvkxl #?_com.likethought.opacity.opacityde"n ?@"CEL0.5 0 0 0.53de"n5455565666 _framePickerVisibleZhideRulers[windowFrame_layerViewDimension]hideVariablesZexpansionsYprintInfo]toolbarHidden_editFrameMetadata_{{62, 0}, {1195, 778}}#@cde"n45 "\NSAttributesde" n    4455 _NSHorizontallyCentered]NSRightMargin\NSLeftMargin_NSHorizonalPagination_NSVerticalPagination_NSVerticallyCentered[NSTopMargin^NSBottomMargin"B"Byz'([NSPrintInfo)*[NSPrintInfoXNSObjectde",4n-./01235689-;\ _"com.likethought.opacity.preview.ui_(com.likethought.opacity.preview.elementsWfactory_#com.likethought.opacity.preview.web_&com.likethought.opacity.preview.cursorTtype_&com.likethought.opacity.preview.iphonede"EInF2H=LH Ucolor[resolutionse"QRSUL#?#?de"Z^n[\]555666 VstatusWtoolbarTdockde"gjnhikl WaddressUimage_#http://likethought.com/opacity/web/_,http://likethought.com/opacity/web/image.pngde"sxnt2vFWzW=hhH XhotspotXXhotspotYde"nF2ÁāŁƁ=ǀHȁɁǁʁ UrectXUrectHUrectWUrectYTleftStop#@4#@F#@ie"v D yzWPCImageWPCImage_PCMetadataObjectZPCDrawableXPCObjectXNSObject_NSKeyedArchiverTroot"+5:?    ' , 2 8 ? F M T Y ` d k r x        # & ( * + . 7 9 ; = ? H J M P R T U b j u | ~    # ? H ^ e r {     , . 0 2 C E N P R [ ^ ` b { $ * 2 8 < D H M R S T V X Y [ ^ _ h j  &4?MU`irz#49>@BDF]jwy{} 2=?ACLQSU^kp})1<EN )+-/258;>ADGIV]aiot|)68AFHJLahlprtvx !07?HOVr%.7@CEG ,.7<>@BWY[]_tvxz|$&(*3NYt !"#%')*+8;=@BDR`  *79BGIKMbdfhj4679;=?ACEGIJLNPRTVXert} %2?S\gpy"   &-4;DGIK ')+-/DFHJLSZahov   T V W X Z [ \ ^ ` b d e f !"!$!1!>!@!I!N!P!R!T!i!k!m!o!q!!!!!!!!!!!!" "&"."7":"<">"""""""""""""""""""""""""####### #"#7#9#;#=#?#L#Y#[#b#i##############$F$H$J$K$L$N$O$P$R$T$V$W$X$e$h$j$m$o$q$$$%%% % % %%%%%%%%%%!%#%%%'%(%5%B%D%M%R%T%V%X%m%o%q%s%u%%%%%%%%%%%%%%%&?&A&B&D&F&H&J&L&N&P&R&T&U&W&Y&[&]&_&a&c&p&}&&&&&&&&&&&&&&&&&&&&&&'''' ' 'R'T'V'W'X'Z'['\'^'`'b'c'd'q't'v'y'{'}'''''(((((( ( (((((((((((5(7(@(E(G(I(K(`(b(d(f(h(}(((((((((((((()2)4)5)7)9);)=)?)A)C)E)G)H)J)L)N)P)R)T)V)c)p)r){)))))))))))))))))))))))))*E*L*S*Z*\*_*`*c*d*f*g*h*k*n*q*s*t*u********+++++ + +++++++%+L+N+[++++++++++++++++,,,,,,.,0,2,;,>,@,M,w,y,,,,,,,,---w-z-{-~-----------------------------. . .....!.(./.6.=.F.K.M.O.Q.~...................///// / ///////I/J/M/P/S/V/Y/Z/[/]/`/a////////////////////////0$0%0(0+0.01040506080;0<0]0^0_0a0b0e0f0i0r00000000000001111"1,161@1J1S1\1e1n1}1111111111111111222X2[2^2_2b2c2f2g2h2k2n2q2s2t2u2222222223333 3 3333333'3Q3S3`3m3o3x3333333333333333344484:4O4Q4T4]4`4b4o44444445555"5$55555555555555555555555555556 66666*6,6/62646;6B6I6P6W6^6g6l6n6p6r66666666666666666666666707174777:7=7@7A7B7E7H7I7z7{7~777777777777777777777778888!8*838<8G8J8M8P8S8V8X888888888888888896999:9=9@9B9D9G9J9M9O9R9U9X9Z9\9_9a9b9o99999999999:::::::":%:':4:A:C:J:Q:X:_:f:m:v:y:|:~:::::::;;;; ; ;;;;;;;;;,;9;;;D;I;L;O;Q;f;h;k;m;o;;;;;;;;;;;;;;;;;;;;;<<<< < <<@>>>> > >>>>&>>>>>>>>>>>>>>>>>>>>>>>?%?'?0?5?8?;?=?R?T?W?Y?[?p?r?u?x?z?????????????@D@G@H@K@N@P@R@U@W@Z@]@`@a@d@f@h@j@m@o@r@@@@@@@@@@@@@@@@@@@@@@AA AAAAAALAMANAOARAUAXAYA\A_AbAAAAAAAAAAAAAAAAAAAAAAAAB'B(B+B.B1B4B7B8B9BGAGDGGGHGIGLGOGPGGGGGGGGGGGGGGGGGGGGGGGGH HH#H0H=HJHWHdHmHxH{H~HHHHHHHHHHHHHHHHHHHIIfIiIjIsIvIyI{I}IIIIIIIIIIIIIIIIJJJJJ!J$J&J;J=J@JBJDJYJ[J^JaJcJpJ}JJJJJJJJJJJK-K0K1K4K7K9K;K>K@KCKFKIKJKMKOKQKSKVKXK[KhKuKwKKKKKKKKKKKKKKKKKKKKKKLLLLL5L6L7L8L;L>LALBLELHLKL|L}LLLLLLLLLLLLLLLLLLLLLLMMMMMMM M!M"M%M(M)MJMKMLMOMPMSMTMWM`MiMrM{MMMMMMMMMMMMMMMMN7N;N?NANBNENFNHNINJNMNPNSNUNVNWN`NcNfNhNNNNNNNNNNNNNNNOOOOO OOAOCOPO]O_OhOmOpOsOuOOOOOOOOOOOOOOOOOOOOOOPP PP'P4PAPUP^PiPrP{PPPPPPPPPPPPPPPPPPPPQQtQwQxQ{Q~QQQQQQQQQQQQQQQQQQQQQQQQQRRRRR RR R#R&R(R5RBRDRKRRRYR`RgRnRwRzR}RRRRRRRSSSSS SSSSSSSSS S-S:SY?Y@YBYEYHYIYJYWYZY]Y`YcYeYsYYZ;Z>Z?ZBZEZGZIZLZNZQZSZVZYZ\Z^Z`ZcZfZgZtZZZZZZZZZZZZZZZZZZZZZZ[[ [ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\ \"\)\0\7\>\E\L\U\Z\\\^\`\\\\\\\\\\\\\\\\\\\]0]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^ ^ ^^$^&^)^,^.^5^<^C^J^Q^X^a^d^g^i^^^^^^^^^^^^^^^_____ __%_'_0_5_8_;_=_R_T_W_Y_[_p_r_u_x_z____________````` ` ` ```````!``a:a=a>aAaDaFaHaKaNaQaSaVaYa\a^a`acaeafasaaaaaaaaaabbbbb bb b#b&b(b5bBbDbKbRblbbbbbbbc>cAcBcEcHcJcLcOcQcTcWcZc[c^c`cbcdcgciclcycccccccccccccccccccccddd9dSdmdvd{d}ddddddddddddddddddddde eeeeeeNeeeeeeeeeeeeeeeeeeeeeefff f ff#f%f(f*f,fAfCfFfIfKfRfYf`fgfnfuf~ffffffggggg g ggggggggg"g$g'g4gAgCgLgQgTgWgYgngpgsgugwgggggggggggggggghhh!h"h#h&h'h(h*h-h0h1h2h?hBhDhGhIhKhhhhhhhhhhhhiiiii i iiii*i,i5i:i=i@iBiWiYi\i^i`iuiwizi}iiiiiiiiiiij-j0j1j4j7j9j;j>j@jCjFjIjJjMjOjQjSjVjXj[jhjujwjjjjjjjjjjjjjjjjjjjjjjkkkkkSkVkWkZk[k\k_khkikjkskukxk{k|kkkkkkkkkkklDlGlHlKlNlPlRlUlXl[l]l`lclflhljlmlolpl}lllllllllllllmmmmmmm!m.m;m=mDmKmRmYm`mgmpmsmvmxmmmmmmmmmnnnnn n nnnnnn'n.n0n=nJnLnUnZn]n`nbnwnyn|n~nnnnnnnnnnnnnnnnno4o=oKoXofozoooooooooooop&p'p*p-p.p1p3p6p7p9pNpPpSpVpXpZpgpjplpoprptppppppppppppppppppqqq q!q"q%q&q'q0q2q5q8q9q:qGqJqMqPqSqUqcqqqqqqqqqqqqrrrr r rrrrrr$r1r3r|@|C|F|I|J|M|O|R|U|W|d|q|t|w|z|}|||||||||||||||||||||||||||||}})}*}+}-}:}G}I}V}i}l}o}r}u}x}{}~}}}}}}}}}}}}}}}}}}~ ~~!~5~N~W~d~g~j~m~o~q~z~~~~~~~~~~~~~~~~~~~~~~~ 8Ofr 6ai &/8;>@CENWdknqt{}āʁ,58;>AJLOQSU^gt‚łǂ͂ӂق߂'2:MXaj|cups-2.3.1/tools/Makefile000664 000765 000024 00000010073 13574721672 015400 0ustar00mikestaff000000 000000 # # IPP tools makefile for CUPS. # # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2006 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # include ../Makedefs OBJS = \ ippevepcl.o \ ippeveprinter.o \ ippeveps.o \ ippfind.o \ ipptool.o IPPTOOLS = \ ippeveprinter \ $(IPPFIND_BIN) \ ipptool TARGETS = \ $(IPPEVECOMMANDS) \ $(IPPTOOLS) \ $(LOCALTARGET) # # Make all targets... # all: $(TARGETS) # # Make library targets... # libs: # # Make unit tests... # unittests: # # Clean all object files... # clean: $(RM) $(IPPTOOLS) $(IPPEVECOMMANDS) $(OBJS) $(RM) ippeveprinter-static ippfind-static ipptool-static # # Update dependencies (without system header dependencies...) # depend: $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies # # Install all targets... # install: all install-data install-headers install-libs install-exec # # Install data files... # install-data: # # Install programs... # install-exec: echo Installing IPP tools in $(BINDIR)... $(INSTALL_DIR) -m 755 $(BINDIR) for file in $(IPPTOOLS); do \ $(INSTALL_BIN) $$file $(BINDIR); \ done echo Installing printer commands in $(SERVERBIN)/command... $(INSTALL_DIR) -m 755 $(SERVERBIN)/command for file in $(IPPEVECOMMANDS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/command; \ done if test "x$(SYMROOT)" != "x"; then \ $(INSTALL_DIR) $(SYMROOT); \ for file in $(IPPTOOLS) $(IPPEVECOMMANDS); do \ cp $$file $(SYMROOT); \ dsymutil $(SYMROOT)/$$file; \ done; \ fi # # Install headers... # install-headers: # # Install libraries... # install-libs: # # Unnstall all targets... # uninstall: echo Uninstalling IPP tools from $(BINDIR)... for file in $(IPPTOOLS); do \ $(RM) $(BINDIR)/$$file; \ done -$(RMDIR) $(BINDIR) echo Uninstalling print commands from $(SERVERBIN)/command... for file in $(IPPEVECOMMANDS); do \ $(RM) $(SERVERBIN)/command/$$file; \ done -$(RMDIR) $(SERVERBIN)/ippeveprinter # # Local programs (not built when cross-compiling...) # local: ippeveprinter-static ipptool-static # # ippeveprinter # ippeveprinter: ippeveprinter.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ippeveprinter.o $(DNSSDLIBS) $(PAMLIBS) $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ippeveprinter-static # ippeveprinter-static: ippeveprinter.o ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ippeveprinter.o $(PAMLIBS) $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ippevepcl # ippevepcl: ippevepcl.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ippevepcl.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ippeveps # ippeveps: ippeveps.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ippeveps.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ippfind # ippfind: ippfind.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ippfind.o $(DNSSDLIBS) $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ippfind-static # ippfind-static: ippfind.o ../cups/$(LIBCUPSSTATIC) echo Linking $@ $(LD_CC) $(ALL_LDFLAGS) -o $@ ippfind.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ipptool # ipptool: ipptool.o ../cups/$(LIBCUPS) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ipptool.o $(LINKCUPS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # ipptool-static # ipptool-static: ipptool.o ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o $@ ipptool.o $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ # # Generate the header containing the data for printer.png... # pngheader: echo "Generating printer-png.h from printer.png..." echo "static const unsigned char printer_png[] =" >printer-png.h echo "{" >>printer-png.h od -t x1 printer.png | cut -b12- | awk '{printf(" "); for (i = 1; i <= NF; i ++) printf("0x%s,", $$i); print "";}' >>printer-png.h echo "};" >>printer-png.h # # Dependencies... # include Dependencies cups-2.3.1/tools/ippfind.c000664 000765 000024 00000227775 13574721672 015560 0ustar00mikestaff000000 000000 /* * Utility to find IPP printers via Bonjour/DNS-SD and optionally run * commands such as IPP and Bonjour conformance tests. This tool is * inspired by the UNIX "find" command, thus its name. * * Copyright © 2008-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers. */ #define _CUPS_NO_DEPRECATED #include #ifdef _WIN32 # include # include #else # include #endif /* _WIN32 */ #include #ifdef HAVE_DNSSD # include #elif defined(HAVE_AVAHI) # include # include # include # include # include # include # define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX #endif /* HAVE_DNSSD */ #ifndef _WIN32 extern char **environ; /* Process environment variables */ #endif /* !_WIN32 */ /* * Structures... */ typedef enum ippfind_exit_e /* Exit codes */ { IPPFIND_EXIT_TRUE = 0, /* OK and result is true */ IPPFIND_EXIT_FALSE, /* OK but result is false*/ IPPFIND_EXIT_BONJOUR, /* Browse/resolve failure */ IPPFIND_EXIT_SYNTAX, /* Bad option or syntax error */ IPPFIND_EXIT_MEMORY /* Out of memory */ } ippfind_exit_t; typedef enum ippfind_op_e /* Operations for expressions */ { /* "Evaluation" operations */ IPPFIND_OP_NONE, /* No operation */ IPPFIND_OP_AND, /* Logical AND of all children */ IPPFIND_OP_OR, /* Logical OR of all children */ IPPFIND_OP_TRUE, /* Always true */ IPPFIND_OP_FALSE, /* Always false */ IPPFIND_OP_IS_LOCAL, /* Is a local service */ IPPFIND_OP_IS_REMOTE, /* Is a remote service */ IPPFIND_OP_DOMAIN_REGEX, /* Domain matches regular expression */ IPPFIND_OP_NAME_REGEX, /* Name matches regular expression */ IPPFIND_OP_NAME_LITERAL, /* Name matches literal string */ IPPFIND_OP_HOST_REGEX, /* Hostname matches regular expression */ IPPFIND_OP_PORT_RANGE, /* Port matches range */ IPPFIND_OP_PATH_REGEX, /* Path matches regular expression */ IPPFIND_OP_TXT_EXISTS, /* TXT record key exists */ IPPFIND_OP_TXT_REGEX, /* TXT record key matches regular expression */ IPPFIND_OP_URI_REGEX, /* URI matches regular expression */ /* "Output" operations */ IPPFIND_OP_EXEC, /* Execute when true */ IPPFIND_OP_LIST, /* List when true */ IPPFIND_OP_PRINT_NAME, /* Print URI when true */ IPPFIND_OP_PRINT_URI, /* Print name when true */ IPPFIND_OP_QUIET /* No output when true */ } ippfind_op_t; typedef struct ippfind_expr_s /* Expression */ { struct ippfind_expr_s *prev, /* Previous expression */ *next, /* Next expression */ *parent, /* Parent expressions */ *child; /* Child expressions */ ippfind_op_t op; /* Operation code (see above) */ int invert; /* Invert the result */ char *name; /* TXT record key or literal name */ regex_t re; /* Regular expression for matching */ int range[2]; /* Port number range */ int num_args; /* Number of arguments for exec */ char **args; /* Arguments for exec */ } ippfind_expr_t; typedef struct ippfind_srv_s /* Service information */ { #ifdef HAVE_DNSSD DNSServiceRef ref; /* Service reference for query */ #elif defined(HAVE_AVAHI) AvahiServiceResolver *ref; /* Resolver */ #endif /* HAVE_DNSSD */ char *name, /* Service name */ *domain, /* Domain name */ *regtype, /* Registration type */ *fullName, /* Full name */ *host, /* Hostname */ *resource, /* Resource path */ *uri; /* URI */ int num_txt; /* Number of TXT record keys */ cups_option_t *txt; /* TXT record keys */ int port, /* Port number */ is_local, /* Is a local service? */ is_processed, /* Did we process the service? */ is_resolved; /* Got the resolve data? */ } ippfind_srv_t; /* * Local globals... */ #ifdef HAVE_DNSSD static DNSServiceRef dnssd_ref; /* Master service reference */ #elif defined(HAVE_AVAHI) static AvahiClient *avahi_client = NULL;/* Client information */ static int avahi_got_data = 0; /* Got data from poll? */ static AvahiSimplePoll *avahi_poll = NULL; /* Poll information */ #endif /* HAVE_DNSSD */ static int address_family = AF_UNSPEC; /* Address family for LIST */ static int bonjour_error = 0; /* Error browsing/resolving? */ static double bonjour_timeout = 1.0; /* Timeout in seconds */ static int ipp_version = 20; /* IPP version for LIST */ /* * Local functions... */ #ifdef HAVE_DNSSD static void DNSSD_API browse_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context) _CUPS_NONNULL(1,5,6,7,8); static void DNSSD_API browse_local_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context) _CUPS_NONNULL(1,5,6,7,8); #elif defined(HAVE_AVAHI) static void browse_callback(AvahiServiceBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *serviceName, const char *regtype, const char *replyDomain, AvahiLookupResultFlags flags, void *context); static void client_callback(AvahiClient *client, AvahiClientState state, void *context); #endif /* HAVE_AVAHI */ static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b); static const char *dnssd_error_string(int error); static int eval_expr(ippfind_srv_t *service, ippfind_expr_t *expressions); static int exec_program(ippfind_srv_t *service, int num_args, char **args); static ippfind_srv_t *get_service(cups_array_t *services, const char *serviceName, const char *regtype, const char *replyDomain) _CUPS_NONNULL(1,2,3,4); static double get_time(void); static int list_service(ippfind_srv_t *service); static ippfind_expr_t *new_expr(ippfind_op_t op, int invert, const char *value, const char *regex, char **args); #ifdef HAVE_DNSSD static void DNSSD_API resolve_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullName, const char *hostTarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context) _CUPS_NONNULL(1,5,6,9, 10); #elif defined(HAVE_AVAHI) static int poll_callback(struct pollfd *pollfds, unsigned int num_pollfds, int timeout, void *context); static void resolve_callback(AvahiServiceResolver *res, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const char *serviceName, const char *regtype, const char *replyDomain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags flags, void *context); #endif /* HAVE_DNSSD */ static void set_service_uri(ippfind_srv_t *service); static void show_usage(void) _CUPS_NORETURN; static void show_version(void) _CUPS_NORETURN; /* * 'main()' - Browse for printers. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i, /* Looping var */ have_output = 0,/* Have output expression */ status = IPPFIND_EXIT_FALSE; /* Exit status */ const char *opt, /* Option character */ *search; /* Current browse/resolve string */ cups_array_t *searches; /* Things to browse/resolve */ cups_array_t *services; /* Service array */ ippfind_srv_t *service; /* Current service */ ippfind_expr_t *expressions = NULL, /* Expression tree */ *temp = NULL, /* New expression */ *parent = NULL, /* Parent expression */ *current = NULL,/* Current expression */ *parens[100]; /* Markers for parenthesis */ int num_parens = 0; /* Number of parenthesis */ ippfind_op_t logic = IPPFIND_OP_AND; /* Logic for next expression */ int invert = 0; /* Invert expression? */ int err; /* DNS-SD error */ #ifdef HAVE_DNSSD fd_set sinput; /* Input set for select() */ struct timeval stimeout; /* Timeout for select() */ #endif /* HAVE_DNSSD */ double endtime; /* End time */ static const char * const ops[] = /* Node operation names */ { "NONE", "AND", "OR", "TRUE", "FALSE", "IS_LOCAL", "IS_REMOTE", "DOMAIN_REGEX", "NAME_REGEX", "NAME_LITERAL", "HOST_REGEX", "PORT_RANGE", "PATH_REGEX", "TXT_EXISTS", "TXT_REGEX", "URI_REGEX", "EXEC", "LIST", "PRINT_NAME", "PRINT_URI", "QUIET" }; /* * Initialize the locale... */ _cupsSetLocale(argv); /* * Create arrays to track services and things we want to browse/resolve... */ searches = cupsArrayNew(NULL, NULL); services = cupsArrayNew((cups_array_func_t)compare_services, NULL); /* * Parse command-line... */ if (getenv("IPPFIND_DEBUG")) for (i = 1; i < argc; i ++) fprintf(stderr, "argv[%d]=\"%s\"\n", i, argv[i]); for (i = 1; i < argc; i ++) { if (argv[i][0] == '-') { if (argv[i][1] == '-') { /* * Parse --option options... */ if (!strcmp(argv[i], "--and")) { if (logic == IPPFIND_OP_OR) { _cupsLangPuts(stderr, _("ippfind: Cannot use --and after --or.")); show_usage(); } if (!current) { _cupsLangPuts(stderr, _("ippfind: Missing expression before \"--and\".")); show_usage(); } temp = NULL; } else if (!strcmp(argv[i], "--domain")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), "--domain"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_DOMAIN_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--exec")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Expected program after %s."), "--exec"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_EXEC, invert, NULL, NULL, argv + i)) == NULL) return (IPPFIND_EXIT_MEMORY); while (i < argc) if (!strcmp(argv[i], ";")) break; else i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Expected semi-colon after %s."), "--exec"); show_usage(); } have_output = 1; } else if (!strcmp(argv[i], "--false")) { if ((temp = new_expr(IPPFIND_OP_FALSE, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--help")) { show_usage(); } else if (!strcmp(argv[i], "--host")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), "--host"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_HOST_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--ls")) { if ((temp = new_expr(IPPFIND_OP_LIST, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; } else if (!strcmp(argv[i], "--local")) { if ((temp = new_expr(IPPFIND_OP_IS_LOCAL, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--literal-name")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing name after %s."), "--literal-name"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_NAME_LITERAL, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--name")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), "--name"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_NAME_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--not")) { invert = 1; } else if (!strcmp(argv[i], "--or")) { if (!current) { _cupsLangPuts(stderr, _("ippfind: Missing expression before \"--or\".")); show_usage(); } logic = IPPFIND_OP_OR; if (parent && parent->op == IPPFIND_OP_OR) { /* * Already setup to do "foo --or bar --or baz"... */ temp = NULL; } else if (!current->prev && parent) { /* * Change parent node into an OR node... */ parent->op = IPPFIND_OP_OR; temp = NULL; } else if (!current->prev) { /* * Need to group "current" in a new OR node... */ if ((temp = new_expr(IPPFIND_OP_OR, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); temp->parent = parent; temp->child = current; current->parent = temp; if (parent) parent->child = temp; else expressions = temp; parent = temp; temp = NULL; } else { /* * Need to group previous expressions in an AND node, and then * put that in an OR node... */ if ((temp = new_expr(IPPFIND_OP_AND, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); while (current->prev) { current->parent = temp; current = current->prev; } current->parent = temp; temp->child = current; current = temp; if ((temp = new_expr(IPPFIND_OP_OR, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); temp->parent = parent; current->parent = temp; if (parent) parent->child = temp; else expressions = temp; parent = temp; temp = NULL; } } else if (!strcmp(argv[i], "--path")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), "--path"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_PATH_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--port")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Expected port range after %s."), "--port"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_PORT_RANGE, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--print")) { if ((temp = new_expr(IPPFIND_OP_PRINT_URI, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; } else if (!strcmp(argv[i], "--print-name")) { if ((temp = new_expr(IPPFIND_OP_PRINT_NAME, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; } else if (!strcmp(argv[i], "--quiet")) { if ((temp = new_expr(IPPFIND_OP_QUIET, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; } else if (!strcmp(argv[i], "--remote")) { if ((temp = new_expr(IPPFIND_OP_IS_REMOTE, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--true")) { if ((temp = new_expr(IPPFIND_OP_TRUE, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--txt")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Expected key name after %s."), "--txt"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_TXT_EXISTS, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strncmp(argv[i], "--txt-", 6)) { const char *key = argv[i] + 6;/* TXT key */ i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), argv[i - 1]); show_usage(); } if ((temp = new_expr(IPPFIND_OP_TXT_REGEX, invert, key, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--uri")) { i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after %s."), "--uri"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_URI_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } else if (!strcmp(argv[i], "--version")) { show_version(); } else { _cupsLangPrintf(stderr, _("%s: Unknown option \"%s\"."), "ippfind", argv[i]); show_usage(); } if (temp) { /* * Add new expression... */ if (logic == IPPFIND_OP_AND && current && current->prev && parent && parent->op != IPPFIND_OP_AND) { /* * Need to re-group "current" in a new AND node... */ ippfind_expr_t *tempand; /* Temporary AND node */ if ((tempand = new_expr(IPPFIND_OP_AND, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); /* * Replace "current" with new AND node at the end of this list... */ current->prev->next = tempand; tempand->prev = current->prev; tempand->parent = parent; /* * Add "current to the new AND node... */ tempand->child = current; current->parent = tempand; current->prev = NULL; parent = tempand; } /* * Add the new node at current level... */ temp->parent = parent; temp->prev = current; if (current) current->next = temp; else if (parent) parent->child = temp; else expressions = temp; current = temp; invert = 0; logic = IPPFIND_OP_AND; temp = NULL; } } else { /* * Parse -o options */ for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case '4' : address_family = AF_INET; break; case '6' : address_family = AF_INET6; break; case 'N' : /* Literal name */ i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing name after %s."), "-N"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_NAME_LITERAL, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'P' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Expected port range after %s."), "-P"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_PORT_RANGE, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'T' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ippfind"); show_usage(); } bonjour_timeout = atof(argv[i]); break; case 'V' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ippfind"); show_usage(); } if (!strcmp(argv[i], "1.1")) ipp_version = 11; else if (!strcmp(argv[i], "2.0")) ipp_version = 20; else if (!strcmp(argv[i], "2.1")) ipp_version = 21; else if (!strcmp(argv[i], "2.2")) ipp_version = 22; else { _cupsLangPrintf(stderr, _("%s: Bad version %s for \"-V\"."), "ippfind", argv[i]); show_usage(); } break; case 'd' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after " "%s."), "-d"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_DOMAIN_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'h' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after " "%s."), "-h"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_HOST_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'l' : if ((temp = new_expr(IPPFIND_OP_LIST, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; break; case 'n' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after " "%s."), "-n"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_NAME_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'p' : if ((temp = new_expr(IPPFIND_OP_PRINT_URI, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; break; case 'q' : if ((temp = new_expr(IPPFIND_OP_QUIET, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; break; case 'r' : if ((temp = new_expr(IPPFIND_OP_IS_REMOTE, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 's' : if ((temp = new_expr(IPPFIND_OP_PRINT_NAME, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); have_output = 1; break; case 't' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing key name after %s."), "-t"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_TXT_EXISTS, invert, argv[i], NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'u' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing regular expression after " "%s."), "-u"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_URI_REGEX, invert, NULL, argv[i], NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); break; case 'x' : i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing program after %s."), "-x"); show_usage(); } if ((temp = new_expr(IPPFIND_OP_EXEC, invert, NULL, NULL, argv + i)) == NULL) return (IPPFIND_EXIT_MEMORY); while (i < argc) if (!strcmp(argv[i], ";")) break; else i ++; if (i >= argc) { _cupsLangPrintf(stderr, _("ippfind: Missing semi-colon after %s."), "-x"); show_usage(); } have_output = 1; break; default : _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."), "ippfind", *opt); show_usage(); } if (temp) { /* * Add new expression... */ if (logic == IPPFIND_OP_AND && current && current->prev && parent && parent->op != IPPFIND_OP_AND) { /* * Need to re-group "current" in a new AND node... */ ippfind_expr_t *tempand; /* Temporary AND node */ if ((tempand = new_expr(IPPFIND_OP_AND, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); /* * Replace "current" with new AND node at the end of this list... */ current->prev->next = tempand; tempand->prev = current->prev; tempand->parent = parent; /* * Add "current to the new AND node... */ tempand->child = current; current->parent = tempand; current->prev = NULL; parent = tempand; } /* * Add the new node at current level... */ temp->parent = parent; temp->prev = current; if (current) current->next = temp; else if (parent) parent->child = temp; else expressions = temp; current = temp; invert = 0; logic = IPPFIND_OP_AND; temp = NULL; } } } } else if (!strcmp(argv[i], "(")) { if (num_parens >= 100) { _cupsLangPuts(stderr, _("ippfind: Too many parenthesis.")); show_usage(); } if ((temp = new_expr(IPPFIND_OP_AND, invert, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); parens[num_parens++] = temp; if (current) { temp->parent = current->parent; current->next = temp; temp->prev = current; } else expressions = temp; parent = temp; current = NULL; invert = 0; logic = IPPFIND_OP_AND; } else if (!strcmp(argv[i], ")")) { if (num_parens <= 0) { _cupsLangPuts(stderr, _("ippfind: Missing open parenthesis.")); show_usage(); } current = parens[--num_parens]; parent = current->parent; invert = 0; logic = IPPFIND_OP_AND; } else if (!strcmp(argv[i], "!")) { invert = 1; } else { /* * _regtype._tcp[,subtype][.domain] * * OR * * service-name[._regtype._tcp[.domain]] */ cupsArrayAdd(searches, argv[i]); } } if (num_parens > 0) { _cupsLangPuts(stderr, _("ippfind: Missing close parenthesis.")); show_usage(); } if (!have_output) { /* * Add an implicit --print-uri to the end... */ if ((temp = new_expr(IPPFIND_OP_PRINT_URI, 0, NULL, NULL, NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); if (current) { while (current->parent) current = current->parent; current->next = temp; temp->prev = current; } else expressions = temp; } if (cupsArrayCount(searches) == 0) { /* * Add an implicit browse for IPP printers ("_ipp._tcp")... */ cupsArrayAdd(searches, "_ipp._tcp"); } if (getenv("IPPFIND_DEBUG")) { int indent = 4; /* Indentation */ puts("Expression tree:"); current = expressions; while (current) { /* * Print the current node... */ printf("%*s%s%s\n", indent, "", current->invert ? "!" : "", ops[current->op]); /* * Advance to the next node... */ if (current->child) { current = current->child; indent += 4; } else if (current->next) current = current->next; else if (current->parent) { while (current->parent) { indent -= 4; current = current->parent; if (current->next) break; } current = current->next; } else current = NULL; } puts("\nSearch items:"); for (search = (const char *)cupsArrayFirst(searches); search; search = (const char *)cupsArrayNext(searches)) printf(" %s\n", search); } /* * Start up browsing/resolving... */ #ifdef HAVE_DNSSD if ((err = DNSServiceCreateConnection(&dnssd_ref)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"), dnssd_error_string(err)); return (IPPFIND_EXIT_BONJOUR); } #elif defined(HAVE_AVAHI) if ((avahi_poll = avahi_simple_poll_new()) == NULL) { _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"), strerror(errno)); return (IPPFIND_EXIT_BONJOUR); } avahi_simple_poll_set_func(avahi_poll, poll_callback, NULL); avahi_client = avahi_client_new(avahi_simple_poll_get(avahi_poll), 0, client_callback, avahi_poll, &err); if (!avahi_client) { _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"), dnssd_error_string(err)); return (IPPFIND_EXIT_BONJOUR); } #endif /* HAVE_DNSSD */ for (search = (const char *)cupsArrayFirst(searches); search; search = (const char *)cupsArrayNext(searches)) { char buf[1024], /* Full name string */ *name = NULL, /* Service instance name */ *regtype, /* Registration type */ *domain; /* Domain, if any */ strlcpy(buf, search, sizeof(buf)); if (!strncmp(buf, "_http._", 7) || !strncmp(buf, "_https._", 8) || !strncmp(buf, "_ipp._", 6) || !strncmp(buf, "_ipps._", 7)) { regtype = buf; } else if ((regtype = strstr(buf, "._")) != NULL) { if (strcmp(regtype, "._tcp")) { /* * "something._protocol._tcp" -> search for something with the given * protocol... */ name = buf; *regtype++ = '\0'; } else { /* * "_protocol._tcp" -> search for everything with the given protocol... */ /* name = NULL; */ regtype = buf; } } else { /* * "something" -> search for something with IPP protocol... */ name = buf; regtype = "_ipp._tcp"; } for (domain = regtype; *domain; domain ++) { if (*domain == '.' && domain[1] != '_') { *domain++ = '\0'; break; } } if (!*domain) domain = NULL; if (name) { /* * Resolve the given service instance name, regtype, and domain... */ if (!domain) domain = "local."; service = get_service(services, name, regtype, domain); if (getenv("IPPFIND_DEBUG")) fprintf(stderr, "Resolving name=\"%s\", regtype=\"%s\", domain=\"%s\"\n", name, regtype, domain); #ifdef HAVE_DNSSD service->ref = dnssd_ref; err = DNSServiceResolve(&(service->ref), kDNSServiceFlagsShareConnection, 0, name, regtype, domain, resolve_callback, service); #elif defined(HAVE_AVAHI) service->ref = avahi_service_resolver_new(avahi_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, name, regtype, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, service); if (service->ref) err = 0; else err = avahi_client_errno(avahi_client); #endif /* HAVE_DNSSD */ } else { /* * Browse for services of the given type... */ if (getenv("IPPFIND_DEBUG")) fprintf(stderr, "Browsing for regtype=\"%s\", domain=\"%s\"\n", regtype, domain); #ifdef HAVE_DNSSD DNSServiceRef ref; /* Browse reference */ ref = dnssd_ref; err = DNSServiceBrowse(&ref, kDNSServiceFlagsShareConnection, 0, regtype, domain, browse_callback, services); if (!err) { ref = dnssd_ref; err = DNSServiceBrowse(&ref, kDNSServiceFlagsShareConnection, kDNSServiceInterfaceIndexLocalOnly, regtype, domain, browse_local_callback, services); } #elif defined(HAVE_AVAHI) if (avahi_service_browser_new(avahi_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, regtype, domain, 0, browse_callback, services)) err = 0; else err = avahi_client_errno(avahi_client); #endif /* HAVE_DNSSD */ } if (err) { _cupsLangPrintf(stderr, _("ippfind: Unable to browse or resolve: %s"), dnssd_error_string(err)); return (IPPFIND_EXIT_BONJOUR); } } /* * Process browse/resolve requests... */ if (bonjour_timeout > 1.0) endtime = get_time() + bonjour_timeout; else endtime = get_time() + 300.0; while (get_time() < endtime) { int process = 0; /* Process services? */ #ifdef HAVE_DNSSD int fd = DNSServiceRefSockFD(dnssd_ref); /* File descriptor for DNS-SD */ FD_ZERO(&sinput); FD_SET(fd, &sinput); stimeout.tv_sec = 0; stimeout.tv_usec = 500000; if (select(fd + 1, &sinput, NULL, NULL, &stimeout) < 0) continue; if (FD_ISSET(fd, &sinput)) { /* * Process responses... */ DNSServiceProcessResult(dnssd_ref); } else { /* * Time to process services... */ process = 1; } #elif defined(HAVE_AVAHI) avahi_got_data = 0; if (avahi_simple_poll_iterate(avahi_poll, 500) > 0) { /* * We've been told to exit the loop. Perhaps the connection to * Avahi failed. */ return (IPPFIND_EXIT_BONJOUR); } if (!avahi_got_data) { /* * Time to process services... */ process = 1; } #endif /* HAVE_DNSSD */ if (process) { /* * Process any services that we have found... */ int active = 0, /* Number of active resolves */ resolved = 0, /* Number of resolved services */ processed = 0; /* Number of processed services */ for (service = (ippfind_srv_t *)cupsArrayFirst(services); service; service = (ippfind_srv_t *)cupsArrayNext(services)) { if (service->is_processed) processed ++; if (service->is_resolved) resolved ++; if (!service->ref && !service->is_resolved) { /* * Found a service, now resolve it (but limit to 50 active resolves...) */ if (active < 50) { #ifdef HAVE_DNSSD service->ref = dnssd_ref; err = DNSServiceResolve(&(service->ref), kDNSServiceFlagsShareConnection, 0, service->name, service->regtype, service->domain, resolve_callback, service); #elif defined(HAVE_AVAHI) service->ref = avahi_service_resolver_new(avahi_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, service->name, service->regtype, service->domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, service); if (service->ref) err = 0; else err = avahi_client_errno(avahi_client); #endif /* HAVE_DNSSD */ if (err) { _cupsLangPrintf(stderr, _("ippfind: Unable to browse or resolve: %s"), dnssd_error_string(err)); return (IPPFIND_EXIT_BONJOUR); } active ++; } } else if (service->is_resolved && !service->is_processed) { /* * Resolved, not process this service against the expressions... */ if (service->ref) { #ifdef HAVE_DNSSD DNSServiceRefDeallocate(service->ref); #else avahi_service_resolver_free(service->ref); #endif /* HAVE_DNSSD */ service->ref = NULL; } if (eval_expr(service, expressions)) status = IPPFIND_EXIT_TRUE; service->is_processed = 1; } else if (service->ref) active ++; } /* * If we have processed all services we have discovered, then we are done. */ if (processed == cupsArrayCount(services) && bonjour_timeout <= 1.0) break; } } if (bonjour_error) return (IPPFIND_EXIT_BONJOUR); else return (status); } #ifdef HAVE_DNSSD /* * 'browse_callback()' - Browse devices. */ static void DNSSD_API browse_callback( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Option flags */ uint32_t interfaceIndex, /* I - Interface number */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *serviceName, /* I - Name of service/device */ const char *regtype, /* I - Type of service */ const char *replyDomain, /* I - Service domain */ void *context) /* I - Services array */ { /* * Only process "add" data... */ (void)sdRef; (void)interfaceIndex; if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) return; /* * Get the device... */ get_service((cups_array_t *)context, serviceName, regtype, replyDomain); } /* * 'browse_local_callback()' - Browse local devices. */ static void DNSSD_API browse_local_callback( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Option flags */ uint32_t interfaceIndex, /* I - Interface number */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *serviceName, /* I - Name of service/device */ const char *regtype, /* I - Type of service */ const char *replyDomain, /* I - Service domain */ void *context) /* I - Services array */ { ippfind_srv_t *service; /* Service */ /* * Only process "add" data... */ (void)sdRef; (void)interfaceIndex; if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) return; /* * Get the device... */ service = get_service((cups_array_t *)context, serviceName, regtype, replyDomain); service->is_local = 1; } #endif /* HAVE_DNSSD */ #ifdef HAVE_AVAHI /* * 'browse_callback()' - Browse devices. */ static void browse_callback( AvahiServiceBrowser *browser, /* I - Browser */ AvahiIfIndex interface, /* I - Interface index (unused) */ AvahiProtocol protocol, /* I - Network protocol (unused) */ AvahiBrowserEvent event, /* I - What happened */ const char *name, /* I - Service name */ const char *type, /* I - Registration type */ const char *domain, /* I - Domain */ AvahiLookupResultFlags flags, /* I - Flags */ void *context) /* I - Services array */ { AvahiClient *client = avahi_service_browser_get_client(browser); /* Client information */ ippfind_srv_t *service; /* Service information */ (void)interface; (void)protocol; (void)context; switch (event) { case AVAHI_BROWSER_FAILURE: fprintf(stderr, "DEBUG: browse_callback: %s\n", avahi_strerror(avahi_client_errno(client))); bonjour_error = 1; avahi_simple_poll_quit(avahi_poll); break; case AVAHI_BROWSER_NEW: /* * This object is new on the network. Create a device entry for it if * it doesn't yet exist. */ service = get_service((cups_array_t *)context, name, type, domain); if (flags & AVAHI_LOOKUP_RESULT_LOCAL) service->is_local = 1; break; case AVAHI_BROWSER_REMOVE: case AVAHI_BROWSER_ALL_FOR_NOW: case AVAHI_BROWSER_CACHE_EXHAUSTED: break; } } /* * 'client_callback()' - Avahi client callback function. */ static void client_callback( AvahiClient *client, /* I - Client information (unused) */ AvahiClientState state, /* I - Current state */ void *context) /* I - User data (unused) */ { (void)client; (void)context; /* * If the connection drops, quit. */ if (state == AVAHI_CLIENT_FAILURE) { fputs("DEBUG: Avahi connection failed.\n", stderr); bonjour_error = 1; avahi_simple_poll_quit(avahi_poll); } } #endif /* HAVE_AVAHI */ /* * 'compare_services()' - Compare two devices. */ static int /* O - Result of comparison */ compare_services(ippfind_srv_t *a, /* I - First device */ ippfind_srv_t *b) /* I - Second device */ { return (strcmp(a->name, b->name)); } /* * 'dnssd_error_string()' - Return an error string for an error code. */ static const char * /* O - Error message */ dnssd_error_string(int error) /* I - Error number */ { # ifdef HAVE_DNSSD switch (error) { case kDNSServiceErr_NoError : return ("OK."); default : case kDNSServiceErr_Unknown : return ("Unknown error."); case kDNSServiceErr_NoSuchName : return ("Service not found."); case kDNSServiceErr_NoMemory : return ("Out of memory."); case kDNSServiceErr_BadParam : return ("Bad parameter."); case kDNSServiceErr_BadReference : return ("Bad service reference."); case kDNSServiceErr_BadState : return ("Bad state."); case kDNSServiceErr_BadFlags : return ("Bad flags."); case kDNSServiceErr_Unsupported : return ("Unsupported."); case kDNSServiceErr_NotInitialized : return ("Not initialized."); case kDNSServiceErr_AlreadyRegistered : return ("Already registered."); case kDNSServiceErr_NameConflict : return ("Name conflict."); case kDNSServiceErr_Invalid : return ("Invalid name."); case kDNSServiceErr_Firewall : return ("Firewall prevents registration."); case kDNSServiceErr_Incompatible : return ("Client library incompatible."); case kDNSServiceErr_BadInterfaceIndex : return ("Bad interface index."); case kDNSServiceErr_Refused : return ("Server prevents registration."); case kDNSServiceErr_NoSuchRecord : return ("Record not found."); case kDNSServiceErr_NoAuth : return ("Authentication required."); case kDNSServiceErr_NoSuchKey : return ("Encryption key not found."); case kDNSServiceErr_NATTraversal : return ("Unable to traverse NAT boundary."); case kDNSServiceErr_DoubleNAT : return ("Unable to traverse double-NAT boundary."); case kDNSServiceErr_BadTime : return ("Bad system time."); case kDNSServiceErr_BadSig : return ("Bad signature."); case kDNSServiceErr_BadKey : return ("Bad encryption key."); case kDNSServiceErr_Transient : return ("Transient error occurred - please try again."); case kDNSServiceErr_ServiceNotRunning : return ("Server not running."); case kDNSServiceErr_NATPortMappingUnsupported : return ("NAT doesn't support NAT-PMP or UPnP."); case kDNSServiceErr_NATPortMappingDisabled : return ("NAT supports NAT-PNP or UPnP but it is disabled."); case kDNSServiceErr_NoRouter : return ("No Internet/default router configured."); case kDNSServiceErr_PollingMode : return ("Service polling mode error."); #ifndef _WIN32 case kDNSServiceErr_Timeout : return ("Service timeout."); #endif /* !_WIN32 */ } # elif defined(HAVE_AVAHI) return (avahi_strerror(error)); # endif /* HAVE_DNSSD */ } /* * 'eval_expr()' - Evaluate the expressions against the specified service. * * Returns 1 for true and 0 for false. */ static int /* O - Result of evaluation */ eval_expr(ippfind_srv_t *service, /* I - Service */ ippfind_expr_t *expressions) /* I - Expressions */ { ippfind_op_t logic; /* Logical operation */ int result; /* Result of current expression */ ippfind_expr_t *expression; /* Current expression */ const char *val; /* TXT value */ /* * Loop through the expressions... */ if (expressions && expressions->parent) logic = expressions->parent->op; else logic = IPPFIND_OP_AND; for (expression = expressions; expression; expression = expression->next) { switch (expression->op) { default : case IPPFIND_OP_AND : case IPPFIND_OP_OR : if (expression->child) result = eval_expr(service, expression->child); else result = expression->op == IPPFIND_OP_AND; break; case IPPFIND_OP_TRUE : result = 1; break; case IPPFIND_OP_FALSE : result = 0; break; case IPPFIND_OP_IS_LOCAL : result = service->is_local; break; case IPPFIND_OP_IS_REMOTE : result = !service->is_local; break; case IPPFIND_OP_DOMAIN_REGEX : result = !regexec(&(expression->re), service->domain, 0, NULL, 0); break; case IPPFIND_OP_NAME_REGEX : result = !regexec(&(expression->re), service->name, 0, NULL, 0); break; case IPPFIND_OP_NAME_LITERAL : result = !_cups_strcasecmp(expression->name, service->name); break; case IPPFIND_OP_HOST_REGEX : result = !regexec(&(expression->re), service->host, 0, NULL, 0); break; case IPPFIND_OP_PORT_RANGE : result = service->port >= expression->range[0] && service->port <= expression->range[1]; break; case IPPFIND_OP_PATH_REGEX : result = !regexec(&(expression->re), service->resource, 0, NULL, 0); break; case IPPFIND_OP_TXT_EXISTS : result = cupsGetOption(expression->name, service->num_txt, service->txt) != NULL; break; case IPPFIND_OP_TXT_REGEX : val = cupsGetOption(expression->name, service->num_txt, service->txt); if (val) result = !regexec(&(expression->re), val, 0, NULL, 0); else result = 0; if (getenv("IPPFIND_DEBUG")) printf("TXT_REGEX of \"%s\": %d\n", val, result); break; case IPPFIND_OP_URI_REGEX : result = !regexec(&(expression->re), service->uri, 0, NULL, 0); break; case IPPFIND_OP_EXEC : result = exec_program(service, expression->num_args, expression->args); break; case IPPFIND_OP_LIST : result = list_service(service); break; case IPPFIND_OP_PRINT_NAME : _cupsLangPuts(stdout, service->name); result = 1; break; case IPPFIND_OP_PRINT_URI : _cupsLangPuts(stdout, service->uri); result = 1; break; case IPPFIND_OP_QUIET : result = 1; break; } if (expression->invert) result = !result; if (logic == IPPFIND_OP_AND && !result) return (0); else if (logic == IPPFIND_OP_OR && result) return (1); } return (logic == IPPFIND_OP_AND); } /* * 'exec_program()' - Execute a program for a service. */ static int /* O - 1 if program terminated successfully, 0 otherwise. */ exec_program(ippfind_srv_t *service, /* I - Service */ int num_args, /* I - Number of command-line args */ char **args) /* I - Command-line arguments */ { char **myargv, /* Command-line arguments */ **myenvp, /* Environment variables */ *ptr, /* Pointer into variable */ domain[1024], /* IPPFIND_SERVICE_DOMAIN */ hostname[1024], /* IPPFIND_SERVICE_HOSTNAME */ name[256], /* IPPFIND_SERVICE_NAME */ port[32], /* IPPFIND_SERVICE_PORT */ regtype[256], /* IPPFIND_SERVICE_REGTYPE */ scheme[128], /* IPPFIND_SERVICE_SCHEME */ uri[1024], /* IPPFIND_SERVICE_URI */ txt[100][256]; /* IPPFIND_TXT_foo */ int i, /* Looping var */ myenvc, /* Number of environment variables */ status; /* Exit status of program */ #ifndef _WIN32 char program[1024]; /* Program to execute */ int pid; /* Process ID */ #endif /* !_WIN32 */ /* * Environment variables... */ snprintf(domain, sizeof(domain), "IPPFIND_SERVICE_DOMAIN=%s", service->domain); snprintf(hostname, sizeof(hostname), "IPPFIND_SERVICE_HOSTNAME=%s", service->host); snprintf(name, sizeof(name), "IPPFIND_SERVICE_NAME=%s", service->name); snprintf(port, sizeof(port), "IPPFIND_SERVICE_PORT=%d", service->port); snprintf(regtype, sizeof(regtype), "IPPFIND_SERVICE_REGTYPE=%s", service->regtype); snprintf(scheme, sizeof(scheme), "IPPFIND_SERVICE_SCHEME=%s", !strncmp(service->regtype, "_http._tcp", 10) ? "http" : !strncmp(service->regtype, "_https._tcp", 11) ? "https" : !strncmp(service->regtype, "_ipp._tcp", 9) ? "ipp" : !strncmp(service->regtype, "_ipps._tcp", 10) ? "ipps" : "lpd"); snprintf(uri, sizeof(uri), "IPPFIND_SERVICE_URI=%s", service->uri); for (i = 0; i < service->num_txt && i < 100; i ++) { snprintf(txt[i], sizeof(txt[i]), "IPPFIND_TXT_%s=%s", service->txt[i].name, service->txt[i].value); for (ptr = txt[i] + 12; *ptr && *ptr != '='; ptr ++) *ptr = (char)_cups_toupper(*ptr); } for (i = 0, myenvc = 7 + service->num_txt; environ[i]; i ++) if (strncmp(environ[i], "IPPFIND_", 8)) myenvc ++; if ((myenvp = calloc(sizeof(char *), (size_t)(myenvc + 1))) == NULL) { _cupsLangPuts(stderr, _("ippfind: Out of memory.")); exit(IPPFIND_EXIT_MEMORY); } for (i = 0, myenvc = 0; environ[i]; i ++) if (strncmp(environ[i], "IPPFIND_", 8)) myenvp[myenvc++] = environ[i]; myenvp[myenvc++] = domain; myenvp[myenvc++] = hostname; myenvp[myenvc++] = name; myenvp[myenvc++] = port; myenvp[myenvc++] = regtype; myenvp[myenvc++] = scheme; myenvp[myenvc++] = uri; for (i = 0; i < service->num_txt && i < 100; i ++) myenvp[myenvc++] = txt[i]; /* * Allocate and copy command-line arguments... */ if ((myargv = calloc(sizeof(char *), (size_t)(num_args + 1))) == NULL) { _cupsLangPuts(stderr, _("ippfind: Out of memory.")); exit(IPPFIND_EXIT_MEMORY); } for (i = 0; i < num_args; i ++) { if (strchr(args[i], '{')) { char temp[2048], /* Temporary string */ *tptr, /* Pointer into temporary string */ keyword[256], /* {keyword} */ *kptr; /* Pointer into keyword */ for (ptr = args[i], tptr = temp; *ptr; ptr ++) { if (*ptr == '{') { /* * Do a {var} substitution... */ for (kptr = keyword, ptr ++; *ptr && *ptr != '}'; ptr ++) if (kptr < (keyword + sizeof(keyword) - 1)) *kptr++ = *ptr; if (*ptr != '}') { _cupsLangPuts(stderr, _("ippfind: Missing close brace in substitution.")); exit(IPPFIND_EXIT_SYNTAX); } *kptr = '\0'; if (!keyword[0] || !strcmp(keyword, "service_uri")) strlcpy(tptr, service->uri, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_domain")) strlcpy(tptr, service->domain, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_hostname")) strlcpy(tptr, service->host, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_name")) strlcpy(tptr, service->name, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_path")) strlcpy(tptr, service->resource, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_port")) strlcpy(tptr, port + 21, sizeof(temp) - (size_t)(tptr - temp)); else if (!strcmp(keyword, "service_scheme")) strlcpy(tptr, scheme + 22, sizeof(temp) - (size_t)(tptr - temp)); else if (!strncmp(keyword, "txt_", 4)) { const char *val = cupsGetOption(keyword + 4, service->num_txt, service->txt); if (val) strlcpy(tptr, val, sizeof(temp) - (size_t)(tptr - temp)); else *tptr = '\0'; } else { _cupsLangPrintf(stderr, _("ippfind: Unknown variable \"{%s}\"."), keyword); exit(IPPFIND_EXIT_SYNTAX); } tptr += strlen(tptr); } else if (tptr < (temp + sizeof(temp) - 1)) *tptr++ = *ptr; } *tptr = '\0'; myargv[i] = strdup(temp); } else myargv[i] = strdup(args[i]); } #ifdef _WIN32 if (getenv("IPPFIND_DEBUG")) { printf("\nProgram:\n %s\n", args[0]); puts("\nArguments:"); for (i = 0; i < num_args; i ++) printf(" %s\n", myargv[i]); puts("\nEnvironment:"); for (i = 0; i < myenvc; i ++) printf(" %s\n", myenvp[i]); } status = _spawnvpe(_P_WAIT, args[0], myargv, myenvp); #else /* * Execute the program... */ if (strchr(args[0], '/') && !access(args[0], X_OK)) strlcpy(program, args[0], sizeof(program)); else if (!cupsFileFind(args[0], getenv("PATH"), 1, program, sizeof(program))) { _cupsLangPrintf(stderr, _("ippfind: Unable to execute \"%s\": %s"), args[0], strerror(ENOENT)); exit(IPPFIND_EXIT_SYNTAX); } if (getenv("IPPFIND_DEBUG")) { printf("\nProgram:\n %s\n", program); puts("\nArguments:"); for (i = 0; i < num_args; i ++) printf(" %s\n", myargv[i]); puts("\nEnvironment:"); for (i = 0; i < myenvc; i ++) printf(" %s\n", myenvp[i]); } if ((pid = fork()) == 0) { /* * Child comes here... */ execve(program, myargv, myenvp); exit(1); } else if (pid < 0) { _cupsLangPrintf(stderr, _("ippfind: Unable to execute \"%s\": %s"), args[0], strerror(errno)); exit(IPPFIND_EXIT_SYNTAX); } else { /* * Wait for it to complete... */ while (wait(&status) != pid) ; } #endif /* _WIN32 */ /* * Free memory... */ for (i = 0; i < num_args; i ++) free(myargv[i]); free(myargv); free(myenvp); /* * Return whether the program succeeded or crashed... */ if (getenv("IPPFIND_DEBUG")) { #ifdef _WIN32 printf("Exit Status: %d\n", status); #else if (WIFEXITED(status)) printf("Exit Status: %d\n", WEXITSTATUS(status)); else printf("Terminating Signal: %d\n", WTERMSIG(status)); #endif /* _WIN32 */ } return (status == 0); } /* * 'get_service()' - Create or update a device. */ static ippfind_srv_t * /* O - Service */ get_service(cups_array_t *services, /* I - Service array */ const char *serviceName, /* I - Name of service/device */ const char *regtype, /* I - Type of service */ const char *replyDomain) /* I - Service domain */ { ippfind_srv_t key, /* Search key */ *service; /* Service */ char fullName[kDNSServiceMaxDomainName]; /* Full name for query */ /* * See if this is a new device... */ key.name = (char *)serviceName; key.regtype = (char *)regtype; for (service = cupsArrayFind(services, &key); service; service = cupsArrayNext(services)) if (_cups_strcasecmp(service->name, key.name)) break; else if (!strcmp(service->regtype, key.regtype)) return (service); /* * Yes, add the service... */ service = calloc(sizeof(ippfind_srv_t), 1); service->name = strdup(serviceName); service->domain = strdup(replyDomain); service->regtype = strdup(regtype); cupsArrayAdd(services, service); /* * Set the "full name" of this service, which is used for queries and * resolves... */ #ifdef HAVE_DNSSD DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); #else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); #endif /* HAVE_DNSSD */ service->fullName = strdup(fullName); return (service); } /* * 'get_time()' - Get the current time-of-day in seconds. */ static double get_time(void) { #ifdef _WIN32 struct _timeb curtime; /* Current Windows time */ _ftime(&curtime); return (curtime.time + 0.001 * curtime.millitm); #else struct timeval curtime; /* Current UNIX time */ if (gettimeofday(&curtime, NULL)) return (0.0); else return (curtime.tv_sec + 0.000001 * curtime.tv_usec); #endif /* _WIN32 */ } /* * 'list_service()' - List the contents of a service. */ static int /* O - 1 if successful, 0 otherwise */ list_service(ippfind_srv_t *service) /* I - Service */ { http_addrlist_t *addrlist; /* Address(es) of service */ char port[10]; /* Port number of service */ snprintf(port, sizeof(port), "%d", service->port); if ((addrlist = httpAddrGetList(service->host, address_family, port)) == NULL) { _cupsLangPrintf(stdout, "%s unreachable", service->uri); return (0); } if (!strncmp(service->regtype, "_ipp._tcp", 9) || !strncmp(service->regtype, "_ipps._tcp", 10)) { /* * IPP/IPPS printer */ http_t *http; /* HTTP connection */ ipp_t *request, /* IPP request */ *response; /* IPP response */ ipp_attribute_t *attr; /* IPP attribute */ int i, /* Looping var */ count, /* Number of values */ version, /* IPP version */ paccepting; /* printer-is-accepting-jobs value */ ipp_pstate_t pstate; /* printer-state value */ char preasons[1024], /* Comma-delimited printer-state-reasons */ *ptr, /* Pointer into reasons */ *end; /* End of reasons buffer */ static const char * const rattrs[] =/* Requested attributes */ { "printer-is-accepting-jobs", "printer-state", "printer-state-reasons" }; /* * Connect to the printer... */ http = httpConnect2(service->host, service->port, addrlist, address_family, !strncmp(service->regtype, "_ipps._tcp", 10) ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL); httpAddrFreeList(addrlist); if (!http) { _cupsLangPrintf(stdout, "%s unavailable", service->uri); return (0); } /* * Get the current printer state... */ response = NULL; version = ipp_version; do { request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippSetVersion(request, version / 10, version % 10); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, service->uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(rattrs) / sizeof(rattrs[0])), NULL, rattrs); response = cupsDoRequest(http, request, service->resource); if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST && version > 11) version = 11; } while (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE && version > 11); /* * Show results... */ if (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE) { _cupsLangPrintf(stdout, "%s: unavailable", service->uri); return (0); } if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) pstate = (ipp_pstate_t)ippGetInteger(attr, 0); else pstate = IPP_PSTATE_STOPPED; if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN)) != NULL) paccepting = ippGetBoolean(attr, 0); else paccepting = 0; if ((attr = ippFindAttribute(response, "printer-state-reasons", IPP_TAG_KEYWORD)) != NULL) { strlcpy(preasons, ippGetString(attr, 0, NULL), sizeof(preasons)); for (i = 1, count = ippGetCount(attr), ptr = preasons + strlen(preasons), end = preasons + sizeof(preasons) - 1; i < count && ptr < end; i ++, ptr += strlen(ptr)) { *ptr++ = ','; strlcpy(ptr, ippGetString(attr, i, NULL), (size_t)(end - ptr + 1)); } } else strlcpy(preasons, "none", sizeof(preasons)); ippDelete(response); httpClose(http); _cupsLangPrintf(stdout, "%s %s %s %s", service->uri, ippEnumString("printer-state", (int)pstate), paccepting ? "accepting-jobs" : "not-accepting-jobs", preasons); } else if (!strncmp(service->regtype, "_http._tcp", 10) || !strncmp(service->regtype, "_https._tcp", 11)) { /* * HTTP/HTTPS web page */ http_t *http; /* HTTP connection */ http_status_t status; /* HEAD status */ /* * Connect to the web server... */ http = httpConnect2(service->host, service->port, addrlist, address_family, !strncmp(service->regtype, "_ipps._tcp", 10) ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL); httpAddrFreeList(addrlist); if (!http) { _cupsLangPrintf(stdout, "%s unavailable", service->uri); return (0); } if (httpGet(http, service->resource)) { _cupsLangPrintf(stdout, "%s unavailable", service->uri); return (0); } do { status = httpUpdate(http); } while (status == HTTP_STATUS_CONTINUE); httpFlush(http); httpClose(http); if (status >= HTTP_STATUS_BAD_REQUEST) { _cupsLangPrintf(stdout, "%s unavailable", service->uri); return (0); } _cupsLangPrintf(stdout, "%s available", service->uri); } else if (!strncmp(service->regtype, "_printer._tcp", 13)) { /* * LPD printer */ int sock; /* Socket */ if (!httpAddrConnect(addrlist, &sock)) { _cupsLangPrintf(stdout, "%s unavailable", service->uri); httpAddrFreeList(addrlist); return (0); } _cupsLangPrintf(stdout, "%s available", service->uri); httpAddrFreeList(addrlist); httpAddrClose(NULL, sock); } else { _cupsLangPrintf(stdout, "%s unsupported", service->uri); httpAddrFreeList(addrlist); return (0); } return (1); } /* * 'new_expr()' - Create a new expression. */ static ippfind_expr_t * /* O - New expression */ new_expr(ippfind_op_t op, /* I - Operation */ int invert, /* I - Invert result? */ const char *value, /* I - TXT key or port range */ const char *regex, /* I - Regular expression */ char **args) /* I - Pointer to argument strings */ { ippfind_expr_t *temp; /* New expression */ if ((temp = calloc(1, sizeof(ippfind_expr_t))) == NULL) return (NULL); temp->op = op; temp->invert = invert; if (op == IPPFIND_OP_TXT_EXISTS || op == IPPFIND_OP_TXT_REGEX || op == IPPFIND_OP_NAME_LITERAL) temp->name = (char *)value; else if (op == IPPFIND_OP_PORT_RANGE) { /* * Pull port number range of the form "number", "-number" (0-number), * "number-" (number-65535), and "number-number". */ if (*value == '-') { temp->range[1] = atoi(value + 1); } else if (strchr(value, '-')) { if (sscanf(value, "%d-%d", temp->range, temp->range + 1) == 1) temp->range[1] = 65535; } else { temp->range[0] = temp->range[1] = atoi(value); } } if (regex) { int err = regcomp(&(temp->re), regex, REG_NOSUB | REG_ICASE | REG_EXTENDED); if (err) { char message[256]; /* Error message */ regerror(err, &(temp->re), message, sizeof(message)); _cupsLangPrintf(stderr, _("ippfind: Bad regular expression: %s"), message); exit(IPPFIND_EXIT_SYNTAX); } } if (args) { int num_args; /* Number of arguments */ for (num_args = 1; args[num_args]; num_args ++) if (!strcmp(args[num_args], ";")) break; temp->num_args = num_args; temp->args = malloc((size_t)num_args * sizeof(char *)); memcpy(temp->args, args, (size_t)num_args * sizeof(char *)); } return (temp); } #ifdef HAVE_AVAHI /* * 'poll_callback()' - Wait for input on the specified file descriptors. * * Note: This function is needed because avahi_simple_poll_iterate is broken * and always uses a timeout of 0 (!) milliseconds. * (Avahi Ticket #364) */ static int /* O - Number of file descriptors matching */ poll_callback( struct pollfd *pollfds, /* I - File descriptors */ unsigned int num_pollfds, /* I - Number of file descriptors */ int timeout, /* I - Timeout in milliseconds (unused) */ void *context) /* I - User data (unused) */ { int val; /* Return value */ (void)timeout; (void)context; val = poll(pollfds, num_pollfds, 500); if (val > 0) avahi_got_data = 1; return (val); } #endif /* HAVE_AVAHI */ /* * 'resolve_callback()' - Process resolve data. */ #ifdef HAVE_DNSSD static void DNSSD_API resolve_callback( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Data flags */ uint32_t interfaceIndex, /* I - Interface */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *fullName, /* I - Full service name */ const char *hostTarget, /* I - Hostname */ uint16_t port, /* I - Port number (network byte order) */ uint16_t txtLen, /* I - Length of TXT record data */ const unsigned char *txtRecord, /* I - TXT record data */ void *context) /* I - Service */ { char key[256], /* TXT key value */ *value; /* Value from TXT record */ const unsigned char *txtEnd; /* End of TXT record */ uint8_t valueLen; /* Length of value */ ippfind_srv_t *service = (ippfind_srv_t *)context; /* Service */ /* * Only process "add" data... */ (void)sdRef; (void)flags; (void)interfaceIndex; (void)fullName; if (errorCode != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("ippfind: Unable to browse or resolve: %s"), dnssd_error_string(errorCode)); bonjour_error = 1; return; } service->is_resolved = 1; service->host = strdup(hostTarget); service->port = ntohs(port); value = service->host + strlen(service->host) - 1; if (value >= service->host && *value == '.') *value = '\0'; /* * Loop through the TXT key/value pairs and add them to an array... */ for (txtEnd = txtRecord + txtLen; txtRecord < txtEnd; txtRecord += valueLen) { /* * Ignore bogus strings... */ valueLen = *txtRecord++; memcpy(key, txtRecord, valueLen); key[valueLen] = '\0'; if ((value = strchr(key, '=')) == NULL) continue; *value++ = '\0'; /* * Add to array of TXT values... */ service->num_txt = cupsAddOption(key, value, service->num_txt, &(service->txt)); } set_service_uri(service); } #elif defined(HAVE_AVAHI) static void resolve_callback( AvahiServiceResolver *resolver, /* I - Resolver */ AvahiIfIndex interface, /* I - Interface */ AvahiProtocol protocol, /* I - Address protocol */ AvahiResolverEvent event, /* I - Event */ const char *serviceName,/* I - Service name */ const char *regtype, /* I - Registration type */ const char *replyDomain,/* I - Domain name */ const char *hostTarget, /* I - FQDN */ const AvahiAddress *address, /* I - Address */ uint16_t port, /* I - Port number */ AvahiStringList *txt, /* I - TXT records */ AvahiLookupResultFlags flags, /* I - Lookup flags */ void *context) /* I - Service */ { char key[256], /* TXT key */ *value; /* TXT value */ ippfind_srv_t *service = (ippfind_srv_t *)context; /* Service */ AvahiStringList *current; /* Current TXT key/value pair */ (void)address; if (event != AVAHI_RESOLVER_FOUND) { bonjour_error = 1; avahi_service_resolver_free(resolver); avahi_simple_poll_quit(avahi_poll); return; } service->is_resolved = 1; service->host = strdup(hostTarget); service->port = port; value = service->host + strlen(service->host) - 1; if (value >= service->host && *value == '.') *value = '\0'; /* * Loop through the TXT key/value pairs and add them to an array... */ for (current = txt; current; current = current->next) { /* * Ignore bogus strings... */ if (current->size > (sizeof(key) - 1)) continue; memcpy(key, current->text, current->size); key[current->size] = '\0'; if ((value = strchr(key, '=')) == NULL) continue; *value++ = '\0'; /* * Add to array of TXT values... */ service->num_txt = cupsAddOption(key, value, service->num_txt, &(service->txt)); } set_service_uri(service); } #endif /* HAVE_DNSSD */ /* * 'set_service_uri()' - Set the URI of the service. */ static void set_service_uri(ippfind_srv_t *service) /* I - Service */ { char uri[1024]; /* URI */ const char *path, /* Resource path */ *scheme; /* URI scheme */ if (!strncmp(service->regtype, "_http.", 6)) { scheme = "http"; path = cupsGetOption("path", service->num_txt, service->txt); } else if (!strncmp(service->regtype, "_https.", 7)) { scheme = "https"; path = cupsGetOption("path", service->num_txt, service->txt); } else if (!strncmp(service->regtype, "_ipp.", 5)) { scheme = "ipp"; path = cupsGetOption("rp", service->num_txt, service->txt); } else if (!strncmp(service->regtype, "_ipps.", 6)) { scheme = "ipps"; path = cupsGetOption("rp", service->num_txt, service->txt); } else if (!strncmp(service->regtype, "_printer.", 9)) { scheme = "lpd"; path = cupsGetOption("rp", service->num_txt, service->txt); } else return; if (!path || !*path) path = "/"; if (*path == '/') { service->resource = strdup(path); } else { snprintf(uri, sizeof(uri), "/%s", path); service->resource = strdup(uri); } httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, service->host, service->port, service->resource); service->uri = strdup(uri); } /* * 'show_usage()' - Show program usage. */ static void show_usage(void) { _cupsLangPuts(stderr, _("Usage: ippfind [options] regtype[,subtype]" "[.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] " "... [expression]\n" " ippfind --help\n" " ippfind --version")); _cupsLangPuts(stderr, _("Options:")); _cupsLangPuts(stderr, _("-4 Connect using IPv4")); _cupsLangPuts(stderr, _("-6 Connect using IPv6")); _cupsLangPuts(stderr, _("-T seconds Set the browse timeout in seconds")); _cupsLangPuts(stderr, _("-V version Set default IPP version")); _cupsLangPuts(stderr, _("--version Show program version")); _cupsLangPuts(stderr, _("Expressions:")); _cupsLangPuts(stderr, _("-P number[-number] Match port to number or range")); _cupsLangPuts(stderr, _("-d regex Match domain to regular expression")); _cupsLangPuts(stderr, _("-h regex Match hostname to regular expression")); _cupsLangPuts(stderr, _("-l List attributes")); _cupsLangPuts(stderr, _("-n regex Match service name to regular expression")); _cupsLangPuts(stderr, _("-p Print URI if true")); _cupsLangPuts(stderr, _("-q Quietly report match via exit code")); _cupsLangPuts(stderr, _("-r True if service is remote")); _cupsLangPuts(stderr, _("-s Print service name if true")); _cupsLangPuts(stderr, _("-t key True if the TXT record contains the key")); _cupsLangPuts(stderr, _("-u regex Match URI to regular expression")); _cupsLangPuts(stderr, _("-x utility [argument ...] ;\n" " Execute program if true")); _cupsLangPuts(stderr, _("--domain regex Match domain to regular expression")); _cupsLangPuts(stderr, _("--exec utility [argument ...] ;\n" " Execute program if true")); _cupsLangPuts(stderr, _("--host regex Match hostname to regular expression")); _cupsLangPuts(stderr, _("--ls List attributes")); _cupsLangPuts(stderr, _("--local True if service is local")); _cupsLangPuts(stderr, _("--name regex Match service name to regular expression")); _cupsLangPuts(stderr, _("--path regex Match resource path to regular expression")); _cupsLangPuts(stderr, _("--port number[-number] Match port to number or range")); _cupsLangPuts(stderr, _("--print Print URI if true")); _cupsLangPuts(stderr, _("--print-name Print service name if true")); _cupsLangPuts(stderr, _("--quiet Quietly report match via exit code")); _cupsLangPuts(stderr, _("--remote True if service is remote")); _cupsLangPuts(stderr, _("--txt key True if the TXT record contains the key")); _cupsLangPuts(stderr, _("--txt-* regex Match TXT record key to regular expression")); _cupsLangPuts(stderr, _("--uri regex Match URI to regular expression")); _cupsLangPuts(stderr, _("Modifiers:")); _cupsLangPuts(stderr, _("( expressions ) Group expressions")); _cupsLangPuts(stderr, _("! expression Unary NOT of expression")); _cupsLangPuts(stderr, _("--not expression Unary NOT of expression")); _cupsLangPuts(stderr, _("--false Always false")); _cupsLangPuts(stderr, _("--true Always true")); _cupsLangPuts(stderr, _("expression expression Logical AND")); _cupsLangPuts(stderr, _("expression --and expression\n" " Logical AND")); _cupsLangPuts(stderr, _("expression --or expression\n" " Logical OR")); _cupsLangPuts(stderr, _("Substitutions:")); _cupsLangPuts(stderr, _("{} URI")); _cupsLangPuts(stderr, _("{service_domain} Domain name")); _cupsLangPuts(stderr, _("{service_hostname} Fully-qualified domain name")); _cupsLangPuts(stderr, _("{service_name} Service instance name")); _cupsLangPuts(stderr, _("{service_port} Port number")); _cupsLangPuts(stderr, _("{service_regtype} DNS-SD registration type")); _cupsLangPuts(stderr, _("{service_scheme} URI scheme")); _cupsLangPuts(stderr, _("{service_uri} URI")); _cupsLangPuts(stderr, _("{txt_*} Value of TXT record key")); _cupsLangPuts(stderr, _("Environment Variables:")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_DOMAIN Domain name")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_NAME Service instance name")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_PORT Port number")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_REGTYPE DNS-SD registration type")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_SCHEME URI scheme")); _cupsLangPuts(stderr, _("IPPFIND_SERVICE_URI URI")); _cupsLangPuts(stderr, _("IPPFIND_TXT_* Value of TXT record key")); exit(IPPFIND_EXIT_TRUE); } /* * 'show_version()' - Show program version. */ static void show_version(void) { _cupsLangPuts(stderr, CUPS_SVERSION); exit(IPPFIND_EXIT_TRUE); } cups-2.3.1/tools/ippevepcl.c000664 000765 000024 00000024773 13574721672 016107 0ustar00mikestaff000000 000000 /* * Generic HP PCL printer command for ippeveprinter/CUPS. * * Copyright © 2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "ippevecommon.h" #include "dither.h" /* * Local globals... */ static unsigned pcl_bottom, /* Bottom line */ pcl_left, /* Left offset in line */ pcl_right, /* Right offset in line */ pcl_top, /* Top line */ pcl_blanks; /* Number of blank lines to skip */ static unsigned char pcl_white, /* White color */ *pcl_line, /* Line buffer */ *pcl_comp; /* Compression buffer */ /* * Local functions... */ static void pcl_end_page(cups_page_header2_t *header, unsigned page); static void pcl_start_page(cups_page_header2_t *header, unsigned page); static int pcl_to_pcl(const char *filename); static void pcl_write_line(cups_page_header2_t *header, unsigned y, const unsigned char *line); static int raster_to_pcl(const char *filename); /* * 'main()' - Main entry for PCL printer command. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { const char *content_type; /* Content type to print */ /* * Print it... */ if (argc > 2) { fputs("ERROR: Too many arguments supplied, aborting.\n", stderr); return (1); } else if ((content_type = getenv("CONTENT_TYPE")) == NULL) { fputs("ERROR: CONTENT_TYPE environment variable not set, aborting.\n", stderr); return (1); } else if (!strcasecmp(content_type, "application/vnd.hp-pcl")) { return (pcl_to_pcl(argv[1])); } else if (!strcasecmp(content_type, "image/pwg-raster") || !strcasecmp(content_type, "image/urf")) { return (raster_to_pcl(argv[1])); } else { fprintf(stderr, "ERROR: CONTENT_TYPE %s not supported.\n", content_type); return (1); } } /* * 'pcl_end_page()' - End of PCL page. */ static void pcl_end_page( cups_page_header2_t *header, /* I - Page header */ unsigned page) /* I - Current page */ { /* * End graphics... */ fputs("\033*r0B", stdout); /* * Formfeed as needed... */ if (!(header->Duplex && (page & 1))) putchar('\f'); /* * Free the output buffers... */ free(pcl_line); free(pcl_comp); } /* * 'pcl_start_page()' - Start a PCL page. */ static void pcl_start_page( cups_page_header2_t *header, /* I - Page header */ unsigned page) /* I - Current page */ { /* * Setup margins to be 1/6" top and bottom and 1/4" or .135" on the * left and right. */ pcl_top = header->HWResolution[1] / 6; pcl_bottom = header->cupsHeight - header->HWResolution[1] / 6 - 1; if (header->PageSize[1] == 842) { /* A4 gets special side margins to expose an 8" print area */ pcl_left = (header->cupsWidth - 8 * header->HWResolution[0]) / 2; pcl_right = pcl_left + 8 * header->HWResolution[0] - 1; } else { /* All other sizes get 1/4" margins */ pcl_left = header->HWResolution[0] / 4; pcl_right = header->cupsWidth - header->HWResolution[0] / 4 - 1; } if (!header->Duplex || (page & 1)) { /* * Set the media size... */ printf("\033&l12D\033&k12H"); /* Set 12 LPI, 10 CPI */ printf("\033&l0O"); /* Set portrait orientation */ switch (header->PageSize[1]) { case 540 : /* Monarch Envelope */ printf("\033&l80A"); break; case 595 : /* A5 */ printf("\033&l25A"); break; case 624 : /* DL Envelope */ printf("\033&l90A"); break; case 649 : /* C5 Envelope */ printf("\033&l91A"); break; case 684 : /* COM-10 Envelope */ printf("\033&l81A"); break; case 709 : /* B5 Envelope */ printf("\033&l100A"); break; case 756 : /* Executive */ printf("\033&l1A"); break; case 792 : /* Letter */ printf("\033&l2A"); break; case 842 : /* A4 */ printf("\033&l26A"); break; case 1008 : /* Legal */ printf("\033&l3A"); break; case 1191 : /* A3 */ printf("\033&l27A"); break; case 1224 : /* Tabloid */ printf("\033&l6A"); break; } /* * Set top margin and turn off perforation skip... */ printf("\033&l%uE\033&l0L", 12 * pcl_top / header->HWResolution[1]); if (header->Duplex) { int mode = header->Duplex ? 1 + header->Tumble != 0 : 0; printf("\033&l%dS", mode); /* Set duplex mode */ } } else if (header->Duplex) printf("\033&a2G"); /* Print on back side */ /* * Set graphics mode... */ printf("\033*t%uR", header->HWResolution[0]); /* Set resolution */ printf("\033*r%uS", pcl_right - pcl_left + 1); /* Set width */ printf("\033*r%uT", pcl_bottom - pcl_top + 1); /* Set height */ printf("\033&a0H\033&a%uV", 720 * pcl_top / header->HWResolution[1]); /* Set position */ printf("\033*b2M"); /* Use PackBits compression */ printf("\033*r1A"); /* Start graphics */ /* * Allocate the output buffers... */ pcl_white = header->cupsBitsPerColor == 1 ? 0 : 255; pcl_blanks = 0; pcl_line = malloc(header->cupsWidth / 8 + 1); pcl_comp = malloc(2 * header->cupsBytesPerLine + 2); fprintf(stderr, "ATTR: job-impressions-completed=%d\n", page); } /* * 'pcl_to_pcl()' - Pass through PCL data. */ static int /* O - Exit status */ pcl_to_pcl(const char *filename) /* I - File to print or NULL for stdin */ { int fd; /* File to read from */ char buffer[65536]; /* Copy buffer */ ssize_t bytes; /* Bytes to write */ /* * Open the input file... */ if (filename) { if ((fd = open(filename, O_RDONLY)) < 0) { fprintf(stderr, "ERROR: Unable to open \"%s\": %s\n", filename, strerror(errno)); return (1); } } else { fd = 0; } fputs("ATTR: job-impressions=unknown\n", stderr); /* * Copy to stdout... */ while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) write(1, buffer, (size_t)bytes); /* * Close the input file... */ if (fd > 0) close(fd); return (0); } /* * 'pcl_write_line()' - Write a line of raster data. */ static void pcl_write_line( cups_page_header2_t *header, /* I - Raster information */ unsigned y, /* I - Line number */ const unsigned char *line) /* I - Pixels on line */ { unsigned x; /* Column number */ unsigned char bit, /* Current bit */ byte, /* Current byte */ *outptr, /* Pointer into output buffer */ *outend, /* End of output buffer */ *start, /* Start of sequence */ *compptr; /* Pointer into compression buffer */ unsigned count; /* Count of bytes for output */ const unsigned char *ditherline; /* Pointer into dither table */ if (line[0] == pcl_white && !memcmp(line, line + 1, header->cupsBytesPerLine - 1)) { /* * Skip blank line... */ pcl_blanks ++; return; } if (header->cupsBitsPerPixel == 1) { /* * B&W bitmap data can be used directly... */ outend = (unsigned char *)line + (pcl_right + 7) / 8; outptr = (unsigned char *)line + pcl_left / 8; } else { /* * Dither 8-bit grayscale to B&W... */ y &= 63; ditherline = threshold[y]; for (x = pcl_left, bit = 128, byte = 0, outptr = pcl_line; x <= pcl_right; x ++, line ++) { if (*line <= ditherline[x & 63]) byte |= bit; if (bit == 1) { *outptr++ = byte; byte = 0; bit = 128; } else bit >>= 1; } if (bit != 128) *outptr++ = byte; outend = outptr; outptr = pcl_line; } /* * Apply compression... */ compptr = pcl_comp; while (outptr < outend) { if ((outptr + 1) >= outend) { /* * Single byte on the end... */ *compptr++ = 0x00; *compptr++ = *outptr++; } else if (outptr[0] == outptr[1]) { /* * Repeated sequence... */ outptr ++; count = 2; while (outptr < (outend - 1) && outptr[0] == outptr[1] && count < 127) { outptr ++; count ++; } *compptr++ = (unsigned char)(257 - count); *compptr++ = *outptr++; } else { /* * Non-repeated sequence... */ start = outptr; outptr ++; count = 1; while (outptr < (outend - 1) && outptr[0] != outptr[1] && count < 127) { outptr ++; count ++; } *compptr++ = (unsigned char)(count - 1); memcpy(compptr, start, count); compptr += count; } } /* * Output the line... */ if (pcl_blanks > 0) { /* * Skip blank lines first... */ printf("\033*b%dY", pcl_blanks); pcl_blanks = 0; } printf("\033*b%dW", (int)(compptr - pcl_comp)); fwrite(pcl_comp, 1, (size_t)(compptr - pcl_comp), stdout); } /* * 'raster_to_pcl()' - Convert raster data to PCL. */ static int /* O - Exit status */ raster_to_pcl(const char *filename) /* I - File to print (NULL for stdin) */ { int fd; /* Input file */ cups_raster_t *ras; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned page = 0, /* Current page */ y; /* Current line */ unsigned char *line; /* Line buffer */ /* * Open the input file... */ if (filename) { if ((fd = open(filename, O_RDONLY)) < 0) { fprintf(stderr, "ERROR: Unable to open \"%s\": %s\n", filename, strerror(errno)); return (1); } } else { fd = 0; } /* * Open the raster stream and send pages... */ if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) { fputs("ERROR: Unable to read raster data, aborting.\n", stderr); return (1); } fputs("\033E", stdout); while (cupsRasterReadHeader2(ras, &header)) { page ++; if (header.cupsColorSpace != CUPS_CSPACE_W && header.cupsColorSpace != CUPS_CSPACE_SW && header.cupsColorSpace != CUPS_CSPACE_K) { fputs("ERROR: Unsupported color space, aborting.\n", stderr); break; } else if (header.cupsBitsPerColor != 1 && header.cupsBitsPerColor != 8) { fputs("ERROR: Unsupported bit depth, aborting.\n", stderr); break; } line = malloc(header.cupsBytesPerLine); pcl_start_page(&header, page); for (y = 0; y < header.cupsHeight; y ++) { if (cupsRasterReadPixels(ras, line, header.cupsBytesPerLine)) pcl_write_line(&header, y, line); else break; } pcl_end_page(&header, page); free(line); } cupsRasterClose(ras); fprintf(stderr, "ATTR: job-impressions=%d\n", page); return (0); } cups-2.3.1/tools/Dependencies000664 000765 000024 00000003415 13574721672 016253 0ustar00mikestaff000000 000000 ippevepcl.o: ippevepcl.c ippevecommon.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h ../cups/raster.h \ ../cups/string-private.h ../config.h dither.h ippeveprinter.o: ippeveprinter.c ../cups/cups-private.h \ ../cups/string-private.h ../config.h ../cups/versioning.h \ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \ ../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \ ../cups/language.h ../cups/pwg.h ../cups/http-private.h \ ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \ ../cups/thread-private.h ../cups/ppd-private.h ../cups/ppd.h \ ../cups/raster.h printer-png.h ippeveps.o: ippeveps.c ippevecommon.h ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ ../cups/language.h ../cups/pwg.h ../cups/raster.h \ ../cups/string-private.h ../config.h ../cups/ppd-private.h \ ../cups/ppd.h ../cups/pwg-private.h ippfind.o: ippfind.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h ipptool.o: ipptool.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/versioning.h ../cups/array-private.h \ ../cups/array.h ../cups/ipp-private.h ../cups/cups.h ../cups/file.h \ ../cups/ipp.h ../cups/http.h ../cups/language.h ../cups/pwg.h \ ../cups/http-private.h ../cups/language-private.h ../cups/transcode.h \ ../cups/pwg-private.h ../cups/thread-private.h cups-2.3.1/tools/ippeveprinter.c000664 000765 000024 00000765614 13574721672 017022 0ustar00mikestaff000000 000000 /* * IPP Everywhere printer application for CUPS. * * Copyright © 2010-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information.º * * Note: This program began life as the "ippserver" sample code that first * appeared in CUPS 1.4. The name has been changed in order to distinguish it * from the PWG's much more ambitious "ippserver" program, which supports * different kinds of IPP services and multiple services per instance - the * "ippeveprinter" program exposes a single print service conforming to the * current IPP Everywhere specification, thus the new name. */ /* * Include necessary headers... */ #include #include #if !CUPS_LITE # include #endif /* !CUPS_LITE */ #include #include #ifdef _WIN32 # include # include # include # define WEXITSTATUS(s) (s) # include typedef ULONG nfds_t; # define poll WSAPoll #else extern char **environ; # include # include # include #endif /* _WIN32 */ #ifdef HAVE_DNSSD # include #elif defined(HAVE_AVAHI) # include # include # include # include #endif /* HAVE_DNSSD */ #ifdef HAVE_SYS_MOUNT_H # include #endif /* HAVE_SYS_MOUNT_H */ #ifdef HAVE_SYS_STATFS_H # include #endif /* HAVE_SYS_STATFS_H */ #ifdef HAVE_SYS_STATVFS_H # include #endif /* HAVE_SYS_STATVFS_H */ #ifdef HAVE_SYS_VFS_H # include #endif /* HAVE_SYS_VFS_H */ #if HAVE_LIBPAM # ifdef HAVE_PAM_PAM_APPL_H # include # else # include # endif /* HAVE_PAM_PAM_APPL_H */ #endif /* HAVE_LIBPAM */ #include "printer-png.h" /* * Constants... */ enum ippeve_preason_e /* printer-state-reasons bit values */ { IPPEVE_PREASON_NONE = 0x0000, /* none */ IPPEVE_PREASON_OTHER = 0x0001, /* other */ IPPEVE_PREASON_COVER_OPEN = 0x0002, /* cover-open */ IPPEVE_PREASON_INPUT_TRAY_MISSING = 0x0004, /* input-tray-missing */ IPPEVE_PREASON_MARKER_SUPPLY_EMPTY = 0x0008, /* marker-supply-empty */ IPPEVE_PREASON_MARKER_SUPPLY_LOW = 0x0010, /* marker-supply-low */ IPPEVE_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020, /* marker-waste-almost-full */ IPPEVE_PREASON_MARKER_WASTE_FULL = 0x0040, /* marker-waste-full */ IPPEVE_PREASON_MEDIA_EMPTY = 0x0080, /* media-empty */ IPPEVE_PREASON_MEDIA_JAM = 0x0100, /* media-jam */ IPPEVE_PREASON_MEDIA_LOW = 0x0200, /* media-low */ IPPEVE_PREASON_MEDIA_NEEDED = 0x0400, /* media-needed */ IPPEVE_PREASON_MOVING_TO_PAUSED = 0x0800, /* moving-to-paused */ IPPEVE_PREASON_PAUSED = 0x1000, /* paused */ IPPEVE_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */ IPPEVE_PREASON_TONER_EMPTY = 0x4000, /* toner-empty */ IPPEVE_PREASON_TONER_LOW = 0x8000 /* toner-low */ }; typedef unsigned int ippeve_preason_t; /* Bitfield for printer-state-reasons */ static const char * const ippeve_preason_strings[] = { /* Strings for each bit */ /* "none" is implied for no bits set */ "other", "cover-open", "input-tray-missing", "marker-supply-empty", "marker-supply-low", "marker-waste-almost-full", "marker-waste-full", "media-empty", "media-jam", "media-low", "media-needed", "moving-to-paused", "paused", "spool-area-full", "toner-empty", "toner-low" }; /* * URL scheme for web resources... */ #ifdef HAVE_SSL # define WEB_SCHEME "https" #else # define WEB_SCHEME "http" #endif /* HAVE_SSL */ /* * Structures... */ #ifdef HAVE_DNSSD typedef DNSServiceRef ippeve_srv_t; /* Service reference */ typedef TXTRecordRef ippeve_txt_t; /* TXT record */ #elif defined(HAVE_AVAHI) typedef AvahiEntryGroup *ippeve_srv_t; /* Service reference */ typedef AvahiStringList *ippeve_txt_t; /* TXT record */ #else typedef void *ippeve_srv_t; /* Service reference */ typedef void *ippeve_txt_t; /* TXT record */ #endif /* HAVE_DNSSD */ #if HAVE_LIBPAM typedef struct ippeve_authdata_s /* Authentication data */ { char username[HTTP_MAX_VALUE], /* Username string */ *password; /* Password string */ } ippeve_authdata_t; #endif /* HAVE_LIBPAM */ typedef struct ippeve_filter_s /**** Attribute filter ****/ { cups_array_t *ra; /* Requested attributes */ ipp_tag_t group_tag; /* Group to copy */ } ippeve_filter_t; typedef struct ippeve_job_s ippeve_job_t; typedef struct ippeve_printer_s /**** Printer data ****/ { /* TODO: One IPv4 and one IPv6 listener are really not sufficient */ int ipv4, /* IPv4 listener */ ipv6; /* IPv6 listener */ ippeve_srv_t ipp_ref, /* Bonjour IPP service */ ipps_ref, /* Bonjour IPPS service */ http_ref, /* Bonjour HTTP service */ printer_ref; /* Bonjour LPD service */ char *dnssd_name, /* printer-dnssd-name */ *name, /* printer-name */ *icon, /* Icon filename */ *directory, /* Spool directory */ *hostname, /* Hostname */ *uri, /* printer-uri-supported */ *device_uri, /* Device URI (if any) */ *output_format, /* Output format */ #if !CUPS_LITE *ppdfile, /* PPD file (if any) */ #endif /* !CUPS_LITE */ *command; /* Command to run with job file */ int port; /* Port */ int web_forms; /* Enable web interface forms? */ size_t urilen; /* Length of printer URI */ ipp_t *attrs; /* Static attributes */ time_t start_time; /* Startup time */ time_t config_time; /* printer-config-change-time */ ipp_pstate_t state; /* printer-state value */ ippeve_preason_t state_reasons; /* printer-state-reasons values */ time_t state_time; /* printer-state-change-time */ cups_array_t *jobs; /* Jobs */ ippeve_job_t *active_job; /* Current active/pending job */ int next_job_id; /* Next job-id value */ _cups_rwlock_t rwlock; /* Printer lock */ } ippeve_printer_t; struct ippeve_job_s /**** Job data ****/ { int id; /* Job ID */ const char *name, /* job-name */ *username, /* job-originating-user-name */ *format; /* document-format */ ipp_jstate_t state; /* job-state value */ char *message; /* job-state-message value */ int msglevel; /* job-state-message log level (0=error, 1=info) */ time_t created, /* time-at-creation value */ processing, /* time-at-processing value */ completed; /* time-at-completed value */ int impressions, /* job-impressions value */ impcompleted; /* job-impressions-completed value */ ipp_t *attrs; /* Static attributes */ int cancel; /* Non-zero when job canceled */ char *filename; /* Print file name */ int fd; /* Print file descriptor */ ippeve_printer_t *printer; /* Printer */ }; typedef struct ippeve_client_s /**** Client data ****/ { http_t *http; /* HTTP connection */ ipp_t *request, /* IPP request */ *response; /* IPP response */ time_t start; /* Request start time */ http_state_t operation; /* Request operation */ ipp_op_t operation_id; /* IPP operation-id */ char uri[1024], /* Request URI */ *options; /* URI options */ http_addr_t addr; /* Client address */ char hostname[256], /* Client hostname */ username[HTTP_MAX_VALUE]; /* Authenticated username, if any */ ippeve_printer_t *printer; /* Printer */ ippeve_job_t *job; /* Current job, if any */ } ippeve_client_t; /* * Local functions... */ static http_status_t authenticate_request(ippeve_client_t *client); static void clean_jobs(ippeve_printer_t *printer); static int compare_jobs(ippeve_job_t *a, ippeve_job_t *b); static void copy_attributes(ipp_t *to, ipp_t *from, cups_array_t *ra, ipp_tag_t group_tag, int quickcopy); static void copy_job_attributes(ippeve_client_t *client, ippeve_job_t *job, cups_array_t *ra); static ippeve_client_t *create_client(ippeve_printer_t *printer, int sock); static ippeve_job_t *create_job(ippeve_client_t *client); static int create_job_file(ippeve_job_t *job, char *fname, size_t fnamesize, const char *dir, const char *ext); static int create_listener(const char *name, int port, int family); static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int bottom, int left, int right, int top); static ipp_t *create_media_size(int width, int length); static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icon, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs); static void debug_attributes(const char *title, ipp_t *ipp, int response); static void delete_client(ippeve_client_t *client); static void delete_job(ippeve_job_t *job); static void delete_printer(ippeve_printer_t *printer); #ifdef HAVE_DNSSD static void DNSSD_API dnssd_callback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, ippeve_printer_t *printer); #elif defined(HAVE_AVAHI) static void dnssd_callback(AvahiEntryGroup *p, AvahiEntryGroupState state, void *context); static void dnssd_client_cb(AvahiClient *c, AvahiClientState state, void *userdata); #endif /* HAVE_DNSSD */ static void dnssd_init(void); static int filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr); static ippeve_job_t *find_job(ippeve_client_t *client); static void finish_document_data(ippeve_client_t *client, ippeve_job_t *job); static void finish_document_uri(ippeve_client_t *client, ippeve_job_t *job); static void html_escape(ippeve_client_t *client, const char *s, size_t slen); static void html_footer(ippeve_client_t *client); static void html_header(ippeve_client_t *client, const char *title, int refresh); static void html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3); static void ipp_cancel_job(ippeve_client_t *client); static void ipp_close_job(ippeve_client_t *client); static void ipp_create_job(ippeve_client_t *client); static void ipp_get_job_attributes(ippeve_client_t *client); static void ipp_get_jobs(ippeve_client_t *client); static void ipp_get_printer_attributes(ippeve_client_t *client); static void ipp_identify_printer(ippeve_client_t *client); static void ipp_print_job(ippeve_client_t *client); static void ipp_print_uri(ippeve_client_t *client); static void ipp_send_document(ippeve_client_t *client); static void ipp_send_uri(ippeve_client_t *client); static void ipp_validate_job(ippeve_client_t *client); static ipp_t *load_ippserver_attributes(const char *servername, int serverport, const char *filename, cups_array_t *docformats); static ipp_t *load_legacy_attributes(const char *make, const char *model, int ppm, int ppm_color, int duplex, cups_array_t *docformats); #if !CUPS_LITE static ipp_t *load_ppd_attributes(const char *ppdfile, cups_array_t *docformats); #endif /* !CUPS_LITE */ #if HAVE_LIBPAM static int pam_func(int, const struct pam_message **, struct pam_response **, void *); #endif /* HAVE_LIBPAM */ static int parse_options(ippeve_client_t *client, cups_option_t **options); static void process_attr_message(ippeve_job_t *job, char *message); static void *process_client(ippeve_client_t *client); static int process_http(ippeve_client_t *client); static int process_ipp(ippeve_client_t *client); static void *process_job(ippeve_job_t *job); static void process_state_message(ippeve_job_t *job, char *message); static int register_printer(ippeve_printer_t *printer, const char *subtypes); static int respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length); static void respond_ipp(ippeve_client_t *client, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4); static void respond_unsupported(ippeve_client_t *client, ipp_attribute_t *attr); static void run_printer(ippeve_printer_t *printer); static int show_media(ippeve_client_t *client); static int show_status(ippeve_client_t *client); static int show_supplies(ippeve_client_t *client); static char *time_string(time_t tv, char *buffer, size_t bufsize); static void usage(int status) _CUPS_NORETURN; static int valid_doc_attributes(ippeve_client_t *client); static int valid_job_attributes(ippeve_client_t *client); /* * Globals... */ #ifdef HAVE_DNSSD static DNSServiceRef DNSSDMaster = NULL; #elif defined(HAVE_AVAHI) static AvahiThreadedPoll *DNSSDMaster = NULL; static AvahiClient *DNSSDClient = NULL; #endif /* HAVE_DNSSD */ static int KeepFiles = 0, /* Keep spooled job files? */ MaxVersion = 20,/* Maximum IPP version (20 = 2.0, 11 = 1.1, etc.) */ Verbosity = 0; /* Verbosity level */ static const char *PAMService = NULL; /* PAM service */ /* * 'main()' - Main entry to the sample server. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *opt, /* Current option character */ *attrfile = NULL, /* ippserver attributes file */ *command = NULL, /* Command to run with job files */ *device_uri = NULL, /* Device URI */ *output_format = NULL, /* Output format */ *icon = NULL, /* Icon file */ #ifdef HAVE_SSL *keypath = NULL, /* Keychain path */ #endif /* HAVE_SSL */ *location = "", /* Location of printer */ *make = "Example", /* Manufacturer */ *model = "Printer", /* Model */ *name = NULL, /* Printer name */ #if !CUPS_LITE *ppdfile = NULL, /* PPD file */ #endif /* !CUPS_LITE */ *subtypes = "_print"; /* DNS-SD service subtype */ int legacy = 0, /* Legacy mode? */ duplex = 0, /* Duplex mode */ ppm = 10, /* Pages per minute for mono */ ppm_color = 0, /* Pages per minute for color */ web_forms = 1; /* Enable web site forms? */ ipp_t *attrs = NULL; /* Printer attributes */ char directory[1024] = ""; /* Spool directory */ cups_array_t *docformats = NULL; /* Supported formats */ const char *servername = NULL; /* Server host name */ int serverport = 0; /* Server port number (0 = auto) */ ippeve_printer_t *printer; /* Printer object */ /* * Parse command-line arguments... */ for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) { usage(0); } else if (!strcmp(argv[i], "--no-web-forms")) { web_forms = 0; } else if (!strcmp(argv[i], "--pam-service")) { i ++; if (i >= argc) usage(1); PAMService = argv[i]; } else if (!strcmp(argv[i], "--version")) { puts(CUPS_SVERSION); return (0); } else if (!strncmp(argv[i], "--", 2)) { _cupsLangPrintf(stderr, _("%s: Unknown option \"%s\"."), argv[0], argv[i]); usage(1); } else if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) { switch (*opt) { case '2' : /* -2 (enable 2-sided printing) */ duplex = 1; legacy = 1; break; case 'A' : /* -A (enable authentication) */ if (!PAMService) PAMService = "cups"; break; case 'D' : /* -D device-uri */ i ++; if (i >= argc) usage(1); device_uri = argv[i]; break; case 'F' : /* -F output/format */ i ++; if (i >= argc) usage(1); output_format = argv[i]; break; #ifdef HAVE_SSL case 'K' : /* -K keypath */ i ++; if (i >= argc) usage(1); keypath = argv[i]; break; #endif /* HAVE_SSL */ case 'M' : /* -M manufacturer */ i ++; if (i >= argc) usage(1); make = argv[i]; legacy = 1; break; #if !CUPS_LITE case 'P' : /* -P filename.ppd */ i ++; if (i >= argc) usage(1); ppdfile = argv[i]; break; #endif /* !CUPS_LITE */ case 'V' : /* -V max-version */ i ++; if (i >= argc) usage(1); if (!strcmp(argv[i], "2.0")) MaxVersion = 20; else if (!strcmp(argv[i], "1.1")) MaxVersion = 11; else usage(1); break; case 'a' : /* -a attributes-file */ i ++; if (i >= argc) usage(1); attrfile = argv[i]; break; case 'c' : /* -c command */ i ++; if (i >= argc) usage(1); command = argv[i]; break; case 'd' : /* -d spool-directory */ i ++; if (i >= argc) usage(1); strlcpy(directory, argv[i], sizeof(directory)); break; case 'f' : /* -f type/subtype[,...] */ i ++; if (i >= argc) usage(1); docformats = _cupsArrayNewStrings(argv[i], ','); legacy = 1; break; case 'i' : /* -i icon.png */ i ++; if (i >= argc) usage(1); icon = argv[i]; break; case 'k' : /* -k (keep files) */ KeepFiles = 1; break; case 'l' : /* -l location */ i ++; if (i >= argc) usage(1); location = argv[i]; break; case 'm' : /* -m model */ i ++; if (i >= argc) usage(1); model = argv[i]; legacy = 1; break; case 'n' : /* -n hostname */ i ++; if (i >= argc) usage(1); servername = argv[i]; break; case 'p' : /* -p port */ i ++; if (i >= argc || !isdigit(argv[i][0] & 255)) usage(1); serverport = atoi(argv[i]); break; case 'r' : /* -r subtype */ i ++; if (i >= argc) usage(1); subtypes = argv[i]; break; case 's' : /* -s speed[,color-speed] */ i ++; if (i >= argc) usage(1); if (sscanf(argv[i], "%d,%d", &ppm, &ppm_color) < 1) usage(1); legacy = 1; break; case 'v' : /* -v (be verbose) */ Verbosity ++; break; default : /* Unknown */ _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."), argv[0], *opt); usage(1); } } } else if (!name) { name = argv[i]; } else { _cupsLangPrintf(stderr, _("%s: Unknown option \"%s\"."), argv[0], argv[i]); usage(1); } } if (!name) usage(1); #if CUPS_LITE if (attrfile != NULL && legacy) usage(1); #else if (((ppdfile != NULL) + (attrfile != NULL) + legacy) > 1) usage(1); #endif /* CUPS_LITE */ /* * Apply defaults as needed... */ if (!serverport) { #ifdef _WIN32 /* * Windows is almost always used as a single user system, so use a default * port number of 8631. */ serverport = 8631; #else /* * Use 8000 + UID mod 1000 for the default port number... */ serverport = 8000 + ((int)getuid() % 1000); #endif /* _WIN32 */ _cupsLangPrintf(stderr, _("Listening on port %d."), serverport); } if (!directory[0]) { const char *tmpdir; /* Temporary directory */ #ifdef _WIN32 if ((tmpdir = getenv("TEMP")) == NULL) tmpdir = "C:/TEMP"; #elif defined(__APPLE__) && TARGET_OS_OSX if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = "/private/tmp"; #else if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = "/tmp"; #endif /* _WIN32 */ snprintf(directory, sizeof(directory), "%s/ippeveprinter.%d", tmpdir, (int)getpid()); if (mkdir(directory, 0755) && errno != EEXIST) { _cupsLangPrintf(stderr, _("Unable to create spool directory \"%s\": %s"), directory, strerror(errno)); usage(1); } if (Verbosity) _cupsLangPrintf(stderr, _("Using spool directory \"%s\"."), directory); } /* * Initialize DNS-SD... */ dnssd_init(); /* * Create the printer... */ if (!docformats) docformats = _cupsArrayNewStrings(ppm_color > 0 ? "image/jpeg,image/pwg-raster,image/urf": "image/pwg-raster,image/urf", ','); if (attrfile) attrs = load_ippserver_attributes(servername, serverport, attrfile, docformats); #if !CUPS_LITE else if (ppdfile) { attrs = load_ppd_attributes(ppdfile, docformats); if (!command) command = "ippeveps"; if (!output_format) output_format = "application/postscript"; } #endif /* !CUPS_LITE */ else attrs = load_legacy_attributes(make, model, ppm, ppm_color, duplex, docformats); if ((printer = create_printer(servername, serverport, name, location, icon, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL) return (1); printer->web_forms = web_forms; #if !CUPS_LITE if (ppdfile) printer->ppdfile = strdup(ppdfile); #endif /* !CUPS_LITE */ #ifdef HAVE_SSL cupsSetServerCredentials(keypath, printer->hostname, 1); #endif /* HAVE_SSL */ /* * Run the print service... */ run_printer(printer); /* * Destroy the printer and exit... */ delete_printer(printer); return (0); } /* * 'authenticate_request()' - Try to authenticate the request. */ static http_status_t /* O - HTTP_STATUS_CONTINUE to keep going, otherwise status to return */ authenticate_request( ippeve_client_t *client) /* I - Client */ { #if HAVE_LIBPAM /* * If PAM isn't enabled, return 'continue' now... */ const char *authorization; /* Pointer into Authorization string */ int userlen; /* Username:password length */ pam_handle_t *pamh; /* PAM authentication handle */ int pamerr; /* PAM error code */ struct pam_conv pamdata; /* PAM conversation data */ ippeve_authdata_t data; /* Authentication data */ if (!PAMService) return (HTTP_STATUS_CONTINUE); /* * Try authenticating using PAM... */ authorization = httpGetField(client->http, HTTP_FIELD_AUTHORIZATION); if (!*authorization) return (HTTP_STATUS_UNAUTHORIZED); if (strncmp(authorization, "Basic ", 6)) { fputs("Unsupported scheme in Authorization header.\n", stderr); return (HTTP_STATUS_BAD_REQUEST); } authorization += 5; while (isspace(*authorization & 255)) authorization ++; userlen = sizeof(data.username); httpDecode64_2(data.username, &userlen, authorization); if ((data.password = strchr(data.username, ':')) == NULL) { fputs("No password in Authorization header.\n", stderr); return (HTTP_STATUS_BAD_REQUEST); } *(data.password)++ = '\0'; if (!data.username[0]) { fputs("No username in Authorization header.\n", stderr); return (HTTP_STATUS_BAD_REQUEST); } pamdata.conv = pam_func; pamdata.appdata_ptr = &data; if ((pamerr = pam_start(PAMService, data.username, &pamdata, &pamh)) != PAM_SUCCESS) { fprintf(stderr, "pam_start() returned %d (%s)\n", pamerr, pam_strerror(pamh, pamerr)); return (HTTP_STATUS_SERVER_ERROR); } if ((pamerr = pam_authenticate(pamh, PAM_SILENT)) != PAM_SUCCESS) { fprintf(stderr, "pam_authenticate() returned %d (%s)\n", pamerr, pam_strerror(pamh, pamerr)); pam_end(pamh, 0); return (HTTP_STATUS_UNAUTHORIZED); } if ((pamerr = pam_acct_mgmt(pamh, PAM_SILENT)) != PAM_SUCCESS) { fprintf(stderr, "pam_acct_mgmt() returned %d (%s)\n", pamerr, pam_strerror(pamh, pamerr)); pam_end(pamh, 0); return (HTTP_STATUS_SERVER_ERROR); } strlcpy(client->username, data.username, sizeof(client->username)); pam_end(pamh, PAM_SUCCESS); return (HTTP_STATUS_CONTINUE); #else /* * No authentication support built-in, return 'continue'... */ return (HTTP_STATUS_CONTINUE); #endif /* HAVE_LIBPAM */ } /* * 'clean_jobs()' - Clean out old (completed) jobs. */ static void clean_jobs(ippeve_printer_t *printer) /* I - Printer */ { ippeve_job_t *job; /* Current job */ time_t cleantime; /* Clean time */ if (cupsArrayCount(printer->jobs) == 0) return; cleantime = time(NULL) - 60; _cupsRWLockWrite(&(printer->rwlock)); for (job = (ippeve_job_t *)cupsArrayFirst(printer->jobs); job; job = (ippeve_job_t *)cupsArrayNext(printer->jobs)) if (job->completed && job->completed < cleantime) { cupsArrayRemove(printer->jobs, job); delete_job(job); } else break; _cupsRWUnlock(&(printer->rwlock)); } /* * 'compare_jobs()' - Compare two jobs. */ static int /* O - Result of comparison */ compare_jobs(ippeve_job_t *a, /* I - First job */ ippeve_job_t *b) /* I - Second job */ { return (b->id - a->id); } /* * 'copy_attributes()' - Copy attributes from one request to another. */ static void copy_attributes(ipp_t *to, /* I - Destination request */ ipp_t *from, /* I - Source request */ cups_array_t *ra, /* I - Requested attributes */ ipp_tag_t group_tag, /* I - Group to copy */ int quickcopy) /* I - Do a quick copy? */ { ippeve_filter_t filter; /* Filter data */ filter.ra = ra; filter.group_tag = group_tag; ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter); } /* * 'copy_job_attrs()' - Copy job attributes to the response. */ static void copy_job_attributes( ippeve_client_t *client, /* I - Client */ ippeve_job_t *job, /* I - Job */ cups_array_t *ra) /* I - requested-attributes */ { copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0); if (!ra || cupsArrayFind(ra, "date-time-at-completed")) { if (job->completed) ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed)); else ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed"); } if (!ra || cupsArrayFind(ra, "date-time-at-processing")) { if (job->processing) ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-processing", ippTimeToDate(job->processing)); else ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing"); } if (!ra || cupsArrayFind(ra, "job-impressions")) ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions", job->impressions); if (!ra || cupsArrayFind(ra, "job-impressions-completed")) ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", job->impcompleted); if (!ra || cupsArrayFind(ra, "job-printer-up-time")) ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-printer-up-time", (int)(time(NULL) - client->printer->start_time)); if (!ra || cupsArrayFind(ra, "job-state")) ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state); if (!ra || cupsArrayFind(ra, "job-state-message")) { if (job->message) { ippAddString(client->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, job->message); } else { switch (job->state) { case IPP_JSTATE_PENDING : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job pending."); break; case IPP_JSTATE_HELD : if (job->fd >= 0) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job incoming."); else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO)) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job held."); else ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job created."); break; case IPP_JSTATE_PROCESSING : if (job->cancel) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceling."); else ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job printing."); break; case IPP_JSTATE_STOPPED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job stopped."); break; case IPP_JSTATE_CANCELED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceled."); break; case IPP_JSTATE_ABORTED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job aborted."); break; case IPP_JSTATE_COMPLETED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job completed."); break; } } } if (!ra || cupsArrayFind(ra, "job-state-reasons")) { switch (job->state) { case IPP_JSTATE_PENDING : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "none"); break; case IPP_JSTATE_HELD : if (job->fd >= 0) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-incoming"); else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO)) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-hold-until-specified"); else ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-data-insufficient"); break; case IPP_JSTATE_PROCESSING : if (job->cancel) ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "processing-to-stop-point"); else ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-printing"); break; case IPP_JSTATE_STOPPED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-stopped"); break; case IPP_JSTATE_CANCELED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-canceled-by-user"); break; case IPP_JSTATE_ABORTED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "aborted-by-system"); break; case IPP_JSTATE_COMPLETED : ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "job-completed-successfully"); break; } } if (!ra || cupsArrayFind(ra, "time-at-completed")) ippAddInteger(client->response, IPP_TAG_JOB, job->completed ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, "time-at-completed", (int)(job->completed - client->printer->start_time)); if (!ra || cupsArrayFind(ra, "time-at-processing")) ippAddInteger(client->response, IPP_TAG_JOB, job->processing ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, "time-at-processing", (int)(job->processing - client->printer->start_time)); } /* * 'create_client()' - Accept a new network connection and create a client * object. */ static ippeve_client_t * /* O - Client */ create_client(ippeve_printer_t *printer, /* I - Printer */ int sock) /* I - Listen socket */ { ippeve_client_t *client; /* Client */ if ((client = calloc(1, sizeof(ippeve_client_t))) == NULL) { perror("Unable to allocate memory for client"); return (NULL); } client->printer = printer; /* * Accept the client and get the remote address... */ if ((client->http = httpAcceptConnection(sock, 1)) == NULL) { perror("Unable to accept client connection"); free(client); return (NULL); } httpGetHostname(client->http, client->hostname, sizeof(client->hostname)); if (Verbosity) fprintf(stderr, "Accepted connection from %s\n", client->hostname); return (client); } /* * 'create_job()' - Create a new job object from a Print-Job or Create-Job * request. */ static ippeve_job_t * /* O - Job */ create_job(ippeve_client_t *client) /* I - Client */ { ippeve_job_t *job; /* Job */ ipp_attribute_t *attr; /* Job attribute */ char uri[1024], /* job-uri value */ uuid[64]; /* job-uuid value */ _cupsRWLockWrite(&(client->printer->rwlock)); if (client->printer->active_job && client->printer->active_job->state < IPP_JSTATE_CANCELED) { /* * Only accept a single job at a time... */ _cupsRWUnlock(&(client->printer->rwlock)); return (NULL); } /* * Allocate and initialize the job object... */ if ((job = calloc(1, sizeof(ippeve_job_t))) == NULL) { perror("Unable to allocate memory for job"); return (NULL); } job->printer = client->printer; job->attrs = ippNew(); job->state = IPP_JSTATE_HELD; job->fd = -1; /* * Copy all of the job attributes... */ copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); /* * Get the requesting-user-name, document format, and priority... */ if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL) job->username = ippGetString(attr, 0, NULL); else job->username = "anonymous"; ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username); if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB) { if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else job->format = "application/octet-stream"; } if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_INTEGER)) != NULL) job->impressions = ippGetInteger(attr, 0); if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_NAME)) != NULL) job->name = ippGetString(attr, 0, NULL); /* * Add job description attributes and add to the jobs array... */ job->id = client->printer->next_job_id ++; snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id); httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid)); ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created))); ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri); ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid); if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, ippGetString(attr, 0, NULL)); else ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri); ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time)); cupsArrayAdd(client->printer->jobs, job); client->printer->active_job = job; _cupsRWUnlock(&(client->printer->rwlock)); return (job); } /* * 'create_job_file()' - Create a file for the document in a job. */ static int /* O - File descriptor or -1 on error */ create_job_file( ippeve_job_t *job, /* I - Job */ char *fname, /* I - Filename buffer */ size_t fnamesize, /* I - Size of filename buffer */ const char *directory, /* I - Directory to store in */ const char *ext) /* I - Extension (`NULL` for default) */ { char name[256], /* "Safe" filename */ *nameptr; /* Pointer into filename */ const char *job_name; /* job-name value */ /* * Make a name from the job-name attribute... */ if ((job_name = ippGetString(ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME), 0, NULL)) == NULL) job_name = "untitled"; for (nameptr = name; *job_name && nameptr < (name + sizeof(name) - 1); job_name ++) { if (isalnum(*job_name & 255) || *job_name == '-') { *nameptr++ = (char)tolower(*job_name & 255); } else { *nameptr++ = '_'; while (job_name[1] && !isalnum(job_name[1] & 255) && job_name[1] != '-') job_name ++; } } *nameptr = '\0'; /* * Figure out the extension... */ if (!ext) { if (!strcasecmp(job->format, "image/jpeg")) ext = "jpg"; else if (!strcasecmp(job->format, "image/png")) ext = "png"; else if (!strcasecmp(job->format, "image/pwg-raster")) ext = "pwg"; else if (!strcasecmp(job->format, "image/urf")) ext = "urf"; else if (!strcasecmp(job->format, "application/pdf")) ext = "pdf"; else if (!strcasecmp(job->format, "application/postscript")) ext = "ps"; else if (!strcasecmp(job->format, "application/vnd.hp-pcl")) ext = "pcl"; else ext = "dat"; } /* * Create a filename with the job-id, job-name, and document-format (extension)... */ snprintf(fname, fnamesize, "%s/%d-%s.%s", directory, job->id, name, ext); return (open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0666)); } /* * 'create_listener()' - Create a listener socket. */ static int /* O - Listener socket or -1 on error */ create_listener(const char *name, /* I - Host name (`NULL` for any address) */ int port, /* I - Port number */ int family) /* I - Address family */ { int sock; /* Listener socket */ http_addrlist_t *addrlist; /* Listen address */ char service[255]; /* Service port */ snprintf(service, sizeof(service), "%d", port); if ((addrlist = httpAddrGetList(name, family, service)) == NULL) return (-1); sock = httpAddrListen(&(addrlist->addr), port); httpAddrFreeList(addrlist); return (sock); } /* * 'create_media_col()' - Create a media-col value. */ static ipp_t * /* O - media-col collection */ create_media_col(const char *media, /* I - Media name */ const char *source, /* I - Media source, if any */ const char *type, /* I - Media type, if any */ int width, /* I - x-dimension in 2540ths */ int length, /* I - y-dimension in 2540ths */ int bottom, /* I - Bottom margin in 2540ths */ int left, /* I - Left margin in 2540ths */ int right, /* I - Right margin in 2540ths */ int top) /* I - Top margin in 2540ths */ { ipp_t *media_col = ippNew(), /* media-col value */ *media_size = create_media_size(width, length); /* media-size value */ char media_key[256]; /* media-key value */ const char *media_key_suffix = ""; /* media-key suffix */ if (bottom == 0 && left == 0 && right == 0 && top == 0) media_key_suffix = "_borderless"; if (type && source) snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, media_key_suffix); else if (type) snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, media_key_suffix); else if (source) snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, media_key_suffix); else snprintf(media_key, sizeof(media_key), "%s%s", media, media_key_suffix); ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-key", NULL, media_key); ippAddCollection(media_col, IPP_TAG_PRINTER, "media-size", media_size); ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-size-name", NULL, media); if (bottom >= 0) ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin", bottom); if (left >= 0) ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin", left); if (right >= 0) ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin", right); if (top >= 0) ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin", top); if (source) ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source", NULL, source); if (type) ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type", NULL, type); ippDelete(media_size); return (media_col); } /* * 'create_media_size()' - Create a media-size value. */ static ipp_t * /* O - media-col collection */ create_media_size(int width, /* I - x-dimension in 2540ths */ int length) /* I - y-dimension in 2540ths */ { ipp_t *media_size = ippNew(); /* media-size value */ ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "x-dimension", width); ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "y-dimension", length); return (media_size); } /* * 'create_printer()' - Create, register, and listen for connections to a * printer object. */ static ippeve_printer_t * /* O - Printer */ create_printer( const char *servername, /* I - Server hostname (NULL for default) */ int serverport, /* I - Server port */ const char *name, /* I - printer-name */ const char *location, /* I - printer-location */ const char *icon, /* I - printer-icons */ cups_array_t *docformats, /* I - document-format-supported */ const char *subtypes, /* I - Bonjour service subtype(s) */ const char *directory, /* I - Spool directory */ const char *command, /* I - Command to run on job files, if any */ const char *device_uri, /* I - Output device, if any */ const char *output_format, /* I - Output format, if any */ ipp_t *attrs) /* I - Capability attributes */ { ippeve_printer_t *printer; /* Printer */ int i; /* Looping var */ #ifndef _WIN32 char path[1024]; /* Full path to command */ #endif /* !_WIN32 */ char uri[1024], /* Printer URI */ #ifdef HAVE_SSL securi[1024], /* Secure printer URI */ *uris[2], /* All URIs */ #endif /* HAVE_SSL */ icons[1024], /* printer-icons URI */ adminurl[1024], /* printer-more-info URI */ supplyurl[1024],/* printer-supply-info-uri URI */ uuid[128]; /* printer-uuid */ int k_supported; /* Maximum file size supported */ int num_formats; /* Number of supported document formats */ const char *formats[100], /* Supported document formats */ *format; /* Current format */ int num_sup_attrs; /* Number of supported attributes */ const char *sup_attrs[100];/* Supported attributes */ char xxx_supported[256]; /* Name of -supported attribute */ _cups_globals_t *cg = _cupsGlobals(); /* Global path values */ #ifdef HAVE_STATVFS struct statvfs spoolinfo; /* FS info for spool directory */ double spoolsize; /* FS size */ #elif defined(HAVE_STATFS) struct statfs spoolinfo; /* FS info for spool directory */ double spoolsize; /* FS size */ #endif /* HAVE_STATVFS */ static const char * const versions[] =/* ipp-versions-supported values */ { "1.1", "2.0" }; static const char * const features[] =/* ipp-features-supported values */ { "ipp-everywhere" }; static const int ops[] = /* operations-supported values */ { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, IPP_OP_VALIDATE_JOB, IPP_OP_CREATE_JOB, IPP_OP_SEND_DOCUMENT, IPP_OP_SEND_URI, IPP_OP_CANCEL_JOB, IPP_OP_GET_JOB_ATTRIBUTES, IPP_OP_GET_JOBS, IPP_OP_GET_PRINTER_ATTRIBUTES, IPP_OP_CANCEL_MY_JOBS, IPP_OP_CLOSE_JOB, IPP_OP_IDENTIFY_PRINTER }; static const char * const charsets[] =/* charset-supported values */ { "us-ascii", "utf-8" }; static const char * const compressions[] =/* compression-supported values */ { #ifdef HAVE_LIBZ "deflate", "gzip", #endif /* HAVE_LIBZ */ "none" }; static const char * const identify_actions[] = { "display", "sound" }; static const char * const job_creation[] = { /* job-creation-attributes-supported values */ "copies", "document-access", "document-charset", "document-format", "document-message", "document-metadata", "document-name", "document-natural-language", "document-password", "finishings", "finishings-col", "ipp-attribute-fidelity", "job-account-id", "job-account-type", "job-accouunting-sheets", "job-accounting-user-id", "job-authorization-uri", "job-error-action", "job-error-sheet", "job-hold-until", "job-hold-until-time", "job-mandatory-attributes", "job-message-to-operator", "job-name", "job-pages-per-set", "job-password", "job-password-encryption", "job-phone-number", "job-priority", "job-recipient-name", "job-resource-ids", "job-sheet-message", "job-sheets", "job-sheets-col", "media", "media-col", "multiple-document-handling", "number-up", "orientation-requested", "output-bin", "output-device", "overrides", "page-delivery", "page-ranges", "presentation-direction-number-up", "print-color-mode", "print-content-optimize", "print-quality", "print-rendering-intent", "print-scaling", "printer-resolution", "proof-print", "separator-sheets", "sides", "x-image-position", "x-image-shift", "x-side1-image-shift", "x-side2-image-shift", "y-image-position", "y-image-shift", "y-side1-image-shift", "y-side2-image-shift" }; static const char * const media_col_supported[] = { /* media-col-supported values */ "media-bottom-margin", "media-left-margin", "media-right-margin", "media-size", "media-size-name", "media-source", "media-top-margin", "media-type" }; static const char * const multiple_document_handling[] = { /* multiple-document-handling-supported values */ "separate-documents-uncollated-copies", "separate-documents-collated-copies" }; static const char * const reference_uri_schemes_supported[] = { /* reference-uri-schemes-supported */ "file", "ftp", "http" #ifdef HAVE_SSL , "https" #endif /* HAVE_SSL */ }; #ifdef HAVE_SSL static const char * const uri_authentication_supported[] = { /* uri-authentication-supported values */ "none", "none" }; static const char * const uri_authentication_basic[] = { /* uri-authentication-supported values with authentication */ "basic", "basic" }; static const char * const uri_security_supported[] = { /* uri-security-supported values */ "none", "tls" }; #endif /* HAVE_SSL */ static const char * const which_jobs[] = { /* which-jobs-supported values */ "completed", "not-completed", "aborted", "all", "canceled", "pending", "pending-held", "processing", "processing-stopped" }; #ifndef _WIN32 /* * If a command was specified, make sure it exists and is executable... */ if (command) { if (*command == '/' || !strncmp(command, "./", 2)) { if (access(command, X_OK)) { _cupsLangPrintf(stderr, _("Unable to execute command \"%s\": %s"), command, strerror(errno)); return (NULL); } } else { snprintf(path, sizeof(path), "%s/command/%s", cg->cups_serverbin, command); if (access(command, X_OK)) { _cupsLangPrintf(stderr, _("Unable to execute command \"%s\": %s"), command, strerror(errno)); return (NULL); } command = path; } } #endif /* !_WIN32 */ /* * Allocate memory for the printer... */ if ((printer = calloc(1, sizeof(ippeve_printer_t))) == NULL) { _cupsLangPrintError(NULL, _("Unable to allocate memory for printer")); return (NULL); } printer->ipv4 = -1; printer->ipv6 = -1; printer->name = strdup(name); printer->dnssd_name = strdup(name); printer->command = command ? strdup(command) : NULL; printer->device_uri = device_uri ? strdup(device_uri) : NULL; printer->output_format = output_format ? strdup(output_format) : NULL; printer->directory = strdup(directory); printer->icon = icon ? strdup(icon) : NULL; printer->port = serverport; printer->start_time = time(NULL); printer->config_time = printer->start_time; printer->state = IPP_PSTATE_IDLE; printer->state_reasons = IPPEVE_PREASON_NONE; printer->state_time = printer->start_time; printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL); printer->next_job_id = 1; if (servername) { printer->hostname = strdup(servername); } else { char temp[1024]; /* Temporary string */ printer->hostname = strdup(httpGetHostname(NULL, temp, sizeof(temp))); } _cupsRWInit(&(printer->rwlock)); /* * Create the listener sockets... */ if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0) { perror("Unable to create IPv4 listener"); goto bad_printer; } if ((printer->ipv6 = create_listener(servername, printer->port, AF_INET6)) < 0) { perror("Unable to create IPv6 listener"); goto bad_printer; } /* * Prepare URI values for the printer attributes... */ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, printer->hostname, printer->port, "/ipp/print"); printer->uri = strdup(uri); printer->urilen = strlen(uri); #ifdef HAVE_SSL httpAssembleURI(HTTP_URI_CODING_ALL, securi, sizeof(securi), "ipps", NULL, printer->hostname, printer->port, "/ipp/print"); #endif /* HAVE_SSL */ httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), WEB_SCHEME, NULL, printer->hostname, printer->port, "/icon.png"); httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/"); httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/supplies"); httpAssembleUUID(printer->hostname, serverport, name, 0, uuid, sizeof(uuid)); if (Verbosity) { fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl); fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl); #ifdef HAVE_SSL fprintf(stderr, "printer-uri=\"%s\",\"%s\"\n", uri, securi); #else fprintf(stderr, "printer-uri=\"%s\"\n", uri); #endif /* HAVE_SSL */ } /* * Get the maximum spool size based on the size of the filesystem used for * the spool directory. If the host OS doesn't support the statfs call * or the filesystem is larger than 2TiB, always report INT_MAX. */ #ifdef HAVE_STATVFS if (statvfs(printer->directory, &spoolinfo)) k_supported = INT_MAX; else if ((spoolsize = (double)spoolinfo.f_frsize * spoolinfo.f_blocks / 1024) > INT_MAX) k_supported = INT_MAX; else k_supported = (int)spoolsize; #elif defined(HAVE_STATFS) if (statfs(printer->directory, &spoolinfo)) k_supported = INT_MAX; else if ((spoolsize = (double)spoolinfo.f_bsize * spoolinfo.f_blocks / 1024) > INT_MAX) k_supported = INT_MAX; else k_supported = (int)spoolsize; #else k_supported = INT_MAX; #endif /* HAVE_STATVFS */ /* * Assemble the final list of document formats... */ if (!cupsArrayFind(docformats, (void *)"application/octet-stream")) cupsArrayAdd(docformats, (void *)"application/octet-stream"); for (num_formats = 0, format = (const char *)cupsArrayFirst(docformats); format && num_formats < (int)(sizeof(formats) / sizeof(formats[0])); format = (const char *)cupsArrayNext(docformats)) formats[num_formats ++] = format; /* * Get the list of attributes that can be used when creating a job... */ num_sup_attrs = 0; sup_attrs[num_sup_attrs ++] = "document-access"; sup_attrs[num_sup_attrs ++] = "document-charset"; sup_attrs[num_sup_attrs ++] = "document-format"; sup_attrs[num_sup_attrs ++] = "document-message"; sup_attrs[num_sup_attrs ++] = "document-metadata"; sup_attrs[num_sup_attrs ++] = "document-name"; sup_attrs[num_sup_attrs ++] = "document-natural-language"; sup_attrs[num_sup_attrs ++] = "ipp-attribute-fidelity"; sup_attrs[num_sup_attrs ++] = "job-name"; sup_attrs[num_sup_attrs ++] = "job-priority"; for (i = 0; i < (int)(sizeof(job_creation) / sizeof(job_creation[0])) && num_sup_attrs < (int)(sizeof(sup_attrs) / sizeof(sup_attrs[0])); i ++) { snprintf(xxx_supported, sizeof(xxx_supported), "%s-supported", job_creation[i]); if (ippFindAttribute(attrs, xxx_supported, IPP_TAG_ZERO)) sup_attrs[num_sup_attrs ++] = job_creation[i]; } /* * Fill out the rest of the printer attributes. */ printer->attrs = attrs; /* charset-configured */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-configured", NULL, "utf-8"); /* charset-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-supported", sizeof(charsets) / sizeof(charsets[0]), NULL, charsets); /* compression-supported */ if (!ippFindAttribute(printer->attrs, "compression-supported", IPP_TAG_ZERO)) ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "compression-supported", (int)(sizeof(compressions) / sizeof(compressions[0])), NULL, compressions); /* document-format-default */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_MIMETYPE), "document-format-default", NULL, "application/octet-stream"); /* document-format-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, "document-format-supported", num_formats, NULL, formats); /* generated-natural-language-supported */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "generated-natural-language-supported", NULL, "en"); /* identify-actions-default */ ippAddString (printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-default", NULL, "sound"); /* identify-actions-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-supported", sizeof(identify_actions) / sizeof(identify_actions[0]), NULL, identify_actions); /* ipp-features-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features); /* ipp-versions-supported */ if (MaxVersion == 11) ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", NULL, "1.1"); else ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", (int)(sizeof(versions) / sizeof(versions[0])), NULL, versions); /* job-creation-attributes-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-creation-attributes-supported", num_sup_attrs, NULL, sup_attrs); /* job-ids-supported */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-ids-supported", 1); /* job-k-octets-supported */ ippAddRange(printer->attrs, IPP_TAG_PRINTER, "job-k-octets-supported", 0, k_supported); /* job-priority-default */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-default", 50); /* job-priority-supported */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-supported", 1); /* job-sheets-default */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-default", NULL, "none"); /* job-sheets-supported */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-supported", NULL, "none"); /* media-col-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-col-supported", (int)(sizeof(media_col_supported) / sizeof(media_col_supported[0])), NULL, media_col_supported); /* multiple-document-handling-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-document-handling-supported", sizeof(multiple_document_handling) / sizeof(multiple_document_handling[0]), NULL, multiple_document_handling); /* multiple-document-jobs-supported */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "multiple-document-jobs-supported", 0); /* multiple-operation-time-out */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "multiple-operation-time-out", 60); /* multiple-operation-time-out-action */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "abort-job"); /* natural-language-configured */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "natural-language-configured", NULL, "en"); /* operations-supported */ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "operations-supported", sizeof(ops) / sizeof(ops[0]), ops); /* pdl-override-supported */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pdl-override-supported", NULL, "attempted"); /* preferred-attributes-supported */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "preferred-attributes-supported", 0); /* printer-get-attributes-supported */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format"); /* printer-geo-location */ ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location"); /* printer-icons */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, icons); /* printer-is-accepting-jobs */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); /* printer-info */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, name); /* printer-location */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, location); /* printer-more-info */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl); /* printer-name */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name); /* printer-organization */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organization", NULL, ""); /* printer-organizational-unit */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, ""); /* printer-supply-info-uri */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl); /* printer-uri-supported */ #ifdef HAVE_SSL uris[0] = uri; uris[1] = securi; ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", 2, NULL, (const char **)uris); #else ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri); #endif /* HAVE_SSL */ /* printer-uuid */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid); /* reference-uri-scheme-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_URISCHEME), "reference-uri-schemes-supported", (int)(sizeof(reference_uri_schemes_supported) / sizeof(reference_uri_schemes_supported[0])), NULL, reference_uri_schemes_supported); /* uri-authentication-supported */ #ifdef HAVE_SSL if (PAMService) ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_basic); else ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_supported); #else if (PAMService) ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "basic"); else ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "none"); #endif /* HAVE_SSL */ /* uri-security-supported */ #ifdef HAVE_SSL ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-security-supported", 2, NULL, uri_security_supported); #else ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-security-supported", NULL, "none"); #endif /* HAVE_SSL */ /* which-jobs-supported */ ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "which-jobs-supported", sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs); debug_attributes("Printer", printer->attrs, 0); /* * Register the printer with Bonjour... */ if (!register_printer(printer, subtypes)) goto bad_printer; /* * Return it! */ return (printer); /* * If we get here we were unable to create the printer... */ bad_printer: delete_printer(printer); return (NULL); } /* * 'debug_attributes()' - Print attributes in a request or response. */ static void debug_attributes(const char *title, /* I - Title */ ipp_t *ipp, /* I - Request/response */ int type) /* I - 0 = object, 1 = request, 2 = response */ { ipp_tag_t group_tag; /* Current group */ ipp_attribute_t *attr; /* Current attribute */ char buffer[2048]; /* String buffer for value */ int major, minor; /* Version */ if (Verbosity <= 1) return; fprintf(stderr, "%s:\n", title); major = ippGetVersion(ipp, &minor); fprintf(stderr, " version=%d.%d\n", major, minor); if (type == 1) fprintf(stderr, " operation-id=%s(%04x)\n", ippOpString(ippGetOperation(ipp)), ippGetOperation(ipp)); else if (type == 2) fprintf(stderr, " status-code=%s(%04x)\n", ippErrorString(ippGetStatusCode(ipp)), ippGetStatusCode(ipp)); fprintf(stderr, " request-id=%d\n\n", ippGetRequestId(ipp)); for (attr = ippFirstAttribute(ipp), group_tag = IPP_TAG_ZERO; attr; attr = ippNextAttribute(ipp)) { if (ippGetGroupTag(attr) != group_tag) { group_tag = ippGetGroupTag(attr); fprintf(stderr, " %s\n", ippTagString(group_tag)); } if (ippGetName(attr)) { ippAttributeString(attr, buffer, sizeof(buffer)); fprintf(stderr, " %s (%s%s) %s\n", ippGetName(attr), ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr)), buffer); } } } /* * 'delete_client()' - Close the socket and free all memory used by a client * object. */ static void delete_client(ippeve_client_t *client) /* I - Client */ { if (Verbosity) fprintf(stderr, "Closing connection from %s\n", client->hostname); /* * Flush pending writes before closing... */ httpFlushWrite(client->http); /* * Free memory... */ httpClose(client->http); ippDelete(client->request); ippDelete(client->response); free(client); } /* * 'delete_job()' - Remove from the printer and free all memory used by a job * object. */ static void delete_job(ippeve_job_t *job) /* I - Job */ { if (Verbosity) fprintf(stderr, "[Job %d] Removing job from history.\n", job->id); ippDelete(job->attrs); if (job->message) free(job->message); if (job->filename) { if (!KeepFiles) unlink(job->filename); free(job->filename); } free(job); } /* * 'delete_printer()' - Unregister, close listen sockets, and free all memory * used by a printer object. */ static void delete_printer(ippeve_printer_t *printer) /* I - Printer */ { if (printer->ipv4 >= 0) close(printer->ipv4); if (printer->ipv6 >= 0) close(printer->ipv6); #if HAVE_DNSSD if (printer->printer_ref) DNSServiceRefDeallocate(printer->printer_ref); if (printer->ipp_ref) DNSServiceRefDeallocate(printer->ipp_ref); if (printer->ipps_ref) DNSServiceRefDeallocate(printer->ipps_ref); if (printer->http_ref) DNSServiceRefDeallocate(printer->http_ref); #elif defined(HAVE_AVAHI) avahi_threaded_poll_lock(DNSSDMaster); if (printer->printer_ref) avahi_entry_group_free(printer->printer_ref); if (printer->ipp_ref) avahi_entry_group_free(printer->ipp_ref); if (printer->ipps_ref) avahi_entry_group_free(printer->ipps_ref); if (printer->http_ref) avahi_entry_group_free(printer->http_ref); avahi_threaded_poll_unlock(DNSSDMaster); #endif /* HAVE_DNSSD */ if (printer->dnssd_name) free(printer->dnssd_name); if (printer->name) free(printer->name); if (printer->icon) free(printer->icon); if (printer->command) free(printer->command); if (printer->device_uri) free(printer->device_uri); #if !CUPS_LITE if (printer->ppdfile) free(printer->ppdfile); #endif /* !CUPS_LITE */ if (printer->directory) free(printer->directory); if (printer->hostname) free(printer->hostname); if (printer->uri) free(printer->uri); ippDelete(printer->attrs); cupsArrayDelete(printer->jobs); free(printer); } #ifdef HAVE_DNSSD /* * 'dnssd_callback()' - Handle Bonjour registration events. */ static void DNSSD_API dnssd_callback( DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Status flags */ DNSServiceErrorType errorCode, /* I - Error, if any */ const char *name, /* I - Service name */ const char *regtype, /* I - Service type */ const char *domain, /* I - Domain for service */ ippeve_printer_t *printer) /* I - Printer */ { (void)sdRef; (void)flags; (void)domain; if (errorCode) { fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode); return; } else if (strcasecmp(name, printer->dnssd_name)) { if (Verbosity) fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name); /* No lock needed since only the main thread accesses/changes this */ free(printer->dnssd_name); printer->dnssd_name = strdup(name); } } #elif defined(HAVE_AVAHI) /* * 'dnssd_callback()' - Handle Bonjour registration events. */ static void dnssd_callback( AvahiEntryGroup *srv, /* I - Service */ AvahiEntryGroupState state, /* I - Registration state */ void *context) /* I - Printer */ { (void)srv; (void)state; (void)context; } /* * 'dnssd_client_cb()' - Client callback for Avahi. * * Called whenever the client or server state changes... */ static void dnssd_client_cb( AvahiClient *c, /* I - Client */ AvahiClientState state, /* I - Current state */ void *userdata) /* I - User data (unused) */ { (void)userdata; if (!c) return; switch (state) { default : fprintf(stderr, "Ignored Avahi state %d.\n", state); break; case AVAHI_CLIENT_FAILURE: if (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) { fputs("Avahi server crashed, exiting.\n", stderr); exit(1); } break; } } #endif /* HAVE_DNSSD */ /* * 'dnssd_init()' - Initialize the DNS-SD service connections... */ static void dnssd_init(void) { #ifdef HAVE_DNSSD if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError) { fputs("Error: Unable to initialize Bonjour.\n", stderr); exit(1); } #elif defined(HAVE_AVAHI) int error; /* Error code, if any */ if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL) { fputs("Error: Unable to initialize Bonjour.\n", stderr); exit(1); } if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL) { fputs("Error: Unable to initialize Bonjour.\n", stderr); exit(1); } avahi_threaded_poll_start(DNSSDMaster); #endif /* HAVE_DNSSD */ } /* * 'filter_cb()' - Filter printer attributes based on the requested array. */ static int /* O - 1 to copy, 0 to ignore */ filter_cb(ippeve_filter_t *filter, /* I - Filter parameters */ ipp_t *dst, /* I - Destination (unused) */ ipp_attribute_t *attr) /* I - Source attribute */ { /* * Filter attributes as needed... */ #ifndef _WIN32 /* Avoid MS compiler bug */ (void)dst; #endif /* !_WIN32 */ ipp_tag_t group = ippGetGroupTag(attr); const char *name = ippGetName(attr); if ((filter->group_tag != IPP_TAG_ZERO && group != filter->group_tag && group != IPP_TAG_ZERO) || !name || (!strcmp(name, "media-col-database") && !cupsArrayFind(filter->ra, (void *)name))) return (0); return (!filter->ra || cupsArrayFind(filter->ra, (void *)name) != NULL); } /* * 'find_job()' - Find a job specified in a request. */ static ippeve_job_t * /* O - Job or NULL */ find_job(ippeve_client_t *client) /* I - Client */ { ipp_attribute_t *attr; /* job-id or job-uri attribute */ ippeve_job_t key, /* Job search key */ *job; /* Matching job, if any */ if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) { const char *uri = ippGetString(attr, 0, NULL); if (!strncmp(uri, client->printer->uri, client->printer->urilen) && uri[client->printer->urilen] == '/') key.id = atoi(uri + client->printer->urilen + 1); else return (NULL); } else if ((attr = ippFindAttribute(client->request, "job-id", IPP_TAG_INTEGER)) != NULL) key.id = ippGetInteger(attr, 0); _cupsRWLockRead(&(client->printer->rwlock)); job = (ippeve_job_t *)cupsArrayFind(client->printer->jobs, &key); _cupsRWUnlock(&(client->printer->rwlock)); return (job); } /* * 'finish_document()' - Finish receiving a document file and start processing. */ static void finish_document_data( ippeve_client_t *client, /* I - Client */ ippeve_job_t *job) /* I - Job */ { char filename[1024], /* Filename buffer */ buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes read */ cups_array_t *ra; /* Attributes to send in response */ _cups_thread_t t; /* Thread */ /* * Create a file for the request data... * * TODO: Update code to support piping large raster data to the print command. */ if ((job->fd = create_job_file(job, filename, sizeof(filename), client->printer->directory, NULL)) < 0) { respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to create print file: %s", strerror(errno)); goto abort_job; } if (Verbosity) fprintf(stderr, "Created job file \"%s\", format \"%s\".\n", filename, job->format); while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0) { if (write(job->fd, buffer, (size_t)bytes) < bytes) { int error = errno; /* Write error */ close(job->fd); job->fd = -1; unlink(filename); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to write print file: %s", strerror(error)); goto abort_job; } } if (bytes < 0) { /* * Got an error while reading the print data, so abort this job. */ close(job->fd); job->fd = -1; unlink(filename); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to read print file."); goto abort_job; } if (close(job->fd)) { int error = errno; /* Write error */ job->fd = -1; unlink(filename); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to write print file: %s", strerror(error)); goto abort_job; } job->fd = -1; job->filename = strdup(filename); job->state = IPP_JSTATE_PENDING; /* * Process the job... */ t = _cupsThreadCreate((_cups_thread_func_t)process_job, job); if (t) { _cupsThreadDetach(t); } else { respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job."); goto abort_job; } /* * Return the job info... */ respond_ipp(client, IPP_STATUS_OK, NULL); ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-message"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); return; /* * If we get here we had to abort the job... */ abort_job: job->state = IPP_JSTATE_ABORTED; job->completed = time(NULL); ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); } /* * 'finish_uri()' - Finish fetching a document URI and start processing. */ static void finish_document_uri( ippeve_client_t *client, /* I - Client */ ippeve_job_t *job) /* I - Job */ { ipp_attribute_t *uri; /* document-uri */ char scheme[256], /* URI scheme */ userpass[256], /* Username and password info */ hostname[256], /* Hostname */ resource[1024]; /* Resource path */ int port; /* Port number */ http_uri_status_t uri_status; /* URI decode status */ http_encryption_t encryption; /* Encryption to use, if any */ http_t *http; /* Connection for http/https URIs */ http_status_t status; /* Access status for http/https URIs */ int infile; /* Input file for local file URIs */ char filename[1024], /* Filename buffer */ buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes read */ ipp_attribute_t *attr; /* Current attribute */ cups_array_t *ra; /* Attributes to send in response */ /* * Do we have a file to print? */ if (httpGetState(client->http) == HTTP_STATE_POST_RECV) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unexpected document data following request."); goto abort_job; } /* * Do we have a document URI? */ if ((uri = ippFindAttribute(client->request, "document-uri", IPP_TAG_URI)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri."); goto abort_job; } if (ippGetCount(uri) != 1) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Too many document-uri values."); goto abort_job; } uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL), scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); if (uri_status < HTTP_URI_STATUS_OK) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s", httpURIStatusString(uri_status)); goto abort_job; } if (strcmp(scheme, "file") && #ifdef HAVE_SSL strcmp(scheme, "https") && #endif /* HAVE_SSL */ strcmp(scheme, "http")) { respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME, "URI scheme \"%s\" not supported.", scheme); goto abort_job; } if (!strcmp(scheme, "file") && access(resource, R_OK)) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to access URI: %s", strerror(errno)); goto abort_job; } /* * Get the document format for the job... */ _cupsRWLockWrite(&(client->printer->rwlock)); if ((attr = ippFindAttribute(job->attrs, "document-format", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else job->format = "application/octet-stream"; /* * Create a file for the request data... */ if ((job->fd = create_job_file(job, filename, sizeof(filename), client->printer->directory, NULL)) < 0) { _cupsRWUnlock(&(client->printer->rwlock)); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to create print file: %s", strerror(errno)); goto abort_job; } _cupsRWUnlock(&(client->printer->rwlock)); if (!strcmp(scheme, "file")) { if ((infile = open(resource, O_RDONLY)) < 0) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to access URI: %s", strerror(errno)); goto abort_job; } do { if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 && (errno == EAGAIN || errno == EINTR)) { bytes = 1; } else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes) { int error = errno; /* Write error */ close(job->fd); job->fd = -1; unlink(filename); close(infile); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to write print file: %s", strerror(error)); goto abort_job; } } while (bytes > 0); close(infile); } else { #ifdef HAVE_SSL if (port == 443 || !strcmp(scheme, "https")) encryption = HTTP_ENCRYPTION_ALWAYS; else #endif /* HAVE_SSL */ encryption = HTTP_ENCRYPTION_IF_REQUESTED; if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to connect to %s: %s", hostname, cupsLastErrorString()); close(job->fd); job->fd = -1; unlink(filename); goto abort_job; } httpClearFields(http); httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en"); if (httpGet(http, resource)) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to GET URI: %s", strerror(errno)); close(job->fd); job->fd = -1; unlink(filename); httpClose(http); goto abort_job; } while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE); if (status != HTTP_STATUS_OK) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to GET URI: %s", httpStatus(status)); close(job->fd); job->fd = -1; unlink(filename); httpClose(http); goto abort_job; } while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) { if (write(job->fd, buffer, (size_t)bytes) < bytes) { int error = errno; /* Write error */ close(job->fd); job->fd = -1; unlink(filename); httpClose(http); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to write print file: %s", strerror(error)); goto abort_job; } } httpClose(http); } if (close(job->fd)) { int error = errno; /* Write error */ job->fd = -1; unlink(filename); respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to write print file: %s", strerror(error)); goto abort_job; } _cupsRWLockWrite(&(client->printer->rwlock)); job->fd = -1; job->filename = strdup(filename); job->state = IPP_JSTATE_PENDING; _cupsRWUnlock(&(client->printer->rwlock)); /* * Process the job... */ process_job(job); /* * Return the job info... */ respond_ipp(client, IPP_STATUS_OK, NULL); ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); return; /* * If we get here we had to abort the job... */ abort_job: job->state = IPP_JSTATE_ABORTED; job->completed = time(NULL); ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); copy_job_attributes(client, job, ra); cupsArrayDelete(ra); } /* * 'html_escape()' - Write a HTML-safe string. */ static void html_escape(ippeve_client_t *client, /* I - Client */ const char *s, /* I - String to write */ size_t slen) /* I - Number of characters to write */ { const char *start, /* Start of segment */ *end; /* End of string */ start = s; end = s + (slen > 0 ? slen : strlen(s)); while (*s && s < end) { if (*s == '&' || *s == '<') { if (s > start) httpWrite2(client->http, start, (size_t)(s - start)); if (*s == '&') httpWrite2(client->http, "&", 5); else httpWrite2(client->http, "<", 4); start = s + 1; } s ++; } if (s > start) httpWrite2(client->http, start, (size_t)(s - start)); } /* * 'html_footer()' - Show the web interface footer. * * This function also writes the trailing 0-length chunk. */ static void html_footer(ippeve_client_t *client) /* I - Client */ { html_printf(client, "
    Note:

    The PPD API was deprecated in CUPS 1.6/macOS 10.8. Please use the new Job Ticket APIs in the CUPS Programming Manual documentation. These functions will be removed in a future release of CUPS.